diff options
author | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-30 21:04:13 +0000 |
---|---|---|
committer | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-30 21:04:13 +0000 |
commit | 898271fc1f5d8da5ac517b45540f03e1e2be8043 (patch) | |
tree | 0209e48667ecd914443f7d181a0299f9b2fa36dc /media/webm/webm_parser.cc | |
parent | 12c561d3a704e6ca0a8b20e3821c94d2de14af91 (diff) | |
download | chromium_src-898271fc1f5d8da5ac517b45540f03e1e2be8043.zip chromium_src-898271fc1f5d8da5ac517b45540f03e1e2be8043.tar.gz chromium_src-898271fc1f5d8da5ac517b45540f03e1e2be8043.tar.bz2 |
Improve ChunkDemuxer so AppendData() calls no longer have to be done on element boundries.
BUG=86536
TEST=ChunkDemuxerTest::TestAppendingInPieces
Review URL: http://codereview.chromium.org/7981024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@103543 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/webm/webm_parser.cc')
-rw-r--r-- | media/webm/webm_parser.cc | 85 |
1 files changed, 50 insertions, 35 deletions
diff --git a/media/webm/webm_parser.cc b/media/webm/webm_parser.cc index 083ebff..43dd509 100644 --- a/media/webm/webm_parser.cc +++ b/media/webm/webm_parser.cc @@ -144,9 +144,12 @@ static int ParseWebMElementHeaderField(const uint8* buf, int size, DCHECK(buf); DCHECK(num); - if (size <= 0) + if (size < 0) return -1; + if (size == 0) + return 0; + int mask = 0x80; uint8 ch = buf[0]; int extra_bytes = -1; @@ -159,9 +162,13 @@ static int ParseWebMElementHeaderField(const uint8* buf, int size, mask >>= 1; } - if ((extra_bytes == -1) || ((1 + extra_bytes) > size)) + if (extra_bytes == -1) return -1; + // Return 0 if we need more data. + if ((1 + extra_bytes) > size) + return 0; + int bytes_used = 1; for (int i = 0; i < extra_bytes; ++i) @@ -281,20 +288,20 @@ static int ParseElementList(const uint8* buf, int size, if (!client->OnListStart(id)) return -1; - int res = ParseElements(list_info->id_info_, - list_info->id_info_size_, - buf, size, - level + 1, - client); + int result = ParseElements(list_info->id_info_, + list_info->id_info_size_, + buf, size, + level + 1, + client); - if (res < 0) - return -1; + if (result <= 0) + return result; if (!client->OnListEnd(id)) return -1; - DCHECK_EQ(res, size); - return res; + DCHECK_EQ(result, size); + return result; } static int ParseUInt(const uint8* buf, int size, int id, @@ -370,21 +377,18 @@ static int ParseElements(const ElementIdInfo* id_info, while (cur_size > 0) { int id = 0; int64 element_size = 0; - int res = ParseWebMElementHeader(cur, cur_size, &id, &element_size); - - if (res < 0) - return res; + int result = ParseWebMElementHeader(cur, cur_size, &id, &element_size); - if (res == 0) - break; + if (result <= 0) + return result; - cur += res; - cur_size -= res; - used += res; + cur += result; + cur_size -= result; + used += result; // Check to see if the element is larger than the remaining data. if (element_size > cur_size) - return -1; + return 0; const ElementIdInfo* info = FindIdInfo(id, id_info, id_info_size); @@ -452,34 +456,45 @@ static int ParseElements(const ElementIdInfo* id_info, // buffer points to an element that does not match |id|. int WebMParseListElement(const uint8* buf, int size, int id, int level, WebMParserClient* client) { - if (size == 0) + if (size < 0) return -1; + if (size == 0) + return 0; + const uint8* cur = buf; int cur_size = size; - + int bytes_parsed = 0; int element_id = 0; int64 element_size = 0; - int res = ParseWebMElementHeader(cur, cur_size, &element_id, &element_size); + int result = ParseWebMElementHeader(cur, cur_size, &element_id, + &element_size); - if (res <= 0) - return res; + if (result <= 0) + return result; - cur += res; - cur_size -= res; + cur += result; + cur_size -= result; + bytes_parsed += result; - if (element_id != id || element_size > cur_size) + if (element_id != id) return -1; - res = ParseElementList(cur, element_size, element_id, level, client); + if (element_size > cur_size) + return 0; - if (res < 0) - return -1; + if (element_size > 0) { + result = ParseElementList(cur, element_size, element_id, level, client); - cur += res; - cur_size -= res; + if (result <= 0) + return result; + + cur += result; + cur_size -= result; + bytes_parsed += result; + } - return size - cur_size; + return bytes_parsed; } } // namespace media |