Commit d6686149 authored by Michael Niedermayer's avatar Michael Niedermayer

asfdec: Skip to keyframe after seeking

Fixes Ticket1616
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 66487d73
......@@ -42,6 +42,7 @@ typedef struct ASFStream {
int packet_obj_size;
int timestamp;
int64_t duration;
int skip_to_key;
int ds_span; /* descrambling */
int ds_packet_size;
......
......@@ -1137,7 +1137,7 @@ static int asf_parse_packet(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
if (asf->stream_index < 0 ||
s->streams[asf->stream_index]->discard >= AVDISCARD_ALL ||
(!asf->packet_key_frame &&
s->streams[asf->stream_index]->discard >= AVDISCARD_NONKEY)) {
(s->streams[asf->stream_index]->discard >= AVDISCARD_NONKEY || asf->streams[s->streams[asf->stream_index]->id].skip_to_key))) {
asf->packet_time_start = 0;
/* unhandled packet (should not happen) */
avio_skip(pb, asf->packet_frag_size);
......@@ -1148,6 +1148,7 @@ static int asf_parse_packet(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
continue;
}
asf->asf_st = &asf->streams[s->streams[asf->stream_index]->id];
asf->asf_st->skip_to_key = 0;
}
asf_st = asf->asf_st;
av_assert0(asf_st);
......@@ -1366,6 +1367,21 @@ static void asf_reset_header(AVFormatContext *s)
asf->asf_st = NULL;
}
static void skip_to_key(AVFormatContext *s)
{
ASFContext *asf = s->priv_data;
int i;
for (i = 0; i < 128; i++) {
int j = asf->asfid2avid[i];
ASFStream *asf_st = &asf->streams[i];
if (j < 0 || s->streams[j]->codec->codec_type != AVMEDIA_TYPE_VIDEO)
continue;
asf_st->skip_to_key = 1;
}
}
static int asf_read_close(AVFormatContext *s)
{
asf_reset_header(s);
......@@ -1515,6 +1531,7 @@ static int asf_read_seek(AVFormatContext *s, int stream_index,
if(avio_seek(s->pb, pos, SEEK_SET) < 0)
return -1;
asf_reset_header(s);
skip_to_key(s);
return 0;
}
}
......@@ -1522,6 +1539,7 @@ static int asf_read_seek(AVFormatContext *s, int stream_index,
if (ff_seek_frame_binary(s, stream_index, pts, flags) < 0)
return -1;
asf_reset_header(s);
skip_to_key(s);
return 0;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment