changeset 1075:f125be9d18e2 libavformat

fix spliting chunks, simplify
author bcoudurier
date Thu, 11 May 2006 21:29:37 +0000
parents 829b55eb168c
children a1c07ce3943c
files mov.c
diffstat 1 files changed, 25 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/mov.c	Wed May 10 18:00:16 2006 +0000
+++ b/mov.c	Thu May 11 21:29:37 2006 +0000
@@ -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 @@
         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 @@
             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);