1. 08 May, 2020 18 commits
  2. 07 May, 2020 13 commits
  3. 06 May, 2020 9 commits
    • Limin Wang's avatar
      avformat/mux: Set AV_PKT_FLAG_KEY for is_intra_only packet · 96e5e6ab
      Limin Wang authored
      The patch will make audio and subtitle packets be marked as AV_PKT_FLAG_KEY.
      
      For audio, it'll caused the audio sample to be sync sample.
      To verify ref/fate/movenc results:
      1. Get the movenc test data
      [lmwang@vpn ffmpeg]$ libavformat/tests/movenc -w && mkdir -p audio_old && mv *.mp4 audio_old_
      
      After applied the patch:
      [lmwang@vpn ffmpeg]$ make fate-movenc SAMPLES=../fate-suite
      [lmwang@vpn ffmpeg]$ libavformat/tests/movenc -w && mkdir -p audio_key && mv *.mp4 audio_key
      
      2. Get l-smash and build boxdumper
      https://github.com/l-smash/l-smash.git
      
      3. dump the box of crc change mp4 and diff -u
      [lmwang@vpn ffmpeg]$ ../l-smash/cli/boxdumper --box audio_key/non-empty-moov-no-elst.mp4  > audio_key/non-empty-moov-no-elst.log
      [lmwang@vpn ffmpeg]$ ../l-smash/cli/boxdumper --box audio_old/non-empty-moov-no-elst.mp4  > audio_old/non-empty-moov-no-elst.log
      [lmwang@vpn ffmpeg]$ diff -u audio_key/non-empty-moov-no-elst.log audio_old/non-empty-moov-no-elst.log
      -                default_sample_flags = 0x02000000
      -                    independent
      -                    sync sample
      +                default_sample_flags = 0x01010000
      +                    dependent
      +                    non-sync sample
      
      4. have checked the change of crc are caused by default_sample_flags
      non-empty-moov.mp4, non-empty-moov-elst.mp4,
      non-empty-moov-no-elst.mp4, empty-moov.mp4, delay-moov-content.mp4,
      empty-moov-second-frag.mp4, empty-moov-second-frag-discont.mp4,
      delay-moov-second-frag-discont.mp4, delay-moov-elst-second-frag.mp4
      etc
      
      5 For subtitle, it'll effect for tests/ref/fate/binsub-movtextenc and
      tests/ref/fate/sub2video, that's expecting result for the subtitle is
      marked as keyframe. Below is the checking result of binsub-movtextenc:
      
      [lmwang@vpn ffmpeg]$ ./ffmpeg -i ../fate-suite/sub/MovText_capability_tester.mp4 -map 0 -scodec mov_text -f mp4 -flags +bitexact -fflags +bitexact -movflags frag_keyframe+empty_moov audio_key/binsub-movtextenc.mp4
      [lmwang@vpn ffmpeg]$ ./ffmpeg -i ../fate-suite/sub/MovText_capability_tester.mp4 -map 0 -scodec mov_text -f mp4 -flags +bitexact -fflags +bitexact -movflags frag_keyframe+empty_moov audio_old/binsub-movtextenc.mp4
      [lmwang@vpn ffmpeg]$../l-smash/cli/boxdumper audio_key/binsub-movtextenc.mp4  > audio_key/binsub-movtextenc.log
      [lmwang@vpn ffmpeg]$../l-smash/cli/boxdumper audio_old/binsub-movtextenc.mp4  > audio_old/binsub-movtextenc.log
      [lmwang@vpn ffmpeg]$ diff -u audio_key/binsub-movtextenc.log audio_old/binsub-movtextenc.log
      .... // the key difference is the flag for sync sample
      -                flags = 0x000701
      +                flags = 0x000301
                           data-offset-present
                           sample-duration-present
                           sample-size-present
      -                    sample-flags-present
                       sample_count = 6
      -                data_offset = 188
      +                data_offset = 164
                       sample[0]
                           sample_duration = 1570000
                           sample_size = 21
      -                    sample_flags = 0x02000000
      -                        independent
      -                        sync sample
      -                        degradation_priority = 0
                       sample[1]
                           sample_duration = 510000
                           sample_size = 2
      -                    sample_flags = 0x01010000
      -                        dependent
      -                        non-sync sample
      -                        degradation_priority = 0
                       sample[2]
                           sample_duration = 1690000
                           sample_size = 9
      -                    sample_flags = 0x02000000
      -                        independent
      -                        sync sample
      -                        degradation_priority = 0
      Suggested-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
      Suggested-by: 's avatarNicolas George <george@nsup.org>
      Signed-off-by: 's avatarLimin Wang <lance.lmwang@gmail.com>
      96e5e6ab
    • Linjie Fu's avatar
      74aa3321
    • Limin Wang's avatar
    • Limin Wang's avatar
      fa21df2b
    • Limin Wang's avatar
      1a944563
    • Limin Wang's avatar
    • Andreas Rheinhardt's avatar
      avformat/matroskaenc: Check allocations implicit in dynamic buffers · 3a822717
      Andreas Rheinhardt authored
      Failures of the allocations that happen under the hood when using dynamic
      buffers are usually completely unchecked and the Matroska muxer is no
      exception to this.
      
      The API has its part in this, because there is no documented way to
      actually check for errors: The return value of both avio_get_dyn_buf()
      as well as avio_close_dyn_buf() is only documented as "the length of
      the byte buffer", so that using this to return errors would be an API
      break.
      
      Therefore this commit uses the only reliable way to check for errors
      with avio_get_dyn_buf(): The AVIOContext's error flag. (This is one of
      the advantages of avio_get_dyn_buf(): By not destroying the AVIOContext
      it is possible to inspect this value.) Checking whether the size or the
      pointer vanishes is not enough as it does not check for truncated output
      (the dynamic buffer API is int based and so has to truncate the buffer
      even when enough memory would be available; it's current actual limit is
      even way below INT_MAX).
      Signed-off-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
      3a822717
    • Andreas Rheinhardt's avatar
      avformat/matroskaenc: Simplify writing buffer · 8370c9c2
      Andreas Rheinhardt authored
      If one already has the contents of a master elements in a buffer of
      known size, then writing a EBML master element is no different from
      writing an EBML binary element. It is overtly complicated to use
      start/end_ebml_master() as these functions first write an unkown-length
      size field of the appropriate length, then write the buffer's contents,
      followed by a seek to the length field to overwrite it with the real
      size (obtained via avio_tell() although it was already known in
      advance), followed by another seek to the previous position. Just use
      put_ebml_binary() instead.
      Signed-off-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
      8370c9c2
    • Andreas Rheinhardt's avatar
      avformat/matroskaenc: Avoid dynamic buffer when writing Colour · 3122dcf2
      Andreas Rheinhardt authored
      There is a good upper bound for the maximum length of the Colour master
      element; it is therefore unnecessary to use a dynamic buffer for it.
      A simple buffer on the stack is enough. This commit implements this.
      Signed-off-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
      3122dcf2