• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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