| // Copyright (c) 2016 The WebM project authors. All Rights Reserved. |
| // |
| // Use of this source code is governed by a BSD-style license |
| // that can be found in the LICENSE file in the root of the source |
| // tree. An additional intellectual property rights grant can be found |
| // in the file PATENTS. All contributing project authors may |
| // be found in the AUTHORS file in the root of the source tree. |
| #include "src/ancestory.h" |
| |
| #include "webm/id.h" |
| |
| namespace webm { |
| |
| bool Ancestory::ById(Id id, Ancestory* ancestory) { |
| // These lists of IDs were generated and must match the switch statement and |
| // have static storage duration. They were generated as follows: |
| // |
| // 1. List all the master elements: |
| // kEbml |
| // kSegment |
| // kSeekHead |
| // kSeek |
| // kInfo |
| // kCluster |
| // kBlockGroup |
| // kBlockAdditions |
| // kBlockMore |
| // kSlices |
| // kTimeSlice |
| // etc. |
| // |
| // 2. Now prefix each entry with its full ancestory: |
| // kEbml |
| // kSegment |
| // kSegment, kSeekHead |
| // kSegment, kSeekHead, kSeek |
| // kSegment, kInfo |
| // kSegment, kCluster |
| // kSegment, kCluster, kBlockGroup |
| // kSegment, kCluster, kBlockGroup, kBlockAdditions |
| // kSegment, kCluster, kBlockGroup, kBlockAdditions, kBlockMore |
| // kSegment, kCluster, kBlockGroup, kSlices |
| // kSegment, kCluster, kBlockGroup, kSlices, kTimeSlice |
| // etc. |
| // |
| // 3. Now remove entries that are just subsets of others: |
| // kEbml |
| // kSegment, kSeekHead, kSeek |
| // kSegment, kInfo |
| // kSegment, kCluster, kBlockGroup, kBlockAdditions, kBlockMore |
| // kSegment, kCluster, kBlockGroup, kSlices, kTimeSlice |
| // etc. |
| static constexpr Id kEbmlAncestory[] = { |
| Id::kEbml, |
| }; |
| static constexpr Id kSeekAncestory[] = { |
| Id::kSegment, Id::kSeekHead, Id::kSeek, |
| }; |
| static constexpr Id kInfoAncestory[] = { |
| Id::kSegment, Id::kInfo, |
| }; |
| static constexpr Id kBlockMoreAncestory[] = { |
| Id::kSegment, Id::kCluster, Id::kBlockGroup, |
| Id::kBlockAdditions, Id::kBlockMore, |
| }; |
| static constexpr Id kTimeSliceAncestory[] = { |
| Id::kSegment, Id::kCluster, Id::kBlockGroup, Id::kSlices, Id::kTimeSlice, |
| }; |
| static constexpr Id kVideoAncestory[] = { |
| Id::kSegment, Id::kTracks, Id::kTrackEntry, Id::kVideo, |
| }; |
| static constexpr Id kAudioAncestory[] = { |
| Id::kSegment, Id::kTracks, Id::kTrackEntry, Id::kAudio, |
| }; |
| static constexpr Id kContentEncAesSettingsAncestory[] = { |
| Id::kSegment, |
| Id::kTracks, |
| Id::kTrackEntry, |
| Id::kContentEncodings, |
| Id::kContentEncoding, |
| Id::kContentEncryption, |
| Id::kContentEncAesSettings, |
| }; |
| static constexpr Id kCueTrackPositionsAncestory[] = { |
| Id::kSegment, Id::kCues, Id::kCuePoint, Id::kCueTrackPositions, |
| }; |
| static constexpr Id kChapterDisplayAncestory[] = { |
| Id::kSegment, Id::kChapters, Id::kEditionEntry, |
| Id::kChapterAtom, Id::kChapterDisplay, |
| }; |
| static constexpr Id kTargetsAncestory[] = { |
| Id::kSegment, Id::kTags, Id::kTag, Id::kTargets, |
| }; |
| static constexpr Id kSimpleTagAncestory[] = { |
| Id::kSegment, Id::kTags, Id::kTag, Id::kSimpleTag, |
| }; |
| |
| switch (id) { |
| case Id::kEbmlVersion: |
| case Id::kEbmlReadVersion: |
| case Id::kEbmlMaxIdLength: |
| case Id::kEbmlMaxSizeLength: |
| case Id::kDocType: |
| case Id::kDocTypeVersion: |
| case Id::kDocTypeReadVersion: |
| *ancestory = Ancestory(kEbmlAncestory, 1); |
| return true; |
| |
| case Id::kSeekHead: |
| case Id::kInfo: |
| case Id::kCluster: |
| case Id::kTracks: |
| case Id::kCues: |
| case Id::kChapters: |
| case Id::kTags: |
| *ancestory = Ancestory(kSeekAncestory, 1); |
| return true; |
| |
| case Id::kSeek: |
| *ancestory = Ancestory(kSeekAncestory, 2); |
| return true; |
| |
| case Id::kSeekId: |
| case Id::kSeekPosition: |
| *ancestory = Ancestory(kSeekAncestory, 3); |
| return true; |
| |
| case Id::kTimecodeScale: |
| case Id::kDuration: |
| case Id::kDateUtc: |
| case Id::kTitle: |
| case Id::kMuxingApp: |
| case Id::kWritingApp: |
| *ancestory = Ancestory(kInfoAncestory, 2); |
| return true; |
| |
| case Id::kTimecode: |
| case Id::kPrevSize: |
| case Id::kSimpleBlock: |
| case Id::kBlockGroup: |
| *ancestory = Ancestory(kBlockMoreAncestory, 2); |
| return true; |
| |
| case Id::kBlock: |
| case Id::kBlockVirtual: |
| case Id::kBlockAdditions: |
| case Id::kBlockDuration: |
| case Id::kReferenceBlock: |
| case Id::kDiscardPadding: |
| case Id::kSlices: |
| *ancestory = Ancestory(kBlockMoreAncestory, 3); |
| return true; |
| |
| case Id::kBlockMore: |
| *ancestory = Ancestory(kBlockMoreAncestory, 4); |
| return true; |
| |
| case Id::kBlockAddId: |
| case Id::kBlockAdditional: |
| *ancestory = Ancestory(kBlockMoreAncestory, 5); |
| return true; |
| |
| case Id::kTimeSlice: |
| *ancestory = Ancestory(kTimeSliceAncestory, 4); |
| return true; |
| |
| case Id::kLaceNumber: |
| *ancestory = Ancestory(kTimeSliceAncestory, 5); |
| return true; |
| |
| case Id::kTrackEntry: |
| *ancestory = Ancestory(kVideoAncestory, 2); |
| return true; |
| |
| case Id::kTrackNumber: |
| case Id::kTrackUid: |
| case Id::kTrackType: |
| case Id::kFlagEnabled: |
| case Id::kFlagDefault: |
| case Id::kFlagForced: |
| case Id::kFlagLacing: |
| case Id::kDefaultDuration: |
| case Id::kName: |
| case Id::kLanguage: |
| case Id::kCodecId: |
| case Id::kCodecPrivate: |
| case Id::kCodecName: |
| case Id::kCodecDelay: |
| case Id::kSeekPreRoll: |
| case Id::kVideo: |
| case Id::kAudio: |
| case Id::kContentEncodings: |
| *ancestory = Ancestory(kVideoAncestory, 3); |
| return true; |
| |
| case Id::kFlagInterlaced: |
| case Id::kStereoMode: |
| case Id::kAlphaMode: |
| case Id::kPixelWidth: |
| case Id::kPixelHeight: |
| case Id::kPixelCropBottom: |
| case Id::kPixelCropTop: |
| case Id::kPixelCropLeft: |
| case Id::kPixelCropRight: |
| case Id::kDisplayWidth: |
| case Id::kDisplayHeight: |
| case Id::kDisplayUnit: |
| case Id::kAspectRatioType: |
| case Id::kFrameRate: |
| *ancestory = Ancestory(kVideoAncestory, 4); |
| return true; |
| |
| case Id::kSamplingFrequency: |
| case Id::kOutputSamplingFrequency: |
| case Id::kChannels: |
| case Id::kBitDepth: |
| *ancestory = Ancestory(kAudioAncestory, 4); |
| return true; |
| |
| case Id::kContentEncoding: |
| *ancestory = Ancestory(kContentEncAesSettingsAncestory, 4); |
| return true; |
| |
| case Id::kContentEncodingOrder: |
| case Id::kContentEncodingScope: |
| case Id::kContentEncodingType: |
| case Id::kContentEncryption: |
| *ancestory = Ancestory(kContentEncAesSettingsAncestory, 5); |
| return true; |
| |
| case Id::kContentEncAlgo: |
| case Id::kContentEncKeyId: |
| case Id::kContentEncAesSettings: |
| *ancestory = Ancestory(kContentEncAesSettingsAncestory, 6); |
| return true; |
| |
| case Id::kAesSettingsCipherMode: |
| *ancestory = Ancestory(kContentEncAesSettingsAncestory, 7); |
| return true; |
| |
| case Id::kCuePoint: |
| *ancestory = Ancestory(kCueTrackPositionsAncestory, 2); |
| return true; |
| |
| case Id::kCueTime: |
| case Id::kCueTrackPositions: |
| *ancestory = Ancestory(kCueTrackPositionsAncestory, 3); |
| return true; |
| |
| case Id::kCueTrack: |
| case Id::kCueClusterPosition: |
| case Id::kCueRelativePosition: |
| case Id::kCueDuration: |
| case Id::kCueBlockNumber: |
| *ancestory = Ancestory(kCueTrackPositionsAncestory, 4); |
| return true; |
| |
| case Id::kEditionEntry: |
| *ancestory = Ancestory(kChapterDisplayAncestory, 2); |
| return true; |
| |
| case Id::kChapterAtom: |
| *ancestory = Ancestory(kChapterDisplayAncestory, 3); |
| return true; |
| |
| case Id::kChapterUid: |
| case Id::kChapterStringUid: |
| case Id::kChapterTimeStart: |
| case Id::kChapterTimeEnd: |
| case Id::kChapterDisplay: |
| *ancestory = Ancestory(kChapterDisplayAncestory, 4); |
| return true; |
| |
| case Id::kChapString: |
| case Id::kChapLanguage: |
| case Id::kChapCountry: |
| *ancestory = Ancestory(kChapterDisplayAncestory, 5); |
| return true; |
| |
| case Id::kTag: |
| *ancestory = Ancestory(kTargetsAncestory, 2); |
| return true; |
| |
| case Id::kTargets: |
| case Id::kSimpleTag: |
| *ancestory = Ancestory(kTargetsAncestory, 3); |
| return true; |
| |
| case Id::kTargetTypeValue: |
| case Id::kTargetType: |
| case Id::kTagTrackUid: |
| *ancestory = Ancestory(kTargetsAncestory, 4); |
| return true; |
| |
| case Id::kTagName: |
| case Id::kTagLanguage: |
| case Id::kTagDefault: |
| case Id::kTagString: |
| case Id::kTagBinary: |
| *ancestory = Ancestory(kSimpleTagAncestory, 4); |
| return true; |
| |
| case Id::kEbml: |
| case Id::kSegment: |
| *ancestory = {}; |
| return true; |
| |
| default: |
| // This is an unknown element or a global element (i.e. Void); its |
| // ancestory cannot be deduced. |
| *ancestory = {}; |
| return false; |
| } |
| } |
| |
| } // namespace webm |