Mercurial > libavformat.hg
diff utils.c @ 2932:f5de41d943e2 libavformat
user specifyable maximum amount of memory to use for the index.
patch by Paul Kelly paul stjohnspoint co uk
with some changes by me
author | michael |
---|---|
date | Sun, 13 Jan 2008 13:33:37 +0000 |
parents | 02e909632f18 |
children | 86ab3f8db16c |
line wrap: on
line diff
--- a/utils.c Sat Jan 12 11:25:54 2008 +0000 +++ b/utils.c Sun Jan 13 13:33:37 2008 +0000 @@ -324,6 +324,7 @@ {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E}, {"analyzeduration", "how many microseconds are analyzed to estimate duration", OFFSET(max_analyze_duration), FF_OPT_TYPE_INT, 3*AV_TIME_BASE, 0, INT_MAX, D}, {"cryptokey", "decryption key", OFFSET(key), FF_OPT_TYPE_BINARY, 0, 0, 0, D}, +{"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), FF_OPT_TYPE_INT, INT_MAX, 0, INT_MAX, D}, {NULL}, }; @@ -791,6 +792,7 @@ compute_pkt_fields(s, st, st->parser, pkt); if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){ + ff_reduce_index(s, st->index); av_add_index_entry(st, st->parser->frame_offset, pkt->dts, 0, 0, AVINDEX_KEYFRAME); } @@ -1008,6 +1010,19 @@ } } +void ff_reduce_index(AVFormatContext *s, int stream_index) +{ + AVStream *st= s->streams[stream_index]; + unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry); + + if((unsigned)st->nb_index_entries >= max_entries){ + int i; + for(i=0; 2*i<st->nb_index_entries; i++) + st->index_entries[i]= st->index_entries[2*i]; + st->nb_index_entries= i; + } +} + int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags) {