From: Anton Khirnov <anton@khirnov.net> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 20/22] fftools/ffmpeg_mux: embed OutputStream in a MuxStream Date: Fri, 14 Oct 2022 12:15:46 +0200 Message-ID: <20221014101548.3486-7-anton@khirnov.net> (raw) In-Reply-To: <20221014101548.3486-1-anton@khirnov.net> This is now possible since OutputStream is a child of OutputFile and the code allocating it can access MuxStream. Avoids the overhead and extra complexity of allocating two objects instead of one. Similar to what was previously done for OutputFile/Muxer. --- fftools/ffmpeg_mux.c | 33 +++++++++++++++++---------------- fftools/ffmpeg_mux.h | 5 ++--- fftools/ffmpeg_mux_init.c | 23 +++++++++-------------- 3 files changed, 28 insertions(+), 33 deletions(-) diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c index 032b2ac34c..4ad69a149a 100644 --- a/fftools/ffmpeg_mux.c +++ b/fftools/ffmpeg_mux.c @@ -45,6 +45,11 @@ static Muxer *mux_from_of(OutputFile *of) return (Muxer*)of; } +static MuxStream *ms_from_ost(OutputStream *ost) +{ + return (MuxStream*)ost; +} + static int64_t filesize(AVIOContext *pb) { int64_t ret = -1; @@ -60,7 +65,7 @@ static int64_t filesize(AVIOContext *pb) static int write_packet(Muxer *mux, OutputStream *ost, AVPacket *pkt) { - MuxStream *ms = &mux->streams[ost->index]; + MuxStream *ms = ms_from_ost(ost); AVFormatContext *s = mux->fc; AVStream *st = ost->st; int64_t fs; @@ -251,7 +256,7 @@ finish: static int queue_packet(Muxer *mux, OutputStream *ost, AVPacket *pkt) { - MuxStream *ms = &mux->streams[ost->index]; + MuxStream *ms = ms_from_ost(ost); AVPacket *tmp_pkt = NULL; int ret; @@ -409,8 +414,8 @@ static int thread_start(Muxer *mux) /* flush the muxing queues */ for (int i = 0; i < fc->nb_streams; i++) { - MuxStream *ms = &mux->streams[i]; OutputStream *ost = mux->of.streams[i]; + MuxStream *ms = ms_from_ost(ost); AVPacket *pkt; /* try to improve muxing time_base (only possible if nothing has been written yet) */ @@ -626,9 +631,11 @@ int of_write_trailer(OutputFile *of) static void ost_free(OutputStream **post) { OutputStream *ost = *post; + MuxStream *ms; if (!ost) return; + ms = ms_from_ost(ost); if (ost->logfile) { if (fclose(ost->logfile)) @@ -638,6 +645,13 @@ static void ost_free(OutputStream **post) ost->logfile = NULL; } + if (ms->muxing_queue) { + AVPacket *pkt; + while (av_fifo_read(ms->muxing_queue, &pkt, 1) >= 0) + av_packet_free(&pkt); + av_fifo_freep2(&ms->muxing_queue); + } + av_bsf_free(&ost->bsf_ctx); av_frame_free(&ost->filtered_frame); @@ -697,19 +711,6 @@ void of_close(OutputFile **pof) sq_free(&of->sq_encode); sq_free(&mux->sq_mux); - for (int i = 0; i < mux->nb_streams; i++) { - MuxStream *ms = &mux->streams[i]; - AVPacket *pkt; - - if (!ms->muxing_queue) - continue; - - while (av_fifo_read(ms->muxing_queue, &pkt, 1) >= 0) - av_packet_free(&pkt); - av_fifo_freep2(&ms->muxing_queue); - } - av_freep(&mux->streams); - for (int i = 0; i < of->nb_streams; i++) ost_free(&of->streams[i]); av_freep(&of->streams); diff --git a/fftools/ffmpeg_mux.h b/fftools/ffmpeg_mux.h index b73b6c628b..45daeb3591 100644 --- a/fftools/ffmpeg_mux.h +++ b/fftools/ffmpeg_mux.h @@ -35,6 +35,8 @@ #include "libavutil/thread.h" typedef struct MuxStream { + OutputStream ost; + /* the packets are buffered here until the muxer is ready to be initialized */ AVFifo *muxing_queue; @@ -57,9 +59,6 @@ typedef struct Muxer { pthread_t thread; ThreadQueue *tq; - MuxStream *streams; - int nb_streams; - AVDictionary *opts; int thread_queue_size; diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c index 6909a017d8..d6bae92513 100644 --- a/fftools/ffmpeg_mux_init.c +++ b/fftools/ffmpeg_mux_init.c @@ -168,6 +168,7 @@ static OutputStream *new_output_stream(Muxer *mux, OptionsContext *o, enum AVMediaType type, int source_index) { AVFormatContext *oc = mux->fc; + MuxStream *ms; OutputStream *ost; const AVCodec *enc; AVStream *st = avformat_new_stream(oc, NULL); @@ -183,7 +184,14 @@ static OutputStream *new_output_stream(Muxer *mux, OptionsContext *o, if (oc->nb_streams - 1 < o->nb_streamid_map) st->id = o->streamid_map[oc->nb_streams - 1]; - ost = ALLOC_ARRAY_ELEM(mux->of.streams, mux->of.nb_streams); + ms = allocate_array_elem(&mux->of.streams, sizeof(MuxStream), + &mux->of.nb_streams); + ost = &ms->ost; + + ms->muxing_queue = av_fifo_alloc2(8, sizeof(AVPacket*), 0); + if (!ms->muxing_queue) + report_and_exit(AVERROR(ENOMEM)); + ms->last_mux_dts = AV_NOPTS_VALUE; ost->file_index = nb_output_files - 1; ost->index = idx; @@ -1900,19 +1908,6 @@ int of_open(OptionsContext *o, const char *filename) of->url = filename; - mux->streams = av_calloc(oc->nb_streams, sizeof(*mux->streams)); - if (!mux->streams) - return AVERROR(ENOMEM); - mux->nb_streams = oc->nb_streams; - - for (int i = 0; i < mux->nb_streams; i++) { - MuxStream *ms = &mux->streams[i]; - ms->muxing_queue = av_fifo_alloc2(8, sizeof(AVPacket*), 0); - if (!ms->muxing_queue) - return AVERROR(ENOMEM); - ms->last_mux_dts = AV_NOPTS_VALUE; - } - /* write the header for files with no streams */ if (of->format->flags & AVFMT_NOSTREAMS && oc->nb_streams == 0) { int ret = mux_check_init(mux); -- 2.35.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2022-10-14 10:19 UTC|newest] Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-10-13 13:48 [FFmpeg-devel] [PATCH 01/13] fftools/ffmpeg_mux: do not unref a NULL packet Anton Khirnov 2022-10-13 13:48 ` [FFmpeg-devel] [PATCH 02/13] fftools/ffmpeg: move output_packet() to ffmpeg_mux Anton Khirnov 2022-10-13 13:48 ` [FFmpeg-devel] [PATCH 03/13] fftools/ffmpeg_mux: rename submit_packet() to thread_submit_packet() Anton Khirnov 2022-10-13 13:48 ` [FFmpeg-devel] [PATCH 04/13] fftools/ffmpeg_mux: drop the of_ prefix from of_submit_packet() Anton Khirnov 2022-10-13 13:48 ` [FFmpeg-devel] [PATCH 05/13] fftools/ffmpeg: move some stream initialization code to ffmpeg_mux Anton Khirnov 2022-10-13 13:48 ` [FFmpeg-devel] [PATCH 06/13] fftools/ffmpeg_opt: move opening output files into a new file Anton Khirnov 2022-10-13 13:48 ` [FFmpeg-devel] [PATCH 07/13] fftools/ffmpeg_mux: move Muxer and MuxStream to a new header Anton Khirnov 2022-10-13 13:48 ` [FFmpeg-devel] [PATCH 08/13] fftools/ffmpeg_mux: embed OutputFile in a Muxer Anton Khirnov 2022-10-13 13:49 ` [FFmpeg-devel] [PATCH 09/13] fftools/ffmpeg_mux: allocate sq_pkt in setup_sync_queues() Anton Khirnov 2022-10-13 13:49 ` [FFmpeg-devel] [PATCH 10/13] fftools/ffmpeg_mux: inline of_muxer_init() into of_open() Anton Khirnov 2022-10-13 13:49 ` [FFmpeg-devel] [PATCH 11/13] fftools/ffmpeg_mux: inline mux_free() into of_close() Anton Khirnov 2022-10-13 13:49 ` [FFmpeg-devel] [PATCH 12/13] fftools/ffmpeg_mux: move sq_mux from OutputFile to Muxer Anton Khirnov 2022-10-13 13:49 ` [FFmpeg-devel] [PATCH 13/13] fftools/ffmpeg: move init_output_bsfs() to ffmpeg_mux Anton Khirnov 2022-10-14 10:15 ` [FFmpeg-devel] [PATCH 14/22] fftools/ffmpeg: move freeing an output stream into a separate function Anton Khirnov 2022-10-14 10:15 ` [FFmpeg-devel] [PATCH 15/22] fftools/ffmpeg: reindent after previous commit Anton Khirnov 2022-10-14 10:15 ` [FFmpeg-devel] [PATCH 16/22] fftools/ffmpeg_mux_init: pass Muxer to new_output_stream() Anton Khirnov 2022-10-14 10:15 ` [FFmpeg-devel] [PATCH 17/22] fftools/ffmpeg: remove the output_streams global Anton Khirnov 2022-10-14 10:15 ` [FFmpeg-devel] [PATCH 18/22] fftools/ffmpeg: remove a cleanup block at the end of transcode() Anton Khirnov 2022-10-14 10:15 ` [FFmpeg-devel] [PATCH 19/22] fftools/ffmpeg: free output streams in of_close() Anton Khirnov 2022-10-14 10:15 ` Anton Khirnov [this message] 2022-10-14 10:15 ` [FFmpeg-devel] [PATCH 21/22] fftools/ffmpeg_mux: move bsf_ctx from OutputStream to MuxStream Anton Khirnov 2022-10-14 10:15 ` [FFmpeg-devel] [PATCH 22/22] fftools/ffmpeg_mux: move muxing queue fields " Anton Khirnov 2022-10-17 8:49 ` [FFmpeg-devel] [PATCH 01/13] fftools/ffmpeg_mux: do not unref a NULL packet Anton Khirnov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20221014101548.3486-7-anton@khirnov.net \ --to=anton@khirnov.net \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git