From: Calvin Walton Date: Fri, 30 Aug 2019 17:28:17 +0000 (-0400) Subject: lavfi/concat: allow to support inputs with different frame rates X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=3ad5d4df9ce794d3eeb0f526c5f3e446bf97c616;p=ffmpeg 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. --- diff --git a/libavfilter/avf_concat.c b/libavfilter/avf_concat.c index 1d0c2de2905..2791859d8fa 100644 --- a/libavfilter/avf_concat.c +++ b/libavfilter/avf_concat.c @@ -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 */ diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak index 60c6be143b5..0c6ee72432d 100644 --- a/tests/fate/filter-video.mak +++ b/tests/fate/filter-video.mak @@ -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 diff --git a/tests/filtergraphs/concat-vfr b/tests/filtergraphs/concat-vfr new file mode 100644 index 00000000000..e15cb968459 --- /dev/null +++ b/tests/filtergraphs/concat-vfr @@ -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 diff --git a/tests/ref/fate/filter-concat-vfr b/tests/ref/fate/filter-concat-vfr new file mode 100644 index 00000000000..0dece67a07c --- /dev/null +++ b/tests/ref/fate/filter-concat-vfr @@ -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