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 "base/logging.h" | 7 #include "base/logging.h" |
8 #include "media/base/data_buffer.h" | 8 #include "media/base/data_buffer.h" |
| 9 #include "media/formats/webm/webm_constants.h" |
9 | 10 |
10 namespace media { | 11 namespace media { |
11 | 12 |
12 static const uint8 kClusterHeader[] = { | 13 static const uint8 kClusterHeader[] = { |
13 0x1F, 0x43, 0xB6, 0x75, // CLUSTER ID | 14 0x1F, 0x43, 0xB6, 0x75, // CLUSTER ID |
14 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // cluster(size = 0) | 15 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // cluster(size = 0) |
15 0xE7, // Timecode ID | 16 0xE7, // Timecode ID |
16 0x88, // timecode(size=8) | 17 0x88, // timecode(size=8) |
17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // timecode value | 18 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // timecode value |
18 }; | 19 }; |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 scoped_ptr<Cluster> ClusterBuilder::Finish() { | 174 scoped_ptr<Cluster> ClusterBuilder::Finish() { |
174 DCHECK_NE(cluster_timecode_, -1); | 175 DCHECK_NE(cluster_timecode_, -1); |
175 | 176 |
176 UpdateUInt64(kClusterSizeOffset, bytes_used_ - (kClusterSizeOffset + 8)); | 177 UpdateUInt64(kClusterSizeOffset, bytes_used_ - (kClusterSizeOffset + 8)); |
177 | 178 |
178 scoped_ptr<Cluster> ret(new Cluster(buffer_.Pass(), bytes_used_)); | 179 scoped_ptr<Cluster> ret(new Cluster(buffer_.Pass(), bytes_used_)); |
179 Reset(); | 180 Reset(); |
180 return ret.Pass(); | 181 return ret.Pass(); |
181 } | 182 } |
182 | 183 |
| 184 scoped_ptr<Cluster> ClusterBuilder::FinishWithUnknownSize() { |
| 185 DCHECK_NE(cluster_timecode_, -1); |
| 186 |
| 187 UpdateUInt64(kClusterSizeOffset, kWebMUnknownSize); |
| 188 |
| 189 scoped_ptr<Cluster> ret(new Cluster(buffer_.Pass(), bytes_used_)); |
| 190 Reset(); |
| 191 return ret.Pass(); |
| 192 } |
| 193 |
183 void ClusterBuilder::Reset() { | 194 void ClusterBuilder::Reset() { |
184 buffer_size_ = kInitialBufferSize; | 195 buffer_size_ = kInitialBufferSize; |
185 buffer_.reset(new uint8[buffer_size_]); | 196 buffer_.reset(new uint8[buffer_size_]); |
186 memcpy(buffer_.get(), kClusterHeader, sizeof(kClusterHeader)); | 197 memcpy(buffer_.get(), kClusterHeader, sizeof(kClusterHeader)); |
187 bytes_used_ = sizeof(kClusterHeader); | 198 bytes_used_ = sizeof(kClusterHeader); |
188 cluster_timecode_ = -1; | 199 cluster_timecode_ = -1; |
189 } | 200 } |
190 | 201 |
191 void ClusterBuilder::ExtendBuffer(int bytes_needed) { | 202 void ClusterBuilder::ExtendBuffer(int bytes_needed) { |
192 int new_buffer_size = 2 * buffer_size_; | 203 int new_buffer_size = 2 * buffer_size_; |
(...skipping 13 matching lines...) Expand all Loading... |
206 uint8* buf = buffer_.get() + offset; | 217 uint8* buf = buffer_.get() + offset; |
207 | 218 |
208 // Fill the last 7 bytes of size field in big-endian order. | 219 // Fill the last 7 bytes of size field in big-endian order. |
209 for (int i = 7; i > 0; i--) { | 220 for (int i = 7; i > 0; i--) { |
210 buf[i] = value & 0xff; | 221 buf[i] = value & 0xff; |
211 value >>= 8; | 222 value >>= 8; |
212 } | 223 } |
213 } | 224 } |
214 | 225 |
215 } // namespace media | 226 } // namespace media |
OLD | NEW |