mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 20:19:55 +00:00
add ff_index_search_timestamp and ff_add_index_entry
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
parent
51b317d2e9
commit
e6fb5a4f78
@ -226,4 +226,18 @@ void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
|
||||
*/
|
||||
int ff_find_stream_index(AVFormatContext *s, int id);
|
||||
|
||||
/**
|
||||
* Internal version of av_index_search_timestamp
|
||||
*/
|
||||
int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
|
||||
int64_t wanted_timestamp, int flags);
|
||||
|
||||
/**
|
||||
* Internal version of av_add_index_entry
|
||||
*/
|
||||
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);
|
||||
|
||||
#endif /* AVFORMAT_INTERNAL_H */
|
||||
|
@ -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){
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "libavutil/intfloat_readwrite.h"
|
||||
#include "avformat.h"
|
||||
#include "internal.h"
|
||||
#include "riff.h"
|
||||
#include "asf.h"
|
||||
#include "mpegts.h"
|
||||
|
Loading…
Reference in New Issue
Block a user