| Index: media/filters/chunk_demuxer.cc
|
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
|
| index d437d9108d6b938fe2b51b27bc10a4ce1c8ff861..a1b6672d88d36e21878909e8155b932a41e762fb 100644
|
| --- a/media/filters/chunk_demuxer.cc
|
| +++ b/media/filters/chunk_demuxer.cc
|
| @@ -130,7 +130,7 @@ void ChunkDemuxerStream::Flush() {
|
| bool ChunkDemuxerStream::CanAddBuffers(const BufferQueue& buffers) const {
|
| base::AutoLock auto_lock(lock_);
|
|
|
| - // If we haven't seen any buffers yet than anything can be added.
|
| + // If we haven't seen any buffers yet, then anything can be added.
|
| if (last_buffer_timestamp_ == kNoTimestamp)
|
| return true;
|
|
|
| @@ -434,7 +434,7 @@ bool ChunkDemuxer::AppendData(const uint8* data, size_t length) {
|
| int cur_size = 0;
|
| int bytes_parsed = 0;
|
| int result = -1;
|
| - bool parsed_a_cluster = false;
|
| + bool can_complete_seek = false;
|
|
|
| byte_queue_.Peek(&cur, &cur_size);
|
|
|
| @@ -449,16 +449,17 @@ bool ChunkDemuxer::AppendData(const uint8* data, size_t length) {
|
| }
|
| break;
|
|
|
| - case INITIALIZED:
|
| - result = ParseCluster_Locked(cur, cur_size);
|
| + case INITIALIZED: {
|
| + bool buffers_added = false;
|
| + result = ParseCluster_Locked(cur, cur_size, &buffers_added);
|
| if (result < 0) {
|
| VLOG(1) << "AppendData(): parsing data failed";
|
| ReportError_Locked(PIPELINE_ERROR_DECODE);
|
| return true;
|
| }
|
|
|
| - parsed_a_cluster = (result > 0);
|
| - break;
|
| + can_complete_seek |= (result > 0 && buffers_added);
|
| + } break;
|
|
|
| case WAITING_FOR_INIT:
|
| case ENDED:
|
| @@ -477,7 +478,7 @@ bool ChunkDemuxer::AppendData(const uint8* data, size_t length) {
|
|
|
| byte_queue_.Pop(bytes_parsed);
|
|
|
| - if (parsed_a_cluster && seek_waits_for_data_) {
|
| + if (can_complete_seek && seek_waits_for_data_) {
|
| seek_waits_for_data_ = false;
|
|
|
| if (!seek_cb_.is_null())
|
| @@ -730,49 +731,36 @@ bool ChunkDemuxer::SetupStreams() {
|
| return !no_supported_streams;
|
| }
|
|
|
| -int ChunkDemuxer::ParseCluster_Locked(const uint8* data, int size) {
|
| +int ChunkDemuxer::ParseCluster_Locked(const uint8* data, int size,
|
| + bool* buffers_added) {
|
| lock_.AssertAcquired();
|
| if (!cluster_parser_.get())
|
| return -1;
|
|
|
| - int id;
|
| - int64 element_size;
|
| - int result = WebMParseElementHeader(data, size, &id, &element_size);
|
| -
|
| - if (result <= 0)
|
| - return result;
|
| -
|
| - if (id == kWebMIdCues) {
|
| - if (size < (result + element_size)) {
|
| - // We don't have the whole element yet. Signal we need more data.
|
| - return 0;
|
| - }
|
| - // Skip the element.
|
| - return result + element_size;
|
| - } else if (id != kWebMIdCluster) {
|
| - VLOG(1) << "Unexpected ID 0x" << std::hex << id;
|
| - return -1;
|
| - }
|
| -
|
| int bytes_parsed = cluster_parser_->Parse(data, size);
|
|
|
| if (bytes_parsed <= 0)
|
| return bytes_parsed;
|
|
|
| - // Make sure we can add the buffers to both streams before we actutally
|
| - // add them. This allows us to accept all of the data or none of it.
|
| - if ((audio_.get() &&
|
| - !audio_->CanAddBuffers(cluster_parser_->audio_buffers())) ||
|
| - (video_.get() &&
|
| - !video_->CanAddBuffers(cluster_parser_->video_buffers()))) {
|
| - return -1;
|
| - }
|
| + if (!cluster_parser_->audio_buffers().empty() ||
|
| + !cluster_parser_->video_buffers().empty()) {
|
| + // Make sure we can add the buffers to both streams before we actually
|
| + // add them. This allows us to accept all of the data or none of it.
|
| + if ((audio_.get() &&
|
| + !audio_->CanAddBuffers(cluster_parser_->audio_buffers())) ||
|
| + (video_.get() &&
|
| + !video_->CanAddBuffers(cluster_parser_->video_buffers()))) {
|
| + return -1;
|
| + }
|
|
|
| - if (audio_.get())
|
| - audio_->AddBuffers(cluster_parser_->audio_buffers());
|
| + if (audio_.get())
|
| + audio_->AddBuffers(cluster_parser_->audio_buffers());
|
|
|
| - if (video_.get())
|
| - video_->AddBuffers(cluster_parser_->video_buffers());
|
| + if (video_.get())
|
| + video_->AddBuffers(cluster_parser_->video_buffers());
|
| +
|
| + *buffers_added = true;
|
| + }
|
|
|
| // TODO(acolwell) : make this more representative of what is actually
|
| // buffered.
|
|
|