From 87ae84e4afb2d137b1e229250b576226b1433a79 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 27 Mar 2023 07:37:29 +0200 Subject: [PATCH] fftools/ffmpeg: move OutputStream.sq_frame to Encoder It is audio/video encoding-only and does not need to be visible outside of ffmpeg_enc.c --- fftools/ffmpeg.h | 1 - fftools/ffmpeg_enc.c | 17 ++++++++++++++--- fftools/ffmpeg_mux.c | 1 - fftools/ffmpeg_mux_init.c | 4 ---- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index e7e7d88577..84418d8da5 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -588,7 +588,6 @@ typedef struct OutputStream { Encoder *enc; AVCodecContext *enc_ctx; AVFrame *filtered_frame; - AVFrame *sq_frame; AVPacket *pkt; int64_t last_dropped; int64_t last_nb0_frames[3]; diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c index bb11cdf42a..5c56ad0325 100644 --- a/fftools/ffmpeg_enc.c +++ b/fftools/ffmpeg_enc.c @@ -50,6 +50,8 @@ struct Encoder { AVFrame *last_frame; /* number of frames emitted by the video-encoding sync code */ int64_t vsync_frame_number; + + AVFrame *sq_frame; }; static uint64_t dup_warning = 1000; @@ -62,6 +64,7 @@ void enc_free(Encoder **penc) return; av_frame_free(&enc->last_frame); + av_frame_free(&enc->sq_frame); av_freep(penc); } @@ -139,6 +142,7 @@ static void init_encoder_time_base(OutputStream *ost, AVRational default_time_ba int enc_open(OutputStream *ost, AVFrame *frame) { InputStream *ist = ost->ist; + Encoder *e = ost->enc; AVCodecContext *enc_ctx = ost->enc_ctx; AVCodecContext *dec_ctx = NULL; const AVCodec *enc = enc_ctx->codec; @@ -328,6 +332,12 @@ int enc_open(OutputStream *ost, AVFrame *frame) return ret; } + if (ost->sq_idx_encode >= 0) { + e->sq_frame = av_frame_alloc(); + if (!e->sq_frame) + return AVERROR(ENOMEM); + } + if (ost->enc_ctx->frame_size) { av_assert0(ost->sq_idx_encode >= 0); sq_frame_samples(output_files[ost->file_index]->sq_encode, @@ -718,16 +728,17 @@ static int encode_frame(OutputFile *of, OutputStream *ost, AVFrame *frame) static int submit_encode_frame(OutputFile *of, OutputStream *ost, AVFrame *frame) { + Encoder *e = ost->enc; int ret; if (ost->sq_idx_encode < 0) return encode_frame(of, ost, frame); if (frame) { - ret = av_frame_ref(ost->sq_frame, frame); + ret = av_frame_ref(e->sq_frame, frame); if (ret < 0) return ret; - frame = ost->sq_frame; + frame = e->sq_frame; } ret = sq_send(of->sq_encode, ost->sq_idx_encode, @@ -740,7 +751,7 @@ static int submit_encode_frame(OutputFile *of, OutputStream *ost, } while (1) { - AVFrame *enc_frame = ost->sq_frame; + AVFrame *enc_frame = e->sq_frame; ret = sq_receive(of->sq_encode, ost->sq_idx_encode, SQFRAME(enc_frame)); diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c index 527567831f..5663b8f11d 100644 --- a/fftools/ffmpeg_mux.c +++ b/fftools/ffmpeg_mux.c @@ -663,7 +663,6 @@ static void ost_free(OutputStream **post) av_bsf_free(&ms->bsf_ctx); av_frame_free(&ost->filtered_frame); - av_frame_free(&ost->sq_frame); av_packet_free(&ost->pkt); av_dict_free(&ost->encoder_opts); diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c index 6c53a8810d..ee5829c7fe 100644 --- a/fftools/ffmpeg_mux_init.c +++ b/fftools/ffmpeg_mux_init.c @@ -1505,10 +1505,6 @@ static int setup_sync_queues(Muxer *mux, AVFormatContext *oc, int64_t buf_size_u if (ost->sq_idx_encode < 0) return ost->sq_idx_encode; - ost->sq_frame = av_frame_alloc(); - if (!ost->sq_frame) - return AVERROR(ENOMEM); - if (ms->max_frames != INT64_MAX) sq_limit_frames(of->sq_encode, ost->sq_idx_encode, ms->max_frames); }