33 #define RV30_LOWPASS(OPNAME, OP) \ 34 static void OPNAME ## rv30_tpel8_h_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride, const int C1, const int C2){\ 36 const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 38 for(i = 0; i < h; i++)\ 40 OP(dst[0], (-(src[-1]+src[2]) + src[0]*C1 + src[1]*C2 + 8)>>4);\ 41 OP(dst[1], (-(src[ 0]+src[3]) + src[1]*C1 + src[2]*C2 + 8)>>4);\ 42 OP(dst[2], (-(src[ 1]+src[4]) + src[2]*C1 + src[3]*C2 + 8)>>4);\ 43 OP(dst[3], (-(src[ 2]+src[5]) + src[3]*C1 + src[4]*C2 + 8)>>4);\ 44 OP(dst[4], (-(src[ 3]+src[6]) + src[4]*C1 + src[5]*C2 + 8)>>4);\ 45 OP(dst[5], (-(src[ 4]+src[7]) + src[5]*C1 + src[6]*C2 + 8)>>4);\ 46 OP(dst[6], (-(src[ 5]+src[8]) + src[6]*C1 + src[7]*C2 + 8)>>4);\ 47 OP(dst[7], (-(src[ 6]+src[9]) + src[7]*C1 + src[8]*C2 + 8)>>4);\ 53 static void OPNAME ## rv30_tpel8_v_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride, const int C1, const int C2){\ 55 const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 57 for(i = 0; i < w; i++)\ 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 OP(dst[0*dstStride], (-(srcA+src2) + src0*C1 + src1*C2 + 8)>>4);\ 71 OP(dst[1*dstStride], (-(src0+src3) + src1*C1 + src2*C2 + 8)>>4);\ 72 OP(dst[2*dstStride], (-(src1+src4) + src2*C1 + src3*C2 + 8)>>4);\ 73 OP(dst[3*dstStride], (-(src2+src5) + src3*C1 + src4*C2 + 8)>>4);\ 74 OP(dst[4*dstStride], (-(src3+src6) + src4*C1 + src5*C2 + 8)>>4);\ 75 OP(dst[5*dstStride], (-(src4+src7) + src5*C1 + src6*C2 + 8)>>4);\ 76 OP(dst[6*dstStride], (-(src5+src8) + src6*C1 + src7*C2 + 8)>>4);\ 77 OP(dst[7*dstStride], (-(src6+src9) + src7*C1 + src8*C2 + 8)>>4);\ 83 static void OPNAME ## rv30_tpel8_hv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 86 const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 88 for(j = 0; j < h; j++){\ 89 for(i = 0; i < w; i++){\ 91 src[srcStride*-1+i-1] -12*src[srcStride*-1+i] -6*src[srcStride*-1+i+1] +src[srcStride*-1+i+2]+\ 92 -12*src[srcStride* 0+i-1] +144*src[srcStride* 0+i] +72*src[srcStride* 0+i+1] -12*src[srcStride* 0+i+2] +\ 93 -6*src[srcStride* 1+i-1] +72*src[srcStride* 1+i] +36*src[srcStride* 1+i+1] -6*src[srcStride* 1+i+2] +\ 94 src[srcStride* 2+i-1] -12*src[srcStride* 2+i] -6*src[srcStride* 2+i+1] +src[srcStride* 2+i+2] +\ 102 static void OPNAME ## rv30_tpel8_hhv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 105 const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 107 for(j = 0; j < h; j++){\ 108 for(i = 0; i < w; i++){\ 110 src[srcStride*-1+i-1] -12*src[srcStride*-1+i+1] -6*src[srcStride*-1+i] +src[srcStride*-1+i+2]+\ 111 -12*src[srcStride* 0+i-1] +144*src[srcStride* 0+i+1] +72*src[srcStride* 0+i] -12*src[srcStride* 0+i+2]+\ 112 -6*src[srcStride* 1+i-1] +72*src[srcStride* 1+i+1] +36*src[srcStride* 1+i] -6*src[srcStride* 1+i+2]+\ 113 src[srcStride* 2+i-1] -12*src[srcStride* 2+i+1] -6*src[srcStride* 2+i] +src[srcStride* 2+i+2]+\ 121 static void OPNAME ## rv30_tpel8_hvv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 124 const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 126 for(j = 0; j < h; j++){\ 127 for(i = 0; i < w; i++){\ 129 src[srcStride*-1+i-1] -12*src[srcStride*-1+i] -6*src[srcStride*-1+i+1] +src[srcStride*-1+i+2]+\ 130 -6*src[srcStride* 0+i-1] +72*src[srcStride* 0+i] +36*src[srcStride* 0+i+1] -6*src[srcStride* 0+i+2]+\ 131 -12*src[srcStride* 1+i-1] +144*src[srcStride* 1+i] +72*src[srcStride* 1+i+1] -12*src[srcStride* 1+i+2]+\ 132 src[srcStride* 2+i-1] -12*src[srcStride* 2+i] -6*src[srcStride* 2+i+1] +src[srcStride* 2+i+2]+\ 140 static void OPNAME ## rv30_tpel8_hhvv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 143 const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;\ 145 for(j = 0; j < h; j++){\ 146 for(i = 0; i < w; i++){\ 148 36*src[i+srcStride*0] +54*src[i+1+srcStride*0] +6*src[i+2+srcStride*0]+\ 149 54*src[i+srcStride*1] +81*src[i+1+srcStride*1] +9*src[i+2+srcStride*1]+\ 150 6*src[i+srcStride*2] + 9*src[i+1+srcStride*2] + src[i+2+srcStride*2]+\ 158 static void OPNAME ## rv30_tpel16_v_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride, const int C1, const int C2){\ 159 OPNAME ## rv30_tpel8_v_lowpass(dst , src , dstStride, srcStride, C1, C2);\ 160 OPNAME ## rv30_tpel8_v_lowpass(dst+8, src+8, dstStride, srcStride, C1, C2);\ 163 OPNAME ## rv30_tpel8_v_lowpass(dst , src , dstStride, srcStride, C1, C2);\ 164 OPNAME ## rv30_tpel8_v_lowpass(dst+8, src+8, dstStride, srcStride, C1, C2);\ 167 static void OPNAME ## rv30_tpel16_h_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride, const int C1, const int C2){\ 168 OPNAME ## rv30_tpel8_h_lowpass(dst , src , dstStride, srcStride, C1, C2);\ 169 OPNAME ## rv30_tpel8_h_lowpass(dst+8, src+8, dstStride, srcStride, C1, C2);\ 172 OPNAME ## rv30_tpel8_h_lowpass(dst , src , dstStride, srcStride, C1, C2);\ 173 OPNAME ## rv30_tpel8_h_lowpass(dst+8, src+8, dstStride, srcStride, C1, C2);\ 176 static void OPNAME ## rv30_tpel16_hv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 177 OPNAME ## rv30_tpel8_hv_lowpass(dst , src , dstStride, srcStride);\ 178 OPNAME ## rv30_tpel8_hv_lowpass(dst+8, src+8, dstStride, srcStride);\ 181 OPNAME ## rv30_tpel8_hv_lowpass(dst , src , dstStride, srcStride);\ 182 OPNAME ## rv30_tpel8_hv_lowpass(dst+8, src+8, dstStride, srcStride);\ 185 static void OPNAME ## rv30_tpel16_hhv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 186 OPNAME ## rv30_tpel8_hhv_lowpass(dst , src , dstStride, srcStride);\ 187 OPNAME ## rv30_tpel8_hhv_lowpass(dst+8, src+8, dstStride, srcStride);\ 190 OPNAME ## rv30_tpel8_hhv_lowpass(dst , src , dstStride, srcStride);\ 191 OPNAME ## rv30_tpel8_hhv_lowpass(dst+8, src+8, dstStride, srcStride);\ 194 static void OPNAME ## rv30_tpel16_hvv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 195 OPNAME ## rv30_tpel8_hvv_lowpass(dst , src , dstStride, srcStride);\ 196 OPNAME ## rv30_tpel8_hvv_lowpass(dst+8, src+8, dstStride, srcStride);\ 199 OPNAME ## rv30_tpel8_hvv_lowpass(dst , src , dstStride, srcStride);\ 200 OPNAME ## rv30_tpel8_hvv_lowpass(dst+8, src+8, dstStride, srcStride);\ 203 static void OPNAME ## rv30_tpel16_hhvv_lowpass(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride){\ 204 OPNAME ## rv30_tpel8_hhvv_lowpass(dst , src , dstStride, srcStride);\ 205 OPNAME ## rv30_tpel8_hhvv_lowpass(dst+8, src+8, dstStride, srcStride);\ 208 OPNAME ## rv30_tpel8_hhvv_lowpass(dst , src , dstStride, srcStride);\ 209 OPNAME ## rv30_tpel8_hhvv_lowpass(dst+8, src+8, dstStride, srcStride);\ 213 #define RV30_MC(OPNAME, SIZE) \ 214 static void OPNAME ## rv30_tpel ## SIZE ## _mc10_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 216 OPNAME ## rv30_tpel ## SIZE ## _h_lowpass(dst, src, stride, stride, 12, 6);\ 219 static void OPNAME ## rv30_tpel ## SIZE ## _mc20_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 221 OPNAME ## rv30_tpel ## SIZE ## _h_lowpass(dst, src, stride, stride, 6, 12);\ 224 static void OPNAME ## rv30_tpel ## SIZE ## _mc01_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 226 OPNAME ## rv30_tpel ## SIZE ## _v_lowpass(dst, src, stride, stride, 12, 6);\ 229 static void OPNAME ## rv30_tpel ## SIZE ## _mc02_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 231 OPNAME ## rv30_tpel ## SIZE ## _v_lowpass(dst, src, stride, stride, 6, 12);\ 234 static void OPNAME ## rv30_tpel ## SIZE ## _mc11_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 236 OPNAME ## rv30_tpel ## SIZE ## _hv_lowpass(dst, src, stride, stride);\ 239 static void OPNAME ## rv30_tpel ## SIZE ## _mc12_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 241 OPNAME ## rv30_tpel ## SIZE ## _hvv_lowpass(dst, src, stride, stride);\ 244 static void OPNAME ## rv30_tpel ## SIZE ## _mc21_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 246 OPNAME ## rv30_tpel ## SIZE ## _hhv_lowpass(dst, src, stride, stride);\ 249 static void OPNAME ## rv30_tpel ## SIZE ## _mc22_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)\ 251 OPNAME ## rv30_tpel ## SIZE ## _hhvv_lowpass(dst, src, stride, stride);\ 255 #define op_avg(a, b) a = (((a)+cm[b]+1)>>1) 256 #define op_put(a, b) a = cm[b] 275 c->put_pixels_tab[0][ 1] = put_rv30_tpel16_mc10_c;
276 c->put_pixels_tab[0][ 2] = put_rv30_tpel16_mc20_c;
277 c->put_pixels_tab[0][ 4] = put_rv30_tpel16_mc01_c;
278 c->put_pixels_tab[0][ 5] = put_rv30_tpel16_mc11_c;
279 c->put_pixels_tab[0][ 6] = put_rv30_tpel16_mc21_c;
280 c->put_pixels_tab[0][ 8] = put_rv30_tpel16_mc02_c;
281 c->put_pixels_tab[0][ 9] = put_rv30_tpel16_mc12_c;
282 c->put_pixels_tab[0][10] = put_rv30_tpel16_mc22_c;
284 c->avg_pixels_tab[0][ 1] = avg_rv30_tpel16_mc10_c;
285 c->avg_pixels_tab[0][ 2] = avg_rv30_tpel16_mc20_c;
286 c->avg_pixels_tab[0][ 4] = avg_rv30_tpel16_mc01_c;
287 c->avg_pixels_tab[0][ 5] = avg_rv30_tpel16_mc11_c;
288 c->avg_pixels_tab[0][ 6] = avg_rv30_tpel16_mc21_c;
289 c->avg_pixels_tab[0][ 8] = avg_rv30_tpel16_mc02_c;
290 c->avg_pixels_tab[0][ 9] = avg_rv30_tpel16_mc12_c;
291 c->avg_pixels_tab[0][10] = avg_rv30_tpel16_mc22_c;
293 c->put_pixels_tab[1][ 1] = put_rv30_tpel8_mc10_c;
294 c->put_pixels_tab[1][ 2] = put_rv30_tpel8_mc20_c;
295 c->put_pixels_tab[1][ 4] = put_rv30_tpel8_mc01_c;
296 c->put_pixels_tab[1][ 5] = put_rv30_tpel8_mc11_c;
297 c->put_pixels_tab[1][ 6] = put_rv30_tpel8_mc21_c;
298 c->put_pixels_tab[1][ 8] = put_rv30_tpel8_mc02_c;
299 c->put_pixels_tab[1][ 9] = put_rv30_tpel8_mc12_c;
300 c->put_pixels_tab[1][10] = put_rv30_tpel8_mc22_c;
302 c->avg_pixels_tab[1][ 1] = avg_rv30_tpel8_mc10_c;
303 c->avg_pixels_tab[1][ 2] = avg_rv30_tpel8_mc20_c;
304 c->avg_pixels_tab[1][ 4] = avg_rv30_tpel8_mc01_c;
305 c->avg_pixels_tab[1][ 5] = avg_rv30_tpel8_mc11_c;
306 c->avg_pixels_tab[1][ 6] = avg_rv30_tpel8_mc21_c;
307 c->avg_pixels_tab[1][ 8] = avg_rv30_tpel8_mc02_c;
308 c->avg_pixels_tab[1][ 9] = avg_rv30_tpel8_mc12_c;
309 c->avg_pixels_tab[1][10] = avg_rv30_tpel8_mc22_c;
h264_chroma_mc_func put_h264_chroma_pixels_tab[4]
av_cold void ff_h264chroma_init(H264ChromaContext *c, int bit_depth)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
av_cold void ff_rv34dsp_init(RV34DSPContext *c)
qpel_mc_func avg_h264_qpel_pixels_tab[4][16]
RV30/40 decoder motion compensation functions.
av_cold void ff_rv30dsp_init(RV34DSPContext *c)
qpel_mc_func put_h264_qpel_pixels_tab[4][16]
Libavcodec external API header.
#define RV30_MC(OPNAME, SIZE)
#define RV30_LOWPASS(OPNAME, OP)
h264_chroma_mc_func avg_h264_chroma_pixels_tab[4]
av_cold void ff_h264qpel_init(H264QpelContext *c, int bit_depth)