|
|
|
@ -1370,28 +1370,30 @@ void ff_reduce_index(AVFormatContext *s, int stream_index) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int av_add_index_entry(AVStream *st, |
|
|
|
|
int64_t pos, int64_t timestamp, int size, int distance, int flags) |
|
|
|
|
int ff_add_index_entry(AVIndexEntry **index_entries, |
|
|
|
|
int *nb_index_entries, |
|
|
|
|
unsigned int *index_entries_allocated_size, |
|
|
|
|
int64_t pos, int64_t timestamp, int size, int distance, int flags) |
|
|
|
|
{ |
|
|
|
|
AVIndexEntry *entries, *ie; |
|
|
|
|
int index; |
|
|
|
|
|
|
|
|
|
if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry)) |
|
|
|
|
if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry)) |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
entries = av_fast_realloc(st->index_entries, |
|
|
|
|
&st->index_entries_allocated_size, |
|
|
|
|
(st->nb_index_entries + 1) * |
|
|
|
|
entries = av_fast_realloc(*index_entries, |
|
|
|
|
index_entries_allocated_size, |
|
|
|
|
(*nb_index_entries + 1) * |
|
|
|
|
sizeof(AVIndexEntry)); |
|
|
|
|
if(!entries) |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
st->index_entries= entries; |
|
|
|
|
*index_entries= entries; |
|
|
|
|
|
|
|
|
|
index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY); |
|
|
|
|
index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY); |
|
|
|
|
|
|
|
|
|
if(index<0){ |
|
|
|
|
index= st->nb_index_entries++; |
|
|
|
|
index= (*nb_index_entries)++; |
|
|
|
|
ie= &entries[index]; |
|
|
|
|
assert(index==0 || ie[-1].timestamp < timestamp); |
|
|
|
|
}else{ |
|
|
|
@ -1399,8 +1401,8 @@ int av_add_index_entry(AVStream *st, |
|
|
|
|
if(ie->timestamp != timestamp){ |
|
|
|
|
if(ie->timestamp <= timestamp) |
|
|
|
|
return -1; |
|
|
|
|
memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index)); |
|
|
|
|
st->nb_index_entries++; |
|
|
|
|
memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index)); |
|
|
|
|
(*nb_index_entries)++; |
|
|
|
|
}else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
|
|
|
|
|
distance= ie->min_distance; |
|
|
|
|
} |
|
|
|
@ -1414,11 +1416,17 @@ int av_add_index_entry(AVStream *st, |
|
|
|
|
return index; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, |
|
|
|
|
int flags) |
|
|
|
|
int av_add_index_entry(AVStream *st, |
|
|
|
|
int64_t pos, int64_t timestamp, int size, int distance, int flags) |
|
|
|
|
{ |
|
|
|
|
return ff_add_index_entry(&st->index_entries, &st->nb_index_entries, |
|
|
|
|
&st->index_entries_allocated_size, pos, |
|
|
|
|
timestamp, size, distance, flags); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries, |
|
|
|
|
int64_t wanted_timestamp, int flags) |
|
|
|
|
{ |
|
|
|
|
AVIndexEntry *entries= st->index_entries; |
|
|
|
|
int nb_entries= st->nb_index_entries; |
|
|
|
|
int a, b, m; |
|
|
|
|
int64_t timestamp; |
|
|
|
|
|
|
|
|
@ -1450,6 +1458,13 @@ int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, |
|
|
|
|
return m; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, |
|
|
|
|
int flags) |
|
|
|
|
{ |
|
|
|
|
return ff_index_search_timestamp(st->index_entries, st->nb_index_entries, |
|
|
|
|
wanted_timestamp, flags); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define DEBUG_SEEK |
|
|
|
|
|
|
|
|
|
int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){ |
|
|
|
|