From 2f66421c3470639904baed80a25094d73c2abc19 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> Date: Tue, 18 Mar 2025 13:21:23 +0100 Subject: [PATCH 47/77] avcodec/mpegvideo: Move MSMPEG4 fields to MSMPEG4 contexts Several fields are not used by any generic code and can therefore be moved to more specialized contexts. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavcodec/mpegvideo.h | 7 -- libavcodec/msmpeg4dec.c | 145 +++++++++++++++++++++------------------- libavcodec/msmpeg4dec.h | 12 +++- libavcodec/msmpeg4enc.c | 89 ++++++++++++------------ libavcodec/msmpeg4enc.h | 16 ++++- libavcodec/vaapi_vc1.c | 4 +- libavcodec/vc1.c | 12 ++-- libavcodec/vc1.h | 4 ++ libavcodec/vc1_block.c | 26 +++---- libavcodec/wmv2dec.c | 72 +++++++++++--------- libavcodec/wmv2enc.c | 33 ++++----- 11 files changed, 227 insertions(+), 193 deletions(-) diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 136b9b18a7..39ca4b3d1a 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -372,11 +372,6 @@ typedef struct MpegEncContext { int esc_pos; /* MSMPEG4 specific */ - int mv_table_index; - int rl_table_index; - int rl_chroma_table_index; - int dc_table_index; - int use_skip_mb_code; int slice_height; ///< in macroblocks int first_slice_line; ///< used in MPEG-4 too to handle resync markers int flipflop_rounding; @@ -389,9 +384,7 @@ typedef struct MpegEncContext { MSMP4_WMV2, MSMP4_VC1, ///< for VC1 (image), WMV3 (image) and MSS2. } msmpeg4_version; - int per_mb_rl_table; int esc3_level_length; - int esc3_run_length; int inter_intra_pred; int mspel; diff --git a/libavcodec/msmpeg4dec.c b/libavcodec/msmpeg4dec.c index b60e218f6a..df67d43542 100644 --- a/libavcodec/msmpeg4dec.c +++ b/libavcodec/msmpeg4dec.c @@ -107,11 +107,12 @@ static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code) static int msmpeg4v12_decode_mb(MpegEncContext *s, int16_t block[6][64]) { + MSMP4DecContext *const ms = mpv_to_msmpeg4(s); int cbp, code, i; uint32_t * const mb_type_ptr = &s->cur_pic.mb_type[s->mb_x + s->mb_y*s->mb_stride]; if (s->pict_type == AV_PICTURE_TYPE_P) { - if (s->use_skip_mb_code) { + if (ms->use_skip_mb_code) { if (get_bits1(&s->gb)) { /* skip mb */ s->mb_intra = 0; @@ -198,7 +199,7 @@ static int msmpeg4v12_decode_mb(MpegEncContext *s, int16_t block[6][64]) s->bdsp.clear_blocks(s->block[0]); for (i = 0; i < 6; i++) { - if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) + if (ff_msmpeg4_decode_block(ms, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) { av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); return -1; @@ -209,6 +210,7 @@ static int msmpeg4v12_decode_mb(MpegEncContext *s, int16_t block[6][64]) static int msmpeg4v34_decode_mb(MpegEncContext *s, int16_t block[6][64]) { + MSMP4DecContext *const ms = mpv_to_msmpeg4(s); int cbp, code, i; uint8_t *coded_val; uint32_t * const mb_type_ptr = &s->cur_pic.mb_type[s->mb_x + s->mb_y*s->mb_stride]; @@ -217,7 +219,7 @@ static int msmpeg4v34_decode_mb(MpegEncContext *s, int16_t block[6][64]) return AVERROR_INVALIDDATA; if (s->pict_type == AV_PICTURE_TYPE_P) { - if (s->use_skip_mb_code) { + if (ms->use_skip_mb_code) { if (get_bits1(&s->gb)) { /* skip mb */ s->mb_intra = 0; @@ -257,12 +259,12 @@ static int msmpeg4v34_decode_mb(MpegEncContext *s, int16_t block[6][64]) if (!s->mb_intra) { int mx, my; - if(s->per_mb_rl_table && cbp){ - s->rl_table_index = decode012(&s->gb); - s->rl_chroma_table_index = s->rl_table_index; + if (ms->per_mb_rl_table && cbp) { + ms->rl_table_index = decode012(&s->gb); + ms->rl_chroma_table_index = ms->rl_table_index; } ff_h263_pred_motion(s, 0, 0, &mx, &my); - ff_msmpeg4_decode_motion(s, &mx, &my); + ff_msmpeg4_decode_motion(ms, &mx, &my); s->mv_dir = MV_DIR_FORWARD; s->mv_type = MV_TYPE_16X16; s->mv[0][0][0] = mx; @@ -279,15 +281,15 @@ static int msmpeg4v34_decode_mb(MpegEncContext *s, int16_t block[6][64]) ff_dlog(s->avctx, "%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y); } - if(s->per_mb_rl_table && cbp){ - s->rl_table_index = decode012(&s->gb); - s->rl_chroma_table_index = s->rl_table_index; + if (ms->per_mb_rl_table && cbp) { + ms->rl_table_index = decode012(&s->gb); + ms->rl_chroma_table_index = ms->rl_table_index; } } s->bdsp.clear_blocks(s->block[0]); for (i = 0; i < 6; i++) { - if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) + if (ff_msmpeg4_decode_block(ms, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) { av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); return -1; @@ -443,31 +445,31 @@ int ff_msmpeg4_decode_picture_header(MpegEncContext * s) switch(s->msmpeg4_version){ case MSMP4_V1: case MSMP4_V2: - s->rl_chroma_table_index = 2; - s->rl_table_index = 2; + ms->rl_chroma_table_index = 2; + ms->rl_table_index = 2; - s->dc_table_index = 0; //not used + ms->dc_table_index = 0; //not used break; case MSMP4_V3: - s->rl_chroma_table_index = decode012(&s->gb); - s->rl_table_index = decode012(&s->gb); + ms->rl_chroma_table_index = decode012(&s->gb); + ms->rl_table_index = decode012(&s->gb); - s->dc_table_index = get_bits1(&s->gb); + ms->dc_table_index = get_bits1(&s->gb); break; case MSMP4_WMV1: ff_msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8); if (ms->bit_rate > MBAC_BITRATE) - s->per_mb_rl_table = get_bits1(&s->gb); + ms->per_mb_rl_table = get_bits1(&s->gb); else - s->per_mb_rl_table = 0; + ms->per_mb_rl_table = 0; - if(!s->per_mb_rl_table){ - s->rl_chroma_table_index = decode012(&s->gb); - s->rl_table_index = decode012(&s->gb); + if (!ms->per_mb_rl_table) { + ms->rl_chroma_table_index = decode012(&s->gb); + ms->rl_table_index = decode012(&s->gb); } - s->dc_table_index = get_bits1(&s->gb); + ms->dc_table_index = get_bits1(&s->gb); s->inter_intra_pred= 0; break; } @@ -475,49 +477,49 @@ int ff_msmpeg4_decode_picture_header(MpegEncContext * s) if(s->avctx->debug&FF_DEBUG_PICT_INFO) av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n", s->qscale, - s->rl_chroma_table_index, - s->rl_table_index, - s->dc_table_index, - s->per_mb_rl_table, + ms->rl_chroma_table_index, + ms->rl_table_index, + ms->dc_table_index, + ms->per_mb_rl_table, s->slice_height); } else { switch(s->msmpeg4_version){ case MSMP4_V1: case MSMP4_V2: if (s->msmpeg4_version == MSMP4_V1) - s->use_skip_mb_code = 1; + ms->use_skip_mb_code = 1; else - s->use_skip_mb_code = get_bits1(&s->gb); - s->rl_table_index = 2; - s->rl_chroma_table_index = s->rl_table_index; - s->dc_table_index = 0; //not used - s->mv_table_index = 0; + ms->use_skip_mb_code = get_bits1(&s->gb); + ms->rl_table_index = 2; + ms->rl_chroma_table_index = ms->rl_table_index; + ms->dc_table_index = 0; //not used + ms->mv_table_index = 0; break; case MSMP4_V3: - s->use_skip_mb_code = get_bits1(&s->gb); - s->rl_table_index = decode012(&s->gb); - s->rl_chroma_table_index = s->rl_table_index; + ms->use_skip_mb_code = get_bits1(&s->gb); + ms->rl_table_index = decode012(&s->gb); + ms->rl_chroma_table_index = ms->rl_table_index; - s->dc_table_index = get_bits1(&s->gb); + ms->dc_table_index = get_bits1(&s->gb); - s->mv_table_index = get_bits1(&s->gb); + ms->mv_table_index = get_bits1(&s->gb); break; case MSMP4_WMV1: - s->use_skip_mb_code = get_bits1(&s->gb); + ms->use_skip_mb_code = get_bits1(&s->gb); if (ms->bit_rate > MBAC_BITRATE) - s->per_mb_rl_table = get_bits1(&s->gb); + ms->per_mb_rl_table = get_bits1(&s->gb); else - s->per_mb_rl_table = 0; + ms->per_mb_rl_table = 0; - if(!s->per_mb_rl_table){ - s->rl_table_index = decode012(&s->gb); - s->rl_chroma_table_index = s->rl_table_index; + if (!ms->per_mb_rl_table) { + ms->rl_table_index = decode012(&s->gb); + ms->rl_chroma_table_index = ms->rl_table_index; } - s->dc_table_index = get_bits1(&s->gb); + ms->dc_table_index = get_bits1(&s->gb); - s->mv_table_index = get_bits1(&s->gb); + ms->mv_table_index = get_bits1(&s->gb); s->inter_intra_pred = s->width*s->height < 320*240 && ms->bit_rate <= II_BITRATE; break; @@ -525,12 +527,12 @@ int ff_msmpeg4_decode_picture_header(MpegEncContext * s) if(s->avctx->debug&FF_DEBUG_PICT_INFO) av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n", - s->use_skip_mb_code, - s->rl_table_index, - s->rl_chroma_table_index, - s->dc_table_index, - s->mv_table_index, - s->per_mb_rl_table, + ms->use_skip_mb_code, + ms->rl_table_index, + ms->rl_chroma_table_index, + ms->dc_table_index, + ms->mv_table_index, + ms->per_mb_rl_table, s->qscale); if(s->flipflop_rounding){ @@ -542,8 +544,8 @@ int ff_msmpeg4_decode_picture_header(MpegEncContext * s) ff_dlog(s->avctx, "%d %d %d %d %d\n", s->pict_type, ms->bit_rate, s->inter_intra_pred, s->width, s->height); - s->esc3_level_length= 0; - s->esc3_run_length= 0; + ms->esc3_level_length = 0; + ms->esc3_run_length = 0; return 0; } @@ -577,8 +579,9 @@ int ff_msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size) return 0; } -static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) +static int msmpeg4_decode_dc(MSMP4DecContext *const ms, int n, int *dir_ptr) { + MpegEncContext *const s = &ms->m; int level, pred; if (s->msmpeg4_version <= MSMP4_V2) { @@ -594,7 +597,7 @@ static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) } level-=256; } else { - level = get_vlc2(&s->gb, ff_msmp4_dc_vlc[s->dc_table_index][n >= 4], + level = get_vlc2(&s->gb, ff_msmp4_dc_vlc[ms->dc_table_index][n >= 4], MSMP4_DC_VLC_BITS, 3); if (level == DC_MAX) { @@ -630,9 +633,10 @@ static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) return level; } -int ff_msmpeg4_decode_block(MpegEncContext * s, int16_t * block, +int ff_msmpeg4_decode_block(MSMP4DecContext *const ms, int16_t * block, int n, int coded, const uint8_t *scan_table) { + MpegEncContext *const s = &ms->m; int level, i, last, run, run_diff; int dc_pred_dir = -1; //unused but its passed around, so it needs to be initialized const RLTable *rl; @@ -644,20 +648,20 @@ int ff_msmpeg4_decode_block(MpegEncContext * s, int16_t * block, qadd=0; /* DC coef */ - level = msmpeg4_decode_dc(s, n, &dc_pred_dir); + level = msmpeg4_decode_dc(ms, n, &dc_pred_dir); if (level < 0){ av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale); if(s->inter_intra_pred) level=0; } if (n < 4) { - rl = &ff_rl_table[s->rl_table_index]; + rl = &ff_rl_table[ms->rl_table_index]; if(level > 256*s->y_dc_scale){ av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale); if(!s->inter_intra_pred) return -1; } } else { - rl = &ff_rl_table[3 + s->rl_chroma_table_index]; + rl = &ff_rl_table[3 + ms->rl_chroma_table_index]; if(level > 256*s->c_dc_scale){ av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale); if(!s->inter_intra_pred) return -1; @@ -683,7 +687,7 @@ int ff_msmpeg4_decode_block(MpegEncContext * s, int16_t * block, qmul = s->qscale << 1; qadd = (s->qscale - 1) | 1; i = -1; - rl = &ff_rl_table[3 + s->rl_table_index]; + rl = &ff_rl_table[3 + ms->rl_table_index]; if (s->msmpeg4_version == MSMP4_V2) run_diff = 0; @@ -721,7 +725,7 @@ int ff_msmpeg4_decode_block(MpegEncContext * s, int16_t * block, }else{ int sign; last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1); - if(!s->esc3_level_length){ + if (!ms->esc3_level_length) { int ll; ff_dlog(s->avctx, "ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y); @@ -739,18 +743,18 @@ int ff_msmpeg4_decode_block(MpegEncContext * s, int16_t * block, 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); + ms->esc3_level_length = ll; + ms->esc3_run_length = SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2); UPDATE_CACHE(re, &s->gb); } - run= SHOW_UBITS(re, &s->gb, s->esc3_run_length); - SKIP_BITS(re, &s->gb, s->esc3_run_length); + run = SHOW_UBITS(re, &s->gb, ms->esc3_run_length); + SKIP_BITS(re, &s->gb, ms->esc3_run_length); sign= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1); - level= SHOW_UBITS(re, &s->gb, s->esc3_level_length); - SKIP_BITS(re, &s->gb, s->esc3_level_length); + level = SHOW_UBITS(re, &s->gb, ms->esc3_level_length); + SKIP_BITS(re, &s->gb, ms->esc3_level_length); if(sign) level= -level; } @@ -814,9 +818,10 @@ int ff_msmpeg4_decode_block(MpegEncContext * s, int16_t * block, return 0; } -void ff_msmpeg4_decode_motion(MpegEncContext *s, int *mx_ptr, int *my_ptr) +void ff_msmpeg4_decode_motion(MSMP4DecContext *const ms, int *mx_ptr, int *my_ptr) { - const VLCElem *const mv_vlc = mv_tables[s->mv_table_index]; + const VLCElem *const mv_vlc = mv_tables[ms->mv_table_index]; + MpegEncContext *const s = &ms->m; int sym, mx, my; sym = get_vlc2(&s->gb, mv_vlc, MV_VLC_BITS, 2); diff --git a/libavcodec/msmpeg4dec.h b/libavcodec/msmpeg4dec.h index 47c4495f1d..b04331fd47 100644 --- a/libavcodec/msmpeg4dec.h +++ b/libavcodec/msmpeg4dec.h @@ -31,6 +31,14 @@ typedef struct MSMP4DecContext { MpegEncContext m; int bit_rate; + int mv_table_index; + int rl_table_index; + int rl_chroma_table_index; + int dc_table_index; + int use_skip_mb_code; + int per_mb_rl_table; + int esc3_level_length; + int esc3_run_length; } MSMP4DecContext; static inline MSMP4DecContext *mpv_to_msmpeg4(MpegEncContext *s) @@ -45,8 +53,8 @@ extern VLCElem ff_inter_intra_vlc[8]; int ff_msmpeg4_decode_init(AVCodecContext *avctx); int ff_msmpeg4_decode_picture_header(MpegEncContext *s); int ff_msmpeg4_decode_ext_header(MpegEncContext *s, int buf_size); -void ff_msmpeg4_decode_motion(MpegEncContext * s, int *mx_ptr, int *my_ptr); -int ff_msmpeg4_decode_block(MpegEncContext * s, int16_t * block, +void ff_msmpeg4_decode_motion(MSMP4DecContext *ms, int *mx_ptr, int *my_ptr); +int ff_msmpeg4_decode_block(MSMP4DecContext *ms, int16_t * block, int n, int coded, const uint8_t *scan_table); #endif diff --git a/libavcodec/msmpeg4enc.c b/libavcodec/msmpeg4enc.c index 0ab2e473aa..78197756ae 100644 --- a/libavcodec/msmpeg4enc.c +++ b/libavcodec/msmpeg4enc.c @@ -200,15 +200,15 @@ static void find_best_tables(MSMPEG4EncContext *ms) memset(ms->ac_stats, 0, sizeof(ms->ac_stats)); - s->rl_table_index = best; - s->rl_chroma_table_index= chroma_best; + ms->rl_table_index = best; + ms->rl_chroma_table_index = chroma_best; if(s->pict_type != s->last_non_b_pict_type){ - s->rl_table_index= 2; + ms->rl_table_index = 2; if(s->pict_type==AV_PICTURE_TYPE_I) - s->rl_chroma_table_index= 1; + ms->rl_chroma_table_index = 1; else - s->rl_chroma_table_index= 2; + ms->rl_chroma_table_index = 2; } } @@ -226,14 +226,14 @@ static int msmpeg4_encode_picture_header(MPVMainEncContext *const m) put_bits(&s->pb, 5, s->qscale); if (s->msmpeg4_version <= MSMP4_V2) { - s->rl_table_index = 2; - s->rl_chroma_table_index = 2; + ms->rl_table_index = 2; + ms->rl_chroma_table_index = 2; } - s->dc_table_index = 1; - 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; + ms->dc_table_index = 1; + ms->mv_table_index = 1; /* only if P-frame */ + ms->use_skip_mb_code = 1; /* only if P-frame */ + ms->per_mb_rl_table = 0; if (s->msmpeg4_version == MSMP4_WMV1) s->inter_intra_pred = s->width * s->height < 320*240 && m->bit_rate <= II_BITRATE && @@ -248,35 +248,35 @@ static int msmpeg4_encode_picture_header(MPVMainEncContext *const m) if (s->msmpeg4_version == MSMP4_WMV1) { ff_msmpeg4_encode_ext_header(s); if (m->bit_rate > MBAC_BITRATE) - put_bits(&s->pb, 1, s->per_mb_rl_table); + put_bits(&s->pb, 1, ms->per_mb_rl_table); } if (s->msmpeg4_version > MSMP4_V2) { - if(!s->per_mb_rl_table){ - ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index); - ff_msmpeg4_code012(&s->pb, s->rl_table_index); + if (!ms->per_mb_rl_table){ + ff_msmpeg4_code012(&s->pb, ms->rl_chroma_table_index); + ff_msmpeg4_code012(&s->pb, ms->rl_table_index); } - put_bits(&s->pb, 1, s->dc_table_index); + put_bits(&s->pb, 1, ms->dc_table_index); } } else { - put_bits(&s->pb, 1, s->use_skip_mb_code); + put_bits(&s->pb, 1, ms->use_skip_mb_code); if (s->msmpeg4_version == MSMP4_WMV1 && m->bit_rate > MBAC_BITRATE) - put_bits(&s->pb, 1, s->per_mb_rl_table); + put_bits(&s->pb, 1, ms->per_mb_rl_table); if (s->msmpeg4_version > MSMP4_V2) { - if(!s->per_mb_rl_table) - ff_msmpeg4_code012(&s->pb, s->rl_table_index); + if (!ms->per_mb_rl_table) + ff_msmpeg4_code012(&s->pb, ms->rl_table_index); - put_bits(&s->pb, 1, s->dc_table_index); + put_bits(&s->pb, 1, ms->dc_table_index); - put_bits(&s->pb, 1, s->mv_table_index); + put_bits(&s->pb, 1, ms->mv_table_index); } } - s->esc3_level_length= 0; - s->esc3_run_length= 0; + s->esc3_level_length = 0; + ms->esc3_run_length = 0; return 0; } @@ -308,10 +308,11 @@ FF_ENABLE_DEPRECATION_WARNINGS av_assert0(!s->flipflop_rounding); } -void ff_msmpeg4_encode_motion(MpegEncContext * s, +void ff_msmpeg4_encode_motion(MSMPEG4EncContext *const ms, int mx, int my) { - const uint32_t *const mv_vector_table = mv_vector_tables[s->mv_table_index]; + MpegEncContext *const s = &ms->m.s; + const uint32_t *const mv_vector_table = mv_vector_tables[ms->mv_table_index]; uint32_t code; /* modulo encoding */ @@ -382,6 +383,7 @@ static void msmpeg4_encode_mb(MpegEncContext *const s, int16_t block[][64], int motion_x, int motion_y) { + MSMPEG4EncContext *const ms = mpv_to_msmpeg4(s); int cbp, coded_cbp, i; int pred_x, pred_y; @@ -394,7 +396,7 @@ static void msmpeg4_encode_mb(MpegEncContext *const s, if (s->block_last_index[i] >= 0) cbp |= 1 << (5 - i); } - if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) { + if (ms->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) { /* skip macroblock */ put_bits(&s->pb, 1, 1); s->last_bits++; @@ -402,7 +404,7 @@ static void msmpeg4_encode_mb(MpegEncContext *const s, return; } - if (s->use_skip_mb_code) + if (ms->use_skip_mb_code) put_bits(&s->pb, 1, 0); /* mb coded */ if (s->msmpeg4_version <= MSMP4_V2) { @@ -430,8 +432,8 @@ static void msmpeg4_encode_mb(MpegEncContext *const s, /* motion vector */ ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); - ff_msmpeg4_encode_motion(s, motion_x - pred_x, - motion_y - pred_y); + ff_msmpeg4_encode_motion(ms, motion_x - pred_x, + motion_y - pred_y); } s->mv_bits += get_bits_diff(s); @@ -452,7 +454,7 @@ static void msmpeg4_encode_mb(MpegEncContext *const s, put_bits(&s->pb, ff_v2_intra_cbpc[cbp&3][1], ff_v2_intra_cbpc[cbp&3][0]); } else { - if (s->use_skip_mb_code) + if (ms->use_skip_mb_code) put_bits(&s->pb, 1, 0); /* mb coded */ put_bits(&s->pb, ff_v2_mb_type[(cbp&3) + 4][1], @@ -479,7 +481,7 @@ static void msmpeg4_encode_mb(MpegEncContext *const s, put_bits(&s->pb, ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]); } else { - if (s->use_skip_mb_code) + if (ms->use_skip_mb_code) put_bits(&s->pb, 1, 0); /* mb coded */ put_bits(&s->pb, ff_table_mb_non_intra[cbp][1], @@ -501,8 +503,9 @@ static void msmpeg4_encode_mb(MpegEncContext *const s, } } -static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr) +static void msmpeg4_encode_dc(MSMPEG4EncContext *const ms, int level, int n, int *dir_ptr) { + MpegEncContext *const s = &ms->m.s; int sign, code; int pred; @@ -539,8 +542,8 @@ static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr if (code > DC_MAX) code = DC_MAX; - put_bits(&s->pb, ff_msmp4_dc_tables[s->dc_table_index][n >= 4][code][1], - ff_msmp4_dc_tables[s->dc_table_index][n >= 4][code][0]); + put_bits(&s->pb, ff_msmp4_dc_tables[ms->dc_table_index][n >= 4][code][1], + ff_msmp4_dc_tables[ms->dc_table_index][n >= 4][code][0]); if (code == DC_MAX) put_bits(&s->pb, 8, level); @@ -563,18 +566,18 @@ void ff_msmpeg4_encode_block(MpegEncContext * s, int16_t * block, int n) const uint8_t *scantable; if (s->mb_intra) { - msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir); + msmpeg4_encode_dc(ms, block[0], n, &dc_pred_dir); i = 1; if (n < 4) { - rl = &ff_rl_table[s->rl_table_index]; + rl = &ff_rl_table[ms->rl_table_index]; } else { - rl = &ff_rl_table[3 + s->rl_chroma_table_index]; + rl = &ff_rl_table[3 + ms->rl_chroma_table_index]; } run_diff = s->msmpeg4_version >= MSMP4_WMV1; scantable= s->intra_scantable.permutated; } else { i = 0; - rl = &ff_rl_table[3 + s->rl_table_index]; + rl = &ff_rl_table[3 + ms->rl_table_index]; run_diff = s->msmpeg4_version > MSMP4_V2; scantable= s->inter_scantable.permutated; } @@ -635,16 +638,16 @@ void ff_msmpeg4_encode_block(MpegEncContext * s, int16_t * block, int n) put_bits(&s->pb, 1, 0); put_bits(&s->pb, 1, last); if (s->msmpeg4_version >= MSMP4_WMV1) { - if(s->esc3_level_length==0){ - s->esc3_level_length=8; - s->esc3_run_length= 6; + if (s->esc3_level_length == 0) { + s->esc3_level_length = 8; + ms->esc3_run_length = 6; //ESCLVLSZ + ESCRUNSZ if(s->qscale<8) put_bits(&s->pb, 6, 3); else put_bits(&s->pb, 8, 3); } - put_bits(&s->pb, s->esc3_run_length, run); + put_bits(&s->pb, ms->esc3_run_length, run); put_bits(&s->pb, 1, sign); put_bits(&s->pb, s->esc3_level_length, level); }else{ diff --git a/libavcodec/msmpeg4enc.h b/libavcodec/msmpeg4enc.h index dde1fb6b93..bce1265bb5 100644 --- a/libavcodec/msmpeg4enc.h +++ b/libavcodec/msmpeg4enc.h @@ -29,15 +29,29 @@ typedef struct MSMPEG4EncContext { MPVMainEncContext m; + int mv_table_index; + int rl_table_index; + int rl_chroma_table_index; + int dc_table_index; + int use_skip_mb_code; + int per_mb_rl_table; + int esc3_run_length; + /** [mb_intra][isChroma][level][run][last] */ unsigned ac_stats[2][2][MAX_LEVEL + 1][MAX_RUN + 1][2]; } MSMPEG4EncContext; +static inline MSMPEG4EncContext *mpv_to_msmpeg4(MpegEncContext *s) +{ + // Only legal because no MSMPEG-4 decoder uses slice-threading. + return (MSMPEG4EncContext*)s; +} + void ff_msmpeg4_encode_init(MPVMainEncContext *m); void ff_msmpeg4_encode_ext_header(MpegEncContext *s); void ff_msmpeg4_encode_block(MpegEncContext * s, int16_t * block, int n); void ff_msmpeg4_handle_slices(MpegEncContext *s); -void ff_msmpeg4_encode_motion(MpegEncContext * s, int mx, int my); +void ff_msmpeg4_encode_motion(MSMPEG4EncContext *ms, int mx, int my); void ff_msmpeg4_code012(PutBitContext *pb, int n); diff --git a/libavcodec/vaapi_vc1.c b/libavcodec/vaapi_vc1.c index 6c25fdb5fa..f2285c396b 100644 --- a/libavcodec/vaapi_vc1.c +++ b/libavcodec/vaapi_vc1.c @@ -343,7 +343,7 @@ static int vaapi_vc1_start_frame(AVCodecContext *avctx, .mv_fields.bits = { .mv_mode = vc1_get_MVMODE(v), .mv_mode2 = vc1_get_MVMODE2(v), - .mv_table = (v->fcm == PROGRESSIVE ? s->mv_table_index : v->imvtab), + .mv_table = (v->fcm == PROGRESSIVE ? v->mv_table_index : v->imvtab), .two_mv_block_pattern_table = v->twomvbptab, .four_mv_switch = v->fourmvswitch, .four_mv_block_pattern_table = v->fourmvbptab, @@ -371,7 +371,7 @@ static int vaapi_vc1_start_frame(AVCodecContext *avctx, .frame_level_transform_type = vc1_get_TTFRM(v), .transform_ac_codingset_idx1 = v->c_ac_table_index, .transform_ac_codingset_idx2 = v->y_ac_table_index, - .intra_transform_dc_table = v->s.dc_table_index, + .intra_transform_dc_table = v->dc_table_index, }, }; diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index dec3e16ea2..1d642cc7f6 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -765,7 +765,7 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) return AVERROR_INVALIDDATA; /* Hopefully this is correct for P-frames */ - v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables + v->mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables v->cbptab = get_bits(gb, 2); v->cbpcy_vlc = ff_vc1_cbpcy_p_vlc[v->cbptab]; @@ -804,7 +804,7 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " "Imode: %i, Invert: %i\n", status>>1, status&1); - v->s.mv_table_index = get_bits(gb, 2); + v->mv_table_index = get_bits(gb, 2); v->cbptab = get_bits(gb, 2); v->cbpcy_vlc = ff_vc1_cbpcy_p_vlc[v->cbptab]; @@ -833,7 +833,7 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) v->y_ac_table_index = decode012(gb); } /* DC Syntax */ - v->s.dc_table_index = get_bits1(gb); + v->dc_table_index = get_bits1(gb); } if (v->s.pict_type == AV_PICTURE_TYPE_BI) { @@ -1158,7 +1158,7 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) "Imode: %i, Invert: %i\n", status>>1, status&1); /* Hopefully this is correct for P-frames */ - v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables + v->mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables v->cbptab = get_bits(gb, 2); v->cbpcy_vlc = ff_vc1_cbpcy_p_vlc[v->cbptab]; } else if (v->fcm == ILACE_FRAME) { // frame interlaced @@ -1295,7 +1295,7 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) return -1; av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " "Imode: %i, Invert: %i\n", status>>1, status&1); - v->s.mv_table_index = get_bits(gb, 2); + v->mv_table_index = get_bits(gb, 2); v->cbptab = get_bits(gb, 2); v->cbpcy_vlc = ff_vc1_cbpcy_p_vlc[v->cbptab]; } @@ -1330,7 +1330,7 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) } /* DC Syntax */ - v->s.dc_table_index = get_bits1(gb); + v->dc_table_index = get_bits1(gb); if ((v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) && v->dquant) { av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h index b7339bcd5f..e8762350a2 100644 --- a/libavcodec/vc1.h +++ b/libavcodec/vc1.h @@ -246,6 +246,7 @@ typedef struct VC1Context{ uint8_t dqsbedge; uint8_t dqbilevel; //@} + int dc_table_index; /** AC coding set indexes * @see 8.1.1.10, p(1)10 */ @@ -253,6 +254,8 @@ typedef struct VC1Context{ int c_ac_table_index; ///< Chroma index from ACFRM element int y_ac_table_index; ///< Luma index from AC2FRM element //@} + int esc3_level_length; + int esc3_run_length; int ttfrm; ///< Transform type info present at frame level uint8_t ttmbf; ///< Transform type flag int *ttblk_base, *ttblk; ///< Transform type at the block level @@ -282,6 +285,7 @@ typedef struct VC1Context{ uint8_t pquantizer; ///< Uniform (over sequence) quantizer in use const VLCElem *cbpcy_vlc; ///< CBPCY VLC table int tt_index; ///< Index for Transform Type tables (to decode TTMB) + int mv_table_index; uint8_t* mv_type_mb_plane; ///< bitplane for mv_type == (4MV) uint8_t* direct_mb_plane; ///< bitplane for "direct" MBs uint8_t* forward_mb_plane; ///< bitplane for "forward" MBs diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index 26adfbca1d..1661fdd742 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -227,7 +227,7 @@ static void vc1_put_blocks_clamped(VC1Context *v, int put_signed) * @param _dmv_y Vertical differential for decoded MV */ #define GET_MVDATA(_dmv_x, _dmv_y) \ - index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index], \ + index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[v->mv_table_index], \ VC1_MV_DIFF_VLC_BITS, 2); \ if (index > 36) { \ mb_has_coeffs = 1; \ @@ -549,19 +549,19 @@ static int vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, sign = get_bits1(gb); } else { lst = get_bits1(gb); - if (v->s.esc3_level_length == 0) { + if (v->esc3_level_length == 0) { if (v->pq < 8 || v->dquantfrm) { // table 59 - v->s.esc3_level_length = get_bits(gb, 3); - if (!v->s.esc3_level_length) - v->s.esc3_level_length = get_bits(gb, 2) + 8; + v->esc3_level_length = get_bits(gb, 3); + if (!v->esc3_level_length) + v->esc3_level_length = get_bits(gb, 2) + 8; } else { // table 60 - v->s.esc3_level_length = get_unary(gb, 1, 6) + 2; + v->esc3_level_length = get_unary(gb, 1, 6) + 2; } - v->s.esc3_run_length = 3 + get_bits(gb, 2); + v->esc3_run_length = 3 + get_bits(gb, 2); } - run = get_bits(gb, v->s.esc3_run_length); + run = get_bits(gb, v->esc3_run_length); sign = get_bits1(gb); - level = get_bits(gb, v->s.esc3_level_length); + level = get_bits(gb, v->esc3_level_length); } } @@ -590,7 +590,7 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, int dcdiff, scale; /* Get DC differential */ - dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[s->dc_table_index][n >= 4], + dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[v->dc_table_index][n >= 4], MSMP4_DC_VLC_BITS, 3); if (dcdiff) { const int m = (v->pq == 1 || v->pq == 2) ? 3 - v->pq : 0; @@ -723,7 +723,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n, int quant = FFABS(mquant); /* Get DC differential */ - dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[s->dc_table_index][n >= 4], + dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[v->dc_table_index][n >= 4], MSMP4_DC_VLC_BITS, 3); if (dcdiff) { const int m = (quant == 1 || quant == 2) ? 3 - quant : 0; @@ -911,7 +911,7 @@ static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n, s->y_dc_scale = ff_wmv3_dc_scale_table[quant]; /* Get DC differential */ - dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[s->dc_table_index][n >= 4], + dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_vlc[v->dc_table_index][n >= 4], MSMP4_DC_VLC_BITS, 3); if (dcdiff) { const int m = (quant == 1 || quant == 2) ? 3 - quant : 0; @@ -2946,7 +2946,7 @@ static void vc1_decode_skip_blocks(VC1Context *v) void ff_vc1_decode_blocks(VC1Context *v) { - v->s.esc3_level_length = 0; + v->esc3_level_length = 0; if (v->x8_type) { ff_intrax8_decode_picture(&v->x8, v->s.cur_pic.ptr, &v->s.gb, &v->s.mb_x, &v->s.mb_y, diff --git a/libavcodec/wmv2dec.c b/libavcodec/wmv2dec.c index 02c3dc2535..964d6a4c06 100644 --- a/libavcodec/wmv2dec.c +++ b/libavcodec/wmv2dec.c @@ -248,16 +248,16 @@ int ff_wmv2_decode_secondary_picture_header(MpegEncContext *s) if (!w->j_type) { if (w->per_mb_rl_bit) - s->per_mb_rl_table = get_bits1(&s->gb); + w->ms.per_mb_rl_table = get_bits1(&s->gb); else - s->per_mb_rl_table = 0; + w->ms.per_mb_rl_table = 0; - if (!s->per_mb_rl_table) { - s->rl_chroma_table_index = decode012(&s->gb); - s->rl_table_index = decode012(&s->gb); + if (!w->ms.per_mb_rl_table) { + w->ms.rl_chroma_table_index = decode012(&s->gb); + w->ms.rl_table_index = decode012(&s->gb); } - s->dc_table_index = get_bits1(&s->gb); + w->ms.dc_table_index = get_bits1(&s->gb); // at minimum one bit per macroblock is required at least in a valid frame, // we discard frames much smaller than this. Frames smaller than 1/8 of the @@ -272,8 +272,8 @@ int ff_wmv2_decode_secondary_picture_header(MpegEncContext *s) if (s->avctx->debug & FF_DEBUG_PICT_INFO) { av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d j_type:%d \n", - s->qscale, s->rl_chroma_table_index, s->rl_table_index, - s->dc_table_index, s->per_mb_rl_table, w->j_type); + s->qscale, w->ms.rl_chroma_table_index, w->ms.rl_table_index, + w->ms.dc_table_index, w->ms.per_mb_rl_table, w->j_type); } } else { int cbp_index; @@ -298,20 +298,20 @@ int ff_wmv2_decode_secondary_picture_header(MpegEncContext *s) } if (w->per_mb_rl_bit) - s->per_mb_rl_table = get_bits1(&s->gb); + w->ms.per_mb_rl_table = get_bits1(&s->gb); else - s->per_mb_rl_table = 0; + w->ms.per_mb_rl_table = 0; - if (!s->per_mb_rl_table) { - s->rl_table_index = decode012(&s->gb); - s->rl_chroma_table_index = s->rl_table_index; + if (!w->ms.per_mb_rl_table) { + w->ms.rl_table_index = decode012(&s->gb); + w->ms.rl_chroma_table_index = w->ms.rl_table_index; } if (get_bits_left(&s->gb) < 2) return AVERROR_INVALIDDATA; - s->dc_table_index = get_bits1(&s->gb); - s->mv_table_index = get_bits1(&s->gb); + w->ms.dc_table_index = get_bits1(&s->gb); + w->ms.mv_table_index = get_bits1(&s->gb); s->inter_intra_pred = 0; // (s->width * s->height < 320 * 240 && w->ms.bit_rate <= II_BITRATE); s->no_rounding ^= 1; @@ -320,15 +320,15 @@ int ff_wmv2_decode_secondary_picture_header(MpegEncContext *s) av_log(s->avctx, AV_LOG_DEBUG, "rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d mspel:%d " "per_mb_abt:%d abt_type:%d cbp:%d ii:%d\n", - s->rl_table_index, s->rl_chroma_table_index, - s->dc_table_index, s->mv_table_index, - s->per_mb_rl_table, s->qscale, s->mspel, + w->ms.rl_table_index, w->ms.rl_chroma_table_index, + w->ms.dc_table_index, w->ms.mv_table_index, + w->ms.per_mb_rl_table, s->qscale, s->mspel, w->per_mb_abt, w->abt_type, w->cbp_table_index, s->inter_intra_pred); } } - s->esc3_level_length = 0; - s->esc3_run_length = 0; + w->ms.esc3_level_length = 0; + w->ms.esc3_run_length = 0; if (w->j_type) { ff_intrax8_decode_picture(&w->x8, s->cur_pic.ptr, @@ -349,7 +349,7 @@ static inline void wmv2_decode_motion(WMV2DecContext *w, int *mx_ptr, int *my_pt { MpegEncContext *const s = &w->ms.m; - ff_msmpeg4_decode_motion(s, mx_ptr, my_ptr); + ff_msmpeg4_decode_motion(&w->ms, mx_ptr, my_ptr); if ((((*mx_ptr) | (*my_ptr)) & 1) && s->mspel) w->common.hshift = get_bits1(&s->gb); @@ -423,19 +423,23 @@ static inline int wmv2_decode_inter_block(WMV2DecContext *w, int16_t *block, sub_cbp = sub_cbp_table[decode012(&s->gb)]; - if (sub_cbp & 1) - if ((ret = ff_msmpeg4_decode_block(s, block, n, 1, scantable)) < 0) + if (sub_cbp & 1) { + ret = ff_msmpeg4_decode_block(&w->ms, block, n, 1, scantable); + if (ret < 0) return ret; + } - if (sub_cbp & 2) - if ((ret = ff_msmpeg4_decode_block(s, w->abt_block2[n], n, 1, scantable)) < 0) + if (sub_cbp & 2) { + ret = ff_msmpeg4_decode_block(&w->ms, w->abt_block2[n], n, 1, scantable); + if (ret < 0) return ret; + } s->block_last_index[n] = 63; return 0; } else { - return ff_msmpeg4_decode_block(s, block, n, 1, + return ff_msmpeg4_decode_block(&w->ms, block, n, 1, s->inter_scantable.permutated); } } @@ -445,6 +449,7 @@ static int wmv2_decode_mb(MpegEncContext *s, int16_t block[6][64]) /* The following is only allowed because this encoder * does not use slice threading. */ WMV2DecContext *const w = (WMV2DecContext *) s; + MSMP4DecContext *const ms = &w->ms; int cbp, code, i, ret; uint8_t *coded_val; @@ -498,9 +503,9 @@ static int wmv2_decode_mb(MpegEncContext *s, int16_t block[6][64]) if (cbp) { s->bdsp.clear_blocks(s->block[0]); - if (s->per_mb_rl_table) { - s->rl_table_index = decode012(&s->gb); - s->rl_chroma_table_index = s->rl_table_index; + if (ms->per_mb_rl_table) { + ms->rl_table_index = decode012(&s->gb); + ms->rl_chroma_table_index = ms->rl_table_index; } if (w->abt_flag && w->per_mb_abt) { @@ -539,14 +544,15 @@ static int wmv2_decode_mb(MpegEncContext *s, int16_t block[6][64]) ff_dlog(s->avctx, "%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y); } - if (s->per_mb_rl_table && cbp) { - s->rl_table_index = decode012(&s->gb); - s->rl_chroma_table_index = s->rl_table_index; + if (ms->per_mb_rl_table && cbp) { + ms->rl_table_index = decode012(&s->gb); + ms->rl_chroma_table_index = ms->rl_table_index; } s->bdsp.clear_blocks(s->block[0]); for (i = 0; i < 6; i++) { - if ((ret = ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL)) < 0) { + ret = ff_msmpeg4_decode_block(ms, block[i], i, (cbp >> (5 - i)) & 1, NULL); + if (ret < 0) { av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding intra block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); diff --git a/libavcodec/wmv2enc.c b/libavcodec/wmv2enc.c index 6eda38d05f..81b0ace053 100644 --- a/libavcodec/wmv2enc.c +++ b/libavcodec/wmv2enc.c @@ -75,6 +75,7 @@ static int encode_ext_header(WMV2EncContext *w) static int wmv2_encode_picture_header(MPVMainEncContext *const m) { WMV2EncContext *const w = (WMV2EncContext *) m; + MSMPEG4EncContext *const ms = &w->msmpeg4; MpegEncContext *const s = &m->s; put_bits(&s->pb, 1, s->pict_type - 1); @@ -82,9 +83,9 @@ static int wmv2_encode_picture_header(MPVMainEncContext *const m) put_bits(&s->pb, 7, 0); put_bits(&s->pb, 5, s->qscale); - s->dc_table_index = 1; - s->mv_table_index = 1; /* only if P-frame */ - s->per_mb_rl_table = 0; + ms->dc_table_index = 1; + ms->mv_table_index = 1; /* only if P-frame */ + ms->per_mb_rl_table = 0; s->mspel = 0; w->per_mb_abt = 0; w->abt_type = 0; @@ -98,14 +99,14 @@ static int wmv2_encode_picture_header(MPVMainEncContext *const m) put_bits(&s->pb, 1, w->j_type); if (w->per_mb_rl_bit) - put_bits(&s->pb, 1, s->per_mb_rl_table); + put_bits(&s->pb, 1, ms->per_mb_rl_table); - if (!s->per_mb_rl_table) { - ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index); - ff_msmpeg4_code012(&s->pb, s->rl_table_index); + if (!ms->per_mb_rl_table) { + ff_msmpeg4_code012(&s->pb, ms->rl_chroma_table_index); + ff_msmpeg4_code012(&s->pb, ms->rl_table_index); } - put_bits(&s->pb, 1, s->dc_table_index); + put_bits(&s->pb, 1, ms->dc_table_index); s->inter_intra_pred = 0; } else { @@ -126,19 +127,19 @@ static int wmv2_encode_picture_header(MPVMainEncContext *const m) } if (w->per_mb_rl_bit) - put_bits(&s->pb, 1, s->per_mb_rl_table); + put_bits(&s->pb, 1, ms->per_mb_rl_table); - if (!s->per_mb_rl_table) { - ff_msmpeg4_code012(&s->pb, s->rl_table_index); - s->rl_chroma_table_index = s->rl_table_index; + if (!ms->per_mb_rl_table) { + ff_msmpeg4_code012(&s->pb, ms->rl_table_index); + ms->rl_chroma_table_index = ms->rl_table_index; } - put_bits(&s->pb, 1, s->dc_table_index); - put_bits(&s->pb, 1, s->mv_table_index); + put_bits(&s->pb, 1, ms->dc_table_index); + put_bits(&s->pb, 1, ms->mv_table_index); s->inter_intra_pred = 0; // (s->width * s->height < 320 * 240 && m->bit_rate <= II_BITRATE); } s->esc3_level_length = 0; - s->esc3_run_length = 0; + ms->esc3_run_length = 0; return 0; } @@ -170,7 +171,7 @@ static void wmv2_encode_mb(MpegEncContext *const s, int16_t block[][64], s->misc_bits += get_bits_diff(s); /* motion vector */ ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); - ff_msmpeg4_encode_motion(s, motion_x - pred_x, + ff_msmpeg4_encode_motion(&w->msmpeg4, motion_x - pred_x, motion_y - pred_y); s->mv_bits += get_bits_diff(s); } else { -- 2.45.2