[FFmpeg-devel] [PATCH 8/8] fftools/ffmpeg: always generate CFR output when -r is used

Paul B Mahol onemda at gmail.com
Wed Jan 4 19:37:31 EET 2023


On Wed, Jan 4, 2023 at 5:46 PM Anton Khirnov <anton at khirnov.net> wrote:

> Current code may, depending on the muxer, decide to use VSYNC_VFR tagged
> with the specified framerate, without actually performing framerate
> conversion. This is clearly wrong and against the documentation, which
> states unambiguously that -r should produce CFR output for video
> encoding.
>
> FATE test changes:
> * nuv-rtjpeg: replace -r with '-enc_time_base -1', which keeps the
>   original timebase. Output frames are now produced with proper
>   durations.
> * filter-mpdecimate: just drop the -r option, it is unnecessary
> * filter-fps-r: remove, this test makes no sense and actually
>   produces broken VFR output (with incorrect frame durations).
>

With this patch or even before?


> ---
>  fftools/ffmpeg_mux_init.c   | 16 +++++---
>  tests/fate/filter-video.mak |  5 +--
>  tests/fate/video.mak        |  3 +-
>  tests/ref/fate/filter-fps-r | 78 -------------------------------------
>  tests/ref/fate/nuv-rtjpeg   | 16 ++++----
>  5 files changed, 22 insertions(+), 96 deletions(-)
>  delete mode 100644 tests/ref/fate/filter-fps-r
>
> diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
> index 0280759b05..9eea8639dc 100644
> --- a/fftools/ffmpeg_mux_init.c
> +++ b/fftools/ffmpeg_mux_init.c
> @@ -443,10 +443,6 @@ static OutputStream *new_video_stream(Muxer *mux,
> const OptionsContext *o, Input
>          exit_program(1);
>      }
>
> -    if ((frame_rate || max_frame_rate) &&
> -        video_sync_method == VSYNC_PASSTHROUGH)
> -        av_log(NULL, AV_LOG_ERROR, "Using -vsync passthrough and
> -r/-fpsmax can produce invalid output files\n");
> -
>      MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio,
> oc, st);
>      if (frame_aspect_ratio) {
>          AVRational q;
> @@ -614,8 +610,18 @@ static OutputStream *new_video_stream(Muxer *mux,
> const OptionsContext *o, Input
>          if (fps_mode)
>              parse_and_set_vsync(fps_mode, &ost->vsync_method,
> ost->file_index, ost->index, 0);
>
> +        if ((ost->frame_rate.num || ost->max_frame_rate.num) &&
> +            !(ost->vsync_method == VSYNC_AUTO ||
> +              ost->vsync_method == VSYNC_CFR || ost->vsync_method ==
> VSYNC_VSCFR)) {
> +            av_log(NULL, AV_LOG_FATAL, "One of -r/-fpsmax was specified "
> +                   "together a non-CFR -vsync/-fps_mode. This is
> contradictory.\n");
> +            exit_program(1);
> +        }
> +
>          if (ost->vsync_method == VSYNC_AUTO) {
> -            if (!strcmp(oc->oformat->name, "avi")) {
> +            if (ost->frame_rate.num || ost->max_frame_rate.num) {
> +                ost->vsync_method = VSYNC_CFR;
> +            } else if (!strcmp(oc->oformat->name, "avi")) {
>                  ost->vsync_method = VSYNC_VFR;
>              } else {
>                  ost->vsync_method = (oc->oformat->flags &
> AVFMT_VARIABLE_FPS)       ?
> diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak
> index f3c27ed1c8..63873a7a07 100644
> --- a/tests/fate/filter-video.mak
> +++ b/tests/fate/filter-video.mak
> @@ -365,7 +365,7 @@ FATE_FILTER-$(call FILTERFRAMECRC, TESTSRC2 FPS
> DECIMATE) += fate-filter-decimat
>  fate-filter-decimate: CMD = framecrc -lavfi
> testsrc2=r=24:d=10,fps=60,decimate=5,decimate=4,decimate=3 -pix_fmt yuv420p
>
>  FATE_FILTER-$(call FILTERFRAMECRC, TESTSRC2 FPS MPDECIMATE) +=
> fate-filter-mpdecimate
> -fate-filter-mpdecimate: CMD = framecrc -lavfi
> testsrc2=r=2:d=10,fps=3,mpdecimate -r 3 -pix_fmt yuv420p
> +fate-filter-mpdecimate: CMD = framecrc -lavfi
> testsrc2=r=2:d=10,fps=3,mpdecimate -pix_fmt yuv420p
>
>  FATE_FILTER-$(call FILTERFRAMECRC, FPS TESTSRC2) += $(addprefix
> fate-filter-fps-, up up-round-down up-round-up down down-round-down
> down-round-up down-eof-pass start-drop start-fill)
>  fate-filter-fps-up: CMD = framecrc -lavfi testsrc2=r=3:d=2,fps=7
> @@ -378,9 +378,8 @@ fate-filter-fps-down-eof-pass: CMD = framecrc -lavfi
> testsrc2=r=7:d=3.5,fps=3:eo
>  fate-filter-fps-start-drop: CMD = framecrc -lavfi
> testsrc2=r=7:d=3.5,fps=3:start_time=1.5
>  fate-filter-fps-start-fill: CMD = framecrc -lavfi
> testsrc2=r=7:d=1.5,setpts=PTS+14,fps=3:start_time=1.5
>
> -FATE_FILTER_SAMPLES-$(call FILTERDEMDEC, FPS SCALE, MOV, QTRLE) +=
> fate-filter-fps-cfr fate-filter-fps fate-filter-fps-r
> +FATE_FILTER_SAMPLES-$(call FILTERDEMDEC, FPS SCALE, MOV, QTRLE) +=
> fate-filter-fps-cfr fate-filter-fps
>  fate-filter-fps-cfr: CMD = framecrc -auto_conversion_filters -i
> $(TARGET_SAMPLES)/qtrle/apple-animation-variable-fps-bug.mov -r 30 -vsync
> cfr -pix_fmt yuv420p
> -fate-filter-fps-r:   CMD = framecrc -auto_conversion_filters -i
> $(TARGET_SAMPLES)/qtrle/apple-animation-variable-fps-bug.mov -r 30 -vf fps
> -pix_fmt yuv420p
>  fate-filter-fps:     CMD = framecrc -auto_conversion_filters -i
> $(TARGET_SAMPLES)/qtrle/apple-animation-variable-fps-bug.mov -vf fps=30
> -pix_fmt yuv420p
>
>  FATE_FILTER_ALPHAEXTRACT_ALPHAMERGE := $(addprefix
> fate-filter-alphaextract_alphamerge_, rgb yuv)
> diff --git a/tests/fate/video.mak b/tests/fate/video.mak
> index af7e77e814..d7639a3978 100644
> --- a/tests/fate/video.mak
> +++ b/tests/fate/video.mak
> @@ -269,9 +269,8 @@ fate-mv-sgirle: CMD = framecrc -i
> $(TARGET_SAMPLES)/mv/pet-rle.movie -an
>  FATE_VIDEO-$(call FRAMECRC, MXG, MXPEG) += fate-mxpeg
>  fate-mxpeg: CMD = framecrc -idct simple -flags +bitexact -i
> $(TARGET_SAMPLES)/mxpeg/m1.mxg -an
>
> -# FIXME dropped frames in this test because of coarse timebase
>  FATE_NUV += fate-nuv-rtjpeg
> -fate-nuv-rtjpeg: CMD = framecrc -idct simple -i
> $(TARGET_SAMPLES)/nuv/Today.nuv -an -r 1000
> +fate-nuv-rtjpeg: CMD = framecrc -idct simple -i
> $(TARGET_SAMPLES)/nuv/Today.nuv -an -enc_time_base -1
>
>  FATE_NUV += fate-nuv-rtjpeg-fh
>  fate-nuv-rtjpeg-fh: CMD = framecrc -idct simple -i
> $(TARGET_SAMPLES)/nuv/rtjpeg_frameheader.nuv -an
> diff --git a/tests/ref/fate/filter-fps-r b/tests/ref/fate/filter-fps-r
> deleted file mode 100644
> index c1bc7d1547..0000000000
> --- a/tests/ref/fate/filter-fps-r
> +++ /dev/null
> @@ -1,78 +0,0 @@
> -#tb 0: 1/30
> -#media_type 0: video
> -#codec_id 0: rawvideo
> -#dimensions 0: 112x182
> -#sar 0: 0/1
> -0,          0,          0,        1,    30576, 0xcdc29b3d
> -0,          1,          1,        1,    30576, 0xcdc29b3d
> -0,          2,          2,        1,    30576, 0xcdc29b3d
> -0,          4,          4,        1,    30576, 0xcdc29b3d
> -0,          5,          5,        1,    30576, 0xcdc29b3d
> -0,          6,          6,        1,    30576, 0x5c83656c
> -0,          7,          7,        1,    30576, 0x5c83656c
> -0,          8,          8,        1,    30576, 0x5c83656c
> -0,         10,         10,        1,    30576, 0x5c83656c
> -0,         11,         11,        1,    30576, 0x5c83656c
> -0,         12,         12,        1,    30576, 0x5c83656c
> -0,         13,         13,        1,    30576, 0x26b67f83
> -0,         14,         14,        1,    30576, 0x26b67f83
> -0,         16,         16,        1,    30576, 0x26b67f83
> -0,         17,         17,        1,    30576, 0x26b67f83
> -0,         18,         18,        1,    30576, 0x26b67f83
> -0,         19,         19,        1,    30576, 0x26b67f83
> -0,         20,         20,        1,    30576, 0x26b67f83
> -0,         22,         22,        1,    30576, 0x26b67f83
> -0,         23,         23,        1,    30576, 0x26b67f83
> -0,         24,         24,        1,    30576, 0x26b67f83
> -0,         25,         25,        1,    30576, 0x26b67f83
> -0,         26,         26,        1,    30576, 0x26b67f83
> -0,         28,         28,        1,    30576, 0x26b67f83
> -0,         29,         29,        1,    30576, 0x26b67f83
> -0,         30,         30,        1,    30576, 0x26b67f83
> -0,         31,         31,        1,    30576, 0x26b67f83
> -0,         32,         32,        1,    30576, 0x26b67f83
> -0,         34,         34,        1,    30576, 0x26b67f83
> -0,         35,         35,        1,    30576, 0x26b67f83
> -0,         36,         36,        1,    30576, 0x26b67f83
> -0,         37,         37,        1,    30576, 0x26b67f83
> -0,         38,         38,        1,    30576, 0x26b67f83
> -0,         40,         40,        1,    30576, 0x26b67f83
> -0,         41,         41,        1,    30576, 0x26b67f83
> -0,         42,         42,        1,    30576, 0x26b67f83
> -0,         43,         43,        1,    30576, 0x26b67f83
> -0,         44,         44,        1,    30576, 0x26b67f83
> -0,         46,         46,        1,    30576, 0x26b67f83
> -0,         47,         47,        1,    30576, 0x26b67f83
> -0,         48,         48,        1,    30576, 0x26b67f83
> -0,         49,         49,        1,    30576, 0x26b67f83
> -0,         50,         50,        1,    30576, 0x26b67f83
> -0,         52,         52,        1,    30576, 0x26b67f83
> -0,         53,         53,        1,    30576, 0x26b67f83
> -0,         54,         54,        1,    30576, 0x26b67f83
> -0,         55,         55,        1,    30576, 0x26b67f83
> -0,         56,         56,        1,    30576, 0x26b67f83
> -0,         58,         58,        1,    30576, 0x26b67f83
> -0,         59,         59,        1,    30576, 0x26b67f83
> -0,         60,         60,        1,    30576, 0x26b67f83
> -0,         61,         61,        1,    30576, 0x26b67f83
> -0,         62,         62,        1,    30576, 0x26b67f83
> -0,         64,         64,        1,    30576, 0x26b67f83
> -0,         65,         65,        1,    30576, 0x26b67f83
> -0,         66,         66,        1,    30576, 0x26b67f83
> -0,         67,         67,        1,    30576, 0x26b67f83
> -0,         68,         68,        1,    30576, 0x26b67f83
> -0,         70,         70,        1,    30576, 0x26b67f83
> -0,         71,         71,        1,    30576, 0x26b67f83
> -0,         72,         72,        1,    30576, 0x26b67f83
> -0,         73,         73,        1,    30576, 0xa2fcd06f
> -0,         74,         74,        1,    30576, 0xa2fcd06f
> -0,         76,         76,        1,    30576, 0xa2fcd06f
> -0,         77,         77,        1,    30576, 0xa2fcd06f
> -0,         78,         78,        1,    30576, 0xa2fcd06f
> -0,         79,         79,        1,    30576, 0xa2fcd06f
> -0,         80,         80,        1,    30576, 0xa2fcd06f
> -0,         82,         82,        1,    30576, 0xd4150aad
> -0,         83,         83,        1,    30576, 0xd4150aad
> -0,         84,         84,        1,    30576, 0xd4150aad
> -0,         85,         85,        1,    30576, 0xd4150aad
> -0,         86,         86,        1,    30576, 0xd4150aad
> diff --git a/tests/ref/fate/nuv-rtjpeg b/tests/ref/fate/nuv-rtjpeg
> index bc5af1ca22..d6093e78d8 100644
> --- a/tests/ref/fate/nuv-rtjpeg
> +++ b/tests/ref/fate/nuv-rtjpeg
> @@ -3,11 +3,11 @@
>  #codec_id 0: rawvideo
>  #dimensions 0: 640x480
>  #sar 0: 1/1
> -0,        118,        118,        1,   460800, 0x54aedafe
> -0,        152,        152,        1,   460800, 0xb7aa8b56
> -0,        177,        177,        1,   460800, 0x283ea3b5
> -0,        202,        202,        1,   460800, 0x283ea3b5
> -0,        235,        235,        1,   460800, 0x10e577de
> -0,        269,        269,        1,   460800, 0x4e091ee2
> -0,        302,        302,        1,   460800, 0x2ea88828
> -0,        335,        335,        1,   460800, 0x4b7f4df0
> +0,        118,        118,       33,   460800, 0x54aedafe
> +0,        152,        152,       33,   460800, 0xb7aa8b56
> +0,        177,        177,       33,   460800, 0x283ea3b5
> +0,        202,        202,       33,   460800, 0x283ea3b5
> +0,        235,        235,       33,   460800, 0x10e577de
> +0,        269,        269,       33,   460800, 0x4e091ee2
> +0,        302,        302,       33,   460800, 0x2ea88828
> +0,        335,        335,       33,   460800, 0x4b7f4df0
> --
> 2.35.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>


More information about the ffmpeg-devel mailing list