15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef MEDIA_FORMATS_COMMON_OFFSET_BYTE_QUEUE_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MEDIA_FORMATS_COMMON_OFFSET_BYTE_QUEUE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/byte_queue.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A wrapper around a ByteQueue which maintains a notion of a
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// monotonically-increasing offset. All buffer access is done by passing these
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// offsets into this class, going some way towards preventing the proliferation
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of many different meanings of "offset", "head", etc.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT OffsetByteQueue {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetByteQueue();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~OffsetByteQueue();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These work like their underlying ByteQueue counterparts.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Push(const uint8* buf, int size);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Peek(const uint8** buf, int* size);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Pop(int count);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets |buf| to point at the first buffered byte corresponding to |offset|,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and |size| to the number of bytes available starting from that offset.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is an error if the offset is before the current head. It's not an error
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if the current offset is beyond tail(), but you will of course get back
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a null |buf| and a |size| of zero.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PeekAt(int64 offset, const uint8** buf, int* size);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Marks the bytes up to (but not including) |max_offset| as ready for
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deletion. This is relatively inexpensive, but will not necessarily reduce
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the resident buffer size right away (or ever).
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the full range of bytes were successfully trimmed,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // including the case where |max_offset| is less than the current head.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if |max_offset| > tail() (although all bytes currently
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // buffered are still cleared).
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Trim(int64 max_offset);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The head and tail positions, in terms of the file's absolute offsets.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tail() is an exclusive bound.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 head() { return head_; }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 tail() { return head_ + size_; }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Synchronize |buf_| and |size_| with |queue_|.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Sync();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ByteQueue queue_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8* buf_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 head_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OffsetByteQueue);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // MEDIA_FORMATS_COMMON_OFFSET_BYTE_QUEUE_H_
67