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/webm_parser.h" | 5 #include "media/formats/webm/webm_parser.h" |
6 | 6 |
7 // This file contains code to parse WebM file elements. It was created | 7 // This file contains code to parse WebM file elements. It was created |
8 // from information in the Matroska spec. | 8 // from information in the Matroska spec. |
9 // http://www.matroska.org/technical/specs/index.html | 9 // http://www.matroska.org/technical/specs/index.html |
10 // This file contains code for encrypted WebM. Current WebM | 10 // This file contains code for encrypted WebM. Current WebM |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 {LIST, kWebMIdContentEncodings}, | 178 {LIST, kWebMIdContentEncodings}, |
179 }; | 179 }; |
180 | 180 |
181 static const ElementIdInfo kTrackTranslateIds[] = { | 181 static const ElementIdInfo kTrackTranslateIds[] = { |
182 {UINT, kWebMIdTrackTranslateEditionUID}, | 182 {UINT, kWebMIdTrackTranslateEditionUID}, |
183 {UINT, kWebMIdTrackTranslateCodec}, | 183 {UINT, kWebMIdTrackTranslateCodec}, |
184 {BINARY, kWebMIdTrackTranslateTrackID}, | 184 {BINARY, kWebMIdTrackTranslateTrackID}, |
185 }; | 185 }; |
186 | 186 |
187 static const ElementIdInfo kVideoIds[] = { | 187 static const ElementIdInfo kVideoIds[] = { |
188 {UINT, kWebMIdFlagInterlaced}, | 188 {UINT, kWebMIdFlagInterlaced}, {UINT, kWebMIdStereoMode}, |
189 {UINT, kWebMIdStereoMode}, | 189 {UINT, kWebMIdAlphaMode}, {UINT, kWebMIdPixelWidth}, |
190 {UINT, kWebMIdAlphaMode}, | 190 {UINT, kWebMIdPixelHeight}, {UINT, kWebMIdPixelCropBottom}, |
191 {UINT, kWebMIdPixelWidth}, | 191 {UINT, kWebMIdPixelCropTop}, {UINT, kWebMIdPixelCropLeft}, |
192 {UINT, kWebMIdPixelHeight}, | 192 {UINT, kWebMIdPixelCropRight}, {UINT, kWebMIdDisplayWidth}, |
193 {UINT, kWebMIdPixelCropBottom}, | 193 {UINT, kWebMIdDisplayHeight}, {UINT, kWebMIdDisplayUnit}, |
194 {UINT, kWebMIdPixelCropTop}, | 194 {UINT, kWebMIdAspectRatioType}, {BINARY, kWebMIdColorSpace}, |
195 {UINT, kWebMIdPixelCropLeft}, | 195 {FLOAT, kWebMIdFrameRate}, {LIST, kWebMIdColour}, |
196 {UINT, kWebMIdPixelCropRight}, | 196 }; |
197 {UINT, kWebMIdDisplayWidth}, | 197 |
198 {UINT, kWebMIdDisplayHeight}, | 198 static const ElementIdInfo kColourIds[] = { |
199 {UINT, kWebMIdDisplayUnit}, | 199 {UINT, kWebMIdMatrixCoefficients}, |
200 {UINT, kWebMIdAspectRatioType}, | 200 {UINT, kWebMIdBitsPerChannel}, |
201 {BINARY, kWebMIdColorSpace}, | 201 {UINT, kWebMIdChromaSubsamplingHorz}, |
202 {FLOAT, kWebMIdFrameRate}, | 202 {UINT, kWebMIdChromaSubsamplingVert}, |
| 203 {UINT, kWebMIdCbSubsamplingHorz}, |
| 204 {UINT, kWebMIdCbSubsamplingVert}, |
| 205 {UINT, kWebMIdChromaSitingHorz}, |
| 206 {UINT, kWebMIdChromaSitingVert}, |
| 207 {UINT, kWebMIdRange}, |
| 208 {UINT, kWebMIdTransferCharacteristics}, |
| 209 {UINT, kWebMIdPrimaries}, |
| 210 {UINT, kWebMIdMaxCLL}, |
| 211 {UINT, kWebMIdMaxFALL}, |
| 212 {LIST, kWebMIdMasteringMetadata}, |
| 213 }; |
| 214 |
| 215 static const ElementIdInfo kMasteringMetadataIds[] = { |
| 216 {FLOAT, kWebMIdPrimaryRChromaticityX}, |
| 217 {FLOAT, kWebMIdPrimaryRChromaticityY}, |
| 218 {FLOAT, kWebMIdPrimaryGChromaticityX}, |
| 219 {FLOAT, kWebMIdPrimaryGChromaticityY}, |
| 220 {FLOAT, kWebMIdPrimaryBChromaticityX}, |
| 221 {FLOAT, kWebMIdPrimaryBChromaticityY}, |
| 222 {FLOAT, kWebMIdWhitePointChromaticityX}, |
| 223 {FLOAT, kWebMIdWhitePointChromaticityY}, |
| 224 {FLOAT, kWebMIdLuminanceMax}, |
| 225 {FLOAT, kWebMIdLuminanceMin}, |
203 }; | 226 }; |
204 | 227 |
205 static const ElementIdInfo kAudioIds[] = { | 228 static const ElementIdInfo kAudioIds[] = { |
206 {FLOAT, kWebMIdSamplingFrequency}, | 229 {FLOAT, kWebMIdSamplingFrequency}, |
207 {FLOAT, kWebMIdOutputSamplingFrequency}, | 230 {FLOAT, kWebMIdOutputSamplingFrequency}, |
208 {UINT, kWebMIdChannels}, | 231 {UINT, kWebMIdChannels}, |
209 {UINT, kWebMIdBitDepth}, | 232 {UINT, kWebMIdBitDepth}, |
210 }; | 233 }; |
211 | 234 |
212 static const ElementIdInfo kTrackOperationIds[] = { | 235 static const ElementIdInfo kTrackOperationIds[] = { |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 {STRING, kWebMIdTagLanguage}, | 384 {STRING, kWebMIdTagLanguage}, |
362 {UINT, kWebMIdTagDefault}, | 385 {UINT, kWebMIdTagDefault}, |
363 {STRING, kWebMIdTagString}, | 386 {STRING, kWebMIdTagString}, |
364 {BINARY, kWebMIdTagBinary}, | 387 {BINARY, kWebMIdTagBinary}, |
365 }; | 388 }; |
366 | 389 |
367 #define LIST_ELEMENT_INFO(id, level, id_info) \ | 390 #define LIST_ELEMENT_INFO(id, level, id_info) \ |
368 { (id), (level), (id_info), arraysize(id_info) } | 391 { (id), (level), (id_info), arraysize(id_info) } |
369 | 392 |
370 static const ListElementInfo kListElementInfo[] = { | 393 static const ListElementInfo kListElementInfo[] = { |
371 LIST_ELEMENT_INFO(kWebMIdCluster, 1, kClusterIds), | 394 LIST_ELEMENT_INFO(kWebMIdCluster, 1, kClusterIds), |
372 LIST_ELEMENT_INFO(kWebMIdEBMLHeader, 0, kEBMLHeaderIds), | 395 LIST_ELEMENT_INFO(kWebMIdEBMLHeader, 0, kEBMLHeaderIds), |
373 LIST_ELEMENT_INFO(kWebMIdSegment, 0, kSegmentIds), | 396 LIST_ELEMENT_INFO(kWebMIdSegment, 0, kSegmentIds), |
374 LIST_ELEMENT_INFO(kWebMIdSeekHead, 1, kSeekHeadIds), | 397 LIST_ELEMENT_INFO(kWebMIdSeekHead, 1, kSeekHeadIds), |
375 LIST_ELEMENT_INFO(kWebMIdSeek, 2, kSeekIds), | 398 LIST_ELEMENT_INFO(kWebMIdSeek, 2, kSeekIds), |
376 LIST_ELEMENT_INFO(kWebMIdInfo, 1, kInfoIds), | 399 LIST_ELEMENT_INFO(kWebMIdInfo, 1, kInfoIds), |
377 LIST_ELEMENT_INFO(kWebMIdChapterTranslate, 2, kChapterTranslateIds), | 400 LIST_ELEMENT_INFO(kWebMIdChapterTranslate, 2, kChapterTranslateIds), |
378 LIST_ELEMENT_INFO(kWebMIdSilentTracks, 2, kSilentTracksIds), | 401 LIST_ELEMENT_INFO(kWebMIdSilentTracks, 2, kSilentTracksIds), |
379 LIST_ELEMENT_INFO(kWebMIdBlockGroup, 2, kBlockGroupIds), | 402 LIST_ELEMENT_INFO(kWebMIdBlockGroup, 2, kBlockGroupIds), |
380 LIST_ELEMENT_INFO(kWebMIdBlockAdditions, 3, kBlockAdditionsIds), | 403 LIST_ELEMENT_INFO(kWebMIdBlockAdditions, 3, kBlockAdditionsIds), |
381 LIST_ELEMENT_INFO(kWebMIdBlockMore, 4, kBlockMoreIds), | 404 LIST_ELEMENT_INFO(kWebMIdBlockMore, 4, kBlockMoreIds), |
382 LIST_ELEMENT_INFO(kWebMIdSlices, 3, kSlicesIds), | 405 LIST_ELEMENT_INFO(kWebMIdSlices, 3, kSlicesIds), |
383 LIST_ELEMENT_INFO(kWebMIdTimeSlice, 4, kTimeSliceIds), | 406 LIST_ELEMENT_INFO(kWebMIdTimeSlice, 4, kTimeSliceIds), |
384 LIST_ELEMENT_INFO(kWebMIdTracks, 1, kTracksIds), | 407 LIST_ELEMENT_INFO(kWebMIdTracks, 1, kTracksIds), |
385 LIST_ELEMENT_INFO(kWebMIdTrackEntry, 2, kTrackEntryIds), | 408 LIST_ELEMENT_INFO(kWebMIdTrackEntry, 2, kTrackEntryIds), |
386 LIST_ELEMENT_INFO(kWebMIdTrackTranslate, 3, kTrackTranslateIds), | 409 LIST_ELEMENT_INFO(kWebMIdTrackTranslate, 3, kTrackTranslateIds), |
387 LIST_ELEMENT_INFO(kWebMIdVideo, 3, kVideoIds), | 410 LIST_ELEMENT_INFO(kWebMIdVideo, 3, kVideoIds), |
388 LIST_ELEMENT_INFO(kWebMIdAudio, 3, kAudioIds), | 411 LIST_ELEMENT_INFO(kWebMIdAudio, 3, kAudioIds), |
389 LIST_ELEMENT_INFO(kWebMIdTrackOperation, 3, kTrackOperationIds), | 412 LIST_ELEMENT_INFO(kWebMIdTrackOperation, 3, kTrackOperationIds), |
390 LIST_ELEMENT_INFO(kWebMIdTrackCombinePlanes, 4, kTrackCombinePlanesIds), | 413 LIST_ELEMENT_INFO(kWebMIdTrackCombinePlanes, 4, kTrackCombinePlanesIds), |
391 LIST_ELEMENT_INFO(kWebMIdTrackPlane, 5, kTrackPlaneIds), | 414 LIST_ELEMENT_INFO(kWebMIdTrackPlane, 5, kTrackPlaneIds), |
392 LIST_ELEMENT_INFO(kWebMIdJoinBlocks, 4, kJoinBlocksIds), | 415 LIST_ELEMENT_INFO(kWebMIdJoinBlocks, 4, kJoinBlocksIds), |
393 LIST_ELEMENT_INFO(kWebMIdContentEncodings, 3, kContentEncodingsIds), | 416 LIST_ELEMENT_INFO(kWebMIdContentEncodings, 3, kContentEncodingsIds), |
394 LIST_ELEMENT_INFO(kWebMIdContentEncoding, 4, kContentEncodingIds), | 417 LIST_ELEMENT_INFO(kWebMIdContentEncoding, 4, kContentEncodingIds), |
395 LIST_ELEMENT_INFO(kWebMIdContentCompression, 5, kContentCompressionIds), | 418 LIST_ELEMENT_INFO(kWebMIdContentCompression, 5, kContentCompressionIds), |
396 LIST_ELEMENT_INFO(kWebMIdContentEncryption, 5, kContentEncryptionIds), | 419 LIST_ELEMENT_INFO(kWebMIdContentEncryption, 5, kContentEncryptionIds), |
397 LIST_ELEMENT_INFO(kWebMIdContentEncAESSettings, 6, kContentEncAESSettingsIds), | 420 LIST_ELEMENT_INFO(kWebMIdContentEncAESSettings, |
398 LIST_ELEMENT_INFO(kWebMIdCues, 1, kCuesIds), | 421 6, |
399 LIST_ELEMENT_INFO(kWebMIdCuePoint, 2, kCuePointIds), | 422 kContentEncAESSettingsIds), |
400 LIST_ELEMENT_INFO(kWebMIdCueTrackPositions, 3, kCueTrackPositionsIds), | 423 LIST_ELEMENT_INFO(kWebMIdCues, 1, kCuesIds), |
401 LIST_ELEMENT_INFO(kWebMIdCueReference, 4, kCueReferenceIds), | 424 LIST_ELEMENT_INFO(kWebMIdCuePoint, 2, kCuePointIds), |
402 LIST_ELEMENT_INFO(kWebMIdAttachments, 1, kAttachmentsIds), | 425 LIST_ELEMENT_INFO(kWebMIdCueTrackPositions, 3, kCueTrackPositionsIds), |
403 LIST_ELEMENT_INFO(kWebMIdAttachedFile, 2, kAttachedFileIds), | 426 LIST_ELEMENT_INFO(kWebMIdCueReference, 4, kCueReferenceIds), |
404 LIST_ELEMENT_INFO(kWebMIdChapters, 1, kChaptersIds), | 427 LIST_ELEMENT_INFO(kWebMIdAttachments, 1, kAttachmentsIds), |
405 LIST_ELEMENT_INFO(kWebMIdEditionEntry, 2, kEditionEntryIds), | 428 LIST_ELEMENT_INFO(kWebMIdAttachedFile, 2, kAttachedFileIds), |
406 LIST_ELEMENT_INFO(kWebMIdChapterAtom, 3, kChapterAtomIds), | 429 LIST_ELEMENT_INFO(kWebMIdChapters, 1, kChaptersIds), |
407 LIST_ELEMENT_INFO(kWebMIdChapterTrack, 4, kChapterTrackIds), | 430 LIST_ELEMENT_INFO(kWebMIdEditionEntry, 2, kEditionEntryIds), |
408 LIST_ELEMENT_INFO(kWebMIdChapterDisplay, 4, kChapterDisplayIds), | 431 LIST_ELEMENT_INFO(kWebMIdChapterAtom, 3, kChapterAtomIds), |
409 LIST_ELEMENT_INFO(kWebMIdChapProcess, 4, kChapProcessIds), | 432 LIST_ELEMENT_INFO(kWebMIdChapterTrack, 4, kChapterTrackIds), |
410 LIST_ELEMENT_INFO(kWebMIdChapProcessCommand, 5, kChapProcessCommandIds), | 433 LIST_ELEMENT_INFO(kWebMIdChapterDisplay, 4, kChapterDisplayIds), |
411 LIST_ELEMENT_INFO(kWebMIdTags, 1, kTagsIds), | 434 LIST_ELEMENT_INFO(kWebMIdChapProcess, 4, kChapProcessIds), |
412 LIST_ELEMENT_INFO(kWebMIdTag, 2, kTagIds), | 435 LIST_ELEMENT_INFO(kWebMIdChapProcessCommand, 5, kChapProcessCommandIds), |
413 LIST_ELEMENT_INFO(kWebMIdTargets, 3, kTargetsIds), | 436 LIST_ELEMENT_INFO(kWebMIdTags, 1, kTagsIds), |
414 LIST_ELEMENT_INFO(kWebMIdSimpleTag, 3, kSimpleTagIds), | 437 LIST_ELEMENT_INFO(kWebMIdTag, 2, kTagIds), |
| 438 LIST_ELEMENT_INFO(kWebMIdTargets, 3, kTargetsIds), |
| 439 LIST_ELEMENT_INFO(kWebMIdSimpleTag, 3, kSimpleTagIds), |
| 440 LIST_ELEMENT_INFO(kWebMIdColour, 4, kColourIds), |
| 441 LIST_ELEMENT_INFO(kWebMIdMasteringMetadata, 5, kMasteringMetadataIds), |
415 }; | 442 }; |
416 | 443 |
417 // Parses an element header id or size field. These fields are variable length | 444 // Parses an element header id or size field. These fields are variable length |
418 // encoded. The first byte indicates how many bytes the field occupies. | 445 // encoded. The first byte indicates how many bytes the field occupies. |
419 // |buf| - The buffer to parse. | 446 // |buf| - The buffer to parse. |
420 // |size| - The number of bytes in |buf| | 447 // |size| - The number of bytes in |buf| |
421 // |max_bytes| - The maximum number of bytes the field can be. ID fields | 448 // |max_bytes| - The maximum number of bytes the field can be. ID fields |
422 // set this to 4 & element size fields set this to 8. If the | 449 // set this to 4 & element size fields set this to 8. If the |
423 // first byte indicates a larger field size than this it is a | 450 // first byte indicates a larger field size than this it is a |
424 // parser error. | 451 // parser error. |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
966 if (kSegmentIds[i].id_ == id_b) | 993 if (kSegmentIds[i].id_ == id_b) |
967 return true; | 994 return true; |
968 } | 995 } |
969 } | 996 } |
970 | 997 |
971 // kWebMIdSegment siblings. | 998 // kWebMIdSegment siblings. |
972 return ((id_b == kWebMIdSegment) || (id_b == kWebMIdEBMLHeader)); | 999 return ((id_b == kWebMIdSegment) || (id_b == kWebMIdEBMLHeader)); |
973 } | 1000 } |
974 | 1001 |
975 } // namespace media | 1002 } // namespace media |
OLD | NEW |