Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(671)

Unified Diff: media/filters/chunk_demuxer.cc

Issue 8775035: Add support for incremental cluster parsing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: _ Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698