[FFmpeg-cvslog] r11909 - trunk/libavformat/mov.c

bcoudurier subversion
Mon Feb 11 23:32:35 CET 2008


Author: bcoudurier
Date: Mon Feb 11 23:32:35 2008
New Revision: 11909

Log:
split chunks in the case of big compressed audio frames,
might be tweaked, fix qt_dv_pal_test.mov.


Modified:
   trunk/libavformat/mov.c

Modified: trunk/libavformat/mov.c
==============================================================================
--- trunk/libavformat/mov.c	(original)
+++ trunk/libavformat/mov.c	Mon Feb 11 23:32:35 2008
@@ -1375,6 +1375,7 @@ static void mov_build_index(MOVContext *
         }
     } else { /* read whole chunk */
         unsigned int chunk_samples, chunk_size, chunk_duration;
+        unsigned int frames = 1;
         for (i = 0; i < sc->chunk_count; i++) {
             current_offset = sc->chunk_offsets[i];
             if (stsc_index + 1 < sc->sample_to_chunk_sz &&
@@ -1387,7 +1388,15 @@ static void mov_build_index(MOVContext *
                 chunk_size = chunk_samples * sc->sample_size;
             else if (sc->samples_per_frame > 0 &&
                      (chunk_samples * sc->bytes_per_frame % sc->samples_per_frame == 0))
+                {
+                    if (sc->samples_per_frame < 1024)
                 chunk_size = chunk_samples * sc->bytes_per_frame / sc->samples_per_frame;
+                    else {
+                        chunk_size = sc->bytes_per_frame;
+                        frames = chunk_samples / sc->samples_per_frame;
+                        chunk_samples = sc->samples_per_frame;
+                    }
+                }
             else { /* workaround to find nearest next chunk offset */
                 chunk_size = INT_MAX;
                 for (j = 0; j < mov->fc->nb_streams; j++) {
@@ -1416,6 +1425,7 @@ static void mov_build_index(MOVContext *
                     msc->next_chunk = 0;
                 }
             }
+            for (j = 0; j < frames; j++) {
             av_add_index_entry(st, current_offset, current_dts, chunk_size, 0, AVINDEX_KEYFRAME);
             /* get chunk duration */
             chunk_duration = 0;
@@ -1432,10 +1442,12 @@ static void mov_build_index(MOVContext *
                     }
                 }
             }
+            current_offset += sc->bytes_per_frame;
             dprintf(mov->fc, "AVIndex stream %d, chunk %d, offset %"PRIx64", dts %"PRId64", size %d, "
                     "duration %d\n", st->index, i, current_offset, current_dts, chunk_size, chunk_duration);
             assert(chunk_duration % sc->time_rate == 0);
             current_dts += chunk_duration / sc->time_rate;
+            }
         }
     }
  out:




More information about the ffmpeg-cvslog mailing list