summaryrefslogtreecommitdiff
path: root/chromium/media/base/decoder_buffer_queue.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/base/decoder_buffer_queue.cc')
-rw-r--r--chromium/media/base/decoder_buffer_queue.cc79
1 files changed, 79 insertions, 0 deletions
diff --git a/chromium/media/base/decoder_buffer_queue.cc b/chromium/media/base/decoder_buffer_queue.cc
new file mode 100644
index 00000000000..d0486cbf939
--- /dev/null
+++ b/chromium/media/base/decoder_buffer_queue.cc
@@ -0,0 +1,79 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/base/decoder_buffer_queue.h"
+
+#include "base/logging.h"
+#include "media/base/buffers.h"
+#include "media/base/decoder_buffer.h"
+
+namespace media {
+
+DecoderBufferQueue::DecoderBufferQueue()
+ : earliest_valid_timestamp_(kNoTimestamp()) {
+}
+
+DecoderBufferQueue::~DecoderBufferQueue() {}
+
+void DecoderBufferQueue::Push(const scoped_refptr<DecoderBuffer>& buffer) {
+ CHECK(!buffer->end_of_stream());
+
+ queue_.push_back(buffer);
+
+ // TODO(scherkus): FFmpeg returns some packets with no timestamp after
+ // seeking. Fix and turn this into CHECK(). See http://crbug.com/162192
+ if (buffer->timestamp() == kNoTimestamp()) {
+ DVLOG(1) << "Buffer has no timestamp";
+ return;
+ }
+
+ if (earliest_valid_timestamp_ == kNoTimestamp()) {
+ earliest_valid_timestamp_ = buffer->timestamp();
+ }
+
+ if (buffer->timestamp() < earliest_valid_timestamp_) {
+ DVLOG(1)
+ << "Out of order timestamps: "
+ << buffer->timestamp().InMicroseconds()
+ << " vs. "
+ << earliest_valid_timestamp_.InMicroseconds();
+ return;
+ }
+
+ earliest_valid_timestamp_ = buffer->timestamp();
+ in_order_queue_.push_back(buffer);
+}
+
+scoped_refptr<DecoderBuffer> DecoderBufferQueue::Pop() {
+ scoped_refptr<DecoderBuffer> buffer = queue_.front();
+ queue_.pop_front();
+
+ if (!in_order_queue_.empty() &&
+ in_order_queue_.front().get() == buffer.get()) {
+ in_order_queue_.pop_front();
+ }
+
+ return buffer;
+}
+
+void DecoderBufferQueue::Clear() {
+ queue_.clear();
+ in_order_queue_.clear();
+ earliest_valid_timestamp_ = kNoTimestamp();
+}
+
+bool DecoderBufferQueue::IsEmpty() {
+ return queue_.empty();
+}
+
+base::TimeDelta DecoderBufferQueue::Duration() {
+ if (in_order_queue_.size() < 2)
+ return base::TimeDelta();
+
+ base::TimeDelta start = in_order_queue_.front()->timestamp();
+ base::TimeDelta end = in_order_queue_.back()->timestamp();
+ return end - start;
+}
+
+} // namespace media