|
|
|
@ -1303,7 +1303,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp |
|
|
|
|
{ |
|
|
|
|
AVIContext *avi = s->priv_data; |
|
|
|
|
AVStream *st; |
|
|
|
|
int i, index; |
|
|
|
|
int i, index, j; |
|
|
|
|
int64_t pos, pos_min; |
|
|
|
|
AVIStream *ast; |
|
|
|
|
|
|
|
|
@ -1367,6 +1367,22 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp |
|
|
|
|
index=0; |
|
|
|
|
ast2->seek_pos= st2->index_entries[index].pos; |
|
|
|
|
pos_min= FFMIN(pos_min,ast2->seek_pos); |
|
|
|
|
} |
|
|
|
|
for(i = 0; i < s->nb_streams; i++) { |
|
|
|
|
AVStream *st2 = s->streams[i]; |
|
|
|
|
AVIStream *ast2 = st2->priv_data; |
|
|
|
|
|
|
|
|
|
if (ast2->sub_ctx || st2->nb_index_entries <= 0) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
index = av_index_search_timestamp( |
|
|
|
|
st2, |
|
|
|
|
av_rescale_q(timestamp, st->time_base, st2->time_base) * FFMAX(ast2->sample_size, 1), |
|
|
|
|
flags | AVSEEK_FLAG_BACKWARD); |
|
|
|
|
if(index<0) |
|
|
|
|
index=0; |
|
|
|
|
while(index>0 && st2->index_entries[index-1].pos >= pos_min) |
|
|
|
|
index--; |
|
|
|
|
ast2->frame_offset = st2->index_entries[index].timestamp; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|