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

Side by Side Diff: media/base/container_names.cc

Issue 15966005: Improve container detection testing by adding additional containers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 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 (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/base/container_names.h" 5 #include "media/base/container_names.h"
6 6
7 #include <cctype> 7 #include <cctype>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 // Verify video frames per second specified. 224 // Verify video frames per second specified.
225 RCHECK(Read32LE(buffer + 32) > 0); 225 RCHECK(Read32LE(buffer + 32) > 0);
226 226
227 // Number of audio tracks must be 256 or less. 227 // Number of audio tracks must be 256 or less.
228 return (Read32LE(buffer + 40) <= 256); 228 return (Read32LE(buffer + 40) <= 256);
229 } 229 }
230 230
231 // Additional checks for a CAF container. 231 // Additional checks for a CAF container.
232 static bool CheckCaf(const uint8* buffer, int buffer_size) { 232 static bool CheckCaf(const uint8* buffer, int buffer_size) {
233 // Reference: Apple Core Audio Format Specification 1.0 233 // Reference: Apple Core Audio Format Specification 1.0
234 // (http://goo.gl/Vgb9r) 234 // (https://developer.apple.com/library/mac/#documentation/MusicAudio/Referenc e/CAFSpec/CAF_spec/CAF_spec.html)
235 RCHECK(buffer_size >= 52); 235 RCHECK(buffer_size >= 52);
236 BitReader reader(buffer, buffer_size); 236 BitReader reader(buffer, buffer_size);
237 237
238 // mFileType should be "caff". 238 // mFileType should be "caff".
239 RCHECK(ReadBits(&reader, 32) == TAG('c', 'a', 'f', 'f')); 239 RCHECK(ReadBits(&reader, 32) == TAG('c', 'a', 'f', 'f'));
240 240
241 // mFileVersion should be 1. 241 // mFileVersion should be 1.
242 RCHECK(ReadBits(&reader, 16) == 1); 242 RCHECK(ReadBits(&reader, 16) == 1);
243 243
244 // Skip mFileFlags. 244 // Skip mFileFlags.
(...skipping 20 matching lines...) Expand all
265 static bool kSamplingFrequencyValid[16] = { false, true, true, true, false, 265 static bool kSamplingFrequencyValid[16] = { false, true, true, true, false,
266 false, true, true, true, false, 266 false, true, true, true, false,
267 false, true, true, true, false, 267 false, true, true, true, false,
268 false }; 268 false };
269 static bool kExtAudioIdValid[8] = { true, false, true, false, false, false, 269 static bool kExtAudioIdValid[8] = { true, false, true, false, false, false,
270 true, false }; 270 true, false };
271 271
272 // Additional checks for a DTS container. 272 // Additional checks for a DTS container.
273 static bool CheckDts(const uint8* buffer, int buffer_size) { 273 static bool CheckDts(const uint8* buffer, int buffer_size) {
274 // Reference: ETSI TS 102 114 V1.3.1 (2011-08) 274 // Reference: ETSI TS 102 114 V1.3.1 (2011-08)
275 // (http://goo.gl/FhHrk) 275 // (http://www.etsi.org/deliver/etsi_ts/102100_102199/102114/01.03.01_60/ts_10 2114v010301p.pdf)
276 RCHECK(buffer_size > 11); 276 RCHECK(buffer_size > 11);
277 277
278 int offset = 0; 278 int offset = 0;
279 while (offset + 11 < buffer_size) { 279 while (offset + 11 < buffer_size) {
280 BitReader reader(buffer + offset, 11); 280 BitReader reader(buffer + offset, 11);
281 281
282 // Verify sync word. 282 // Verify sync word.
283 RCHECK(ReadBits(&reader, 32) == 0x7ffe8001); 283 RCHECK(ReadBits(&reader, 32) == 0x7ffe8001);
284 284
285 // Skip frame type and deficit sample count. 285 // Skip frame type and deficit sample count.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 RCHECK(ReadBits(&reader, 2) != 3); 320 RCHECK(ReadBits(&reader, 2) != 3);
321 321
322 offset += frame_size + 1; 322 offset += frame_size + 1;
323 } 323 }
324 return true; 324 return true;
325 } 325 }
326 326
327 // Checks for a DV container. 327 // Checks for a DV container.
328 static bool CheckDV(const uint8* buffer, int buffer_size) { 328 static bool CheckDV(const uint8* buffer, int buffer_size) {
329 // Reference: SMPTE 314M (Annex A has differences with IEC 61834). 329 // Reference: SMPTE 314M (Annex A has differences with IEC 61834).
330 // (http://goo.gl/kMn6p) 330 // (http://standards.smpte.org/content/978-1-61482-454-1/st-314-2005/SEC1.body .pdf)
331 RCHECK(buffer_size > 11); 331 RCHECK(buffer_size > 11);
332 332
333 int offset = 0; 333 int offset = 0;
334 int current_sequence_number = -1; 334 int current_sequence_number = -1;
335 int last_block_number[6]; 335 int last_block_number[6];
336 while (offset + 11 < buffer_size) { 336 while (offset + 11 < buffer_size) {
337 BitReader reader(buffer + offset, 11); 337 BitReader reader(buffer + offset, 11);
338 338
339 // Decode ID data. Sections 5, 6, and 7 are reserved. 339 // Decode ID data. Sections 5, 6, and 7 are reserved.
340 int section = ReadBits(&reader, 3); 340 int section = ReadBits(&reader, 3);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 // Move to next block. 383 // Move to next block.
384 offset += 80; 384 offset += 80;
385 } 385 }
386 return true; 386 return true;
387 } 387 }
388 388
389 389
390 // Checks for a GSM container. 390 // Checks for a GSM container.
391 static bool CheckGsm(const uint8* buffer, int buffer_size) { 391 static bool CheckGsm(const uint8* buffer, int buffer_size) {
392 // Reference: ETSI EN 300 961 V8.1.1 392 // Reference: ETSI EN 300 961 V8.1.1
393 // (http://goo.gl/h2VDS) 393 // (http://www.etsi.org/deliver/etsi_en/300900_300999/300961/08.01.01_60/en_30 0961v080101p.pdf)
394 // also http://tools.ietf.org/html/rfc3551#page-24 394 // also http://tools.ietf.org/html/rfc3551#page-24
395 // GSM files have a 33 byte block, only first 4 bits are fixed. 395 // GSM files have a 33 byte block, only first 4 bits are fixed.
396 RCHECK(buffer_size >= 1024); // Need enough data to do a decent check. 396 RCHECK(buffer_size >= 1024); // Need enough data to do a decent check.
397 397
398 int offset = 0; 398 int offset = 0;
399 while (offset < buffer_size) { 399 while (offset < buffer_size) {
400 // First 4 bits of each block are xD. 400 // First 4 bits of each block are xD.
401 RCHECK((buffer[offset] & 0xf0) == 0xd0); 401 RCHECK((buffer[offset] & 0xf0) == 0xd0);
402 offset += 33; 402 offset += 33;
403 } 403 }
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 break; 940 break;
941 } 941 }
942 // Skip this block. 942 // Skip this block.
943 offset += 6; 943 offset += 6;
944 } 944 }
945 } 945 }
946 946
947 // Additional checks for a MOV/QuickTime/MPEG4 container. 947 // Additional checks for a MOV/QuickTime/MPEG4 container.
948 static bool CheckMov(const uint8* buffer, int buffer_size) { 948 static bool CheckMov(const uint8* buffer, int buffer_size) {
949 // Reference: ISO/IEC 14496-12:2005(E). 949 // Reference: ISO/IEC 14496-12:2005(E).
950 // (http://goo.gl/OWH0Q) 950 // (http://standards.iso.org/ittf/PubliclyAvailableStandards/c061988_ISO_IEC_1 4496-12_2012.zip)
951 RCHECK(buffer_size > 8); 951 RCHECK(buffer_size > 8);
952 952
953 int offset = 0; 953 int offset = 0;
954 while (offset + 8 < buffer_size) { 954 while (offset + 8 < buffer_size) {
955 int atomsize = Read32(buffer + offset); 955 int atomsize = Read32(buffer + offset);
956 uint32 atomtype = Read32(buffer + offset + 4); 956 uint32 atomtype = Read32(buffer + offset + 4);
957 // Only need to check for ones that are valid at the top level. 957 // Only need to check for ones that are valid at the top level.
958 switch (atomtype) { 958 switch (atomtype) {
959 case TAG('f','t','y','p'): 959 case TAG('f','t','y','p'):
960 case TAG('p','d','i','n'): 960 case TAG('p','d','i','n'):
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 1291
1292 enum VC1StartCodes { 1292 enum VC1StartCodes {
1293 VC1_FRAME_START_CODE = 0x0d, 1293 VC1_FRAME_START_CODE = 0x0d,
1294 VC1_ENTRY_POINT_START_CODE = 0x0e, 1294 VC1_ENTRY_POINT_START_CODE = 0x0e,
1295 VC1_SEQUENCE_START_CODE = 0x0f 1295 VC1_SEQUENCE_START_CODE = 0x0f
1296 }; 1296 };
1297 1297
1298 // Checks for a VC1 bitstream container. 1298 // Checks for a VC1 bitstream container.
1299 static bool CheckVC1(const uint8* buffer, int buffer_size) { 1299 static bool CheckVC1(const uint8* buffer, int buffer_size) {
1300 // Reference: SMPTE 421M 1300 // Reference: SMPTE 421M
1301 // (http://goo.gl/fLvaE) 1301 // (http://standards.smpte.org/content/978-1-61482-555-5/st-421-2006/SEC1.body .pdf)
1302 // However, no length ... simply scan for start code values. 1302 // However, no length ... simply scan for start code values.
1303 // Expect to see SEQ | [ [ ENTRY ] PIC* ]* 1303 // Expect to see SEQ | [ [ ENTRY ] PIC* ]*
1304 // Note tags are very similar to H.264. 1304 // Note tags are very similar to H.264.
1305 1305
1306 RCHECK(buffer_size >= 24); 1306 RCHECK(buffer_size >= 24);
1307 1307
1308 // First check for Bitstream Metadata Serialization (Annex L) 1308 // First check for Bitstream Metadata Serialization (Annex L)
1309 if (buffer[0] == 0xc5 && 1309 if (buffer[0] == 0xc5 &&
1310 Read32(buffer + 4) == 0x04 && 1310 Read32(buffer + 4) == 0x04 &&
1311 Read32(buffer + 20) == 0x0c) { 1311 Read32(buffer + 20) == 0x0c) {
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
1662 if (CheckEac3(buffer + offset, buffer_size - offset)) 1662 if (CheckEac3(buffer + offset, buffer_size - offset))
1663 return CONTAINER_EAC3; 1663 return CONTAINER_EAC3;
1664 } 1664 }
1665 1665
1666 return CONTAINER_UNKNOWN; 1666 return CONTAINER_UNKNOWN;
1667 } 1667 }
1668 1668
1669 } // namespace container_names 1669 } // namespace container_names
1670 1670
1671 } // namespace media 1671 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/base/container_names_unittest.cc » ('j') | media/base/container_names_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698