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

Side by Side Diff: media/formats/mp4/box_definitions.cc

Issue 1998333002: MP4 support for Common Encryption 'cbcs' scheme. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: handle comments Created 4 years, 6 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
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/mp4/box_definitions.h" 5 #include "media/formats/mp4/box_definitions.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_number_conversions.h"
12 #include "media/base/video_types.h" 12 #include "media/base/video_types.h"
13 #include "media/base/video_util.h" 13 #include "media/base/video_util.h"
14 #include "media/formats/mp4/avc.h" 14 #include "media/formats/mp4/avc.h"
15 #include "media/formats/mp4/es_descriptor.h" 15 #include "media/formats/mp4/es_descriptor.h"
16 #include "media/formats/mp4/rcheck.h" 16 #include "media/formats/mp4/rcheck.h"
17 #include "media/media_features.h" 17 #include "media/media_features.h"
18 18
19 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) 19 #if BUILDFLAG(ENABLE_HEVC_DEMUXING)
20 #include "media/formats/mp4/hevc.h" 20 #include "media/formats/mp4/hevc.h"
21 #endif 21 #endif
22 22
23 namespace media { 23 namespace media {
24 namespace mp4 { 24 namespace mp4 {
25 25
26 namespace {
27
28 const size_t kKeyIdSize = 16;
29
30 } // namespace
31
26 FileType::FileType() {} 32 FileType::FileType() {}
27 FileType::FileType(const FileType& other) = default; 33 FileType::FileType(const FileType& other) = default;
28 FileType::~FileType() {} 34 FileType::~FileType() {}
29 FourCC FileType::BoxType() const { return FOURCC_FTYP; } 35 FourCC FileType::BoxType() const { return FOURCC_FTYP; }
30 36
31 bool FileType::Parse(BoxReader* reader) { 37 bool FileType::Parse(BoxReader* reader) {
32 RCHECK(reader->ReadFourCC(&major_brand) && reader->Read4(&minor_version)); 38 RCHECK(reader->ReadFourCC(&major_brand) && reader->Read4(&minor_version));
33 size_t num_brands = (reader->size() - reader->pos()) / sizeof(FourCC); 39 size_t num_brands = (reader->size() - reader->pos()) / sizeof(FourCC);
34 return reader->SkipBytes(sizeof(FourCC) * num_brands); // compatible_brands 40 return reader->SkipBytes(sizeof(FourCC) * num_brands); // compatible_brands
35 } 41 }
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 156
151 SampleEncryptionEntry::SampleEncryptionEntry() {} 157 SampleEncryptionEntry::SampleEncryptionEntry() {}
152 SampleEncryptionEntry::SampleEncryptionEntry( 158 SampleEncryptionEntry::SampleEncryptionEntry(
153 const SampleEncryptionEntry& other) = default; 159 const SampleEncryptionEntry& other) = default;
154 SampleEncryptionEntry::~SampleEncryptionEntry() {} 160 SampleEncryptionEntry::~SampleEncryptionEntry() {}
155 161
156 bool SampleEncryptionEntry::Parse(BufferReader* reader, 162 bool SampleEncryptionEntry::Parse(BufferReader* reader,
157 uint8_t iv_size, 163 uint8_t iv_size,
158 bool has_subsamples) { 164 bool has_subsamples) {
159 // According to ISO/IEC FDIS 23001-7: CENC spec, IV should be either 165 // According to ISO/IEC FDIS 23001-7: CENC spec, IV should be either
160 // 64-bit (8-byte) or 128-bit (16-byte). 166 // 64-bit (8-byte) or 128-bit (16-byte). Subsequent editions allow |iv_size|
ddorwin 2016/06/17 23:32:40 nit: It would be nice to specify which edition add
dougsteed 2016/10/10 18:18:01 Done.
161 RCHECK(iv_size == 8 || iv_size == 16); 167 // to be 0, for the case of a "constant IV". In this case, the existence of
168 // the constant IV must be ensured by the caller.
ddorwin 2016/06/17 23:32:40 Do you mean the caller of this function? I assume
dougsteed 2016/10/10 18:18:01 Actually it's in track_run_iterator.cc, line 502.
169 RCHECK(iv_size == 0 || iv_size == 8 || iv_size == 16);
162 170
163 memset(initialization_vector, 0, sizeof(initialization_vector)); 171 memset(initialization_vector, 0, sizeof(initialization_vector));
164 for (uint8_t i = 0; i < iv_size; i++) 172 for (uint8_t i = 0; i < iv_size; i++)
165 RCHECK(reader->Read1(initialization_vector + i)); 173 RCHECK(reader->Read1(initialization_vector + i));
166 174
167 if (!has_subsamples) { 175 if (!has_subsamples) {
168 subsamples.clear(); 176 subsamples.clear();
169 return true; 177 return true;
170 } 178 }
171 179
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 FourCC SchemeType::BoxType() const { return FOURCC_SCHM; } 233 FourCC SchemeType::BoxType() const { return FOURCC_SCHM; }
226 234
227 bool SchemeType::Parse(BoxReader* reader) { 235 bool SchemeType::Parse(BoxReader* reader) {
228 RCHECK(reader->ReadFullBoxHeader() && 236 RCHECK(reader->ReadFullBoxHeader() &&
229 reader->ReadFourCC(&type) && 237 reader->ReadFourCC(&type) &&
230 reader->Read4(&version)); 238 reader->Read4(&version));
231 return true; 239 return true;
232 } 240 }
233 241
234 TrackEncryption::TrackEncryption() 242 TrackEncryption::TrackEncryption()
235 : is_encrypted(false), default_iv_size(0) { 243 : is_encrypted(false),
244 default_iv_size(0)
245 #if BUILDFLAG(ENABLE_CBCS_ENCRYPTION_SCHEME)
246 ,
247 default_crypt_byte_block(0),
248 default_skip_byte_block(0),
249 default_constant_iv_size(0)
250 #endif
251 {
236 } 252 }
237 TrackEncryption::TrackEncryption(const TrackEncryption& other) = default; 253 TrackEncryption::TrackEncryption(const TrackEncryption& other) = default;
238 TrackEncryption::~TrackEncryption() {} 254 TrackEncryption::~TrackEncryption() {}
239 FourCC TrackEncryption::BoxType() const { return FOURCC_TENC; } 255 FourCC TrackEncryption::BoxType() const { return FOURCC_TENC; }
240 256
241 bool TrackEncryption::Parse(BoxReader* reader) { 257 bool TrackEncryption::Parse(BoxReader* reader) {
242 uint8_t flag; 258 uint8_t flag;
243 RCHECK(reader->ReadFullBoxHeader() && 259 uint8_t possible_pattern_info;
244 reader->SkipBytes(2) && 260 RCHECK(reader->ReadFullBoxHeader() && reader->SkipBytes(1) &&
ddorwin 2016/06/17 23:32:40 What is being skipped? Should we document this?
dougsteed 2016/10/10 18:18:01 A reserved byte.
245 reader->Read1(&flag) && 261 reader->Read1(&possible_pattern_info) && reader->Read1(&flag) &&
ddorwin 2016/06/17 23:32:40 Did they use reserved bits or something? Why is th
dougsteed 2016/10/10 18:18:01 Yes. There were two reserved bytes. They reassigne
246 reader->Read1(&default_iv_size) && 262 reader->Read1(&default_iv_size) &&
247 reader->ReadVec(&default_kid, 16)); 263 reader->ReadVec(&default_kid, kKeyIdSize));
248 is_encrypted = (flag != 0); 264 is_encrypted = (flag != 0);
249 if (is_encrypted) { 265 if (default_iv_size != 0) {
250 RCHECK(default_iv_size == 8 || default_iv_size == 16); 266 RCHECK(default_iv_size == 8 || default_iv_size == 16);
267 #if BUILDFLAG(ENABLE_CBCS_ENCRYPTION_SCHEME)
ddorwin 2016/06/17 23:32:40 Should this be inside the else if - with a #else t
dougsteed 2016/10/10 18:18:01 I agree. It was unclear. Rearranged it a bit to (h
268 } else if (is_encrypted) {
ddorwin 2016/06/17 23:32:40 What is the relationship between this block and de
dougsteed 2016/10/10 18:18:01 see above.
269 if (reader->version() > 0) {
270 default_crypt_byte_block = (possible_pattern_info >> 4) & 0x0f;
271 default_skip_byte_block = possible_pattern_info & 0x0f;
272 }
273 RCHECK(reader->Read1(&default_constant_iv_size) &&
274 (default_constant_iv_size == 8 || default_constant_iv_size == 16));
275 memset(default_constant_iv, 0, sizeof(default_constant_iv));
276 for (uint8_t i = 0; i < default_constant_iv_size; i++)
277 RCHECK(reader->Read1(default_constant_iv + i));
278 #endif
251 } else { 279 } else {
252 RCHECK(default_iv_size == 0); 280 RCHECK(!is_encrypted);
253 } 281 }
254 return true; 282 return true;
255 } 283 }
256 284
257 SchemeInfo::SchemeInfo() {} 285 SchemeInfo::SchemeInfo() {}
258 SchemeInfo::SchemeInfo(const SchemeInfo& other) = default; 286 SchemeInfo::SchemeInfo(const SchemeInfo& other) = default;
259 SchemeInfo::~SchemeInfo() {} 287 SchemeInfo::~SchemeInfo() {}
260 FourCC SchemeInfo::BoxType() const { return FOURCC_SCHI; } 288 FourCC SchemeInfo::BoxType() const { return FOURCC_SCHI; }
261 289
262 bool SchemeInfo::Parse(BoxReader* reader) { 290 bool SchemeInfo::Parse(BoxReader* reader) {
263 return reader->ScanChildren() && reader->ReadChild(&track_encryption); 291 return reader->ScanChildren() && reader->ReadChild(&track_encryption);
264 } 292 }
265 293
266 ProtectionSchemeInfo::ProtectionSchemeInfo() {} 294 ProtectionSchemeInfo::ProtectionSchemeInfo() {}
267 ProtectionSchemeInfo::ProtectionSchemeInfo(const ProtectionSchemeInfo& other) = 295 ProtectionSchemeInfo::ProtectionSchemeInfo(const ProtectionSchemeInfo& other) =
268 default; 296 default;
269 ProtectionSchemeInfo::~ProtectionSchemeInfo() {} 297 ProtectionSchemeInfo::~ProtectionSchemeInfo() {}
270 FourCC ProtectionSchemeInfo::BoxType() const { return FOURCC_SINF; } 298 FourCC ProtectionSchemeInfo::BoxType() const { return FOURCC_SINF; }
271 299
272 bool ProtectionSchemeInfo::Parse(BoxReader* reader) { 300 bool ProtectionSchemeInfo::Parse(BoxReader* reader) {
273 RCHECK(reader->ScanChildren() && 301 RCHECK(reader->ScanChildren() &&
274 reader->ReadChild(&format) && 302 reader->ReadChild(&format) &&
275 reader->ReadChild(&type)); 303 reader->ReadChild(&type));
276 if (type.type == FOURCC_CENC) 304 if (HasSupportedScheme())
277 RCHECK(reader->ReadChild(&info)); 305 RCHECK(reader->ReadChild(&info));
278 // Other protection schemes are silently ignored. Since the protection scheme 306 // Other protection schemes are silently ignored. Since the protection scheme
279 // type can't be determined until this box is opened, we return 'true' for 307 // type can't be determined until this box is opened, we return 'true' for
280 // non-CENC protection scheme types. It is the parent box's responsibility to 308 // non-CENC protection scheme types. It is the parent box's responsibility to
281 // ensure that this scheme type is a supported one. 309 // ensure that this scheme type is a supported one.
282 return true; 310 return true;
283 } 311 }
284 312
313 bool ProtectionSchemeInfo::HasSupportedScheme() const {
314 FourCC fourCC = type.type;
315 if (fourCC == FOURCC_CENC)
316 return true;
317 #if BUILDFLAG(ENABLE_CBCS_ENCRYPTION_SCHEME)
318 return fourCC == FOURCC_CBCS;
ddorwin 2016/06/17 23:32:40 nit: If you follow the style for CENC, you don't n
dougsteed 2016/10/10 18:18:01 Done.
319 #else
320 return false;
321 #endif
322 }
323
285 MovieHeader::MovieHeader() 324 MovieHeader::MovieHeader()
286 : creation_time(0), 325 : creation_time(0),
287 modification_time(0), 326 modification_time(0),
288 timescale(0), 327 timescale(0),
289 duration(0), 328 duration(0),
290 rate(-1), 329 rate(-1),
291 volume(-1), 330 volume(-1),
292 next_track_id(0) {} 331 next_track_id(0) {}
293 MovieHeader::MovieHeader(const MovieHeader& other) = default; 332 MovieHeader::MovieHeader(const MovieHeader& other) = default;
294 MovieHeader::~MovieHeader() {} 333 MovieHeader::~MovieHeader() {}
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 reader->Read2(&width) && 641 reader->Read2(&width) &&
603 reader->Read2(&height) && 642 reader->Read2(&height) &&
604 reader->SkipBytes(50)); 643 reader->SkipBytes(50));
605 644
606 RCHECK(reader->ScanChildren() && 645 RCHECK(reader->ScanChildren() &&
607 reader->MaybeReadChild(&pixel_aspect)); 646 reader->MaybeReadChild(&pixel_aspect));
608 647
609 if (format == FOURCC_ENCV) { 648 if (format == FOURCC_ENCV) {
610 // Continue scanning until a recognized protection scheme is found, or until 649 // Continue scanning until a recognized protection scheme is found, or until
611 // we run out of protection schemes. 650 // we run out of protection schemes.
612 while (sinf.type.type != FOURCC_CENC) { 651 while (!sinf.HasSupportedScheme()) {
613 if (!reader->ReadChild(&sinf)) 652 if (!reader->ReadChild(&sinf))
614 return false; 653 return false;
615 } 654 }
616 } 655 }
617 656
618 const FourCC actual_format = 657 const FourCC actual_format =
619 format == FOURCC_ENCV ? sinf.format.format : format; 658 format == FOURCC_ENCV ? sinf.format.format : format;
620 switch (actual_format) { 659 switch (actual_format) {
621 case FOURCC_AVC1: 660 case FOURCC_AVC1:
622 case FOURCC_AVC3: { 661 case FOURCC_AVC3: {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 reader->Read2(&samplesize) && 781 reader->Read2(&samplesize) &&
743 reader->SkipBytes(4) && 782 reader->SkipBytes(4) &&
744 reader->Read4(&samplerate)); 783 reader->Read4(&samplerate));
745 // Convert from 16.16 fixed point to integer 784 // Convert from 16.16 fixed point to integer
746 samplerate >>= 16; 785 samplerate >>= 16;
747 786
748 RCHECK(reader->ScanChildren()); 787 RCHECK(reader->ScanChildren());
749 if (format == FOURCC_ENCA) { 788 if (format == FOURCC_ENCA) {
750 // Continue scanning until a recognized protection scheme is found, or until 789 // Continue scanning until a recognized protection scheme is found, or until
751 // we run out of protection schemes. 790 // we run out of protection schemes.
752 while (sinf.type.type != FOURCC_CENC) { 791 while (!sinf.HasSupportedScheme()) {
753 if (!reader->ReadChild(&sinf)) 792 if (!reader->ReadChild(&sinf))
754 return false; 793 return false;
755 } 794 }
756 } 795 }
757 796
758 // ESDS is not valid in case of EAC3. 797 // ESDS is not valid in case of EAC3.
759 RCHECK(reader->MaybeReadChild(&esds)); 798 RCHECK(reader->MaybeReadChild(&esds));
760 return true; 799 return true;
761 } 800 }
762 801
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 RCHECK(reader->Read4(&count)); 1121 RCHECK(reader->Read4(&count));
1083 entries.resize(count); 1122 entries.resize(count);
1084 for (uint32_t i = 0; i < count; ++i) { 1123 for (uint32_t i = 0; i < count; ++i) {
1085 RCHECK(reader->Read4(&entries[i].sample_count) && 1124 RCHECK(reader->Read4(&entries[i].sample_count) &&
1086 reader->Read4(&entries[i].group_description_index)); 1125 reader->Read4(&entries[i].group_description_index));
1087 } 1126 }
1088 return true; 1127 return true;
1089 } 1128 }
1090 1129
1091 CencSampleEncryptionInfoEntry::CencSampleEncryptionInfoEntry() 1130 CencSampleEncryptionInfoEntry::CencSampleEncryptionInfoEntry()
1092 : is_encrypted(false), iv_size(0) {} 1131 : is_encrypted(false),
1132 iv_size(0)
1133 #if BUILDFLAG(ENABLE_CBCS_ENCRYPTION_SCHEME)
1134 ,
1135 crypt_byte_block(0),
1136 skip_byte_block(0),
1137 constant_iv_size(0)
1138 #endif
1139 {
1140 }
1093 CencSampleEncryptionInfoEntry::CencSampleEncryptionInfoEntry( 1141 CencSampleEncryptionInfoEntry::CencSampleEncryptionInfoEntry(
1094 const CencSampleEncryptionInfoEntry& other) = default; 1142 const CencSampleEncryptionInfoEntry& other) = default;
1095 CencSampleEncryptionInfoEntry::~CencSampleEncryptionInfoEntry() {} 1143 CencSampleEncryptionInfoEntry::~CencSampleEncryptionInfoEntry() {}
1096 1144
1145 bool CencSampleEncryptionInfoEntry::Parse(BoxReader* reader) {
1146 uint8_t flag;
1147 uint8_t possible_pattern_info;
1148 RCHECK(reader->SkipBytes(1) && // reserved.
1149 reader->Read1(&possible_pattern_info) && reader->Read1(&flag) &&
1150 reader->Read1(&iv_size) && reader->ReadVec(&key_id, kKeyIdSize));
1151
1152 is_encrypted = (flag != 0);
1153 if (iv_size != 0) {
ddorwin 2016/06/17 23:32:40 ditto on structure note to self: I skipped this.
dougsteed 2016/10/10 18:18:01 Done.
1154 RCHECK(iv_size == 8 || iv_size == 16);
1155 #if BUILDFLAG(ENABLE_CBCS_ENCRYPTION_SCHEME)
1156 } else if (is_encrypted) {
1157 crypt_byte_block = (possible_pattern_info >> 4) & 0x0f;
1158 skip_byte_block = possible_pattern_info & 0x0f;
1159 RCHECK(reader->Read1(&constant_iv_size) &&
1160 (constant_iv_size == 8 || constant_iv_size == 16));
1161 memset(constant_iv, 0, sizeof(constant_iv));
1162 for (uint8_t i = 0; i < constant_iv_size; i++)
1163 RCHECK(reader->Read1(constant_iv + i));
1164 #endif
1165 } else {
1166 RCHECK(!is_encrypted);
1167 }
1168 return true;
1169 }
1170
1097 SampleGroupDescription::SampleGroupDescription() : grouping_type(0) {} 1171 SampleGroupDescription::SampleGroupDescription() : grouping_type(0) {}
1098 SampleGroupDescription::SampleGroupDescription( 1172 SampleGroupDescription::SampleGroupDescription(
1099 const SampleGroupDescription& other) = default; 1173 const SampleGroupDescription& other) = default;
1100 SampleGroupDescription::~SampleGroupDescription() {} 1174 SampleGroupDescription::~SampleGroupDescription() {}
1101 FourCC SampleGroupDescription::BoxType() const { return FOURCC_SGPD; } 1175 FourCC SampleGroupDescription::BoxType() const { return FOURCC_SGPD; }
1102 1176
1103 bool SampleGroupDescription::Parse(BoxReader* reader) { 1177 bool SampleGroupDescription::Parse(BoxReader* reader) {
1104 RCHECK(reader->ReadFullBoxHeader() && 1178 RCHECK(reader->ReadFullBoxHeader() &&
1105 reader->Read4(&grouping_type)); 1179 reader->Read4(&grouping_type));
1106 1180
1107 if (grouping_type != FOURCC_SEIG) { 1181 if (grouping_type != FOURCC_SEIG) {
1108 DLOG(WARNING) << "SampleGroupDescription box with grouping_type '" 1182 DLOG(WARNING) << "SampleGroupDescription box with grouping_type '"
1109 << grouping_type << "' is not supported."; 1183 << grouping_type << "' is not supported.";
1110 return true; 1184 return true;
1111 } 1185 }
1112 1186
1113 const uint8_t version = reader->version(); 1187 const uint8_t version = reader->version();
1114 1188
1115 const size_t kKeyIdSize = 16;
1116 const size_t kEntrySize = sizeof(uint32_t) + kKeyIdSize; 1189 const size_t kEntrySize = sizeof(uint32_t) + kKeyIdSize;
1117 uint32_t default_length = 0; 1190 uint32_t default_length = 0;
1118 if (version == 1) { 1191 if (version == 1) {
1119 RCHECK(reader->Read4(&default_length)); 1192 RCHECK(reader->Read4(&default_length));
1120 RCHECK(default_length == 0 || default_length >= kEntrySize); 1193 RCHECK(default_length == 0 || default_length >= kEntrySize);
1121 } 1194 }
1122 1195
1123 uint32_t count; 1196 uint32_t count;
1124 RCHECK(reader->Read4(&count)); 1197 RCHECK(reader->Read4(&count));
1125 entries.resize(count); 1198 entries.resize(count);
1126 for (uint32_t i = 0; i < count; ++i) { 1199 for (uint32_t i = 0; i < count; ++i) {
1127 if (version == 1) { 1200 if (version == 1) {
1128 if (default_length == 0) { 1201 if (default_length == 0) {
1129 uint32_t description_length = 0; 1202 uint32_t description_length = 0;
1130 RCHECK(reader->Read4(&description_length)); 1203 RCHECK(reader->Read4(&description_length));
1131 RCHECK(description_length >= kEntrySize); 1204 RCHECK(description_length >= kEntrySize);
1132 } 1205 }
1133 } 1206 }
1134 1207 RCHECK(entries[i].Parse(reader));
1135 uint8_t flag;
1136 RCHECK(reader->SkipBytes(2) && // reserved.
1137 reader->Read1(&flag) &&
1138 reader->Read1(&entries[i].iv_size) &&
1139 reader->ReadVec(&entries[i].key_id, kKeyIdSize));
1140
1141 entries[i].is_encrypted = (flag != 0);
1142 if (entries[i].is_encrypted) {
1143 RCHECK(entries[i].iv_size == 8 || entries[i].iv_size == 16);
1144 } else {
1145 RCHECK(entries[i].iv_size == 0);
1146 }
1147 } 1208 }
1148 return true; 1209 return true;
1149 } 1210 }
1150 1211
1151 TrackFragment::TrackFragment() {} 1212 TrackFragment::TrackFragment() {}
1152 TrackFragment::TrackFragment(const TrackFragment& other) = default; 1213 TrackFragment::TrackFragment(const TrackFragment& other) = default;
1153 TrackFragment::~TrackFragment() {} 1214 TrackFragment::~TrackFragment() {}
1154 FourCC TrackFragment::BoxType() const { return FOURCC_TRAF; } 1215 FourCC TrackFragment::BoxType() const { return FOURCC_TRAF; }
1155 1216
1156 bool TrackFragment::Parse(BoxReader* reader) { 1217 bool TrackFragment::Parse(BoxReader* reader) {
1157 RCHECK(reader->ScanChildren() && 1218 RCHECK(reader->ScanChildren() && reader->ReadChild(&header) &&
1158 reader->ReadChild(&header) &&
1159 // Media Source specific: 'tfdt' required 1219 // Media Source specific: 'tfdt' required
1160 reader->ReadChild(&decode_time) && 1220 reader->ReadChild(&decode_time) && reader->MaybeReadChildren(&runs) &&
1161 reader->MaybeReadChildren(&runs) &&
1162 reader->MaybeReadChild(&auxiliary_offset) && 1221 reader->MaybeReadChild(&auxiliary_offset) &&
1163 reader->MaybeReadChild(&auxiliary_size) && 1222 reader->MaybeReadChild(&auxiliary_size) &&
1164 reader->MaybeReadChild(&sdtp)); 1223 reader->MaybeReadChild(&sdtp) &&
1224 reader->MaybeReadChild(&sample_encryption));
ddorwin 2016/06/17 23:32:40 Was this missed in a previous CL?
dougsteed 2016/10/10 18:18:01 It looks like this box was added in the 2nd Editio
1165 1225
1166 // There could be multiple SampleGroupDescription and SampleToGroup boxes with 1226 // There could be multiple SampleGroupDescription and SampleToGroup boxes with
1167 // different grouping types. For common encryption, the relevant grouping type 1227 // different grouping types. For common encryption, the relevant grouping type
1168 // is 'seig'. Continue reading until 'seig' is found, or until running out of 1228 // is 'seig'. Continue reading until 'seig' is found, or until running out of
1169 // child boxes. 1229 // child boxes.
1170 while (reader->HasChild(&sample_group_description)) { 1230 while (reader->HasChild(&sample_group_description)) {
1171 RCHECK(reader->ReadChild(&sample_group_description)); 1231 RCHECK(reader->ReadChild(&sample_group_description));
1172 if (sample_group_description.grouping_type == FOURCC_SEIG) 1232 if (sample_group_description.grouping_type == FOURCC_SEIG)
1173 break; 1233 break;
1174 sample_group_description.entries.clear(); 1234 sample_group_description.entries.clear();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 SampleDependsOn IndependentAndDisposableSamples::sample_depends_on( 1284 SampleDependsOn IndependentAndDisposableSamples::sample_depends_on(
1225 size_t i) const { 1285 size_t i) const {
1226 if (i >= sample_depends_on_.size()) 1286 if (i >= sample_depends_on_.size())
1227 return kSampleDependsOnUnknown; 1287 return kSampleDependsOnUnknown;
1228 1288
1229 return sample_depends_on_[i]; 1289 return sample_depends_on_[i];
1230 } 1290 }
1231 1291
1232 } // namespace mp4 1292 } // namespace mp4
1233 } // namespace media 1293 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698