mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-28 14:01:27 +00:00
asfdec: Skip to keyframe after seeking
Fixes Ticket1616 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
66487d73c3
commit
d6686149e2
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user