[FFmpeg-cvslog] asfdec: Skip to keyframe after seeking
Michael Niedermayer
git at videolan.org
Tue Jul 30 15:36:35 CEST 2013
ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Tue Jul 30 15:09:13 2013 +0200| [d6686149e2d72655d57c45ac18dee3b820897a5c] | committer: Michael Niedermayer
asfdec: Skip to keyframe after seeking
Fixes Ticket1616
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d6686149e2d72655d57c45ac18dee3b820897a5c
---
libavformat/asf.h | 1 +
libavformat/asfdec.c | 20 +++++++++++++++++++-
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/libavformat/asf.h b/libavformat/asf.h
index 258f5cd..30d6c1e 100644
--- a/libavformat/asf.h
+++ b/libavformat/asf.h
@@ -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;
diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c
index f34a141..d83460e 100644
--- a/libavformat/asfdec.c
+++ b/libavformat/asfdec.c
@@ -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;
}
More information about the ffmpeg-cvslog
mailing list