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;