Merge commit 'a79aafd0b4d37eda6f15dc68e6509d4e815290c9'
authorMatthieu Bouron <matthieu.bouron@stupeflix.com>
Thu, 23 Jun 2016 20:20:10 +0000 (22:20 +0200)
committerMatthieu Bouron <matthieu.bouron@stupeflix.com>
Thu, 23 Jun 2016 20:20:10 +0000 (22:20 +0200)
* commit 'a79aafd0b4d37eda6f15dc68e6509d4e815290c9':
  movenc: Add a test for VFR with b-frames, with a duration change at a fragment end

Merged-by: Matthieu Bouron <matthieu.bouron@stupeflix.com>
1  2 
libavformat/tests/movenc.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
   */
  
@@@ -44,7 -44,7 +44,7 @@@ static const uint8_t aac_extradata[] = 
  };
  
  
 -const char *format = "mp4";
 +static const char *format = "mp4";
  AVFormatContext *ctx;
  uint8_t iobuf[32768];
  AVDictionary *opts;
@@@ -70,6 -70,8 +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;
  
@@@ -246,7 -248,7 +248,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 (!bframes)
                  pkt.pts = pkt.dts;
+             if (fake_pkt_duration)
+                 pkt.duration = fake_pkt_duration;
              frames++;
          }
  
          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)
              continue;
-         av_write_frame(ctx, &pkt);
+         if (do_interleave)
+             av_interleaved_write_frame(ctx, &pkt);
+         else
+             av_write_frame(ctx, &pkt);
      }
  }
  
@@@ -417,7 -424,6 +424,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();
      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 --combined tests/ref/fate/movenc
  write_data len 36, time nopts, type header atom ftyp
 -write_data len 1807, time nopts, type header atom -
 -write_data len 496, time 1000000, type sync atom moof
 +write_data len 2335, time nopts, type header atom -
 +write_data len 788, time 1000000, type sync atom moof
  write_data len 110, time nopts, type trailer atom -
 -07cee26b35b140ae50268c3083e2d880 2449 non-empty-moov
 +214242e9c7c93171d2f47f5b47776559 3269 non-empty-moov
  write_data len 36, time nopts, type header atom ftyp
 -write_data len 2135, time nopts, type header atom -
 -write_data len 616, time 966667, type sync atom moof
 +write_data len 2667, time nopts, type header atom -
 +write_data len 908, time 966667, type sync atom moof
  write_data len 110, time nopts, type trailer atom -
 -c3c47c2c9566cb410e0832c37f4f8527 2897 non-empty-moov-elst
 +44467d568a3cc38d414fd8ed4b2a968f 3721 non-empty-moov-elst
  write_data len 36, time nopts, type header atom ftyp
 -write_data len 2055, time nopts, type header atom -
 -write_data len 616, time 1000000, type sync atom moof
 +write_data len 2575, time nopts, type header atom -
 +write_data len 908, time 1000000, type sync atom moof
  write_data len 110, time nopts, type trailer atom -
 -abc910edf1fc2a205658353dfdfc9a5f 2817 non-empty-moov-no-elst
 +de22b98a3885f9b4b83cdd48ff46aeb9 3629 non-empty-moov-no-elst
  write_data len 20, time nopts, type header atom ftyp
 -write_data len 1195, time nopts, type header atom -
 -write_data len 608, time 0, type sync atom moof
 -write_data len 652, time nopts, type unknown atom -
 -write_data len 608, time 1013106, type sync atom moof
 -write_data len 640, time nopts, type unknown atom -
 +write_data len 1171, time nopts, type header atom -
 +write_data len 728, time 0, type sync atom moof
 +write_data len 828, time nopts, type unknown atom -
 +write_data len 728, time 1013106, type sync atom moof
 +write_data len 812, time nopts, type unknown atom -
  write_data len 148, time nopts, type trailer atom -
 -e8e0346bf20bfcb448695bd905946f78 3871 ismv
 +1f37c1a8e01651e8bebcd66f00b6a226 4435 ismv
  write_data len 36, time nopts, type header atom ftyp
 -write_data len 1147, time nopts, type header atom -
 -write_data len 500, time 0, type sync atom moof
 -write_data len 496, time 1000000, type sync atom moof
 +write_data len 1123, time nopts, type header atom -
 +write_data len 796, time 0, type sync atom moof
 +write_data len 788, time 1000000, type sync atom moof
  write_data len 148, time nopts, type trailer atom -
 -89ea214e1d1079556164664eea9a7884 2327 empty-moov
 +ed8506ebfce4c41732205ae26a4759fd 2891 empty-moov
  write_data len 36, time nopts, type header atom ftyp
 -write_data len 1147, time nopts, type header atom -
 -write_data len 780, time 0, type sync atom moof
 -write_data len 616, time 1000000, type sync atom moof
 +write_data len 1123, time nopts, type header atom -
 +write_data len 1068, time 0, type sync atom moof
 +write_data len 908, time 1000000, type sync atom moof
  write_data len 148, time nopts, type trailer atom -
 -cf9eec38fe557203a37a44c8adafb1fe 2727 empty-moov-no-elst
 +1844ee6d19fd1e6daf2655632cf26310 3283 empty-moov-no-elst
  write_data len 36, time nopts, type header atom ftyp
 -write_data len 1147, time nopts, type header atom -
 -write_data len 612, time -33333, type sync atom moof
 -write_data len 616, time 966667, type sync atom moof
 +write_data len 1123, time nopts, type header atom -
 +write_data len 900, time -33333, type sync atom moof
 +write_data len 908, time 966667, type sync atom moof
  write_data len 148, time nopts, type trailer atom -
 -42eca5843d98aa9a9b3275de201700b8 2559 empty-moov-no-elst-no-adjust
 -write_data len 1183, time nopts, type header atom ftyp
 -write_data len 500, time 0, type sync atom moof
 -write_data len 496, time 1000000, type sync atom moof
 +139b27dbe2a80c2dc088d0c755f26033 3115 empty-moov-no-elst-no-adjust
 +write_data len 1159, time nopts, type header atom ftyp
 +write_data len 796, time 0, type sync atom moof
 +write_data len 788, time 1000000, type sync atom moof
  write_data len 148, time nopts, type trailer atom -
 -89ea214e1d1079556164664eea9a7884 2327 delay-moov
 -write_data len 1255, time nopts, type header atom ftyp
 -write_data len 620, time -33333, type sync atom moof
 -write_data len 616, time 966667, type sync atom moof
 +ed8506ebfce4c41732205ae26a4759fd 2891 delay-moov
 +write_data len 1231, time nopts, type header atom ftyp
 +write_data len 916, time -33333, type sync atom moof
 +write_data len 908, time 966667, type sync atom moof
  write_data len 148, time nopts, type trailer atom -
 -8fd78a5a91d73a735da53ac02f844177 2639 delay-moov-elst
 -write_data len 1183, time nopts, type header atom ftyp
 -write_data len 596, time 0, type sync atom moof
 +3ece148745cd64b4428530a4d1080a2d 3203 delay-moov-elst
 +write_data len 1195, time nopts, type header atom ftyp
 +write_data len 836, time 0, type sync atom moof
  write_data len 67, time nopts, type trailer atom -
 -848d2fe2f27882960b8e10315460bc23 1846 delay-moov-empty-track
 -write_data len 1183, time nopts, type header atom ftyp
 -write_data len 240, time 0, type sync atom moof
 -write_data len 240, time 1000000, type sync atom moof
 +9562946a369e6fb570fb2fd7aa2fe728 2098 delay-moov-empty-track
 +write_data len 1195, time nopts, type header atom ftyp
 +write_data len 360, time 0, type sync atom moof
 +write_data len 360, time 1000000, type sync atom moof
  write_data len 86, time nopts, type trailer atom -
 -cbf60ba66c47b8506c1a724d43f12cdc 1749 delay-moov-empty-track-flush
 +4c7832b81836331c6c37155dc31d95be 2001 delay-moov-empty-track-flush
  write_data len 36, time nopts, type header atom ftyp
 -write_data len 1147, time nopts, type header atom -
 -c0b13fd47ca4c6de13c03155c38c231c 1183 empty-moov-header
 -write_data len 500, time 0, type sync atom moof
 -write_data len 496, time 1000000, type sync atom moof
 -f12baf7c4269695817337192c7069328 996 empty-moov-content
 +write_data len 1123, time nopts, type header atom -
 +b7e3c768b9094ebe2fda44979a7f8985 1159 empty-moov-header
 +write_data len 796, time 0, type sync atom moof
 +write_data len 788, time 1000000, type sync atom moof
 +a0165f4a26a409212b0946e981bdefb9 1584 empty-moov-content
  write_data len 148, time nopts, type trailer atom -
 -write_data len 1183, time nopts, type header atom ftyp
 -c0b13fd47ca4c6de13c03155c38c231c 1183 delay-moov-header
 -write_data len 500, time 0, type sync atom moof
 -write_data len 496, time 1000000, type sync atom moof
 -f12baf7c4269695817337192c7069328 996 delay-moov-content
 +write_data len 1159, time nopts, type header atom ftyp
 +b7e3c768b9094ebe2fda44979a7f8985 1159 delay-moov-header
 +write_data len 796, time 0, type sync atom moof
 +write_data len 788, time 1000000, type sync atom moof
 +a0165f4a26a409212b0946e981bdefb9 1584 delay-moov-content
  write_data len 148, time nopts, type trailer atom -
  write_data len 24, time nopts, type header atom -
 -write_data len 1147, time nopts, type header atom -
 -write_data len 588, time 0, type sync atom sidx
 -write_data len 584, time 1000000, type sync atom sidx
 -76e1081bbab7541eadcaf4b19d37eff6 584 empty-moov-second-frag
 +write_data len 1123, time nopts, type header atom -
 +write_data len 884, time 0, type sync atom sidx
 +write_data len 876, time 1000000, type sync atom sidx
 +272a474cfd2a68cc5f05b426b14a2b7d 876 empty-moov-second-frag
  write_data len 148, time nopts, type trailer atom -
  write_data len 24, time nopts, type header atom -
 -write_data len 1147, time nopts, type header atom -
 -write_data len 584, time 1000000, type sync atom sidx
 -76e1081bbab7541eadcaf4b19d37eff6 584 empty-moov-second-frag-discont
 +write_data len 1123, time nopts, type header atom -
 +write_data len 876, time 1000000, type sync atom sidx
 +272a474cfd2a68cc5f05b426b14a2b7d 876 empty-moov-second-frag-discont
  write_data len 110, time nopts, type trailer atom -
 -write_data len 1171, time nopts, type header atom -
 -write_data len 584, time 1000000, type sync atom sidx
 -76e1081bbab7541eadcaf4b19d37eff6 584 delay-moov-second-frag-discont
 +write_data len 1219, time nopts, type header atom -
 +write_data len 876, time 1000000, type sync atom sidx
 +272a474cfd2a68cc5f05b426b14a2b7d 876 delay-moov-second-frag-discont
  write_data len 110, time nopts, type trailer atom -
 -write_data len 1207, time nopts, type header atom ftyp
 -fdc08ccfb9ca1a7a63a8e82a99e28e83 1207 delay-moov-elst-init
 -write_data len 700, time -33333, type sync atom sidx
 -write_data len 704, time 966667, type sync atom sidx
 -41afdc44b0e376fae49a730afe0c53c2 704 delay-moov-elst-second-frag
 +write_data len 1219, time nopts, type header atom ftyp
 +6ec3698bcc86013e0016e3d47d230363 1219 delay-moov-elst-init
 +write_data len 988, time -33333, type sync atom sidx
 +write_data len 996, time 966667, type sync atom sidx
 +fcae8f40e015b59aabc8d4a99a759ca1 996 delay-moov-elst-second-frag
  write_data len 148, time nopts, type trailer atom -
 -write_data len 1207, time nopts, type header atom ftyp
 -fdc08ccfb9ca1a7a63a8e82a99e28e83 1207 delay-moov-elst-init-discont
 -write_data len 704, time 966667, type sync atom sidx
 -41afdc44b0e376fae49a730afe0c53c2 704 delay-moov-elst-second-frag-discont
 +write_data len 1219, time nopts, type header atom ftyp
 +6ec3698bcc86013e0016e3d47d230363 1219 delay-moov-elst-init-discont
 +write_data len 996, time 966667, type sync atom sidx
 +fcae8f40e015b59aabc8d4a99a759ca1 996 delay-moov-elst-second-frag-discont
  write_data len 110, time nopts, type trailer atom -
 -write_data len 1243, time nopts, type header atom ftyp
 -57c113cd2baf7b231355eee6980fb6b5 1243 delay-moov-elst-signal-init
 -write_data len 708, time -33333, type sync atom sidx
 -write_data len 704, time 966667, type sync atom sidx
 -13b8487a4f004ec9f1db543aee1e5e18 704 delay-moov-elst-signal-second-frag
 +write_data len 1219, time nopts, type header atom ftyp
 +c3681590a292cb9ca19a5a982e530166 1219 delay-moov-elst-signal-init
 +write_data len 1004, time -33333, type sync atom sidx
 +write_data len 996, time 966667, type sync atom sidx
 +aa5462cc0d2144f72154d9c309edb57d 996 delay-moov-elst-signal-second-frag
  write_data len 148, time nopts, type trailer atom -
 -write_data len 1243, time nopts, type header atom ftyp
 -57c113cd2baf7b231355eee6980fb6b5 1243 delay-moov-elst-signal-init-discont
 -write_data len 704, time 966667, type sync atom sidx
 -13b8487a4f004ec9f1db543aee1e5e18 704 delay-moov-elst-signal-second-frag-discont
 +write_data len 1219, time nopts, type header atom ftyp
 +c3681590a292cb9ca19a5a982e530166 1219 delay-moov-elst-signal-init-discont
 +write_data len 996, time 966667, type sync atom sidx
 +aa5462cc0d2144f72154d9c309edb57d 996 delay-moov-elst-signal-second-frag-discont
  write_data len 110, time nopts, type trailer atom -
 -write_data len 1243, time nopts, type header atom ftyp
 -write_data len 1552, time -333333, type sync atom sidx
 -write_data len 704, time 5166667, type sync atom sidx
 +write_data len 1219, time nopts, type header atom ftyp
 +write_data len 2572, time -333333, type sync atom sidx
 +write_data len 996, time 5166667, type sync atom sidx
  write_data len 148, time nopts, type trailer atom -
 -5e676152714f9478b5f74ce67cd7ed60 3647 vfr
 -write_data len 1243, time nopts, type header atom ftyp
 -write_data len 1552, time -333333, type sync atom sidx
 -write_data len 704, time 5166667, type sync atom sidx
 +f12d4a0e054abcc508cc0d28cb320e57 4935 vfr
 +write_data len 1219, time nopts, type header atom ftyp
 +write_data len 2572, time -333333, type sync atom sidx
 +write_data len 996, time 5166667, type sync atom sidx
  write_data len 148, time nopts, type trailer atom -
 -5e676152714f9478b5f74ce67cd7ed60 3647 vfr-noduration
 -write_data len 1255, time nopts, type header atom ftyp
 +f12d4a0e054abcc508cc0d28cb320e57 4935 vfr-noduration
 +write_data len 1231, time nopts, type header atom ftyp
  write_data len 1500, time -333333, type sync atom moof
 -write_data len 620, time nopts, type unknown atom -
 +write_data len 1500, time nopts, type unknown atom -
 +write_data len 916, time nopts, type unknown atom -
  write_data len 1500, time 9666667, type sync atom moof
 -write_data len 664, time nopts, type unknown atom -
 +write_data len 1500, time nopts, type unknown atom -
 +write_data len 1004, 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
 +3c2c3f98c8a047f0ecefff07570fd457 9299 large_frag
++write_data len 1231, time nopts, type header atom ftyp
++write_data len 684, time -33333, type sync atom moof
++write_data len 504, time 800000, type boundary atom moof
++write_data len 420, time 1266667, type boundary atom moof
++write_data len 668, time 1566667, type sync atom moof
++write_data len 440, time 2233333, type boundary atom moof
+ write_data len 262, time nopts, type trailer atom -
 -a4280bdc23af2c4334ec2da3fa946d3a 3541 vfr-noduration-interleave
++edd19deae2b70afcf2cd744b89b7013d 4209 vfr-noduration-interleave