OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/formats/webm/cluster_builder.h" | 5 #include "media/formats/webm/cluster_builder.h" |
6 | 6 |
| 7 #include <utility> |
| 8 |
7 #include "base/logging.h" | 9 #include "base/logging.h" |
8 #include "media/base/data_buffer.h" | 10 #include "media/base/data_buffer.h" |
9 #include "media/formats/webm/webm_constants.h" | 11 #include "media/formats/webm/webm_constants.h" |
10 | 12 |
11 namespace media { | 13 namespace media { |
12 | 14 |
13 static const uint8_t kClusterHeader[] = { | 15 static const uint8_t kClusterHeader[] = { |
14 0x1F, 0x43, 0xB6, 0x75, // CLUSTER ID | 16 0x1F, 0x43, 0xB6, 0x75, // CLUSTER ID |
15 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // cluster(size = 0) | 17 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // cluster(size = 0) |
16 0xE7, // Timecode ID | 18 0xE7, // Timecode ID |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 | 50 |
49 kBlockGroupSizeOffset = 1, | 51 kBlockGroupSizeOffset = 1, |
50 kBlockGroupWithoutBlockDurationBlockSizeOffset = 10, | 52 kBlockGroupWithoutBlockDurationBlockSizeOffset = 10, |
51 kBlockGroupDurationOffset = 11, | 53 kBlockGroupDurationOffset = 11, |
52 kBlockGroupBlockSizeOffset = 20, | 54 kBlockGroupBlockSizeOffset = 20, |
53 | 55 |
54 kInitialBufferSize = 32768, | 56 kInitialBufferSize = 32768, |
55 }; | 57 }; |
56 | 58 |
57 Cluster::Cluster(scoped_ptr<uint8_t[]> data, int size) | 59 Cluster::Cluster(scoped_ptr<uint8_t[]> data, int size) |
58 : data_(data.Pass()), size_(size) {} | 60 : data_(std::move(data)), size_(size) {} |
59 Cluster::~Cluster() {} | 61 Cluster::~Cluster() {} |
60 | 62 |
61 ClusterBuilder::ClusterBuilder() { Reset(); } | 63 ClusterBuilder::ClusterBuilder() { Reset(); } |
62 ClusterBuilder::~ClusterBuilder() {} | 64 ClusterBuilder::~ClusterBuilder() {} |
63 | 65 |
64 void ClusterBuilder::SetClusterTimecode(int64_t cluster_timecode) { | 66 void ClusterBuilder::SetClusterTimecode(int64_t cluster_timecode) { |
65 DCHECK_EQ(cluster_timecode_, -1); | 67 DCHECK_EQ(cluster_timecode_, -1); |
66 | 68 |
67 cluster_timecode_ = cluster_timecode; | 69 cluster_timecode_ = cluster_timecode; |
68 | 70 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 buf[2] = timecode_delta & 0xff; | 184 buf[2] = timecode_delta & 0xff; |
183 buf[3] = flags & 0xff; | 185 buf[3] = flags & 0xff; |
184 memcpy(buf + 4, data, size); | 186 memcpy(buf + 4, data, size); |
185 } | 187 } |
186 | 188 |
187 scoped_ptr<Cluster> ClusterBuilder::Finish() { | 189 scoped_ptr<Cluster> ClusterBuilder::Finish() { |
188 DCHECK_NE(cluster_timecode_, -1); | 190 DCHECK_NE(cluster_timecode_, -1); |
189 | 191 |
190 UpdateUInt64(kClusterSizeOffset, bytes_used_ - (kClusterSizeOffset + 8)); | 192 UpdateUInt64(kClusterSizeOffset, bytes_used_ - (kClusterSizeOffset + 8)); |
191 | 193 |
192 scoped_ptr<Cluster> ret(new Cluster(buffer_.Pass(), bytes_used_)); | 194 scoped_ptr<Cluster> ret(new Cluster(std::move(buffer_), bytes_used_)); |
193 Reset(); | 195 Reset(); |
194 return ret.Pass(); | 196 return ret; |
195 } | 197 } |
196 | 198 |
197 scoped_ptr<Cluster> ClusterBuilder::FinishWithUnknownSize() { | 199 scoped_ptr<Cluster> ClusterBuilder::FinishWithUnknownSize() { |
198 DCHECK_NE(cluster_timecode_, -1); | 200 DCHECK_NE(cluster_timecode_, -1); |
199 | 201 |
200 UpdateUInt64(kClusterSizeOffset, kWebMUnknownSize); | 202 UpdateUInt64(kClusterSizeOffset, kWebMUnknownSize); |
201 | 203 |
202 scoped_ptr<Cluster> ret(new Cluster(buffer_.Pass(), bytes_used_)); | 204 scoped_ptr<Cluster> ret(new Cluster(std::move(buffer_), bytes_used_)); |
203 Reset(); | 205 Reset(); |
204 return ret.Pass(); | 206 return ret; |
205 } | 207 } |
206 | 208 |
207 void ClusterBuilder::Reset() { | 209 void ClusterBuilder::Reset() { |
208 buffer_size_ = kInitialBufferSize; | 210 buffer_size_ = kInitialBufferSize; |
209 buffer_.reset(new uint8_t[buffer_size_]); | 211 buffer_.reset(new uint8_t[buffer_size_]); |
210 memcpy(buffer_.get(), kClusterHeader, sizeof(kClusterHeader)); | 212 memcpy(buffer_.get(), kClusterHeader, sizeof(kClusterHeader)); |
211 bytes_used_ = sizeof(kClusterHeader); | 213 bytes_used_ = sizeof(kClusterHeader); |
212 cluster_timecode_ = -1; | 214 cluster_timecode_ = -1; |
213 } | 215 } |
214 | 216 |
(...skipping 15 matching lines...) Expand all Loading... |
230 uint8_t* buf = buffer_.get() + offset; | 232 uint8_t* buf = buffer_.get() + offset; |
231 | 233 |
232 // Fill the last 7 bytes of size field in big-endian order. | 234 // Fill the last 7 bytes of size field in big-endian order. |
233 for (int i = 7; i > 0; i--) { | 235 for (int i = 7; i > 0; i--) { |
234 buf[i] = value & 0xff; | 236 buf[i] = value & 0xff; |
235 value >>= 8; | 237 value >>= 8; |
236 } | 238 } |
237 } | 239 } |
238 | 240 |
239 } // namespace media | 241 } // namespace media |
OLD | NEW |