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. |