Mercurial > libavcodec.hg
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" |
