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 3f370daa8000f24f7ed266537a3d5cb2cbfbbc89..ecc64017107c398582c40b03a2e7d3d09a6b7154 100644 |
| --- a/media/formats/webm/webm_stream_parser.cc |
| +++ b/media/formats/webm/webm_stream_parser.cc |
| @@ -20,8 +20,7 @@ namespace media { |
| WebMStreamParser::WebMStreamParser() |
| : state_(kWaitingForInit), |
| - unknown_segment_size_(false), |
| - parsing_cluster_(false) { |
| + unknown_segment_size_(false) { |
| } |
| WebMStreamParser::~WebMStreamParser() { |
| @@ -59,12 +58,11 @@ void WebMStreamParser::Flush() { |
| DCHECK_NE(state_, kWaitingForInit); |
| byte_queue_.Reset(); |
| - parsing_cluster_ = false; |
| - |
| - if (state_ != kParsingClusters) |
| - return; |
| - |
| cluster_parser_->Reset(); |
|
wolenetz
2014/06/18 22:47:53
cluster_parser_ may still be null prior to complet
Sergey Ulanov
2014/06/18 23:26:50
Done.
|
| + if (state_ == kParsingClusters) { |
| + ChangeState(kParsingHeaders); |
| + end_of_segment_cb_.Run(); |
| + } |
| } |
| bool WebMStreamParser::Parse(const uint8* buf, int size) { |
| @@ -151,6 +149,15 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) { |
| // Skip the element. |
| return result + element_size; |
| break; |
| + case kWebMIdCluster: |
| + if (!cluster_parser_) { |
| + MEDIA_LOG(log_cb_) << "Found Cluster element before Info."; |
| + return -1; |
| + } |
| + ChangeState(kParsingClusters); |
| + new_segment_cb_.Run(); |
| + return 0; |
| + break; |
| case kWebMIdSegment: |
| // Segment of unknown size indicates live stream. |
| if (element_size == kWebMUnknownSize) |
| @@ -231,8 +238,6 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) { |
| tracks_parser.video_encryption_key_id(), |
| log_cb_)); |
| - ChangeState(kParsingClusters); |
| - |
| if (!init_cb_.is_null()) |
| base::ResetAndReturn(&init_cb_).Run(true, params); |
| @@ -243,70 +248,28 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) { |
| if (!cluster_parser_) |
| return -1; |
| - int result = 0; |
| - int bytes_parsed; |
| - bool cluster_ended; |
| - do { |
| - cluster_ended = false; |
| - |
| - // If we are not parsing a cluster then handle the case when the next |
| - // element is not a cluster. |
| - if (!parsing_cluster_) { |
| - int id; |
| - int64 element_size; |
| - bytes_parsed = WebMParseElementHeader(data, size, &id, &element_size); |
| - |
| - if (bytes_parsed < 0) |
| - return bytes_parsed; |
| - |
| - if (bytes_parsed == 0) |
| - return result; |
| - |
| - if (id != kWebMIdCluster) { |
| - ChangeState(kParsingHeaders); |
| - return result; |
| - } |
| - } |
| - |
| - bytes_parsed = cluster_parser_->Parse(data, size); |
| - |
| - if (bytes_parsed < 0) |
| - return bytes_parsed; |
| + int 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 (!parsing_cluster_ && bytes_parsed > 0) { |
| - parsing_cluster_ = true; |
| - new_segment_cb_.Run(); |
| - } |
| - |
| - const BufferQueue& audio_buffers = cluster_parser_->GetAudioBuffers(); |
| - const BufferQueue& video_buffers = cluster_parser_->GetVideoBuffers(); |
| - const TextBufferQueueMap& text_map = cluster_parser_->GetTextBuffers(); |
| - |
| - cluster_ended = cluster_parser_->cluster_ended(); |
| - |
| - if ((!audio_buffers.empty() || !video_buffers.empty() || |
| - !text_map.empty()) && |
| - !new_buffers_cb_.Run(audio_buffers, video_buffers, text_map)) { |
| - return -1; |
| - } |
| + const BufferQueue& audio_buffers = cluster_parser_->GetAudioBuffers(); |
| + const BufferQueue& video_buffers = cluster_parser_->GetVideoBuffers(); |
| + const TextBufferQueueMap& text_map = cluster_parser_->GetTextBuffers(); |
| - if (cluster_ended) { |
| - parsing_cluster_ = false; |
| - end_of_segment_cb_.Run(); |
| - } |
| + bool cluster_ended = cluster_parser_->cluster_ended(); |
| - result += bytes_parsed; |
| - data += bytes_parsed; |
| - size -= bytes_parsed; |
| + if ((!audio_buffers.empty() || !video_buffers.empty() || |
| + !text_map.empty()) && |
| + !new_buffers_cb_.Run(audio_buffers, video_buffers, text_map)) { |
| + return -1; |
| + } |
| - // WebMClusterParser returns 0 and |cluster_ended| is true if previously |
| - // parsing an unknown-size cluster and |data| does not continue that |
| - // cluster. Try parsing again in that case. |
| - } while (size > 0 && (bytes_parsed > 0 || cluster_ended)); |
| + if (cluster_ended) { |
| + ChangeState(kParsingHeaders); |
| + end_of_segment_cb_.Run(); |
| + } |
| - return result; |
| + return bytes_parsed; |
| } |
| void WebMStreamParser::FireNeedKey(const std::string& key_id) { |