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) { |