From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 06558467BB for ; Sun, 18 Jun 2023 11:23:21 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AD52868C261; Sun, 18 Jun 2023 14:20:33 +0300 (EEST) Received: from haasn.dev (haasn.dev [78.46.187.166]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AF96268C047 for ; Sun, 18 Jun 2023 14:20:14 +0300 (EEST) Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 8C1B54B6AD; Sun, 18 Jun 2023 13:20:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1687087211; bh=ojYkv9+k3WdhzxOCFaoaTHG0D8amcv98W1Uqar5XfC8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OUN+RWekM34n/E+qF1/GUQsm2JudGmssoVLq0QAeFxmyiCz1BPw2xzvskNgHl4xMZ hP/A1Xyf5Bz7P5lymQDylL7iRY9eNQOROjERBNDIEGCeAuYhLdXSvy/vcF4zGW9b8X eFdoiEEwBDtVDNY2oXf9aTRErrGnEBafjvd3jHH8= From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 18 Jun 2023 13:17:05 +0200 Message-ID: <20230618111955.40994-15-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230618111955.40994-2-ffmpeg@haasn.xyz> References: <20230618111955.40994-2-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 13/22] lavfi/vf_libplacebo: determine PTS of next frame from any input X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Niklas Haas Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: From: Niklas Haas When combining multiple inputs with different PTS and durations, in input-timed mode, we emit one output frame for every input frame PTS, from *any* input. So when combining a low FPS stream with a high FPS stream, the output framerate would match the higher FPS, independent of which order they are specified in. --- libavfilter/vf_libplacebo.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index a56ebbf54e7..47f019fa192 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -973,11 +973,11 @@ static int handle_input(AVFilterContext *ctx, LibplaceboInput *input) static int libplacebo_activate(AVFilterContext *ctx) { - int ret; + int ret, retry = 0; LibplaceboContext *s = ctx->priv; LibplaceboInput *in = &s->inputs[0]; AVFilterLink *outlink = ctx->outputs[0]; - int64_t pts; + int64_t pts, out_pts; FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, ctx); pl_log_level_update(s->log, get_log_level()); @@ -989,24 +989,31 @@ static int libplacebo_activate(AVFilterContext *ctx) if (ff_outlink_frame_wanted(outlink)) { if (s->fps.num) { - pts = outlink->frame_count_out; - } else if (av_fifo_peek(in->out_pts, &pts, 1, 0) < 0) { - /* No frames queued */ - if (in->status) { - pts = in->status_pts; - } else { - ff_inlink_request_frame(in->link); - return 0; + out_pts = outlink->frame_count_out; + } else { + /* Determine the PTS of the next frame from any active input */ + out_pts = INT64_MAX; + for (int i = 0; i < s->nb_inputs; i++) { + LibplaceboInput *in = &s->inputs[i]; + if (av_fifo_peek(in->out_pts, &pts, 1, 0) >= 0) { + out_pts = FFMIN(out_pts, pts); + } else if (!in->status) { + ff_inlink_request_frame(in->link); + retry = true; + } } + + if (retry) /* some inputs are incomplete */ + return 0; } - if (s->status && pts >= s->status_pts) { + if (s->status && out_pts >= s->status_pts) { ff_outlink_set_status(outlink, s->status, s->status_pts); return 0; } in->qstatus = pl_queue_update(in->queue, &in->mix, pl_queue_params( - .pts = pts * av_q2d(outlink->time_base), + .pts = out_pts * av_q2d(outlink->time_base), .radius = pl_frame_mix_radius(&s->params), .vsync_duration = av_q2d(av_inv_q(outlink->frame_rate)), )); @@ -1018,7 +1025,7 @@ static int libplacebo_activate(AVFilterContext *ctx) case PL_QUEUE_OK: if (!s->fps.num) av_fifo_drain2(in->out_pts, 1); - return output_frame(ctx, pts); + return output_frame(ctx, out_pts); case PL_QUEUE_ERR: return AVERROR_EXTERNAL; } -- 2.41.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".