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; ientry; 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; ientry; 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; ientry; 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