From: Anton Khirnov <anton@khirnov.net> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 2/4] lavfi/framesync: reorder functions to avoid a forward declaration Date: Fri, 27 Jan 2023 14:16:37 +0100 Message-ID: <20230127131639.4928-2-anton@khirnov.net> (raw) In-Reply-To: <20230127131639.4928-1-anton@khirnov.net> --- libavfilter/framesync.c | 144 ++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 73 deletions(-) diff --git a/libavfilter/framesync.c b/libavfilter/framesync.c index 153db4fa21..fdcc3b57c8 100644 --- a/libavfilter/framesync.c +++ b/libavfilter/framesync.c @@ -73,8 +73,6 @@ enum { STATE_EOF, }; -static int consume_from_fifos(FFFrameSync *fs); - void ff_framesync_preinit(FFFrameSync *fs) { if (fs->class) @@ -181,6 +179,77 @@ int ff_framesync_configure(FFFrameSync *fs) return 0; } +static void framesync_inject_frame(FFFrameSync *fs, unsigned in, AVFrame *frame) +{ + int64_t pts; + + av_assert0(!fs->in[in].have_next); + av_assert0(frame); + pts = av_rescale_q(frame->pts, fs->in[in].time_base, fs->time_base); + frame->pts = pts; + fs->in[in].frame_next = frame; + fs->in[in].pts_next = pts; + fs->in[in].have_next = 1; +} + +static int64_t framesync_pts_extrapolate(FFFrameSync *fs, unsigned in, + int64_t pts) +{ + /* Possible enhancement: use the link's frame rate */ + return pts + 1; +} + +static void framesync_inject_status(FFFrameSync *fs, unsigned in, int status, int64_t pts) +{ + av_assert0(!fs->in[in].have_next); + pts = fs->in[in].state != STATE_RUN || fs->in[in].after == EXT_INFINITY + ? INT64_MAX : framesync_pts_extrapolate(fs, in, fs->in[in].pts); + fs->in[in].sync = 0; + framesync_sync_level_update(fs); + fs->in[in].frame_next = NULL; + fs->in[in].pts_next = pts; + fs->in[in].have_next = 1; +} + +static int consume_from_fifos(FFFrameSync *fs) +{ + AVFilterContext *ctx = fs->parent; + AVFrame *frame = NULL; + int64_t pts; + unsigned i, nb_active, nb_miss; + int ret, status; + + nb_active = nb_miss = 0; + for (i = 0; i < fs->nb_in; i++) { + if (fs->in[i].have_next || fs->in[i].state == STATE_EOF) + continue; + nb_active++; + ret = ff_inlink_consume_frame(ctx->inputs[i], &frame); + if (ret < 0) + return ret; + if (ret) { + av_assert0(frame); + framesync_inject_frame(fs, i, frame); + } else { + ret = ff_inlink_acknowledge_status(ctx->inputs[i], &status, &pts); + if (ret > 0) { + framesync_inject_status(fs, i, status, pts); + } else if (!ret) { + nb_miss++; + } + } + } + if (nb_miss) { + if (nb_miss == nb_active && !ff_outlink_frame_wanted(ctx->outputs[0])) + return FFERROR_NOT_READY; + for (i = 0; i < fs->nb_in; i++) + if (!fs->in[i].have_next && fs->in[i].state != STATE_EOF) + ff_inlink_request_frame(ctx->inputs[i]); + return 0; + } + return 1; +} + static int framesync_advance(FFFrameSync *fs) { unsigned i; @@ -231,38 +300,6 @@ static int framesync_advance(FFFrameSync *fs) return 0; } -static int64_t framesync_pts_extrapolate(FFFrameSync *fs, unsigned in, - int64_t pts) -{ - /* Possible enhancement: use the link's frame rate */ - return pts + 1; -} - -static void framesync_inject_frame(FFFrameSync *fs, unsigned in, AVFrame *frame) -{ - int64_t pts; - - av_assert0(!fs->in[in].have_next); - av_assert0(frame); - pts = av_rescale_q(frame->pts, fs->in[in].time_base, fs->time_base); - frame->pts = pts; - fs->in[in].frame_next = frame; - fs->in[in].pts_next = pts; - fs->in[in].have_next = 1; -} - -static void framesync_inject_status(FFFrameSync *fs, unsigned in, int status, int64_t pts) -{ - av_assert0(!fs->in[in].have_next); - pts = fs->in[in].state != STATE_RUN || fs->in[in].after == EXT_INFINITY - ? INT64_MAX : framesync_pts_extrapolate(fs, in, fs->in[in].pts); - fs->in[in].sync = 0; - framesync_sync_level_update(fs); - fs->in[in].frame_next = NULL; - fs->in[in].pts_next = pts; - fs->in[in].have_next = 1; -} - int ff_framesync_get_frame(FFFrameSync *fs, unsigned in, AVFrame **rframe, unsigned get) { @@ -312,45 +349,6 @@ void ff_framesync_uninit(FFFrameSync *fs) av_freep(&fs->in); } -static int consume_from_fifos(FFFrameSync *fs) -{ - AVFilterContext *ctx = fs->parent; - AVFrame *frame = NULL; - int64_t pts; - unsigned i, nb_active, nb_miss; - int ret, status; - - nb_active = nb_miss = 0; - for (i = 0; i < fs->nb_in; i++) { - if (fs->in[i].have_next || fs->in[i].state == STATE_EOF) - continue; - nb_active++; - ret = ff_inlink_consume_frame(ctx->inputs[i], &frame); - if (ret < 0) - return ret; - if (ret) { - av_assert0(frame); - framesync_inject_frame(fs, i, frame); - } else { - ret = ff_inlink_acknowledge_status(ctx->inputs[i], &status, &pts); - if (ret > 0) { - framesync_inject_status(fs, i, status, pts); - } else if (!ret) { - nb_miss++; - } - } - } - if (nb_miss) { - if (nb_miss == nb_active && !ff_outlink_frame_wanted(ctx->outputs[0])) - return FFERROR_NOT_READY; - for (i = 0; i < fs->nb_in; i++) - if (!fs->in[i].have_next && fs->in[i].state != STATE_EOF) - ff_inlink_request_frame(ctx->inputs[i]); - return 0; - } - return 1; -} - int ff_framesync_activate(FFFrameSync *fs) { int ret; -- 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:[~2023-01-27 13:17 UTC|newest] Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-01-27 13:16 [FFmpeg-devel] [PATCH 1/4] lavfi/framesync: use a local variable to shorten code Anton Khirnov 2023-01-27 13:16 ` Anton Khirnov [this message] 2023-01-27 14:47 ` [FFmpeg-devel] [PATCH 2/4] lavfi/framesync: reorder functions to avoid a forward declaration Nicolas George 2023-01-27 13:16 ` [FFmpeg-devel] [PATCH 3/4] lavfi/framesync: add syncing via external timestamp map Anton Khirnov 2023-01-27 13:22 ` Paul B Mahol 2023-01-27 14:53 ` Nicolas George 2023-01-27 16:45 ` Anton Khirnov 2023-01-30 11:01 ` Nicolas George 2023-01-27 13:16 ` [FFmpeg-devel] [PATCH 4/4] lavfi/framesync: reindent after previous commit Anton Khirnov 2023-01-27 14:39 ` [FFmpeg-devel] [PATCH 1/4] lavfi/framesync: use a local variable to shorten code Nicolas George
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=20230127131639.4928-2-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