fftools/ffmpeg: always generate CFR output when -r is used

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).
pull/388/head
Anton Khirnov 2 years ago
parent e884360e91
commit 260f391893
  1. 16
      fftools/ffmpeg_mux_init.c
  2. 5
      tests/fate/filter-video.mak
  3. 3
      tests/fate/video.mak
  4. 78
      tests/ref/fate/filter-fps-r
  5. 16
      tests/ref/fate/nuv-rtjpeg

@ -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) ?

@ -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)

@ -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

@ -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

@ -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

Loading…
Cancel
Save