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#include "media/mp4/offset_byte_queue.h"
6
7#include "base/basictypes.h"
8#include "base/logging.h"
9
10namespace media {
11
12OffsetByteQueue::OffsetByteQueue() : buf_(NULL), size_(0), head_(0) {}
13OffsetByteQueue::~OffsetByteQueue() {}
14
15void OffsetByteQueue::Reset() {
16  queue_.Reset();
17  buf_ = NULL;
18  size_ = 0;
19  head_ = 0;
20}
21
22void OffsetByteQueue::Push(const uint8* buf, int size) {
23  queue_.Push(buf, size);
24  Sync();
25  DVLOG(4) << "Buffer pushed. head=" << head() << " tail=" << tail();
26}
27
28void OffsetByteQueue::Peek(const uint8** buf, int* size) {
29  *buf = size_ > 0 ? buf_ : NULL;
30  *size = size_;
31}
32
33void OffsetByteQueue::Pop(int count) {
34  queue_.Pop(count);
35  head_ += count;
36  Sync();
37}
38
39void OffsetByteQueue::PeekAt(int64 offset, const uint8** buf, int* size) {
40  DCHECK(offset >= head());
41  if (offset < head() || offset >= tail()) {
42    *buf = NULL;
43    *size = 0;
44    return;
45  }
46  *buf = &buf_[offset - head()];
47  *size = tail() - offset;
48}
49
50bool OffsetByteQueue::Trim(int64 max_offset) {
51  if (max_offset < head_) return true;
52  if (max_offset > tail()) {
53    Pop(size_);
54    return false;
55  }
56  Pop(max_offset - head_);
57  return true;
58}
59
60void OffsetByteQueue::Sync() {
61  queue_.Peek(&buf_, &size_);
62}
63
64}  // namespace media
65