From: Anton Khirnov <anton@khirnov.net> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 20/28] ffmpeg_mux: split of_write_packet() Date: Tue, 11 Jan 2022 10:58:22 +0100 Message-ID: <20220111095830.31542-20-anton@khirnov.net> (raw) In-Reply-To: <20220111095830.31542-1-anton@khirnov.net> It is currently called from two places: - output_packet() in ffmpeg.c, which submits the newly available output packet to the muxer - from of_check_init() in ffmpeg_mux.c after the header has been written, to flush the muxing queue Some packets will thus be processed by this function twice, so it requires an extra parameter to indicate the place it is called from and avoid modifying some state twice. This is fragile and hard to follow, so split this function into two. Also rename of_write_packet() to of_submit_packet() to better reflect its new purpose. --- fftools/ffmpeg.c | 4 +-- fftools/ffmpeg.h | 3 +-- fftools/ffmpeg_mux.c | 63 ++++++++++++++++++++++++-------------------- 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index c1bb3926c4..4215be0098 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -728,11 +728,11 @@ static void output_packet(OutputFile *of, AVPacket *pkt, if (ret < 0) goto finish; while ((ret = av_bsf_receive_packet(ost->bsf_ctx, pkt)) >= 0) - of_write_packet(of, pkt, ost, 0); + of_submit_packet(of, pkt, ost); if (ret == AVERROR(EAGAIN)) ret = 0; } else if (!eof) - of_write_packet(of, pkt, ost, 0); + of_submit_packet(of, pkt, ost); finish: if (ret < 0 && ret != AVERROR_EOF) { diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 28df1b179f..374dca9189 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -684,8 +684,7 @@ int of_check_init(OutputFile *of); int of_write_trailer(OutputFile *of); void of_close(OutputFile **pof); -void of_write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, - int unqueue); +void of_submit_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost); int of_finished(OutputFile *of); int64_t of_filesize(OutputFile *of); AVChapter * const * diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c index 4ab2279739..36f781ae11 100644 --- a/fftools/ffmpeg_mux.c +++ b/fftools/ffmpeg_mux.c @@ -102,39 +102,12 @@ static int queue_packet(OutputFile *of, OutputStream *ost, AVPacket *pkt) return 0; } -void of_write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, - int unqueue) +static void write_packet(OutputFile *of, OutputStream *ost, AVPacket *pkt) { AVFormatContext *s = of->ctx; AVStream *st = ost->st; int ret; - /* - * Audio encoders may split the packets -- #frames in != #packets out. - * But there is no reordering, so we can limit the number of output packets - * by simply dropping them here. - * Counting encoded video frames needs to be done separately because of - * reordering, see do_video_out(). - * Do not count the packet when unqueued because it has been counted when queued. - */ - if (!(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && ost->encoding_needed) && !unqueue) { - if (ost->frame_number >= ost->max_frames) { - av_packet_unref(pkt); - return; - } - ost->frame_number++; - } - - /* the muxer is not initialized yet, buffer the packet */ - if (!of->mux->header_written) { - ret = queue_packet(of, ost, pkt); - if (ret < 0) { - av_packet_unref(pkt); - exit_program(1); - } - return; - } - if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) || (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0)) pkt->pts = pkt->dts = AV_NOPTS_VALUE; @@ -225,6 +198,38 @@ void of_write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, } } +void of_submit_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost) +{ + AVStream *st = ost->st; + int ret; + + /* + * Audio encoders may split the packets -- #frames in != #packets out. + * But there is no reordering, so we can limit the number of output packets + * by simply dropping them here. + * Counting encoded video frames needs to be done separately because of + * reordering, see do_video_out(). + */ + if (!(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && ost->encoding_needed)) { + if (ost->frame_number >= ost->max_frames) { + av_packet_unref(pkt); + return; + } + ost->frame_number++; + } + + if (of->mux->header_written) { + write_packet(of, ost, pkt); + } else { + /* the muxer is not initialized yet, buffer the packet */ + ret = queue_packet(of, ost, pkt); + if (ret < 0) { + av_packet_unref(pkt); + exit_program(1); + } + } +} + static int print_sdp(void) { char sdp[16384]; @@ -324,7 +329,7 @@ int of_check_init(OutputFile *of) AVPacket *pkt; av_fifo_generic_read(ms->muxing_queue, &pkt, sizeof(pkt), NULL); ms->muxing_queue_data_size -= pkt->size; - of_write_packet(of, pkt, ost, 1); + write_packet(of, ost, pkt); av_packet_free(&pkt); } } -- 2.33.0 _______________________________________________ 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-01-11 10:01 UTC|newest] Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-01-11 9:58 [FFmpeg-devel] [PATCH 01/28] ffmpeg: pass the muxer context explicitly to some functions Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 02/28] ffmpeg: store the output file index in OutputFile Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 03/28] ffmpeg: move some muxing-related code into a separate file Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 04/28] ffmpeg: move writing the trailer to ffmpeg_mux.c Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 05/28] ffmpeg: move freeing the output file " Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 06/28] ffmpeg: store output format separately from the muxer context Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 07/28] ffmpeg_mux: add private " Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 08/28] ffmpeg: add a helper function to access output file size Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 09/28] ffmpeg: fix the type of limit_filesize Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 10/28] ffmpeg: refactor limiting output file size with -fs Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 11/28] ffmpeg: set want_sdp when initializing the muxer Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 12/28] ffmpeg: write the header for stream-less outputs " Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 13/28] ffmpeg: move closing the file into of_write_trailer() Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 14/28] ffmpeg: refactor the code checking for bitexact output Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 15/28] ffmpeg: access output file chapters through a wrapper Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 16/28] ffmpeg: do not log to the muxer context Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 17/28] ffmpeg: move the mux queue into muxer private data Anton Khirnov 2022-01-13 10:50 ` Andreas Rheinhardt 2022-01-17 22:29 ` Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 18/28] ffmpeg: fix initial muxing queue size Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 19/28] ffmpeg_mux: split queuing packets into a separate function Anton Khirnov 2022-01-11 9:58 ` Anton Khirnov [this message] 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 21/28] ffmpeg: move a comment to a more appropriate place Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 22/28] ffmpeg: move output file opts into private context Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 23/28] ffmpeg: move processing video stats to ffmpeg_mux Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 24/28] ffmpeg_mux: drop a useless check and reduce indentation Anton Khirnov 2022-01-13 10:54 ` Andreas Rheinhardt 2022-01-18 10:16 ` Anton Khirnov 2022-01-18 10:18 ` Andreas Rheinhardt 2022-01-18 10:25 ` Anton Khirnov 2022-01-18 10:35 ` Andreas Rheinhardt 2022-01-18 10:52 ` Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 25/28] ffmpeg_mux: stop using AVStream.nb_frames in do_video_stats() Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 26/28] ffmpeg_mux: stop using av_stream_get_end_pts() " Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 27/28] ffmpeg_mux: merge variable declaration and initialization Anton Khirnov 2022-01-11 9:58 ` [FFmpeg-devel] [PATCH 28/28] ffmpeg_mux: move processing AV_PKT_DATA_QUALITY_STATS to do_video_stats() 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=20220111095830.31542-20-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