Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Anton Khirnov <anton@khirnov.net>
To: ffmpeg-devel@ffmpeg.org
Subject: [FFmpeg-devel] [PATCH 8/8] fftools/ffmpeg: always generate CFR output when -r is used
Date: Wed,  4 Jan 2023 17:42:46 +0100
Message-ID: <20230104164246.6133-8-anton@khirnov.net> (raw)
In-Reply-To: <20230104164246.6133-1-anton@khirnov.net>

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).
---
 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@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2023-01-04 16:46 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-04 16:42 [FFmpeg-devel] [PATCH 1/8] doc/ffmpeg.texi: drop a non-existent option Anton Khirnov
2023-01-04 16:42 ` [FFmpeg-devel] [PATCH 2/8] fftools/ffmpeg: stop using AVCodecContext.sample_rate in decode_audio() Anton Khirnov
2023-01-05  0:46   ` Michael Niedermayer
2023-01-05 11:09     ` Anton Khirnov
2023-01-04 16:42 ` [FFmpeg-devel] [PATCH 3/8] fftools/ffmpeg: fix stream id in an error message Anton Khirnov
2023-01-04 16:42 ` [FFmpeg-devel] [PATCH 4/8] fftools/ffmpeg: rename a variable to be more descriptive Anton Khirnov
2023-01-04 16:42 ` [FFmpeg-devel] [PATCH 5/8] fftools/ffmpeg: move video frame dup/drop logic into its own function Anton Khirnov
2023-01-04 16:42 ` [FFmpeg-devel] [PATCH 6/8] fftools/ffmpeg: reindent after previous commit Anton Khirnov
2023-01-04 16:42 ` [FFmpeg-devel] [PATCH 7/8] doc/ffmpeg: improve -r documentation Anton Khirnov
2023-01-04 16:42 ` Anton Khirnov [this message]
2023-01-04 17:37   ` [FFmpeg-devel] [PATCH 8/8] fftools/ffmpeg: always generate CFR output when -r is used Paul B Mahol
2023-01-04 17:41     ` Anton Khirnov

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=20230104164246.6133-8-anton@khirnov.net \
    --to=anton@khirnov.net \
    --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