Mercurial > libavformat.hg
comparison 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 |
comparison
equal
deleted
inserted
replaced
2931:83790e20f993 | 2932:f5de41d943e2 |
---|---|
322 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"}, | 322 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"}, |
323 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E}, | 323 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E}, |
324 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E}, | 324 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E}, |
325 {"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}, | 325 {"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}, |
326 {"cryptokey", "decryption key", OFFSET(key), FF_OPT_TYPE_BINARY, 0, 0, 0, D}, | 326 {"cryptokey", "decryption key", OFFSET(key), FF_OPT_TYPE_BINARY, 0, 0, 0, D}, |
327 {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), FF_OPT_TYPE_INT, INT_MAX, 0, INT_MAX, D}, | |
327 {NULL}, | 328 {NULL}, |
328 }; | 329 }; |
329 | 330 |
330 #undef E | 331 #undef E |
331 #undef D | 332 #undef D |
789 pkt->dts = st->parser->dts; | 790 pkt->dts = st->parser->dts; |
790 pkt->destruct = av_destruct_packet_nofree; | 791 pkt->destruct = av_destruct_packet_nofree; |
791 compute_pkt_fields(s, st, st->parser, pkt); | 792 compute_pkt_fields(s, st, st->parser, pkt); |
792 | 793 |
793 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){ | 794 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){ |
795 ff_reduce_index(s, st->index); | |
794 av_add_index_entry(st, st->parser->frame_offset, pkt->dts, | 796 av_add_index_entry(st, st->parser->frame_offset, pkt->dts, |
795 0, 0, AVINDEX_KEYFRAME); | 797 0, 0, AVINDEX_KEYFRAME); |
796 } | 798 } |
797 | 799 |
798 break; | 800 break; |
1003 AVStream *st = s->streams[i]; | 1005 AVStream *st = s->streams[i]; |
1004 | 1006 |
1005 st->cur_dts = av_rescale(timestamp, | 1007 st->cur_dts = av_rescale(timestamp, |
1006 st->time_base.den * (int64_t)ref_st->time_base.num, | 1008 st->time_base.den * (int64_t)ref_st->time_base.num, |
1007 st->time_base.num * (int64_t)ref_st->time_base.den); | 1009 st->time_base.num * (int64_t)ref_st->time_base.den); |
1010 } | |
1011 } | |
1012 | |
1013 void ff_reduce_index(AVFormatContext *s, int stream_index) | |
1014 { | |
1015 AVStream *st= s->streams[stream_index]; | |
1016 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry); | |
1017 | |
1018 if((unsigned)st->nb_index_entries >= max_entries){ | |
1019 int i; | |
1020 for(i=0; 2*i<st->nb_index_entries; i++) | |
1021 st->index_entries[i]= st->index_entries[2*i]; | |
1022 st->nb_index_entries= i; | |
1008 } | 1023 } |
1009 } | 1024 } |
1010 | 1025 |
1011 int av_add_index_entry(AVStream *st, | 1026 int av_add_index_entry(AVStream *st, |
1012 int64_t pos, int64_t timestamp, int size, int distance, int flags) | 1027 int64_t pos, int64_t timestamp, int size, int distance, int flags) |