Index: media/base/decoder_buffer_queue.cc |
diff --git a/media/base/decoder_buffer_queue.cc b/media/base/decoder_buffer_queue.cc |
index d0486cbf93965932bcbf7108f24cd947f79c499c..26ba9f4e69ba7b5071599dbf1c9019f22d366df9 100644 |
--- a/media/base/decoder_buffer_queue.cc |
+++ b/media/base/decoder_buffer_queue.cc |
@@ -5,13 +5,15 @@ |
#include "media/base/decoder_buffer_queue.h" |
#include "base/logging.h" |
+#include "base/numerics/safe_conversions.h" |
#include "media/base/buffers.h" |
#include "media/base/decoder_buffer.h" |
namespace media { |
DecoderBufferQueue::DecoderBufferQueue() |
- : earliest_valid_timestamp_(kNoTimestamp()) { |
+ : earliest_valid_timestamp_(kNoTimestamp()), |
+ data_size_(0) { |
} |
DecoderBufferQueue::~DecoderBufferQueue() {} |
@@ -21,6 +23,10 @@ void DecoderBufferQueue::Push(const scoped_refptr<DecoderBuffer>& buffer) { |
queue_.push_back(buffer); |
+ // TODO(damienv): Remove the cast here and in every place in this file |
+ // when DecoderBuffer::data_size is modified to return a size_t. |
+ data_size_ += base::checked_cast<size_t, int>(buffer->data_size()); |
+ |
// 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()) { |
@@ -49,6 +55,11 @@ scoped_refptr<DecoderBuffer> DecoderBufferQueue::Pop() { |
scoped_refptr<DecoderBuffer> buffer = queue_.front(); |
queue_.pop_front(); |
+ size_t buffer_data_size = |
+ base::checked_cast<size_t, int>(buffer->data_size()); |
+ DCHECK_LE(buffer_data_size, data_size_); |
+ data_size_ -= buffer_data_size; |
+ |
if (!in_order_queue_.empty() && |
in_order_queue_.front().get() == buffer.get()) { |
in_order_queue_.pop_front(); |
@@ -59,6 +70,7 @@ scoped_refptr<DecoderBuffer> DecoderBufferQueue::Pop() { |
void DecoderBufferQueue::Clear() { |
queue_.clear(); |
+ data_size_ = 0; |
in_order_queue_.clear(); |
earliest_valid_timestamp_ = kNoTimestamp(); |
} |