diff options
author | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-06 23:33:06 +0000 |
---|---|---|
committer | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-06 23:33:06 +0000 |
commit | 11650c4d45daec8cce3002eb3ffad6a1dc7a95f1 (patch) | |
tree | 6c1a85a86da16b167f69ebcc238077356dca1e66 /media/webm | |
parent | 553981ab338db3c606b13016f3fb236cf7d0924f (diff) | |
download | chromium_src-11650c4d45daec8cce3002eb3ffad6a1dc7a95f1.zip chromium_src-11650c4d45daec8cce3002eb3ffad6a1dc7a95f1.tar.gz chromium_src-11650c4d45daec8cce3002eb3ffad6a1dc7a95f1.tar.bz2 |
Add support for files that use AltRef frames.
BUG=131265
TEST=ChunkDemuxerTest.TestWebMFile_AltRefFrames
Review URL: https://chromiumcodereview.appspot.com/10542009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@140883 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/webm')
-rw-r--r-- | media/webm/webm_cluster_parser.cc | 59 | ||||
-rw-r--r-- | media/webm/webm_cluster_parser.h | 10 |
2 files changed, 58 insertions, 11 deletions
diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc index 6cbd71d..5b18c56 100644 --- a/media/webm/webm_cluster_parser.cc +++ b/media/webm/webm_cluster_parser.cc @@ -230,38 +230,77 @@ bool WebMClusterParser::Track::AddBuffer( return false; } - if (delayed_buffer_) { + if (!delayed_buffers_.empty()) { // Update the duration of the delayed buffer and place it into the queue. + scoped_refptr<StreamParserBuffer> delayed_buffer = delayed_buffers_.front(); + + // If we get another buffer with the same timestamp, put it in the delay + // queue. + if (buffer->GetTimestamp() == delayed_buffer->GetTimestamp()) { + delayed_buffers_.push_back(buffer); + + // If this buffer happens to have a duration, use it to set the + // duration on all the other buffers in the queue. + if (buffer->GetDuration() != kNoTimestamp()) + SetDelayedBufferDurations(buffer->GetDuration()); + + return true; + } + base::TimeDelta new_duration = - buffer->GetTimestamp() - delayed_buffer_->GetTimestamp(); + buffer->GetTimestamp() - delayed_buffer->GetTimestamp(); - if (new_duration <= base::TimeDelta()) + if (new_duration < base::TimeDelta()) { + DVLOG(1) << "Detected out of order timestamps."; return false; + } - delayed_buffer_->SetDuration(new_duration); - buffers_.push_back(delayed_buffer_); - - delayed_buffer_ = NULL; + SetDelayedBufferDurations(new_duration); } // Place the buffer in delayed buffer slot if we don't know // its duration. if (buffer->GetDuration() == kNoTimestamp()) { - delayed_buffer_ = buffer; + delayed_buffers_.push_back(buffer); return true; } - buffers_.push_back(buffer); + AddToBufferQueue(buffer); return true; } void WebMClusterParser::Track::Reset() { buffers_.clear(); - delayed_buffer_ = NULL; + delayed_buffers_.clear(); } void WebMClusterParser::Track::ClearBufferQueue() { buffers_.clear(); } +void WebMClusterParser::Track::SetDelayedBufferDurations( + base::TimeDelta duration) { + + for (BufferQueue::iterator itr = delayed_buffers_.begin(); + itr < delayed_buffers_.end(); ++itr) { + (*itr)->SetDuration(duration); + + AddToBufferQueue(*itr); + } + delayed_buffers_.clear(); +} + +void WebMClusterParser::Track::AddToBufferQueue( + const scoped_refptr<StreamParserBuffer>& buffer) { + DCHECK(buffer->GetDuration() > base::TimeDelta()); + + DVLOG(2) << "AddToBufferQueue() : " << track_num_ + << " ts " << buffer->GetTimestamp().InSecondsF() + << " dur " << buffer->GetDuration().InSecondsF() + << " kf " << buffer->IsKeyframe() + << " size " << buffer->GetDataSize(); + + buffers_.push_back(buffer); +} + } // namespace media diff --git a/media/webm/webm_cluster_parser.h b/media/webm/webm_cluster_parser.h index 159fd38..c702d10 100644 --- a/media/webm/webm_cluster_parser.h +++ b/media/webm/webm_cluster_parser.h @@ -58,9 +58,17 @@ class MEDIA_EXPORT WebMClusterParser : public WebMParserClient { void ClearBufferQueue(); private: + // Sets the duration of all the buffers in |delayed_buffers_| + // and then moves these buffers into |buffers_|. |delayed_buffers_| + // is empty when this call returns. + void SetDelayedBufferDurations(base::TimeDelta duration); + + // Adds the buffer to |buffers_|. |buffer| must have its duration set. + void AddToBufferQueue(const scoped_refptr<StreamParserBuffer>& buffer); + int track_num_; BufferQueue buffers_; - scoped_refptr<StreamParserBuffer> delayed_buffer_; + BufferQueue delayed_buffers_; }; // WebMParserClient methods. |