32 #define RV40_LOWPASS(OPNAME, OP) \
33 static av_unused void OPNAME ## rv40_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride,\
34 const int h, const int C1, const int C2, const int SHIFT){\
35 const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
37 for(i = 0; i < h; i++)\
39 OP(dst[0], (src[-2] + src[ 3] - 5*(src[-1]+src[2]) + src[0]*C1 + src[1]*C2 + (1<<(SHIFT-1))) >> SHIFT);\
40 OP(dst[1], (src[-1] + src[ 4] - 5*(src[ 0]+src[3]) + src[1]*C1 + src[2]*C2 + (1<<(SHIFT-1))) >> SHIFT);\
41 OP(dst[2], (src[ 0] + src[ 5] - 5*(src[ 1]+src[4]) + src[2]*C1 + src[3]*C2 + (1<<(SHIFT-1))) >> SHIFT);\
42 OP(dst[3], (src[ 1] + src[ 6] - 5*(src[ 2]+src[5]) + src[3]*C1 + src[4]*C2 + (1<<(SHIFT-1))) >> SHIFT);\
43 OP(dst[4], (src[ 2] + src[ 7] - 5*(src[ 3]+src[6]) + src[4]*C1 + src[5]*C2 + (1<<(SHIFT-1))) >> SHIFT);\
44 OP(dst[5], (src[ 3] + src[ 8] - 5*(src[ 4]+src[7]) + src[5]*C1 + src[6]*C2 + (1<<(SHIFT-1))) >> SHIFT);\
45 OP(dst[6], (src[ 4] + src[ 9] - 5*(src[ 5]+src[8]) + src[6]*C1 + src[7]*C2 + (1<<(SHIFT-1))) >> SHIFT);\
46 OP(dst[7], (src[ 5] + src[10] - 5*(src[ 6]+src[9]) + src[7]*C1 + src[8]*C2 + (1<<(SHIFT-1))) >> SHIFT);\
52 static void OPNAME ## rv40_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride,\
53 const int w, const int C1, const int C2, const int SHIFT){\
54 const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
56 for(i = 0; i < w; i++)\
58 const int srcB = src[-2*srcStride];\
59 const int srcA = src[-1*srcStride];\
60 const int src0 = src[0 *srcStride];\
61 const int src1 = src[1 *srcStride];\
62 const int src2 = src[2 *srcStride];\
63 const int src3 = src[3 *srcStride];\
64 const int src4 = src[4 *srcStride];\
65 const int src5 = src[5 *srcStride];\
66 const int src6 = src[6 *srcStride];\
67 const int src7 = src[7 *srcStride];\
68 const int src8 = src[8 *srcStride];\
69 const int src9 = src[9 *srcStride];\
70 const int src10 = src[10*srcStride];\
71 OP(dst[0*dstStride], (srcB + src3 - 5*(srcA+src2) + src0*C1 + src1*C2 + (1<<(SHIFT-1))) >> SHIFT);\
72 OP(dst[1*dstStride], (srcA + src4 - 5*(src0+src3) + src1*C1 + src2*C2 + (1<<(SHIFT-1))) >> SHIFT);\
73 OP(dst[2*dstStride], (src0 + src5 - 5*(src1+src4) + src2*C1 + src3*C2 + (1<<(SHIFT-1))) >> SHIFT);\
74 OP(dst[3*dstStride], (src1 + src6 - 5*(src2+src5) + src3*C1 + src4*C2 + (1<<(SHIFT-1))) >> SHIFT);\
75 OP(dst[4*dstStride], (src2 + src7 - 5*(src3+src6) + src4*C1 + src5*C2 + (1<<(SHIFT-1))) >> SHIFT);\
76 OP(dst[5*dstStride], (src3 + src8 - 5*(src4+src7) + src5*C1 + src6*C2 + (1<<(SHIFT-1))) >> SHIFT);\
77 OP(dst[6*dstStride], (src4 + src9 - 5*(src5+src8) + src6*C1 + src7*C2 + (1<<(SHIFT-1))) >> SHIFT);\
78 OP(dst[7*dstStride], (src5 + src10 - 5*(src6+src9) + src7*C1 + src8*C2 + (1<<(SHIFT-1))) >> SHIFT);\
84 static void OPNAME ## rv40_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride,\
85 const int w, const int C1, const int C2, const int SHIFT){\
86 OPNAME ## rv40_qpel8_v_lowpass(dst , src , dstStride, srcStride, 8, C1, C2, SHIFT);\
87 OPNAME ## rv40_qpel8_v_lowpass(dst+8, src+8, dstStride, srcStride, 8, C1, C2, SHIFT);\
90 OPNAME ## rv40_qpel8_v_lowpass(dst , src , dstStride, srcStride, w-8, C1, C2, SHIFT);\
91 OPNAME ## rv40_qpel8_v_lowpass(dst+8, src+8, dstStride, srcStride, w-8, C1, C2, SHIFT);\
94 static void OPNAME ## rv40_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride,\
95 const int h, const int C1, const int C2, const int SHIFT){\
96 OPNAME ## rv40_qpel8_h_lowpass(dst , src , dstStride, srcStride, 8, C1, C2, SHIFT);\
97 OPNAME ## rv40_qpel8_h_lowpass(dst+8, src+8, dstStride, srcStride, 8, C1, C2, SHIFT);\
100 OPNAME ## rv40_qpel8_h_lowpass(dst , src , dstStride, srcStride, h-8, C1, C2, SHIFT);\
101 OPNAME ## rv40_qpel8_h_lowpass(dst+8, src+8, dstStride, srcStride, h-8, C1, C2, SHIFT);\
105 #define RV40_MC(OPNAME, SIZE) \
106 static void OPNAME ## rv40_qpel ## SIZE ## _mc10_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
108 OPNAME ## rv40_qpel ## SIZE ## _h_lowpass(dst, src, stride, stride, SIZE, 52, 20, 6);\
111 static void OPNAME ## rv40_qpel ## SIZE ## _mc30_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
113 OPNAME ## rv40_qpel ## SIZE ## _h_lowpass(dst, src, stride, stride, SIZE, 20, 52, 6);\
116 static void OPNAME ## rv40_qpel ## SIZE ## _mc01_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
118 OPNAME ## rv40_qpel ## SIZE ## _v_lowpass(dst, src, stride, stride, SIZE, 52, 20, 6);\
121 static void OPNAME ## rv40_qpel ## SIZE ## _mc11_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
123 uint8_t full[SIZE*(SIZE+5)];\
124 uint8_t * const full_mid = full + SIZE*2;\
125 put_rv40_qpel ## SIZE ## _h_lowpass(full, src - 2*stride, SIZE, stride, SIZE+5, 52, 20, 6);\
126 OPNAME ## rv40_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE, SIZE, 52, 20, 6);\
129 static void OPNAME ## rv40_qpel ## SIZE ## _mc21_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
131 uint8_t full[SIZE*(SIZE+5)];\
132 uint8_t * const full_mid = full + SIZE*2;\
133 put_rv40_qpel ## SIZE ## _h_lowpass(full, src - 2*stride, SIZE, stride, SIZE+5, 20, 20, 5);\
134 OPNAME ## rv40_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE, SIZE, 52, 20, 6);\
137 static void OPNAME ## rv40_qpel ## SIZE ## _mc31_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
139 uint8_t full[SIZE*(SIZE+5)];\
140 uint8_t * const full_mid = full + SIZE*2;\
141 put_rv40_qpel ## SIZE ## _h_lowpass(full, src - 2*stride, SIZE, stride, SIZE+5, 20, 52, 6);\
142 OPNAME ## rv40_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE, SIZE, 52, 20, 6);\
145 static void OPNAME ## rv40_qpel ## SIZE ## _mc12_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
147 uint8_t full[SIZE*(SIZE+5)];\
148 uint8_t * const full_mid = full + SIZE*2;\
149 put_rv40_qpel ## SIZE ## _h_lowpass(full, src - 2*stride, SIZE, stride, SIZE+5, 52, 20, 6);\
150 OPNAME ## rv40_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE, SIZE, 20, 20, 5);\
153 static void OPNAME ## rv40_qpel ## SIZE ## _mc22_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
155 uint8_t full[SIZE*(SIZE+5)];\
156 uint8_t * const full_mid = full + SIZE*2;\
157 put_rv40_qpel ## SIZE ## _h_lowpass(full, src - 2*stride, SIZE, stride, SIZE+5, 20, 20, 5);\
158 OPNAME ## rv40_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE, SIZE, 20, 20, 5);\
161 static void OPNAME ## rv40_qpel ## SIZE ## _mc32_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
163 uint8_t full[SIZE*(SIZE+5)];\
164 uint8_t * const full_mid = full + SIZE*2;\
165 put_rv40_qpel ## SIZE ## _h_lowpass(full, src - 2*stride, SIZE, stride, SIZE+5, 20, 52, 6);\
166 OPNAME ## rv40_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE, SIZE, 20, 20, 5);\
169 static void OPNAME ## rv40_qpel ## SIZE ## _mc03_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
171 OPNAME ## rv40_qpel ## SIZE ## _v_lowpass(dst, src, stride, stride, SIZE, 20, 52, 6);\
174 static void OPNAME ## rv40_qpel ## SIZE ## _mc13_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
176 uint8_t full[SIZE*(SIZE+5)];\
177 uint8_t * const full_mid = full + SIZE*2;\
178 put_rv40_qpel ## SIZE ## _h_lowpass(full, src - 2*stride, SIZE, stride, SIZE+5, 52, 20, 6);\
179 OPNAME ## rv40_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE, SIZE, 20, 52, 6);\
182 static void OPNAME ## rv40_qpel ## SIZE ## _mc23_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)\
184 uint8_t full[SIZE*(SIZE+5)];\
185 uint8_t * const full_mid = full + SIZE*2;\
186 put_rv40_qpel ## SIZE ## _h_lowpass(full, src - 2*stride, SIZE, stride, SIZE+5, 20, 20, 5);\
187 OPNAME ## rv40_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE, SIZE, 20, 52, 6);\
191 #define op_avg(a, b) a = (((a)+cm[b]+1)>>1)
192 #define op_put(a, b) a = cm[b]
212 #define RV40_CHROMA_MC(OPNAME, OP)\
213 static void OPNAME ## rv40_chroma_mc4_c(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y){\
214 const int A = (8-x) * (8-y);\
215 const int B = ( x) * (8-y);\
216 const int C = (8-x) * ( y);\
217 const int D = ( x) * ( y);\
219 int bias = rv40_bias[y>>1][x>>1];\
221 assert(x<8 && y<8 && x>=0 && y>=0);\
224 for(i = 0; i < h; i++){\
225 OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1] + bias));\
226 OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2] + bias));\
227 OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3] + bias));\
228 OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4] + bias));\
233 const int E = B + C;\
234 const int step = C ? stride : 1;\
235 for(i = 0; i < h; i++){\
236 OP(dst[0], (A*src[0] + E*src[step+0] + bias));\
237 OP(dst[1], (A*src[1] + E*src[step+1] + bias));\
238 OP(dst[2], (A*src[2] + E*src[step+2] + bias));\
239 OP(dst[3], (A*src[3] + E*src[step+3] + bias));\
246 static void OPNAME ## rv40_chroma_mc8_c(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y){\
247 const int A = (8-x) * (8-y);\
248 const int B = ( x) * (8-y);\
249 const int C = (8-x) * ( y);\
250 const int D = ( x) * ( y);\
252 int bias = rv40_bias[y>>1][x>>1];\
254 assert(x<8 && y<8 && x>=0 && y>=0);\
257 for(i = 0; i < h; i++){\
258 OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1] + bias));\
259 OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2] + bias));\
260 OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3] + bias));\
261 OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4] + bias));\
262 OP(dst[4], (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5] + bias));\
263 OP(dst[5], (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6] + bias));\
264 OP(dst[6], (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7] + bias));\
265 OP(dst[7], (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8] + bias));\
270 const int E = B + C;\
271 const int step = C ? stride : 1;\
272 for(i = 0; i < h; i++){\
273 OP(dst[0], (A*src[0] + E*src[step+0] + bias));\
274 OP(dst[1], (A*src[1] + E*src[step+1] + bias));\
275 OP(dst[2], (A*src[2] + E*src[step+2] + bias));\
276 OP(dst[3], (A*src[3] + E*src[step+3] + bias));\
277 OP(dst[4], (A*src[4] + E*src[step+4] + bias));\
278 OP(dst[5], (A*src[5] + E*src[step+5] + bias));\
279 OP(dst[6], (A*src[6] + E*src[step+6] + bias));\
280 OP(dst[7], (A*src[7] + E*src[step+7] + bias));\
287 #define op_avg(a, b) a = (((a)+((b)>>6)+1)>>1)
288 #define op_put(a, b) a = ((b)>>6)
293 #define RV40_WEIGHT_FUNC(size) \
294 static void rv40_weight_func_rnd_ ## size (uint8_t *dst, uint8_t *src1, uint8_t *src2, int w1, int w2, ptrdiff_t stride)\
298 for (j = 0; j < size; j++) {\
299 for (i = 0; i < size; i++)\
300 dst[i] = (((w2 * src1[i]) >> 9) + ((w1 * src2[i]) >> 9) + 0x10) >> 5;\
306 static void rv40_weight_func_nornd_ ## size (uint8_t *dst, uint8_t *src1, uint8_t *src2, int w1, int w2, ptrdiff_t stride)\
310 for (j = 0; j < size; j++) {\
311 for (i = 0; i < size; i++)\
312 dst[i] = (w2 * src1[i] + w1 * src2[i] + 0x10) >> 5;\
326 0x40, 0x50, 0x20, 0x60, 0x30, 0x50, 0x40, 0x30,
327 0x50, 0x40, 0x50, 0x30, 0x60, 0x20, 0x50, 0x40
334 0x40, 0x30, 0x60, 0x20, 0x50, 0x30, 0x30, 0x40,
335 0x40, 0x40, 0x50, 0x30, 0x20, 0x60, 0x30, 0x40
338 #define CLIP_SYMM(a, b) av_clip(a, -(b), b)
356 for (i = 0; i < 4; i++, src +=
stride) {
357 int diff_p1p0 = src[-2*
step] - src[-1*
step];
358 int diff_q1q0 = src[ 1*
step] - src[ 0*
step];
359 int diff_p1p2 = src[-2*
step] - src[-3*
step];
360 int diff_q1q2 = src[ 1*
step] - src[ 2*
step];
366 u = (alpha *
FFABS(t)) >> 7;
367 if (u > 3 - (filter_p1 && filter_q1))
371 if (filter_p1 && filter_q1)
374 diff =
CLIP_SYMM((t + 4) >> 3, lim_p0q0);
375 src[-1*
step] = cm[src[-1*
step] + diff];
376 src[ 0*
step] = cm[src[ 0*
step] - diff];
378 if (filter_p1 &&
FFABS(diff_p1p2) <= beta) {
379 t = (diff_p1p0 + diff_p1p2 - diff) >> 1;
383 if (filter_q1 &&
FFABS(diff_q1q2) <= beta) {
384 t = (diff_q1q0 + diff_q1q2 + diff) >> 1;
391 const int filter_p1,
const int filter_q1,
392 const int alpha,
const int beta,
393 const int lim_p0q0,
const int lim_q1,
397 alpha, beta, lim_p0q0, lim_q1, lim_p1);
401 const int filter_p1,
const int filter_q1,
402 const int alpha,
const int beta,
403 const int lim_p0q0,
const int lim_q1,
407 alpha, beta, lim_p0q0, lim_q1, lim_p1);
420 for(i = 0; i < 4; i++, src +=
stride){
421 int sflag, p0, q0, p1, q1;
427 sflag = (alpha *
FFABS(t)) >> 7;
431 p0 = (25*src[-3*
step] + 26*src[-2*
step] + 26*src[-1*
step] +
435 q0 = (25*src[-2*
step] + 26*src[-1*
step] + 26*src[ 0*
step] +
437 rv40_dither_r[dmode + i]) >> 7;
440 p0 = av_clip(p0, src[-1*step] - lims, src[-1*step] + lims);
441 q0 = av_clip(q0, src[ 0*step] - lims, src[ 0*step] + lims);
444 p1 = (25*src[-4*
step] + 26*src[-3*
step] + 26*src[-2*
step] + 26*p0 +
446 q1 = (25*src[-1*
step] + 26*q0 + 26*src[ 1*
step] + 26*src[ 2*
step] +
447 25*src[ 3*
step] + rv40_dither_r[dmode + i]) >> 7;
450 p1 = av_clip(p1, src[-2*step] - lims, src[-2*step] + lims);
451 q1 = av_clip(q1, src[ 1*step] - lims, src[ 1*step] + lims);
461 51*src[-3*
step] + 26*src[-4*
step] + 64) >> 7;
463 51*src[ 2*
step] + 26*src[ 3*
step] + 64) >> 7;
469 const int alpha,
const int lims,
470 const int dmode,
const int chroma)
476 const int alpha,
const int lims,
477 const int dmode,
const int chroma)
488 int sum_p1p0 = 0, sum_q1q0 = 0, sum_p1p2 = 0, sum_q1q2 = 0;
489 int strong0 = 0, strong1 = 0;
493 for (i = 0, ptr = src; i < 4; i++, ptr +=
stride) {
494 sum_p1p0 += ptr[-2*
step] - ptr[-1*
step];
495 sum_q1q0 += ptr[ 1*
step] - ptr[ 0*
step];
498 *p1 =
FFABS(sum_p1p0) < (beta << 2);
499 *q1 =
FFABS(sum_q1q0) < (beta << 2);
507 for (i = 0, ptr = src; i < 4; i++, ptr +=
stride) {
508 sum_p1p2 += ptr[-2*
step] - ptr[-3*
step];
509 sum_q1q2 += ptr[ 1*
step] - ptr[ 2*
step];
512 strong0 = *p1 && (
FFABS(sum_p1p2) < beta2);
513 strong1 = *q1 && (
FFABS(sum_q1q2) < beta2);
515 return strong0 && strong1;
519 int beta,
int beta2,
int edge,
526 int beta,
int beta2,
int edge,
qpel_mc_func put_pixels_tab[4][16]
static void rv40_h_weak_loop_filter(uint8_t *src, const ptrdiff_t stride, const int filter_p1, const int filter_q1, const int alpha, const int beta, const int lim_p0q0, const int lim_q1, const int lim_p1)
static void rv40_h_strong_loop_filter(uint8_t *src, const ptrdiff_t stride, const int alpha, const int lims, const int dmode, const int chroma)
rv40_loop_filter_strength_func rv40_loop_filter_strength[2]
av_cold void ff_rv40dsp_init_arm(RV34DSPContext *c)
void ff_put_rv40_qpel8_mc33_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
static av_always_inline void rv40_strong_loop_filter(uint8_t *src, const int step, const ptrdiff_t stride, const int alpha, const int lims, const int dmode, const int chroma)
av_cold void ff_h264qpel_init(H264QpelContext *c, int bit_depth)
#define RV40_LOWPASS(OPNAME, OP)
rv40_weak_loop_filter_func rv40_weak_loop_filter[2]
rv40_weight_func rv40_weight_pixels_tab[2][2]
Biweight functions, first dimension is transform size (16/8), second is whether the weight is prescal...
av_cold void ff_rv40dsp_init_aarch64(RV34DSPContext *c)
av_cold void ff_rv34dsp_init(RV34DSPContext *c)
static av_always_inline int rv40_loop_filter_strength(uint8_t *src, int step, ptrdiff_t stride, int beta, int beta2, int edge, int *p1, int *q1)
qpel_mc_func avg_h264_qpel_pixels_tab[4][16]
void ff_avg_rv40_qpel8_mc33_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
static void rv40_v_strong_loop_filter(uint8_t *src, const ptrdiff_t stride, const int alpha, const int lims, const int dmode, const int chroma)
qpel_mc_func avg_pixels_tab[4][16]
RV30/40 decoder motion compensation functions.
void ff_avg_rv40_qpel16_mc33_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
av_cold void ff_rv40dsp_init(RV34DSPContext *c)
#define RV40_MC(OPNAME, SIZE)
static av_always_inline void rv40_weak_loop_filter(uint8_t *src, const int step, const ptrdiff_t stride, const int filter_p1, const int filter_q1, const int alpha, const int beta, const int lim_p0q0, const int lim_q1, const int lim_p1)
weaker deblocking very similar to the one described in 4.4.2 of JVT-A003r1
qpel_mc_func put_h264_qpel_pixels_tab[4][16]
static const uint8_t rv40_dither_r[16]
dither values for deblocking filter - right/bottom values
static void rv40_v_weak_loop_filter(uint8_t *src, const ptrdiff_t stride, const int filter_p1, const int filter_q1, const int alpha, const int beta, const int lim_p0q0, const int lim_q1, const int lim_p1)
Libavcodec external API header.
static const int rv40_bias[4][4]
#define RV40_WEIGHT_FUNC(size)
void ff_rv40dsp_init_x86(RV34DSPContext *c)
static const uint8_t rv40_dither_l[16]
dither values for deblocking filter - left/top values
static int rv40_h_loop_filter_strength(uint8_t *src, ptrdiff_t stride, int beta, int beta2, int edge, int *p1, int *q1)
common internal and external API header
rv40_strong_loop_filter_func rv40_strong_loop_filter[2]
static int rv40_v_loop_filter_strength(uint8_t *src, ptrdiff_t stride, int beta, int beta2, int edge, int *p1, int *q1)
void ff_put_rv40_qpel16_mc33_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride)
h264_chroma_mc_func avg_chroma_pixels_tab[3]
h264_chroma_mc_func put_chroma_pixels_tab[3]
#define RV40_CHROMA_MC(OPNAME, OP)