From 0a9de96eb23761b8ac7891b425d168d6542d383c Mon Sep 17 00:00:00 2001 From: Kongqun Yang Date: Fri, 10 Jun 2016 11:36:46 -0700 Subject: [PATCH] Update mp4 container check function to be more robust Consider the file in iso-bmff format if seeing two known mp4 boxes. Closes Issue #110 Change-Id: Ifdc76b6c8b7e26a0988ab4f8d4968e1320cb180c --- packager/media/base/container_names.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packager/media/base/container_names.cc b/packager/media/base/container_names.cc index 1e57c8a69e..4a4cdbbb4e 100644 --- a/packager/media/base/container_names.cc +++ b/packager/media/base/container_names.cc @@ -956,6 +956,7 @@ static bool CheckMov(const uint8_t* buffer, int buffer_size) { RCHECK(buffer_size > 8); int offset = 0; + int boxes_seen = 0; while (offset + 8 < buffer_size) { int atomsize = Read32(buffer + offset); uint32_t atomtype = Read32(buffer + offset + 4); @@ -977,9 +978,16 @@ static bool CheckMov(const uint8_t* buffer, int buffer_size) { case TAG('s','s','i','x'): case TAG('p','r','f','t'): case TAG('u','u','i','d'): + // Assumes that it is an iso-bmff file after seeing two known boxes. + // Note that it is correct only for our use cases as we support only + // a limited number of containers, and there is no other container + // has this behavior. + if (++boxes_seen >= 2) + return true; break; default: - return false; + // Ignore unrecognized box. + break; } if (atomsize == 1) { // Indicates that the length is the next 64bits. @@ -993,7 +1001,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 false; } enum MPEGVersion {