Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1102)

Unified Diff: media/formats/webm/webm_stream_parser.cc

Issue 328653002: Fix WebMStreamParser to continue parsing after a cluster end (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/formats/webm/webm_stream_parser.cc
diff --git a/media/formats/webm/webm_stream_parser.cc b/media/formats/webm/webm_stream_parser.cc
index a90a623a2bdf9aa729206e66cc53574d6453b95e..782fbea1182e97e2d30f7367882179fb91bc0972 100644
--- a/media/formats/webm/webm_stream_parser.cc
+++ b/media/formats/webm/webm_stream_parser.cc
@@ -244,21 +244,21 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) {
int id;
int64 element_size;
- int result = WebMParseElementHeader(data, size, &id, &element_size);
+ int bytes_parsed = WebMParseElementHeader(data, size, &id, &element_size);
- if (result <= 0)
- return result;
+ if (bytes_parsed <= 0)
+ return bytes_parsed;
// TODO(matthewjheaney): implement support for chapters
if (id == kWebMIdCues || id == kWebMIdChapters) {
// TODO(wolenetz): Handle unknown-sized cluster parse completion correctly.
// See http://crbug.com/335676.
- if (size < (result + element_size)) {
+ if (size < (bytes_parsed + element_size)) {
// We don't have the whole element yet. Signal we need more data.
return 0;
}
// Skip the element.
- return result + element_size;
+ return bytes_parsed + element_size;
}
if (id == kWebMIdEBMLHeader) {
@@ -268,35 +268,47 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) {
return 0;
}
- int bytes_parsed = cluster_parser_->Parse(data, size);
+ int result = 0;
+ bool cluster_ended;
+ do {
+ bytes_parsed = cluster_parser_->Parse(data, size);
+
+ if (bytes_parsed < 0)
+ return bytes_parsed;
+
+ // If cluster detected, immediately notify new segment if we have not
+ // already done this.
+ if (id == kWebMIdCluster && !parsing_cluster_) {
+ parsing_cluster_ = true;
+ new_segment_cb_.Run();
+ }
- if (bytes_parsed <= 0)
- return bytes_parsed;
+ const BufferQueue& audio_buffers = cluster_parser_->GetAudioBuffers();
+ const BufferQueue& video_buffers = cluster_parser_->GetVideoBuffers();
+ const TextBufferQueueMap& text_map = cluster_parser_->GetTextBuffers();
- // If cluster detected, immediately notify new segment if we have not already
- // done this.
- if (id == kWebMIdCluster && !parsing_cluster_) {
- parsing_cluster_ = true;
- new_segment_cb_.Run();
- }
+ cluster_ended = cluster_parser_->cluster_ended();
- const BufferQueue& audio_buffers = cluster_parser_->GetAudioBuffers();
- const BufferQueue& video_buffers = cluster_parser_->GetVideoBuffers();
- const TextBufferQueueMap& text_map = cluster_parser_->GetTextBuffers();
+ if ((!audio_buffers.empty() || !video_buffers.empty() ||
+ !text_map.empty()) &&
+ !new_buffers_cb_.Run(audio_buffers, video_buffers, text_map)) {
+ return -1;
+ }
- bool cluster_ended = cluster_parser_->cluster_ended();
+ if (cluster_ended) {
+ parsing_cluster_ = false;
+ end_of_segment_cb_.Run();
+ }
- if ((!audio_buffers.empty() || !video_buffers.empty() || !text_map.empty()) &&
- !new_buffers_cb_.Run(audio_buffers, video_buffers, text_map)) {
- return -1;
- }
+ result += bytes_parsed;
+ data += bytes_parsed;
+ size -= bytes_parsed;
- if (cluster_ended) {
- parsing_cluster_ = false;
- end_of_segment_cb_.Run();
- }
+ // WebMClusterParser returns 0 if |data| starts with a beginning of a new
+ // cluster. Try parsing again in that case.
+ } while (bytes_parsed > 0 || cluster_ended);
wolenetz 2014/06/12 21:32:48 This looks wrong. Yes, in the case of a new append
Sergey Ulanov 2014/06/13 00:26:08 Done.
- return bytes_parsed;
+ return result;
}
void WebMStreamParser::FireNeedKey(const std::string& key_id) {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698