From 626b8ecf0e9767a11ca419ab0e56a2926c744dd4 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> Date: Sat, 29 Jan 2022 05:34:14 +0100 Subject: [PATCH 27/77] avcodec/mpegvideo: Move header_bits to MPVMainEncContext The header is always written by the main thread, so it is not surprising that header_bits can be moved to MPVMainEncContext as well. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavcodec/mjpegenc.c | 10 +++++++--- libavcodec/mpegvideo.h | 1 - libavcodec/mpegvideo_enc.c | 6 +++--- libavcodec/mpegvideoenc.h | 1 + libavcodec/ratecontrol.c | 2 +- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c index 6f9818baf2..a77a703f53 100644 --- a/libavcodec/mjpegenc.c +++ b/libavcodec/mjpegenc.c @@ -119,8 +119,9 @@ void ff_mjpeg_amv_encode_picture_header(MpegEncContext *s) * * @param s The MpegEncContext. */ -static void mjpeg_encode_picture_frame(MpegEncContext *s) +static void mjpeg_encode_picture_frame(MPVMainEncContext *const main) { + MpegEncContext *const s = &main->s; int nbits, code, table_id; MJpegContext *m = s->mjpeg_ctx; uint8_t *huff_size[4] = { m->huff_size_dc_luminance, @@ -134,7 +135,7 @@ static void mjpeg_encode_picture_frame(MpegEncContext *s) size_t total_bits = 0; size_t bytes_needed; - s->header_bits = get_bits_diff(s); + main->header_bits = get_bits_diff(s); // Estimate the total size first for (int i = 0; i < m->huff_ncode; i++) { table_id = m->huff_buffer[i].table_id; @@ -240,6 +241,9 @@ int ff_mjpeg_encode_stuffing(MpegEncContext *s) #if CONFIG_MJPEG_ENCODER if (m->huffman == HUFFMAN_TABLE_OPTIMAL) { + /* HUFFMAN_TABLE_OPTIMAL is incompatible with slice threading, + * therefore the following cast is allowed. */ + MPVMainEncContext *const main = (MPVMainEncContext*)s; mjpeg_build_optimal_huffman(m); @@ -253,7 +257,7 @@ int ff_mjpeg_encode_stuffing(MpegEncContext *s) s->intra_chroma_ac_vlc_last_length = m->uni_chroma_ac_vlc_len; mjpeg_encode_picture_header(s); - mjpeg_encode_picture_frame(s); + mjpeg_encode_picture_frame(main); } #endif diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index bdd3196060..fcc51af41a 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -310,7 +310,6 @@ typedef struct MpegEncContext { /* statistics, used for 2-pass encoding */ int mv_bits; - int header_bits; int i_tex_bits; int p_tex_bits; int i_count; diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 44bad9eb52..d4f4f825ff 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -1928,7 +1928,7 @@ vbv_retry: frame_end(m); if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) && s->out_format == FMT_MJPEG) - ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits); + ff_mjpeg_encode_picture_trailer(&s->pb, m->header_bits); if (avctx->rc_buffer_size) { RateControlContext *rcc = &m->rc_context; @@ -1976,7 +1976,7 @@ vbv_retry: s->pict_type); if (avctx->flags & AV_CODEC_FLAG_PASS1) - assert(put_bits_count(&s->pb) == s->header_bits + s->mv_bits + + assert(put_bits_count(&s->pb) == m->header_bits + s->mv_bits + s->misc_bits + s->i_tex_bits + s->p_tex_bits); flush_put_bits(&s->pb); @@ -3933,7 +3933,7 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt) av_assert0(0); } bits= put_bits_count(&s->pb); - s->header_bits= bits - s->last_bits; + m->header_bits = bits - s->last_bits; for(i=1; i<context_count; i++){ update_duplicate_context_after_me(s->thread_context[i], s); diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h index 283fa8f705..9c70fe6d71 100644 --- a/libavcodec/mpegvideoenc.h +++ b/libavcodec/mpegvideoenc.h @@ -77,6 +77,7 @@ typedef struct MPVMainEncContext { /* bit rate control */ int64_t total_bits; int frame_bits; ///< bits used for the current frame + int header_bits; int stuffing_bits; ///< bits used for stuffing int next_lambda; ///< next lambda used for retrying to encode a frame int fixed_qscale; ///< fixed qscale if non zero diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c index 9c5d34dfde..895e557877 100644 --- a/libavcodec/ratecontrol.c +++ b/libavcodec/ratecontrol.c @@ -54,7 +54,7 @@ void ff_write_pass1_stats(MPVMainEncContext *const m) m->mc_mb_var_sum, m->mb_var_sum, s->i_count, - s->header_bits); + m->header_bits); } static AVRational get_fpsQ(AVCodecContext *avctx) -- 2.45.2