12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef MEDIA_BASE_DECODER_BUFFER_QUEUE_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MEDIA_BASE_DECODER_BUFFER_QUEUE_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <deque>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/media_export.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DecoderBuffer;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Maintains a queue of DecoderBuffers in increasing timestamp order.
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Individual buffer durations are ignored when calculating the duration of the
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// queue i.e., the queue must have at least 2 in-order buffers to calculate
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// duration.
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Not thread safe: access must be externally synchronized.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MEDIA_EXPORT DecoderBufferQueue {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DecoderBufferQueue();
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~DecoderBufferQueue();
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Push |buffer| to the end of the queue. If |buffer| is queued out of order
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it will be excluded from duration calculations.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // It is invalid to push an end-of-stream |buffer|.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Push(const scoped_refptr<DecoderBuffer>& buffer);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pops a DecoderBuffer from the front of the queue.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // It is invalid to call Pop() on an empty queue.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DecoderBuffer> Pop();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Removes all queued buffers.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Clear();
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if this queue is empty.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsEmpty();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the duration of encoded data stored in this queue as measured by
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the timestamps of the earliest and latest buffers, ignoring out of order
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // buffers.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns zero if the queue is empty.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta Duration();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns the total size of buffers inside the queue.
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t data_size() const { return data_size_; }
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::deque<scoped_refptr<DecoderBuffer> > Queue;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Queue queue_;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A subset of |queue_| that contains buffers that are in strictly
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // increasing timestamp order. Used to calculate Duration() while ignoring
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // out-of-order buffers.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Queue in_order_queue_;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta earliest_valid_timestamp_;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Total size in bytes of buffers in the queue.
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t data_size_;
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DecoderBufferQueue);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace media
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // MEDIA_BASE_DECODER_BUFFER_QUEUE_H_
77