From: "Ronald S. Bultje" <[email protected]>

Prevents all kind of badness when files contain multiple indexes.

Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC: [email protected]
---
 libavformat/mov.c |   40 ++++------------------------------------
 1 file changed, 4 insertions(+), 36 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 75dec37..d7dd7aa 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1757,11 +1757,6 @@ static void mov_build_index(MOVContext *mov, AVStream 
*st)
             return;
         if (sc->sample_count >= UINT_MAX / sizeof(*st->index_entries))
             return;
-        st->index_entries = 
av_malloc(sc->sample_count*sizeof(*st->index_entries));
-        if (!st->index_entries)
-            return;
-        st->index_entries_allocated_size = 
sc->sample_count*sizeof(*st->index_entries);
-
         for (i = 0; i < sc->chunk_count; i++) {
             current_offset = sc->chunk_offsets[i];
             while (stsc_index + 1 < sc->stsc_count &&
@@ -1788,15 +1783,8 @@ static void mov_build_index(MOVContext *mov, AVStream 
*st)
                 sample_size = sc->sample_size > 0 ? sc->sample_size : 
sc->sample_sizes[current_sample];
                 if (sc->pseudo_stream_id == -1 ||
                    sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
-                    AVIndexEntry *e = 
&st->index_entries[st->nb_index_entries++];
-                    e->pos = current_offset;
-                    e->timestamp = current_dts;
-                    e->size = sample_size;
-                    e->min_distance = distance;
-                    e->flags = keyframe ? AVINDEX_KEYFRAME : 0;
-                    av_dlog(mov->fc, "AVIndex stream %d, sample %d, offset 
%"PRIx64", dts %"PRId64", "
-                            "size %d, distance %d, keyframe %d\n", st->index, 
current_sample,
-                            current_offset, current_dts, sample_size, 
distance, keyframe);
+                    av_add_index_entry(st, current_offset, current_dts, 
sample_size, distance,
+                                       keyframe ? AVINDEX_KEYFRAME : 0);
                 }
 
                 current_offset += sample_size;
@@ -1846,10 +1834,6 @@ static void mov_build_index(MOVContext *mov, AVStream 
*st)
         av_dlog(mov->fc, "chunk count %d\n", total);
         if (total >= UINT_MAX / sizeof(*st->index_entries))
             return;
-        st->index_entries = av_malloc(total*sizeof(*st->index_entries));
-        if (!st->index_entries)
-            return;
-        st->index_entries_allocated_size = total*sizeof(*st->index_entries);
 
         // populate index
         for (i = 0; i < sc->chunk_count; i++) {
@@ -1860,7 +1844,6 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
             chunk_samples = sc->stsc_data[stsc_index].count;
 
             while (chunk_samples > 0) {
-                AVIndexEntry *e;
                 unsigned size, samples;
 
                 if (sc->samples_per_frame >= 160) { // gsm
@@ -1877,23 +1860,8 @@ static void mov_build_index(MOVContext *mov, AVStream 
*st)
                     }
                 }
 
-                if (st->nb_index_entries >= total) {
-                    av_log(mov->fc, AV_LOG_ERROR, "wrong chunk count %d\n", 
total);
-                    return;
-                }
-                e = &st->index_entries[st->nb_index_entries++];
-                e->pos = current_offset;
-                e->timestamp = current_dts;
-                e->size = size;
-                e->min_distance = 0;
-                e->flags = AVINDEX_KEYFRAME;
-                av_dlog(mov->fc, "AVIndex stream %d, chunk %d, offset 
%"PRIx64", dts %"PRId64", "
-                        "size %d, duration %d\n", st->index, i, 
current_offset, current_dts,
-                        size, samples);
-
-                current_offset += size;
-                current_dts += samples;
-                chunk_samples -= samples;
+                av_add_index_entry(st, current_offset, current_dts, size, 0,
+                                   AVINDEX_KEYFRAME);
             }
         }
     }
-- 
1.7.9.2

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to