]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/flvdec.c
avformat/flvdec: add flv_ignore_prevtag option into flvdec
[ffmpeg] / libavformat / flvdec.c
index 0217cef8424eb3d6635108287f54f2661bc7b481..ff91008371c513cb0d72e3e9c4c9bf558f2e15c7 100644 (file)
@@ -44,6 +44,7 @@
 typedef struct FLVContext {
     const AVClass *class; ///< Class for private options.
     int trust_metadata;   ///< configure streams according onMetaData
+    int trust_datasize;   ///< trust data size of FLVTag
     int wrong_dts;        ///< wrong dts due to negative cts
     uint8_t *new_extradata[FLV_STREAM_TYPE_NB];
     int new_extradata_size[FLV_STREAM_TYPE_NB];
@@ -598,8 +599,10 @@ 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;
+                } else if (!strcmp(key, "metadatacreator")) {
+                    if (   !strcmp (str_val, "MEGA")
+                        || !strncmp(str_val, "FlixEngine", 10))
+                        flv->broken_sizes = 1;
                 }
             }
         }
@@ -652,8 +655,6 @@ static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
     AVStream av_unused *dstream;
     AVIOContext *ioc;
     int i;
-    // only needs to hold the string "onMetaData".
-    // Anything longer is something we don't want.
     char buffer[32];
 
     astream = NULL;
@@ -1250,6 +1251,7 @@ retry_duration:
 
 leave:
     last = avio_rb32(s->pb);
+    if (!flv->trust_datasize) {
     if (last != orig_size + 11 && last != orig_size + 10 &&
         !avio_feof(s->pb) &&
         (last != orig_size || !last) && last != flv->sum_flv_tag_size &&
@@ -1262,6 +1264,7 @@ leave:
             goto retry;
         }
     }
+    }
     return ret;
 }
 
@@ -1277,6 +1280,7 @@ static int flv_read_seek(AVFormatContext *s, int stream_index,
 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
 static const AVOption options[] = {
     { "flv_metadata", "Allocate streams according to the onMetaData array", OFFSET(trust_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
+    { "flv_ignore_prevtag", "Ignore the Size of previous tag", OFFSET(trust_datasize), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
     { "missing_streams", "", OFFSET(missing_streams), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xFF, VD | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY },
     { NULL }
 };