00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00028 #include "avcodec.h"
00029 #include "mpegvideo.h"
00030 #include "h264pred.h"
00031 #include "mathops.h"
00032
00033 static void pred4x4_vertical_c(uint8_t *src, const uint8_t *topright, int stride){
00034 const uint32_t a= ((uint32_t*)(src-stride))[0];
00035 ((uint32_t*)(src+0*stride))[0]= a;
00036 ((uint32_t*)(src+1*stride))[0]= a;
00037 ((uint32_t*)(src+2*stride))[0]= a;
00038 ((uint32_t*)(src+3*stride))[0]= a;
00039 }
00040
00041 static void pred4x4_horizontal_c(uint8_t *src, const uint8_t *topright, int stride){
00042 ((uint32_t*)(src+0*stride))[0]= src[-1+0*stride]*0x01010101;
00043 ((uint32_t*)(src+1*stride))[0]= src[-1+1*stride]*0x01010101;
00044 ((uint32_t*)(src+2*stride))[0]= src[-1+2*stride]*0x01010101;
00045 ((uint32_t*)(src+3*stride))[0]= src[-1+3*stride]*0x01010101;
00046 }
00047
00048 static void pred4x4_dc_c(uint8_t *src, const uint8_t *topright, int stride){
00049 const int dc= ( src[-stride] + src[1-stride] + src[2-stride] + src[3-stride]
00050 + src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 4) >>3;
00051
00052 ((uint32_t*)(src+0*stride))[0]=
00053 ((uint32_t*)(src+1*stride))[0]=
00054 ((uint32_t*)(src+2*stride))[0]=
00055 ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101;
00056 }
00057
00058 static void pred4x4_left_dc_c(uint8_t *src, const uint8_t *topright, int stride){
00059 const int dc= ( src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 2) >>2;
00060
00061 ((uint32_t*)(src+0*stride))[0]=
00062 ((uint32_t*)(src+1*stride))[0]=
00063 ((uint32_t*)(src+2*stride))[0]=
00064 ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101;
00065 }
00066
00067 static void pred4x4_top_dc_c(uint8_t *src, const uint8_t *topright, int stride){
00068 const int dc= ( src[-stride] + src[1-stride] + src[2-stride] + src[3-stride] + 2) >>2;
00069
00070 ((uint32_t*)(src+0*stride))[0]=
00071 ((uint32_t*)(src+1*stride))[0]=
00072 ((uint32_t*)(src+2*stride))[0]=
00073 ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101;
00074 }
00075
00076 static void pred4x4_128_dc_c(uint8_t *src, const uint8_t *topright, int stride){
00077 ((uint32_t*)(src+0*stride))[0]=
00078 ((uint32_t*)(src+1*stride))[0]=
00079 ((uint32_t*)(src+2*stride))[0]=
00080 ((uint32_t*)(src+3*stride))[0]= 128U*0x01010101U;
00081 }
00082
00083 static void pred4x4_127_dc_c(uint8_t *src, const uint8_t *topright, int stride){
00084 ((uint32_t*)(src+0*stride))[0]=
00085 ((uint32_t*)(src+1*stride))[0]=
00086 ((uint32_t*)(src+2*stride))[0]=
00087 ((uint32_t*)(src+3*stride))[0]= 127U*0x01010101U;
00088 }
00089
00090 static void pred4x4_129_dc_c(uint8_t *src, const uint8_t *topright, int stride){
00091 ((uint32_t*)(src+0*stride))[0]=
00092 ((uint32_t*)(src+1*stride))[0]=
00093 ((uint32_t*)(src+2*stride))[0]=
00094 ((uint32_t*)(src+3*stride))[0]= 129U*0x01010101U;
00095 }
00096
00097
00098 #define LOAD_TOP_RIGHT_EDGE\
00099 const int av_unused t4= topright[0];\
00100 const int av_unused t5= topright[1];\
00101 const int av_unused t6= topright[2];\
00102 const int av_unused t7= topright[3];\
00103
00104 #define LOAD_DOWN_LEFT_EDGE\
00105 const int av_unused l4= src[-1+4*stride];\
00106 const int av_unused l5= src[-1+5*stride];\
00107 const int av_unused l6= src[-1+6*stride];\
00108 const int av_unused l7= src[-1+7*stride];\
00109
00110 #define LOAD_LEFT_EDGE\
00111 const int av_unused l0= src[-1+0*stride];\
00112 const int av_unused l1= src[-1+1*stride];\
00113 const int av_unused l2= src[-1+2*stride];\
00114 const int av_unused l3= src[-1+3*stride];\
00115
00116 #define LOAD_TOP_EDGE\
00117 const int av_unused t0= src[ 0-1*stride];\
00118 const int av_unused t1= src[ 1-1*stride];\
00119 const int av_unused t2= src[ 2-1*stride];\
00120 const int av_unused t3= src[ 3-1*stride];\
00121
00122 static void pred4x4_vertical_vp8_c(uint8_t *src, const uint8_t *topright, int stride){
00123 const int lt= src[-1-1*stride];
00124 LOAD_TOP_EDGE
00125 LOAD_TOP_RIGHT_EDGE
00126 uint32_t v = PACK_4U8((lt + 2*t0 + t1 + 2) >> 2,
00127 (t0 + 2*t1 + t2 + 2) >> 2,
00128 (t1 + 2*t2 + t3 + 2) >> 2,
00129 (t2 + 2*t3 + t4 + 2) >> 2);
00130
00131 AV_WN32A(src+0*stride, v);
00132 AV_WN32A(src+1*stride, v);
00133 AV_WN32A(src+2*stride, v);
00134 AV_WN32A(src+3*stride, v);
00135 }
00136
00137 static void pred4x4_horizontal_vp8_c(uint8_t *src, const uint8_t *topright, int stride){
00138 const int lt= src[-1-1*stride];
00139 LOAD_LEFT_EDGE
00140
00141 AV_WN32A(src+0*stride, ((lt + 2*l0 + l1 + 2) >> 2)*0x01010101);
00142 AV_WN32A(src+1*stride, ((l0 + 2*l1 + l2 + 2) >> 2)*0x01010101);
00143 AV_WN32A(src+2*stride, ((l1 + 2*l2 + l3 + 2) >> 2)*0x01010101);
00144 AV_WN32A(src+3*stride, ((l2 + 2*l3 + l3 + 2) >> 2)*0x01010101);
00145 }
00146
00147 static void pred4x4_down_right_c(uint8_t *src, const uint8_t *topright, int stride){
00148 const int lt= src[-1-1*stride];
00149 LOAD_TOP_EDGE
00150 LOAD_LEFT_EDGE
00151
00152 src[0+3*stride]=(l3 + 2*l2 + l1 + 2)>>2;
00153 src[0+2*stride]=
00154 src[1+3*stride]=(l2 + 2*l1 + l0 + 2)>>2;
00155 src[0+1*stride]=
00156 src[1+2*stride]=
00157 src[2+3*stride]=(l1 + 2*l0 + lt + 2)>>2;
00158 src[0+0*stride]=
00159 src[1+1*stride]=
00160 src[2+2*stride]=
00161 src[3+3*stride]=(l0 + 2*lt + t0 + 2)>>2;
00162 src[1+0*stride]=
00163 src[2+1*stride]=
00164 src[3+2*stride]=(lt + 2*t0 + t1 + 2)>>2;
00165 src[2+0*stride]=
00166 src[3+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
00167 src[3+0*stride]=(t1 + 2*t2 + t3 + 2)>>2;
00168 }
00169
00170 static void pred4x4_down_left_c(uint8_t *src, const uint8_t *topright, int stride){
00171 LOAD_TOP_EDGE
00172 LOAD_TOP_RIGHT_EDGE
00173
00174
00175 src[0+0*stride]=(t0 + t2 + 2*t1 + 2)>>2;
00176 src[1+0*stride]=
00177 src[0+1*stride]=(t1 + t3 + 2*t2 + 2)>>2;
00178 src[2+0*stride]=
00179 src[1+1*stride]=
00180 src[0+2*stride]=(t2 + t4 + 2*t3 + 2)>>2;
00181 src[3+0*stride]=
00182 src[2+1*stride]=
00183 src[1+2*stride]=
00184 src[0+3*stride]=(t3 + t5 + 2*t4 + 2)>>2;
00185 src[3+1*stride]=
00186 src[2+2*stride]=
00187 src[1+3*stride]=(t4 + t6 + 2*t5 + 2)>>2;
00188 src[3+2*stride]=
00189 src[2+3*stride]=(t5 + t7 + 2*t6 + 2)>>2;
00190 src[3+3*stride]=(t6 + 3*t7 + 2)>>2;
00191 }
00192
00193 static void pred4x4_down_left_svq3_c(uint8_t *src, const uint8_t *topright, int stride){
00194 LOAD_TOP_EDGE
00195 LOAD_LEFT_EDGE
00196 const av_unused int unu0= t0;
00197 const av_unused int unu1= l0;
00198
00199 src[0+0*stride]=(l1 + t1)>>1;
00200 src[1+0*stride]=
00201 src[0+1*stride]=(l2 + t2)>>1;
00202 src[2+0*stride]=
00203 src[1+1*stride]=
00204 src[0+2*stride]=
00205 src[3+0*stride]=
00206 src[2+1*stride]=
00207 src[1+2*stride]=
00208 src[0+3*stride]=
00209 src[3+1*stride]=
00210 src[2+2*stride]=
00211 src[1+3*stride]=
00212 src[3+2*stride]=
00213 src[2+3*stride]=
00214 src[3+3*stride]=(l3 + t3)>>1;
00215 }
00216
00217 static void pred4x4_down_left_rv40_c(uint8_t *src, const uint8_t *topright, int stride){
00218 LOAD_TOP_EDGE
00219 LOAD_TOP_RIGHT_EDGE
00220 LOAD_LEFT_EDGE
00221 LOAD_DOWN_LEFT_EDGE
00222
00223 src[0+0*stride]=(t0 + t2 + 2*t1 + 2 + l0 + l2 + 2*l1 + 2)>>3;
00224 src[1+0*stride]=
00225 src[0+1*stride]=(t1 + t3 + 2*t2 + 2 + l1 + l3 + 2*l2 + 2)>>3;
00226 src[2+0*stride]=
00227 src[1+1*stride]=
00228 src[0+2*stride]=(t2 + t4 + 2*t3 + 2 + l2 + l4 + 2*l3 + 2)>>3;
00229 src[3+0*stride]=
00230 src[2+1*stride]=
00231 src[1+2*stride]=
00232 src[0+3*stride]=(t3 + t5 + 2*t4 + 2 + l3 + l5 + 2*l4 + 2)>>3;
00233 src[3+1*stride]=
00234 src[2+2*stride]=
00235 src[1+3*stride]=(t4 + t6 + 2*t5 + 2 + l4 + l6 + 2*l5 + 2)>>3;
00236 src[3+2*stride]=
00237 src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l5 + l7 + 2*l6 + 2)>>3;
00238 src[3+3*stride]=(t6 + t7 + 1 + l6 + l7 + 1)>>2;
00239 }
00240
00241 static void pred4x4_down_left_rv40_nodown_c(uint8_t *src, const uint8_t *topright, int stride){
00242 LOAD_TOP_EDGE
00243 LOAD_TOP_RIGHT_EDGE
00244 LOAD_LEFT_EDGE
00245
00246 src[0+0*stride]=(t0 + t2 + 2*t1 + 2 + l0 + l2 + 2*l1 + 2)>>3;
00247 src[1+0*stride]=
00248 src[0+1*stride]=(t1 + t3 + 2*t2 + 2 + l1 + l3 + 2*l2 + 2)>>3;
00249 src[2+0*stride]=
00250 src[1+1*stride]=
00251 src[0+2*stride]=(t2 + t4 + 2*t3 + 2 + l2 + 3*l3 + 2)>>3;
00252 src[3+0*stride]=
00253 src[2+1*stride]=
00254 src[1+2*stride]=
00255 src[0+3*stride]=(t3 + t5 + 2*t4 + 2 + l3*4 + 2)>>3;
00256 src[3+1*stride]=
00257 src[2+2*stride]=
00258 src[1+3*stride]=(t4 + t6 + 2*t5 + 2 + l3*4 + 2)>>3;
00259 src[3+2*stride]=
00260 src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l3*4 + 2)>>3;
00261 src[3+3*stride]=(t6 + t7 + 1 + 2*l3 + 1)>>2;
00262 }
00263
00264 static void pred4x4_vertical_right_c(uint8_t *src, const uint8_t *topright, int stride){
00265 const int lt= src[-1-1*stride];
00266 LOAD_TOP_EDGE
00267 LOAD_LEFT_EDGE
00268
00269 src[0+0*stride]=
00270 src[1+2*stride]=(lt + t0 + 1)>>1;
00271 src[1+0*stride]=
00272 src[2+2*stride]=(t0 + t1 + 1)>>1;
00273 src[2+0*stride]=
00274 src[3+2*stride]=(t1 + t2 + 1)>>1;
00275 src[3+0*stride]=(t2 + t3 + 1)>>1;
00276 src[0+1*stride]=
00277 src[1+3*stride]=(l0 + 2*lt + t0 + 2)>>2;
00278 src[1+1*stride]=
00279 src[2+3*stride]=(lt + 2*t0 + t1 + 2)>>2;
00280 src[2+1*stride]=
00281 src[3+3*stride]=(t0 + 2*t1 + t2 + 2)>>2;
00282 src[3+1*stride]=(t1 + 2*t2 + t3 + 2)>>2;
00283 src[0+2*stride]=(lt + 2*l0 + l1 + 2)>>2;
00284 src[0+3*stride]=(l0 + 2*l1 + l2 + 2)>>2;
00285 }
00286
00287 static void pred4x4_vertical_left_c(uint8_t *src, const uint8_t *topright, int stride){
00288 LOAD_TOP_EDGE
00289 LOAD_TOP_RIGHT_EDGE
00290
00291 src[0+0*stride]=(t0 + t1 + 1)>>1;
00292 src[1+0*stride]=
00293 src[0+2*stride]=(t1 + t2 + 1)>>1;
00294 src[2+0*stride]=
00295 src[1+2*stride]=(t2 + t3 + 1)>>1;
00296 src[3+0*stride]=
00297 src[2+2*stride]=(t3 + t4+ 1)>>1;
00298 src[3+2*stride]=(t4 + t5+ 1)>>1;
00299 src[0+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
00300 src[1+1*stride]=
00301 src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
00302 src[2+1*stride]=
00303 src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
00304 src[3+1*stride]=
00305 src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
00306 src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
00307 }
00308
00309 static void pred4x4_vertical_left_rv40(uint8_t *src, const uint8_t *topright, int stride,
00310 const int l0, const int l1, const int l2, const int l3, const int l4){
00311 LOAD_TOP_EDGE
00312 LOAD_TOP_RIGHT_EDGE
00313
00314 src[0+0*stride]=(2*t0 + 2*t1 + l1 + 2*l2 + l3 + 4)>>3;
00315 src[1+0*stride]=
00316 src[0+2*stride]=(t1 + t2 + 1)>>1;
00317 src[2+0*stride]=
00318 src[1+2*stride]=(t2 + t3 + 1)>>1;
00319 src[3+0*stride]=
00320 src[2+2*stride]=(t3 + t4+ 1)>>1;
00321 src[3+2*stride]=(t4 + t5+ 1)>>1;
00322 src[0+1*stride]=(t0 + 2*t1 + t2 + l2 + 2*l3 + l4 + 4)>>3;
00323 src[1+1*stride]=
00324 src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
00325 src[2+1*stride]=
00326 src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
00327 src[3+1*stride]=
00328 src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
00329 src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
00330 }
00331
00332 static void pred4x4_vertical_left_rv40_c(uint8_t *src, const uint8_t *topright, int stride){
00333 LOAD_LEFT_EDGE
00334 LOAD_DOWN_LEFT_EDGE
00335
00336 pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l4);
00337 }
00338
00339 static void pred4x4_vertical_left_rv40_nodown_c(uint8_t *src, const uint8_t *topright, int stride){
00340 LOAD_LEFT_EDGE
00341
00342 pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l3);
00343 }
00344
00345 static void pred4x4_vertical_left_vp8_c(uint8_t *src, const uint8_t *topright, int stride){
00346 LOAD_TOP_EDGE
00347 LOAD_TOP_RIGHT_EDGE
00348
00349 src[0+0*stride]=(t0 + t1 + 1)>>1;
00350 src[1+0*stride]=
00351 src[0+2*stride]=(t1 + t2 + 1)>>1;
00352 src[2+0*stride]=
00353 src[1+2*stride]=(t2 + t3 + 1)>>1;
00354 src[3+0*stride]=
00355 src[2+2*stride]=(t3 + t4 + 1)>>1;
00356 src[0+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
00357 src[1+1*stride]=
00358 src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
00359 src[2+1*stride]=
00360 src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
00361 src[3+1*stride]=
00362 src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
00363 src[3+2*stride]=(t4 + 2*t5 + t6 + 2)>>2;
00364 src[3+3*stride]=(t5 + 2*t6 + t7 + 2)>>2;
00365 }
00366
00367 static void pred4x4_horizontal_up_c(uint8_t *src, const uint8_t *topright, int stride){
00368 LOAD_LEFT_EDGE
00369
00370 src[0+0*stride]=(l0 + l1 + 1)>>1;
00371 src[1+0*stride]=(l0 + 2*l1 + l2 + 2)>>2;
00372 src[2+0*stride]=
00373 src[0+1*stride]=(l1 + l2 + 1)>>1;
00374 src[3+0*stride]=
00375 src[1+1*stride]=(l1 + 2*l2 + l3 + 2)>>2;
00376 src[2+1*stride]=
00377 src[0+2*stride]=(l2 + l3 + 1)>>1;
00378 src[3+1*stride]=
00379 src[1+2*stride]=(l2 + 2*l3 + l3 + 2)>>2;
00380 src[3+2*stride]=
00381 src[1+3*stride]=
00382 src[0+3*stride]=
00383 src[2+2*stride]=
00384 src[2+3*stride]=
00385 src[3+3*stride]=l3;
00386 }
00387
00388 static void pred4x4_horizontal_up_rv40_c(uint8_t *src, const uint8_t *topright, int stride){
00389 LOAD_LEFT_EDGE
00390 LOAD_DOWN_LEFT_EDGE
00391 LOAD_TOP_EDGE
00392 LOAD_TOP_RIGHT_EDGE
00393
00394 src[0+0*stride]=(t1 + 2*t2 + t3 + 2*l0 + 2*l1 + 4)>>3;
00395 src[1+0*stride]=(t2 + 2*t3 + t4 + l0 + 2*l1 + l2 + 4)>>3;
00396 src[2+0*stride]=
00397 src[0+1*stride]=(t3 + 2*t4 + t5 + 2*l1 + 2*l2 + 4)>>3;
00398 src[3+0*stride]=
00399 src[1+1*stride]=(t4 + 2*t5 + t6 + l1 + 2*l2 + l3 + 4)>>3;
00400 src[2+1*stride]=
00401 src[0+2*stride]=(t5 + 2*t6 + t7 + 2*l2 + 2*l3 + 4)>>3;
00402 src[3+1*stride]=
00403 src[1+2*stride]=(t6 + 3*t7 + l2 + 3*l3 + 4)>>3;
00404 src[3+2*stride]=
00405 src[1+3*stride]=(l3 + 2*l4 + l5 + 2)>>2;
00406 src[0+3*stride]=
00407 src[2+2*stride]=(t6 + t7 + l3 + l4 + 2)>>2;
00408 src[2+3*stride]=(l4 + l5 + 1)>>1;
00409 src[3+3*stride]=(l4 + 2*l5 + l6 + 2)>>2;
00410 }
00411
00412 static void pred4x4_horizontal_up_rv40_nodown_c(uint8_t *src, const uint8_t *topright, int stride){
00413 LOAD_LEFT_EDGE
00414 LOAD_TOP_EDGE
00415 LOAD_TOP_RIGHT_EDGE
00416
00417 src[0+0*stride]=(t1 + 2*t2 + t3 + 2*l0 + 2*l1 + 4)>>3;
00418 src[1+0*stride]=(t2 + 2*t3 + t4 + l0 + 2*l1 + l2 + 4)>>3;
00419 src[2+0*stride]=
00420 src[0+1*stride]=(t3 + 2*t4 + t5 + 2*l1 + 2*l2 + 4)>>3;
00421 src[3+0*stride]=
00422 src[1+1*stride]=(t4 + 2*t5 + t6 + l1 + 2*l2 + l3 + 4)>>3;
00423 src[2+1*stride]=
00424 src[0+2*stride]=(t5 + 2*t6 + t7 + 2*l2 + 2*l3 + 4)>>3;
00425 src[3+1*stride]=
00426 src[1+2*stride]=(t6 + 3*t7 + l2 + 3*l3 + 4)>>3;
00427 src[3+2*stride]=
00428 src[1+3*stride]=l3;
00429 src[0+3*stride]=
00430 src[2+2*stride]=(t6 + t7 + 2*l3 + 2)>>2;
00431 src[2+3*stride]=
00432 src[3+3*stride]=l3;
00433 }
00434
00435 static void pred4x4_horizontal_down_c(uint8_t *src, const uint8_t *topright, int stride){
00436 const int lt= src[-1-1*stride];
00437 LOAD_TOP_EDGE
00438 LOAD_LEFT_EDGE
00439
00440 src[0+0*stride]=
00441 src[2+1*stride]=(lt + l0 + 1)>>1;
00442 src[1+0*stride]=
00443 src[3+1*stride]=(l0 + 2*lt + t0 + 2)>>2;
00444 src[2+0*stride]=(lt + 2*t0 + t1 + 2)>>2;
00445 src[3+0*stride]=(t0 + 2*t1 + t2 + 2)>>2;
00446 src[0+1*stride]=
00447 src[2+2*stride]=(l0 + l1 + 1)>>1;
00448 src[1+1*stride]=
00449 src[3+2*stride]=(lt + 2*l0 + l1 + 2)>>2;
00450 src[0+2*stride]=
00451 src[2+3*stride]=(l1 + l2+ 1)>>1;
00452 src[1+2*stride]=
00453 src[3+3*stride]=(l0 + 2*l1 + l2 + 2)>>2;
00454 src[0+3*stride]=(l2 + l3 + 1)>>1;
00455 src[1+3*stride]=(l1 + 2*l2 + l3 + 2)>>2;
00456 }
00457
00458 static void pred4x4_tm_vp8_c(uint8_t *src, const uint8_t *topright, int stride){
00459 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP - src[-1-stride];
00460 uint8_t *top = src-stride;
00461 int y;
00462
00463 for (y = 0; y < 4; y++) {
00464 uint8_t *cm_in = cm + src[-1];
00465 src[0] = cm_in[top[0]];
00466 src[1] = cm_in[top[1]];
00467 src[2] = cm_in[top[2]];
00468 src[3] = cm_in[top[3]];
00469 src += stride;
00470 }
00471 }
00472
00473 static void pred16x16_vertical_c(uint8_t *src, int stride){
00474 int i;
00475 const uint32_t a= ((uint32_t*)(src-stride))[0];
00476 const uint32_t b= ((uint32_t*)(src-stride))[1];
00477 const uint32_t c= ((uint32_t*)(src-stride))[2];
00478 const uint32_t d= ((uint32_t*)(src-stride))[3];
00479
00480 for(i=0; i<16; i++){
00481 ((uint32_t*)(src+i*stride))[0]= a;
00482 ((uint32_t*)(src+i*stride))[1]= b;
00483 ((uint32_t*)(src+i*stride))[2]= c;
00484 ((uint32_t*)(src+i*stride))[3]= d;
00485 }
00486 }
00487
00488 static void pred16x16_horizontal_c(uint8_t *src, int stride){
00489 int i;
00490
00491 for(i=0; i<16; i++){
00492 ((uint32_t*)(src+i*stride))[0]=
00493 ((uint32_t*)(src+i*stride))[1]=
00494 ((uint32_t*)(src+i*stride))[2]=
00495 ((uint32_t*)(src+i*stride))[3]= src[-1+i*stride]*0x01010101;
00496 }
00497 }
00498
00499 static void pred16x16_dc_c(uint8_t *src, int stride){
00500 int i, dc=0;
00501
00502 for(i=0;i<16; i++){
00503 dc+= src[-1+i*stride];
00504 }
00505
00506 for(i=0;i<16; i++){
00507 dc+= src[i-stride];
00508 }
00509
00510 dc= 0x01010101*((dc + 16)>>5);
00511
00512 for(i=0; i<16; i++){
00513 ((uint32_t*)(src+i*stride))[0]=
00514 ((uint32_t*)(src+i*stride))[1]=
00515 ((uint32_t*)(src+i*stride))[2]=
00516 ((uint32_t*)(src+i*stride))[3]= dc;
00517 }
00518 }
00519
00520 static void pred16x16_left_dc_c(uint8_t *src, int stride){
00521 int i, dc=0;
00522
00523 for(i=0;i<16; i++){
00524 dc+= src[-1+i*stride];
00525 }
00526
00527 dc= 0x01010101*((dc + 8)>>4);
00528
00529 for(i=0; i<16; i++){
00530 ((uint32_t*)(src+i*stride))[0]=
00531 ((uint32_t*)(src+i*stride))[1]=
00532 ((uint32_t*)(src+i*stride))[2]=
00533 ((uint32_t*)(src+i*stride))[3]= dc;
00534 }
00535 }
00536
00537 static void pred16x16_top_dc_c(uint8_t *src, int stride){
00538 int i, dc=0;
00539
00540 for(i=0;i<16; i++){
00541 dc+= src[i-stride];
00542 }
00543 dc= 0x01010101*((dc + 8)>>4);
00544
00545 for(i=0; i<16; i++){
00546 ((uint32_t*)(src+i*stride))[0]=
00547 ((uint32_t*)(src+i*stride))[1]=
00548 ((uint32_t*)(src+i*stride))[2]=
00549 ((uint32_t*)(src+i*stride))[3]= dc;
00550 }
00551 }
00552
00553 static void pred16x16_128_dc_c(uint8_t *src, int stride){
00554 int i;
00555
00556 for(i=0; i<16; i++){
00557 ((uint32_t*)(src+i*stride))[0]=
00558 ((uint32_t*)(src+i*stride))[1]=
00559 ((uint32_t*)(src+i*stride))[2]=
00560 ((uint32_t*)(src+i*stride))[3]= 0x01010101U*128U;
00561 }
00562 }
00563
00564 static void pred16x16_127_dc_c(uint8_t *src, int stride){
00565 int i;
00566
00567 for(i=0; i<16; i++){
00568 ((uint32_t*)(src+i*stride))[0]=
00569 ((uint32_t*)(src+i*stride))[1]=
00570 ((uint32_t*)(src+i*stride))[2]=
00571 ((uint32_t*)(src+i*stride))[3]= 0x01010101U*127U;
00572 }
00573 }
00574
00575 static void pred16x16_129_dc_c(uint8_t *src, int stride){
00576 int i;
00577
00578 for(i=0; i<16; i++){
00579 ((uint32_t*)(src+i*stride))[0]=
00580 ((uint32_t*)(src+i*stride))[1]=
00581 ((uint32_t*)(src+i*stride))[2]=
00582 ((uint32_t*)(src+i*stride))[3]= 0x01010101U*129U;
00583 }
00584 }
00585
00586 static inline void pred16x16_plane_compat_c(uint8_t *src, int stride, const int svq3, const int rv40){
00587 int i, j, k;
00588 int a;
00589 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
00590 const uint8_t * const src0 = src+7-stride;
00591 const uint8_t *src1 = src+8*stride-1;
00592 const uint8_t *src2 = src1-2*stride;
00593 int H = src0[1] - src0[-1];
00594 int V = src1[0] - src2[ 0];
00595 for(k=2; k<=8; ++k) {
00596 src1 += stride; src2 -= stride;
00597 H += k*(src0[k] - src0[-k]);
00598 V += k*(src1[0] - src2[ 0]);
00599 }
00600 if(svq3){
00601 H = ( 5*(H/4) ) / 16;
00602 V = ( 5*(V/4) ) / 16;
00603
00604
00605 i = H; H = V; V = i;
00606 }else if(rv40){
00607 H = ( H + (H>>2) ) >> 4;
00608 V = ( V + (V>>2) ) >> 4;
00609 }else{
00610 H = ( 5*H+32 ) >> 6;
00611 V = ( 5*V+32 ) >> 6;
00612 }
00613
00614 a = 16*(src1[0] + src2[16] + 1) - 7*(V+H);
00615 for(j=16; j>0; --j) {
00616 int b = a;
00617 a += V;
00618 for(i=-16; i<0; i+=4) {
00619 src[16+i] = cm[ (b ) >> 5 ];
00620 src[17+i] = cm[ (b+ H) >> 5 ];
00621 src[18+i] = cm[ (b+2*H) >> 5 ];
00622 src[19+i] = cm[ (b+3*H) >> 5 ];
00623 b += 4*H;
00624 }
00625 src += stride;
00626 }
00627 }
00628
00629 static void pred16x16_plane_c(uint8_t *src, int stride){
00630 pred16x16_plane_compat_c(src, stride, 0, 0);
00631 }
00632
00633 static void pred16x16_plane_svq3_c(uint8_t *src, int stride){
00634 pred16x16_plane_compat_c(src, stride, 1, 0);
00635 }
00636
00637 static void pred16x16_plane_rv40_c(uint8_t *src, int stride){
00638 pred16x16_plane_compat_c(src, stride, 0, 1);
00639 }
00640
00641 static void pred16x16_tm_vp8_c(uint8_t *src, int stride){
00642 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP - src[-1-stride];
00643 uint8_t *top = src-stride;
00644 int y;
00645
00646 for (y = 0; y < 16; y++) {
00647 uint8_t *cm_in = cm + src[-1];
00648 src[0] = cm_in[top[0]];
00649 src[1] = cm_in[top[1]];
00650 src[2] = cm_in[top[2]];
00651 src[3] = cm_in[top[3]];
00652 src[4] = cm_in[top[4]];
00653 src[5] = cm_in[top[5]];
00654 src[6] = cm_in[top[6]];
00655 src[7] = cm_in[top[7]];
00656 src[8] = cm_in[top[8]];
00657 src[9] = cm_in[top[9]];
00658 src[10] = cm_in[top[10]];
00659 src[11] = cm_in[top[11]];
00660 src[12] = cm_in[top[12]];
00661 src[13] = cm_in[top[13]];
00662 src[14] = cm_in[top[14]];
00663 src[15] = cm_in[top[15]];
00664 src += stride;
00665 }
00666 }
00667
00668 static void pred8x8_vertical_c(uint8_t *src, int stride){
00669 int i;
00670 const uint32_t a= ((uint32_t*)(src-stride))[0];
00671 const uint32_t b= ((uint32_t*)(src-stride))[1];
00672
00673 for(i=0; i<8; i++){
00674 ((uint32_t*)(src+i*stride))[0]= a;
00675 ((uint32_t*)(src+i*stride))[1]= b;
00676 }
00677 }
00678
00679 static void pred8x8_horizontal_c(uint8_t *src, int stride){
00680 int i;
00681
00682 for(i=0; i<8; i++){
00683 ((uint32_t*)(src+i*stride))[0]=
00684 ((uint32_t*)(src+i*stride))[1]= src[-1+i*stride]*0x01010101;
00685 }
00686 }
00687
00688 static void pred8x8_128_dc_c(uint8_t *src, int stride){
00689 int i;
00690
00691 for(i=0; i<8; i++){
00692 ((uint32_t*)(src+i*stride))[0]=
00693 ((uint32_t*)(src+i*stride))[1]= 0x01010101U*128U;
00694 }
00695 }
00696
00697 static void pred8x8_127_dc_c(uint8_t *src, int stride){
00698 int i;
00699
00700 for(i=0; i<8; i++){
00701 ((uint32_t*)(src+i*stride))[0]=
00702 ((uint32_t*)(src+i*stride))[1]= 0x01010101U*127U;
00703 }
00704 }
00705 static void pred8x8_129_dc_c(uint8_t *src, int stride){
00706 int i;
00707
00708 for(i=0; i<8; i++){
00709 ((uint32_t*)(src+i*stride))[0]=
00710 ((uint32_t*)(src+i*stride))[1]= 0x01010101U*129U;
00711 }
00712 }
00713
00714 static void pred8x8_left_dc_c(uint8_t *src, int stride){
00715 int i;
00716 int dc0, dc2;
00717
00718 dc0=dc2=0;
00719 for(i=0;i<4; i++){
00720 dc0+= src[-1+i*stride];
00721 dc2+= src[-1+(i+4)*stride];
00722 }
00723 dc0= 0x01010101*((dc0 + 2)>>2);
00724 dc2= 0x01010101*((dc2 + 2)>>2);
00725
00726 for(i=0; i<4; i++){
00727 ((uint32_t*)(src+i*stride))[0]=
00728 ((uint32_t*)(src+i*stride))[1]= dc0;
00729 }
00730 for(i=4; i<8; i++){
00731 ((uint32_t*)(src+i*stride))[0]=
00732 ((uint32_t*)(src+i*stride))[1]= dc2;
00733 }
00734 }
00735
00736 static void pred8x8_left_dc_rv40_c(uint8_t *src, int stride){
00737 int i;
00738 int dc0;
00739
00740 dc0=0;
00741 for(i=0;i<8; i++)
00742 dc0+= src[-1+i*stride];
00743 dc0= 0x01010101*((dc0 + 4)>>3);
00744
00745 for(i=0; i<8; i++){
00746 ((uint32_t*)(src+i*stride))[0]=
00747 ((uint32_t*)(src+i*stride))[1]= dc0;
00748 }
00749 }
00750
00751 static void pred8x8_top_dc_c(uint8_t *src, int stride){
00752 int i;
00753 int dc0, dc1;
00754
00755 dc0=dc1=0;
00756 for(i=0;i<4; i++){
00757 dc0+= src[i-stride];
00758 dc1+= src[4+i-stride];
00759 }
00760 dc0= 0x01010101*((dc0 + 2)>>2);
00761 dc1= 0x01010101*((dc1 + 2)>>2);
00762
00763 for(i=0; i<4; i++){
00764 ((uint32_t*)(src+i*stride))[0]= dc0;
00765 ((uint32_t*)(src+i*stride))[1]= dc1;
00766 }
00767 for(i=4; i<8; i++){
00768 ((uint32_t*)(src+i*stride))[0]= dc0;
00769 ((uint32_t*)(src+i*stride))[1]= dc1;
00770 }
00771 }
00772
00773 static void pred8x8_top_dc_rv40_c(uint8_t *src, int stride){
00774 int i;
00775 int dc0;
00776
00777 dc0=0;
00778 for(i=0;i<8; i++)
00779 dc0+= src[i-stride];
00780 dc0= 0x01010101*((dc0 + 4)>>3);
00781
00782 for(i=0; i<8; i++){
00783 ((uint32_t*)(src+i*stride))[0]=
00784 ((uint32_t*)(src+i*stride))[1]= dc0;
00785 }
00786 }
00787
00788
00789 static void pred8x8_dc_c(uint8_t *src, int stride){
00790 int i;
00791 int dc0, dc1, dc2, dc3;
00792
00793 dc0=dc1=dc2=0;
00794 for(i=0;i<4; i++){
00795 dc0+= src[-1+i*stride] + src[i-stride];
00796 dc1+= src[4+i-stride];
00797 dc2+= src[-1+(i+4)*stride];
00798 }
00799 dc3= 0x01010101*((dc1 + dc2 + 4)>>3);
00800 dc0= 0x01010101*((dc0 + 4)>>3);
00801 dc1= 0x01010101*((dc1 + 2)>>2);
00802 dc2= 0x01010101*((dc2 + 2)>>2);
00803
00804 for(i=0; i<4; i++){
00805 ((uint32_t*)(src+i*stride))[0]= dc0;
00806 ((uint32_t*)(src+i*stride))[1]= dc1;
00807 }
00808 for(i=4; i<8; i++){
00809 ((uint32_t*)(src+i*stride))[0]= dc2;
00810 ((uint32_t*)(src+i*stride))[1]= dc3;
00811 }
00812 }
00813
00814
00815 static void pred8x8_mad_cow_dc_l0t(uint8_t *src, int stride){
00816 pred8x8_top_dc_c(src, stride);
00817 pred4x4_dc_c(src, NULL, stride);
00818 }
00819
00820 static void pred8x8_mad_cow_dc_0lt(uint8_t *src, int stride){
00821 pred8x8_dc_c(src, stride);
00822 pred4x4_top_dc_c(src, NULL, stride);
00823 }
00824
00825 static void pred8x8_mad_cow_dc_l00(uint8_t *src, int stride){
00826 pred8x8_left_dc_c(src, stride);
00827 pred4x4_128_dc_c(src + 4*stride , NULL, stride);
00828 pred4x4_128_dc_c(src + 4*stride + 4, NULL, stride);
00829 }
00830
00831 static void pred8x8_mad_cow_dc_0l0(uint8_t *src, int stride){
00832 pred8x8_left_dc_c(src, stride);
00833 pred4x4_128_dc_c(src , NULL, stride);
00834 pred4x4_128_dc_c(src + 4, NULL, stride);
00835 }
00836
00837 static void pred8x8_dc_rv40_c(uint8_t *src, int stride){
00838 int i;
00839 int dc0=0;
00840
00841 for(i=0;i<4; i++){
00842 dc0+= src[-1+i*stride] + src[i-stride];
00843 dc0+= src[4+i-stride];
00844 dc0+= src[-1+(i+4)*stride];
00845 }
00846 dc0= 0x01010101*((dc0 + 8)>>4);
00847
00848 for(i=0; i<4; i++){
00849 ((uint32_t*)(src+i*stride))[0]= dc0;
00850 ((uint32_t*)(src+i*stride))[1]= dc0;
00851 }
00852 for(i=4; i<8; i++){
00853 ((uint32_t*)(src+i*stride))[0]= dc0;
00854 ((uint32_t*)(src+i*stride))[1]= dc0;
00855 }
00856 }
00857
00858 static void pred8x8_plane_c(uint8_t *src, int stride){
00859 int j, k;
00860 int a;
00861 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
00862 const uint8_t * const src0 = src+3-stride;
00863 const uint8_t *src1 = src+4*stride-1;
00864 const uint8_t *src2 = src1-2*stride;
00865 int H = src0[1] - src0[-1];
00866 int V = src1[0] - src2[ 0];
00867 for(k=2; k<=4; ++k) {
00868 src1 += stride; src2 -= stride;
00869 H += k*(src0[k] - src0[-k]);
00870 V += k*(src1[0] - src2[ 0]);
00871 }
00872 H = ( 17*H+16 ) >> 5;
00873 V = ( 17*V+16 ) >> 5;
00874
00875 a = 16*(src1[0] + src2[8]+1) - 3*(V+H);
00876 for(j=8; j>0; --j) {
00877 int b = a;
00878 a += V;
00879 src[0] = cm[ (b ) >> 5 ];
00880 src[1] = cm[ (b+ H) >> 5 ];
00881 src[2] = cm[ (b+2*H) >> 5 ];
00882 src[3] = cm[ (b+3*H) >> 5 ];
00883 src[4] = cm[ (b+4*H) >> 5 ];
00884 src[5] = cm[ (b+5*H) >> 5 ];
00885 src[6] = cm[ (b+6*H) >> 5 ];
00886 src[7] = cm[ (b+7*H) >> 5 ];
00887 src += stride;
00888 }
00889 }
00890
00891 static void pred8x8_tm_vp8_c(uint8_t *src, int stride){
00892 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP - src[-1-stride];
00893 uint8_t *top = src-stride;
00894 int y;
00895
00896 for (y = 0; y < 8; y++) {
00897 uint8_t *cm_in = cm + src[-1];
00898 src[0] = cm_in[top[0]];
00899 src[1] = cm_in[top[1]];
00900 src[2] = cm_in[top[2]];
00901 src[3] = cm_in[top[3]];
00902 src[4] = cm_in[top[4]];
00903 src[5] = cm_in[top[5]];
00904 src[6] = cm_in[top[6]];
00905 src[7] = cm_in[top[7]];
00906 src += stride;
00907 }
00908 }
00909
00910 #define SRC(x,y) src[(x)+(y)*stride]
00911 #define PL(y) \
00912 const int l##y = (SRC(-1,y-1) + 2*SRC(-1,y) + SRC(-1,y+1) + 2) >> 2;
00913 #define PREDICT_8x8_LOAD_LEFT \
00914 const int l0 = ((has_topleft ? SRC(-1,-1) : SRC(-1,0)) \
00915 + 2*SRC(-1,0) + SRC(-1,1) + 2) >> 2; \
00916 PL(1) PL(2) PL(3) PL(4) PL(5) PL(6) \
00917 const int l7 av_unused = (SRC(-1,6) + 3*SRC(-1,7) + 2) >> 2
00918
00919 #define PT(x) \
00920 const int t##x = (SRC(x-1,-1) + 2*SRC(x,-1) + SRC(x+1,-1) + 2) >> 2;
00921 #define PREDICT_8x8_LOAD_TOP \
00922 const int t0 = ((has_topleft ? SRC(-1,-1) : SRC(0,-1)) \
00923 + 2*SRC(0,-1) + SRC(1,-1) + 2) >> 2; \
00924 PT(1) PT(2) PT(3) PT(4) PT(5) PT(6) \
00925 const int t7 av_unused = ((has_topright ? SRC(8,-1) : SRC(7,-1)) \
00926 + 2*SRC(7,-1) + SRC(6,-1) + 2) >> 2
00927
00928 #define PTR(x) \
00929 t##x = (SRC(x-1,-1) + 2*SRC(x,-1) + SRC(x+1,-1) + 2) >> 2;
00930 #define PREDICT_8x8_LOAD_TOPRIGHT \
00931 int t8, t9, t10, t11, t12, t13, t14, t15; \
00932 if(has_topright) { \
00933 PTR(8) PTR(9) PTR(10) PTR(11) PTR(12) PTR(13) PTR(14) \
00934 t15 = (SRC(14,-1) + 3*SRC(15,-1) + 2) >> 2; \
00935 } else t8=t9=t10=t11=t12=t13=t14=t15= SRC(7,-1);
00936
00937 #define PREDICT_8x8_LOAD_TOPLEFT \
00938 const int lt = (SRC(-1,0) + 2*SRC(-1,-1) + SRC(0,-1) + 2) >> 2
00939
00940 #define PREDICT_8x8_DC(v) \
00941 int y; \
00942 for( y = 0; y < 8; y++ ) { \
00943 ((uint32_t*)src)[0] = \
00944 ((uint32_t*)src)[1] = v; \
00945 src += stride; \
00946 }
00947
00948 static void pred8x8l_128_dc_c(uint8_t *src, int has_topleft, int has_topright, int stride)
00949 {
00950 PREDICT_8x8_DC(0x80808080);
00951 }
00952 static void pred8x8l_left_dc_c(uint8_t *src, int has_topleft, int has_topright, int stride)
00953 {
00954 PREDICT_8x8_LOAD_LEFT;
00955 const uint32_t dc = ((l0+l1+l2+l3+l4+l5+l6+l7+4) >> 3) * 0x01010101;
00956 PREDICT_8x8_DC(dc);
00957 }
00958 static void pred8x8l_top_dc_c(uint8_t *src, int has_topleft, int has_topright, int stride)
00959 {
00960 PREDICT_8x8_LOAD_TOP;
00961 const uint32_t dc = ((t0+t1+t2+t3+t4+t5+t6+t7+4) >> 3) * 0x01010101;
00962 PREDICT_8x8_DC(dc);
00963 }
00964 static void pred8x8l_dc_c(uint8_t *src, int has_topleft, int has_topright, int stride)
00965 {
00966 PREDICT_8x8_LOAD_LEFT;
00967 PREDICT_8x8_LOAD_TOP;
00968 const uint32_t dc = ((l0+l1+l2+l3+l4+l5+l6+l7
00969 +t0+t1+t2+t3+t4+t5+t6+t7+8) >> 4) * 0x01010101;
00970 PREDICT_8x8_DC(dc);
00971 }
00972 static void pred8x8l_horizontal_c(uint8_t *src, int has_topleft, int has_topright, int stride)
00973 {
00974 PREDICT_8x8_LOAD_LEFT;
00975 #define ROW(y) ((uint32_t*)(src+y*stride))[0] =\
00976 ((uint32_t*)(src+y*stride))[1] = 0x01010101 * l##y
00977 ROW(0); ROW(1); ROW(2); ROW(3); ROW(4); ROW(5); ROW(6); ROW(7);
00978 #undef ROW
00979 }
00980 static void pred8x8l_vertical_c(uint8_t *src, int has_topleft, int has_topright, int stride)
00981 {
00982 int y;
00983 PREDICT_8x8_LOAD_TOP;
00984 src[0] = t0;
00985 src[1] = t1;
00986 src[2] = t2;
00987 src[3] = t3;
00988 src[4] = t4;
00989 src[5] = t5;
00990 src[6] = t6;
00991 src[7] = t7;
00992 for( y = 1; y < 8; y++ )
00993 *(uint64_t*)(src+y*stride) = *(uint64_t*)src;
00994 }
00995 static void pred8x8l_down_left_c(uint8_t *src, int has_topleft, int has_topright, int stride)
00996 {
00997 PREDICT_8x8_LOAD_TOP;
00998 PREDICT_8x8_LOAD_TOPRIGHT;
00999 SRC(0,0)= (t0 + 2*t1 + t2 + 2) >> 2;
01000 SRC(0,1)=SRC(1,0)= (t1 + 2*t2 + t3 + 2) >> 2;
01001 SRC(0,2)=SRC(1,1)=SRC(2,0)= (t2 + 2*t3 + t4 + 2) >> 2;
01002 SRC(0,3)=SRC(1,2)=SRC(2,1)=SRC(3,0)= (t3 + 2*t4 + t5 + 2) >> 2;
01003 SRC(0,4)=SRC(1,3)=SRC(2,2)=SRC(3,1)=SRC(4,0)= (t4 + 2*t5 + t6 + 2) >> 2;
01004 SRC(0,5)=SRC(1,4)=SRC(2,3)=SRC(3,2)=SRC(4,1)=SRC(5,0)= (t5 + 2*t6 + t7 + 2) >> 2;
01005 SRC(0,6)=SRC(1,5)=SRC(2,4)=SRC(3,3)=SRC(4,2)=SRC(5,1)=SRC(6,0)= (t6 + 2*t7 + t8 + 2) >> 2;
01006 SRC(0,7)=SRC(1,6)=SRC(2,5)=SRC(3,4)=SRC(4,3)=SRC(5,2)=SRC(6,1)=SRC(7,0)= (t7 + 2*t8 + t9 + 2) >> 2;
01007 SRC(1,7)=SRC(2,6)=SRC(3,5)=SRC(4,4)=SRC(5,3)=SRC(6,2)=SRC(7,1)= (t8 + 2*t9 + t10 + 2) >> 2;
01008 SRC(2,7)=SRC(3,6)=SRC(4,5)=SRC(5,4)=SRC(6,3)=SRC(7,2)= (t9 + 2*t10 + t11 + 2) >> 2;
01009 SRC(3,7)=SRC(4,6)=SRC(5,5)=SRC(6,4)=SRC(7,3)= (t10 + 2*t11 + t12 + 2) >> 2;
01010 SRC(4,7)=SRC(5,6)=SRC(6,5)=SRC(7,4)= (t11 + 2*t12 + t13 + 2) >> 2;
01011 SRC(5,7)=SRC(6,6)=SRC(7,5)= (t12 + 2*t13 + t14 + 2) >> 2;
01012 SRC(6,7)=SRC(7,6)= (t13 + 2*t14 + t15 + 2) >> 2;
01013 SRC(7,7)= (t14 + 3*t15 + 2) >> 2;
01014 }
01015 static void pred8x8l_down_right_c(uint8_t *src, int has_topleft, int has_topright, int stride)
01016 {
01017 PREDICT_8x8_LOAD_TOP;
01018 PREDICT_8x8_LOAD_LEFT;
01019 PREDICT_8x8_LOAD_TOPLEFT;
01020 SRC(0,7)= (l7 + 2*l6 + l5 + 2) >> 2;
01021 SRC(0,6)=SRC(1,7)= (l6 + 2*l5 + l4 + 2) >> 2;
01022 SRC(0,5)=SRC(1,6)=SRC(2,7)= (l5 + 2*l4 + l3 + 2) >> 2;
01023 SRC(0,4)=SRC(1,5)=SRC(2,6)=SRC(3,7)= (l4 + 2*l3 + l2 + 2) >> 2;
01024 SRC(0,3)=SRC(1,4)=SRC(2,5)=SRC(3,6)=SRC(4,7)= (l3 + 2*l2 + l1 + 2) >> 2;
01025 SRC(0,2)=SRC(1,3)=SRC(2,4)=SRC(3,5)=SRC(4,6)=SRC(5,7)= (l2 + 2*l1 + l0 + 2) >> 2;
01026 SRC(0,1)=SRC(1,2)=SRC(2,3)=SRC(3,4)=SRC(4,5)=SRC(5,6)=SRC(6,7)= (l1 + 2*l0 + lt + 2) >> 2;
01027 SRC(0,0)=SRC(1,1)=SRC(2,2)=SRC(3,3)=SRC(4,4)=SRC(5,5)=SRC(6,6)=SRC(7,7)= (l0 + 2*lt + t0 + 2) >> 2;
01028 SRC(1,0)=SRC(2,1)=SRC(3,2)=SRC(4,3)=SRC(5,4)=SRC(6,5)=SRC(7,6)= (lt + 2*t0 + t1 + 2) >> 2;
01029 SRC(2,0)=SRC(3,1)=SRC(4,2)=SRC(5,3)=SRC(6,4)=SRC(7,5)= (t0 + 2*t1 + t2 + 2) >> 2;
01030 SRC(3,0)=SRC(4,1)=SRC(5,2)=SRC(6,3)=SRC(7,4)= (t1 + 2*t2 + t3 + 2) >> 2;
01031 SRC(4,0)=SRC(5,1)=SRC(6,2)=SRC(7,3)= (t2 + 2*t3 + t4 + 2) >> 2;
01032 SRC(5,0)=SRC(6,1)=SRC(7,2)= (t3 + 2*t4 + t5 + 2) >> 2;
01033 SRC(6,0)=SRC(7,1)= (t4 + 2*t5 + t6 + 2) >> 2;
01034 SRC(7,0)= (t5 + 2*t6 + t7 + 2) >> 2;
01035
01036 }
01037 static void pred8x8l_vertical_right_c(uint8_t *src, int has_topleft, int has_topright, int stride)
01038 {
01039 PREDICT_8x8_LOAD_TOP;
01040 PREDICT_8x8_LOAD_LEFT;
01041 PREDICT_8x8_LOAD_TOPLEFT;
01042 SRC(0,6)= (l5 + 2*l4 + l3 + 2) >> 2;
01043 SRC(0,7)= (l6 + 2*l5 + l4 + 2) >> 2;
01044 SRC(0,4)=SRC(1,6)= (l3 + 2*l2 + l1 + 2) >> 2;
01045 SRC(0,5)=SRC(1,7)= (l4 + 2*l3 + l2 + 2) >> 2;
01046 SRC(0,2)=SRC(1,4)=SRC(2,6)= (l1 + 2*l0 + lt + 2) >> 2;
01047 SRC(0,3)=SRC(1,5)=SRC(2,7)= (l2 + 2*l1 + l0 + 2) >> 2;
01048 SRC(0,1)=SRC(1,3)=SRC(2,5)=SRC(3,7)= (l0 + 2*lt + t0 + 2) >> 2;
01049 SRC(0,0)=SRC(1,2)=SRC(2,4)=SRC(3,6)= (lt + t0 + 1) >> 1;
01050 SRC(1,1)=SRC(2,3)=SRC(3,5)=SRC(4,7)= (lt + 2*t0 + t1 + 2) >> 2;
01051 SRC(1,0)=SRC(2,2)=SRC(3,4)=SRC(4,6)= (t0 + t1 + 1) >> 1;
01052 SRC(2,1)=SRC(3,3)=SRC(4,5)=SRC(5,7)= (t0 + 2*t1 + t2 + 2) >> 2;
01053 SRC(2,0)=SRC(3,2)=SRC(4,4)=SRC(5,6)= (t1 + t2 + 1) >> 1;
01054 SRC(3,1)=SRC(4,3)=SRC(5,5)=SRC(6,7)= (t1 + 2*t2 + t3 + 2) >> 2;
01055 SRC(3,0)=SRC(4,2)=SRC(5,4)=SRC(6,6)= (t2 + t3 + 1) >> 1;
01056 SRC(4,1)=SRC(5,3)=SRC(6,5)=SRC(7,7)= (t2 + 2*t3 + t4 + 2) >> 2;
01057 SRC(4,0)=SRC(5,2)=SRC(6,4)=SRC(7,6)= (t3 + t4 + 1) >> 1;
01058 SRC(5,1)=SRC(6,3)=SRC(7,5)= (t3 + 2*t4 + t5 + 2) >> 2;
01059 SRC(5,0)=SRC(6,2)=SRC(7,4)= (t4 + t5 + 1) >> 1;
01060 SRC(6,1)=SRC(7,3)= (t4 + 2*t5 + t6 + 2) >> 2;
01061 SRC(6,0)=SRC(7,2)= (t5 + t6 + 1) >> 1;
01062 SRC(7,1)= (t5 + 2*t6 + t7 + 2) >> 2;
01063 SRC(7,0)= (t6 + t7 + 1) >> 1;
01064 }
01065 static void pred8x8l_horizontal_down_c(uint8_t *src, int has_topleft, int has_topright, int stride)
01066 {
01067 PREDICT_8x8_LOAD_TOP;
01068 PREDICT_8x8_LOAD_LEFT;
01069 PREDICT_8x8_LOAD_TOPLEFT;
01070 SRC(0,7)= (l6 + l7 + 1) >> 1;
01071 SRC(1,7)= (l5 + 2*l6 + l7 + 2) >> 2;
01072 SRC(0,6)=SRC(2,7)= (l5 + l6 + 1) >> 1;
01073 SRC(1,6)=SRC(3,7)= (l4 + 2*l5 + l6 + 2) >> 2;
01074 SRC(0,5)=SRC(2,6)=SRC(4,7)= (l4 + l5 + 1) >> 1;
01075 SRC(1,5)=SRC(3,6)=SRC(5,7)= (l3 + 2*l4 + l5 + 2) >> 2;
01076 SRC(0,4)=SRC(2,5)=SRC(4,6)=SRC(6,7)= (l3 + l4 + 1) >> 1;
01077 SRC(1,4)=SRC(3,5)=SRC(5,6)=SRC(7,7)= (l2 + 2*l3 + l4 + 2) >> 2;
01078 SRC(0,3)=SRC(2,4)=SRC(4,5)=SRC(6,6)= (l2 + l3 + 1) >> 1;
01079 SRC(1,3)=SRC(3,4)=SRC(5,5)=SRC(7,6)= (l1 + 2*l2 + l3 + 2) >> 2;
01080 SRC(0,2)=SRC(2,3)=SRC(4,4)=SRC(6,5)= (l1 + l2 + 1) >> 1;
01081 SRC(1,2)=SRC(3,3)=SRC(5,4)=SRC(7,5)= (l0 + 2*l1 + l2 + 2) >> 2;
01082 SRC(0,1)=SRC(2,2)=SRC(4,3)=SRC(6,4)= (l0 + l1 + 1) >> 1;
01083 SRC(1,1)=SRC(3,2)=SRC(5,3)=SRC(7,4)= (lt + 2*l0 + l1 + 2) >> 2;
01084 SRC(0,0)=SRC(2,1)=SRC(4,2)=SRC(6,3)= (lt + l0 + 1) >> 1;
01085 SRC(1,0)=SRC(3,1)=SRC(5,2)=SRC(7,3)= (l0 + 2*lt + t0 + 2) >> 2;
01086 SRC(2,0)=SRC(4,1)=SRC(6,2)= (t1 + 2*t0 + lt + 2) >> 2;
01087 SRC(3,0)=SRC(5,1)=SRC(7,2)= (t2 + 2*t1 + t0 + 2) >> 2;
01088 SRC(4,0)=SRC(6,1)= (t3 + 2*t2 + t1 + 2) >> 2;
01089 SRC(5,0)=SRC(7,1)= (t4 + 2*t3 + t2 + 2) >> 2;
01090 SRC(6,0)= (t5 + 2*t4 + t3 + 2) >> 2;
01091 SRC(7,0)= (t6 + 2*t5 + t4 + 2) >> 2;
01092 }
01093 static void pred8x8l_vertical_left_c(uint8_t *src, int has_topleft, int has_topright, int stride)
01094 {
01095 PREDICT_8x8_LOAD_TOP;
01096 PREDICT_8x8_LOAD_TOPRIGHT;
01097 SRC(0,0)= (t0 + t1 + 1) >> 1;
01098 SRC(0,1)= (t0 + 2*t1 + t2 + 2) >> 2;
01099 SRC(0,2)=SRC(1,0)= (t1 + t2 + 1) >> 1;
01100 SRC(0,3)=SRC(1,1)= (t1 + 2*t2 + t3 + 2) >> 2;
01101 SRC(0,4)=SRC(1,2)=SRC(2,0)= (t2 + t3 + 1) >> 1;
01102 SRC(0,5)=SRC(1,3)=SRC(2,1)= (t2 + 2*t3 + t4 + 2) >> 2;
01103 SRC(0,6)=SRC(1,4)=SRC(2,2)=SRC(3,0)= (t3 + t4 + 1) >> 1;
01104 SRC(0,7)=SRC(1,5)=SRC(2,3)=SRC(3,1)= (t3 + 2*t4 + t5 + 2) >> 2;
01105 SRC(1,6)=SRC(2,4)=SRC(3,2)=SRC(4,0)= (t4 + t5 + 1) >> 1;
01106 SRC(1,7)=SRC(2,5)=SRC(3,3)=SRC(4,1)= (t4 + 2*t5 + t6 + 2) >> 2;
01107 SRC(2,6)=SRC(3,4)=SRC(4,2)=SRC(5,0)= (t5 + t6 + 1) >> 1;
01108 SRC(2,7)=SRC(3,5)=SRC(4,3)=SRC(5,1)= (t5 + 2*t6 + t7 + 2) >> 2;
01109 SRC(3,6)=SRC(4,4)=SRC(5,2)=SRC(6,0)= (t6 + t7 + 1) >> 1;
01110 SRC(3,7)=SRC(4,5)=SRC(5,3)=SRC(6,1)= (t6 + 2*t7 + t8 + 2) >> 2;
01111 SRC(4,6)=SRC(5,4)=SRC(6,2)=SRC(7,0)= (t7 + t8 + 1) >> 1;
01112 SRC(4,7)=SRC(5,5)=SRC(6,3)=SRC(7,1)= (t7 + 2*t8 + t9 + 2) >> 2;
01113 SRC(5,6)=SRC(6,4)=SRC(7,2)= (t8 + t9 + 1) >> 1;
01114 SRC(5,7)=SRC(6,5)=SRC(7,3)= (t8 + 2*t9 + t10 + 2) >> 2;
01115 SRC(6,6)=SRC(7,4)= (t9 + t10 + 1) >> 1;
01116 SRC(6,7)=SRC(7,5)= (t9 + 2*t10 + t11 + 2) >> 2;
01117 SRC(7,6)= (t10 + t11 + 1) >> 1;
01118 SRC(7,7)= (t10 + 2*t11 + t12 + 2) >> 2;
01119 }
01120 static void pred8x8l_horizontal_up_c(uint8_t *src, int has_topleft, int has_topright, int stride)
01121 {
01122 PREDICT_8x8_LOAD_LEFT;
01123 SRC(0,0)= (l0 + l1 + 1) >> 1;
01124 SRC(1,0)= (l0 + 2*l1 + l2 + 2) >> 2;
01125 SRC(0,1)=SRC(2,0)= (l1 + l2 + 1) >> 1;
01126 SRC(1,1)=SRC(3,0)= (l1 + 2*l2 + l3 + 2) >> 2;
01127 SRC(0,2)=SRC(2,1)=SRC(4,0)= (l2 + l3 + 1) >> 1;
01128 SRC(1,2)=SRC(3,1)=SRC(5,0)= (l2 + 2*l3 + l4 + 2) >> 2;
01129 SRC(0,3)=SRC(2,2)=SRC(4,1)=SRC(6,0)= (l3 + l4 + 1) >> 1;
01130 SRC(1,3)=SRC(3,2)=SRC(5,1)=SRC(7,0)= (l3 + 2*l4 + l5 + 2) >> 2;
01131 SRC(0,4)=SRC(2,3)=SRC(4,2)=SRC(6,1)= (l4 + l5 + 1) >> 1;
01132 SRC(1,4)=SRC(3,3)=SRC(5,2)=SRC(7,1)= (l4 + 2*l5 + l6 + 2) >> 2;
01133 SRC(0,5)=SRC(2,4)=SRC(4,3)=SRC(6,2)= (l5 + l6 + 1) >> 1;
01134 SRC(1,5)=SRC(3,4)=SRC(5,3)=SRC(7,2)= (l5 + 2*l6 + l7 + 2) >> 2;
01135 SRC(0,6)=SRC(2,5)=SRC(4,4)=SRC(6,3)= (l6 + l7 + 1) >> 1;
01136 SRC(1,6)=SRC(3,5)=SRC(5,4)=SRC(7,3)= (l6 + 3*l7 + 2) >> 2;
01137 SRC(0,7)=SRC(1,7)=SRC(2,6)=SRC(2,7)=SRC(3,6)=
01138 SRC(3,7)=SRC(4,5)=SRC(4,6)=SRC(4,7)=SRC(5,5)=
01139 SRC(5,6)=SRC(5,7)=SRC(6,4)=SRC(6,5)=SRC(6,6)=
01140 SRC(6,7)=SRC(7,4)=SRC(7,5)=SRC(7,6)=SRC(7,7)= l7;
01141 }
01142 #undef PREDICT_8x8_LOAD_LEFT
01143 #undef PREDICT_8x8_LOAD_TOP
01144 #undef PREDICT_8x8_LOAD_TOPLEFT
01145 #undef PREDICT_8x8_LOAD_TOPRIGHT
01146 #undef PREDICT_8x8_DC
01147 #undef PTR
01148 #undef PT
01149 #undef PL
01150 #undef SRC
01151
01152 static void pred4x4_vertical_add_c(uint8_t *pix, const DCTELEM *block, int stride){
01153 int i;
01154 pix -= stride;
01155 for(i=0; i<4; i++){
01156 uint8_t v = pix[0];
01157 pix[1*stride]= v += block[0];
01158 pix[2*stride]= v += block[4];
01159 pix[3*stride]= v += block[8];
01160 pix[4*stride]= v + block[12];
01161 pix++;
01162 block++;
01163 }
01164 }
01165
01166 static void pred4x4_horizontal_add_c(uint8_t *pix, const DCTELEM *block, int stride){
01167 int i;
01168 for(i=0; i<4; i++){
01169 uint8_t v = pix[-1];
01170 pix[0]= v += block[0];
01171 pix[1]= v += block[1];
01172 pix[2]= v += block[2];
01173 pix[3]= v + block[3];
01174 pix+= stride;
01175 block+= 4;
01176 }
01177 }
01178
01179 static void pred8x8l_vertical_add_c(uint8_t *pix, const DCTELEM *block, int stride){
01180 int i;
01181 pix -= stride;
01182 for(i=0; i<8; i++){
01183 uint8_t v = pix[0];
01184 pix[1*stride]= v += block[0];
01185 pix[2*stride]= v += block[8];
01186 pix[3*stride]= v += block[16];
01187 pix[4*stride]= v += block[24];
01188 pix[5*stride]= v += block[32];
01189 pix[6*stride]= v += block[40];
01190 pix[7*stride]= v += block[48];
01191 pix[8*stride]= v + block[56];
01192 pix++;
01193 block++;
01194 }
01195 }
01196
01197 static void pred8x8l_horizontal_add_c(uint8_t *pix, const DCTELEM *block, int stride){
01198 int i;
01199 for(i=0; i<8; i++){
01200 uint8_t v = pix[-1];
01201 pix[0]= v += block[0];
01202 pix[1]= v += block[1];
01203 pix[2]= v += block[2];
01204 pix[3]= v += block[3];
01205 pix[4]= v += block[4];
01206 pix[5]= v += block[5];
01207 pix[6]= v += block[6];
01208 pix[7]= v + block[7];
01209 pix+= stride;
01210 block+= 8;
01211 }
01212 }
01213
01214 static void pred16x16_vertical_add_c(uint8_t *pix, const int *block_offset, const DCTELEM *block, int stride){
01215 int i;
01216 for(i=0; i<16; i++)
01217 pred4x4_vertical_add_c(pix + block_offset[i], block + i*16, stride);
01218 }
01219
01220 static void pred16x16_horizontal_add_c(uint8_t *pix, const int *block_offset, const DCTELEM *block, int stride){
01221 int i;
01222 for(i=0; i<16; i++)
01223 pred4x4_horizontal_add_c(pix + block_offset[i], block + i*16, stride);
01224 }
01225
01226 static void pred8x8_vertical_add_c(uint8_t *pix, const int *block_offset, const DCTELEM *block, int stride){
01227 int i;
01228 for(i=0; i<4; i++)
01229 pred4x4_vertical_add_c(pix + block_offset[i], block + i*16, stride);
01230 }
01231
01232 static void pred8x8_horizontal_add_c(uint8_t *pix, const int *block_offset, const DCTELEM *block, int stride){
01233 int i;
01234 for(i=0; i<4; i++)
01235 pred4x4_horizontal_add_c(pix + block_offset[i], block + i*16, stride);
01236 }
01237
01238
01242 void ff_h264_pred_init(H264PredContext *h, int codec_id){
01243
01244
01245 if(codec_id != CODEC_ID_RV40){
01246 if(codec_id == CODEC_ID_VP8) {
01247 h->pred4x4[VERT_PRED ]= pred4x4_vertical_vp8_c;
01248 h->pred4x4[HOR_PRED ]= pred4x4_horizontal_vp8_c;
01249 } else {
01250 h->pred4x4[VERT_PRED ]= pred4x4_vertical_c;
01251 h->pred4x4[HOR_PRED ]= pred4x4_horizontal_c;
01252 }
01253 h->pred4x4[DC_PRED ]= pred4x4_dc_c;
01254 if(codec_id == CODEC_ID_SVQ3)
01255 h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_svq3_c;
01256 else
01257 h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_c;
01258 h->pred4x4[DIAG_DOWN_RIGHT_PRED]= pred4x4_down_right_c;
01259 h->pred4x4[VERT_RIGHT_PRED ]= pred4x4_vertical_right_c;
01260 h->pred4x4[HOR_DOWN_PRED ]= pred4x4_horizontal_down_c;
01261 if (codec_id == CODEC_ID_VP8) {
01262 h->pred4x4[VERT_LEFT_PRED ]= pred4x4_vertical_left_vp8_c;
01263 } else
01264 h->pred4x4[VERT_LEFT_PRED ]= pred4x4_vertical_left_c;
01265 h->pred4x4[HOR_UP_PRED ]= pred4x4_horizontal_up_c;
01266 if(codec_id != CODEC_ID_VP8) {
01267 h->pred4x4[LEFT_DC_PRED ]= pred4x4_left_dc_c;
01268 h->pred4x4[TOP_DC_PRED ]= pred4x4_top_dc_c;
01269 h->pred4x4[DC_128_PRED ]= pred4x4_128_dc_c;
01270 } else {
01271 h->pred4x4[TM_VP8_PRED ]= pred4x4_tm_vp8_c;
01272 h->pred4x4[DC_127_PRED ]= pred4x4_127_dc_c;
01273 h->pred4x4[DC_129_PRED ]= pred4x4_129_dc_c;
01274 h->pred4x4[VERT_VP8_PRED ]= pred4x4_vertical_c;
01275 h->pred4x4[HOR_VP8_PRED ]= pred4x4_horizontal_c;
01276 }
01277 }else{
01278 h->pred4x4[VERT_PRED ]= pred4x4_vertical_c;
01279 h->pred4x4[HOR_PRED ]= pred4x4_horizontal_c;
01280 h->pred4x4[DC_PRED ]= pred4x4_dc_c;
01281 h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_rv40_c;
01282 h->pred4x4[DIAG_DOWN_RIGHT_PRED]= pred4x4_down_right_c;
01283 h->pred4x4[VERT_RIGHT_PRED ]= pred4x4_vertical_right_c;
01284 h->pred4x4[HOR_DOWN_PRED ]= pred4x4_horizontal_down_c;
01285 h->pred4x4[VERT_LEFT_PRED ]= pred4x4_vertical_left_rv40_c;
01286 h->pred4x4[HOR_UP_PRED ]= pred4x4_horizontal_up_rv40_c;
01287 h->pred4x4[LEFT_DC_PRED ]= pred4x4_left_dc_c;
01288 h->pred4x4[TOP_DC_PRED ]= pred4x4_top_dc_c;
01289 h->pred4x4[DC_128_PRED ]= pred4x4_128_dc_c;
01290 h->pred4x4[DIAG_DOWN_LEFT_PRED_RV40_NODOWN]= pred4x4_down_left_rv40_nodown_c;
01291 h->pred4x4[HOR_UP_PRED_RV40_NODOWN]= pred4x4_horizontal_up_rv40_nodown_c;
01292 h->pred4x4[VERT_LEFT_PRED_RV40_NODOWN]= pred4x4_vertical_left_rv40_nodown_c;
01293 }
01294
01295 h->pred8x8l[VERT_PRED ]= pred8x8l_vertical_c;
01296 h->pred8x8l[HOR_PRED ]= pred8x8l_horizontal_c;
01297 h->pred8x8l[DC_PRED ]= pred8x8l_dc_c;
01298 h->pred8x8l[DIAG_DOWN_LEFT_PRED ]= pred8x8l_down_left_c;
01299 h->pred8x8l[DIAG_DOWN_RIGHT_PRED]= pred8x8l_down_right_c;
01300 h->pred8x8l[VERT_RIGHT_PRED ]= pred8x8l_vertical_right_c;
01301 h->pred8x8l[HOR_DOWN_PRED ]= pred8x8l_horizontal_down_c;
01302 h->pred8x8l[VERT_LEFT_PRED ]= pred8x8l_vertical_left_c;
01303 h->pred8x8l[HOR_UP_PRED ]= pred8x8l_horizontal_up_c;
01304 h->pred8x8l[LEFT_DC_PRED ]= pred8x8l_left_dc_c;
01305 h->pred8x8l[TOP_DC_PRED ]= pred8x8l_top_dc_c;
01306 h->pred8x8l[DC_128_PRED ]= pred8x8l_128_dc_c;
01307
01308 h->pred8x8[VERT_PRED8x8 ]= pred8x8_vertical_c;
01309 h->pred8x8[HOR_PRED8x8 ]= pred8x8_horizontal_c;
01310 if (codec_id != CODEC_ID_VP8) {
01311 h->pred8x8[PLANE_PRED8x8]= pred8x8_plane_c;
01312 } else
01313 h->pred8x8[PLANE_PRED8x8]= pred8x8_tm_vp8_c;
01314 if(codec_id != CODEC_ID_RV40 && codec_id != CODEC_ID_VP8){
01315 h->pred8x8[DC_PRED8x8 ]= pred8x8_dc_c;
01316 h->pred8x8[LEFT_DC_PRED8x8]= pred8x8_left_dc_c;
01317 h->pred8x8[TOP_DC_PRED8x8 ]= pred8x8_top_dc_c;
01318 h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= pred8x8_mad_cow_dc_l0t;
01319 h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= pred8x8_mad_cow_dc_0lt;
01320 h->pred8x8[ALZHEIMER_DC_L00_PRED8x8 ]= pred8x8_mad_cow_dc_l00;
01321 h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8 ]= pred8x8_mad_cow_dc_0l0;
01322 }else{
01323 h->pred8x8[DC_PRED8x8 ]= pred8x8_dc_rv40_c;
01324 h->pred8x8[LEFT_DC_PRED8x8]= pred8x8_left_dc_rv40_c;
01325 h->pred8x8[TOP_DC_PRED8x8 ]= pred8x8_top_dc_rv40_c;
01326 if (codec_id == CODEC_ID_VP8) {
01327 h->pred8x8[DC_127_PRED8x8]= pred8x8_127_dc_c;
01328 h->pred8x8[DC_129_PRED8x8]= pred8x8_129_dc_c;
01329 }
01330 }
01331 h->pred8x8[DC_128_PRED8x8 ]= pred8x8_128_dc_c;
01332
01333 h->pred16x16[DC_PRED8x8 ]= pred16x16_dc_c;
01334 h->pred16x16[VERT_PRED8x8 ]= pred16x16_vertical_c;
01335 h->pred16x16[HOR_PRED8x8 ]= pred16x16_horizontal_c;
01336 switch(codec_id){
01337 case CODEC_ID_SVQ3:
01338 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_plane_svq3_c;
01339 break;
01340 case CODEC_ID_RV40:
01341 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_plane_rv40_c;
01342 break;
01343 case CODEC_ID_VP8:
01344 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_tm_vp8_c;
01345 h->pred16x16[DC_127_PRED8x8]= pred16x16_127_dc_c;
01346 h->pred16x16[DC_129_PRED8x8]= pred16x16_129_dc_c;
01347 break;
01348 default:
01349 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_plane_c;
01350 break;
01351 }
01352 h->pred16x16[LEFT_DC_PRED8x8]= pred16x16_left_dc_c;
01353 h->pred16x16[TOP_DC_PRED8x8 ]= pred16x16_top_dc_c;
01354 h->pred16x16[DC_128_PRED8x8 ]= pred16x16_128_dc_c;
01355
01356
01357 h->pred4x4_add [VERT_PRED ]= pred4x4_vertical_add_c;
01358 h->pred4x4_add [ HOR_PRED ]= pred4x4_horizontal_add_c;
01359 h->pred8x8l_add [VERT_PRED ]= pred8x8l_vertical_add_c;
01360 h->pred8x8l_add [ HOR_PRED ]= pred8x8l_horizontal_add_c;
01361 h->pred8x8_add [VERT_PRED8x8]= pred8x8_vertical_add_c;
01362 h->pred8x8_add [ HOR_PRED8x8]= pred8x8_horizontal_add_c;
01363 h->pred16x16_add[VERT_PRED8x8]= pred16x16_vertical_add_c;
01364 h->pred16x16_add[ HOR_PRED8x8]= pred16x16_horizontal_add_c;
01365
01366 if (ARCH_ARM) ff_h264_pred_init_arm(h, codec_id);
01367 if (HAVE_MMX) ff_h264_pred_init_x86(h, codec_id);
01368 }