| 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 <memory> |
| 7 #include <utility> | 8 #include <utility> |
| 8 | 9 |
| 9 #include "base/logging.h" | 10 #include "base/logging.h" |
| 10 #include "media/base/data_buffer.h" | 11 #include "media/base/data_buffer.h" |
| 11 #include "media/formats/webm/webm_constants.h" | 12 #include "media/formats/webm/webm_constants.h" |
| 12 | 13 |
| 13 namespace media { | 14 namespace media { |
| 14 | 15 |
| 15 static const uint8_t kClusterHeader[] = { | 16 static const uint8_t kClusterHeader[] = { |
| 16 0x1F, 0x43, 0xB6, 0x75, // CLUSTER ID | 17 0x1F, 0x43, 0xB6, 0x75, // CLUSTER ID |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 kSimpleBlockSizeOffset = 1, | 50 kSimpleBlockSizeOffset = 1, |
| 50 | 51 |
| 51 kBlockGroupSizeOffset = 1, | 52 kBlockGroupSizeOffset = 1, |
| 52 kBlockGroupWithoutBlockDurationBlockSizeOffset = 10, | 53 kBlockGroupWithoutBlockDurationBlockSizeOffset = 10, |
| 53 kBlockGroupDurationOffset = 11, | 54 kBlockGroupDurationOffset = 11, |
| 54 kBlockGroupBlockSizeOffset = 20, | 55 kBlockGroupBlockSizeOffset = 20, |
| 55 | 56 |
| 56 kInitialBufferSize = 32768, | 57 kInitialBufferSize = 32768, |
| 57 }; | 58 }; |
| 58 | 59 |
| 59 Cluster::Cluster(scoped_ptr<uint8_t[]> data, int size) | 60 Cluster::Cluster(std::unique_ptr<uint8_t[]> data, int size) |
| 60 : data_(std::move(data)), size_(size) {} | 61 : data_(std::move(data)), size_(size) {} |
| 61 Cluster::~Cluster() {} | 62 Cluster::~Cluster() {} |
| 62 | 63 |
| 63 ClusterBuilder::ClusterBuilder() { Reset(); } | 64 ClusterBuilder::ClusterBuilder() { Reset(); } |
| 64 ClusterBuilder::~ClusterBuilder() {} | 65 ClusterBuilder::~ClusterBuilder() {} |
| 65 | 66 |
| 66 void ClusterBuilder::SetClusterTimecode(int64_t cluster_timecode) { | 67 void ClusterBuilder::SetClusterTimecode(int64_t cluster_timecode) { |
| 67 DCHECK_EQ(cluster_timecode_, -1); | 68 DCHECK_EQ(cluster_timecode_, -1); |
| 68 | 69 |
| 69 cluster_timecode_ = cluster_timecode; | 70 cluster_timecode_ = cluster_timecode; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 DCHECK_GE(timecode_delta, -32768); | 180 DCHECK_GE(timecode_delta, -32768); |
| 180 DCHECK_LE(timecode_delta, 32767); | 181 DCHECK_LE(timecode_delta, 32767); |
| 181 | 182 |
| 182 buf[0] = 0x80 | (track_num & 0x7F); | 183 buf[0] = 0x80 | (track_num & 0x7F); |
| 183 buf[1] = (timecode_delta >> 8) & 0xff; | 184 buf[1] = (timecode_delta >> 8) & 0xff; |
| 184 buf[2] = timecode_delta & 0xff; | 185 buf[2] = timecode_delta & 0xff; |
| 185 buf[3] = flags & 0xff; | 186 buf[3] = flags & 0xff; |
| 186 memcpy(buf + 4, data, size); | 187 memcpy(buf + 4, data, size); |
| 187 } | 188 } |
| 188 | 189 |
| 189 scoped_ptr<Cluster> ClusterBuilder::Finish() { | 190 std::unique_ptr<Cluster> ClusterBuilder::Finish() { |
| 190 DCHECK_NE(cluster_timecode_, -1); | 191 DCHECK_NE(cluster_timecode_, -1); |
| 191 | 192 |
| 192 UpdateUInt64(kClusterSizeOffset, bytes_used_ - (kClusterSizeOffset + 8)); | 193 UpdateUInt64(kClusterSizeOffset, bytes_used_ - (kClusterSizeOffset + 8)); |
| 193 | 194 |
| 194 scoped_ptr<Cluster> ret(new Cluster(std::move(buffer_), bytes_used_)); | 195 std::unique_ptr<Cluster> ret(new Cluster(std::move(buffer_), bytes_used_)); |
| 195 Reset(); | 196 Reset(); |
| 196 return ret; | 197 return ret; |
| 197 } | 198 } |
| 198 | 199 |
| 199 scoped_ptr<Cluster> ClusterBuilder::FinishWithUnknownSize() { | 200 std::unique_ptr<Cluster> ClusterBuilder::FinishWithUnknownSize() { |
| 200 DCHECK_NE(cluster_timecode_, -1); | 201 DCHECK_NE(cluster_timecode_, -1); |
| 201 | 202 |
| 202 UpdateUInt64(kClusterSizeOffset, kWebMUnknownSize); | 203 UpdateUInt64(kClusterSizeOffset, kWebMUnknownSize); |
| 203 | 204 |
| 204 scoped_ptr<Cluster> ret(new Cluster(std::move(buffer_), bytes_used_)); | 205 std::unique_ptr<Cluster> ret(new Cluster(std::move(buffer_), bytes_used_)); |
| 205 Reset(); | 206 Reset(); |
| 206 return ret; | 207 return ret; |
| 207 } | 208 } |
| 208 | 209 |
| 209 void ClusterBuilder::Reset() { | 210 void ClusterBuilder::Reset() { |
| 210 buffer_size_ = kInitialBufferSize; | 211 buffer_size_ = kInitialBufferSize; |
| 211 buffer_.reset(new uint8_t[buffer_size_]); | 212 buffer_.reset(new uint8_t[buffer_size_]); |
| 212 memcpy(buffer_.get(), kClusterHeader, sizeof(kClusterHeader)); | 213 memcpy(buffer_.get(), kClusterHeader, sizeof(kClusterHeader)); |
| 213 bytes_used_ = sizeof(kClusterHeader); | 214 bytes_used_ = sizeof(kClusterHeader); |
| 214 cluster_timecode_ = -1; | 215 cluster_timecode_ = -1; |
| 215 } | 216 } |
| 216 | 217 |
| 217 void ClusterBuilder::ExtendBuffer(int bytes_needed) { | 218 void ClusterBuilder::ExtendBuffer(int bytes_needed) { |
| 218 int new_buffer_size = 2 * buffer_size_; | 219 int new_buffer_size = 2 * buffer_size_; |
| 219 | 220 |
| 220 while ((new_buffer_size - bytes_used_) < bytes_needed) | 221 while ((new_buffer_size - bytes_used_) < bytes_needed) |
| 221 new_buffer_size *= 2; | 222 new_buffer_size *= 2; |
| 222 | 223 |
| 223 scoped_ptr<uint8_t[]> new_buffer(new uint8_t[new_buffer_size]); | 224 std::unique_ptr<uint8_t[]> new_buffer(new uint8_t[new_buffer_size]); |
| 224 | 225 |
| 225 memcpy(new_buffer.get(), buffer_.get(), bytes_used_); | 226 memcpy(new_buffer.get(), buffer_.get(), bytes_used_); |
| 226 buffer_.reset(new_buffer.release()); | 227 buffer_.reset(new_buffer.release()); |
| 227 buffer_size_ = new_buffer_size; | 228 buffer_size_ = new_buffer_size; |
| 228 } | 229 } |
| 229 | 230 |
| 230 void ClusterBuilder::UpdateUInt64(int offset, int64_t value) { | 231 void ClusterBuilder::UpdateUInt64(int offset, int64_t value) { |
| 231 DCHECK_LE(offset + 7, buffer_size_); | 232 DCHECK_LE(offset + 7, buffer_size_); |
| 232 uint8_t* buf = buffer_.get() + offset; | 233 uint8_t* buf = buffer_.get() + offset; |
| 233 | 234 |
| 234 // Fill the last 7 bytes of size field in big-endian order. | 235 // Fill the last 7 bytes of size field in big-endian order. |
| 235 for (int i = 7; i > 0; i--) { | 236 for (int i = 7; i > 0; i--) { |
| 236 buf[i] = value & 0xff; | 237 buf[i] = value & 0xff; |
| 237 value >>= 8; | 238 value >>= 8; |
| 238 } | 239 } |
| 239 } | 240 } |
| 240 | 241 |
| 241 } // namespace media | 242 } // namespace media |
| OLD | NEW |