From patchwork Sun May 21 11:13:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 41754 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:ba91:b0:105:feb:71f2 with SMTP id fb17csp1042898pzb; Sun, 21 May 2023 04:14:07 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7gOdCzoRWAGJl8tGCueKZQk9CWR66z9gkmqr3+wGazi7unnQk9UjUy3rXwSptjTjeDw8VC X-Received: by 2002:a17:907:a406:b0:94a:653b:ba41 with SMTP id sg6-20020a170907a40600b0094a653bba41mr6515945ejc.15.1684667646838; Sun, 21 May 2023 04:14:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1684667646; cv=none; d=google.com; s=arc-20160816; b=lsypzSAYZVSqelJtcK4LLYUUPgkYZqcUOPUulyBD8nWAR3FiXz+OE7P8FZa8MgRT4v g8RYTS7s0Zjni7yUMaiYNMlBj7YYwLzhy3r3ZJjokNkPTWk85eAucr0511xLGGNYCN62 jyaZkX6ugunisYR/rjcftBzcAuOFP5kZu+4moAfOjoXLNj6gGUFa1InA0eRdYmTWZUAI oVuHJroRRXOttB8QXICZ7/Wa4bBOtxg6QDAQfjpnlrbqH1U9XczQI8AoMRQteucfjZM2 JmhuvGW6hVoZ85uHzcihiwxI24OHCzaOlqqrEVzhawP2zIg06behsdMxEsrlRCagQ4Rc RzOQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=BVUS5Vl3UcP9avdd5W3KVJURQ8+pjCEoSpw8rHUUzfE=; b=SK7EB+qYd9At2XrSbfE/z7jaUKuYzWcyBHGb5Loryk7dHlCw1k6b6NJ/4nyj9ADvxr TivTYgUDCMDim2U+SJlUfhuV7I1cqStXn7Nsm6KFyT4JduqtqJjloSyfsXQVA4prrrKV MrN7h1HtkJp+hpfw2QUswbAZ6ZErTdnh8b+o2YfRRUlvEdVUr/T2r+QjwvJMK1aB48dl 20RM08xKaJGsWynSoLtZMNEkks+kFmX1j2YOdyHZnetEpZsq1SbqCmxw2DNZ4CJvbNGA DYaBBILYuLlzHxCLPSJU4ZLJLV2xX6IOseOX0CO71KbUwvlmusCDty2Y4TxQhbfOhPIN YqFg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=UpbYyNOx; 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 ku14-20020a170907788e00b00965be87b071si1811990ejc.341.2023.05.21.04.14.06; Sun, 21 May 2023 04:14:06 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=UpbYyNOx; 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 51BAB68C074; Sun, 21 May 2023 14:14:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from haasn.dev (haasn.dev [78.46.187.166]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4EDA968BF96 for ; Sun, 21 May 2023 14:13:55 +0300 (EEST) Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 8A5FD42DED; Sun, 21 May 2023 13:13:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1684667634; bh=zj40g5XLUYffEDDgDnv/wcAg+YKuOv5tLoqdmSlNN0U=; h=From:To:Cc:Subject:Date:From; b=UpbYyNOxv/nZ1tuQcssyGL351cGNV2UZdW3MDMFnbeREVeVgFzrLnqo4fguUbmKVG 8ppk9zZw1Dpc/k1xwrmpynUgsMAFuXS6x1o1BscC1bySDSk2YioNedzD2wM+Tx6q8R fs148mpVl23koeQCnJ4PfwXMvtkNFP/U+X/CRV9o= From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sun, 21 May 2023 13:13:52 +0200 Message-Id: <20230521111352.102281-1-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.40.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavfi/libplacebo: properly handle EOF 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 35doCagPwbKH From: Niklas Haas The current code relied on pl_queue eventually returning EOF back to the caller, which didn't work in all situations (e.g. single frame input). Also, the current code assumed that ff_inlink_acknowledge_status only fired once, which was patently not true, as the above edge cases demonstrated. Solve both issues by keeping track of the acknowledged link status and forwarding it (instead of trying to probe the pl_queue again) in the event that we run out of queued input frames, as well as (in CFR mode) when we pass the indicated status PTS. --- libavfilter/vf_libplacebo.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index 94e49aa4652..6ce0f6263e4 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -131,6 +131,8 @@ typedef struct LibplaceboContext { /* filter state */ AVFifo *out_pts; ///< timestamps of wanted output frames + int64_t status_pts; + int status; /* settings */ char *out_format_string; @@ -805,19 +807,12 @@ static int libplacebo_activate(AVFilterContext *ctx) if (ret < 0) return ret; - if (ff_inlink_acknowledge_status(inlink, &status, &pts)) { + if (!s->status && ff_inlink_acknowledge_status(inlink, &status, &pts)) { pts = av_rescale_q_rnd(pts, inlink->time_base, outlink->time_base, AV_ROUND_UP); - if (status == AVERROR_EOF) { - /* Signal EOF to pl_queue, and enqueue this output frame to - * make sure we see PL_QUEUE_EOF returned eventually */ - pl_queue_push(s->queue, NULL); - if (!s->fps.num) - av_fifo_write(s->out_pts, &pts, 1); - } else { - ff_outlink_set_status(outlink, status, pts); - return 0; - } + pl_queue_push(s->queue, NULL); /* Signal EOF to pl_queue */ + s->status = status; + s->status_pts = pts; } if (ff_outlink_frame_wanted(outlink)) { @@ -827,7 +822,17 @@ static int libplacebo_activate(AVFilterContext *ctx) if (s->fps.num) { pts = outlink->frame_count_out; } else if (av_fifo_peek(s->out_pts, &pts, 1, 0) < 0) { - ff_inlink_request_frame(inlink); + /* No frames queued */ + if (s->status) { + pts = s->status_pts; + } else { + ff_inlink_request_frame(inlink); + return 0; + } + } + + if (s->status && pts >= s->status_pts) { + ff_outlink_set_status(outlink, s->status, s->status_pts); return 0; }