Mercurial > libavcodec.hg
comparison h264data.h @ 2755:975074f04b95 libavcodec
decode H.264 with 8x8 transform.
deblocking is still incorrect with 8x8+cavlc
author | lorenm |
---|---|
date | Thu, 02 Jun 2005 21:15:20 +0000 |
parents | e0bf024629cf |
children | a1f71e17054c |
comparison
equal
deleted
inserted
replaced
2754:a49f140179e9 | 2755:975074f04b95 |
---|---|
304 static const uint8_t chroma_dc_scan[4]={ | 304 static const uint8_t chroma_dc_scan[4]={ |
305 (0+0*2)*16, (1+0*2)*16, | 305 (0+0*2)*16, (1+0*2)*16, |
306 (0+1*2)*16, (1+1*2)*16, //FIXME | 306 (0+1*2)*16, (1+1*2)*16, //FIXME |
307 }; | 307 }; |
308 | 308 |
309 static const uint8_t zigzag_scan8x8[64]={ | |
310 0+0*8, 1+0*8, 0+1*8, 0+2*8, | |
311 1+1*8, 2+0*8, 3+0*8, 2+1*8, | |
312 1+2*8, 0+3*8, 0+4*8, 1+3*8, | |
313 2+2*8, 3+1*8, 4+0*8, 5+0*8, | |
314 4+1*8, 3+2*8, 2+3*8, 1+4*8, | |
315 0+5*8, 0+6*8, 1+5*8, 2+4*8, | |
316 3+3*8, 4+2*8, 5+1*8, 6+0*8, | |
317 7+0*8, 6+1*8, 5+2*8, 4+3*8, | |
318 3+4*8, 2+5*8, 1+6*8, 0+7*8, | |
319 1+7*8, 2+6*8, 3+5*8, 4+4*8, | |
320 5+3*8, 6+2*8, 7+1*8, 7+2*8, | |
321 6+3*8, 5+4*8, 4+5*8, 3+6*8, | |
322 2+7*8, 3+7*8, 4+6*8, 5+5*8, | |
323 6+4*8, 7+3*8, 7+4*8, 6+5*8, | |
324 5+6*8, 4+7*8, 5+7*8, 6+6*8, | |
325 7+5*8, 7+6*8, 6+7*8, 7+7*8, | |
326 }; | |
327 | |
328 // zigzag_scan8x8_cavlc[i] = zigzag_scan8x8[(i/4) + 16*(i%4)] | |
329 static const uint8_t zigzag_scan8x8_cavlc[64]={ | |
330 0+0*8, 1+1*8, 1+2*8, 2+2*8, | |
331 4+1*8, 0+5*8, 3+3*8, 7+0*8, | |
332 3+4*8, 1+7*8, 5+3*8, 6+3*8, | |
333 2+7*8, 6+4*8, 5+6*8, 7+5*8, | |
334 1+0*8, 2+0*8, 0+3*8, 3+1*8, | |
335 3+2*8, 0+6*8, 4+2*8, 6+1*8, | |
336 2+5*8, 2+6*8, 6+2*8, 5+4*8, | |
337 3+7*8, 7+3*8, 4+7*8, 7+6*8, | |
338 0+1*8, 3+0*8, 0+4*8, 4+0*8, | |
339 2+3*8, 1+5*8, 5+1*8, 5+2*8, | |
340 1+6*8, 3+5*8, 7+1*8, 4+5*8, | |
341 4+6*8, 7+4*8, 5+7*8, 6+7*8, | |
342 0+2*8, 2+1*8, 1+3*8, 5+0*8, | |
343 1+4*8, 2+4*8, 6+0*8, 4+3*8, | |
344 0+7*8, 4+4*8, 7+2*8, 3+6*8, | |
345 5+5*8, 6+5*8, 6+6*8, 7+7*8, | |
346 }; | |
347 | |
309 #define MB_TYPE_REF0 MB_TYPE_ACPRED //dirty but it fits in 16bit | 348 #define MB_TYPE_REF0 MB_TYPE_ACPRED //dirty but it fits in 16bit |
349 #define MB_TYPE_8x8DCT 0x01000000 | |
310 #define IS_REF0(a) ((a)&MB_TYPE_REF0) | 350 #define IS_REF0(a) ((a)&MB_TYPE_REF0) |
351 #define IS_8x8DCT(a) ((a)&MB_TYPE_8x8DCT) | |
352 | |
311 | 353 |
312 typedef struct IMbInfo{ | 354 typedef struct IMbInfo{ |
313 uint16_t type; | 355 uint16_t type; |
314 uint8_t pred_mode; | 356 uint8_t pred_mode; |
315 uint8_t cbp; | 357 uint8_t cbp; |
470 {3584,4608,3584,4608, 4608,5888,4608,5888, 3584,4608,3584,4608, 4608,5888,4608,5888, }, | 512 {3584,4608,3584,4608, 4608,5888,4608,5888, 3584,4608,3584,4608, 4608,5888,4608,5888, }, |
471 //{4096,5120,4096,5120, 5120,6400,5120,6400, 4096,5120,4096,5120, 5120,6400,5120,6400, }, | 513 //{4096,5120,4096,5120, 5120,6400,5120,6400, 4096,5120,4096,5120, 5120,6400,5120,6400, }, |
472 //{4608,5888,4608,5888, 5888,7424,5888,7424, 4608,5888,4608,5888, 5888,7424,5888,7424, }, | 514 //{4608,5888,4608,5888, 5888,7424,5888,7424, 4608,5888,4608,5888, 5888,7424,5888,7424, }, |
473 }; | 515 }; |
474 | 516 |
517 static const int dequant8_coeff_init_scan[16] = { | |
518 0,3,4,3, 3,1,5,1, 4,5,2,5, 3,1,5,1 | |
519 }; | |
520 static const int dequant8_coeff_init[6][6]={ | |
521 {20,18,32,19,25,24}, | |
522 {22,19,35,21,28,26}, | |
523 {26,23,42,24,33,31}, | |
524 {28,25,45,26,35,33}, | |
525 {32,28,51,30,40,38}, | |
526 {36,32,58,34,46,43}, | |
527 }; | |
528 | |
475 #define QUANT_SHIFT 22 | 529 #define QUANT_SHIFT 22 |
476 | 530 |
477 static const int quant_coeff[52][16]={ | 531 static const int quant_coeff[52][16]={ |
478 { 419430,258111,419430,258111,258111,167772,258111,167772,419430,258111,419430,258111,258111,167772,258111,167772,}, | 532 { 419430,258111,419430,258111,258111,167772,258111,167772,419430,258111,419430,258111,258111,167772,258111,167772,}, |
479 { 381300,239675,381300,239675,239675,149131,239675,149131,381300,239675,381300,239675,239675,149131,239675,149131,}, | 533 { 381300,239675,381300,239675,239675,149131,239675,149131,381300,239675,381300,239675,239675,149131,239675,149131,}, |
559 { 9,12,18 }, {10,13,20 }, {11,15,23 }, {13,17,25 } | 613 { 9,12,18 }, {10,13,20 }, {11,15,23 }, {13,17,25 } |
560 }; | 614 }; |
561 | 615 |
562 /* Cabac pre state table */ | 616 /* Cabac pre state table */ |
563 | 617 |
564 static const int cabac_context_init_I[399][2] = | 618 static const int cabac_context_init_I[460][2] = |
565 { | 619 { |
566 /* 0 - 10 */ | 620 /* 0 - 10 */ |
567 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 }, | 621 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 }, |
568 { 2, 54 }, { 3, 74 }, { -28,127 }, { -23, 104 }, | 622 { 2, 54 }, { 3, 74 }, { -28,127 }, { -23, 104 }, |
569 { -6, 53 }, { -1, 54 }, { 7, 51 }, | 623 { -6, 53 }, { -1, 54 }, { 7, 51 }, |
705 { 33, 0 }, { 38, 2 }, { 33, 13 }, { 23, 35 }, | 759 { 33, 0 }, { 38, 2 }, { 33, 13 }, { 23, 35 }, |
706 { 13, 58 }, { 29, -3 }, { 26, 0 }, { 22, 30 }, | 760 { 13, 58 }, { 29, -3 }, { 26, 0 }, { 22, 30 }, |
707 { 31, -7 }, { 35, -15 }, { 34, -3 }, { 34, 3 }, | 761 { 31, -7 }, { 35, -15 }, { 34, -3 }, { 34, 3 }, |
708 { 36, -1 }, { 34, 5 }, { 32, 11 }, { 35, 5 }, | 762 { 36, -1 }, { 34, 5 }, { 32, 11 }, { 35, 5 }, |
709 { 34, 12 }, { 39, 11 }, { 30, 29 }, { 34, 26 }, | 763 { 34, 12 }, { 39, 11 }, { 30, 29 }, { 34, 26 }, |
710 { 29, 39 }, { 19, 66 } | 764 { 29, 39 }, { 19, 66 }, |
711 }; | 765 |
712 | 766 /* 399 -> 435 */ |
713 static const int cabac_context_init_PB[3][399][2] = | 767 { 31, 21 }, { 31, 31 }, { 25, 50 }, |
768 { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11, 85 }, | |
769 { -15, 92 }, { -14, 89 }, { -26, 71 }, { -15, 81 }, | |
770 { -14, 80 }, { 0, 68 }, { -14, 70 }, { -24, 56 }, | |
771 { -23, 68 }, { -24, 50 }, { -11, 74 }, { 23, -13 }, | |
772 { 26, -13 }, { 40, -15 }, { 49, -14 }, { 44, 3 }, | |
773 { 45, 6 }, { 44, 34 }, { 33, 54 }, { 19, 82 }, | |
774 { -3, 75 }, { -1, 23 }, { 1, 34 }, { 1, 43 }, | |
775 { 0, 54 }, { -2, 55 }, { 0, 61 }, { 1, 64 }, | |
776 { 0, 68 }, { -9, 92 }, | |
777 | |
778 /* 436 -> 459 */ | |
779 { -14, 106 }, { -13, 97 }, { -15, 90 }, { -12, 90 }, | |
780 { -18, 88 }, { -10, 73 }, { -9, 79 }, { -14, 86 }, | |
781 { -10, 73 }, { -10, 70 }, { -10, 69 }, { -5, 66 }, | |
782 { -9, 64 }, { -5, 58 }, { 2, 59 }, { 21, -10 }, | |
783 { 24, -11 }, { 28, -8 }, { 28, -1 }, { 29, 3 }, | |
784 { 29, 9 }, { 35, 20 }, { 29, 36 }, { 14, 67 } | |
785 }; | |
786 | |
787 static const int cabac_context_init_PB[3][460][2] = | |
714 { | 788 { |
715 /* i_cabac_init_idc == 0 */ | 789 /* i_cabac_init_idc == 0 */ |
716 { | 790 { |
717 /* 0 - 10 */ | 791 /* 0 - 10 */ |
718 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 }, | 792 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 }, |
845 { 23, 20 }, { 26, 23 }, { 27, 32 }, { 28, 23 }, | 919 { 23, 20 }, { 26, 23 }, { 27, 32 }, { 28, 23 }, |
846 { 28, 24 }, { 23, 40 }, { 24, 32 }, { 28, 29 }, | 920 { 28, 24 }, { 23, 40 }, { 24, 32 }, { 28, 29 }, |
847 { 23, 42 }, { 19, 57 }, { 22, 53 }, { 22, 61 }, | 921 { 23, 42 }, { 19, 57 }, { 22, 53 }, { 22, 61 }, |
848 { 11, 86 }, | 922 { 11, 86 }, |
849 | 923 |
850 | 924 /* 399 - 435 */ |
925 { 12, 40 }, { 11, 51 }, { 14, 59 }, | |
926 { -4, 79 }, { -7, 71 }, { -5, 69 }, { -9, 70 }, | |
927 { -8, 66 }, { -10, 68 }, { -19, 73 }, { -12, 69 }, | |
928 { -16, 70 }, { -15, 67 }, { -20, 62 }, { -19, 70 }, | |
929 { -16, 66 }, { -22, 65 }, { -20, 63 }, { 9, -2 }, | |
930 { 26, -9 }, { 33, -9 }, { 39, -7 }, { 41, -2 }, | |
931 { 45, 3 }, { 49, 9 }, { 45, 27 }, { 36, 59 }, | |
932 { -6, 66 }, { -7, 35 }, { -7, 42 }, { -8, 45 }, | |
933 { -5, 48 }, { -12, 56 }, { -6, 60 }, { -5, 62 }, | |
934 { -8, 66 }, { -8, 76 }, | |
935 | |
936 /* 436 - 459 */ | |
937 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 }, | |
938 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 }, | |
939 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 }, | |
940 { -14, 66 }, { 0, 59 }, { 2, 59 }, { 21, -13 }, | |
941 { 33, -14 }, { 39, -7 }, { 46, -2 }, { 51, 2 }, | |
942 { 60, 6 }, { 61, 17 }, { 55, 34 }, { 42, 62 }, | |
851 }, | 943 }, |
852 | 944 |
853 /* i_cabac_init_idc == 1 */ | 945 /* i_cabac_init_idc == 1 */ |
854 { | 946 { |
855 /* 0 - 10 */ | 947 /* 0 - 10 */ |
983 { 23, 22 }, { 27, 21 }, { 33, 20 }, { 26, 28 }, | 1075 { 23, 22 }, { 27, 21 }, { 33, 20 }, { 26, 28 }, |
984 { 30, 24 }, { 27, 34 }, { 18, 42 }, { 25, 39 }, | 1076 { 30, 24 }, { 27, 34 }, { 18, 42 }, { 25, 39 }, |
985 { 18, 50 }, { 12, 70 }, { 21, 54 }, { 14, 71 }, | 1077 { 18, 50 }, { 12, 70 }, { 21, 54 }, { 14, 71 }, |
986 { 11, 83 }, | 1078 { 11, 83 }, |
987 | 1079 |
1080 /* 399 - 435 */ | |
1081 { 24, 32 }, { 21, 49 }, { 21, 54 }, | |
1082 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 }, | |
1083 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 8 }, | |
1084 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 }, | |
1085 { -14, 66 }, { 0, 59 }, { 2, 59 }, { 17, -10 }, | |
1086 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 }, | |
1087 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 }, | |
1088 { -5, 71 }, { 0, 24 }, { -1, 36 }, { -2, 42 }, | |
1089 { -2, 52 }, { -9, 57 }, { -6, 53 }, { -4, 65 }, | |
1090 { -4, 67 }, { -7, 82 }, | |
1091 | |
1092 /* 436 - 459 */ | |
1093 { -3, 81 }, { -3, 76 }, { -7, 72 }, { -6, 78 }, | |
1094 { -12, 72 }, { -14, 68 }, { -3, 70 }, { -6, 76 }, | |
1095 { -5, 66 }, { -5, 62 }, { 0, 57 }, { -4, 61 }, | |
1096 { -9, 60 }, { 1, 54 }, { 2, 58 }, { 17, -10 }, | |
1097 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 }, | |
1098 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 }, | |
988 }, | 1099 }, |
989 | 1100 |
990 /* i_cabac_init_idc == 2 */ | 1101 /* i_cabac_init_idc == 2 */ |
991 { | 1102 { |
992 /* 0 - 10 */ | 1103 /* 0 - 10 */ |
1119 { 18, 31 }, { 19, 26 }, { 36, 24 }, { 24, 23 }, | 1230 { 18, 31 }, { 19, 26 }, { 36, 24 }, { 24, 23 }, |
1120 { 27, 16 }, { 24, 30 }, { 31, 29 }, { 22, 41 }, | 1231 { 27, 16 }, { 24, 30 }, { 31, 29 }, { 22, 41 }, |
1121 { 22, 42 }, { 16, 60 }, { 15, 52 }, { 14, 60 }, | 1232 { 22, 42 }, { 16, 60 }, { 15, 52 }, { 14, 60 }, |
1122 { 3, 78 }, { -16, 123 }, { 21, 53 }, { 22, 56 }, | 1233 { 3, 78 }, { -16, 123 }, { 21, 53 }, { 22, 56 }, |
1123 { 25, 61 }, | 1234 { 25, 61 }, |
1235 | |
1236 /* 399 - 435 */ | |
1237 { 21, 33 }, { 19, 50 }, { 17, 61 }, | |
1238 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 }, | |
1239 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 }, | |
1240 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 }, | |
1241 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 }, | |
1242 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 }, | |
1243 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 }, | |
1244 { -9, 71 }, { -7, 37 }, { -8, 44 }, { -11, 49 }, | |
1245 { -10, 56 }, { -12, 59 }, { -8, 63 }, { -9, 67 }, | |
1246 { -6, 68 }, { -10, 79 }, | |
1247 | |
1248 /* 436 - 459 */ | |
1249 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 }, | |
1250 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 }, | |
1251 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 }, | |
1252 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 }, | |
1253 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 }, | |
1254 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 }, | |
1124 } | 1255 } |
1125 }; | 1256 }; |