diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2015-06-02 18:30:07 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2015-07-13 12:38:21 +0200 |
commit | b183fb4767f237721ae01669b05e9a17fed7cf96 (patch) | |
tree | 3574829b5a9b273b6883beb8668b7638c2b8c14b /libavformat | |
parent | 1aab5d8ab1e27449a2d58d6f001bb34784f402bf (diff) | |
download | ffmpeg-b183fb4767f237721ae01669b05e9a17fed7cf96.tar.gz |
avformat: Add ff_configure_buffers_for_index()
This allows configuring the io buffer in such way that few seeks are needed for playback
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/internal.h | 2 | ||||
-rw-r--r-- | libavformat/utils.c | 39 |
2 files changed, 41 insertions, 0 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h index f90df90242..1190dbdf60 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -254,6 +254,8 @@ int ff_add_index_entry(AVIndexEntry **index_entries, unsigned int *index_entries_allocated_size, int64_t pos, int64_t timestamp, int size, int distance, int flags); +void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance); + /** * Add a new chapter. * diff --git a/libavformat/utils.c b/libavformat/utils.c index 66c3ed7ab2..d91d84805d 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1781,6 +1781,45 @@ int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries, return m; } +void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance) +{ + int ist1, ist2; + int64_t pos_delta = 0; + + for (ist1 = 0; ist1 < s->nb_streams; ist1++) { + AVStream *st1 = s->streams[ist1]; + for (ist2 = 0; ist2 < s->nb_streams; ist2++) { + AVStream *st2 = s->streams[ist2]; + int i1, i2; + + if (ist1 == ist2) + continue; + + for (i1 = i2 = 0; i1 < st1->nb_index_entries; i1++) { + AVIndexEntry *e1 = &st1->index_entries[i1]; + int64_t e1_pts = av_rescale_q(e1->timestamp, st1->time_base, AV_TIME_BASE_Q); + + for (; i2 < st2->nb_index_entries; i2++) { + AVIndexEntry *e2 = &st2->index_entries[i2]; + int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q); + if (e2_pts - e1_pts < time_tolerance) + continue; + pos_delta = FFMAX(pos_delta, e1->pos - e2->pos); + break; + } + } + } + } + + pos_delta *= 2; + /* XXX This could be adjusted depending on protocol*/ + if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) { + av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta); + ffio_set_buf_size(s->pb, pos_delta); + s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2); + } +} + 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, |