1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/bytebuffer.h"
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <assert.h>
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <string.h>
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <algorithm>
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/basictypes.h"
19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/byteorder.h"
20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc {
22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const int DEFAULT_SIZE = 4096;
24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ByteBuffer() {
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Construct(NULL, DEFAULT_SIZE, ORDER_NETWORK);
27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ByteBuffer(ByteOrder byte_order) {
30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Construct(NULL, DEFAULT_SIZE, byte_order);
31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ByteBuffer(const char* bytes, size_t len) {
34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Construct(bytes, len, ORDER_NETWORK);
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ByteBuffer(const char* bytes, size_t len, ByteOrder byte_order) {
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Construct(bytes, len, byte_order);
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ByteBuffer(const char* bytes) {
42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Construct(bytes, strlen(bytes), ORDER_NETWORK);
43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
459478437fdea4eb31b92ffe0c10368fe5bc9b9e16Karl WibergByteBuffer::ByteBuffer(const Buffer& buf) {
469478437fdea4eb31b92ffe0c10368fe5bc9b9e16Karl Wiberg  Construct(buf.data<char>(), buf.size(), ORDER_NETWORK);
479478437fdea4eb31b92ffe0c10368fe5bc9b9e16Karl Wiberg}
489478437fdea4eb31b92ffe0c10368fe5bc9b9e16Karl Wiberg
49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid ByteBuffer::Construct(const char* bytes, size_t len,
50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                           ByteOrder byte_order) {
51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  version_ = 0;
52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  start_ = 0;
53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  size_ = len;
54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  byte_order_ = byte_order;
55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bytes_ = new char[size_];
56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (bytes) {
58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    end_ = len;
59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    memcpy(bytes_, bytes, end_);
60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    end_ = 0;
62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::~ByteBuffer() {
66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  delete[] bytes_;
67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
690c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool ByteBuffer::ReadUInt8(uint8_t* val) {
70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!val) return false;
71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return ReadBytes(reinterpret_cast<char*>(val), 1);
73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
750c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool ByteBuffer::ReadUInt16(uint16_t* val) {
76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!val) return false;
77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
780c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint16_t v;
79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!ReadBytes(reinterpret_cast<char*>(&v), 2)) {
80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost16(v) : v;
83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return true;
84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
870c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool ByteBuffer::ReadUInt24(uint32_t* val) {
88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!val) return false;
89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
900c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint32_t v = 0;
91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  char* read_into = reinterpret_cast<char*>(&v);
92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (byte_order_ == ORDER_NETWORK || IsHostBigEndian()) {
93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ++read_into;
94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!ReadBytes(read_into, 3)) {
97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost32(v) : v;
100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return true;
101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1040c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool ByteBuffer::ReadUInt32(uint32_t* val) {
105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!val) return false;
106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1070c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint32_t v;
108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!ReadBytes(reinterpret_cast<char*>(&v), 4)) {
109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost32(v) : v;
112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return true;
113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1160c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool ByteBuffer::ReadUInt64(uint64_t* val) {
117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!val) return false;
118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1190c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint64_t v;
120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!ReadBytes(reinterpret_cast<char*>(&v), 8)) {
121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost64(v) : v;
124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return true;
125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool ByteBuffer::ReadString(std::string* val, size_t len) {
129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!val) return false;
130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (len > Length()) {
132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    val->append(bytes_ + start_, len);
135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    start_ += len;
136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return true;
137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool ByteBuffer::ReadBytes(char* val, size_t len) {
141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (len > Length()) {
142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    memcpy(val, bytes_ + start_, len);
145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    start_ += len;
146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return true;
147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1500c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid ByteBuffer::WriteUInt8(uint8_t val) {
151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  WriteBytes(reinterpret_cast<const char*>(&val), 1);
152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1540c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid ByteBuffer::WriteUInt16(uint16_t val) {
1550c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint16_t v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork16(val) : val;
156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  WriteBytes(reinterpret_cast<const char*>(&v), 2);
157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1590c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid ByteBuffer::WriteUInt24(uint32_t val) {
1600c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint32_t v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork32(val) : val;
161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  char* start = reinterpret_cast<char*>(&v);
162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (byte_order_ == ORDER_NETWORK || IsHostBigEndian()) {
163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ++start;
164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  WriteBytes(start, 3);
166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1680c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid ByteBuffer::WriteUInt32(uint32_t val) {
1690c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint32_t v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork32(val) : val;
170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  WriteBytes(reinterpret_cast<const char*>(&v), 4);
171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
1730c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid ByteBuffer::WriteUInt64(uint64_t val) {
1740c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint64_t v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork64(val) : val;
175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  WriteBytes(reinterpret_cast<const char*>(&v), 8);
176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid ByteBuffer::WriteString(const std::string& val) {
179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  WriteBytes(val.c_str(), val.size());
180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid ByteBuffer::WriteBytes(const char* val, size_t len) {
183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  memcpy(ReserveWriteBuffer(len), val, len);
184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgchar* ByteBuffer::ReserveWriteBuffer(size_t len) {
187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (Length() + len > Capacity())
188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Resize(Length() + len);
189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  char* start = bytes_ + end_;
191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  end_ += len;
192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return start;
193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid ByteBuffer::Resize(size_t size) {
196ff689be3c0c59c1be29aaa0697aa0f762566d6c6andresp@webrtc.org  size_t len = std::min(end_ - start_, size);
197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (size <= size_) {
198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // Don't reallocate, just move data backwards
199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    memmove(bytes_, bytes_ + start_, len);
200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // Reallocate a larger buffer.
202ff689be3c0c59c1be29aaa0697aa0f762566d6c6andresp@webrtc.org    size_ = std::max(size, 3 * size_ / 2);
203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    char* new_bytes = new char[size_];
204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    memcpy(new_bytes, bytes_ + start_, len);
205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    delete [] bytes_;
206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    bytes_ = new_bytes;
207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  start_ = 0;
209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  end_ = len;
210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ++version_;
211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool ByteBuffer::Consume(size_t size) {
214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (size > Length())
215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  start_ += size;
217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return true;
218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ReadPosition ByteBuffer::GetReadPosition() const {
221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return ReadPosition(start_, version_);
222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool ByteBuffer::SetReadPosition(const ReadPosition &position) {
225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (position.version_ != version_) {
226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return false;
227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  start_ = position.start_;
229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return true;
230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid ByteBuffer::Clear() {
233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  memset(bytes_, 0, size_);
234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  start_ = end_ = 0;
235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ++version_;
236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}  // namespace rtc
239