OSDN Git Service

Support vendor MPEG4 test content with apparently malformed chunks in them.
authorAndreas Huber <andih@google.com>
Thu, 25 Feb 2010 23:59:24 +0000 (15:59 -0800)
committerAndreas Huber <andih@google.com>
Fri, 26 Feb 2010 00:24:32 +0000 (16:24 -0800)
related-to-bug: 2472211

media/libstagefright/MPEG4Extractor.cpp

index 165ac09..f1c3f0f 100644 (file)
@@ -439,14 +439,16 @@ status_t MPEG4Extractor::parseChunk(off_t *offset, int depth) {
     printf("%sfound chunk '%s' of size %lld\n", indent, chunk, chunk_size);
 
     char buffer[256];
-    if (chunk_size <= sizeof(buffer)) {
-        if (mDataSource->readAt(*offset, buffer, chunk_size)
-                < (ssize_t)chunk_size) {
-            return ERROR_IO;
-        }
-
-        hexdump(buffer, chunk_size);
+    size_t n = chunk_size;
+    if (n > sizeof(buffer)) {
+        n = sizeof(buffer);
+    }
+    if (mDataSource->readAt(*offset, buffer, n)
+            < (ssize_t)n) {
+        return ERROR_IO;
     }
+
+    hexdump(buffer, n);
 #endif
 
     PathAdder autoAdder(&mPath, chunk_type);
@@ -981,7 +983,13 @@ status_t MPEG4Extractor::parseChunk(off_t *offset, int depth) {
 
             if (U32_AT(buffer) != 0) {
                 // Should be version 0, flags 0.
-                return ERROR_MALFORMED;
+
+                // If it's not, let's assume this is one of those
+                // apparently malformed chunks that don't have flags
+                // and completely different semantics than what's
+                // in the MPEG4 specs and skip it.
+                *offset += chunk_size;
+                return OK;
             }
 
             off_t stop_offset = *offset + chunk_size;
@@ -1626,7 +1634,8 @@ bool SniffMPEG4(
 
     if (!memcmp(header, "ftyp3gp", 7) || !memcmp(header, "ftypmp42", 8)
         || !memcmp(header, "ftypisom", 8) || !memcmp(header, "ftypM4V ", 8)
-        || !memcmp(header, "ftypM4A ", 8) || !memcmp(header, "ftypf4v ", 8)) {
+        || !memcmp(header, "ftypM4A ", 8) || !memcmp(header, "ftypf4v ", 8)
+        || !memcmp(header, "ftypkddi", 8)) {
         *mimeType = MEDIA_MIMETYPE_CONTAINER_MPEG4;
         *confidence = 0.1;