Chromium Code Reviews| 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) { |