From 4712c5a9d583c529eeedf21b6f06edd0425f5d0c Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> Date: Mon, 7 Feb 2022 10:24:38 +0100 Subject: [PATCH 31/77] avcodec/mpegvideo: Move fcode_tab to MPVMainEncContext Only used by the main encoding thread. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavcodec/ituh263enc.c | 2 +- libavcodec/motion_est.c | 6 ++++-- libavcodec/motion_est.h | 3 ++- libavcodec/mpeg12enc.c | 2 +- libavcodec/mpeg4videoenc.c | 2 +- libavcodec/mpegvideo.h | 1 - libavcodec/mpegvideo_enc.c | 23 ++++++++++++----------- libavcodec/mpegvideoenc.h | 2 ++ 8 files changed, 23 insertions(+), 18 deletions(-) diff --git a/libavcodec/ituh263enc.c b/libavcodec/ituh263enc.c index c82e0ceffd..739f959e40 100644 --- a/libavcodec/ituh263enc.c +++ b/libavcodec/ituh263enc.c @@ -848,7 +848,7 @@ av_cold void ff_h263_encode_init(MPVMainEncContext *const m) break; case AV_CODEC_ID_H263P: if(s->umvplus) - s->fcode_tab = umv_fcode_tab + MAX_MV; + m->fcode_tab = umv_fcode_tab + MAX_MV; if(s->modified_quant){ s->min_qcoeff= -2047; s->max_qcoeff= 2047; diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c index f7c8305847..7c08fe53eb 100644 --- a/libavcodec/motion_est.c +++ b/libavcodec/motion_est.c @@ -1596,12 +1596,14 @@ void ff_estimate_b_frame_motion(MpegEncContext * s, } /* find best f_code for ME which do unlimited searches */ -int ff_get_best_fcode(MpegEncContext * s, const int16_t (*mv_table)[2], int type) +int ff_get_best_fcode(MPVMainEncContext *const m, const int16_t (*mv_table)[2], int type) { + MpegEncContext *const s = &m->s; + if (s->motion_est != FF_ME_ZERO) { int score[8]; int i, y, range= s->avctx->me_range ? s->avctx->me_range : (INT_MAX/2); - const uint8_t * fcode_tab = s->fcode_tab; + const uint8_t * fcode_tab = m->fcode_tab; int best_fcode=-1; int best_score=-10000000; diff --git a/libavcodec/motion_est.h b/libavcodec/motion_est.h index 12f7cd43ab..d8a2cab3a0 100644 --- a/libavcodec/motion_est.h +++ b/libavcodec/motion_est.h @@ -29,6 +29,7 @@ #include "qpeldsp.h" struct MpegEncContext; +typedef struct MPVMainEncContext MPVMainEncContext; #if ARCH_IA64 // Limit static arrays to avoid gcc failing "short data segment overflowed" #define MAX_MV 1024 @@ -136,7 +137,7 @@ int ff_epzs_motion_search(struct MpegEncContext *s, int *mx_ptr, int *my_ptr, int ff_get_mb_score(struct MpegEncContext *s, int mx, int my, int src_index, int ref_index, int size, int h, int add_rate); -int ff_get_best_fcode(struct MpegEncContext *s, +int ff_get_best_fcode(MPVMainEncContext *m, const int16_t (*mv_table)[2], int type); void ff_fix_long_p_mvs(struct MpegEncContext *s, int type); diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c index f28a41f5ff..b67f70c5cd 100644 --- a/libavcodec/mpeg12enc.c +++ b/libavcodec/mpeg12enc.c @@ -1113,7 +1113,7 @@ static av_cold int encode_init(AVCodecContext *avctx) m->encode_picture_header = mpeg1_encode_picture_header; s->me.mv_penalty = mv_penalty; - s->fcode_tab = fcode_tab + MAX_MV; + m->fcode_tab = fcode_tab + MAX_MV; if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) { s->min_qcoeff = -255; s->max_qcoeff = 255; diff --git a/libavcodec/mpeg4videoenc.c b/libavcodec/mpeg4videoenc.c index f34ea1fcb4..cc3c676e18 100644 --- a/libavcodec/mpeg4videoenc.c +++ b/libavcodec/mpeg4videoenc.c @@ -1319,7 +1319,7 @@ static av_cold int encode_init(AVCodecContext *avctx) m4->time_increment_bits = av_log2(avctx->time_base.den - 1) + 1; - s->fcode_tab = fcode_tab + MAX_MV; + m->fcode_tab = fcode_tab + MAX_MV; s->min_qcoeff = -2048; s->max_qcoeff = 2047; diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index fcc51af41a..49e8159769 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -253,7 +253,6 @@ typedef struct MpegEncContext { int mv[2][4][2]; int field_select[2][2]; int last_mv[2][2][2]; ///< last MV, used for MV prediction in MPEG-1 & B-frame MPEG-4 - const uint8_t *fcode_tab; ///< smallest fcode needed for each MV int16_t direct_scale_mv[2][64]; ///< precomputed to avoid divisions in ff_mpeg4_set_direct_mv MotionEstContext me; diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 03a8ae2687..08fc72edb4 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -278,14 +278,15 @@ static av_cold void mpv_encode_init_static(void) /** * Set the given MpegEncContext to defaults for encoding. */ -static av_cold void mpv_encode_defaults(MpegEncContext *s) +static av_cold void mpv_encode_defaults(MPVMainEncContext *const m) { + MpegEncContext *const s = &m->s; static AVOnce init_static_once = AV_ONCE_INIT; ff_mpv_common_defaults(s); - if (!s->fcode_tab) { - s->fcode_tab = default_fcode_tab + MAX_MV; + if (!m->fcode_tab) { + m->fcode_tab = default_fcode_tab + MAX_MV; ff_thread_once(&init_static_once, mpv_encode_init_static); } if (!s->y_dc_scale_table) { @@ -429,7 +430,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) int i, ret; int mb_array_size, mv_table_size; - mpv_encode_defaults(s); + mpv_encode_defaults(m); switch (avctx->pix_fmt) { case AV_PIX_FMT_YUVJ444P: @@ -3774,12 +3775,12 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt) if(!s->umvplus){ if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) { - s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER); + s->f_code = ff_get_best_fcode(m, s->p_mv_table, CANDIDATE_MB_TYPE_INTER); if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) { int a,b; - a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select - b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I); + a = ff_get_best_fcode(m, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select + b = ff_get_best_fcode(m, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I); s->f_code= FFMAX3(s->f_code, a, b); } @@ -3796,12 +3797,12 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt) } else if (s->pict_type == AV_PICTURE_TYPE_B) { int a, b; - a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD); - b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR); + a = ff_get_best_fcode(m, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD); + b = ff_get_best_fcode(m, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR); s->f_code = FFMAX(a, b); - a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD); - b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR); + a = ff_get_best_fcode(m, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD); + b = ff_get_best_fcode(m, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR); s->b_code = FFMAX(a, b); ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1); diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h index cd82b16590..4b74f8eb46 100644 --- a/libavcodec/mpegvideoenc.h +++ b/libavcodec/mpegvideoenc.h @@ -67,6 +67,8 @@ typedef struct MPVMainEncContext { int lmin, lmax; int vbv_ignore_qmax; + const uint8_t *fcode_tab; ///< smallest fcode needed for each MV + /* frame skip options */ int frame_skip_threshold; int frame_skip_factor; -- 2.45.2