summaryrefslogtreecommitdiffstats
path: root/media/webm/webm_parser.cc
diff options
context:
space:
mode:
authoracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-30 21:04:13 +0000
committeracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-30 21:04:13 +0000
commit898271fc1f5d8da5ac517b45540f03e1e2be8043 (patch)
tree0209e48667ecd914443f7d181a0299f9b2fa36dc /media/webm/webm_parser.cc
parent12c561d3a704e6ca0a8b20e3821c94d2de14af91 (diff)
downloadchromium_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.cc85
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