summaryrefslogtreecommitdiffstats
path: root/media/webm
diff options
context:
space:
mode:
authorvrk@chromium.org <vrk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-10 04:41:21 +0000
committervrk@chromium.org <vrk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-10 04:41:21 +0000
commitfaf4c029ac7bc1e53681edbee8c4fbdd81f81d59 (patch)
tree4af8e3586b04fe9ba8387a019aa6b37d11ae3815 /media/webm
parentef75c230a88acecbf9ae76829c6eb795a9815d74 (diff)
downloadchromium_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.cc82
-rw-r--r--media/webm/webm_cluster_parser.h12
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.