1*103e46e4SHarish Mahendrakar // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2*103e46e4SHarish Mahendrakar //
3*103e46e4SHarish Mahendrakar // Use of this source code is governed by a BSD-style license
4*103e46e4SHarish Mahendrakar // that can be found in the LICENSE file in the root of the source
5*103e46e4SHarish Mahendrakar // tree. An additional intellectual property rights grant can be found
6*103e46e4SHarish Mahendrakar // in the file PATENTS. All contributing project authors may
7*103e46e4SHarish Mahendrakar // be found in the AUTHORS file in the root of the source tree.
8*103e46e4SHarish Mahendrakar #include "src/ancestory.h"
9*103e46e4SHarish Mahendrakar
10*103e46e4SHarish Mahendrakar #include "webm/id.h"
11*103e46e4SHarish Mahendrakar
12*103e46e4SHarish Mahendrakar namespace webm {
13*103e46e4SHarish Mahendrakar
ById(Id id,Ancestory * ancestory)14*103e46e4SHarish Mahendrakar bool Ancestory::ById(Id id, Ancestory* ancestory) {
15*103e46e4SHarish Mahendrakar // These lists of IDs were generated and must match the switch statement and
16*103e46e4SHarish Mahendrakar // have static storage duration. They were generated as follows:
17*103e46e4SHarish Mahendrakar //
18*103e46e4SHarish Mahendrakar // 1. List all the master elements:
19*103e46e4SHarish Mahendrakar // kEbml
20*103e46e4SHarish Mahendrakar // kSegment
21*103e46e4SHarish Mahendrakar // kSeekHead
22*103e46e4SHarish Mahendrakar // kSeek
23*103e46e4SHarish Mahendrakar // kInfo
24*103e46e4SHarish Mahendrakar // kCluster
25*103e46e4SHarish Mahendrakar // kBlockGroup
26*103e46e4SHarish Mahendrakar // kBlockAdditions
27*103e46e4SHarish Mahendrakar // kBlockMore
28*103e46e4SHarish Mahendrakar // kSlices
29*103e46e4SHarish Mahendrakar // kTimeSlice
30*103e46e4SHarish Mahendrakar // etc.
31*103e46e4SHarish Mahendrakar //
32*103e46e4SHarish Mahendrakar // 2. Now prefix each entry with its full ancestory:
33*103e46e4SHarish Mahendrakar // kEbml
34*103e46e4SHarish Mahendrakar // kSegment
35*103e46e4SHarish Mahendrakar // kSegment, kSeekHead
36*103e46e4SHarish Mahendrakar // kSegment, kSeekHead, kSeek
37*103e46e4SHarish Mahendrakar // kSegment, kInfo
38*103e46e4SHarish Mahendrakar // kSegment, kCluster
39*103e46e4SHarish Mahendrakar // kSegment, kCluster, kBlockGroup
40*103e46e4SHarish Mahendrakar // kSegment, kCluster, kBlockGroup, kBlockAdditions
41*103e46e4SHarish Mahendrakar // kSegment, kCluster, kBlockGroup, kBlockAdditions, kBlockMore
42*103e46e4SHarish Mahendrakar // kSegment, kCluster, kBlockGroup, kSlices
43*103e46e4SHarish Mahendrakar // kSegment, kCluster, kBlockGroup, kSlices, kTimeSlice
44*103e46e4SHarish Mahendrakar // etc.
45*103e46e4SHarish Mahendrakar //
46*103e46e4SHarish Mahendrakar // 3. Now remove entries that are just subsets of others:
47*103e46e4SHarish Mahendrakar // kEbml
48*103e46e4SHarish Mahendrakar // kSegment, kSeekHead, kSeek
49*103e46e4SHarish Mahendrakar // kSegment, kInfo
50*103e46e4SHarish Mahendrakar // kSegment, kCluster, kBlockGroup, kBlockAdditions, kBlockMore
51*103e46e4SHarish Mahendrakar // kSegment, kCluster, kBlockGroup, kSlices, kTimeSlice
52*103e46e4SHarish Mahendrakar // etc.
53*103e46e4SHarish Mahendrakar static constexpr Id kEbmlAncestory[] = {
54*103e46e4SHarish Mahendrakar Id::kEbml,
55*103e46e4SHarish Mahendrakar };
56*103e46e4SHarish Mahendrakar static constexpr Id kSeekAncestory[] = {
57*103e46e4SHarish Mahendrakar Id::kSegment,
58*103e46e4SHarish Mahendrakar Id::kSeekHead,
59*103e46e4SHarish Mahendrakar Id::kSeek,
60*103e46e4SHarish Mahendrakar };
61*103e46e4SHarish Mahendrakar static constexpr Id kInfoAncestory[] = {
62*103e46e4SHarish Mahendrakar Id::kSegment,
63*103e46e4SHarish Mahendrakar Id::kInfo,
64*103e46e4SHarish Mahendrakar };
65*103e46e4SHarish Mahendrakar static constexpr Id kBlockMoreAncestory[] = {
66*103e46e4SHarish Mahendrakar Id::kSegment, Id::kCluster, Id::kBlockGroup,
67*103e46e4SHarish Mahendrakar Id::kBlockAdditions, Id::kBlockMore,
68*103e46e4SHarish Mahendrakar };
69*103e46e4SHarish Mahendrakar static constexpr Id kTimeSliceAncestory[] = {
70*103e46e4SHarish Mahendrakar Id::kSegment, Id::kCluster, Id::kBlockGroup, Id::kSlices, Id::kTimeSlice,
71*103e46e4SHarish Mahendrakar };
72*103e46e4SHarish Mahendrakar static constexpr Id kVideoAncestory[] = {
73*103e46e4SHarish Mahendrakar Id::kSegment,
74*103e46e4SHarish Mahendrakar Id::kTracks,
75*103e46e4SHarish Mahendrakar Id::kTrackEntry,
76*103e46e4SHarish Mahendrakar Id::kVideo,
77*103e46e4SHarish Mahendrakar };
78*103e46e4SHarish Mahendrakar static constexpr Id kAudioAncestory[] = {
79*103e46e4SHarish Mahendrakar Id::kSegment,
80*103e46e4SHarish Mahendrakar Id::kTracks,
81*103e46e4SHarish Mahendrakar Id::kTrackEntry,
82*103e46e4SHarish Mahendrakar Id::kAudio,
83*103e46e4SHarish Mahendrakar };
84*103e46e4SHarish Mahendrakar static constexpr Id kContentEncAesSettingsAncestory[] = {
85*103e46e4SHarish Mahendrakar Id::kSegment,
86*103e46e4SHarish Mahendrakar Id::kTracks,
87*103e46e4SHarish Mahendrakar Id::kTrackEntry,
88*103e46e4SHarish Mahendrakar Id::kContentEncodings,
89*103e46e4SHarish Mahendrakar Id::kContentEncoding,
90*103e46e4SHarish Mahendrakar Id::kContentEncryption,
91*103e46e4SHarish Mahendrakar Id::kContentEncAesSettings,
92*103e46e4SHarish Mahendrakar };
93*103e46e4SHarish Mahendrakar static constexpr Id kCueTrackPositionsAncestory[] = {
94*103e46e4SHarish Mahendrakar Id::kSegment,
95*103e46e4SHarish Mahendrakar Id::kCues,
96*103e46e4SHarish Mahendrakar Id::kCuePoint,
97*103e46e4SHarish Mahendrakar Id::kCueTrackPositions,
98*103e46e4SHarish Mahendrakar };
99*103e46e4SHarish Mahendrakar static constexpr Id kChapterDisplayAncestory[] = {
100*103e46e4SHarish Mahendrakar Id::kSegment, Id::kChapters, Id::kEditionEntry,
101*103e46e4SHarish Mahendrakar Id::kChapterAtom, Id::kChapterDisplay,
102*103e46e4SHarish Mahendrakar };
103*103e46e4SHarish Mahendrakar static constexpr Id kTargetsAncestory[] = {
104*103e46e4SHarish Mahendrakar Id::kSegment,
105*103e46e4SHarish Mahendrakar Id::kTags,
106*103e46e4SHarish Mahendrakar Id::kTag,
107*103e46e4SHarish Mahendrakar Id::kTargets,
108*103e46e4SHarish Mahendrakar };
109*103e46e4SHarish Mahendrakar static constexpr Id kSimpleTagAncestory[] = {
110*103e46e4SHarish Mahendrakar Id::kSegment,
111*103e46e4SHarish Mahendrakar Id::kTags,
112*103e46e4SHarish Mahendrakar Id::kTag,
113*103e46e4SHarish Mahendrakar Id::kSimpleTag,
114*103e46e4SHarish Mahendrakar };
115*103e46e4SHarish Mahendrakar
116*103e46e4SHarish Mahendrakar switch (id) {
117*103e46e4SHarish Mahendrakar case Id::kEbmlVersion:
118*103e46e4SHarish Mahendrakar case Id::kEbmlReadVersion:
119*103e46e4SHarish Mahendrakar case Id::kEbmlMaxIdLength:
120*103e46e4SHarish Mahendrakar case Id::kEbmlMaxSizeLength:
121*103e46e4SHarish Mahendrakar case Id::kDocType:
122*103e46e4SHarish Mahendrakar case Id::kDocTypeVersion:
123*103e46e4SHarish Mahendrakar case Id::kDocTypeReadVersion:
124*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kEbmlAncestory, 1);
125*103e46e4SHarish Mahendrakar return true;
126*103e46e4SHarish Mahendrakar
127*103e46e4SHarish Mahendrakar case Id::kSeekHead:
128*103e46e4SHarish Mahendrakar case Id::kInfo:
129*103e46e4SHarish Mahendrakar case Id::kCluster:
130*103e46e4SHarish Mahendrakar case Id::kTracks:
131*103e46e4SHarish Mahendrakar case Id::kCues:
132*103e46e4SHarish Mahendrakar case Id::kChapters:
133*103e46e4SHarish Mahendrakar case Id::kTags:
134*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kSeekAncestory, 1);
135*103e46e4SHarish Mahendrakar return true;
136*103e46e4SHarish Mahendrakar
137*103e46e4SHarish Mahendrakar case Id::kSeek:
138*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kSeekAncestory, 2);
139*103e46e4SHarish Mahendrakar return true;
140*103e46e4SHarish Mahendrakar
141*103e46e4SHarish Mahendrakar case Id::kSeekId:
142*103e46e4SHarish Mahendrakar case Id::kSeekPosition:
143*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kSeekAncestory, 3);
144*103e46e4SHarish Mahendrakar return true;
145*103e46e4SHarish Mahendrakar
146*103e46e4SHarish Mahendrakar case Id::kTimecodeScale:
147*103e46e4SHarish Mahendrakar case Id::kDuration:
148*103e46e4SHarish Mahendrakar case Id::kDateUtc:
149*103e46e4SHarish Mahendrakar case Id::kTitle:
150*103e46e4SHarish Mahendrakar case Id::kMuxingApp:
151*103e46e4SHarish Mahendrakar case Id::kWritingApp:
152*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kInfoAncestory, 2);
153*103e46e4SHarish Mahendrakar return true;
154*103e46e4SHarish Mahendrakar
155*103e46e4SHarish Mahendrakar case Id::kTimecode:
156*103e46e4SHarish Mahendrakar case Id::kPrevSize:
157*103e46e4SHarish Mahendrakar case Id::kSimpleBlock:
158*103e46e4SHarish Mahendrakar case Id::kBlockGroup:
159*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kBlockMoreAncestory, 2);
160*103e46e4SHarish Mahendrakar return true;
161*103e46e4SHarish Mahendrakar
162*103e46e4SHarish Mahendrakar case Id::kBlock:
163*103e46e4SHarish Mahendrakar case Id::kBlockVirtual:
164*103e46e4SHarish Mahendrakar case Id::kBlockAdditions:
165*103e46e4SHarish Mahendrakar case Id::kBlockDuration:
166*103e46e4SHarish Mahendrakar case Id::kReferenceBlock:
167*103e46e4SHarish Mahendrakar case Id::kDiscardPadding:
168*103e46e4SHarish Mahendrakar case Id::kSlices:
169*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kBlockMoreAncestory, 3);
170*103e46e4SHarish Mahendrakar return true;
171*103e46e4SHarish Mahendrakar
172*103e46e4SHarish Mahendrakar case Id::kBlockMore:
173*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kBlockMoreAncestory, 4);
174*103e46e4SHarish Mahendrakar return true;
175*103e46e4SHarish Mahendrakar
176*103e46e4SHarish Mahendrakar case Id::kBlockAddId:
177*103e46e4SHarish Mahendrakar case Id::kBlockAdditional:
178*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kBlockMoreAncestory, 5);
179*103e46e4SHarish Mahendrakar return true;
180*103e46e4SHarish Mahendrakar
181*103e46e4SHarish Mahendrakar case Id::kTimeSlice:
182*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kTimeSliceAncestory, 4);
183*103e46e4SHarish Mahendrakar return true;
184*103e46e4SHarish Mahendrakar
185*103e46e4SHarish Mahendrakar case Id::kLaceNumber:
186*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kTimeSliceAncestory, 5);
187*103e46e4SHarish Mahendrakar return true;
188*103e46e4SHarish Mahendrakar
189*103e46e4SHarish Mahendrakar case Id::kTrackEntry:
190*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kVideoAncestory, 2);
191*103e46e4SHarish Mahendrakar return true;
192*103e46e4SHarish Mahendrakar
193*103e46e4SHarish Mahendrakar case Id::kTrackNumber:
194*103e46e4SHarish Mahendrakar case Id::kTrackUid:
195*103e46e4SHarish Mahendrakar case Id::kTrackType:
196*103e46e4SHarish Mahendrakar case Id::kFlagEnabled:
197*103e46e4SHarish Mahendrakar case Id::kFlagDefault:
198*103e46e4SHarish Mahendrakar case Id::kFlagForced:
199*103e46e4SHarish Mahendrakar case Id::kFlagLacing:
200*103e46e4SHarish Mahendrakar case Id::kDefaultDuration:
201*103e46e4SHarish Mahendrakar case Id::kName:
202*103e46e4SHarish Mahendrakar case Id::kLanguage:
203*103e46e4SHarish Mahendrakar case Id::kCodecId:
204*103e46e4SHarish Mahendrakar case Id::kCodecPrivate:
205*103e46e4SHarish Mahendrakar case Id::kCodecName:
206*103e46e4SHarish Mahendrakar case Id::kCodecDelay:
207*103e46e4SHarish Mahendrakar case Id::kSeekPreRoll:
208*103e46e4SHarish Mahendrakar case Id::kVideo:
209*103e46e4SHarish Mahendrakar case Id::kAudio:
210*103e46e4SHarish Mahendrakar case Id::kContentEncodings:
211*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kVideoAncestory, 3);
212*103e46e4SHarish Mahendrakar return true;
213*103e46e4SHarish Mahendrakar
214*103e46e4SHarish Mahendrakar case Id::kFlagInterlaced:
215*103e46e4SHarish Mahendrakar case Id::kStereoMode:
216*103e46e4SHarish Mahendrakar case Id::kAlphaMode:
217*103e46e4SHarish Mahendrakar case Id::kPixelWidth:
218*103e46e4SHarish Mahendrakar case Id::kPixelHeight:
219*103e46e4SHarish Mahendrakar case Id::kPixelCropBottom:
220*103e46e4SHarish Mahendrakar case Id::kPixelCropTop:
221*103e46e4SHarish Mahendrakar case Id::kPixelCropLeft:
222*103e46e4SHarish Mahendrakar case Id::kPixelCropRight:
223*103e46e4SHarish Mahendrakar case Id::kDisplayWidth:
224*103e46e4SHarish Mahendrakar case Id::kDisplayHeight:
225*103e46e4SHarish Mahendrakar case Id::kDisplayUnit:
226*103e46e4SHarish Mahendrakar case Id::kAspectRatioType:
227*103e46e4SHarish Mahendrakar case Id::kFrameRate:
228*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kVideoAncestory, 4);
229*103e46e4SHarish Mahendrakar return true;
230*103e46e4SHarish Mahendrakar
231*103e46e4SHarish Mahendrakar case Id::kSamplingFrequency:
232*103e46e4SHarish Mahendrakar case Id::kOutputSamplingFrequency:
233*103e46e4SHarish Mahendrakar case Id::kChannels:
234*103e46e4SHarish Mahendrakar case Id::kBitDepth:
235*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kAudioAncestory, 4);
236*103e46e4SHarish Mahendrakar return true;
237*103e46e4SHarish Mahendrakar
238*103e46e4SHarish Mahendrakar case Id::kContentEncoding:
239*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kContentEncAesSettingsAncestory, 4);
240*103e46e4SHarish Mahendrakar return true;
241*103e46e4SHarish Mahendrakar
242*103e46e4SHarish Mahendrakar case Id::kContentEncodingOrder:
243*103e46e4SHarish Mahendrakar case Id::kContentEncodingScope:
244*103e46e4SHarish Mahendrakar case Id::kContentEncodingType:
245*103e46e4SHarish Mahendrakar case Id::kContentEncryption:
246*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kContentEncAesSettingsAncestory, 5);
247*103e46e4SHarish Mahendrakar return true;
248*103e46e4SHarish Mahendrakar
249*103e46e4SHarish Mahendrakar case Id::kContentEncAlgo:
250*103e46e4SHarish Mahendrakar case Id::kContentEncKeyId:
251*103e46e4SHarish Mahendrakar case Id::kContentEncAesSettings:
252*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kContentEncAesSettingsAncestory, 6);
253*103e46e4SHarish Mahendrakar return true;
254*103e46e4SHarish Mahendrakar
255*103e46e4SHarish Mahendrakar case Id::kAesSettingsCipherMode:
256*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kContentEncAesSettingsAncestory, 7);
257*103e46e4SHarish Mahendrakar return true;
258*103e46e4SHarish Mahendrakar
259*103e46e4SHarish Mahendrakar case Id::kCuePoint:
260*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kCueTrackPositionsAncestory, 2);
261*103e46e4SHarish Mahendrakar return true;
262*103e46e4SHarish Mahendrakar
263*103e46e4SHarish Mahendrakar case Id::kCueTime:
264*103e46e4SHarish Mahendrakar case Id::kCueTrackPositions:
265*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kCueTrackPositionsAncestory, 3);
266*103e46e4SHarish Mahendrakar return true;
267*103e46e4SHarish Mahendrakar
268*103e46e4SHarish Mahendrakar case Id::kCueTrack:
269*103e46e4SHarish Mahendrakar case Id::kCueClusterPosition:
270*103e46e4SHarish Mahendrakar case Id::kCueRelativePosition:
271*103e46e4SHarish Mahendrakar case Id::kCueDuration:
272*103e46e4SHarish Mahendrakar case Id::kCueBlockNumber:
273*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kCueTrackPositionsAncestory, 4);
274*103e46e4SHarish Mahendrakar return true;
275*103e46e4SHarish Mahendrakar
276*103e46e4SHarish Mahendrakar case Id::kEditionEntry:
277*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kChapterDisplayAncestory, 2);
278*103e46e4SHarish Mahendrakar return true;
279*103e46e4SHarish Mahendrakar
280*103e46e4SHarish Mahendrakar case Id::kChapterAtom:
281*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kChapterDisplayAncestory, 3);
282*103e46e4SHarish Mahendrakar return true;
283*103e46e4SHarish Mahendrakar
284*103e46e4SHarish Mahendrakar case Id::kChapterUid:
285*103e46e4SHarish Mahendrakar case Id::kChapterStringUid:
286*103e46e4SHarish Mahendrakar case Id::kChapterTimeStart:
287*103e46e4SHarish Mahendrakar case Id::kChapterTimeEnd:
288*103e46e4SHarish Mahendrakar case Id::kChapterDisplay:
289*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kChapterDisplayAncestory, 4);
290*103e46e4SHarish Mahendrakar return true;
291*103e46e4SHarish Mahendrakar
292*103e46e4SHarish Mahendrakar case Id::kChapString:
293*103e46e4SHarish Mahendrakar case Id::kChapLanguage:
294*103e46e4SHarish Mahendrakar case Id::kChapCountry:
295*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kChapterDisplayAncestory, 5);
296*103e46e4SHarish Mahendrakar return true;
297*103e46e4SHarish Mahendrakar
298*103e46e4SHarish Mahendrakar case Id::kTag:
299*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kTargetsAncestory, 2);
300*103e46e4SHarish Mahendrakar return true;
301*103e46e4SHarish Mahendrakar
302*103e46e4SHarish Mahendrakar case Id::kTargets:
303*103e46e4SHarish Mahendrakar case Id::kSimpleTag:
304*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kTargetsAncestory, 3);
305*103e46e4SHarish Mahendrakar return true;
306*103e46e4SHarish Mahendrakar
307*103e46e4SHarish Mahendrakar case Id::kTargetTypeValue:
308*103e46e4SHarish Mahendrakar case Id::kTargetType:
309*103e46e4SHarish Mahendrakar case Id::kTagTrackUid:
310*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kTargetsAncestory, 4);
311*103e46e4SHarish Mahendrakar return true;
312*103e46e4SHarish Mahendrakar
313*103e46e4SHarish Mahendrakar case Id::kTagName:
314*103e46e4SHarish Mahendrakar case Id::kTagLanguage:
315*103e46e4SHarish Mahendrakar case Id::kTagDefault:
316*103e46e4SHarish Mahendrakar case Id::kTagString:
317*103e46e4SHarish Mahendrakar case Id::kTagBinary:
318*103e46e4SHarish Mahendrakar *ancestory = Ancestory(kSimpleTagAncestory, 4);
319*103e46e4SHarish Mahendrakar return true;
320*103e46e4SHarish Mahendrakar
321*103e46e4SHarish Mahendrakar case Id::kEbml:
322*103e46e4SHarish Mahendrakar case Id::kSegment:
323*103e46e4SHarish Mahendrakar *ancestory = {};
324*103e46e4SHarish Mahendrakar return true;
325*103e46e4SHarish Mahendrakar
326*103e46e4SHarish Mahendrakar default:
327*103e46e4SHarish Mahendrakar // This is an unknown element or a global element (i.e. Void); its
328*103e46e4SHarish Mahendrakar // ancestory cannot be deduced.
329*103e46e4SHarish Mahendrakar *ancestory = {};
330*103e46e4SHarish Mahendrakar return false;
331*103e46e4SHarish Mahendrakar }
332*103e46e4SHarish Mahendrakar }
333*103e46e4SHarish Mahendrakar
334*103e46e4SHarish Mahendrakar } // namespace webm
335