Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Gyan Doshi <ffmpeg@gyani.pro>
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH v4] avfilter/setpts: add option to decide framerate handling
Date: Sun, 26 Jan 2025 09:36:31 +0530
Message-ID: <23ad96b3-f7ac-49fa-8ceb-6f76de3cd810@gyani.pro> (raw)
In-Reply-To: <4ca3b088-e65c-09d8-c060-6ec74ccd99ff@passwd.hu>



On 2025-01-26 12:49 am, Marton Balint wrote:
>
>
> On Sat, 25 Jan 2025, Gyan Doshi wrote:
>
>> In f121d95, the outlink framerate was unconditionally unset.
>> This breaks/bloats outputs from CFR muxers unless the user explicitly
>> sets a sane framerate. And the most common invocation for setpts seen in
>> workflows, our docs and across the web is `PTS-STARTPTS` or others of 
>> the
>> general form `PTS+constant` which preserves the input framerate.
>>
>> Fixes #11428
>> ---
>> v4: negated option sense and renamed to vfr
>>
>> doc/filters.texi          | 6 ++++++
>> libavfilter/setpts.c      | 6 +++++-
>> tests/fate/hevc.mak       | 2 +-
>> tests/fate/mov.mak        | 2 +-
>> tests/filtergraphs/setpts | 2 +-
>> 5 files changed, 14 insertions(+), 4 deletions(-)
>>
>> diff --git a/doc/filters.texi b/doc/filters.texi
>> index b926b865ae..ea11d045ec 100644
>> --- a/doc/filters.texi
>> +++ b/doc/filters.texi
>> @@ -31478,6 +31478,12 @@ This filter accepts the following options:
>> @item expr
>> The expression which is evaluated for each frame to construct its 
>> timestamp.
>>
>> +@item vfr (@emph{video only})
>> +Boolean option which determines if the original framerate metadata 
>> is unset.
>> +If set to true, be advised that a sane frame rate should be explicitly
>> +specified if output is sent to a constant frame rate muxer.
>
> I propose a more understandable variant for the first sentence:
>
> Sets the filter output to variable frame rate by dropping the original 
> constant framerate information if present. If set to true...

But that's not actually the case. This option does not make the output 
VFR. If it did, this option would not be needed.
Once FR is unset, if the output goes to a CFR muxer and fps_mode is not 
specified, ffmpeg will emit a  CFR stream using the time_base.
What the option does is a single narrow technical thing which has 
implications depending on context. And that was the basis for the 
original option name and description.

'strip_fps' and a corresponding description seems more accurate.

Regards,
Gyan


>
>> +Default is @code{false}.
>> +
>> @end table
>>
>> The expression is evaluated through the eval API and can contain the 
>> following
>> diff --git a/libavfilter/setpts.c b/libavfilter/setpts.c
>> index 75d96247af..9573e16b63 100644
>> --- a/libavfilter/setpts.c
>> +++ b/libavfilter/setpts.c
>> @@ -98,6 +98,7 @@ typedef struct SetPTSContext {
>>     const AVClass *class;
>>     char *expr_str;
>>     AVExpr *expr;
>> +    int vfr;
>>     double var_values[VAR_VARS_NB];
>>     enum AVMediaType type;
>> } SetPTSContext;
>> @@ -153,8 +154,10 @@ static int config_input(AVFilterLink *inlink)
>> static int config_output_video(AVFilterLink *outlink)
>> {
>>     FilterLink *l = ff_filter_link(outlink);
>> +    SetPTSContext *s = outlink->src->priv;
>>
>> -    l->frame_rate = (AVRational){ 1, 0 };
>> +    if (s->vfr)
>> +        l->frame_rate = (AVRational){ 1, 0 };
>>
>>     return 0;
>> }
>> @@ -320,6 +323,7 @@ static int process_command(AVFilterContext *ctx, 
>> const char *cmd, const char *ar
>> #if CONFIG_SETPTS_FILTER
>> static const AVOption setpts_options[] = {
>>     { "expr", "Expression determining the frame timestamp", 
>> OFFSET(expr_str), AV_OPT_TYPE_STRING, { .str = "PTS" }, .flags = 
>> V|F|R },
>> +    { "vfr", "Preserve input framerate", OFFSET(vfr), 
>> AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, .flags = V|F },
>
> "Output variabe frame rate"
>
> Otherwise LGTM.
>
> Thanks,
> Marton
>
>
>>     { NULL }
>> };
>> AVFILTER_DEFINE_CLASS(setpts);
>> diff --git a/tests/fate/hevc.mak b/tests/fate/hevc.mak
>> index 9e6fd72618..e4b04f7f19 100644
>> --- a/tests/fate/hevc.mak
>> +++ b/tests/fate/hevc.mak
>> @@ -210,7 +210,7 @@ $(HEVC_TESTS_444_12BIT): SCALE_OPTS := -pix_fmt 
>> yuv444p12le -vf scale
>> fate-hevc-conformance-%: CMD = framecrc -i 
>> $(TARGET_SAMPLES)/hevc-conformance/$(subst 
>> fate-hevc-conformance-,,$(@)).bit $(SCALE_OPTS)
>> $(HEVC_TESTS_422_10BIN): CMD = framecrc -i 
>> $(TARGET_SAMPLES)/hevc-conformance/$(subst 
>> fate-hevc-conformance-,,$(@)).bin $(SCALE_OPTS)
>> $(HEVC_TESTS_MULTIVIEW): CMD = framecrc -i 
>> $(TARGET_SAMPLES)/hevc-conformance/$(subst 
>> fate-hevc-conformance-,,$(@)).bit \
>> -    -pix_fmt yuv420p -map "0:view:0" -map "0:view:1" -vf setpts=N
>> +    -pix_fmt yuv420p -map "0:view:0" -map "0:view:1" -vf setpts=N:vfr=1
>>
>> FATE_HEVC-$(call FRAMECRC, HEVC, HEVC, HEVC_PARSER) += 
>> $(HEVC_TESTS_8BIT) $(HEVC_TESTS_444_8BIT)
>> FATE_HEVC-$(call FRAMECRC, HEVC, HEVC, HEVC_PARSER SCALE_FILTER) 
>> +=         \
>> diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak
>> index ca13ebfd44..fd0aaa2416 100644
>> --- a/tests/fate/mov.mak
>> +++ b/tests/fate/mov.mak
>> @@ -225,7 +225,7 @@ fate-mov-pcm-remux: CMP = oneline
>> fate-mov-pcm-remux: REF = e76115bc392d702da38f523216bba165
>>
>> FATE_MOV_FFMPEG-$(call TRANSCODE, RAWVIDEO, MOV, TESTSRC_FILTER 
>> SETPTS_FILTER) += fate-mov-vfr
>> -fate-mov-vfr: CMD = md5 -filter_complex 
>> testsrc=size=2x2:duration=1,setpts=N*N -c rawvideo -fflags +bitexact 
>> -f mov
>> +fate-mov-vfr: CMD = md5 -filter_complex 
>> testsrc=size=2x2:duration=1,setpts=N*N:vfr=1 -c rawvideo -fflags 
>> +bitexact -f mov
>> fate-mov-vfr: CMP = oneline
>> fate-mov-vfr: REF = 1558b4a9398d8635783c93f84eb5a60d
>>
>> diff --git a/tests/filtergraphs/setpts b/tests/filtergraphs/setpts
>> index 79037d1b65..3e5da7446e 100644
>> --- a/tests/filtergraphs/setpts
>> +++ b/tests/filtergraphs/setpts
>> @@ -1,2 +1,2 @@
>> settb=1/1000,
>> -setpts=1/(35*TB) * (N + 0.05 * sin(N*2*PI/25))
>> +setpts=1/(35*TB) * (N + 0.05 * sin(N*2*PI/25)):vfr=1
>> -- 
>> 2.46.1
>>
>> _______________________________________________
>> 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".
>>
> _______________________________________________
> 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".

_______________________________________________
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".

  reply	other threads:[~2025-01-26  4:06 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-25  8:00 Gyan Doshi
2025-01-25 19:19 ` Marton Balint
2025-01-26  4:06   ` Gyan Doshi [this message]
2025-01-26 13:39     ` Ronald S. Bultje
2025-01-26 14:05       ` Gyan Doshi
2025-01-26 19:33         ` Marton Balint
2025-01-27 12:12           ` Ronald S. Bultje
2025-01-27 12:22             ` Gyan Doshi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=23ad96b3-f7ac-49fa-8ceb-6f76de3cd810@gyani.pro \
    --to=ffmpeg@gyani.pro \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

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