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

Unified Diff: media/webm/webm_cluster_parser.cc

Issue 10382200: Update WebMClusterParser to compute durations for all StreamParserBuffers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix ChunkDemuxerAbortRead_AudioOnly Created 8 years, 7 months 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/webm/webm_cluster_parser.cc
diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc
index ed1e94eafdbf403004a19d327c47314fff88c23c..59b3a9d2e8a12d699b8ef0279537ac932c8a431f 100644
--- a/media/webm/webm_cluster_parser.cc
+++ b/media/webm/webm_cluster_parser.cc
@@ -41,7 +41,9 @@ WebMClusterParser::~WebMClusterParser() {}
void WebMClusterParser::Reset() {
audio_buffers_.clear();
+ delayed_audio_buffer_ = NULL;
video_buffers_.clear();
+ delayed_video_buffer_ = NULL;
last_block_timecode_ = -1;
cluster_timecode_ = -1;
parser_.Reset();
@@ -166,6 +168,7 @@ bool WebMClusterParser::OnBinary(int id, const uint8* data, int size) {
block_data_size_ = size;
return true;
}
+
bool WebMClusterParser::OnBlock(int track_num, int timecode,
int block_duration,
int flags,
@@ -203,14 +206,17 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode,
buffer->SetTimestamp(timestamp);
BufferQueue* queue = NULL;
+ scoped_refptr<StreamParserBuffer>* delayed_buffer;
scherkus (not reviewing) 2012/05/17 02:45:46 I'm finding this pointer-to-a-scoped_refptr<T> to
acolwell GONE FROM CHROMIUM 2012/05/17 18:28:51 Excellent idea! I moved this all into a helper cla
base::TimeDelta duration = kNoTimestamp();
if (track_num == audio_track_num_) {
duration = audio_default_duration_;
queue = &audio_buffers_;
+ delayed_buffer = &delayed_audio_buffer_;
} else if (track_num == video_track_num_) {
duration = video_default_duration_;
queue = &video_buffers_;
+ delayed_buffer = &delayed_video_buffer_;
} else {
DVLOG(1) << "Unexpected track number " << track_num;
return false;
@@ -230,6 +236,27 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode,
return false;
}
+ if (*delayed_buffer) {
+ // Update the duration of the delayed buffer and place it into the queue.
+ base::TimeDelta new_duration =
+ buffer->GetTimestamp() - (*delayed_buffer)->GetTimestamp();
+
+ if (new_duration <= base::TimeDelta())
scherkus (not reviewing) 2012/05/17 02:45:46 when would this happen? out of order timestamps?
acolwell GONE FROM CHROMIUM 2012/05/17 18:28:51 Yes. It can happen if a muxer creates a cluster wi
+ return false;
+
+ (*delayed_buffer)->SetDuration(new_duration);
+ queue->push_back(*delayed_buffer);
+
+ *delayed_buffer = NULL;
+ }
+
+ // Place the buffer in delayed buffer slot if we don't know
+ // its duration.
+ if (buffer->GetDuration() == kNoTimestamp()) {
+ *delayed_buffer = buffer;
+ return true;
+ }
+
queue->push_back(buffer);
return true;
}

Powered by Google App Engine
This is Rietveld 408576698