diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2006-05-11 21:29:37 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2006-05-11 21:29:37 +0000 |
commit | b565ea09c723b6242c927f6cb06b2e2ed7069bf5 (patch) | |
tree | 215909ec315e341fcf6b052b85d585f5e46d19e0 /libavformat/mov.c | |
parent | baa3a937815c8bcd47b84cd4a3b450705197b27a (diff) | |
download | ffmpeg-b565ea09c723b6242c927f6cb06b2e2ed7069bf5.tar.gz |
fix spliting chunks, simplify
Originally committed as revision 5363 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r-- | libavformat/mov.c | 66 |
1 files changed, 25 insertions, 41 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index 197e7de537..1c32d3a5f1 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -66,10 +66,6 @@ /* Allows seeking */ #define MOV_SEEK -/* Special handling for movies created with Minolta Dimaxe Xi*/ -/* this fix should not interfere with other .mov files, but just in case*/ -#define MOV_MINOLTA_FIX - /* some streams in QT (and in MP4 mostly) aren't either video nor audio */ /* so we first list them as this, then clean up the list of streams we give back, */ /* getting rid of these */ @@ -1817,37 +1813,6 @@ again: goto again; } - /* now get the chunk size... */ - - for(i=0; i<mov->total_streams; i++) { - MOVStreamContext *msc = mov->streams[i]; - if ((msc->next_chunk < msc->chunk_count) - && msc->chunk_offsets[msc->next_chunk] - offset < size - && msc->chunk_offsets[msc->next_chunk] > offset) - size = msc->chunk_offsets[msc->next_chunk] - offset; - } - -#ifdef MOV_MINOLTA_FIX - //Make sure that size is according to sample_size (Needed by .mov files - //created on a Minolta Dimage Xi where audio chunks contains waste data in the end) - //Maybe we should really not only check sc->sample_size, but also sc->sample_sizes - //but I have no such movies - if (sc->sample_size > 0) { - int foundsize=0; - for(i=0; i<(sc->sample_to_chunk_sz); i++) { - if( (sc->sample_to_chunk[i].first)<=(sc->next_chunk) ) - { - foundsize=sc->sample_to_chunk[i].count*sc->sample_size; - } - dprintf("sample_to_chunk first=%ld count=%ld, id=%ld\n", sc->sample_to_chunk[i].first, sc->sample_to_chunk[i].count, sc->sample_to_chunk[i].id); - } - if( (foundsize>0) && (foundsize<size) ) - { - size=foundsize; - } - } -#endif //MOV_MINOLTA_FIX - idx = sc->sample_to_chunk_index; if (idx + 1 < sc->sample_to_chunk_sz && sc->next_chunk >= sc->sample_to_chunk[idx + 1].first) idx++; @@ -1858,14 +1823,33 @@ again: mov->partial = sc; /* we'll have to get those samples before next chunk */ sc->left_in_chunk = sc->sample_to_chunk[idx].count - 1; - size = (sc->sample_size > 1)?sc->sample_size:sc->sample_sizes[sc->current_sample]; } - + size = (sc->sample_size > 1)?sc->sample_size:sc->sample_sizes[sc->current_sample]; next_sample= sc->current_sample+1; - }else if(idx < sc->sample_to_chunk_sz){ - next_sample= sc->current_sample + sc->sample_to_chunk[idx].count; - }else - next_sample= sc->current_sample; + }else{ + int adjusted= 0; + /* get the chunk size... */ + for(i=0; i<mov->total_streams; i++) { + MOVStreamContext *msc = mov->streams[i]; + if ((msc->next_chunk < msc->chunk_count) + && msc->chunk_offsets[msc->next_chunk] - offset < size + && msc->chunk_offsets[msc->next_chunk] > offset) + size = msc->chunk_offsets[msc->next_chunk] - offset; + } + //Make sure that size is according to sample_size (Needed by .mov files + //created on a Minolta Dimage Xi where audio chunks contains waste data in the end) + //needed for 'raw ' + //sample_size is already adjusted in read_stsz + adjusted= sc->sample_to_chunk[idx].count * sc->sample_size; + if (adjusted < size) { + dprintf("adjusted %d, size %d, sample count %ld\n", adjusted, size, sc->sample_to_chunk[idx].count); + size = adjusted; + } + if(idx < sc->sample_to_chunk_sz){ + next_sample= sc->current_sample + sc->sample_to_chunk[idx].count; + }else + next_sample= sc->current_sample; + } readchunk: dprintf("chunk: %"PRId64" -> %"PRId64" (%i)\n", offset, offset + size, size); |