diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/msmpeg4.c')
-rw-r--r-- | src/libffmpeg/libavcodec/msmpeg4.c | 63 |
1 files changed, 29 insertions, 34 deletions
diff --git a/src/libffmpeg/libavcodec/msmpeg4.c b/src/libffmpeg/libavcodec/msmpeg4.c index 4bac6d3b7..817fdeaf3 100644 --- a/src/libffmpeg/libavcodec/msmpeg4.c +++ b/src/libffmpeg/libavcodec/msmpeg4.c @@ -27,7 +27,6 @@ #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" -//#define PRINT_MB /* * You can also call this codec : MPEG4 with a twist ! @@ -439,12 +438,10 @@ void msmpeg4_encode_ext_header(MpegEncContext * s) put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047)); - if(s->msmpeg4_version<3) - s->flipflop_rounding=0; - else{ - s->flipflop_rounding=1; + if(s->msmpeg4_version>=3) put_bits(&s->pb, 1, s->flipflop_rounding); - } + else + assert(s->flipflop_rounding==0); } #endif //CONFIG_ENCODERS @@ -551,6 +548,9 @@ void msmpeg4_encode_mb(MpegEncContext * s, if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) { /* skip macroblock */ put_bits(&s->pb, 1, 1); + s->last_bits++; + s->misc_bits++; + return; } if (s->use_skip_mb_code) @@ -566,7 +566,9 @@ void msmpeg4_encode_mb(MpegEncContext * s, put_bits(&s->pb, cbpy_tab[coded_cbp>>2][1], cbpy_tab[coded_cbp>>2][0]); - + + s->misc_bits += get_bits_diff(s); + h263_pred_motion(s, 0, &pred_x, &pred_y); msmpeg4v2_encode_motion(s, motion_x - pred_x); msmpeg4v2_encode_motion(s, motion_y - pred_y); @@ -575,11 +577,20 @@ void msmpeg4_encode_mb(MpegEncContext * s, table_mb_non_intra[cbp + 64][1], table_mb_non_intra[cbp + 64][0]); + s->misc_bits += get_bits_diff(s); + /* motion vector */ h263_pred_motion(s, 0, &pred_x, &pred_y); msmpeg4_encode_motion(s, motion_x - pred_x, motion_y - pred_y); } + + s->mv_bits += get_bits_diff(s); + + for (i = 0; i < 6; i++) { + msmpeg4_encode_block(s, block[i], i); + } + s->p_tex_bits += get_bits_diff(s); } else { /* compute cbp */ cbp = 0; @@ -635,10 +646,12 @@ void msmpeg4_encode_mb(MpegEncContext * s, put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]); } } - } + s->misc_bits += get_bits_diff(s); - for (i = 0; i < 6; i++) { - msmpeg4_encode_block(s, block[i], i); + for (i = 0; i < 6; i++) { + msmpeg4_encode_block(s, block[i], i); + } + s->i_tex_bits += get_bits_diff(s); } } @@ -1571,13 +1584,7 @@ static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) { int cbp, code, i; uint8_t *coded_val; - -#ifdef PRINT_MB -if(s->mb_x==0){ - printf("\n"); - if(s->mb_y==0) printf("\n"); -} -#endif + uint32_t * const mb_type_ptr= &s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]; if (s->pict_type == P_TYPE) { set_stat(ST_INTER_MB); @@ -1592,9 +1599,8 @@ if(s->mb_x==0){ s->mv[0][0][0] = 0; s->mv[0][0][1] = 0; s->mb_skiped = 1; -#ifdef PRINT_MB -printf("S "); -#endif + *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16; + return 0; } } @@ -1640,16 +1646,12 @@ printf("S "); s->mv_type = MV_TYPE_16X16; s->mv[0][0][0] = mx; s->mv[0][0][1] = my; -#ifdef PRINT_MB -printf("P "); -#endif + *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16; } else { //printf("I at %d %d %d %06X\n", s->mb_x, s->mb_y, ((cbp&3)? 1 : 0) +((cbp&0x3C)? 2 : 0), show_bits(&s->gb, 24)); set_stat(ST_INTRA_MB); s->ac_pred = get_bits1(&s->gb); -#ifdef PRINT_MB -printf("%c", s->ac_pred ? 'A' : 'I'); -#endif + *mb_type_ptr = MB_TYPE_INTRA; if(s->inter_intra_pred){ s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1); // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y); @@ -1687,14 +1689,7 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, /* DC coef */ set_stat(ST_DC); level = msmpeg4_decode_dc(s, n, &dc_pred_dir); -#ifdef PRINT_MB -{ - static int c; - if(n==0) c=0; - if(n==4) printf("%X", c); - c+= c +dc_pred_dir; -} -#endif + if (level < 0){ fprintf(stderr, "dc overflow- block: %d qscale: %d//\n", n, s->qscale); if(s->inter_intra_pred) level=0; |