Merge commit '1d62ee38894afb696674db78cee8f8d89204a8fe'
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>
Wed, 18 Nov 2015 16:41:04 +0000 (16:41 +0000)
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>
Wed, 18 Nov 2015 16:43:32 +0000 (16:43 +0000)
* commit '1d62ee38894afb696674db78cee8f8d89204a8fe':
  movenc: Add a unit test for signaling of the track start times

Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
1  2 
libavformat/movenc-test.c
tests/ref/fate/movenc

@@@ -1,20 -1,20 +1,20 @@@
  /*
   * 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
   */
  
@@@ -215,7 -215,7 +215,7 @@@ static void mux_frames(int n
      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)
@@@ -280,6 -280,23 +280,23 @@@ static void skip_gops(int n
      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);
@@@ -369,7 -386,6 +386,7 @@@ int main(int argc, char **argv
      // 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
diff --combined tests/ref/fate/movenc
@@@ -1,24 -1,28 +1,28 @@@
 -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