Home | History | Annotate | Download | only in base
      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.
     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