Browse Source

lavfi/concat: allow to support inputs with different frame rates

Right now, the concat filter does not set the frame_rate value on any of
the out links. As a result, the default ffmpeg behaviour kicks in - to
copy the framerate from the first input to the outputs.

If a later input is higher framerate, this results in dropped frames; if
a later input is lower framerate it might cause judder.

This patch checks if all of the video inputs have the same framerate, and
if not it sets the out link to use '1/0' as the frame rate, the value
meaning "unknown/vfr".

A test is added to verify the VFR behaviour. The existing test for CFR
behaviour passes unchanged.
tags/n4.3
Calvin Walton Nicolas George 6 years ago
parent
commit
3ad5d4df9c
4 changed files with 249 additions and 2 deletions
  1. +14
    -1
      libavfilter/avf_concat.c
  2. +3
    -1
      tests/fate/filter-video.mak
  3. +8
    -0
      tests/filtergraphs/concat-vfr
  4. +224
    -0
      tests/ref/fate/filter-concat-vfr

+ 14
- 1
libavfilter/avf_concat.c View File

@@ -131,8 +131,21 @@ static int config_output(AVFilterLink *outlink)
outlink->h = inlink->h;
outlink->sample_aspect_ratio = inlink->sample_aspect_ratio;
outlink->format = inlink->format;
outlink->frame_rate = inlink->frame_rate;

for (seg = 1; seg < cat->nb_segments; seg++) {
inlink = ctx->inputs[in_no + seg * ctx->nb_outputs];
if (outlink->frame_rate.num != inlink->frame_rate.num ||
outlink->frame_rate.den != outlink->frame_rate.den) {
av_log(ctx, AV_LOG_VERBOSE,
"Video inputs have different frame rates, output will be VFR\n");
outlink->frame_rate = av_make_q(1, 0);
break;
}
}

for (seg = 1; seg < cat->nb_segments; seg++) {
inlink = ctx->inputs[in_no += ctx->nb_outputs];
inlink = ctx->inputs[in_no + seg * ctx->nb_outputs];
if (!outlink->sample_aspect_ratio.num)
outlink->sample_aspect_ratio = inlink->sample_aspect_ratio;
/* possible enhancement: unsafe mode, do not check */


+ 3
- 1
tests/fate/filter-video.mak View File

@@ -424,9 +424,11 @@ FATE_FILTER_SAMPLES-$(call ALLYES, VMD_DEMUXER VMDVIDEO_DECODER FORMAT_FILTER PE
fate-filter-gradfun-sample: tests/data/filtergraphs/gradfun
fate-filter-gradfun-sample: CMD = framecrc -i $(TARGET_SAMPLES)/vmd/12.vmd -filter_script $(TARGET_PATH)/tests/data/filtergraphs/gradfun -an -frames:v 20

FATE_FILTER-$(call ALLYES, TESTSRC_FILTER SINE_FILTER CONCAT_FILTER) += fate-filter-concat
FATE_FILTER-$(call ALLYES, TESTSRC_FILTER SINE_FILTER CONCAT_FILTER) += fate-filter-concat fate-filter-concat-vfr
fate-filter-concat: tests/data/filtergraphs/concat
fate-filter-concat: CMD = framecrc -filter_complex_script $(TARGET_PATH)/tests/data/filtergraphs/concat
fate-filter-concat-vfr: tests/data/filtergraphs/concat-vfr
fate-filter-concat-vfr: CMD = framecrc -filter_complex_script $(TARGET_PATH)/tests/data/filtergraphs/concat-vfr

FATE_FILTER-$(call ALLYES, TESTSRC2_FILTER FPS_FILTER MPDECIMATE_FILTER) += fate-filter-mpdecimate
fate-filter-mpdecimate: CMD = framecrc -lavfi testsrc2=r=2:d=10,fps=3,mpdecimate -r 3 -pix_fmt yuv420p


+ 8
- 0
tests/filtergraphs/concat-vfr View File

@@ -0,0 +1,8 @@
testsrc=r=5:n=1:d=2 [v1];
sine=440:b=2:d=1 [a1];
testsrc=r=15:n=1:d=1 [v2];
sine=622:b=2:d=2 [a2];
testsrc=r=8:n=1:d=1 [v3];
sine=880:b=2:d=1 [a3];

[v1][a1][v2][a2][v3][a3] concat=v=1:a=1:n=3

+ 224
- 0
tests/ref/fate/filter-concat-vfr View File

@@ -0,0 +1,224 @@
#tb 0: 1/1000000
#media_type 0: video
#codec_id 0: rawvideo
#dimensions 0: 320x240
#sar 0: 1/1
#tb 1: 1/44100
#media_type 1: audio
#codec_id 1: pcm_s16le
#sample_rate 1: 44100
#channel_layout 1: 4
#channel_layout_name 1: mono
0, 0, 0, 0, 230400, 0x88c4d19a
1, 0, 0, 1024, 2048, 0xb3f10192
1, 1024, 1024, 1024, 2048, 0xb340fe4e
1, 2048, 2048, 1024, 2048, 0x0a5f0111
1, 3072, 3072, 1024, 2048, 0x51be06b8
1, 4096, 4096, 1024, 2048, 0x71a1ffcb
1, 5120, 5120, 1024, 2048, 0x7f64f50f
1, 6144, 6144, 1024, 2048, 0x70a8fa17
1, 7168, 7168, 1024, 2048, 0x0dad072a
1, 8192, 8192, 1024, 2048, 0x5e810c51
0, 200000, 200000, 0, 230400, 0x0d77c977
1, 9216, 9216, 1024, 2048, 0xbe5bf462
1, 10240, 10240, 1024, 2048, 0xbcd9faeb
1, 11264, 11264, 1024, 2048, 0x0d5bfe9c
1, 12288, 12288, 1024, 2048, 0x97d80297
1, 13312, 13312, 1024, 2048, 0xba0f0894
1, 14336, 14336, 1024, 2048, 0xcc22f291
1, 15360, 15360, 1024, 2048, 0x11a9fa03
1, 16384, 16384, 1024, 2048, 0x9a920378
1, 17408, 17408, 1024, 2048, 0x901b0525
0, 400000, 400000, 0, 230400, 0x242629d7
1, 18432, 18432, 1024, 2048, 0x74b2003f
1, 19456, 19456, 1024, 2048, 0xa20ef3ed
1, 20480, 20480, 1024, 2048, 0x44cef9de
1, 21504, 21504, 1024, 2048, 0x4b2e039b
1, 22528, 22528, 1024, 2048, 0x198509a1
1, 23552, 23552, 1024, 2048, 0xcab6f9e5
1, 24576, 24576, 1024, 2048, 0x67f8f608
1, 25600, 25600, 1024, 2048, 0x8d7f03fa
0, 600000, 600000, 0, 230400, 0x62cdc018
1, 26624, 26624, 1024, 2048, 0x3e1e0566
1, 27648, 27648, 1024, 2048, 0x2cfe0308
1, 28672, 28672, 1024, 2048, 0x1ceaf702
1, 29696, 29696, 1024, 2048, 0x38a9f3d1
1, 30720, 30720, 1024, 2048, 0x6c3306b7
1, 31744, 31744, 1024, 2048, 0x600f0579
1, 32768, 32768, 1024, 2048, 0x3e5afa28
1, 33792, 33792, 1024, 2048, 0x053ff47a
1, 34816, 34816, 1024, 2048, 0x0d28fed9
0, 800000, 800000, 0, 230400, 0x248ad058
1, 35840, 35840, 1024, 2048, 0x279805cc
1, 36864, 36864, 1024, 2048, 0xb16a0a12
1, 37888, 37888, 1024, 2048, 0xb45af340
1, 38912, 38912, 1024, 2048, 0x1834f972
1, 39936, 39936, 1024, 2048, 0xb5d206ae
1, 40960, 40960, 1024, 2048, 0xc5760375
1, 41984, 41984, 1024, 2048, 0x503800ce
1, 43008, 43008, 1024, 2048, 0xa3bbf4af
1, 44032, 44032, 68, 136, 0xc8d751c7
0, 1000000, 1000000, 0, 230400, 0x223d134f
1, 44100, 44100, 9600, 19200, 0x00000000
0, 1200000, 1200000, 0, 230400, 0xbf1c3d34
1, 53700, 53700, 9600, 19200, 0x00000000
0, 1400000, 1400000, 0, 230400, 0xae0efe96
1, 63300, 63300, 9600, 19200, 0x00000000
0, 1600000, 1600000, 0, 230400, 0x0cd624d1
1, 72900, 72900, 9600, 19200, 0x00000000
0, 1800000, 1800000, 0, 230400, 0x6dedf2c0
1, 82500, 82500, 5700, 11400, 0x00000000
0, 2000000, 2000000, 0, 230400, 0x88c4d19a
1, 88200, 88200, 1024, 2048, 0x283efb3a
1, 89224, 89224, 1024, 2048, 0x7692fb8f
1, 90248, 90248, 1024, 2048, 0xbaaafcc0
0, 2066667, 2066667, 0, 230400, 0x5bbc2f63
1, 91272, 91272, 1024, 2048, 0xadc8017e
1, 92296, 92296, 1024, 2048, 0x4f4dffdc
1, 93320, 93320, 1024, 2048, 0x7ffbff48
0, 2133333, 2133333, 0, 230400, 0x3becbfad
1, 94344, 94344, 1024, 2048, 0x2f990719
1, 95368, 95368, 1024, 2048, 0xe2caf65c
1, 96392, 96392, 1024, 2048, 0x825208e4
0, 2200000, 2200000, 0, 230400, 0x0d77c977
1, 97416, 97416, 1024, 2048, 0xf563f13b
1, 98440, 98440, 1024, 2048, 0x855d03e9
1, 99464, 99464, 1024, 2048, 0x0ba9fa4b
0, 2266667, 2266667, 0, 230400, 0x436cf4b2
1, 100488, 100488, 1024, 2048, 0x83e1fb92
1, 101512, 101512, 1024, 2048, 0x1162f965
1, 102536, 102536, 1024, 2048, 0x0cfef73d
0, 2333333, 2333333, 0, 230400, 0x39210f27
1, 103560, 103560, 1024, 2048, 0x5688ff75
1, 104584, 104584, 1024, 2048, 0xf6c0ede9
1, 105608, 105608, 1024, 2048, 0xfdb20602
0, 2400000, 2400000, 0, 230400, 0x242629d7
1, 106632, 106632, 1024, 2048, 0x40c5f17b
1, 107656, 107656, 1024, 2048, 0x559600b1
1, 108680, 108680, 1024, 2048, 0xccc3f930
0, 2466667, 2466667, 0, 230400, 0x771c2293
1, 109704, 109704, 1024, 2048, 0xdc800045
1, 110728, 110728, 1024, 2048, 0xdce4fb3e
0, 2533333, 2533333, 0, 230400, 0xec2af9a9
1, 111752, 111752, 1024, 2048, 0x1e5efba9
1, 112776, 112776, 1024, 2048, 0x8c2e0832
1, 113800, 113800, 1024, 2048, 0x5c42f66d
0, 2600000, 2600000, 0, 230400, 0x62cdc018
1, 114824, 114824, 1024, 2048, 0x08e20b1e
1, 115848, 115848, 1024, 2048, 0x4cf7f903
1, 116872, 116872, 1024, 2048, 0xe6b90794
0, 2666667, 2666667, 0, 230400, 0xf02c8693
1, 117896, 117896, 1024, 2048, 0x5956f8e6
1, 118920, 118920, 1024, 2048, 0x6632ff16
1, 119944, 119944, 1024, 2048, 0x46c8fe11
0, 2733333, 2733333, 0, 230400, 0x14436efb
1, 120968, 120968, 1024, 2048, 0x7431f732
1, 121992, 121992, 1024, 2048, 0xa258049f
1, 123016, 123016, 1024, 2048, 0xdb71f00e
0, 2800000, 2800000, 0, 230400, 0x248ad058
1, 124040, 124040, 1024, 2048, 0xa89b0359
1, 125064, 125064, 1024, 2048, 0xe0aff0f2
1, 126088, 126088, 1024, 2048, 0xc33e0085
0, 2866667, 2866667, 0, 230400, 0xe87f6c52
1, 127112, 127112, 1024, 2048, 0x9d09f379
1, 128136, 128136, 1024, 2048, 0x8c78fd06
1, 129160, 129160, 1024, 2048, 0x532bfbdd
0, 2933333, 2933333, 0, 230400, 0x6a0c196b
1, 130184, 130184, 1024, 2048, 0xfc36f5cd
1, 131208, 131208, 1024, 2048, 0x2e8f0699
1, 132232, 132232, 1024, 2048, 0x52382578
1, 133256, 133256, 1024, 2048, 0x97ed1a28
1, 134280, 134280, 1024, 2048, 0xabcdf73f
1, 135304, 135304, 1024, 2048, 0x3a24082c
1, 136328, 136328, 1024, 2048, 0xbe1cfc3d
1, 137352, 137352, 1024, 2048, 0xad5800a5
1, 138376, 138376, 1024, 2048, 0x90b80522
1, 139400, 139400, 1024, 2048, 0x1fa1f912
1, 140424, 140424, 1024, 2048, 0x733a0878
1, 141448, 141448, 1024, 2048, 0x9a3eee47
1, 142472, 142472, 1024, 2048, 0x5d900759
1, 143496, 143496, 1024, 2048, 0x1287f540
1, 144520, 144520, 1024, 2048, 0x941cfe5d
1, 145544, 145544, 1024, 2048, 0x1587f8a9
1, 146568, 146568, 1024, 2048, 0xb9e7f888
1, 147592, 147592, 1024, 2048, 0xe9defbe2
1, 148616, 148616, 1024, 2048, 0x3a5ef312
1, 149640, 149640, 1024, 2048, 0xdcbe0544
1, 150664, 150664, 1024, 2048, 0xbe51ecc5
1, 151688, 151688, 1024, 2048, 0x21a60721
1, 152712, 152712, 1024, 2048, 0xf29ff318
1, 153736, 153736, 1024, 2048, 0xcd4c02ea
1, 154760, 154760, 1024, 2048, 0xa424faac
1, 155784, 155784, 1024, 2048, 0xbaedfdab
1, 156808, 156808, 1024, 2048, 0xcbff047c
1, 157832, 157832, 1024, 2048, 0x9ac8f96b
1, 158856, 158856, 1024, 2048, 0x43220bee
1, 159880, 159880, 1024, 2048, 0x547bf351
1, 160904, 160904, 1024, 2048, 0x7dd10d6e
1, 161928, 161928, 1024, 2048, 0x77cbf603
1, 162952, 162952, 1024, 2048, 0xb6fcff50
1, 163976, 163976, 1024, 2048, 0x927bfde5
1, 165000, 165000, 1024, 2048, 0x5bd0fca5
1, 166024, 166024, 1024, 2048, 0x672cff2a
1, 167048, 167048, 1024, 2048, 0x3e3ef01c
1, 168072, 168072, 1024, 2048, 0xe52607af
1, 169096, 169096, 1024, 2048, 0x66bceaf5
1, 170120, 170120, 1024, 2048, 0xe065046b
1, 171144, 171144, 1024, 2048, 0x350bf21f
1, 172168, 172168, 1024, 2048, 0x60b1fca4
1, 173192, 173192, 1024, 2048, 0x8b1efa55
1, 174216, 174216, 1024, 2048, 0xf86ff855
1, 175240, 175240, 1024, 2048, 0x6934061b
1, 176264, 176264, 136, 272, 0x4a458a45
0, 4000000, 4000000, 0, 230400, 0x88c4d19a
1, 176400, 176400, 1024, 2048, 0xdb0cfe95
1, 177424, 177424, 1024, 2048, 0xcff3fdf1
1, 178448, 178448, 1024, 2048, 0x070cf585
1, 179472, 179472, 1024, 2048, 0xe9b8007f
1, 180496, 180496, 1024, 2048, 0xc51ffd64
1, 181520, 181520, 1024, 2048, 0xede2fbf9
0, 4125000, 4125000, 0, 230400, 0x05c1b733
1, 182544, 182544, 1024, 2048, 0x51510410
1, 183568, 183568, 1024, 2048, 0x198af498
1, 184592, 184592, 1024, 2048, 0xae3603a2
1, 185616, 185616, 1024, 2048, 0x6200f7a1
1, 186640, 186640, 1024, 2048, 0xe6e3fe32
0, 4250000, 4250000, 0, 230400, 0x0446ec19
1, 187664, 187664, 1024, 2048, 0xb2e2fd77
1, 188688, 188688, 1024, 2048, 0x063dff2f
1, 189712, 189712, 1024, 2048, 0xa89ffe21
1, 190736, 190736, 1024, 2048, 0x9e6ffa6d
1, 191760, 191760, 1024, 2048, 0x028b004e
1, 192784, 192784, 1024, 2048, 0x57edfa23
0, 4375000, 4375000, 0, 230400, 0x0f9b1744
1, 193808, 193808, 1024, 2048, 0x6d8efe1f
1, 194832, 194832, 1024, 2048, 0x774bfe54
1, 195856, 195856, 1024, 2048, 0xa931fcfb
1, 196880, 196880, 1024, 2048, 0x3505004b
1, 197904, 197904, 1024, 2048, 0x5001f576
0, 4500000, 4500000, 0, 230400, 0x30cf070a
1, 198928, 198928, 1024, 2048, 0x78ea049b
1, 199952, 199952, 1024, 2048, 0xd45bf733
1, 200976, 200976, 1024, 2048, 0x6395fead
1, 202000, 202000, 1024, 2048, 0xc126015e
1, 203024, 203024, 1024, 2048, 0xbecff8aa
0, 4625000, 4625000, 0, 230400, 0x9175aaa9
1, 204048, 204048, 1024, 2048, 0x0fea06c3
1, 205072, 205072, 1024, 2048, 0xdea6f351
1, 206096, 206096, 1024, 2048, 0x35b808f0
1, 207120, 207120, 1024, 2048, 0x5487ee73
1, 208144, 208144, 1024, 2048, 0xac69050e
1, 209168, 209168, 1024, 2048, 0xcc5ffb00
0, 4750000, 4750000, 0, 230400, 0x597f5628
1, 210192, 210192, 1024, 2048, 0x328c00cb
1, 211216, 211216, 1024, 2048, 0xa707fd82
1, 212240, 212240, 1024, 2048, 0xe442f73d
1, 213264, 213264, 1024, 2048, 0x545c0418
1, 214288, 214288, 1024, 2048, 0x744ff3f7
0, 4875000, 4875000, 0, 230400, 0x38a45a85
1, 215312, 215312, 1024, 2048, 0x01aa04fd
1, 216336, 216336, 1024, 2048, 0xa885f7cd
1, 217360, 217360, 1024, 2048, 0xcfca04f4
1, 218384, 218384, 1024, 2048, 0x67fdf91b
1, 219408, 219408, 1024, 2048, 0xce2b001d
1, 220432, 220432, 68, 136, 0x33e64a0d

Loading…
Cancel
Save