* [FFmpeg-devel] [PATCH] Limit fps frame filling (PR #21098)
@ 2025-12-04 10:57 hwmin via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: hwmin via ffmpeg-devel @ 2025-12-04 10:57 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: hwmin
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 <who@synamedia.com>
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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-12-04 10:57 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-04 10:57 [FFmpeg-devel] [PATCH] Limit fps frame filling (PR #21098) hwmin via ffmpeg-devel
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