Re-subimission of https://codereview.chromium.org/1041213003/
[chromium-blink-merge.git] / media / base / decoder_buffer_queue.h
blob9c2c2dc7b19d14fed06f2f20c052fd14cd828e9f
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.
5 #ifndef MEDIA_BASE_DECODER_BUFFER_QUEUE_H_
6 #define MEDIA_BASE_DECODER_BUFFER_QUEUE_H_
8 #include <deque>
10 #include "base/memory/ref_counted.h"
11 #include "base/time/time.h"
12 #include "media/base/media_export.h"
14 namespace media {
16 class DecoderBuffer;
18 // Maintains a queue of DecoderBuffers in increasing timestamp order.
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.
24 // Not thread safe: access must be externally synchronized.
25 class MEDIA_EXPORT DecoderBufferQueue {
26 public:
27 DecoderBufferQueue();
28 ~DecoderBufferQueue();
30 // Push |buffer| to the end of the queue. If |buffer| is queued out of order
31 // it will be excluded from duration calculations.
33 // It is invalid to push an end-of-stream |buffer|.
34 void Push(const scoped_refptr<DecoderBuffer>& buffer);
36 // Pops a DecoderBuffer from the front of the queue.
38 // It is invalid to call Pop() on an empty queue.
39 scoped_refptr<DecoderBuffer> Pop();
41 // Removes all queued buffers.
42 void Clear();
44 // Returns true if this queue is empty.
45 bool IsEmpty();
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.
51 // Returns zero if the queue is empty.
52 base::TimeDelta Duration();
54 // Returns the total size of buffers inside the queue.
55 size_t data_size() const { return data_size_; }
57 private:
58 typedef std::deque<scoped_refptr<DecoderBuffer> > Queue;
59 Queue queue_;
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_;
66 base::TimeDelta earliest_valid_timestamp_;
68 // Total size in bytes of buffers in the queue.
69 size_t data_size_;
71 DISALLOW_COPY_AND_ASSIGN(DecoderBufferQueue);
74 } // namespace media
76 #endif // MEDIA_BASE_DECODER_BUFFER_QUEUE_H_