diff options
author | vrk@chromium.org <vrk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-10 04:41:21 +0000 |
---|---|---|
committer | vrk@chromium.org <vrk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-10 04:41:21 +0000 |
commit | faf4c029ac7bc1e53681edbee8c4fbdd81f81d59 (patch) | |
tree | 4af8e3586b04fe9ba8387a019aa6b37d11ae3815 /media/webm | |
parent | ef75c230a88acecbf9ae76829c6eb795a9815d74 (diff) | |
download | chromium_src-faf4c029ac7bc1e53681edbee8c4fbdd81f81d59.zip chromium_src-faf4c029ac7bc1e53681edbee8c4fbdd81f81d59.tar.gz chromium_src-faf4c029ac7bc1e53681edbee8c4fbdd81f81d59.tar.bz2 |
Remove buffer duration calculation from WebMClusterParser and update SourceBufferStream accordingly
This removes the work to calculate buffers' durations in WebMClusterParser and
modifies SourceBufferStream to no longer need duration information to work. This
allows us to fix several bugs.
BUG=131695,136418
TEST=media_unittests, go/oiedsb no longer needs Abort()s to work
Review URL: https://chromiumcodereview.appspot.com/10692053
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@145839 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/webm')
-rw-r--r-- | media/webm/webm_cluster_parser.cc | 82 | ||||
-rw-r--r-- | media/webm/webm_cluster_parser.h | 12 |
2 files changed, 8 insertions, 86 deletions
diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc index be5e724..c5a2fdc 100644 --- a/media/webm/webm_cluster_parser.cc +++ b/media/webm/webm_cluster_parser.cc @@ -46,8 +46,8 @@ void WebMClusterParser::Reset() { } int WebMClusterParser::Parse(const uint8* buf, int size) { - audio_.ClearBufferQueue(); - video_.ClearBufferQueue(); + audio_.Reset(); + video_.Reset(); int result = parser_.Parse(buf, size); @@ -231,84 +231,18 @@ WebMClusterParser::Track::~Track() {} 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_; - return false; - } - - 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(); - - if (new_duration < base::TimeDelta()) { - DVLOG(1) << "Detected out of order timestamps."; - return false; - } - - SetDelayedBufferDurations(new_duration); - } - - // Place the buffer in delayed buffer slot if we don't know - // its duration. - if (buffer->GetDuration() == kNoTimestamp()) { - delayed_buffers_.push_back(buffer); - return true; - } - - AddToBufferQueue(buffer); - return true; -} - -void WebMClusterParser::Track::Reset() { - buffers_.clear(); - 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_ + DVLOG(2) << "AddBuffer() : " << track_num_ << " ts " << buffer->GetTimestamp().InSecondsF() << " dur " << buffer->GetDuration().InSecondsF() << " kf " << buffer->IsKeyframe() << " size " << buffer->GetDataSize(); buffers_.push_back(buffer); + return true; +} + +void WebMClusterParser::Track::Reset() { + buffers_.clear(); } } // namespace media diff --git a/media/webm/webm_cluster_parser.h b/media/webm/webm_cluster_parser.h index ea76d30..0af0361 100644 --- a/media/webm/webm_cluster_parser.h +++ b/media/webm/webm_cluster_parser.h @@ -55,21 +55,9 @@ class MEDIA_EXPORT WebMClusterParser : public WebMParserClient { // Clears all buffer state. void Reset(); - // Clears only the |buffers_|. - 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_; - BufferQueue delayed_buffers_; }; // WebMParserClient methods. |