Mercurial > libavformat.hg
changeset 1605:6d66c6325e0d libavformat
Enable forward seek in Musepack demuxer
author | kostya |
---|---|
date | Thu, 28 Dec 2006 05:33:31 +0000 |
parents | ec546897df3d |
children | 8813741f7196 |
files | mpc.c |
diffstat | 1 files changed, 31 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/mpc.c Thu Dec 28 00:32:06 2006 +0000 +++ b/mpc.c Thu Dec 28 05:33:31 2006 +0000 @@ -71,6 +71,7 @@ c->curframe = 0; c->lastframe = -1; c->curbits = 8; + c->frames_noted = 0; st = av_new_stream(s, 0); if (!st) @@ -156,15 +157,42 @@ return 0; } +/** + * Seek to the given position + * If position is unknown but is within the limits of file + * then packets are skipped unless desired position is reached + * + * Also this function makes use of the fact that timestamp == frameno + */ static int mpc_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { AVStream *st = s->streams[stream_index]; MPCContext *c = s->priv_data; + AVPacket pkt1, *pkt = &pkt1; + int ret; int index = av_index_search_timestamp(st, timestamp, flags); - if (index < 0) + uint32_t lastframe; + + /* if found, seek there */ + if (index >= 0){ + c->curframe = st->index_entries[index].pos; + return 0; + } + /* if timestamp is out of bounds, return error */ + if(timestamp < 0 || timestamp >= c->fcount) return -1; - c->curframe = st->index_entries[index].pos; - + /* seek to the furthest known position and read packets until + we reach desired position */ + lastframe = c->curframe; + if(c->frames_noted) c->curframe = c->frames_noted - 1; + while(c->curframe < timestamp){ + ret = av_read_frame(s, pkt); + if (ret < 0){ + c->curframe = lastframe; + return -1; + } + av_free_packet(pkt); + } return 0; }