|
|
@ -280,6 +280,23 @@ static void skip_gops(int n) |
|
|
|
skip_write = 0; |
|
|
|
skip_write = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void signal_init_ts(void) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
AVPacket pkt; |
|
|
|
|
|
|
|
av_init_packet(&pkt); |
|
|
|
|
|
|
|
pkt.size = 0; |
|
|
|
|
|
|
|
pkt.data = NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pkt.stream_index = 0; |
|
|
|
|
|
|
|
pkt.dts = video_dts; |
|
|
|
|
|
|
|
pkt.pts = 0; |
|
|
|
|
|
|
|
av_write_frame(ctx, &pkt); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pkt.stream_index = 1; |
|
|
|
|
|
|
|
pkt.dts = pkt.pts = audio_dts; |
|
|
|
|
|
|
|
av_write_frame(ctx, &pkt); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void finish(void) |
|
|
|
static void finish(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
av_write_trailer(ctx); |
|
|
|
av_write_trailer(ctx); |
|
|
@ -572,6 +589,40 @@ int main(int argc, char **argv) |
|
|
|
finish(); |
|
|
|
finish(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Test discontinously written fragments with b-frames and audio preroll,
|
|
|
|
|
|
|
|
// properly signaled.
|
|
|
|
|
|
|
|
av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash", 0); |
|
|
|
|
|
|
|
init(1, 1); |
|
|
|
|
|
|
|
mux_gops(1); |
|
|
|
|
|
|
|
init_out("delay-moov-elst-signal-init"); |
|
|
|
|
|
|
|
av_write_frame(ctx, NULL); // Output the moov
|
|
|
|
|
|
|
|
close_out(); |
|
|
|
|
|
|
|
memcpy(header, hash, HASH_SIZE); |
|
|
|
|
|
|
|
av_write_frame(ctx, NULL); // Output the first fragment
|
|
|
|
|
|
|
|
init_out("delay-moov-elst-signal-second-frag"); |
|
|
|
|
|
|
|
mux_gops(1); |
|
|
|
|
|
|
|
av_write_frame(ctx, NULL); // Output the second fragment
|
|
|
|
|
|
|
|
close_out(); |
|
|
|
|
|
|
|
memcpy(content, hash, HASH_SIZE); |
|
|
|
|
|
|
|
finish(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash+frag_discont", 0); |
|
|
|
|
|
|
|
av_dict_set(&opts, "fragment_index", "2", 0); |
|
|
|
|
|
|
|
init(1, 1); |
|
|
|
|
|
|
|
signal_init_ts(); |
|
|
|
|
|
|
|
skip_gops(1); |
|
|
|
|
|
|
|
mux_gops(1); // Write the second fragment
|
|
|
|
|
|
|
|
init_out("delay-moov-elst-signal-init-discont"); |
|
|
|
|
|
|
|
av_write_frame(ctx, NULL); // Output the moov
|
|
|
|
|
|
|
|
close_out(); |
|
|
|
|
|
|
|
check(!memcmp(hash, header, HASH_SIZE), "discontinuously written header differs"); |
|
|
|
|
|
|
|
init_out("delay-moov-elst-signal-second-frag-discont"); |
|
|
|
|
|
|
|
av_write_frame(ctx, NULL); // Output the second fragment
|
|
|
|
|
|
|
|
close_out(); |
|
|
|
|
|
|
|
check(!memcmp(hash, content, HASH_SIZE), "discontinuously written fragment differs"); |
|
|
|
|
|
|
|
finish(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Test VFR content, with sidx atoms (which declare the pts duration
|
|
|
|
// Test VFR content, with sidx atoms (which declare the pts duration
|
|
|
|
// of a fragment, forcing overriding the start pts of the next one).
|
|
|
|
// of a fragment, forcing overriding the start pts of the next one).
|
|
|
|
// Here, the fragment duration in pts is significantly different from
|
|
|
|
// Here, the fragment duration in pts is significantly different from
|
|
|
|