diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2005-03-13 00:13:01 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2005-03-13 00:13:01 +0000 |
commit | 27a5fe5fdf9d017a344e9e0aee143244b4adebb9 (patch) | |
tree | e12e5ef50529aa5bdd2bac2012c6eb0eb266da7b /libavformat/utils.c | |
parent | fcc872422e0c940dae067d6752fc721f9aeb913e (diff) | |
download | ffmpeg-27a5fe5fdf9d017a344e9e0aee143244b4adebb9.tar.gz |
keyframe & non keyframe index fixes
Originally committed as revision 4034 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r-- | libavformat/utils.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c index fc49a6d8b7..d2b6c94bc5 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1024,7 +1024,7 @@ int av_add_index_entry(AVStream *st, st->index_entries= entries; - index= av_index_search_timestamp(st, timestamp, 0); + index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY); if(index<0){ index= st->nb_index_entries++; @@ -1090,13 +1090,14 @@ static int is_raw_stream(AVFormatContext *s) /** * gets the index for a specific timestamp. - * @param backward if non zero then the returned index will correspond to + * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond to * the timestamp which is <= the requested one, if backward is 0 * then it will be >= + * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise * @return < 0 if no such timestamp could be found */ int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, - int backward) + int flags) { AVIndexEntry *entries= st->index_entries; int nb_entries= st->nb_index_entries; @@ -1114,7 +1115,13 @@ int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, if(timestamp <= wanted_timestamp) a = m; } - m= backward ? a : b; + m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b; + + if(!(flags & AVSEEK_FLAG_ANY)){ + while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){ + m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1; + } + } if(m == nb_entries) return -1; @@ -1152,7 +1159,7 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts if(st->index_entries){ AVIndexEntry *e; - index= av_index_search_timestamp(st, target_ts, 1); + index= av_index_search_timestamp(st, target_ts, flags | AVSEEK_FLAG_BACKWARD); //FIXME whole func must be checked for non keyframe entries in index case, especially read_timestamp() index= FFMAX(index, 0); e= &st->index_entries[index]; @@ -1166,8 +1173,10 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts }else{ assert(index==0); } - index++; - if(index < st->nb_index_entries){ + + index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD); + assert(index < st->nb_index_entries); + if(index >= 0){ e= &st->index_entries[index]; assert(e->timestamp >= target_ts); pos_max= e->pos; @@ -1316,7 +1325,7 @@ static int av_seek_frame_generic(AVFormatContext *s, } st = s->streams[stream_index]; - index = av_index_search_timestamp(st, timestamp, flags & AVSEEK_FLAG_BACKWARD); + index = av_index_search_timestamp(st, timestamp, flags); if (index < 0) return -1; |