You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
movenc: Add a test for VFR with b-frames, with a duration change at a fragment end
Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
@@ -70,6 +70,8 @@ int skip_write;
|
|||||||
int skip_write_audio;
|
int skip_write_audio;
|
||||||
int clear_duration;
|
int clear_duration;
|
||||||
int force_iobuf_size;
|
int force_iobuf_size;
|
||||||
|
int do_interleave;
|
||||||
|
int fake_pkt_duration;
|
||||||
|
|
||||||
int num_warnings;
|
int num_warnings;
|
||||||
|
|
||||||
@@ -283,6 +285,8 @@ static void mux_frames(int n)
|
|||||||
}
|
}
|
||||||
if (!bframes)
|
if (!bframes)
|
||||||
pkt.pts = pkt.dts;
|
pkt.pts = pkt.dts;
|
||||||
|
if (fake_pkt_duration)
|
||||||
|
pkt.duration = fake_pkt_duration;
|
||||||
frames++;
|
frames++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -295,6 +299,9 @@ static void mux_frames(int n)
|
|||||||
continue;
|
continue;
|
||||||
if (skip_write_audio && pkt.stream_index == 1)
|
if (skip_write_audio && pkt.stream_index == 1)
|
||||||
continue;
|
continue;
|
||||||
|
if (do_interleave)
|
||||||
|
av_interleaved_write_frame(ctx, &pkt);
|
||||||
|
else
|
||||||
av_write_frame(ctx, &pkt);
|
av_write_frame(ctx, &pkt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -709,6 +716,32 @@ int main(int argc, char **argv)
|
|||||||
close_out();
|
close_out();
|
||||||
force_iobuf_size = 0;
|
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);
|
av_free(md5);
|
||||||
|
|
||||||
return check_faults > 0 ? 1 : 0;
|
return check_faults > 0 ? 1 : 0;
|
||||||
|
@@ -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 664, time nopts, type unknown atom -
|
||||||
write_data len 148, time nopts, type trailer atom -
|
write_data len 148, time nopts, type trailer atom -
|
||||||
03766894d839e5fcb1edb88498d812f7 5687 large_frag
|
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
|
||||||
|
Reference in New Issue
Block a user