summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-11-29 04:03:22 +0100
committerMichael Niedermayer <michaelni@gmx.at>2011-11-29 04:51:47 +0100
commitfc09bf57a60d4c4a6d339b204b3282337067c06d (patch)
treeef4e1cd353c5139689a181e4ba9fdef5c5816f5a
parent4dcd1a3145dd93602b86a44ebc07d98ca2a30ab6 (diff)
movenc: Write file with minimal number of chunks for the given interleaving.
Reviewed-by: Baptiste Coudurier <baptiste.coudurier@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavformat/movenc.c31
-rw-r--r--libavformat/movenc.h3
-rw-r--r--tests/ref/acodec/alac4
-rw-r--r--tests/ref/acodec/pcm16
-rw-r--r--tests/ref/lavf/mov4
-rw-r--r--tests/ref/vsynth1/dnxhd_1080i4
-rw-r--r--tests/ref/vsynth1/mpeg44
-rw-r--r--tests/ref/vsynth1/prores4
-rw-r--r--tests/ref/vsynth1/qtrle4
-rw-r--r--tests/ref/vsynth1/qtrlegray4
-rw-r--r--tests/ref/vsynth1/svq14
-rw-r--r--tests/ref/vsynth2/dnxhd_1080i4
-rw-r--r--tests/ref/vsynth2/mpeg44
-rw-r--r--tests/ref/vsynth2/prores4
-rw-r--r--tests/ref/vsynth2/qtrle4
-rw-r--r--tests/ref/vsynth2/qtrlegray4
-rw-r--r--tests/ref/vsynth2/svq14
17 files changed, 66 insertions, 40 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index efa0b92cad..d72ac4d714 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -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;
diff --git a/libavformat/movenc.h b/libavformat/movenc.h
index 1aa23fa1a9..b022f48b87 100644
--- a/libavformat/movenc.h
+++ b/libavformat/movenc.h
@@ -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
diff --git a/tests/ref/acodec/alac b/tests/ref/acodec/alac
index f03ce893d8..6ae10fa21b 100644
--- a/tests/ref/acodec/alac
+++ b/tests/ref/acodec/alac
@@ -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
diff --git a/tests/ref/acodec/pcm b/tests/ref/acodec/pcm
index 5d810d04f2..e338f2a1bf 100644
--- a/tests/ref/acodec/pcm
+++ b/tests/ref/acodec/pcm
@@ -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
diff --git a/tests/ref/lavf/mov b/tests/ref/lavf/mov
index 2071c5a743..1202eb492a 100644
--- a/tests/ref/lavf/mov
+++ b/tests/ref/lavf/mov
@@ -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
diff --git a/tests/ref/vsynth1/dnxhd_1080i b/tests/ref/vsynth1/dnxhd_1080i
index 80484b50ae..177f0ab6b4 100644
--- a/tests/ref/vsynth1/dnxhd_1080i
+++ b/tests/ref/vsynth1/dnxhd_1080i
@@ -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
diff --git a/tests/ref/vsynth1/mpeg4 b/tests/ref/vsynth1/mpeg4
index 93c13bc662..a84bc08bc5 100644
--- a/tests/ref/vsynth1/mpeg4
+++ b/tests/ref/vsynth1/mpeg4
@@ -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
diff --git a/tests/ref/vsynth1/prores b/tests/ref/vsynth1/prores
index 0c5842884e..69e90f0f3a 100644
--- a/tests/ref/vsynth1/prores
+++ b/tests/ref/vsynth1/prores
@@ -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
diff --git a/tests/ref/vsynth1/qtrle b/tests/ref/vsynth1/qtrle
index d25b986184..332a498bc3 100644
--- a/tests/ref/vsynth1/qtrle
+++ b/tests/ref/vsynth1/qtrle
@@ -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
diff --git a/tests/ref/vsynth1/qtrlegray b/tests/ref/vsynth1/qtrlegray
index 686611394e..2250441109 100644
--- a/tests/ref/vsynth1/qtrlegray
+++ b/tests/ref/vsynth1/qtrlegray
@@ -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
diff --git a/tests/ref/vsynth1/svq1 b/tests/ref/vsynth1/svq1
index 8c647c7870..984a675886 100644
--- a/tests/ref/vsynth1/svq1
+++ b/tests/ref/vsynth1/svq1
@@ -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
diff --git a/tests/ref/vsynth2/dnxhd_1080i b/tests/ref/vsynth2/dnxhd_1080i
index ae988465f6..1d4af69947 100644
--- a/tests/ref/vsynth2/dnxhd_1080i
+++ b/tests/ref/vsynth2/dnxhd_1080i
@@ -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
diff --git a/tests/ref/vsynth2/mpeg4 b/tests/ref/vsynth2/mpeg4
index d534ec1ed1..27b9a6f017 100644
--- a/tests/ref/vsynth2/mpeg4
+++ b/tests/ref/vsynth2/mpeg4
@@ -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
diff --git a/tests/ref/vsynth2/prores b/tests/ref/vsynth2/prores
index 498423d5b5..dae8942e0d 100644
--- a/tests/ref/vsynth2/prores
+++ b/tests/ref/vsynth2/prores
@@ -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
diff --git a/tests/ref/vsynth2/qtrle b/tests/ref/vsynth2/qtrle
index d87a6b96ac..08b8637862 100644
--- a/tests/ref/vsynth2/qtrle
+++ b/tests/ref/vsynth2/qtrle
@@ -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
diff --git a/tests/ref/vsynth2/qtrlegray b/tests/ref/vsynth2/qtrlegray
index 8c7b98a4bd..eae1d9bed0 100644
--- a/tests/ref/vsynth2/qtrlegray
+++ b/tests/ref/vsynth2/qtrlegray
@@ -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
diff --git a/tests/ref/vsynth2/svq1 b/tests/ref/vsynth2/svq1
index 7c54c74ac9..2eb0c8df43 100644
--- a/tests/ref/vsynth2/svq1
+++ b/tests/ref/vsynth2/svq1
@@ -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