mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-16 04:11:12 +00:00
fix spliting chunks, simplify
Originally committed as revision 5363 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
baa3a93781
commit
b565ea09c7
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user