1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MEDIA_BASE_DECODER_BUFFER_QUEUE_H_ 6 #define MEDIA_BASE_DECODER_BUFFER_QUEUE_H_ 7 8 #include <deque> 9 10 #include "base/memory/ref_counted.h" 11 #include "base/time/time.h" 12 #include "media/base/media_export.h" 13 14 namespace media { 15 16 class DecoderBuffer; 17 18 // Maintains a queue of DecoderBuffers in increasing timestamp order. 19 // 20 // Individual buffer durations are ignored when calculating the duration of the 21 // queue i.e., the queue must have at least 2 in-order buffers to calculate 22 // duration. 23 // 24 // Not thread safe: access must be externally synchronized. 25 class MEDIA_EXPORT DecoderBufferQueue { 26 public: 27 DecoderBufferQueue(); 28 ~DecoderBufferQueue(); 29 30 // Push |buffer| to the end of the queue. If |buffer| is queued out of order 31 // it will be excluded from duration calculations. 32 // 33 // It is invalid to push an end-of-stream |buffer|. 34 void Push(const scoped_refptr<DecoderBuffer>& buffer); 35 36 // Pops a DecoderBuffer from the front of the queue. 37 // 38 // It is invalid to call Pop() on an empty queue. 39 scoped_refptr<DecoderBuffer> Pop(); 40 41 // Removes all queued buffers. 42 void Clear(); 43 44 // Returns true if this queue is empty. 45 bool IsEmpty(); 46 47 // Returns the duration of encoded data stored in this queue as measured by 48 // the timestamps of the earliest and latest buffers, ignoring out of order 49 // buffers. 50 // 51 // Returns zero if the queue is empty. 52 base::TimeDelta Duration(); 53 54 // Returns the total size of buffers inside the queue. data_size()55 size_t data_size() const { return data_size_; } 56 57 private: 58 typedef std::deque<scoped_refptr<DecoderBuffer> > Queue; 59 Queue queue_; 60 61 // A subset of |queue_| that contains buffers that are in strictly 62 // increasing timestamp order. Used to calculate Duration() while ignoring 63 // out-of-order buffers. 64 Queue in_order_queue_; 65 66 base::TimeDelta earliest_valid_timestamp_; 67 68 // Total size in bytes of buffers in the queue. 69 size_t data_size_; 70 71 DISALLOW_COPY_AND_ASSIGN(DecoderBufferQueue); 72 }; 73 74 } // namespace media 75 76 #endif // MEDIA_BASE_DECODER_BUFFER_QUEUE_H_ 77