movenc: Write file with minimal number of chunks for the given interleaving.
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 29 Nov 2011 03:03:22 +0000 (04:03 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 29 Nov 2011 03:51:47 +0000 (04:51 +0100)
Reviewed-by: Baptiste Coudurier <baptiste.coudurier@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
17 files changed:
libavformat/movenc.c
libavformat/movenc.h
tests/ref/acodec/alac
tests/ref/acodec/pcm
tests/ref/lavf/mov
tests/ref/vsynth1/dnxhd_1080i
tests/ref/vsynth1/mpeg4
tests/ref/vsynth1/prores
tests/ref/vsynth1/qtrle
tests/ref/vsynth1/qtrlegray
tests/ref/vsynth1/svq1
tests/ref/vsynth2/dnxhd_1080i
tests/ref/vsynth2/mpeg4
tests/ref/vsynth2/prores
tests/ref/vsynth2/qtrle
tests/ref/vsynth2/qtrlegray
tests/ref/vsynth2/svq1

index efa0b92..d72ac4d 100644 (file)
@@ -81,8 +81,10 @@ static int mov_write_stco_tag(AVIOContext *pb, MOVTrack *track)
     } else
         ffio_wfourcc(pb, "stco");
     avio_wb32(pb, 0); /* version & flags */
-    avio_wb32(pb, track->entry); /* entry count */
+    avio_wb32(pb, track->chunkCount); /* entry count */
     for (i=0; i<track->entry; i++) {
+        if(!track->cluster[i].chunkNum)
+            continue;
         if(mode64 == 1)
             avio_wb64(pb, track->cluster[i].pos);
         else
@@ -140,11 +142,11 @@ static int mov_write_stsc_tag(AVIOContext *pb, MOVTrack *track)
     ffio_wfourcc(pb, "stsc");
     avio_wb32(pb, 0); // version & flags
     entryPos = avio_tell(pb);
-    avio_wb32(pb, track->entry); // entry count
+    avio_wb32(pb, track->chunkCount); // entry count
     for (i=0; i<track->entry; i++) {
-        if(oldval != track->cluster[i].samplesInChunk)
+        if(oldval != track->cluster[i].samplesInChunk && track->cluster[i].chunkNum)
         {
-            avio_wb32(pb, i+1); // first chunk
+            avio_wb32(pb, track->cluster[i].chunkNum); // first chunk
             avio_wb32(pb, track->cluster[i].samplesInChunk); // samples per chunk
             avio_wb32(pb, 0x1); // sample description index
             oldval = track->cluster[i].samplesInChunk;
@@ -1805,6 +1807,24 @@ static int mov_write_uuidusmt_tag(AVIOContext *pb, AVFormatContext *s)
     return 0;
 }
 
+static void build_chunks(MOVTrack *trk)
+{
+    int i;
+    MOVIentry *chunk= &trk->cluster[0];
+    chunk->chunkNum= 1;
+    trk->chunkCount= 1;
+    for(i=1; i<trk->entry; i++){
+        if(chunk->pos + chunk->chunkSize == trk->cluster[i].pos){
+            chunk->chunkSize      += trk->cluster[i].size;
+            chunk->samplesInChunk += trk->cluster[i].entries;
+        }else{
+            trk->cluster[i].chunkNum = chunk->chunkNum+1;
+            chunk=&trk->cluster[i];
+            trk->chunkCount++;
+        }
+    }
+}
+
 static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
                               AVFormatContext *s)
 {
@@ -1818,6 +1838,8 @@ static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
 
         mov->tracks[i].time = mov->time;
         mov->tracks[i].trackID = i+1;
+
+        build_chunks(&mov->tracks[i]);
     }
 
     if (mov->chapter_track)
@@ -2070,6 +2092,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
 
     trk->cluster[trk->entry].pos = avio_tell(pb) - size;
     trk->cluster[trk->entry].samplesInChunk = samplesInChunk;
+    trk->cluster[trk->entry].chunkSize =
     trk->cluster[trk->entry].size = size;
     trk->cluster[trk->entry].entries = samplesInChunk;
     trk->cluster[trk->entry].dts = pkt->dts;
index 1aa23fa..b022f48 100644 (file)
@@ -43,6 +43,8 @@ typedef struct MOVIentry {
     unsigned int size;
     uint64_t     pos;
     unsigned int samplesInChunk;
+    unsigned int chunkNum;              ///< Chunk number if the current entry is a chunk start otherwise 0
+    uint64_t     chunkSize;
     unsigned int entries;
     int          cts;
     int64_t      dts;
@@ -73,6 +75,7 @@ typedef struct MOVIndex {
     int64_t     trackDuration;
     long        sampleCount;
     long        sampleSize;
+    long        chunkCount;
     int         hasKeyframes;
 #define MOV_TRACK_CTTS         0x0001
 #define MOV_TRACK_STPS         0x0002
index f03ce89..6ae10fa 100644 (file)
@@ -1,4 +1,4 @@
-b25bcc7ec3f5c19cdfc01a6bbd32edb8 *./tests/data/acodec/alac.m4a
-389386 ./tests/data/acodec/alac.m4a
+b7a590dd346b2fbaf49421c72a4a84bd *./tests/data/acodec/alac.m4a
+389130 ./tests/data/acodec/alac.m4a
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/alac.acodec.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
index 5d810d0..e338f2a 100644 (file)
@@ -6,16 +6,16 @@ stddev:  101.67 PSNR: 56.19 MAXDIFF:  515 bytes:  1058400/  1058400
 529258 ./tests/data/acodec/pcm_mulaw.wav
 7ae8c3fc804bd574006fd547fe28980c *./tests/data/pcm.acodec.out.wav
 stddev:  103.38 PSNR: 56.04 MAXDIFF:  644 bytes:  1058400/  1058400
-760f85fb9f4e8aba326fb44ae84c9507 *./tests/data/acodec/pcm_s8.mov
-530837 ./tests/data/acodec/pcm_s8.mov
+b78d2a30df75af08ecf86f201281fec2 *./tests/data/acodec/pcm_s8.mov
+529793 ./tests/data/acodec/pcm_s8.mov
 651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm.acodec.out.wav
 stddev:  147.89 PSNR: 52.93 MAXDIFF:  255 bytes:  1058400/  1058400
 70fecbae732f81143a560c7315eda49a *./tests/data/acodec/pcm_u8.wav
 529246 ./tests/data/acodec/pcm_u8.wav
 651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm.acodec.out.wav
 stddev:  147.89 PSNR: 52.93 MAXDIFF:  255 bytes:  1058400/  1058400
-a4e18d1ca9ef5b8132a84d43625ddc47 *./tests/data/acodec/pcm_s16be.mov
-1060037 ./tests/data/acodec/pcm_s16be.mov
+9686b93d1439fc2df991a004ab0298f4 *./tests/data/acodec/pcm_s16be.mov
+1058993 ./tests/data/acodec/pcm_s16be.mov
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/acodec/pcm_s16le.wav
@@ -30,16 +30,16 @@ c4f51bf32fad2f7af8ea5beedb56168b *./tests/data/acodec/pcm_s16le.mkv
 1060638 ./tests/data/acodec/pcm_s16le.mkv
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
-971d2d2633e41a0326fe2d04a2d0350f *./tests/data/acodec/pcm_s24be.mov
-1589237 ./tests/data/acodec/pcm_s24be.mov
+22c5c3df0a4765e28c205a4fb95b3cdc *./tests/data/acodec/pcm_s24be.mov
+1588193 ./tests/data/acodec/pcm_s24be.mov
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
 a85380fb79b0d4fff38e24ac1e34bb94 *./tests/data/acodec/pcm_s24le.wav
 1587668 ./tests/data/acodec/pcm_s24le.wav
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
-fc4f4e3e195bbde037ed31021d229f12 *./tests/data/acodec/pcm_s32be.mov
-2118437 ./tests/data/acodec/pcm_s32be.mov
+b36ac7a1b4fc28248a565a676e555bd1 *./tests/data/acodec/pcm_s32be.mov
+2117393 ./tests/data/acodec/pcm_s32be.mov
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
 da6ed80f4f40f0082577dea80827e014 *./tests/data/acodec/pcm_s32le.wav
index 2071c5a..1202eb4 100644 (file)
@@ -1,3 +1,3 @@
-2e2529d01dbe42e4dd63580a351898f5 *./tests/data/lavf/lavf.mov
-357681 ./tests/data/lavf/lavf.mov
+6706bb7887aa828a0a734552c3d9fc40 *./tests/data/lavf/lavf.mov
+357749 ./tests/data/lavf/lavf.mov
 ./tests/data/lavf/lavf.mov CRC=0x2f6a9b26
index 80484b5..177f0ab 100644 (file)
@@ -1,4 +1,4 @@
-34949ea38da2cf6a8406ad600ad95cfa *./tests/data/vsynth1/dnxhd-1080i.mov
-3031875 ./tests/data/vsynth1/dnxhd-1080i.mov
+b0c02b4f7ce6b57668e54970443f9a42 *./tests/data/vsynth1/dnxhd-1080i.mov
+3031859 ./tests/data/vsynth1/dnxhd-1080i.mov
 0c651e840f860592f0d5b66030d9fa32 *./tests/data/dnxhd_1080i.vsynth1.out.yuv
 stddev:    6.29 PSNR: 32.15 MAXDIFF:   64 bytes:   760320/  7603200
index 93c13bc..a84bc08 100644 (file)
@@ -1,4 +1,4 @@
-d2405fd9e350854a161f48bc63f49253 *./tests/data/vsynth1/odivx.mp4
-540156 ./tests/data/vsynth1/odivx.mp4
+859c8b545c1c702343d201836833ce23 *./tests/data/vsynth1/odivx.mp4
+539960 ./tests/data/vsynth1/odivx.mp4
 8828a375448dc5c2215163ba70656f89 *./tests/data/mpeg4.vsynth1.out.yuv
 stddev:    7.97 PSNR: 30.10 MAXDIFF:  105 bytes:  7603200/  7603200
index 0c58428..69e90f0 100644 (file)
@@ -1,4 +1,4 @@
-1864aa1cb7370fe682f3f392dc771960 *./tests/data/vsynth1/prores.mov
-5022955 ./tests/data/vsynth1/prores.mov
+6484056f2f99410c20a0d987d0255a1d *./tests/data/vsynth1/prores.mov
+5022759 ./tests/data/vsynth1/prores.mov
 a2e2d1d45341a94ff994d1d92629f778 *./tests/data/prores.vsynth1.out.yuv
 stddev:    2.47 PSNR: 40.27 MAXDIFF:   31 bytes:  7603200/  7603200
index d25b986..332a498 100644 (file)
@@ -1,4 +1,4 @@
-d14041925ce5ec5001dc519276b1a1ab *./tests/data/vsynth1/qtrle.mov
-15263232 ./tests/data/vsynth1/qtrle.mov
+92a24c3cb16de8352db01e094c2cab9a *./tests/data/vsynth1/qtrle.mov
+15263036 ./tests/data/vsynth1/qtrle.mov
 93695a27c24a61105076ca7b1f010bbd *./tests/data/qtrle.vsynth1.out.yuv
 stddev:    3.42 PSNR: 37.44 MAXDIFF:   48 bytes:  7603200/  7603200
index 6866113..2250441 100644 (file)
@@ -1,4 +1,4 @@
-0544350c00f33f21e29b5edd965c3f03 *./tests/data/vsynth1/qtrlegray.mov
-5113428 ./tests/data/vsynth1/qtrlegray.mov
+54651e32f751432fad61acb364de80f5 *./tests/data/vsynth1/qtrlegray.mov
+5113232 ./tests/data/vsynth1/qtrlegray.mov
 29def4aed035ed65d3a89f7d382fccbe *./tests/data/qtrlegray.vsynth1.out.yuv
 stddev:   25.95 PSNR: 19.85 MAXDIFF:  122 bytes:  7603200/  7603200
index 8c647c7..984a675 100644 (file)
@@ -1,4 +1,4 @@
-595fc4e38734521356b60e67b813f0fa *./tests/data/vsynth1/svq1.mov
-1334367 ./tests/data/vsynth1/svq1.mov
+e3257e307140bf1c2e117f4ed6131c1c *./tests/data/vsynth1/svq1.mov
+1334171 ./tests/data/vsynth1/svq1.mov
 9cc35c54b2c77d36bd7e308b393c1f81 *./tests/data/svq1.vsynth1.out.yuv
 stddev:    9.58 PSNR: 28.50 MAXDIFF:  210 bytes:  7603200/  7603200
index ae98846..1d4af69 100644 (file)
@@ -1,4 +1,4 @@
-995e433cd076e3c1534fa73181744a84 *./tests/data/vsynth2/dnxhd-1080i.mov
-3031875 ./tests/data/vsynth2/dnxhd-1080i.mov
+4841132b013b373862ee5b9c4dc7592c *./tests/data/vsynth2/dnxhd-1080i.mov
+3031859 ./tests/data/vsynth2/dnxhd-1080i.mov
 3c559af629ae0a8fb1a9a0e4b4da7733 *./tests/data/dnxhd_1080i.vsynth2.out.yuv
 stddev:    1.31 PSNR: 45.77 MAXDIFF:   23 bytes:   760320/  7603200
index d534ec1..27b9a6f 100644 (file)
@@ -1,4 +1,4 @@
-2e3bf184668d4807ae6df0bdceba487b *./tests/data/vsynth2/odivx.mp4
-119809 ./tests/data/vsynth2/odivx.mp4
+f11f53931a1374acff6c04a21517809c *./tests/data/vsynth2/odivx.mp4
+119613 ./tests/data/vsynth2/odivx.mp4
 90a3577850239083a9042bef33c50e85 *./tests/data/mpeg4.vsynth2.out.yuv
 stddev:    5.34 PSNR: 33.57 MAXDIFF:   83 bytes:  7603200/  7603200
index 498423d..dae8942 100644 (file)
@@ -1,4 +1,4 @@
-1160bb646bd365536951fadd96880d3c *./tests/data/vsynth2/prores.mov
-2844194 ./tests/data/vsynth2/prores.mov
+179b4f654de017fa74b8eaab93d9d2cb *./tests/data/vsynth2/prores.mov
+2843998 ./tests/data/vsynth2/prores.mov
 b5844025c0f4c7c37db702c3213db232 *./tests/data/prores.vsynth2.out.yuv
 stddev:    1.31 PSNR: 45.77 MAXDIFF:   11 bytes:  7603200/  7603200
index d87a6b9..08b8637 100644 (file)
@@ -1,4 +1,4 @@
-d8c1604dc46d9aa4ec0385e6722c6989 *./tests/data/vsynth2/qtrle.mov
-14798419 ./tests/data/vsynth2/qtrle.mov
+998aa370cb23634272c64cc4ae759a9d *./tests/data/vsynth2/qtrle.mov
+14798223 ./tests/data/vsynth2/qtrle.mov
 98d0e2854731472c5bf13d8638502d0a *./tests/data/qtrle.vsynth2.out.yuv
 stddev:    1.26 PSNR: 46.10 MAXDIFF:   13 bytes:  7603200/  7603200
index 8c7b98a..eae1d9b 100644 (file)
@@ -1,4 +1,4 @@
-55c6e5af44ece0621d1d4c91b282a544 *./tests/data/vsynth2/qtrlegray.mov
-5111417 ./tests/data/vsynth2/qtrlegray.mov
+19ffbb5fe258dc96fa345b9fbbf7ba51 *./tests/data/vsynth2/qtrlegray.mov
+5111221 ./tests/data/vsynth2/qtrlegray.mov
 f63b5ebdfdba750e547c25131b0a3fd1 *./tests/data/qtrlegray.vsynth2.out.yuv
 stddev:   19.42 PSNR: 22.36 MAXDIFF:   72 bytes:  7603200/  7603200
index 7c54c74..2eb0c8d 100644 (file)
@@ -1,4 +1,4 @@
-7f9fbe4890bc1df67867bf03803dca48 *./tests/data/vsynth2/svq1.mov
-766851 ./tests/data/vsynth2/svq1.mov
+fdb06a9800712a0bf6941847afcbca57 *./tests/data/vsynth2/svq1.mov
+766655 ./tests/data/vsynth2/svq1.mov
 aa03471dac3f49455a33a2b19fda1098 *./tests/data/svq1.vsynth2.out.yuv
 stddev:    3.23 PSNR: 37.93 MAXDIFF:   61 bytes:  7603200/  7603200