summaryrefslogtreecommitdiffstats
path: root/media/webm/webm_cluster_parser.cc
diff options
context:
space:
mode:
authoracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-18 05:19:40 +0000
committeracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-18 05:19:40 +0000
commit0e1d89e963f250df7c7c18b651986f7715a8e509 (patch)
tree284adc4d75827f2e449d7cde116e5970ebe0955d /media/webm/webm_cluster_parser.cc
parent925dec1cf8e2574f24d09cb39fe2f1ad8346d28b (diff)
downloadchromium_src-0e1d89e963f250df7c7c18b651986f7715a8e509.zip
chromium_src-0e1d89e963f250df7c7c18b651986f7715a8e509.tar.gz
chromium_src-0e1d89e963f250df7c7c18b651986f7715a8e509.tar.bz2
Update WebMClusterParser to compute durations for all StreamParserBuffers.
BUG=127916 TEST=WebMClusterParserTest.* Review URL: https://chromiumcodereview.appspot.com/10382200 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@137826 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/webm/webm_cluster_parser.cc')
-rw-r--r--media/webm/webm_cluster_parser.cc97
1 files changed, 67 insertions, 30 deletions
diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc
index ed1e94e..8271899 100644
--- a/media/webm/webm_cluster_parser.cc
+++ b/media/webm/webm_cluster_parser.cc
@@ -19,16 +19,14 @@ WebMClusterParser::WebMClusterParser(int64 timecode_scale,
const uint8* video_encryption_key_id,
int video_encryption_key_id_size)
: timecode_multiplier_(timecode_scale / 1000.0),
- audio_track_num_(audio_track_num),
- audio_default_duration_(audio_default_duration),
- video_track_num_(video_track_num),
- video_default_duration_(video_default_duration),
video_encryption_key_id_size_(video_encryption_key_id_size),
parser_(kWebMIdCluster, this),
last_block_timecode_(-1),
block_data_size_(-1),
block_duration_(-1),
- cluster_timecode_(-1) {
+ cluster_timecode_(-1),
+ audio_(audio_track_num, audio_default_duration),
+ video_(video_track_num, video_default_duration) {
CHECK_GE(video_encryption_key_id_size, 0);
if (video_encryption_key_id_size > 0) {
video_encryption_key_id_.reset(new uint8[video_encryption_key_id_size]);
@@ -40,16 +38,16 @@ WebMClusterParser::WebMClusterParser(int64 timecode_scale,
WebMClusterParser::~WebMClusterParser() {}
void WebMClusterParser::Reset() {
- audio_buffers_.clear();
- video_buffers_.clear();
last_block_timecode_ = -1;
cluster_timecode_ = -1;
parser_.Reset();
+ audio_.Reset();
+ video_.Reset();
}
int WebMClusterParser::Parse(const uint8* buf, int size) {
- audio_buffers_.clear();
- video_buffers_.clear();
+ audio_.ClearBufferQueue();
+ video_.ClearBufferQueue();
int result = parser_.Parse(buf, size);
@@ -166,6 +164,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,
@@ -196,42 +195,80 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode,
scoped_refptr<StreamParserBuffer> buffer =
StreamParserBuffer::CopyFrom(data, size, is_keyframe);
- if (track_num == video_track_num_ && video_encryption_key_id_.get()) {
+ if (track_num == video_.track_num() && video_encryption_key_id_.get()) {
buffer->SetDecryptConfig(scoped_ptr<DecryptConfig>(new DecryptConfig(
video_encryption_key_id_.get(), video_encryption_key_id_size_)));
}
buffer->SetTimestamp(timestamp);
- BufferQueue* queue = NULL;
- base::TimeDelta duration = kNoTimestamp();
-
- if (track_num == audio_track_num_) {
- duration = audio_default_duration_;
- queue = &audio_buffers_;
- } else if (track_num == video_track_num_) {
- duration = video_default_duration_;
- queue = &video_buffers_;
- } else {
- DVLOG(1) << "Unexpected track number " << track_num;
- return false;
- }
if (block_duration >= 0) {
- duration = base::TimeDelta::FromMicroseconds(
- block_duration * timecode_multiplier_);
+ buffer->SetDuration(base::TimeDelta::FromMicroseconds(
+ block_duration * timecode_multiplier_));
}
- buffer->SetDuration(duration);
+ if (track_num == audio_.track_num()) {
+ return audio_.AddBuffer(buffer);
+ } else if (track_num == video_.track_num()) {
+ return video_.AddBuffer(buffer);
+ }
+
+ DVLOG(1) << "Unexpected track number " << track_num;
+ return false;
+}
+
+WebMClusterParser::Track::Track(int track_num,
+ base::TimeDelta default_duration)
+ : track_num_(track_num),
+ default_duration_(default_duration) {
+}
+
+WebMClusterParser::Track::~Track() {}
- if (!queue->empty() &&
- buffer->GetTimestamp() == queue->back()->GetTimestamp()) {
+bool WebMClusterParser::Track::AddBuffer(
+ const scoped_refptr<StreamParserBuffer>& buffer) {
+ if (!buffers_.empty() &&
+ buffer->GetTimestamp() == buffers_.back()->GetTimestamp()) {
DVLOG(1) << "Got a block timecode that is not strictly monotonically "
- << "increasing for track " << track_num;
+ << "increasing for track " << track_num_;
return false;
}
- queue->push_back(buffer);
+ if (buffer->GetDuration() == kNoTimestamp())
+ buffer->SetDuration(default_duration_);
+
+ 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())
+ return false;
+
+ delayed_buffer_->SetDuration(new_duration);
+ buffers_.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;
+ }
+
+ buffers_.push_back(buffer);
return true;
}
+void WebMClusterParser::Track::Reset() {
+ buffers_.clear();
+ delayed_buffer_ = NULL;
+}
+
+void WebMClusterParser::Track::ClearBufferQueue() {
+ buffers_.clear();
+}
+
} // namespace media