Mercurial > libavformat.hg
changeset 698:829c5c8e5cf2 libavformat
keyframe & non keyframe index fixes
author | michael |
---|---|
date | Sun, 13 Mar 2005 00:13:01 +0000 |
parents | c7e1501cc306 |
children | 2f5f4578a076 |
files | avformat.h mpeg.c utils.c |
diffstat | 3 files changed, 20 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/avformat.h Sat Mar 12 13:31:03 2005 +0000 +++ b/avformat.h Sun Mar 13 00:13:01 2005 +0000 @@ -5,7 +5,7 @@ extern "C" { #endif -#define LIBAVFORMAT_BUILD 4621 +#define LIBAVFORMAT_BUILD 4622 #define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT #define LIBAVFORMAT_VERSION FFMPEG_VERSION @@ -584,6 +584,7 @@ #define AVSEEK_FLAG_BACKWARD 1 ///< seek backward #define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes +#define AVSEEK_FLAG_ANY 4 ///< seek to any frame, even non keyframes int av_find_default_stream_index(AVFormatContext *s); int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags);
--- a/mpeg.c Sat Mar 12 13:31:03 2005 +0000 +++ b/mpeg.c Sun Mar 13 00:13:01 2005 +0000 @@ -1482,7 +1482,7 @@ int i; for(i=0; i<s->nb_streams; i++){ if(startcode == s->streams[i]->id) { - av_add_index_entry(s->streams[i], *ppos, dts, 0, 0 /* FIXME keyframe? */); + av_add_index_entry(s->streams[i], *ppos, dts, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */); } } }
--- a/utils.c Sat Mar 12 13:31:03 2005 +0000 +++ b/utils.c Sun Mar 13 00:13:01 2005 +0000 @@ -1024,7 +1024,7 @@ 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 @@ /** * 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 @@ 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 @@ 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 @@ }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 @@ } 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;