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