Mercurial > libavformat.hg
diff utils.c @ 698:829c5c8e5cf2 libavformat
keyframe & non keyframe index fixes
author | michael |
---|---|
date | Sun, 13 Mar 2005 00:13:01 +0000 |
parents | e2687b784c3a |
children | d79164865a7c |
line wrap: on
line diff
--- 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;