Index: media/base/container_names.cc |
diff --git a/media/base/container_names.cc b/media/base/container_names.cc |
index 24d8ea953ffe58789c7493f1f73b2e69d0595402..4eb91d82d58ca79c4b42513529d9d5d77d6d4c22 100644 |
--- a/media/base/container_names.cc |
+++ b/media/base/container_names.cc |
@@ -956,29 +956,35 @@ static bool CheckMov(const uint8_t* buffer, int buffer_size) { |
RCHECK(buffer_size > 8); |
int offset = 0; |
+ int valid_top_level_boxes = 0; |
while (offset + 8 < buffer_size) { |
uint32_t atomsize = Read32(buffer + offset); |
uint32_t atomtype = Read32(buffer + offset + 4); |
- // Only need to check for ones that are valid at the top level. |
+ |
+ // Only need to check for atoms that are valid at the top level. However, |
+ // "Boxes with an unrecognized type shall be ignored and skipped." So |
+ // simply make sure that at least two recognized top level boxes are found. |
+ // This list matches BoxReader::IsValidTopLevelBox(). |
switch (atomtype) { |
- case TAG('f','t','y','p'): |
- case TAG('p','d','i','n'): |
- case TAG('m','o','o','v'): |
- case TAG('m','o','o','f'): |
- case TAG('m','f','r','a'): |
- case TAG('m','d','a','t'): |
- case TAG('f','r','e','e'): |
- case TAG('s','k','i','p'): |
- case TAG('m','e','t','a'): |
- case TAG('m','e','c','o'): |
- case TAG('s','t','y','p'): |
- case TAG('s','i','d','x'): |
- case TAG('s','s','i','x'): |
- case TAG('p','r','f','t'): |
- case TAG('b','l','o','c'): |
+ case TAG('f', 't', 'y', 'p'): |
+ case TAG('p', 'd', 'i', 'n'): |
+ case TAG('b', 'l', 'o', 'c'): |
+ case TAG('m', 'o', 'o', 'v'): |
+ case TAG('m', 'o', 'o', 'f'): |
+ case TAG('m', 'f', 'r', 'a'): |
+ case TAG('m', 'd', 'a', 't'): |
+ case TAG('f', 'r', 'e', 'e'): |
+ case TAG('s', 'k', 'i', 'p'): |
+ case TAG('m', 'e', 't', 'a'): |
+ case TAG('m', 'e', 'c', 'o'): |
+ case TAG('s', 't', 'y', 'p'): |
+ case TAG('s', 'i', 'd', 'x'): |
+ case TAG('s', 's', 'i', 'x'): |
+ case TAG('p', 'r', 'f', 't'): |
+ case TAG('u', 'u', 'i', 'd'): |
+ case TAG('e', 'm', 's', 'g'): |
+ ++valid_top_level_boxes; |
break; |
- default: |
- return false; |
} |
if (atomsize == 1) { |
// Indicates that the length is the next 64bits. |
@@ -992,7 +998,7 @@ static bool CheckMov(const uint8_t* buffer, int buffer_size) { |
break; // Indicates the last atom or length too big. |
offset += atomsize; |
} |
- return true; |
+ return valid_top_level_boxes >= 2; |
} |
enum MPEGVersion { |