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
