diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/msmpeg4.c')
-rw-r--r-- | src/libffmpeg/libavcodec/msmpeg4.c | 68 |
1 files changed, 53 insertions, 15 deletions
diff --git a/src/libffmpeg/libavcodec/msmpeg4.c b/src/libffmpeg/libavcodec/msmpeg4.c index 34dc3569d..1c53b8d0d 100644 --- a/src/libffmpeg/libavcodec/msmpeg4.c +++ b/src/libffmpeg/libavcodec/msmpeg4.c @@ -45,6 +45,9 @@ #define MB_NON_INTRA_VLC_BITS 9 #define MB_INTRA_VLC_BITS 9 +#define II_BITRATE 128*1024 +#define MBAC_BITRATE 50*1024 + static UINT32 v2_dc_lum_table[512][2]; static UINT32 v2_dc_chroma_table[512][2]; @@ -360,7 +363,7 @@ void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number) s->mv_table_index = 1; /* only if P frame */ s->use_skip_mb_code = 1; /* only if P frame */ s->per_mb_rl_table = 0; - s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=128 && s->pict_type==P_TYPE); + s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==P_TYPE); if (s->pict_type == I_TYPE) { s->no_rounding = 1; @@ -369,7 +372,7 @@ void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number) if(s->msmpeg4_version==4){ msmpeg4_encode_ext_header(s); - if(s->bit_rate>50) + if(s->bit_rate>MBAC_BITRATE) put_bits(&s->pb, 1, s->per_mb_rl_table); } @@ -384,7 +387,7 @@ void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number) } else { put_bits(&s->pb, 1, s->use_skip_mb_code); - if(s->msmpeg4_version==4 && s->bit_rate>50) + if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE) put_bits(&s->pb, 1, s->per_mb_rl_table); if(s->msmpeg4_version>2){ @@ -416,7 +419,7 @@ void msmpeg4_encode_ext_header(MpegEncContext * s) { put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29 - put_bits(&s->pb, 11, MIN(s->bit_rate, 2047)); + put_bits(&s->pb, 11, MIN(s->bit_rate/1024, 2047)); if(s->msmpeg4_version<3) s->flipflop_rounding=0; @@ -624,6 +627,10 @@ void msmpeg4_encode_mb(MpegEncContext * s, } set_stat(ST_INTRA_MB); put_bits(&s->pb, 1, 0); /* no AC prediction yet */ + if(s->inter_intra_pred){ + s->h263_aic_dir=0; + put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]); + } } } @@ -1247,8 +1254,8 @@ return -1; case 4: msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8); - if(s->bit_rate > 50) s->per_mb_rl_table= get_bits1(&s->gb); - else s->per_mb_rl_table= 0; + if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb); + else s->per_mb_rl_table= 0; if(!s->per_mb_rl_table){ s->rl_chroma_table_index = decode012(&s->gb); @@ -1292,8 +1299,8 @@ return -1; case 4: s->use_skip_mb_code = get_bits1(&s->gb); - if(s->bit_rate > 50) s->per_mb_rl_table= get_bits1(&s->gb); - else s->per_mb_rl_table= 0; + if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb); + else s->per_mb_rl_table= 0; if(!s->per_mb_rl_table){ s->rl_table_index = decode012(&s->gb); @@ -1303,7 +1310,7 @@ return -1; s->dc_table_index = get_bits1(&s->gb); s->mv_table_index = get_bits1(&s->gb); - s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=128); + s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE); break; } /* printf("skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n", @@ -1340,13 +1347,13 @@ int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size) int fps; fps= get_bits(&s->gb, 5); - s->bit_rate= get_bits(&s->gb, 11); + s->bit_rate= get_bits(&s->gb, 11)*1024; if(s->msmpeg4_version>=3) s->flipflop_rounding= get_bits1(&s->gb); else s->flipflop_rounding= 0; -// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate, s->flipflop_rounding); +// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding); } else if(left<length+8) { @@ -1625,7 +1632,7 @@ printf("%c", s->ac_pred ? 'A' : 'I'); return 0; } - +//#define ERROR_DETAILS static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, int n, int coded) { @@ -1743,12 +1750,13 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, ll++; SKIP_BITS(re, &s->gb, 1); } - SKIP_BITS(re, &s->gb, 1); + if(ll<8) SKIP_BITS(re, &s->gb, 1); } s->esc3_level_length= ll; s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2); //printf("level length:%d, run length: %d\n", ll, s->esc3_run_length); + UPDATE_CACHE(re, &s->gb); } run= SHOW_UBITS(re, &s->gb, s->esc3_run_length); SKIP_BITS(re, &s->gb, s->esc3_run_length); @@ -1792,6 +1800,12 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, #endif i+= run + 1; if(last) i+=192; +#ifdef ERROR_DETAILS + if(run==66) + fprintf(stderr, "illegal vlc code in ESC3 level=%d\n", level); + else if((i>62 && i<192) || i>192+63) + fprintf(stderr, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level); +#endif } else { /* second escape */ #if MIN_CACHE_BITS < 23 @@ -1804,6 +1818,12 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_BITS(re, &s->gb, 1); +#ifdef ERROR_DETAILS + if(run==66) + fprintf(stderr, "illegal vlc code in ESC2 level=%d\n", level); + else if((i>62 && i<192) || i>192+63) + fprintf(stderr, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level); +#endif } } else { /* first escape */ @@ -1818,17 +1838,35 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_BITS(re, &s->gb, 1); +#ifdef ERROR_DETAILS + if(run==66) + fprintf(stderr, "illegal vlc code in ESC1 level=%d\n", level); + else if((i>62 && i<192) || i>192+63) + fprintf(stderr, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level); +#endif } } else { i+= run; level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_BITS(re, &s->gb, 1); +#ifdef ERROR_DETAILS + if(run==66) + fprintf(stderr, "illegal vlc code level=%d\n", level); + else if((i>62 && i<192) || i>192+63) + fprintf(stderr, "run overflow i=%d run=%d level=%d\n", i, run, level); +#endif } if (i > 62){ i-= 192; if(i&(~63)){ - fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); - return -1; + const int left= s->gb.size*8 - get_bits_count(&s->gb); + if(((i+192 == 64 && level/qmul==-1) || s->error_resilience<0) && left>=0){ + fprintf(stderr, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y); + break; + }else{ + fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); + return -1; + } } block[scan_table[i]] = level; |