]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/flvdec.c
Merge commit '13bddab7de10aebf6efb98aa6d7ff0c51bb0e364'
[ffmpeg] / libavformat / flvdec.c
index a59c07d34aa825ae1f278a0f0efec07db85627a0..7b434498ea3d2b54291db6b1d23dec79dc9f4b69 100644 (file)
@@ -525,6 +525,8 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream,
                         if (version > 0 && version <= 655)
                             flv->broken_sizes = 1;
                     }
+                } else if (!strcmp(key, "metadatacreator") && !strcmp(str_val, "MEGA")) {
+                    flv->broken_sizes = 1;
                 }
             }
         }
@@ -851,7 +853,6 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
 
 retry:
     /* pkt size is repeated at end. skip it */
-    for (;; last = avio_rb32(s->pb)) {
         pos  = avio_tell(s->pb);
         type = (avio_r8(s->pb) & 0x1F);
         orig_size =
@@ -954,7 +955,7 @@ skip:
         }
         if (i == s->nb_streams) {
             static const enum AVMediaType stream_types[] = {AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_SUBTITLE};
-            av_log(s, AV_LOG_WARNING, "Stream discovered after head already parsed\n");
+            av_log(s, AV_LOG_WARNING, "%s stream discovered after head already parsed\n", av_get_media_type_string(stream_types[stream_type]));
             st = create_stream(s, stream_types[stream_type]);
             if (!st)
                 return AVERROR(ENOMEM);
@@ -975,8 +976,6 @@ skip:
             ret = AVERROR(EAGAIN);
             goto leave;
         }
-        break;
-    }
 
     // if not streamed and no duration from metadata then seek to end to find
     // the duration from the timestamps
@@ -1138,7 +1137,9 @@ retry_duration:
 
 leave:
     last = avio_rb32(s->pb);
-    if (last != orig_size + 11 && !flv->broken_sizes) {
+    if (last != orig_size + 11 &&
+        (last != orig_size || !last) &&
+        !flv->broken_sizes) {
         av_log(s, AV_LOG_ERROR, "Packet mismatch %d %d\n", last, orig_size + 11);
         avio_seek(s->pb, pos + 1, SEEK_SET);
         ret = resync(s);