[FFmpeg-devel] [PATCH 4/5] avformat/movenc: reduce tfra box size when every sample is a sync sample

Zhao Zhili quinkblack at foxmail.com
Fri Dec 3 07:06:56 EET 2021


---
 libavformat/movenc.c  |  8 +++++
 libavformat/movenc.h  |  1 +
 tests/ref/fate/movenc | 80 +++++++++++++++++++++----------------------
 3 files changed, 49 insertions(+), 40 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index f8731d33c5..01dfd21a43 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -4938,6 +4938,7 @@ static int mov_write_tfra_tag(AVIOContext *pb, MOVTrack *track)
     int number_of_entry = 0;
     int i;
 
+    if (!track->every_sample_keyframe) {
     /* We can't write and then update number_of_entry, because we cannot fix
      * the case when number_of_entry is zero, since zero indicates that every
      * sample is a sync sample. So get number_of_entry first.
@@ -4948,6 +4949,7 @@ static int mov_write_tfra_tag(AVIOContext *pb, MOVTrack *track)
     }
     if (!number_of_entry)
         return 0;
+    }
 
     avio_wb32(pb, 0); /* size placeholder */
     ffio_wfourcc(pb, "tfra");
@@ -4956,6 +4958,9 @@ static int mov_write_tfra_tag(AVIOContext *pb, MOVTrack *track)
 
     avio_wb32(pb, track->track_id);
     avio_wb32(pb, 0); /* length of traf/trun/sample num */
+    if (track->every_sample_keyframe) {
+    avio_wb32(pb, 0);
+    } else {
     avio_wb32(pb, number_of_entry);
     for (i = 0; i < track->nb_frag_info; i++) {
         if (!(track->frag_info[i].first_sample_flags & MOV_SYNC_SAMPLE))
@@ -4966,6 +4971,7 @@ static int mov_write_tfra_tag(AVIOContext *pb, MOVTrack *track)
         avio_w8(pb, 1); /* trun number */
         avio_w8(pb, 1); /* sample number */
     }
+    }
 
     return update_size(pb, pos);
 }
@@ -5999,6 +6005,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
         trk->cluster[trk->entry].flags |= MOV_DISPOSABLE_SAMPLE;
         trk->has_disposable++;
     }
+    trk->every_sample_keyframe &= !!(pkt->flags & AV_PKT_FLAG_KEY);
 
     prft = (AVProducerReferenceTime *)av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &prft_size);
     if (prft && prft_size == sizeof(AVProducerReferenceTime))
@@ -6769,6 +6776,7 @@ static int mov_init(AVFormatContext *s)
         if (track->language < 0)
             track->language = 32767;  // Unspecified Macintosh language code
         track->mode = mov->mode;
+        track->every_sample_keyframe = 1;
         track->tag  = mov_find_codec_tag(s, track);
         if (!track->tag) {
             av_log(s, AV_LOG_ERROR, "Could not find tag for codec %s in stream #%d, "
diff --git a/libavformat/movenc.h b/libavformat/movenc.h
index e3a5e2864a..e78a08c2dd 100644
--- a/libavformat/movenc.h
+++ b/libavformat/movenc.h
@@ -97,6 +97,7 @@ typedef struct MOVTrack {
     long        chunkCount;
     int         has_keyframes;
     int         has_disposable;
+    int         every_sample_keyframe;
 #define MOV_TRACK_CTTS         0x0001
 #define MOV_TRACK_STPS         0x0002
 #define MOV_TRACK_ENABLED      0x0004
diff --git a/tests/ref/fate/movenc b/tests/ref/fate/movenc
index 529a1c6da5..3a593dcb9b 100644
--- a/tests/ref/fate/movenc
+++ b/tests/ref/fate/movenc
@@ -1,54 +1,54 @@
 write_data len 36, time nopts, type header atom ftyp
 write_data len 2429, time nopts, type header atom -
 write_data len 788, time 1000000, type sync atom moof
-write_data len 110, time nopts, type trailer atom -
-e38b4db4d6542159a18a231df1f8a17a 3363 non-empty-moov
+write_data len 91, time nopts, type trailer atom -
+cc672db4650646c640508579e7c08c3a 3344 non-empty-moov
 write_data len 36, time nopts, type header atom ftyp
 write_data len 2761, time nopts, type header atom -
 write_data len 908, time 966667, type sync atom moof
-write_data len 110, time nopts, type trailer atom -
-aced0fb08e209f7b892fc69319de4c6c 3815 non-empty-moov-elst
+write_data len 91, time nopts, type trailer atom -
+9f4f458599a3c5e064295d8bede69a5b 3796 non-empty-moov-elst
 write_data len 36, time nopts, type header atom ftyp
 write_data len 2669, time nopts, type header atom -
 write_data len 908, time 1000000, type sync atom moof
-write_data len 110, time nopts, type trailer atom -
-d2879ae4007bec11714c47ed9c4606c9 3723 non-empty-moov-no-elst
+write_data len 91, time nopts, type trailer atom -
+eff9b48e62ae0d52676a154328a2db5f 3704 non-empty-moov-no-elst
 write_data len 24, time nopts, type header atom ftyp
 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 999999, type sync atom moof
 write_data len 812, time nopts, type unknown atom -
-write_data len 148, time nopts, type trailer atom -
-92ce825ff40505ec8676191705adb7e7 4439 ismv
+write_data len 110, time nopts, type trailer atom -
+6e76f6cd18354c43eafbc342a236323f 4401 ismv
 write_data len 36, time nopts, type header atom ftyp
 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 -
-7c8bbc289e14ae747ad3f9c73107912b 2891 empty-moov
+write_data len 110, time nopts, type trailer atom -
+334ccaacc76cfc292fafdf6b0031ba83 2853 empty-moov
 write_data len 36, time nopts, type header atom ftyp
 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 -
-0c6a543b723d16f5bb2bbb1204625a41 3283 empty-moov-no-elst
+write_data len 110, time nopts, type trailer atom -
+2914a8737c86d5194c655cf540a26ccb 3245 empty-moov-no-elst
 write_data len 36, time nopts, type header atom ftyp
 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 -
-f99a6f2437e513d6dcf521f8d167f342 3115 empty-moov-no-elst-no-adjust
+write_data len 110, time nopts, type trailer atom -
+5919754b902a696df1bbe92afd3eea7d 3077 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 -
-7c8bbc289e14ae747ad3f9c73107912b 2891 delay-moov
+write_data len 110, time nopts, type trailer atom -
+334ccaacc76cfc292fafdf6b0031ba83 2853 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 -
-a7ddf0bfd32683de9dd22afe3b1135a4 3203 delay-moov-elst
+write_data len 110, time nopts, type trailer atom -
+d09ca12c5c03fa58d6c5776d25c597b9 3165 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 -
@@ -64,65 +64,65 @@ 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
 289ee982188d66988a374a462b0b5376 1584 empty-moov-content
-write_data len 148, time nopts, type trailer atom -
+write_data len 110, time nopts, type trailer atom -
 write_data len 1159, time nopts, type header atom ftyp
 351ae2c8b6d35d98b4848c309cce6704 1159 delay-moov-header
 write_data len 796, time 0, type sync atom moof
 write_data len 788, time 1000000, type sync atom moof
 289ee982188d66988a374a462b0b5376 1584 delay-moov-content
-write_data len 148, time nopts, type trailer atom -
+write_data len 110, time nopts, type trailer atom -
 write_data len 28, time nopts, type header atom -
 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
 c0307f99a2a362205b7e3d65b1066f86 876 empty-moov-second-frag
-write_data len 148, time nopts, type trailer atom -
+write_data len 110, time nopts, type trailer atom -
 write_data len 28, time nopts, type header atom -
 write_data len 1123, time nopts, type header atom -
 write_data len 876, time 1000000, type sync atom sidx
 c0307f99a2a362205b7e3d65b1066f86 876 empty-moov-second-frag-discont
-write_data len 110, time nopts, type trailer atom -
+write_data len 91, time nopts, type trailer atom -
 write_data len 1223, time nopts, type header atom -
 write_data len 876, time 1000000, type sync atom sidx
 c0307f99a2a362205b7e3d65b1066f86 876 delay-moov-second-frag-discont
-write_data len 110, time nopts, type trailer atom -
+write_data len 91, time nopts, type trailer atom -
 write_data len 1223, time nopts, type header atom ftyp
 b3811928793ed0749927eb2f7958421c 1223 delay-moov-elst-init
 write_data len 988, time -33333, type sync atom sidx
 write_data len 996, time 966667, type sync atom sidx
 0df125407c7e81978ce722e0ae4f6f84 996 delay-moov-elst-second-frag
-write_data len 148, time nopts, type trailer atom -
+write_data len 110, time nopts, type trailer atom -
 write_data len 1223, time nopts, type header atom ftyp
 b3811928793ed0749927eb2f7958421c 1223 delay-moov-elst-init-discont
 write_data len 996, time 966667, type sync atom sidx
 0df125407c7e81978ce722e0ae4f6f84 996 delay-moov-elst-second-frag-discont
-write_data len 110, time nopts, type trailer atom -
+write_data len 91, time nopts, type trailer atom -
 write_data len 1223, time nopts, type header atom ftyp
 041ac8efc35a0d023c26d05eedb20403 1223 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
 5a583d89318827d2569eecbeaa18c238 996 delay-moov-elst-signal-second-frag
-write_data len 148, time nopts, type trailer atom -
+write_data len 110, time nopts, type trailer atom -
 write_data len 1223, time nopts, type header atom ftyp
 041ac8efc35a0d023c26d05eedb20403 1223 delay-moov-elst-signal-init-discont
 write_data len 996, time 966667, type sync atom sidx
 5a583d89318827d2569eecbeaa18c238 996 delay-moov-elst-signal-second-frag-discont
-write_data len 110, time nopts, type trailer atom -
+write_data len 91, time nopts, type trailer atom -
 write_data len 1247, time nopts, type header atom ftyp
 80511a51d1ac9cde62337eed7176ae03 1247 delay-moov-elst-signal-init-discont-largets
 write_data len 996, time 279621233333, type sync atom sidx
 dc695d65e8a0cdafee28acd8a5ccf81a 996 delay-moov-elst-signal-second-frag-discont-largets
-write_data len 110, time nopts, type trailer atom -
+write_data len 91, time nopts, type trailer atom -
 write_data len 1223, 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 -
-0009ab3c8ebc80a286e5b10dfacc8ef3 4939 vfr
+write_data len 110, time nopts, type trailer atom -
+a7cf74137808890eef675c2d3d104818 4901 vfr
 write_data len 1223, 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 -
-0009ab3c8ebc80a286e5b10dfacc8ef3 4939 vfr-noduration
+write_data len 110, time nopts, type trailer atom -
+a7cf74137808890eef675c2d3d104818 4901 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 1500, time nopts, type unknown atom -
@@ -130,24 +130,24 @@ write_data len 916, time nopts, type unknown atom -
 write_data len 1500, time 9666667, type sync atom moof
 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 -
-9549eeeac8731d820dc395bc73aa605f 9299 large_frag
+write_data len 110, time nopts, type trailer atom -
+1d86c7a4ff34ef48b17e0424ef83c60a 9261 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 205, time nopts, type trailer atom -
-9ec014d07518b90a5321d792d737bfc0 4152 vfr-noduration-interleave
+write_data len 110, time nopts, type trailer atom -
+52fe35e68d8f522f247e9cdfb9677f1a 4057 vfr-noduration-interleave
 write_data len 1231, time nopts, type header atom ftyp
 write_data len 916, 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 -
-b8076064cedf2fefc242d9af67cdaeba 3203 delay-moov-elst-neg-cts
+write_data len 110, time nopts, type trailer atom -
+efd24aed8e3d17d6ee7ca5e764391c61 3165 delay-moov-elst-neg-cts
 write_data len 36, time nopts, type header atom ftyp
 write_data len 1123, time nopts, type header atom -
 write_data len 900, 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 -
-c1307485f65c4a00a06ca82f5e0b1361 3115 empty-moov-neg-cts
+write_data len 110, time nopts, type trailer atom -
+fe10ded5223335608980555f972902cc 3077 empty-moov-neg-cts
-- 
2.31.1



More information about the ffmpeg-devel mailing list