comparison msmpeg4.c @ 936:caa77cd960c0 libavcodec

qpel encoding 4mv+b frames encoding finally fixed chroma ME 5 comparission functions for ME b frame encoding speedup wmv2 codec (unfinished) user specified diamond size for EPZS
author michaelni
date Fri, 27 Dec 2002 23:51:46 +0000
parents 22ee74da2cd3
children ca2a303ea039
comparison
equal deleted inserted replaced
935:c9bbd35064b6 936:caa77cd960c0
46 #define MB_INTRA_VLC_BITS 9 46 #define MB_INTRA_VLC_BITS 9
47 47
48 #define II_BITRATE 128*1024 48 #define II_BITRATE 128*1024
49 #define MBAC_BITRATE 50*1024 49 #define MBAC_BITRATE 50*1024
50 50
51 #define DEFAULT_INTER_INDEX 3
52
51 static UINT32 v2_dc_lum_table[512][2]; 53 static UINT32 v2_dc_lum_table[512][2];
52 static UINT32 v2_dc_chroma_table[512][2]; 54 static UINT32 v2_dc_chroma_table[512][2];
53 55
54 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n); 56 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
55 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, 57 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
56 int n, int coded); 58 int n, int coded, const uint8_t *scantable);
57 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); 59 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
58 static int msmpeg4_decode_motion(MpegEncContext * s, 60 static int msmpeg4_decode_motion(MpegEncContext * s,
59 int *mx_ptr, int *my_ptr); 61 int *mx_ptr, int *my_ptr);
60 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val); 62 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
61 static void init_h263_dc_for_msmpeg4(void); 63 static void init_h263_dc_for_msmpeg4(void);
62 static inline void msmpeg4_memsetw(short *tab, int val, int n); 64 static inline void msmpeg4_memsetw(short *tab, int val, int n);
63 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra); 65 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra);
64 static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); 66 static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
65 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); 67 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
68 static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
66 69
67 extern UINT32 inverse[256]; 70 extern UINT32 inverse[256];
68 71
69 72
70 #ifdef DEBUG 73 #ifdef DEBUG
158 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; 161 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
159 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; 162 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
160 } 163 }
161 break; 164 break;
162 case 4: 165 case 4:
166 case 5:
163 s->y_dc_scale_table= wmv1_y_dc_scale_table; 167 s->y_dc_scale_table= wmv1_y_dc_scale_table;
164 s->c_dc_scale_table= wmv1_c_dc_scale_table; 168 s->c_dc_scale_table= wmv1_c_dc_scale_table;
165 break; 169 break;
166 } 170 }
167 171
168 172
169 if(s->msmpeg4_version==4){ 173 if(s->msmpeg4_version>=4){
170 ff_init_scantable(s, &s->intra_scantable , wmv1_scantable[1]); 174 ff_init_scantable(s, &s->intra_scantable , wmv1_scantable[1]);
171 ff_init_scantable(s, &s->intra_h_scantable, wmv1_scantable[2]); 175 ff_init_scantable(s, &s->intra_h_scantable, wmv1_scantable[2]);
172 ff_init_scantable(s, &s->intra_v_scantable, wmv1_scantable[3]); 176 ff_init_scantable(s, &s->intra_v_scantable, wmv1_scantable[3]);
173 ff_init_scantable(s, &s->inter_scantable , wmv1_scantable[0]); 177 ff_init_scantable(s, &s->inter_scantable , wmv1_scantable[0]);
174 } 178 }
368 s->mv_table_index = 1; /* only if P frame */ 372 s->mv_table_index = 1; /* only if P frame */
369 s->use_skip_mb_code = 1; /* only if P frame */ 373 s->use_skip_mb_code = 1; /* only if P frame */
370 s->per_mb_rl_table = 0; 374 s->per_mb_rl_table = 0;
371 if(s->msmpeg4_version==4) 375 if(s->msmpeg4_version==4)
372 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==P_TYPE); 376 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==P_TYPE);
377 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
373 378
374 if (s->pict_type == I_TYPE) { 379 if (s->pict_type == I_TYPE) {
375 s->no_rounding = 1;
376 s->slice_height= s->mb_height/1; 380 s->slice_height= s->mb_height/1;
377 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height); 381 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
378 382
379 if(s->msmpeg4_version==4){ 383 if(s->msmpeg4_version==4){
380 msmpeg4_encode_ext_header(s); 384 msmpeg4_encode_ext_header(s);
402 406
403 put_bits(&s->pb, 1, s->dc_table_index); 407 put_bits(&s->pb, 1, s->dc_table_index);
404 408
405 put_bits(&s->pb, 1, s->mv_table_index); 409 put_bits(&s->pb, 1, s->mv_table_index);
406 } 410 }
407
408 if(s->flipflop_rounding){
409 s->no_rounding ^= 1;
410 }else{
411 s->no_rounding = 0;
412 }
413 } 411 }
414 412
415 s->esc3_level_length= 0; 413 s->esc3_level_length= 0;
416 s->esc3_run_length= 0; 414 s->esc3_run_length= 0;
417 415
921 scantable= s->inter_scantable.permutated; 919 scantable= s->inter_scantable.permutated;
922 set_stat(ST_INTER_AC); 920 set_stat(ST_INTER_AC);
923 } 921 }
924 922
925 /* recalculate block_last_index for M$ wmv1 */ 923 /* recalculate block_last_index for M$ wmv1 */
926 if(s->msmpeg4_version==4 && s->block_last_index[n]>0){ 924 if(s->msmpeg4_version>=4 && s->block_last_index[n]>0){
927 for(last_index=63; last_index>=0; last_index--){ 925 for(last_index=63; last_index>=0; last_index--){
928 if(block[scantable[last_index]]) break; 926 if(block[scantable[last_index]]) break;
929 } 927 }
930 s->block_last_index[n]= last_index; 928 s->block_last_index[n]= last_index;
931 }else 929 }else
973 if (code == rl->n) { 971 if (code == rl->n) {
974 esc3: 972 esc3:
975 /* third escape */ 973 /* third escape */
976 put_bits(&s->pb, 1, 0); 974 put_bits(&s->pb, 1, 0);
977 put_bits(&s->pb, 1, last); 975 put_bits(&s->pb, 1, last);
978 if(s->msmpeg4_version==4){ 976 if(s->msmpeg4_version>=4){
979 if(s->esc3_level_length==0){ 977 if(s->esc3_level_length==0){
980 s->esc3_level_length=8; 978 s->esc3_level_length=8;
981 s->esc3_run_length= 6; 979 s->esc3_run_length= 6;
982 if(s->qscale<8) 980 if(s->qscale<8)
983 put_bits(&s->pb, 6, 3); 981 put_bits(&s->pb, 6, 3);
1012 } 1010 }
1013 1011
1014 /****************************************/ 1012 /****************************************/
1015 /* decoding stuff */ 1013 /* decoding stuff */
1016 1014
1017 static VLC mb_non_intra_vlc; 1015 static VLC mb_non_intra_vlc[4];
1018 static VLC mb_intra_vlc; 1016 static VLC mb_intra_vlc;
1019 static VLC dc_lum_vlc[2]; 1017 static VLC dc_lum_vlc[2];
1020 static VLC dc_chroma_vlc[2]; 1018 static VLC dc_chroma_vlc[2];
1021 static VLC v2_dc_lum_vlc; 1019 static VLC v2_dc_lum_vlc;
1022 static VLC v2_dc_chroma_vlc; 1020 static VLC v2_dc_chroma_vlc;
1137 &v2_mb_type[0][0], 2, 1); 1135 &v2_mb_type[0][0], 2, 1);
1138 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33, 1136 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
1139 &mvtab[0][1], 2, 1, 1137 &mvtab[0][1], 2, 1,
1140 &mvtab[0][0], 2, 1); 1138 &mvtab[0][0], 2, 1);
1141 1139
1142 init_vlc(&mb_non_intra_vlc, MB_NON_INTRA_VLC_BITS, 128, 1140 for(i=0; i<4; i++){
1143 &table_mb_non_intra[0][1], 8, 4, 1141 init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
1144 &table_mb_non_intra[0][0], 8, 4); 1142 &wmv2_inter_table[i][0][1], 8, 4,
1143 &wmv2_inter_table[i][0][0], 8, 4); //FIXME name?
1144 }
1145
1145 init_vlc(&mb_intra_vlc, MB_INTRA_VLC_BITS, 64, 1146 init_vlc(&mb_intra_vlc, MB_INTRA_VLC_BITS, 64,
1146 &table_mb_intra[0][1], 4, 2, 1147 &table_mb_intra[0][1], 4, 2,
1147 &table_mb_intra[0][0], 4, 2); 1148 &table_mb_intra[0][0], 4, 2);
1148 1149
1149 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8, 1150 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
1164 s->decode_mb= msmpeg4v12_decode_mb; 1165 s->decode_mb= msmpeg4v12_decode_mb;
1165 break; 1166 break;
1166 case 3: 1167 case 3:
1167 case 4: 1168 case 4:
1168 s->decode_mb= msmpeg4v34_decode_mb; 1169 s->decode_mb= msmpeg4v34_decode_mb;
1170 break;
1171 case 5:
1172 s->decode_mb= wmv2_decode_mb;
1169 break; 1173 break;
1170 } 1174 }
1171 1175
1172 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame isnt a keyframe 1176 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame isnt a keyframe
1173 1177
1332 s->no_rounding ^= 1; 1336 s->no_rounding ^= 1;
1333 }else{ 1337 }else{
1334 s->no_rounding = 0; 1338 s->no_rounding = 0;
1335 } 1339 }
1336 } 1340 }
1341 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
1337 1342
1338 s->esc3_level_length= 0; 1343 s->esc3_level_length= 0;
1339 s->esc3_run_length= 0; 1344 s->esc3_run_length= 0;
1340 1345
1341 #ifdef DEBUG 1346 #ifdef DEBUG
1521 if(s->pict_type==P_TYPE) cbp^=0x3C; 1526 if(s->pict_type==P_TYPE) cbp^=0x3C;
1522 } 1527 }
1523 } 1528 }
1524 1529
1525 for (i = 0; i < 6; i++) { 1530 for (i = 0; i < 6; i++) {
1526 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) 1531 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
1527 { 1532 {
1528 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); 1533 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1529 return -1; 1534 return -1;
1530 } 1535 }
1531 } 1536 }
1564 #endif 1569 #endif
1565 return 0; 1570 return 0;
1566 } 1571 }
1567 } 1572 }
1568 1573
1569 code = get_vlc2(&s->gb, mb_non_intra_vlc.table, MB_NON_INTRA_VLC_BITS, 3); 1574 code = get_vlc2(&s->gb, mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3);
1570 if (code < 0) 1575 if (code < 0)
1571 return -1; 1576 return -1;
1572 //s->mb_intra = (code & 0x40) ? 0 : 1; 1577 //s->mb_intra = (code & 0x40) ? 0 : 1;
1573 s->mb_intra = (~code & 0x40) >> 6; 1578 s->mb_intra = (~code & 0x40) >> 6;
1574 1579
1626 s->rl_chroma_table_index = s->rl_table_index; 1631 s->rl_chroma_table_index = s->rl_table_index;
1627 } 1632 }
1628 } 1633 }
1629 1634
1630 for (i = 0; i < 6; i++) { 1635 for (i = 0; i < 6; i++) {
1631 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0) 1636 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
1632 { 1637 {
1633 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); 1638 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1634 return -1; 1639 return -1;
1635 } 1640 }
1636 } 1641 }
1637 1642
1638 return 0; 1643 return 0;
1639 } 1644 }
1640 //#define ERROR_DETAILS 1645 //#define ERROR_DETAILS
1641 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, 1646 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
1642 int n, int coded) 1647 int n, int coded, const uint8_t *scan_table)
1643 { 1648 {
1644 int level, i, last, run, run_diff; 1649 int level, i, last, run, run_diff;
1645 int dc_pred_dir; 1650 int dc_pred_dir;
1646 RLTable *rl; 1651 RLTable *rl;
1647 RL_VLC_ELEM *rl_vlc; 1652 RL_VLC_ELEM *rl_vlc;
1648 const UINT8 *scan_table;
1649 int qmul, qadd; 1653 int qmul, qadd;
1650 1654
1651 if (s->mb_intra) { 1655 if (s->mb_intra) {
1652 qmul=1; 1656 qmul=1;
1653 qadd=0; 1657 qadd=0;
1711 1715
1712 if (!coded) { 1716 if (!coded) {
1713 s->block_last_index[n] = i; 1717 s->block_last_index[n] = i;
1714 return 0; 1718 return 0;
1715 } 1719 }
1716 scan_table = s->inter_scantable.permutated; 1720 if(!scan_table)
1721 scan_table = s->inter_scantable.permutated;
1717 set_stat(ST_INTER_AC); 1722 set_stat(ST_INTER_AC);
1718 rl_vlc= rl->rl_vlc[s->qscale]; 1723 rl_vlc= rl->rl_vlc[s->qscale];
1719 } 1724 }
1720 { 1725 {
1721 OPEN_READER(re, &s->gb); 1726 OPEN_READER(re, &s->gb);
1887 mpeg4_pred_ac(s, block, n, dc_pred_dir); 1892 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1888 if (s->ac_pred) { 1893 if (s->ac_pred) {
1889 i = 63; /* XXX: not optimal */ 1894 i = 63; /* XXX: not optimal */
1890 } 1895 }
1891 } 1896 }
1892 if(s->msmpeg4_version==4 && i>0) i=63; //FIXME/XXX optimize 1897 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
1893 s->block_last_index[n] = i; 1898 s->block_last_index[n] = i;
1894 1899
1895 return 0; 1900 return 0;
1896 } 1901 }
1897 1902
1988 my -= 64; 1993 my -= 64;
1989 *mx_ptr = mx; 1994 *mx_ptr = mx;
1990 *my_ptr = my; 1995 *my_ptr = my;
1991 return 0; 1996 return 0;
1992 } 1997 }
1998
1999 /* cleanest way to support it
2000 * there is too much shared between versions so that we cant have 1 file per version & 1 common
2001 * as allmost everything would be in the common file
2002 */
2003 #include "wmv2.c"