Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: media/formats/webm/cluster_builder.cc

Issue 238273002: Adds WebMClusterParserTest coverage for duration default/estimation/fallback logic (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cast to int to compare enum values in COMPILE_ASSERTs Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/formats/webm/cluster_builder.h ('k') | media/formats/webm/webm_cluster_parser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 9
10 namespace media { 10 namespace media {
(...skipping 14 matching lines...) Expand all
25 static const uint8 kBlockGroupHeader[] = { 25 static const uint8 kBlockGroupHeader[] = {
26 0xA0, // BlockGroup ID 26 0xA0, // BlockGroup ID
27 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // BlockGroup(size = 0) 27 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // BlockGroup(size = 0)
28 0x9B, // BlockDuration ID 28 0x9B, // BlockDuration ID
29 0x88, // BlockDuration(size = 8) 29 0x88, // BlockDuration(size = 8)
30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // duration 30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // duration
31 0xA1, // Block ID 31 0xA1, // Block ID
32 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block(size = 0) 32 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block(size = 0)
33 }; 33 };
34 34
35 static const uint8 kBlockGroupHeaderWithoutBlockDuration[] = {
36 0xA0, // BlockGroup ID
37 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // BlockGroup(size = 0)
38 0xA1, // Block ID
39 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block(size = 0)
40 };
41
35 enum { 42 enum {
36 kClusterSizeOffset = 4, 43 kClusterSizeOffset = 4,
37 kClusterTimecodeOffset = 14, 44 kClusterTimecodeOffset = 14,
38 45
39 kSimpleBlockSizeOffset = 1, 46 kSimpleBlockSizeOffset = 1,
40 47
41 kBlockGroupSizeOffset = 1, 48 kBlockGroupSizeOffset = 1,
49 kBlockGroupWithoutBlockDurationBlockSizeOffset = 10,
42 kBlockGroupDurationOffset = 11, 50 kBlockGroupDurationOffset = 11,
43 kBlockGroupBlockSizeOffset = 20, 51 kBlockGroupBlockSizeOffset = 20,
44 52
45 kInitialBufferSize = 32768, 53 kInitialBufferSize = 32768,
46 }; 54 };
47 55
48 Cluster::Cluster(scoped_ptr<uint8[]> data, int size) 56 Cluster::Cluster(scoped_ptr<uint8[]> data, int size)
49 : data_(data.Pass()), size_(size) {} 57 : data_(data.Pass()), size_(size) {}
50 Cluster::~Cluster() {} 58 Cluster::~Cluster() {}
51 59
(...skipping 26 matching lines...) Expand all
78 UpdateUInt64(block_offset + kSimpleBlockSizeOffset, block_size); 86 UpdateUInt64(block_offset + kSimpleBlockSizeOffset, block_size);
79 buf += sizeof(kSimpleBlockHeader); 87 buf += sizeof(kSimpleBlockHeader);
80 88
81 WriteBlock(buf, track_num, timecode, flags, data, size); 89 WriteBlock(buf, track_num, timecode, flags, data, size);
82 90
83 bytes_used_ += bytes_needed; 91 bytes_used_ += bytes_needed;
84 } 92 }
85 93
86 void ClusterBuilder::AddBlockGroup(int track_num, int64 timecode, int duration, 94 void ClusterBuilder::AddBlockGroup(int track_num, int64 timecode, int duration,
87 int flags, const uint8* data, int size) { 95 int flags, const uint8* data, int size) {
96 AddBlockGroupInternal(track_num, timecode, true, duration, flags, data, size);
97 }
98
99 void ClusterBuilder::AddBlockGroupWithoutBlockDuration(int track_num,
100 int64 timecode,
101 int flags,
102 const uint8* data,
103 int size) {
104 AddBlockGroupInternal(track_num, timecode, false, 0, flags, data, size);
105 }
106
107
108 void ClusterBuilder::AddBlockGroupInternal(int track_num, int64 timecode,
109 bool include_block_duration,
110 int duration, int flags,
111 const uint8* data, int size) {
88 int block_size = size + 4; 112 int block_size = size + 4;
89 int bytes_needed = sizeof(kBlockGroupHeader) + block_size; 113 int bytes_needed = block_size;
114 if (include_block_duration) {
115 bytes_needed += sizeof(kBlockGroupHeader);
116 } else {
117 bytes_needed += sizeof(kBlockGroupHeaderWithoutBlockDuration);
118 }
119
90 int block_group_size = bytes_needed - 9; 120 int block_group_size = bytes_needed - 9;
91 121
92 if (bytes_needed > (buffer_size_ - bytes_used_)) 122 if (bytes_needed > (buffer_size_ - bytes_used_))
93 ExtendBuffer(bytes_needed); 123 ExtendBuffer(bytes_needed);
94 124
95 uint8* buf = buffer_.get() + bytes_used_; 125 uint8* buf = buffer_.get() + bytes_used_;
96 int block_group_offset = bytes_used_; 126 int block_group_offset = bytes_used_;
97 memcpy(buf, kBlockGroupHeader, sizeof(kBlockGroupHeader)); 127 if (include_block_duration) {
128 memcpy(buf, kBlockGroupHeader, sizeof(kBlockGroupHeader));
129 UpdateUInt64(block_group_offset + kBlockGroupDurationOffset, duration);
130 UpdateUInt64(block_group_offset + kBlockGroupBlockSizeOffset, block_size);
131 buf += sizeof(kBlockGroupHeader);
132 } else {
133 memcpy(buf, kBlockGroupHeaderWithoutBlockDuration,
134 sizeof(kBlockGroupHeaderWithoutBlockDuration));
135 UpdateUInt64(
136 block_group_offset + kBlockGroupWithoutBlockDurationBlockSizeOffset,
137 block_size);
138 buf += sizeof(kBlockGroupHeaderWithoutBlockDuration);
139 }
140
98 UpdateUInt64(block_group_offset + kBlockGroupSizeOffset, block_group_size); 141 UpdateUInt64(block_group_offset + kBlockGroupSizeOffset, block_group_size);
99 UpdateUInt64(block_group_offset + kBlockGroupDurationOffset, duration);
100 UpdateUInt64(block_group_offset + kBlockGroupBlockSizeOffset, block_size);
101 buf += sizeof(kBlockGroupHeader);
102 142
103 // Make sure the 4 most-significant bits are 0. 143 // Make sure the 4 most-significant bits are 0.
104 // http://www.matroska.org/technical/specs/index.html#block_structure 144 // http://www.matroska.org/technical/specs/index.html#block_structure
105 flags &= 0x0f; 145 flags &= 0x0f;
106 146
107 WriteBlock(buf, track_num, timecode, flags, data, size); 147 WriteBlock(buf, track_num, timecode, flags, data, size);
108 148
109 bytes_used_ += bytes_needed; 149 bytes_used_ += bytes_needed;
110 } 150 }
111 151
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 uint8* buf = buffer_.get() + offset; 206 uint8* buf = buffer_.get() + offset;
167 207
168 // Fill the last 7 bytes of size field in big-endian order. 208 // Fill the last 7 bytes of size field in big-endian order.
169 for (int i = 7; i > 0; i--) { 209 for (int i = 7; i > 0; i--) {
170 buf[i] = value & 0xff; 210 buf[i] = value & 0xff;
171 value >>= 8; 211 value >>= 8;
172 } 212 }
173 } 213 }
174 214
175 } // namespace media 215 } // namespace media
OLDNEW
« no previous file with comments | « media/formats/webm/cluster_builder.h ('k') | media/formats/webm/webm_cluster_parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698