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)