]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/flvdec.c
Merge commit '5a79bf0284a37855636390e620d189a964214c9e'
[ffmpeg] / libavformat / flvdec.c
index 07f7b681e917e1aa12054ef0900a11b87b8ebd3d..345be1ea7d2e15f717d1f8f57918911083c064d2 100644 (file)
@@ -547,6 +547,7 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream,
 
 #define TYPE_ONTEXTDATA 1
 #define TYPE_ONCAPTION 2
+#define TYPE_ONCAPTIONINFO 3
 #define TYPE_UNKNOWN 9
 
 static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
@@ -558,7 +559,7 @@ static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
     int i;
     // only needs to hold the string "onMetaData".
     // Anything longer is something we don't want.
-    char buffer[11];
+    char buffer[32];
 
     astream = NULL;
     vstream = NULL;
@@ -577,8 +578,13 @@ static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
     if (!strcmp(buffer, "onCaption"))
         return TYPE_ONCAPTION;
 
-    if (strcmp(buffer, "onMetaData") && strcmp(buffer, "onCuePoint"))
+    if (!strcmp(buffer, "onCaptionInfo"))
+        return TYPE_ONCAPTIONINFO;
+
+    if (strcmp(buffer, "onMetaData") && strcmp(buffer, "onCuePoint")) {
+        av_log(s, AV_LOG_DEBUG, "Unknown type %s\n", buffer);
         return TYPE_UNKNOWN;
+    }
 
     // find the streams now so that amf_parse_object doesn't need to do
     // the lookup every time it is called.
@@ -783,7 +789,8 @@ skip:
 static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     FLVContext *flv = s->priv_data;
-    int ret, i, type, size, flags;
+    int ret, i, size, flags;
+    enum FlvTagType type;
     int stream_type=-1;
     int64_t next, pos, meta_pos;
     int64_t dts, pts = AV_NOPTS_VALUE;
@@ -841,7 +848,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
                 int type;
                 meta_pos = avio_tell(s->pb);
                 type = flv_read_metabody(s, next);
-                if (type == 0 && dts == 0 || type < 0) {
+                if (type == 0 && dts == 0 || type < 0 || type == TYPE_UNKNOWN) {
                     goto skip;
                 } else if (type == TYPE_ONTEXTDATA) {
                     avpriv_request_sample(s, "OnTextData packet");
@@ -890,8 +897,9 @@ skip:
         }
         av_log(s, AV_LOG_TRACE, "%d %X %d \n", stream_type, flags, st->discard);
 
-        if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||
-            stream_type == FLV_STREAM_TYPE_AUDIO)
+        if (s->pb->seekable &&
+            ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||
+              stream_type == FLV_STREAM_TYPE_AUDIO))
             av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME);
 
         if (  (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || (stream_type == FLV_STREAM_TYPE_AUDIO)))