50 |
* exception also makes it possible to release a modified version which |
* exception also makes it possible to release a modified version which |
51 |
* carries forward this exception. |
* carries forward this exception. |
52 |
* |
* |
53 |
* $Id: reduced.c,v 1.1.2.2 2002-12-09 10:47:05 suxen_drol Exp $ |
* $Id: reduced.c,v 1.1.2.3 2003-01-04 06:14:33 suxen_drol Exp $ |
54 |
* |
* |
55 |
****************************************************************************/ |
****************************************************************************/ |
56 |
|
|
57 |
#include "../portab.h" |
#include "../portab.h" |
58 |
|
#include "../global.h" |
59 |
#include "reduced.h" |
#include "reduced.h" |
60 |
|
|
61 |
// function pointers |
// function pointers |
69 |
////////////////////////////////////////////////////////// |
////////////////////////////////////////////////////////// |
70 |
// Upsampling (1/3/3/1) filter |
// Upsampling (1/3/3/1) filter |
71 |
|
|
72 |
#define CLIP(x) ((x)<0 ? 0 : (x)>255 ? 255 : (x)) |
#define ADD(dst,src) (dst) = CLIP((dst)+(src), 0, 255) |
|
#define ADD(dst,src) (dst) = CLIP((dst)+(src)) |
|
73 |
|
|
74 |
static __inline void Filter_31(uint8_t *Dst1, uint8_t *Dst2, |
static __inline void Filter_31(uint8_t *Dst1, uint8_t *Dst2, |
75 |
const int16_t *Src1, const int16_t *Src2) |
const int16_t *Src1, const int16_t *Src2) |
77 |
/* Src[] is assumed to be >=0. So we can use ">>2" instead of "/2" */ |
/* Src[] is assumed to be >=0. So we can use ">>2" instead of "/2" */ |
78 |
int16_t a = (3*Src1[0]+ Src2[0]+2) >> 2; |
int16_t a = (3*Src1[0]+ Src2[0]+2) >> 2; |
79 |
int16_t b = ( Src1[0]+3*Src2[0]+2) >> 2; |
int16_t b = ( Src1[0]+3*Src2[0]+2) >> 2; |
80 |
Dst1[0] = CLIP(a); |
Dst1[0] = CLIP(a, 0, 255); |
81 |
Dst2[0] = CLIP(b); |
Dst2[0] = CLIP(b, 0, 255); |
82 |
} |
} |
83 |
|
|
84 |
static __inline void Filter_9331(uint8_t *Dst1, uint8_t *Dst2, |
static __inline void Filter_9331(uint8_t *Dst1, uint8_t *Dst2, |
89 |
int16_t b = (3*Src1[0]+ 9*Src1[1]+ 1*Src2[0] + 3*Src2[1] + 8) >> 4; |
int16_t b = (3*Src1[0]+ 9*Src1[1]+ 1*Src2[0] + 3*Src2[1] + 8) >> 4; |
90 |
int16_t c = (3*Src1[0]+ 1*Src1[1]+ 9*Src2[0] + 3*Src2[1] + 8) >> 4; |
int16_t c = (3*Src1[0]+ 1*Src1[1]+ 9*Src2[0] + 3*Src2[1] + 8) >> 4; |
91 |
int16_t d = (1*Src1[0]+ 3*Src1[1]+ 3*Src2[0] + 9*Src2[1] + 8) >> 4; |
int16_t d = (1*Src1[0]+ 3*Src1[1]+ 3*Src2[0] + 9*Src2[1] + 8) >> 4; |
92 |
Dst1[0] = CLIP(a); |
Dst1[0] = CLIP(a, 0, 255); |
93 |
Dst1[1] = CLIP(b); |
Dst1[1] = CLIP(b, 0, 255); |
94 |
Dst2[0] = CLIP(c); |
Dst2[0] = CLIP(c, 0, 255); |
95 |
Dst2[1] = CLIP(d); |
Dst2[1] = CLIP(d, 0, 255); |
96 |
} |
} |
97 |
|
|
98 |
void xvid_Copy_Upsampled_8x8_16To8_C(uint8_t *Dst, const int16_t *Src, const int BpS) |
void xvid_Copy_Upsampled_8x8_16To8_C(uint8_t *Dst, const int16_t *Src, const int BpS) |
99 |
{ |
{ |
100 |
int x, y; |
int x, y; |
101 |
|
|
102 |
Dst[0] = CLIP(Src[0]); |
Dst[0] = CLIP(Src[0], 0, 255); |
103 |
for(x=0; x<7; ++x) Filter_31(Dst+2*x+1, Dst+2*x+2, Src+x, Src+x+1); |
for(x=0; x<7; ++x) Filter_31(Dst+2*x+1, Dst+2*x+2, Src+x, Src+x+1); |
104 |
Dst[15] = CLIP(Src[7]); |
Dst[15] = CLIP(Src[7], 0, 255); |
105 |
Dst += BpS; |
Dst += BpS; |
106 |
for(y=0; y<7; ++y) { |
for(y=0; y<7; ++y) { |
107 |
uint8_t *const Dst2 = Dst + BpS; |
uint8_t *const Dst2 = Dst + BpS; |
112 |
Src += 8; |
Src += 8; |
113 |
Dst += 2*BpS; |
Dst += 2*BpS; |
114 |
} |
} |
115 |
Dst[0] = CLIP(Src[0]); |
Dst[0] = CLIP(Src[0], 0, 255); |
116 |
for(x=0; x<7; ++x) Filter_31(Dst+2*x+1, Dst+2*x+2, Src+x, Src+x+1); |
for(x=0; x<7; ++x) Filter_31(Dst+2*x+1, Dst+2*x+2, Src+x, Src+x+1); |
117 |
Dst[15] = CLIP(Src[7]); |
Dst[15] = CLIP(Src[7], 0, 255); |
118 |
} |
} |
119 |
|
|
120 |
static __inline void Filter_Add_31(uint8_t *Dst1, uint8_t *Dst2, |
static __inline void Filter_Add_31(uint8_t *Dst1, uint8_t *Dst2, |
161 |
for(x=0; x<7; ++x) Filter_Add_31(Dst+2*x+1, Dst+2*x+2, Src+x, Src+x+1); |
for(x=0; x<7; ++x) Filter_Add_31(Dst+2*x+1, Dst+2*x+2, Src+x, Src+x+1); |
162 |
ADD(Dst[15], Src[7]); |
ADD(Dst[15], Src[7]); |
163 |
} |
} |
|
#undef CLIP |
|
164 |
#undef ADD |
#undef ADD |
165 |
|
|
166 |
////////////////////////////////////////////////////////// |
////////////////////////////////////////////////////////// |