From 76d9d0f9ebed6eb91e8aead109471282b8f4d38b Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 7 Feb 2009 19:45:54 +0100 Subject: [PATCH] ordered chapters: seek to closest keyframe --- libavformat/matroskadec.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 96ea0c4ad6..f185edac03 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -1093,6 +1093,9 @@ matroska_seek_next_chapter(AVFormatContext *s) MatroskaDemuxContext *matroska = s->priv_data; MatroskaChapter *chapters = matroska->chapters.elem; MatroskaChapter *mc, *cur_mc = &chapters[matroska->current_chapter]; + int index; + int64_t pts; + AVStream *st; if(matroska->current_chapter + 1 >= s->nb_chapters) return AVERROR(EIO); @@ -1101,9 +1104,12 @@ matroska_seek_next_chapter(AVFormatContext *s) if(mc->segment == cur_mc->segment && ((mc->start - cur_mc->end) * av_q2d(MATROSKA_UNSCALED_TIMEBASE)) < 3) return 1; - return matroska_do_seek(mc->segment->ctx, matroska->default_stream,\ - av_rescale_q((int64_t)mc->start, MATROSKA_UNSCALED_TIMEBASE, \ - s->streams[matroska->default_stream]->time_base), 0); + /*XXX this is a hack to seek to closest keyframe */ + st = mc->segment->ctx->streams[matroska->default_stream]; + pts = av_rescale_q((int64_t)mc->start, MATROSKA_UNSCALED_TIMEBASE, st->time_base); + index = av_index_search_timestamp(st, pts, AVSEEK_FLAG_BACKWARD); + index = (pts - st->index_entries[index].timestamp < st->index_entries[index+1].timestamp - pts)?index:index+1; + return matroska_do_seek(mc->segment->ctx, matroska->default_stream, st->index_entries[index].timestamp, 0); } static int -- 2.11.4.GIT