From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id F3C534D8F9 for ; Thu, 4 Dec 2025 10:57:44 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'X7wfCMjRoYpR9XrhAUbgUx6inSJzbbqrSH8faKeFTUo=', expected b'qFEz/4bNqtvcMBrdqA6p8PME7i/ylMWFXGeIgVqDPX4=')) header.d=ffmpeg.org header.i=@ffmpeg.org header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1764845851; h=mime-version : to : date : message-id : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=X7wfCMjRoYpR9XrhAUbgUx6inSJzbbqrSH8faKeFTUo=; b=BEk+KnvenuX92bZwPl9t0H0sbARfLNTtPuX8cvPA5iVsCnb8zMWFmI9n2OcfkREb/mW9R MYaq6vXgnTVHW2Nhv8k5csDAaguo1nRMZMGkREGLdXar/OYaSEjyl/CdR2/7fX4tTbDWQpW 9m73A0CqkGEtku52SEnv0McI0Ww7LrTU51QFsabXOs9fZkCBHnLpt4dPLQzj/ldGO/FAU9f rbO7Yxe+RiCOIuyIGCPIH9iCLAOry0AflIHPp2phVWBPGuDjaIj7sOAkHYV4mQBUTKH5RRC 5jE2fWkP6JnXQebpTXfUlhF2gmPdUe8HWwk9sfbcUkDb2CVu8MpT+WF/eHEg== Received: from [172.19.0.3] (unknown [172.19.0.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 7B0B6690516; Thu, 4 Dec 2025 12:57:31 +0200 (EET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1764845837; b=rSoOG3jktM7h0x9XvBqPrbNcS/cQTDMTweBXDkuGR7dehyHzxGAQbVuGKxacEY7KrTNtk ewhHDRkKoINCth+lM2l5yR7s55oxvPsTGEw83vAA65R5kGPAtXnfN8WDk/OPAYG7+1evKF5 mxtO5yjQDa/6ioQ8VqTDVZ+QFYYvewE6qSJ6tN8Y6AW4uOttIQpA8nOWB2YCkIxKXA6ZZUh F0PoSSCMR6TENh2MQzsehy4YrnxUBxDyPCSAWb51Zph+iPUEZbnupc9+bDOhnpiFmkpFZ3h e3ufj2z8YcF33sWSayeazOD5WvYWqHgL0dxJ31hp4WqmkYPK+R1WQH1YFXxA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1764845837; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=MEKP4ZuWe9nb6i8PWW8ZL5IDd36Y0H5m1jKw1Tg/iS8=; b=gOSRDkl/S8c0tscJJeKW7X75nxle6yQqi+N45HJqdXBgIk6j9E3vr4uWqUqJT3PJKd+4d 7md2ykhx3/0bidh74AyGN0nhUgJbh4z0C8+Yq8iXtnVSpLUnCBZwl5a406coZefGrtIe3jx vNt1jz6TMUnlA1qJ20qknVC6TXMrXpEF3EZb6QsdgZHJ9uhiOPJmmrFHOjeN4coqfelWvBj 4sr641i8aCucr8AKzNhkP2oHXEQv45VNN/CUdJDYJizskGZjTsfeJ6I4KoIwyjJ0uiDhwao ISDGH4Adk6thFzPjqgnc4YBivm8DHHRrLr4OVero7BG2WIfKMzlGWmoty45g== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=pass header.from=ffmpeg.org policy.dmarc=quarantine Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=ffmpeg.org policy.dmarc=quarantine DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1764845829; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=qFEz/4bNqtvcMBrdqA6p8PME7i/ylMWFXGeIgVqDPX4=; b=GrvtOEzXdlXqqhu+EoquOLxcnUEAytX/+L4p9TwRxIp/aNShdL8eovJpQPgvOBvZlUn4f UDmTGSQxyHROdHFy1UDBRU+39Dt8w2jbRGzjHNQvxYvOPWdNc3y+7qUWQ+x2p4ePBEs2V9a eydcBDDQQcclfUE4KFba1WETkDSMOpFTaxE4WCDd/cdMoM9UaugzuL21x77IXHaju6jzBdp 4L09QzbUsE6bYrWPWeNPg/dTjw5M1eRrypKgQDoHGa4MwdhVUezKIeHMu9H/pN2ay/ShQ6H h30jQTWf0te/zYFxPnbLufZNBED50WHmVh2i6OqafbHq+e3YaRJRSDw1lWxA== Received: from 55ca25703178 (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 3846B6903D4 for ; Thu, 4 Dec 2025 12:57:09 +0200 (EET) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Thu, 04 Dec 2025 10:57:08 -0000 Message-ID: <176484582936.39.1706851964753664624@2cb04c0e5124> Message-ID-Hash: MK4426EEGXRSVOKVDOGQOBXJ7CSCY73E X-Message-ID-Hash: MK4426EEGXRSVOKVDOGQOBXJ7CSCY73E X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] Limit fps frame filling (PR #21098) List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: hwmin via ffmpeg-devel Cc: hwmin Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #21098 opened by hwmin URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21098 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21098.patch This is a PR for review for [fps overloads system when there is a huge timestamp jump between two samples](https://code.ffmpeg.org/FFmpeg/FFmpeg/issues/21039). The code propose to limit the filter's frame duplication to a user defined limit, arbitrarily set to 360 (6s @ 60fps) by default. Setting this value to less than 1 (one) will deactivate the feature. >>From 926c504a3d8fd1648a24bab897f0c5baa93ea038 Mon Sep 17 00:00:00 2001 From: Wai-Ming Ho Date: Thu, 4 Dec 2025 11:17:23 +0100 Subject: [PATCH] Limit fps frame filling --- libavfilter/vf_fps.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c index 0257a8ef78..32b7148d05 100644 --- a/libavfilter/vf_fps.c +++ b/libavfilter/vf_fps.c @@ -96,6 +96,7 @@ typedef struct FPSContext { int frames_out; ///< number of frames on output int dup; ///< number of frames duplicated int drop; ///< number of framed dropped + int max_fill; ///< number of frames to fill when gap in timestamp } FPSContext; #define OFFSET(x) offsetof(FPSContext, x) @@ -113,6 +114,8 @@ static const AVOption fps_options[] = { { "eof_action", "action performed for last frame", OFFSET(eof_action), AV_OPT_TYPE_INT, { .i64 = EOF_ACTION_ROUND }, 0, EOF_ACTION_NB-1, V|F, .unit = "eof_action" }, { "round", "round similar to other frames", 0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_ROUND }, 0, 0, V|F, .unit = "eof_action" }, { "pass", "pass through last frame", 0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_PASS }, 0, 0, V|F, .unit = "eof_action" }, + // default max fill arbitrarily set to 6s @ 60fps + { "max_fill", "Max frames to fill when timestamp jumps forward", OFFSET(max_fill), AV_OPT_TYPE_INT, { .i64 = 360 }, -1, INT_MAX, V|F, "Maximum fill" }, { NULL } }; @@ -221,8 +224,7 @@ static int config_props(AVFilterLink* outlink) return ret; } - av_log(ctx, AV_LOG_VERBOSE, "fps=%d/%d\n", ol->frame_rate.num, ol->frame_rate.den); - + av_log(ctx, AV_LOG_VERBOSE, "fps=%d/%d max_fill=%d\n", ol->frame_rate.num, ol->frame_rate.den, s->max_fill); return 0; } @@ -288,7 +290,8 @@ static int write_frame(AVFilterContext *ctx, FPSContext *s, AVFilterLink *outlin * - If we have status (EOF) set, drop frames when we hit the * status timestamp. */ if ((s->frames_count == 2 && s->frames[1]->pts <= s->next_pts) || - (s->status && s->status_pts <= s->next_pts)) { + (s->status && s->status_pts <= s->next_pts) || + (s->max_fill > 0 && s->cur_frame_out >= s->max_fill)) { frame = shift_frame(ctx, s); av_frame_free(&frame); @@ -366,6 +369,8 @@ static int activate(AVFilterContext *ctx) /* Couldn't generate a frame, so schedule us to perform another step */ if (again && ff_inoutlink_check_flow(inlink, outlink)) ff_filter_set_ready(ctx, 100); + else if (AVERROR_EOF == s->status) /* EOF and not filling frames */ + ff_outlink_set_status(outlink, s->status, s->next_pts); return ret; } -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org