From patchwork Fri Jan 27 13:16:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 40135 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3ca3:b0:b9:1511:ac2c with SMTP id b35csp1338169pzj; Fri, 27 Jan 2023 05:17:54 -0800 (PST) X-Google-Smtp-Source: AK7set81vxH/IjRiD167W13lAodHrgEgTgX8dBwhZWOHFFN1BXTJney6SJx4wqqYgfEOYrbmc/66 X-Received: by 2002:a17:906:a007:b0:878:6631:7fe with SMTP id p7-20020a170906a00700b00878663107femr5854190ejy.20.1674825474666; Fri, 27 Jan 2023 05:17:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674825474; cv=none; d=google.com; s=arc-20160816; b=g4Bywue6NRhccsmCMZPNnM1X26QoNCed5W+bZ7CS2ED7XGr4X8PVwQ1AKVNUvfjI/Z SzzlOMwST3sVGfIfSXLcwV6sbxHqjTh/znZzMi0jg4vzZF3HQQ2+F/XPkhdhnkdg/I7H pkCWuNjEIKBS2ytNs93eBshiVumAUYoabLQlOtLlTgSC3cbuOIq7Zf48lucNHei89sLH /0NeW377jwh5bbv9xdY0Z6ee5B2wHOblOmhm3nIvgcShhMn2z6aQTEnquV2ZWq52R7NG XLXHLt2XbuerTHR6d6YM+kyUfalzxwua/WKBausM9GMdnPSgqiuRB3q46VTu/Lsm/jFQ cLGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=wXzl5b/zuYtSp/LitGiV4WnyhZib4DxbTE1X7fdTAo8=; b=AwLTvLAc6pJgY/0Xkr9CcuJ6uVkkeJGfgLjGEcUxWarVD/g+rRj6J5ZUUBsLh+/vvt g+46GLq4LYqDsjp/GXXe56fVzoyjKh+0lzihK2E70MrKLQzVIzKViV6XioofyAGTb9He ZYhntEprwyqaMM1D2DmOq/9EsiwbwJsTKlhvWtyjd1v87225owD+HmMtzRohvicvjthE Y2RKcI5Ifz9/illT3EPUPOXL6Lh/zFBlUNoA1LmJ4libMOAUquJsa7d6g6dXvPBPxXof DVcUJpsrak0/ziguwRBrSfxYQKWoWZTzTZjTce3rrLNm5xo/TpSThm6FadCQGImjiM8N pFcg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id gh19-20020a170906e09300b008776a7302e8si4875226ejb.143.2023.01.27.05.17.54; Fri, 27 Jan 2023 05:17:54 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8D2C268BDEC; Fri, 27 Jan 2023 15:17:33 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6ED0C68BD7E for ; Fri, 27 Jan 2023 15:17:24 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 339E12404F5 for ; Fri, 27 Jan 2023 14:17:24 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id ZLpmJKAGf-20 for ; Fri, 27 Jan 2023 14:17:22 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id C81552404EC for ; Fri, 27 Jan 2023 14:17:22 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 098DA3A0344 for ; Fri, 27 Jan 2023 14:17:15 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 27 Jan 2023 14:16:37 +0100 Message-Id: <20230127131639.4928-2-anton@khirnov.net> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20230127131639.4928-1-anton@khirnov.net> References: <20230127131639.4928-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/4] lavfi/framesync: reorder functions to avoid a forward declaration 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: uHeY444NKAYL --- 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;