Mercurial > libavcodec.hg
comparison h264pred.c @ 11918:823f332655e8 libavcodec
Add intra prediction functions for VP8.
Patch by David Conrad <lessen42 gmail com> and myself.
author | rbultje |
---|---|
date | Tue, 22 Jun 2010 19:17:09 +0000 |
parents | 73f4fd490f2a |
children | f021be0e837c |
comparison
equal
deleted
inserted
replaced
11917:2952baf6a266 | 11918:823f332655e8 |
---|---|
26 */ | 26 */ |
27 | 27 |
28 #include "avcodec.h" | 28 #include "avcodec.h" |
29 #include "mpegvideo.h" | 29 #include "mpegvideo.h" |
30 #include "h264pred.h" | 30 #include "h264pred.h" |
31 #include "mathops.h" | |
31 | 32 |
32 static void pred4x4_vertical_c(uint8_t *src, const uint8_t *topright, int stride){ | 33 static void pred4x4_vertical_c(uint8_t *src, const uint8_t *topright, int stride){ |
33 const uint32_t a= ((uint32_t*)(src-stride))[0]; | 34 const uint32_t a= ((uint32_t*)(src-stride))[0]; |
34 ((uint32_t*)(src+0*stride))[0]= a; | 35 ((uint32_t*)(src+0*stride))[0]= a; |
35 ((uint32_t*)(src+1*stride))[0]= a; | 36 ((uint32_t*)(src+1*stride))[0]= a; |
101 #define LOAD_TOP_EDGE\ | 102 #define LOAD_TOP_EDGE\ |
102 const int av_unused t0= src[ 0-1*stride];\ | 103 const int av_unused t0= src[ 0-1*stride];\ |
103 const int av_unused t1= src[ 1-1*stride];\ | 104 const int av_unused t1= src[ 1-1*stride];\ |
104 const int av_unused t2= src[ 2-1*stride];\ | 105 const int av_unused t2= src[ 2-1*stride];\ |
105 const int av_unused t3= src[ 3-1*stride];\ | 106 const int av_unused t3= src[ 3-1*stride];\ |
107 | |
108 static void pred4x4_vertical_vp8_c(uint8_t *src, const uint8_t *topright, int stride){ | |
109 const int lt= src[-1-1*stride]; | |
110 LOAD_TOP_EDGE | |
111 LOAD_TOP_RIGHT_EDGE | |
112 uint32_t v = PACK4x8((lt + 2*t0 + t1 + 2) >> 2, | |
113 (t0 + 2*t1 + t2 + 2) >> 2, | |
114 (t1 + 2*t2 + t3 + 2) >> 2, | |
115 (t2 + 2*t3 + t4 + 2) >> 2); | |
116 | |
117 AV_WN32A(src+0*stride, v); | |
118 AV_WN32A(src+1*stride, v); | |
119 AV_WN32A(src+2*stride, v); | |
120 AV_WN32A(src+3*stride, v); | |
121 } | |
122 | |
123 static void pred4x4_horizontal_vp8_c(uint8_t *src, const uint8_t *topright, int stride){ | |
124 const int lt= src[-1-1*stride]; | |
125 LOAD_LEFT_EDGE | |
126 | |
127 AV_WN32A(src+0*stride, ((lt + 2*l0 + l1 + 2) >> 2)*0x01010101); | |
128 AV_WN32A(src+1*stride, ((l0 + 2*l1 + l2 + 2) >> 2)*0x01010101); | |
129 AV_WN32A(src+2*stride, ((l1 + 2*l2 + l3 + 2) >> 2)*0x01010101); | |
130 AV_WN32A(src+3*stride, ((l2 + 2*l3 + l3 + 2) >> 2)*0x01010101); | |
131 } | |
106 | 132 |
107 static void pred4x4_down_right_c(uint8_t *src, const uint8_t *topright, int stride){ | 133 static void pred4x4_down_right_c(uint8_t *src, const uint8_t *topright, int stride){ |
108 const int lt= src[-1-1*stride]; | 134 const int lt= src[-1-1*stride]; |
109 LOAD_TOP_EDGE | 135 LOAD_TOP_EDGE |
110 LOAD_LEFT_EDGE | 136 LOAD_LEFT_EDGE |
300 LOAD_LEFT_EDGE | 326 LOAD_LEFT_EDGE |
301 | 327 |
302 pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l3); | 328 pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l3); |
303 } | 329 } |
304 | 330 |
331 static void pred4x4_vertical_left_vp8_c(uint8_t *src, const uint8_t *topright, int stride){ | |
332 LOAD_TOP_EDGE | |
333 LOAD_TOP_RIGHT_EDGE | |
334 | |
335 src[0+0*stride]=(t0 + t1 + 1)>>1; | |
336 src[1+0*stride]= | |
337 src[0+2*stride]=(t1 + t2 + 1)>>1; | |
338 src[2+0*stride]= | |
339 src[1+2*stride]=(t2 + t3 + 1)>>1; | |
340 src[3+0*stride]= | |
341 src[2+2*stride]=(t3 + t4 + 1)>>1; | |
342 src[0+1*stride]=(t0 + 2*t1 + t2 + 2)>>2; | |
343 src[1+1*stride]= | |
344 src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2; | |
345 src[2+1*stride]= | |
346 src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2; | |
347 src[3+1*stride]= | |
348 src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2; | |
349 src[3+2*stride]=(t4 + 2*t5 + t6 + 2)>>2; | |
350 src[3+3*stride]=(t5 + 2*t6 + t7 + 2)>>2; | |
351 } | |
352 | |
305 static void pred4x4_horizontal_up_c(uint8_t *src, const uint8_t *topright, int stride){ | 353 static void pred4x4_horizontal_up_c(uint8_t *src, const uint8_t *topright, int stride){ |
306 LOAD_LEFT_EDGE | 354 LOAD_LEFT_EDGE |
307 | 355 |
308 src[0+0*stride]=(l0 + l1 + 1)>>1; | 356 src[0+0*stride]=(l0 + l1 + 1)>>1; |
309 src[1+0*stride]=(l0 + 2*l1 + l2 + 2)>>2; | 357 src[1+0*stride]=(l0 + 2*l1 + l2 + 2)>>2; |
389 src[2+3*stride]=(l1 + l2+ 1)>>1; | 437 src[2+3*stride]=(l1 + l2+ 1)>>1; |
390 src[1+2*stride]= | 438 src[1+2*stride]= |
391 src[3+3*stride]=(l0 + 2*l1 + l2 + 2)>>2; | 439 src[3+3*stride]=(l0 + 2*l1 + l2 + 2)>>2; |
392 src[0+3*stride]=(l2 + l3 + 1)>>1; | 440 src[0+3*stride]=(l2 + l3 + 1)>>1; |
393 src[1+3*stride]=(l1 + 2*l2 + l3 + 2)>>2; | 441 src[1+3*stride]=(l1 + 2*l2 + l3 + 2)>>2; |
442 } | |
443 | |
444 static void pred4x4_tm_vp8_c(uint8_t *src, const uint8_t *topright, int stride){ | |
445 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP - src[-1-stride]; | |
446 uint8_t *top = src-stride; | |
447 int y; | |
448 | |
449 for (y = 0; y < 4; y++) { | |
450 uint8_t *cm_in = cm + src[-1]; | |
451 src[0] = cm_in[top[0]]; | |
452 src[1] = cm_in[top[1]]; | |
453 src[2] = cm_in[top[2]]; | |
454 src[3] = cm_in[top[3]]; | |
455 src += stride; | |
456 } | |
394 } | 457 } |
395 | 458 |
396 static void pred16x16_vertical_c(uint8_t *src, int stride){ | 459 static void pred16x16_vertical_c(uint8_t *src, int stride){ |
397 int i; | 460 int i; |
398 const uint32_t a= ((uint32_t*)(src-stride))[0]; | 461 const uint32_t a= ((uint32_t*)(src-stride))[0]; |
537 | 600 |
538 static void pred16x16_plane_rv40_c(uint8_t *src, int stride){ | 601 static void pred16x16_plane_rv40_c(uint8_t *src, int stride){ |
539 pred16x16_plane_compat_c(src, stride, 0, 1); | 602 pred16x16_plane_compat_c(src, stride, 0, 1); |
540 } | 603 } |
541 | 604 |
605 static void pred16x16_tm_vp8_c(uint8_t *src, int stride){ | |
606 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP - src[-1-stride]; | |
607 uint8_t *top = src-stride; | |
608 int y; | |
609 | |
610 for (y = 0; y < 16; y++) { | |
611 uint8_t *cm_in = cm + src[-1]; | |
612 src[0] = cm_in[top[0]]; | |
613 src[1] = cm_in[top[1]]; | |
614 src[2] = cm_in[top[2]]; | |
615 src[3] = cm_in[top[3]]; | |
616 src[4] = cm_in[top[4]]; | |
617 src[5] = cm_in[top[5]]; | |
618 src[6] = cm_in[top[6]]; | |
619 src[7] = cm_in[top[7]]; | |
620 src[8] = cm_in[top[8]]; | |
621 src[9] = cm_in[top[9]]; | |
622 src[10] = cm_in[top[10]]; | |
623 src[11] = cm_in[top[11]]; | |
624 src[12] = cm_in[top[12]]; | |
625 src[13] = cm_in[top[13]]; | |
626 src[14] = cm_in[top[14]]; | |
627 src[15] = cm_in[top[15]]; | |
628 src += stride; | |
629 } | |
630 } | |
631 | |
542 static void pred8x8_vertical_c(uint8_t *src, int stride){ | 632 static void pred8x8_vertical_c(uint8_t *src, int stride){ |
543 int i; | 633 int i; |
544 const uint32_t a= ((uint32_t*)(src-stride))[0]; | 634 const uint32_t a= ((uint32_t*)(src-stride))[0]; |
545 const uint32_t b= ((uint32_t*)(src-stride))[1]; | 635 const uint32_t b= ((uint32_t*)(src-stride))[1]; |
546 | 636 |
741 src[5] = cm[ (b+5*H) >> 5 ]; | 831 src[5] = cm[ (b+5*H) >> 5 ]; |
742 src[6] = cm[ (b+6*H) >> 5 ]; | 832 src[6] = cm[ (b+6*H) >> 5 ]; |
743 src[7] = cm[ (b+7*H) >> 5 ]; | 833 src[7] = cm[ (b+7*H) >> 5 ]; |
744 src += stride; | 834 src += stride; |
745 } | 835 } |
836 } | |
837 | |
838 static void pred8x8_tm_vp8_c(uint8_t *src, int stride){ | |
839 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP - src[-1-stride]; | |
840 uint8_t *top = src-stride; | |
841 int y; | |
842 | |
843 for (y = 0; y < 8; y++) { | |
844 uint8_t *cm_in = cm + src[-1]; | |
845 src[0] = cm_in[top[0]]; | |
846 src[1] = cm_in[top[1]]; | |
847 src[2] = cm_in[top[2]]; | |
848 src[3] = cm_in[top[3]]; | |
849 src[4] = cm_in[top[4]]; | |
850 src[5] = cm_in[top[5]]; | |
851 src[6] = cm_in[top[6]]; | |
852 src[7] = cm_in[top[7]]; | |
853 src += stride; | |
854 } | |
746 } | 855 } |
747 | 856 |
748 #define SRC(x,y) src[(x)+(y)*stride] | 857 #define SRC(x,y) src[(x)+(y)*stride] |
749 #define PL(y) \ | 858 #define PL(y) \ |
750 const int l##y = (SRC(-1,y-1) + 2*SRC(-1,y) + SRC(-1,y+1) + 2) >> 2; | 859 const int l##y = (SRC(-1,y-1) + 2*SRC(-1,y) + SRC(-1,y+1) + 2) >> 2; |
1079 */ | 1188 */ |
1080 void ff_h264_pred_init(H264PredContext *h, int codec_id){ | 1189 void ff_h264_pred_init(H264PredContext *h, int codec_id){ |
1081 // MpegEncContext * const s = &h->s; | 1190 // MpegEncContext * const s = &h->s; |
1082 | 1191 |
1083 if(codec_id != CODEC_ID_RV40){ | 1192 if(codec_id != CODEC_ID_RV40){ |
1193 if(codec_id == CODEC_ID_VP8) { | |
1194 h->pred4x4[VERT_PRED ]= pred4x4_vertical_vp8_c; | |
1195 h->pred4x4[HOR_PRED ]= pred4x4_horizontal_vp8_c; | |
1196 } else { | |
1084 h->pred4x4[VERT_PRED ]= pred4x4_vertical_c; | 1197 h->pred4x4[VERT_PRED ]= pred4x4_vertical_c; |
1085 h->pred4x4[HOR_PRED ]= pred4x4_horizontal_c; | 1198 h->pred4x4[HOR_PRED ]= pred4x4_horizontal_c; |
1199 } | |
1086 h->pred4x4[DC_PRED ]= pred4x4_dc_c; | 1200 h->pred4x4[DC_PRED ]= pred4x4_dc_c; |
1087 if(codec_id == CODEC_ID_SVQ3) | 1201 if(codec_id == CODEC_ID_SVQ3) |
1088 h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_svq3_c; | 1202 h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_svq3_c; |
1089 else | 1203 else |
1090 h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_c; | 1204 h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_c; |
1091 h->pred4x4[DIAG_DOWN_RIGHT_PRED]= pred4x4_down_right_c; | 1205 h->pred4x4[DIAG_DOWN_RIGHT_PRED]= pred4x4_down_right_c; |
1092 h->pred4x4[VERT_RIGHT_PRED ]= pred4x4_vertical_right_c; | 1206 h->pred4x4[VERT_RIGHT_PRED ]= pred4x4_vertical_right_c; |
1093 h->pred4x4[HOR_DOWN_PRED ]= pred4x4_horizontal_down_c; | 1207 h->pred4x4[HOR_DOWN_PRED ]= pred4x4_horizontal_down_c; |
1208 if (codec_id == CODEC_ID_VP8) { | |
1209 h->pred4x4[VERT_LEFT_PRED ]= pred4x4_vertical_left_vp8_c; | |
1210 } else | |
1094 h->pred4x4[VERT_LEFT_PRED ]= pred4x4_vertical_left_c; | 1211 h->pred4x4[VERT_LEFT_PRED ]= pred4x4_vertical_left_c; |
1095 h->pred4x4[HOR_UP_PRED ]= pred4x4_horizontal_up_c; | 1212 h->pred4x4[HOR_UP_PRED ]= pred4x4_horizontal_up_c; |
1096 h->pred4x4[LEFT_DC_PRED ]= pred4x4_left_dc_c; | 1213 h->pred4x4[LEFT_DC_PRED ]= pred4x4_left_dc_c; |
1097 h->pred4x4[TOP_DC_PRED ]= pred4x4_top_dc_c; | 1214 h->pred4x4[TOP_DC_PRED ]= pred4x4_top_dc_c; |
1098 h->pred4x4[DC_128_PRED ]= pred4x4_128_dc_c; | 1215 h->pred4x4[DC_128_PRED ]= pred4x4_128_dc_c; |
1216 if(codec_id == CODEC_ID_VP8) | |
1217 h->pred4x4[TM_VP8_PRED ]= pred4x4_tm_vp8_c; | |
1099 }else{ | 1218 }else{ |
1100 h->pred4x4[VERT_PRED ]= pred4x4_vertical_c; | 1219 h->pred4x4[VERT_PRED ]= pred4x4_vertical_c; |
1101 h->pred4x4[HOR_PRED ]= pred4x4_horizontal_c; | 1220 h->pred4x4[HOR_PRED ]= pred4x4_horizontal_c; |
1102 h->pred4x4[DC_PRED ]= pred4x4_dc_c; | 1221 h->pred4x4[DC_PRED ]= pred4x4_dc_c; |
1103 h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_rv40_c; | 1222 h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_rv40_c; |
1127 h->pred8x8l[TOP_DC_PRED ]= pred8x8l_top_dc_c; | 1246 h->pred8x8l[TOP_DC_PRED ]= pred8x8l_top_dc_c; |
1128 h->pred8x8l[DC_128_PRED ]= pred8x8l_128_dc_c; | 1247 h->pred8x8l[DC_128_PRED ]= pred8x8l_128_dc_c; |
1129 | 1248 |
1130 h->pred8x8[VERT_PRED8x8 ]= pred8x8_vertical_c; | 1249 h->pred8x8[VERT_PRED8x8 ]= pred8x8_vertical_c; |
1131 h->pred8x8[HOR_PRED8x8 ]= pred8x8_horizontal_c; | 1250 h->pred8x8[HOR_PRED8x8 ]= pred8x8_horizontal_c; |
1251 if (codec_id != CODEC_ID_VP8) { | |
1132 h->pred8x8[PLANE_PRED8x8 ]= pred8x8_plane_c; | 1252 h->pred8x8[PLANE_PRED8x8 ]= pred8x8_plane_c; |
1133 if(codec_id != CODEC_ID_RV40){ | 1253 } else |
1254 h->pred8x8[PLANE_PRED8x8]= pred8x8_tm_vp8_c; | |
1255 if(codec_id != CODEC_ID_RV40 && codec_id != CODEC_ID_VP8){ | |
1134 h->pred8x8[DC_PRED8x8 ]= pred8x8_dc_c; | 1256 h->pred8x8[DC_PRED8x8 ]= pred8x8_dc_c; |
1135 h->pred8x8[LEFT_DC_PRED8x8]= pred8x8_left_dc_c; | 1257 h->pred8x8[LEFT_DC_PRED8x8]= pred8x8_left_dc_c; |
1136 h->pred8x8[TOP_DC_PRED8x8 ]= pred8x8_top_dc_c; | 1258 h->pred8x8[TOP_DC_PRED8x8 ]= pred8x8_top_dc_c; |
1137 h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= pred8x8_mad_cow_dc_l0t; | 1259 h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= pred8x8_mad_cow_dc_l0t; |
1138 h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= pred8x8_mad_cow_dc_0lt; | 1260 h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= pred8x8_mad_cow_dc_0lt; |
1154 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_plane_svq3_c; | 1276 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_plane_svq3_c; |
1155 break; | 1277 break; |
1156 case CODEC_ID_RV40: | 1278 case CODEC_ID_RV40: |
1157 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_plane_rv40_c; | 1279 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_plane_rv40_c; |
1158 break; | 1280 break; |
1281 case CODEC_ID_VP8: | |
1282 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_tm_vp8_c; | |
1283 break; | |
1159 default: | 1284 default: |
1160 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_plane_c; | 1285 h->pred16x16[PLANE_PRED8x8 ]= pred16x16_plane_c; |
1161 } | 1286 } |
1162 h->pred16x16[LEFT_DC_PRED8x8]= pred16x16_left_dc_c; | 1287 h->pred16x16[LEFT_DC_PRED8x8]= pred16x16_left_dc_c; |
1163 h->pred16x16[TOP_DC_PRED8x8 ]= pred16x16_top_dc_c; | 1288 h->pred16x16[TOP_DC_PRED8x8 ]= pred16x16_top_dc_c; |