[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