From a79aafd0b4d37eda6f15dc68e6509d4e815290c9 Mon Sep 17 00:00:00 2001 From: Martin Storsjö Date: Mon, 9 May 2016 13:48:58 +0300 Subject: movenc: Add a test for VFR with b-frames, with a duration change at a fragment end MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/tests/movenc.c | 35 ++++++++++++++++++++++++++++++++++- tests/ref/fate/movenc | 8 ++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/libavformat/tests/movenc.c b/libavformat/tests/movenc.c index 291f30f6c8..05432eb488 100644 --- a/libavformat/tests/movenc.c +++ b/libavformat/tests/movenc.c @@ -70,6 +70,8 @@ int skip_write; int skip_write_audio; int clear_duration; int force_iobuf_size; +int do_interleave; +int fake_pkt_duration; int num_warnings; @@ -283,6 +285,8 @@ static void mux_frames(int n) } if (!bframes) pkt.pts = pkt.dts; + if (fake_pkt_duration) + pkt.duration = fake_pkt_duration; frames++; } @@ -295,7 +299,10 @@ static void mux_frames(int n) continue; if (skip_write_audio && pkt.stream_index == 1) continue; - av_write_frame(ctx, &pkt); + if (do_interleave) + av_interleaved_write_frame(ctx, &pkt); + else + av_write_frame(ctx, &pkt); } } @@ -709,6 +716,32 @@ int main(int argc, char **argv) close_out(); force_iobuf_size = 0; + // Test VFR content with bframes with interleaving. + // Here, using av_interleaved_write_frame allows the muxer to get the + // fragment end durations right. We always set the packet duration to + // the expected, but we simulate dropped frames at one point. + do_interleave = 1; + init_out("vfr-noduration-interleave"); + av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov", 0); + av_dict_set(&opts, "frag_duration", "650000", 0); + init_fps(1, 1, 30); + mux_frames(gop_size/2); + // Pretend that the packet duration is the normal, even if + // we actually skip a bunch of frames. (I.e., simulate that + // we don't know of the framedrop in advance.) + fake_pkt_duration = duration; + duration *= 10; + mux_frames(1); + fake_pkt_duration = 0; + duration /= 10; + mux_frames(gop_size/2 - 1); + mux_gops(1); + finish(); + close_out(); + clear_duration = 0; + do_interleave = 0; + + av_free(md5); return check_faults > 0 ? 1 : 0; diff --git a/tests/ref/fate/movenc b/tests/ref/fate/movenc index d42c62b4c2..a0a170080d 100644 --- a/tests/ref/fate/movenc +++ b/tests/ref/fate/movenc @@ -125,3 +125,11 @@ write_data len 1500, time 9666667, type sync atom moof write_data len 664, time nopts, type unknown atom - write_data len 148, time nopts, type trailer atom - 03766894d839e5fcb1edb88498d812f7 5687 large_frag +write_data len 1255, time nopts, type header atom ftyp +write_data len 508, time -33333, type sync atom moof +write_data len 372, time 800000, type boundary atom moof +write_data len 328, time 1266667, type boundary atom moof +write_data len 476, time 1566667, type sync atom moof +write_data len 340, time 2233333, type boundary atom moof +write_data len 262, time nopts, type trailer atom - +a4280bdc23af2c4334ec2da3fa946d3a 3541 vfr-noduration-interleave -- cgit v1.2.3