1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

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>
This commit is contained in:
Andreas Rheinhardt
2022-01-29 05:34:14 +01:00
parent b038c7af0c
commit 6b6b34df35
5 changed files with 12 additions and 8 deletions

View File

@ -119,8 +119,9 @@ void ff_mjpeg_amv_encode_picture_header(MpegEncContext *s)
* *
* @param s The MpegEncContext. * @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; int nbits, code, table_id;
MJpegContext *m = s->mjpeg_ctx; MJpegContext *m = s->mjpeg_ctx;
uint8_t *huff_size[4] = { m->huff_size_dc_luminance, 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 total_bits = 0;
size_t bytes_needed; size_t bytes_needed;
s->header_bits = get_bits_diff(s); main->header_bits = get_bits_diff(s);
// Estimate the total size first // Estimate the total size first
for (int i = 0; i < m->huff_ncode; i++) { for (int i = 0; i < m->huff_ncode; i++) {
table_id = m->huff_buffer[i].table_id; table_id = m->huff_buffer[i].table_id;
@ -240,6 +241,9 @@ int ff_mjpeg_encode_stuffing(MpegEncContext *s)
#if CONFIG_MJPEG_ENCODER #if CONFIG_MJPEG_ENCODER
if (m->huffman == HUFFMAN_TABLE_OPTIMAL) { 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); 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; s->intra_chroma_ac_vlc_last_length = m->uni_chroma_ac_vlc_len;
mjpeg_encode_picture_header(s); mjpeg_encode_picture_header(s);
mjpeg_encode_picture_frame(s); mjpeg_encode_picture_frame(main);
} }
#endif #endif

View File

@ -310,7 +310,6 @@ typedef struct MpegEncContext {
/* statistics, used for 2-pass encoding */ /* statistics, used for 2-pass encoding */
int mv_bits; int mv_bits;
int header_bits;
int i_tex_bits; int i_tex_bits;
int p_tex_bits; int p_tex_bits;
int i_count; int i_count;

View File

@ -1928,7 +1928,7 @@ vbv_retry:
frame_end(m); frame_end(m);
if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) && s->out_format == FMT_MJPEG) 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) { if (avctx->rc_buffer_size) {
RateControlContext *rcc = &m->rc_context; RateControlContext *rcc = &m->rc_context;
@ -1976,7 +1976,7 @@ vbv_retry:
s->pict_type); s->pict_type);
if (avctx->flags & AV_CODEC_FLAG_PASS1) 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->misc_bits + s->i_tex_bits +
s->p_tex_bits); s->p_tex_bits);
flush_put_bits(&s->pb); flush_put_bits(&s->pb);
@ -3933,7 +3933,7 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
av_assert0(0); av_assert0(0);
} }
bits= put_bits_count(&s->pb); 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++){ for(i=1; i<context_count; i++){
update_duplicate_context_after_me(s->thread_context[i], s); update_duplicate_context_after_me(s->thread_context[i], s);

View File

@ -77,6 +77,7 @@ typedef struct MPVMainEncContext {
/* bit rate control */ /* bit rate control */
int64_t total_bits; int64_t total_bits;
int frame_bits; ///< bits used for the current frame int frame_bits; ///< bits used for the current frame
int header_bits;
int stuffing_bits; ///< bits used for stuffing int stuffing_bits; ///< bits used for stuffing
int next_lambda; ///< next lambda used for retrying to encode a frame int next_lambda; ///< next lambda used for retrying to encode a frame
int fixed_qscale; ///< fixed qscale if non zero int fixed_qscale; ///< fixed qscale if non zero

View File

@ -54,7 +54,7 @@ void ff_write_pass1_stats(MPVMainEncContext *const m)
m->mc_mb_var_sum, m->mc_mb_var_sum,
m->mb_var_sum, m->mb_var_sum,
s->i_count, s->i_count,
s->header_bits); m->header_bits);
} }
static AVRational get_fpsQ(AVCodecContext *avctx) static AVRational get_fpsQ(AVCodecContext *avctx)