diff flvdec.c @ 1318:defa841523a9 libavformat

FLV seeking patch by Nazo. lovesyao at aol com.
author banan
date Sun, 17 Sep 2006 09:39:49 +0000
parents 541f4aa12efc
children 0899bfe4105c
line wrap: on
line diff
--- a/flvdec.c	Fri Sep 15 19:14:24 2006 +0000
+++ b/flvdec.c	Sun Sep 17 09:39:49 2006 +0000
@@ -55,15 +55,18 @@
 
     url_fseek(&s->pb, offset, SEEK_SET);
 
+    s->start_time = 0;
+
     return 0;
 }
 
 static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
-    int ret, i, type, size, pts, flags, is_audio, next;
+    int ret, i, type, size, pts, flags, is_audio, next, pos;
     AVStream *st = NULL;
 
  for(;;){
+    pos = url_ftell(&s->pb);
     url_fskip(&s->pb, 4); /* size of previous packet */
     type = get_byte(&s->pb);
     size = get_be24(&s->pb);
@@ -154,6 +157,8 @@
         url_fseek(&s->pb, next, SEEK_SET);
         continue;
     }
+    if ((flags >> 4)==1)
+        av_add_index_entry(st, pos, pts, size, 0, AVINDEX_KEYFRAME);
     break;
  }
 
@@ -216,6 +221,17 @@
     return 0;
 }
 
+static int flv_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
+{
+    AVStream *st = s->streams[stream_index];
+    int index = av_index_search_timestamp(st, timestamp, flags);
+    if (index < 0)
+        return -1;
+    url_fseek(&s->pb, st->index_entries[index].pos, SEEK_SET);
+
+    return 0;
+}
+
 AVInputFormat flv_demuxer = {
     "flv",
     "flv format",
@@ -224,6 +240,7 @@
     flv_read_header,
     flv_read_packet,
     flv_read_close,
+    flv_read_seek,
     .extensions = "flv",
     .value = CODEC_ID_FLV1,
 };