Skip to content
Snippets Groups Projects
Commit 0f776df0 authored by wm4's avatar wm4 Committed by Michael Niedermayer
Browse files

avformat/wvdec: fix seeking


While I'm not sure why exactly sure why the old code could end up in the
wrong position, using the generic index code is much simpler and is
known to work correctly.

Signed-off-by: default avatarMichael Niedermayer <michaelni@gmx.at>
parent cd69c0e0
Branches
Tags
No related merge requests found
...@@ -296,6 +296,7 @@ static int wv_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -296,6 +296,7 @@ static int wv_read_packet(AVFormatContext *s, AVPacket *pkt)
} }
} }
pkt->stream_index = 0; pkt->stream_index = 0;
pkt->pos = pos;
wc->block_parsed = 1; wc->block_parsed = 1;
pkt->pts = wc->header.block_idx; pkt->pts = wc->header.block_idx;
block_samples = wc->header.samples; block_samples = wc->header.samples;
...@@ -305,41 +306,6 @@ static int wv_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -305,41 +306,6 @@ static int wv_read_packet(AVFormatContext *s, AVPacket *pkt)
else else
pkt->duration = block_samples; pkt->duration = block_samples;
av_add_index_entry(s->streams[0], pos, pkt->pts, 0, 0, AVINDEX_KEYFRAME);
return 0;
}
static int wv_read_seek(AVFormatContext *s, int stream_index,
int64_t timestamp, int flags)
{
AVStream *st = s->streams[stream_index];
WVContext *wc = s->priv_data;
AVPacket pkt1, *pkt = &pkt1;
int ret;
int index = av_index_search_timestamp(st, timestamp, flags);
int64_t pos, pts;
/* if found, seek there */
if (index >= 0 &&
timestamp <= st->index_entries[st->nb_index_entries - 1].timestamp) {
wc->block_parsed = 1;
avio_seek(s->pb, st->index_entries[index].pos, SEEK_SET);
return 0;
}
/* if timestamp is out of bounds, return error */
if (timestamp < 0 || timestamp >= s->duration)
return AVERROR(EINVAL);
pos = avio_tell(s->pb);
do {
ret = av_read_frame(s, pkt);
if (ret < 0) {
avio_seek(s->pb, pos, SEEK_SET);
return ret;
}
pts = pkt->pts;
av_free_packet(pkt);
} while(pts < timestamp);
return 0; return 0;
} }
...@@ -350,5 +316,5 @@ AVInputFormat ff_wv_demuxer = { ...@@ -350,5 +316,5 @@ AVInputFormat ff_wv_demuxer = {
.read_probe = wv_probe, .read_probe = wv_probe,
.read_header = wv_read_header, .read_header = wv_read_header,
.read_packet = wv_read_packet, .read_packet = wv_read_packet,
.read_seek = wv_read_seek, .flags = AVFMT_GENERIC_INDEX,
}; };
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment