| 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 |