/*
* Copyright (c) 2015 Martin Storsjo
*
- * This file is part of Libav.
+ * This file is part of FFmpeg.
*
- * Libav is free software; you can redistribute it and/or
+ * FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
- * Libav is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with Libav; if not, write to the Free Software
+ * License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
int end_frames = frames + n;
while (1) {
AVPacket pkt;
- uint8_t pktdata[4];
+ uint8_t pktdata[8] = { 0 };
av_init_packet(&pkt);
if (av_compare_ts(audio_dts, audio_st->time_base, video_dts, video_st->time_base) < 0) {
if (clear_duration)
pkt.duration = 0;
- AV_WB32(pktdata, pkt.pts);
+ AV_WB32(pktdata + 4, pkt.pts);
pkt.data = pktdata;
- pkt.size = 4;
+ pkt.size = 8;
if (skip_write)
continue;
if (skip_write_audio && pkt.stream_index == 1)
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)
{
av_write_trailer(ctx);
// moof+mdat pairs.
init_out("empty-moov");
av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
+ av_dict_set(&opts, "use_editlist", "0", 0);
init(0, 0);
mux_gops(2);
finish();
// simple input
init_out("delay-moov");
av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov", 0);
+ av_dict_set(&opts, "use_editlist", "0", 0);
init(0, 0);
mux_gops(2);
finish();
// is identical to the one by empty_moov.
init_out("empty-moov-header");
av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
+ av_dict_set(&opts, "use_editlist", "0", 0);
init(0, 0);
close_out();
memcpy(header, hash, HASH_SIZE);
init_out("delay-moov-header");
av_dict_set(&opts, "movflags", "frag_custom+delay_moov", 0);
+ av_dict_set(&opts, "use_editlist", "0", 0);
init(0, 0);
check(out_size == 0, "Output written during init with delay_moov");
mux_gops(1); // Write 1 second of content
close_out();
check(!memcmp(hash, content, HASH_SIZE), "discontinuously written fragment differs");
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
-4e7e78793cdda3c9ed28fbf47df39c43 2449 non-empty-moov
-5b825dc829f35c9d5b76834c378276d7 2897 non-empty-moov-elst
-0fd659671dec7d05cfa533a4579b1d6d 2817 non-empty-moov-no-elst
-890ad73874bff5aefbd549bc75a15b8e 9139 ismv
-aa6f42a0546a27f7047f1cff812a552f 2327 empty-moov
-9a439649d13cdcddf6179234fe3d8a8e 2727 empty-moov-no-elst
-2451cb44e678845ed26e014e1affe5e8 2559 empty-moov-no-elst-no-adjust
-aa6f42a0546a27f7047f1cff812a552f 2327 delay-moov
-09354eac8e7a48216d535df8a88db5ca 2639 delay-moov-elst
-5c2a209249df8c7e3d55418da2ebe5cf 1846 delay-moov-empty-track
-89e03fa0c53e4a89b7fbb1df9f93774f 1749 delay-moov-empty-track-flush
-f8f6bf271a512bff1edba1d930172829 1183 empty-moov-header
-f12baf7c4269695817337192c7069328 996 empty-moov-content
-f8f6bf271a512bff1edba1d930172829 1183 delay-moov-header
-f12baf7c4269695817337192c7069328 996 delay-moov-content
-76e1081bbab7541eadcaf4b19d37eff6 584 empty-moov-second-frag
-76e1081bbab7541eadcaf4b19d37eff6 584 empty-moov-second-frag-discont
-76e1081bbab7541eadcaf4b19d37eff6 584 delay-moov-second-frag-discont
-93d5d944d10570857b726dd1c482bc03 1207 delay-moov-elst-init
-41afdc44b0e376fae49a730afe0c53c2 704 delay-moov-elst-second-frag
-93d5d944d10570857b726dd1c482bc03 1207 delay-moov-elst-init-discont
-41afdc44b0e376fae49a730afe0c53c2 704 delay-moov-elst-second-frag-discont
-bf648056bf98cf98b0fbd1334d788423 1243 delay-moov-elst-signal-init
-13b8487a4f004ec9f1db543aee1e5e18 704 delay-moov-elst-signal-second-frag
-bf648056bf98cf98b0fbd1334d788423 1243 delay-moov-elst-signal-init-discont
-13b8487a4f004ec9f1db543aee1e5e18 704 delay-moov-elst-signal-second-frag-discont
-4407220c69fb6d96fd3f4daea05140c3 3647 vfr
-4407220c69fb6d96fd3f4daea05140c3 3647 vfr-noduration
+249e02e3645ea5ca2c74397c62c53314 3269 non-empty-moov
+3281ff664e9a06e5a03ec6ea1729696c 3721 non-empty-moov-elst
+b408a545b1963a5ea82cf37208b66548 3629 non-empty-moov-no-elst
+f717c240ddfc036ed8a635b0af55bac2 11459 ismv
+176a315a5385cb2e082d863e0fb22bf1 2891 empty-moov
+10eb3fdf6ed1400a1eec50746537159f 3283 empty-moov-no-elst
+bcd4d6d22f828f1061e13f3af459644f 3115 empty-moov-no-elst-no-adjust
+176a315a5385cb2e082d863e0fb22bf1 2891 delay-moov
+1398c80f1f5fd7f8e127bb5b17311016 3203 delay-moov-elst
+ed6dd0e0fd6d0d9d1145b201674325f6 2098 delay-moov-empty-track
+7f1dabd680135708c6ff359e4ab27165 2001 delay-moov-empty-track-flush
+39d798aa11a265c7906f9e11d4f303c0 1159 empty-moov-header
+a0165f4a26a409212b0946e981bdefb9 1584 empty-moov-content
+39d798aa11a265c7906f9e11d4f303c0 1159 delay-moov-header
+a0165f4a26a409212b0946e981bdefb9 1584 delay-moov-content
+272a474cfd2a68cc5f05b426b14a2b7d 876 empty-moov-second-frag
+272a474cfd2a68cc5f05b426b14a2b7d 876 empty-moov-second-frag-discont
+272a474cfd2a68cc5f05b426b14a2b7d 876 delay-moov-second-frag-discont
+6256445b9595de78be493e0faf2bc5d7 1219 delay-moov-elst-init
+fcae8f40e015b59aabc8d4a99a759ca1 996 delay-moov-elst-second-frag
+6256445b9595de78be493e0faf2bc5d7 1219 delay-moov-elst-init-discont
+fcae8f40e015b59aabc8d4a99a759ca1 996 delay-moov-elst-second-frag-discont
++29f875e401df0fc3026995d12872ef21 1219 delay-moov-elst-signal-init
++aa5462cc0d2144f72154d9c309edb57d 996 delay-moov-elst-signal-second-frag
++29f875e401df0fc3026995d12872ef21 1219 delay-moov-elst-signal-init-discont
++aa5462cc0d2144f72154d9c309edb57d 996 delay-moov-elst-signal-second-frag-discont
+6cd6085f4f0ff536acfcb77cb658eb47 4935 vfr
+6cd6085f4f0ff536acfcb77cb658eb47 4935 vfr-noduration