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 <cstdio>
9*103e46e4SHarish Mahendrakar #include <cstdlib>
10*103e46e4SHarish Mahendrakar #include <iomanip>
11*103e46e4SHarish Mahendrakar #include <iostream>
12*103e46e4SHarish Mahendrakar
13*103e46e4SHarish Mahendrakar #include "webm/callback.h"
14*103e46e4SHarish Mahendrakar #include "webm/file_reader.h"
15*103e46e4SHarish Mahendrakar #include "webm/status.h"
16*103e46e4SHarish Mahendrakar #include "webm/webm_parser.h"
17*103e46e4SHarish Mahendrakar
18*103e46e4SHarish Mahendrakar // We use pretty much everything in the webm namespace. Just pull
19*103e46e4SHarish Mahendrakar // it all in.
20*103e46e4SHarish Mahendrakar using namespace webm; // NOLINT
21*103e46e4SHarish Mahendrakar
22*103e46e4SHarish Mahendrakar template <typename T>
PrintUnknownEnumValue(std::ostream & os,T value)23*103e46e4SHarish Mahendrakar std::ostream& PrintUnknownEnumValue(std::ostream& os, T value) {
24*103e46e4SHarish Mahendrakar return os << std::to_string(static_cast<std::uint64_t>(value)) << " (?)";
25*103e46e4SHarish Mahendrakar }
26*103e46e4SHarish Mahendrakar
27*103e46e4SHarish Mahendrakar // Overloads for operator<< for pretty printing enums.
operator <<(std::ostream & os,Id id)28*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, Id id) {
29*103e46e4SHarish Mahendrakar switch (id) {
30*103e46e4SHarish Mahendrakar case Id::kEbml:
31*103e46e4SHarish Mahendrakar return os << "EBML";
32*103e46e4SHarish Mahendrakar case Id::kEbmlVersion:
33*103e46e4SHarish Mahendrakar return os << "EBMLVersion";
34*103e46e4SHarish Mahendrakar case Id::kEbmlReadVersion:
35*103e46e4SHarish Mahendrakar return os << "EBMLReadVersion";
36*103e46e4SHarish Mahendrakar case Id::kEbmlMaxIdLength:
37*103e46e4SHarish Mahendrakar return os << "EBMLMaxIDLength";
38*103e46e4SHarish Mahendrakar case Id::kEbmlMaxSizeLength:
39*103e46e4SHarish Mahendrakar return os << "EBMLMaxSizeLength";
40*103e46e4SHarish Mahendrakar case Id::kDocType:
41*103e46e4SHarish Mahendrakar return os << "DocType";
42*103e46e4SHarish Mahendrakar case Id::kDocTypeVersion:
43*103e46e4SHarish Mahendrakar return os << "DocTypeVersion";
44*103e46e4SHarish Mahendrakar case Id::kDocTypeReadVersion:
45*103e46e4SHarish Mahendrakar return os << "DocTypeReadVersion";
46*103e46e4SHarish Mahendrakar case Id::kVoid:
47*103e46e4SHarish Mahendrakar return os << "Void";
48*103e46e4SHarish Mahendrakar case Id::kSegment:
49*103e46e4SHarish Mahendrakar return os << "Segment";
50*103e46e4SHarish Mahendrakar case Id::kSeekHead:
51*103e46e4SHarish Mahendrakar return os << "SeekHead";
52*103e46e4SHarish Mahendrakar case Id::kSeek:
53*103e46e4SHarish Mahendrakar return os << "Seek";
54*103e46e4SHarish Mahendrakar case Id::kSeekId:
55*103e46e4SHarish Mahendrakar return os << "SeekID";
56*103e46e4SHarish Mahendrakar case Id::kSeekPosition:
57*103e46e4SHarish Mahendrakar return os << "SeekPosition";
58*103e46e4SHarish Mahendrakar case Id::kInfo:
59*103e46e4SHarish Mahendrakar return os << "Info";
60*103e46e4SHarish Mahendrakar case Id::kTimecodeScale:
61*103e46e4SHarish Mahendrakar return os << "TimecodeScale";
62*103e46e4SHarish Mahendrakar case Id::kDuration:
63*103e46e4SHarish Mahendrakar return os << "Duration";
64*103e46e4SHarish Mahendrakar case Id::kDateUtc:
65*103e46e4SHarish Mahendrakar return os << "DateUTC";
66*103e46e4SHarish Mahendrakar case Id::kTitle:
67*103e46e4SHarish Mahendrakar return os << "Title";
68*103e46e4SHarish Mahendrakar case Id::kMuxingApp:
69*103e46e4SHarish Mahendrakar return os << "MuxingApp";
70*103e46e4SHarish Mahendrakar case Id::kWritingApp:
71*103e46e4SHarish Mahendrakar return os << "WritingApp";
72*103e46e4SHarish Mahendrakar case Id::kCluster:
73*103e46e4SHarish Mahendrakar return os << "Cluster";
74*103e46e4SHarish Mahendrakar case Id::kTimecode:
75*103e46e4SHarish Mahendrakar return os << "Timecode";
76*103e46e4SHarish Mahendrakar case Id::kPrevSize:
77*103e46e4SHarish Mahendrakar return os << "PrevSize";
78*103e46e4SHarish Mahendrakar case Id::kSimpleBlock:
79*103e46e4SHarish Mahendrakar return os << "SimpleBlock";
80*103e46e4SHarish Mahendrakar case Id::kBlockGroup:
81*103e46e4SHarish Mahendrakar return os << "BlockGroup";
82*103e46e4SHarish Mahendrakar case Id::kBlock:
83*103e46e4SHarish Mahendrakar return os << "Block";
84*103e46e4SHarish Mahendrakar case Id::kBlockVirtual:
85*103e46e4SHarish Mahendrakar return os << "BlockVirtual";
86*103e46e4SHarish Mahendrakar case Id::kBlockAdditions:
87*103e46e4SHarish Mahendrakar return os << "BlockAdditions";
88*103e46e4SHarish Mahendrakar case Id::kBlockMore:
89*103e46e4SHarish Mahendrakar return os << "BlockMore";
90*103e46e4SHarish Mahendrakar case Id::kBlockAddId:
91*103e46e4SHarish Mahendrakar return os << "BlockAddID";
92*103e46e4SHarish Mahendrakar case Id::kBlockAdditional:
93*103e46e4SHarish Mahendrakar return os << "BlockAdditional";
94*103e46e4SHarish Mahendrakar case Id::kBlockDuration:
95*103e46e4SHarish Mahendrakar return os << "BlockDuration";
96*103e46e4SHarish Mahendrakar case Id::kReferenceBlock:
97*103e46e4SHarish Mahendrakar return os << "ReferenceBlock";
98*103e46e4SHarish Mahendrakar case Id::kDiscardPadding:
99*103e46e4SHarish Mahendrakar return os << "DiscardPadding";
100*103e46e4SHarish Mahendrakar case Id::kSlices:
101*103e46e4SHarish Mahendrakar return os << "Slices";
102*103e46e4SHarish Mahendrakar case Id::kTimeSlice:
103*103e46e4SHarish Mahendrakar return os << "TimeSlice";
104*103e46e4SHarish Mahendrakar case Id::kLaceNumber:
105*103e46e4SHarish Mahendrakar return os << "LaceNumber";
106*103e46e4SHarish Mahendrakar case Id::kTracks:
107*103e46e4SHarish Mahendrakar return os << "Tracks";
108*103e46e4SHarish Mahendrakar case Id::kTrackEntry:
109*103e46e4SHarish Mahendrakar return os << "TrackEntry";
110*103e46e4SHarish Mahendrakar case Id::kTrackNumber:
111*103e46e4SHarish Mahendrakar return os << "TrackNumber";
112*103e46e4SHarish Mahendrakar case Id::kTrackUid:
113*103e46e4SHarish Mahendrakar return os << "TrackUID";
114*103e46e4SHarish Mahendrakar case Id::kTrackType:
115*103e46e4SHarish Mahendrakar return os << "TrackType";
116*103e46e4SHarish Mahendrakar case Id::kFlagEnabled:
117*103e46e4SHarish Mahendrakar return os << "FlagEnabled";
118*103e46e4SHarish Mahendrakar case Id::kFlagDefault:
119*103e46e4SHarish Mahendrakar return os << "FlagDefault";
120*103e46e4SHarish Mahendrakar case Id::kFlagForced:
121*103e46e4SHarish Mahendrakar return os << "FlagForced";
122*103e46e4SHarish Mahendrakar case Id::kFlagLacing:
123*103e46e4SHarish Mahendrakar return os << "FlagLacing";
124*103e46e4SHarish Mahendrakar case Id::kDefaultDuration:
125*103e46e4SHarish Mahendrakar return os << "DefaultDuration";
126*103e46e4SHarish Mahendrakar case Id::kName:
127*103e46e4SHarish Mahendrakar return os << "Name";
128*103e46e4SHarish Mahendrakar case Id::kLanguage:
129*103e46e4SHarish Mahendrakar return os << "Language";
130*103e46e4SHarish Mahendrakar case Id::kCodecId:
131*103e46e4SHarish Mahendrakar return os << "CodecID";
132*103e46e4SHarish Mahendrakar case Id::kCodecPrivate:
133*103e46e4SHarish Mahendrakar return os << "CodecPrivate";
134*103e46e4SHarish Mahendrakar case Id::kCodecName:
135*103e46e4SHarish Mahendrakar return os << "CodecName";
136*103e46e4SHarish Mahendrakar case Id::kCodecDelay:
137*103e46e4SHarish Mahendrakar return os << "CodecDelay";
138*103e46e4SHarish Mahendrakar case Id::kSeekPreRoll:
139*103e46e4SHarish Mahendrakar return os << "SeekPreRoll";
140*103e46e4SHarish Mahendrakar case Id::kVideo:
141*103e46e4SHarish Mahendrakar return os << "Video";
142*103e46e4SHarish Mahendrakar case Id::kFlagInterlaced:
143*103e46e4SHarish Mahendrakar return os << "FlagInterlaced";
144*103e46e4SHarish Mahendrakar case Id::kStereoMode:
145*103e46e4SHarish Mahendrakar return os << "StereoMode";
146*103e46e4SHarish Mahendrakar case Id::kAlphaMode:
147*103e46e4SHarish Mahendrakar return os << "AlphaMode";
148*103e46e4SHarish Mahendrakar case Id::kPixelWidth:
149*103e46e4SHarish Mahendrakar return os << "PixelWidth";
150*103e46e4SHarish Mahendrakar case Id::kPixelHeight:
151*103e46e4SHarish Mahendrakar return os << "PixelHeight";
152*103e46e4SHarish Mahendrakar case Id::kPixelCropBottom:
153*103e46e4SHarish Mahendrakar return os << "PixelCropBottom";
154*103e46e4SHarish Mahendrakar case Id::kPixelCropTop:
155*103e46e4SHarish Mahendrakar return os << "PixelCropTop";
156*103e46e4SHarish Mahendrakar case Id::kPixelCropLeft:
157*103e46e4SHarish Mahendrakar return os << "PixelCropLeft";
158*103e46e4SHarish Mahendrakar case Id::kPixelCropRight:
159*103e46e4SHarish Mahendrakar return os << "PixelCropRight";
160*103e46e4SHarish Mahendrakar case Id::kDisplayWidth:
161*103e46e4SHarish Mahendrakar return os << "DisplayWidth";
162*103e46e4SHarish Mahendrakar case Id::kDisplayHeight:
163*103e46e4SHarish Mahendrakar return os << "DisplayHeight";
164*103e46e4SHarish Mahendrakar case Id::kDisplayUnit:
165*103e46e4SHarish Mahendrakar return os << "DisplayUnit";
166*103e46e4SHarish Mahendrakar case Id::kAspectRatioType:
167*103e46e4SHarish Mahendrakar return os << "AspectRatioType";
168*103e46e4SHarish Mahendrakar case Id::kFrameRate:
169*103e46e4SHarish Mahendrakar return os << "FrameRate";
170*103e46e4SHarish Mahendrakar case Id::kColour:
171*103e46e4SHarish Mahendrakar return os << "Colour";
172*103e46e4SHarish Mahendrakar case Id::kMatrixCoefficients:
173*103e46e4SHarish Mahendrakar return os << "MatrixCoefficients";
174*103e46e4SHarish Mahendrakar case Id::kBitsPerChannel:
175*103e46e4SHarish Mahendrakar return os << "BitsPerChannel";
176*103e46e4SHarish Mahendrakar case Id::kChromaSubsamplingHorz:
177*103e46e4SHarish Mahendrakar return os << "ChromaSubsamplingHorz";
178*103e46e4SHarish Mahendrakar case Id::kChromaSubsamplingVert:
179*103e46e4SHarish Mahendrakar return os << "ChromaSubsamplingVert";
180*103e46e4SHarish Mahendrakar case Id::kCbSubsamplingHorz:
181*103e46e4SHarish Mahendrakar return os << "CbSubsamplingHorz";
182*103e46e4SHarish Mahendrakar case Id::kCbSubsamplingVert:
183*103e46e4SHarish Mahendrakar return os << "CbSubsamplingVert";
184*103e46e4SHarish Mahendrakar case Id::kChromaSitingHorz:
185*103e46e4SHarish Mahendrakar return os << "ChromaSitingHorz";
186*103e46e4SHarish Mahendrakar case Id::kChromaSitingVert:
187*103e46e4SHarish Mahendrakar return os << "ChromaSitingVert";
188*103e46e4SHarish Mahendrakar case Id::kRange:
189*103e46e4SHarish Mahendrakar return os << "Range";
190*103e46e4SHarish Mahendrakar case Id::kTransferCharacteristics:
191*103e46e4SHarish Mahendrakar return os << "TransferCharacteristics";
192*103e46e4SHarish Mahendrakar case Id::kPrimaries:
193*103e46e4SHarish Mahendrakar return os << "Primaries";
194*103e46e4SHarish Mahendrakar case Id::kMaxCll:
195*103e46e4SHarish Mahendrakar return os << "MaxCLL";
196*103e46e4SHarish Mahendrakar case Id::kMaxFall:
197*103e46e4SHarish Mahendrakar return os << "MaxFALL";
198*103e46e4SHarish Mahendrakar case Id::kMasteringMetadata:
199*103e46e4SHarish Mahendrakar return os << "MasteringMetadata";
200*103e46e4SHarish Mahendrakar case Id::kPrimaryRChromaticityX:
201*103e46e4SHarish Mahendrakar return os << "PrimaryRChromaticityX";
202*103e46e4SHarish Mahendrakar case Id::kPrimaryRChromaticityY:
203*103e46e4SHarish Mahendrakar return os << "PrimaryRChromaticityY";
204*103e46e4SHarish Mahendrakar case Id::kPrimaryGChromaticityX:
205*103e46e4SHarish Mahendrakar return os << "PrimaryGChromaticityX";
206*103e46e4SHarish Mahendrakar case Id::kPrimaryGChromaticityY:
207*103e46e4SHarish Mahendrakar return os << "PrimaryGChromaticityY";
208*103e46e4SHarish Mahendrakar case Id::kPrimaryBChromaticityX:
209*103e46e4SHarish Mahendrakar return os << "PrimaryBChromaticityX";
210*103e46e4SHarish Mahendrakar case Id::kPrimaryBChromaticityY:
211*103e46e4SHarish Mahendrakar return os << "PrimaryBChromaticityY";
212*103e46e4SHarish Mahendrakar case Id::kWhitePointChromaticityX:
213*103e46e4SHarish Mahendrakar return os << "WhitePointChromaticityX";
214*103e46e4SHarish Mahendrakar case Id::kWhitePointChromaticityY:
215*103e46e4SHarish Mahendrakar return os << "WhitePointChromaticityY";
216*103e46e4SHarish Mahendrakar case Id::kLuminanceMax:
217*103e46e4SHarish Mahendrakar return os << "LuminanceMax";
218*103e46e4SHarish Mahendrakar case Id::kLuminanceMin:
219*103e46e4SHarish Mahendrakar return os << "LuminanceMin";
220*103e46e4SHarish Mahendrakar case Id::kProjection:
221*103e46e4SHarish Mahendrakar return os << "Projection";
222*103e46e4SHarish Mahendrakar case Id::kProjectionType:
223*103e46e4SHarish Mahendrakar return os << "kProjectionType";
224*103e46e4SHarish Mahendrakar case Id::kProjectionPrivate:
225*103e46e4SHarish Mahendrakar return os << "kProjectionPrivate";
226*103e46e4SHarish Mahendrakar case Id::kProjectionPoseYaw:
227*103e46e4SHarish Mahendrakar return os << "kProjectionPoseYaw";
228*103e46e4SHarish Mahendrakar case Id::kProjectionPosePitch:
229*103e46e4SHarish Mahendrakar return os << "kProjectionPosePitch";
230*103e46e4SHarish Mahendrakar case Id::kProjectionPoseRoll:
231*103e46e4SHarish Mahendrakar return os << "ProjectionPoseRoll";
232*103e46e4SHarish Mahendrakar case Id::kAudio:
233*103e46e4SHarish Mahendrakar return os << "Audio";
234*103e46e4SHarish Mahendrakar case Id::kSamplingFrequency:
235*103e46e4SHarish Mahendrakar return os << "SamplingFrequency";
236*103e46e4SHarish Mahendrakar case Id::kOutputSamplingFrequency:
237*103e46e4SHarish Mahendrakar return os << "OutputSamplingFrequency";
238*103e46e4SHarish Mahendrakar case Id::kChannels:
239*103e46e4SHarish Mahendrakar return os << "Channels";
240*103e46e4SHarish Mahendrakar case Id::kBitDepth:
241*103e46e4SHarish Mahendrakar return os << "BitDepth";
242*103e46e4SHarish Mahendrakar case Id::kContentEncodings:
243*103e46e4SHarish Mahendrakar return os << "ContentEncodings";
244*103e46e4SHarish Mahendrakar case Id::kContentEncoding:
245*103e46e4SHarish Mahendrakar return os << "ContentEncoding";
246*103e46e4SHarish Mahendrakar case Id::kContentEncodingOrder:
247*103e46e4SHarish Mahendrakar return os << "ContentEncodingOrder";
248*103e46e4SHarish Mahendrakar case Id::kContentEncodingScope:
249*103e46e4SHarish Mahendrakar return os << "ContentEncodingScope";
250*103e46e4SHarish Mahendrakar case Id::kContentEncodingType:
251*103e46e4SHarish Mahendrakar return os << "ContentEncodingType";
252*103e46e4SHarish Mahendrakar case Id::kContentEncryption:
253*103e46e4SHarish Mahendrakar return os << "ContentEncryption";
254*103e46e4SHarish Mahendrakar case Id::kContentEncAlgo:
255*103e46e4SHarish Mahendrakar return os << "ContentEncAlgo";
256*103e46e4SHarish Mahendrakar case Id::kContentEncKeyId:
257*103e46e4SHarish Mahendrakar return os << "ContentEncKeyID";
258*103e46e4SHarish Mahendrakar case Id::kContentEncAesSettings:
259*103e46e4SHarish Mahendrakar return os << "ContentEncAESSettings";
260*103e46e4SHarish Mahendrakar case Id::kAesSettingsCipherMode:
261*103e46e4SHarish Mahendrakar return os << "AESSettingsCipherMode";
262*103e46e4SHarish Mahendrakar case Id::kCues:
263*103e46e4SHarish Mahendrakar return os << "Cues";
264*103e46e4SHarish Mahendrakar case Id::kCuePoint:
265*103e46e4SHarish Mahendrakar return os << "CuePoint";
266*103e46e4SHarish Mahendrakar case Id::kCueTime:
267*103e46e4SHarish Mahendrakar return os << "CueTime";
268*103e46e4SHarish Mahendrakar case Id::kCueTrackPositions:
269*103e46e4SHarish Mahendrakar return os << "CueTrackPositions";
270*103e46e4SHarish Mahendrakar case Id::kCueTrack:
271*103e46e4SHarish Mahendrakar return os << "CueTrack";
272*103e46e4SHarish Mahendrakar case Id::kCueClusterPosition:
273*103e46e4SHarish Mahendrakar return os << "CueClusterPosition";
274*103e46e4SHarish Mahendrakar case Id::kCueRelativePosition:
275*103e46e4SHarish Mahendrakar return os << "CueRelativePosition";
276*103e46e4SHarish Mahendrakar case Id::kCueDuration:
277*103e46e4SHarish Mahendrakar return os << "CueDuration";
278*103e46e4SHarish Mahendrakar case Id::kCueBlockNumber:
279*103e46e4SHarish Mahendrakar return os << "CueBlockNumber";
280*103e46e4SHarish Mahendrakar case Id::kChapters:
281*103e46e4SHarish Mahendrakar return os << "Chapters";
282*103e46e4SHarish Mahendrakar case Id::kEditionEntry:
283*103e46e4SHarish Mahendrakar return os << "EditionEntry";
284*103e46e4SHarish Mahendrakar case Id::kChapterAtom:
285*103e46e4SHarish Mahendrakar return os << "ChapterAtom";
286*103e46e4SHarish Mahendrakar case Id::kChapterUid:
287*103e46e4SHarish Mahendrakar return os << "ChapterUID";
288*103e46e4SHarish Mahendrakar case Id::kChapterStringUid:
289*103e46e4SHarish Mahendrakar return os << "ChapterStringUID";
290*103e46e4SHarish Mahendrakar case Id::kChapterTimeStart:
291*103e46e4SHarish Mahendrakar return os << "ChapterTimeStart";
292*103e46e4SHarish Mahendrakar case Id::kChapterTimeEnd:
293*103e46e4SHarish Mahendrakar return os << "ChapterTimeEnd";
294*103e46e4SHarish Mahendrakar case Id::kChapterDisplay:
295*103e46e4SHarish Mahendrakar return os << "ChapterDisplay";
296*103e46e4SHarish Mahendrakar case Id::kChapString:
297*103e46e4SHarish Mahendrakar return os << "ChapString";
298*103e46e4SHarish Mahendrakar case Id::kChapLanguage:
299*103e46e4SHarish Mahendrakar return os << "ChapLanguage";
300*103e46e4SHarish Mahendrakar case Id::kChapCountry:
301*103e46e4SHarish Mahendrakar return os << "ChapCountry";
302*103e46e4SHarish Mahendrakar case Id::kTags:
303*103e46e4SHarish Mahendrakar return os << "Tags";
304*103e46e4SHarish Mahendrakar case Id::kTag:
305*103e46e4SHarish Mahendrakar return os << "Tag";
306*103e46e4SHarish Mahendrakar case Id::kTargets:
307*103e46e4SHarish Mahendrakar return os << "Targets";
308*103e46e4SHarish Mahendrakar case Id::kTargetTypeValue:
309*103e46e4SHarish Mahendrakar return os << "TargetTypeValue";
310*103e46e4SHarish Mahendrakar case Id::kTargetType:
311*103e46e4SHarish Mahendrakar return os << "TargetType";
312*103e46e4SHarish Mahendrakar case Id::kTagTrackUid:
313*103e46e4SHarish Mahendrakar return os << "TagTrackUID";
314*103e46e4SHarish Mahendrakar case Id::kSimpleTag:
315*103e46e4SHarish Mahendrakar return os << "SimpleTag";
316*103e46e4SHarish Mahendrakar case Id::kTagName:
317*103e46e4SHarish Mahendrakar return os << "TagName";
318*103e46e4SHarish Mahendrakar case Id::kTagLanguage:
319*103e46e4SHarish Mahendrakar return os << "TagLanguage";
320*103e46e4SHarish Mahendrakar case Id::kTagDefault:
321*103e46e4SHarish Mahendrakar return os << "TagDefault";
322*103e46e4SHarish Mahendrakar case Id::kTagString:
323*103e46e4SHarish Mahendrakar return os << "TagString";
324*103e46e4SHarish Mahendrakar case Id::kTagBinary:
325*103e46e4SHarish Mahendrakar return os << "TagBinary";
326*103e46e4SHarish Mahendrakar default:
327*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, id);
328*103e46e4SHarish Mahendrakar }
329*103e46e4SHarish Mahendrakar }
330*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,Lacing value)331*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, Lacing value) {
332*103e46e4SHarish Mahendrakar switch (value) {
333*103e46e4SHarish Mahendrakar case Lacing::kNone:
334*103e46e4SHarish Mahendrakar return os << "0 (none)";
335*103e46e4SHarish Mahendrakar case Lacing::kXiph:
336*103e46e4SHarish Mahendrakar return os << "2 (Xiph)";
337*103e46e4SHarish Mahendrakar case Lacing::kFixed:
338*103e46e4SHarish Mahendrakar return os << "4 (fixed)";
339*103e46e4SHarish Mahendrakar case Lacing::kEbml:
340*103e46e4SHarish Mahendrakar return os << "6 (EBML)";
341*103e46e4SHarish Mahendrakar default:
342*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
343*103e46e4SHarish Mahendrakar }
344*103e46e4SHarish Mahendrakar }
345*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,MatrixCoefficients value)346*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, MatrixCoefficients value) {
347*103e46e4SHarish Mahendrakar switch (value) {
348*103e46e4SHarish Mahendrakar case MatrixCoefficients::kRgb:
349*103e46e4SHarish Mahendrakar return os << "0 (identity, RGB/XYZ)";
350*103e46e4SHarish Mahendrakar case MatrixCoefficients::kBt709:
351*103e46e4SHarish Mahendrakar return os << "1 (Rec. ITU-R BT.709-5)";
352*103e46e4SHarish Mahendrakar case MatrixCoefficients::kUnspecified:
353*103e46e4SHarish Mahendrakar return os << "2 (unspecified)";
354*103e46e4SHarish Mahendrakar case MatrixCoefficients::kFcc:
355*103e46e4SHarish Mahendrakar return os << "4 (US FCC)";
356*103e46e4SHarish Mahendrakar case MatrixCoefficients::kBt470Bg:
357*103e46e4SHarish Mahendrakar return os << "5 (Rec. ITU-R BT.470-6 System B, G)";
358*103e46e4SHarish Mahendrakar case MatrixCoefficients::kSmpte170M:
359*103e46e4SHarish Mahendrakar return os << "6 (SMPTE 170M)";
360*103e46e4SHarish Mahendrakar case MatrixCoefficients::kSmpte240M:
361*103e46e4SHarish Mahendrakar return os << "7 (SMPTE 240M)";
362*103e46e4SHarish Mahendrakar case MatrixCoefficients::kYCgCo:
363*103e46e4SHarish Mahendrakar return os << "8 (YCgCo)";
364*103e46e4SHarish Mahendrakar case MatrixCoefficients::kBt2020NonconstantLuminance:
365*103e46e4SHarish Mahendrakar return os << "9 (Rec. ITU-R BT.2020, non-constant luma)";
366*103e46e4SHarish Mahendrakar case MatrixCoefficients::kBt2020ConstantLuminance:
367*103e46e4SHarish Mahendrakar return os << "10 (Rec. ITU-R BT.2020 , constant luma)";
368*103e46e4SHarish Mahendrakar default:
369*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
370*103e46e4SHarish Mahendrakar }
371*103e46e4SHarish Mahendrakar }
372*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,Range value)373*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, Range value) {
374*103e46e4SHarish Mahendrakar switch (value) {
375*103e46e4SHarish Mahendrakar case Range::kUnspecified:
376*103e46e4SHarish Mahendrakar return os << "0 (unspecified)";
377*103e46e4SHarish Mahendrakar case Range::kBroadcast:
378*103e46e4SHarish Mahendrakar return os << "1 (broadcast)";
379*103e46e4SHarish Mahendrakar case Range::kFull:
380*103e46e4SHarish Mahendrakar return os << "2 (full)";
381*103e46e4SHarish Mahendrakar case Range::kDerived:
382*103e46e4SHarish Mahendrakar return os << "3 (defined by MatrixCoefficients/TransferCharacteristics)";
383*103e46e4SHarish Mahendrakar default:
384*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
385*103e46e4SHarish Mahendrakar }
386*103e46e4SHarish Mahendrakar }
387*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,TransferCharacteristics value)388*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, TransferCharacteristics value) {
389*103e46e4SHarish Mahendrakar switch (value) {
390*103e46e4SHarish Mahendrakar case TransferCharacteristics::kBt709:
391*103e46e4SHarish Mahendrakar return os << "1 (Rec. ITU-R BT.709-6)";
392*103e46e4SHarish Mahendrakar case TransferCharacteristics::kUnspecified:
393*103e46e4SHarish Mahendrakar return os << "2 (unspecified)";
394*103e46e4SHarish Mahendrakar case TransferCharacteristics::kGamma22curve:
395*103e46e4SHarish Mahendrakar return os << "4 (gamma 2.2, Rec. ITU‑R BT.470‑6 System M)";
396*103e46e4SHarish Mahendrakar case TransferCharacteristics::kGamma28curve:
397*103e46e4SHarish Mahendrakar return os << "5 (gamma 2.8, Rec. ITU‑R BT.470-6 System B, G)";
398*103e46e4SHarish Mahendrakar case TransferCharacteristics::kSmpte170M:
399*103e46e4SHarish Mahendrakar return os << "6 (SMPTE 170M)";
400*103e46e4SHarish Mahendrakar case TransferCharacteristics::kSmpte240M:
401*103e46e4SHarish Mahendrakar return os << "7 (SMPTE 240M)";
402*103e46e4SHarish Mahendrakar case TransferCharacteristics::kLinear:
403*103e46e4SHarish Mahendrakar return os << "8 (linear)";
404*103e46e4SHarish Mahendrakar case TransferCharacteristics::kLog:
405*103e46e4SHarish Mahendrakar return os << "9 (log, 100:1 range)";
406*103e46e4SHarish Mahendrakar case TransferCharacteristics::kLogSqrt:
407*103e46e4SHarish Mahendrakar return os << "10 (log, 316.2:1 range)";
408*103e46e4SHarish Mahendrakar case TransferCharacteristics::kIec6196624:
409*103e46e4SHarish Mahendrakar return os << "11 (IEC 61966-2-4)";
410*103e46e4SHarish Mahendrakar case TransferCharacteristics::kBt1361ExtendedColourGamut:
411*103e46e4SHarish Mahendrakar return os << "12 (Rec. ITU-R BT.1361, extended colour gamut)";
412*103e46e4SHarish Mahendrakar case TransferCharacteristics::kIec6196621:
413*103e46e4SHarish Mahendrakar return os << "13 (IEC 61966-2-1, sRGB or sYCC)";
414*103e46e4SHarish Mahendrakar case TransferCharacteristics::k10BitBt2020:
415*103e46e4SHarish Mahendrakar return os << "14 (Rec. ITU-R BT.2020-2, 10-bit)";
416*103e46e4SHarish Mahendrakar case TransferCharacteristics::k12BitBt2020:
417*103e46e4SHarish Mahendrakar return os << "15 (Rec. ITU-R BT.2020-2, 12-bit)";
418*103e46e4SHarish Mahendrakar case TransferCharacteristics::kSmpteSt2084:
419*103e46e4SHarish Mahendrakar return os << "16 (SMPTE ST 2084)";
420*103e46e4SHarish Mahendrakar case TransferCharacteristics::kSmpteSt4281:
421*103e46e4SHarish Mahendrakar return os << "17 (SMPTE ST 428-1)";
422*103e46e4SHarish Mahendrakar case TransferCharacteristics::kAribStdB67Hlg:
423*103e46e4SHarish Mahendrakar return os << "18 (ARIB STD-B67/Rec. ITU-R BT.[HDR-TV] HLG)";
424*103e46e4SHarish Mahendrakar default:
425*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
426*103e46e4SHarish Mahendrakar }
427*103e46e4SHarish Mahendrakar }
428*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,Primaries value)429*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, Primaries value) {
430*103e46e4SHarish Mahendrakar switch (value) {
431*103e46e4SHarish Mahendrakar case Primaries::kBt709:
432*103e46e4SHarish Mahendrakar return os << "1 (Rec. ITU‑R BT.709-6)";
433*103e46e4SHarish Mahendrakar case Primaries::kUnspecified:
434*103e46e4SHarish Mahendrakar return os << "2 (unspecified)";
435*103e46e4SHarish Mahendrakar case Primaries::kBt470M:
436*103e46e4SHarish Mahendrakar return os << "4 (Rec. ITU‑R BT.470‑6 System M)";
437*103e46e4SHarish Mahendrakar case Primaries::kBt470Bg:
438*103e46e4SHarish Mahendrakar return os << "5 (Rec. ITU‑R BT.470‑6 System B, G)";
439*103e46e4SHarish Mahendrakar case Primaries::kSmpte170M:
440*103e46e4SHarish Mahendrakar return os << "6 (SMPTE 170M)";
441*103e46e4SHarish Mahendrakar case Primaries::kSmpte240M:
442*103e46e4SHarish Mahendrakar return os << "7 (SMPTE 240M)";
443*103e46e4SHarish Mahendrakar case Primaries::kFilm:
444*103e46e4SHarish Mahendrakar return os << "8 (generic film)";
445*103e46e4SHarish Mahendrakar case Primaries::kBt2020:
446*103e46e4SHarish Mahendrakar return os << "9 (Rec. ITU-R BT.2020-2)";
447*103e46e4SHarish Mahendrakar case Primaries::kSmpteSt4281:
448*103e46e4SHarish Mahendrakar return os << "10 (SMPTE ST 428-1)";
449*103e46e4SHarish Mahendrakar case Primaries::kJedecP22Phosphors:
450*103e46e4SHarish Mahendrakar return os << "22 (EBU Tech. 3213-E/JEDEC P22 phosphors)";
451*103e46e4SHarish Mahendrakar default:
452*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
453*103e46e4SHarish Mahendrakar }
454*103e46e4SHarish Mahendrakar }
455*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,ProjectionType value)456*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, ProjectionType value) {
457*103e46e4SHarish Mahendrakar switch (value) {
458*103e46e4SHarish Mahendrakar case ProjectionType::kRectangular:
459*103e46e4SHarish Mahendrakar return os << "0 (rectangular)";
460*103e46e4SHarish Mahendrakar case ProjectionType::kEquirectangular:
461*103e46e4SHarish Mahendrakar return os << "1 (equirectangular)";
462*103e46e4SHarish Mahendrakar case ProjectionType::kCubeMap:
463*103e46e4SHarish Mahendrakar return os << "2 (cube map)";
464*103e46e4SHarish Mahendrakar default:
465*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
466*103e46e4SHarish Mahendrakar }
467*103e46e4SHarish Mahendrakar }
468*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,FlagInterlaced value)469*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, FlagInterlaced value) {
470*103e46e4SHarish Mahendrakar switch (value) {
471*103e46e4SHarish Mahendrakar case FlagInterlaced::kUnspecified:
472*103e46e4SHarish Mahendrakar return os << "0 (unspecified)";
473*103e46e4SHarish Mahendrakar case FlagInterlaced::kInterlaced:
474*103e46e4SHarish Mahendrakar return os << "1 (interlaced)";
475*103e46e4SHarish Mahendrakar case FlagInterlaced::kProgressive:
476*103e46e4SHarish Mahendrakar return os << "2 (progressive)";
477*103e46e4SHarish Mahendrakar default:
478*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
479*103e46e4SHarish Mahendrakar }
480*103e46e4SHarish Mahendrakar }
481*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,StereoMode value)482*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, StereoMode value) {
483*103e46e4SHarish Mahendrakar switch (value) {
484*103e46e4SHarish Mahendrakar case StereoMode::kMono:
485*103e46e4SHarish Mahendrakar return os << "0 (mono)";
486*103e46e4SHarish Mahendrakar case StereoMode::kSideBySideLeftFirst:
487*103e46e4SHarish Mahendrakar return os << "1 (side-by-side, left eye first)";
488*103e46e4SHarish Mahendrakar case StereoMode::kTopBottomRightFirst:
489*103e46e4SHarish Mahendrakar return os << "2 (top-bottom, right eye first)";
490*103e46e4SHarish Mahendrakar case StereoMode::kTopBottomLeftFirst:
491*103e46e4SHarish Mahendrakar return os << "3 (top-bottom, left eye first)";
492*103e46e4SHarish Mahendrakar case StereoMode::kCheckboardRightFirst:
493*103e46e4SHarish Mahendrakar return os << "4 (checkboard, right eye first)";
494*103e46e4SHarish Mahendrakar case StereoMode::kCheckboardLeftFirst:
495*103e46e4SHarish Mahendrakar return os << "5 (checkboard, left eye first)";
496*103e46e4SHarish Mahendrakar case StereoMode::kRowInterleavedRightFirst:
497*103e46e4SHarish Mahendrakar return os << "6 (row interleaved, right eye first)";
498*103e46e4SHarish Mahendrakar case StereoMode::kRowInterleavedLeftFirst:
499*103e46e4SHarish Mahendrakar return os << "7 (row interleaved, left eye first)";
500*103e46e4SHarish Mahendrakar case StereoMode::kColumnInterleavedRightFirst:
501*103e46e4SHarish Mahendrakar return os << "8 (column interleaved, right eye first)";
502*103e46e4SHarish Mahendrakar case StereoMode::kColumnInterleavedLeftFirst:
503*103e46e4SHarish Mahendrakar return os << "9 (column interleaved, left eye first)";
504*103e46e4SHarish Mahendrakar case StereoMode::kAnaglyphCyanRed:
505*103e46e4SHarish Mahendrakar return os << "10 (anaglyph, cyan/red)";
506*103e46e4SHarish Mahendrakar case StereoMode::kSideBySideRightFirst:
507*103e46e4SHarish Mahendrakar return os << "11 (side-by-side, right eye first)";
508*103e46e4SHarish Mahendrakar case StereoMode::kAnaglyphGreenMagenta:
509*103e46e4SHarish Mahendrakar return os << "12 (anaglyph, green/magenta)";
510*103e46e4SHarish Mahendrakar case StereoMode::kBlockLacedLeftFirst:
511*103e46e4SHarish Mahendrakar return os << "13 (block laced, left eye first)";
512*103e46e4SHarish Mahendrakar case StereoMode::kBlockLacedRightFirst:
513*103e46e4SHarish Mahendrakar return os << "14 (block laced, right eye first)";
514*103e46e4SHarish Mahendrakar default:
515*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
516*103e46e4SHarish Mahendrakar }
517*103e46e4SHarish Mahendrakar }
518*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,DisplayUnit value)519*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, DisplayUnit value) {
520*103e46e4SHarish Mahendrakar switch (value) {
521*103e46e4SHarish Mahendrakar case DisplayUnit::kPixels:
522*103e46e4SHarish Mahendrakar return os << "0 (pixels)";
523*103e46e4SHarish Mahendrakar case DisplayUnit::kCentimeters:
524*103e46e4SHarish Mahendrakar return os << "1 (centimeters)";
525*103e46e4SHarish Mahendrakar case DisplayUnit::kInches:
526*103e46e4SHarish Mahendrakar return os << "2 (inches)";
527*103e46e4SHarish Mahendrakar case DisplayUnit::kDisplayAspectRatio:
528*103e46e4SHarish Mahendrakar return os << "3 (display aspect ratio)";
529*103e46e4SHarish Mahendrakar default:
530*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
531*103e46e4SHarish Mahendrakar }
532*103e46e4SHarish Mahendrakar }
533*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,AspectRatioType value)534*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, AspectRatioType value) {
535*103e46e4SHarish Mahendrakar switch (value) {
536*103e46e4SHarish Mahendrakar case AspectRatioType::kFreeResizing:
537*103e46e4SHarish Mahendrakar return os << "0 (free resizing)";
538*103e46e4SHarish Mahendrakar case AspectRatioType::kKeep:
539*103e46e4SHarish Mahendrakar return os << "1 (keep aspect ratio)";
540*103e46e4SHarish Mahendrakar case AspectRatioType::kFixed:
541*103e46e4SHarish Mahendrakar return os << "2 (fixed)";
542*103e46e4SHarish Mahendrakar default:
543*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
544*103e46e4SHarish Mahendrakar }
545*103e46e4SHarish Mahendrakar }
546*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,AesSettingsCipherMode value)547*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, AesSettingsCipherMode value) {
548*103e46e4SHarish Mahendrakar switch (value) {
549*103e46e4SHarish Mahendrakar case AesSettingsCipherMode::kCtr:
550*103e46e4SHarish Mahendrakar return os << "1 (CTR)";
551*103e46e4SHarish Mahendrakar default:
552*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
553*103e46e4SHarish Mahendrakar }
554*103e46e4SHarish Mahendrakar }
555*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,ContentEncAlgo value)556*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, ContentEncAlgo value) {
557*103e46e4SHarish Mahendrakar switch (value) {
558*103e46e4SHarish Mahendrakar case ContentEncAlgo::kOnlySigned:
559*103e46e4SHarish Mahendrakar return os << "0 (only signed, not encrypted)";
560*103e46e4SHarish Mahendrakar case ContentEncAlgo::kDes:
561*103e46e4SHarish Mahendrakar return os << "1 (DES)";
562*103e46e4SHarish Mahendrakar case ContentEncAlgo::k3Des:
563*103e46e4SHarish Mahendrakar return os << "2 (3DES)";
564*103e46e4SHarish Mahendrakar case ContentEncAlgo::kTwofish:
565*103e46e4SHarish Mahendrakar return os << "3 (Twofish)";
566*103e46e4SHarish Mahendrakar case ContentEncAlgo::kBlowfish:
567*103e46e4SHarish Mahendrakar return os << "4 (Blowfish)";
568*103e46e4SHarish Mahendrakar case ContentEncAlgo::kAes:
569*103e46e4SHarish Mahendrakar return os << "5 (AES)";
570*103e46e4SHarish Mahendrakar default:
571*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
572*103e46e4SHarish Mahendrakar }
573*103e46e4SHarish Mahendrakar }
574*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,ContentEncodingType value)575*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, ContentEncodingType value) {
576*103e46e4SHarish Mahendrakar switch (value) {
577*103e46e4SHarish Mahendrakar case ContentEncodingType::kCompression:
578*103e46e4SHarish Mahendrakar return os << "0 (compression)";
579*103e46e4SHarish Mahendrakar case ContentEncodingType::kEncryption:
580*103e46e4SHarish Mahendrakar return os << "1 (encryption)";
581*103e46e4SHarish Mahendrakar default:
582*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
583*103e46e4SHarish Mahendrakar }
584*103e46e4SHarish Mahendrakar }
585*103e46e4SHarish Mahendrakar
operator <<(std::ostream & os,TrackType value)586*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os, TrackType value) {
587*103e46e4SHarish Mahendrakar switch (value) {
588*103e46e4SHarish Mahendrakar case TrackType::kVideo:
589*103e46e4SHarish Mahendrakar return os << "1 (video)";
590*103e46e4SHarish Mahendrakar case TrackType::kAudio:
591*103e46e4SHarish Mahendrakar return os << "2 (audio)";
592*103e46e4SHarish Mahendrakar case TrackType::kComplex:
593*103e46e4SHarish Mahendrakar return os << "3 (complex)";
594*103e46e4SHarish Mahendrakar case TrackType::kLogo:
595*103e46e4SHarish Mahendrakar return os << "16 (logo)";
596*103e46e4SHarish Mahendrakar case TrackType::kSubtitle:
597*103e46e4SHarish Mahendrakar return os << "17 (subtitle)";
598*103e46e4SHarish Mahendrakar case TrackType::kButtons:
599*103e46e4SHarish Mahendrakar return os << "18 (buttons)";
600*103e46e4SHarish Mahendrakar case TrackType::kControl:
601*103e46e4SHarish Mahendrakar return os << "32 (control)";
602*103e46e4SHarish Mahendrakar default:
603*103e46e4SHarish Mahendrakar return PrintUnknownEnumValue(os, value);
604*103e46e4SHarish Mahendrakar }
605*103e46e4SHarish Mahendrakar }
606*103e46e4SHarish Mahendrakar
607*103e46e4SHarish Mahendrakar // For binary elements, just print out its size.
operator <<(std::ostream & os,const std::vector<std::uint8_t> & value)608*103e46e4SHarish Mahendrakar std::ostream& operator<<(std::ostream& os,
609*103e46e4SHarish Mahendrakar const std::vector<std::uint8_t>& value) {
610*103e46e4SHarish Mahendrakar return os << '<' << value.size() << " bytes>";
611*103e46e4SHarish Mahendrakar }
612*103e46e4SHarish Mahendrakar
613*103e46e4SHarish Mahendrakar class DemoCallback : public Callback {
614*103e46e4SHarish Mahendrakar public:
615*103e46e4SHarish Mahendrakar int indent = 0;
616*103e46e4SHarish Mahendrakar int spaces_per_indent = 2;
617*103e46e4SHarish Mahendrakar
PrintElementMetadata(const std::string & name,const ElementMetadata & metadata)618*103e46e4SHarish Mahendrakar void PrintElementMetadata(const std::string& name,
619*103e46e4SHarish Mahendrakar const ElementMetadata& metadata) {
620*103e46e4SHarish Mahendrakar // Since we aren't doing any seeking in this demo, we don't have to worry
621*103e46e4SHarish Mahendrakar // about kUnknownHeaderSize or kUnknownElementPosition when adding the
622*103e46e4SHarish Mahendrakar // position and sizes.
623*103e46e4SHarish Mahendrakar const std::uint64_t header_start = metadata.position;
624*103e46e4SHarish Mahendrakar const std::uint64_t header_end = header_start + metadata.header_size;
625*103e46e4SHarish Mahendrakar const std::uint64_t body_start = header_end;
626*103e46e4SHarish Mahendrakar std::cout << std::string(indent * spaces_per_indent, ' ') << name;
627*103e46e4SHarish Mahendrakar // The ContentEncAESSettings element has the longest name (out of all other
628*103e46e4SHarish Mahendrakar // master elements) at 21 characters. It's also the deepest master element
629*103e46e4SHarish Mahendrakar // at a level of 6. Insert enough whitespace so there's room for it.
630*103e46e4SHarish Mahendrakar std::cout << std::string(21 + 6 * spaces_per_indent -
631*103e46e4SHarish Mahendrakar indent * spaces_per_indent - name.size(),
632*103e46e4SHarish Mahendrakar ' ')
633*103e46e4SHarish Mahendrakar << " header: [" << header_start << ", " << header_end
634*103e46e4SHarish Mahendrakar << ") body: [" << body_start << ", ";
635*103e46e4SHarish Mahendrakar if (metadata.size != kUnknownElementSize) {
636*103e46e4SHarish Mahendrakar const std::uint64_t body_end = body_start + metadata.size;
637*103e46e4SHarish Mahendrakar std::cout << body_end;
638*103e46e4SHarish Mahendrakar } else {
639*103e46e4SHarish Mahendrakar std::cout << '?';
640*103e46e4SHarish Mahendrakar }
641*103e46e4SHarish Mahendrakar std::cout << ")\n";
642*103e46e4SHarish Mahendrakar }
643*103e46e4SHarish Mahendrakar
644*103e46e4SHarish Mahendrakar template <typename T>
PrintMandatoryElement(const std::string & name,const Element<T> & element)645*103e46e4SHarish Mahendrakar void PrintMandatoryElement(const std::string& name,
646*103e46e4SHarish Mahendrakar const Element<T>& element) {
647*103e46e4SHarish Mahendrakar std::cout << std::string(indent * spaces_per_indent, ' ') << name;
648*103e46e4SHarish Mahendrakar if (!element.is_present()) {
649*103e46e4SHarish Mahendrakar std::cout << " (implicit)";
650*103e46e4SHarish Mahendrakar }
651*103e46e4SHarish Mahendrakar std::cout << ": " << element.value() << '\n';
652*103e46e4SHarish Mahendrakar }
653*103e46e4SHarish Mahendrakar
654*103e46e4SHarish Mahendrakar template <typename T>
PrintMandatoryElement(const std::string & name,const std::vector<Element<T>> & elements)655*103e46e4SHarish Mahendrakar void PrintMandatoryElement(const std::string& name,
656*103e46e4SHarish Mahendrakar const std::vector<Element<T>>& elements) {
657*103e46e4SHarish Mahendrakar for (const Element<T>& element : elements) {
658*103e46e4SHarish Mahendrakar PrintMandatoryElement(name, element);
659*103e46e4SHarish Mahendrakar }
660*103e46e4SHarish Mahendrakar }
661*103e46e4SHarish Mahendrakar
662*103e46e4SHarish Mahendrakar template <typename T>
PrintOptionalElement(const std::string & name,const Element<T> & element)663*103e46e4SHarish Mahendrakar void PrintOptionalElement(const std::string& name,
664*103e46e4SHarish Mahendrakar const Element<T>& element) {
665*103e46e4SHarish Mahendrakar if (element.is_present()) {
666*103e46e4SHarish Mahendrakar std::cout << std::string(indent * spaces_per_indent, ' ') << name << ": "
667*103e46e4SHarish Mahendrakar << element.value() << '\n';
668*103e46e4SHarish Mahendrakar }
669*103e46e4SHarish Mahendrakar }
670*103e46e4SHarish Mahendrakar
671*103e46e4SHarish Mahendrakar template <typename T>
PrintOptionalElement(const std::string & name,const std::vector<Element<T>> & elements)672*103e46e4SHarish Mahendrakar void PrintOptionalElement(const std::string& name,
673*103e46e4SHarish Mahendrakar const std::vector<Element<T>>& elements) {
674*103e46e4SHarish Mahendrakar for (const Element<T>& element : elements) {
675*103e46e4SHarish Mahendrakar PrintOptionalElement(name, element);
676*103e46e4SHarish Mahendrakar }
677*103e46e4SHarish Mahendrakar }
678*103e46e4SHarish Mahendrakar
PrintMasterElement(const BlockAdditions & block_additions)679*103e46e4SHarish Mahendrakar void PrintMasterElement(const BlockAdditions& block_additions) {
680*103e46e4SHarish Mahendrakar PrintMasterElement("BlockMore", block_additions.block_mores);
681*103e46e4SHarish Mahendrakar }
682*103e46e4SHarish Mahendrakar
PrintMasterElement(const BlockMore & block_more)683*103e46e4SHarish Mahendrakar void PrintMasterElement(const BlockMore& block_more) {
684*103e46e4SHarish Mahendrakar PrintMandatoryElement("BlockAddID", block_more.id);
685*103e46e4SHarish Mahendrakar PrintMandatoryElement("BlockAdditional", block_more.data);
686*103e46e4SHarish Mahendrakar }
687*103e46e4SHarish Mahendrakar
PrintMasterElement(const Slices & slices)688*103e46e4SHarish Mahendrakar void PrintMasterElement(const Slices& slices) {
689*103e46e4SHarish Mahendrakar PrintMasterElement("TimeSlice", slices.slices);
690*103e46e4SHarish Mahendrakar }
691*103e46e4SHarish Mahendrakar
PrintMasterElement(const TimeSlice & time_slice)692*103e46e4SHarish Mahendrakar void PrintMasterElement(const TimeSlice& time_slice) {
693*103e46e4SHarish Mahendrakar PrintOptionalElement("LaceNumber", time_slice.lace_number);
694*103e46e4SHarish Mahendrakar }
695*103e46e4SHarish Mahendrakar
PrintMasterElement(const Video & video)696*103e46e4SHarish Mahendrakar void PrintMasterElement(const Video& video) {
697*103e46e4SHarish Mahendrakar PrintMandatoryElement("FlagInterlaced", video.interlaced);
698*103e46e4SHarish Mahendrakar PrintOptionalElement("StereoMode", video.stereo_mode);
699*103e46e4SHarish Mahendrakar PrintOptionalElement("AlphaMode", video.alpha_mode);
700*103e46e4SHarish Mahendrakar PrintMandatoryElement("PixelWidth", video.pixel_width);
701*103e46e4SHarish Mahendrakar PrintMandatoryElement("PixelHeight", video.pixel_height);
702*103e46e4SHarish Mahendrakar PrintOptionalElement("PixelCropBottom", video.pixel_crop_bottom);
703*103e46e4SHarish Mahendrakar PrintOptionalElement("PixelCropTop", video.pixel_crop_top);
704*103e46e4SHarish Mahendrakar PrintOptionalElement("PixelCropLeft", video.pixel_crop_left);
705*103e46e4SHarish Mahendrakar PrintOptionalElement("PixelCropRight", video.pixel_crop_right);
706*103e46e4SHarish Mahendrakar PrintOptionalElement("DisplayWidth", video.display_width);
707*103e46e4SHarish Mahendrakar PrintOptionalElement("DisplayHeight", video.display_height);
708*103e46e4SHarish Mahendrakar PrintOptionalElement("DisplayUnit", video.display_unit);
709*103e46e4SHarish Mahendrakar PrintOptionalElement("AspectRatioType", video.aspect_ratio_type);
710*103e46e4SHarish Mahendrakar PrintOptionalElement("FrameRate", video.frame_rate);
711*103e46e4SHarish Mahendrakar PrintMasterElement("Colour", video.colour);
712*103e46e4SHarish Mahendrakar PrintMasterElement("Projection", video.projection);
713*103e46e4SHarish Mahendrakar }
714*103e46e4SHarish Mahendrakar
PrintMasterElement(const Colour & colour)715*103e46e4SHarish Mahendrakar void PrintMasterElement(const Colour& colour) {
716*103e46e4SHarish Mahendrakar PrintOptionalElement("MatrixCoefficients", colour.matrix_coefficients);
717*103e46e4SHarish Mahendrakar PrintOptionalElement("BitsPerChannel", colour.bits_per_channel);
718*103e46e4SHarish Mahendrakar PrintOptionalElement("ChromaSubsamplingHorz", colour.chroma_subsampling_x);
719*103e46e4SHarish Mahendrakar PrintOptionalElement("ChromaSubsamplingVert", colour.chroma_subsampling_y);
720*103e46e4SHarish Mahendrakar PrintOptionalElement("CbSubsamplingHorz", colour.cb_subsampling_x);
721*103e46e4SHarish Mahendrakar PrintOptionalElement("CbSubsamplingVert", colour.cb_subsampling_y);
722*103e46e4SHarish Mahendrakar PrintOptionalElement("ChromaSitingHorz", colour.chroma_siting_x);
723*103e46e4SHarish Mahendrakar PrintOptionalElement("ChromaSitingVert", colour.chroma_siting_y);
724*103e46e4SHarish Mahendrakar PrintOptionalElement("Range", colour.range);
725*103e46e4SHarish Mahendrakar PrintOptionalElement("TransferCharacteristics",
726*103e46e4SHarish Mahendrakar colour.transfer_characteristics);
727*103e46e4SHarish Mahendrakar PrintOptionalElement("Primaries", colour.primaries);
728*103e46e4SHarish Mahendrakar PrintOptionalElement("MaxCLL", colour.max_cll);
729*103e46e4SHarish Mahendrakar PrintOptionalElement("MaxFALL", colour.max_fall);
730*103e46e4SHarish Mahendrakar PrintMasterElement("MasteringMetadata", colour.mastering_metadata);
731*103e46e4SHarish Mahendrakar }
732*103e46e4SHarish Mahendrakar
PrintMasterElement(const MasteringMetadata & mastering_metadata)733*103e46e4SHarish Mahendrakar void PrintMasterElement(const MasteringMetadata& mastering_metadata) {
734*103e46e4SHarish Mahendrakar PrintOptionalElement("PrimaryRChromaticityX",
735*103e46e4SHarish Mahendrakar mastering_metadata.primary_r_chromaticity_x);
736*103e46e4SHarish Mahendrakar PrintOptionalElement("PrimaryRChromaticityY",
737*103e46e4SHarish Mahendrakar mastering_metadata.primary_r_chromaticity_y);
738*103e46e4SHarish Mahendrakar PrintOptionalElement("PrimaryGChromaticityX",
739*103e46e4SHarish Mahendrakar mastering_metadata.primary_g_chromaticity_x);
740*103e46e4SHarish Mahendrakar PrintOptionalElement("PrimaryGChromaticityY",
741*103e46e4SHarish Mahendrakar mastering_metadata.primary_g_chromaticity_y);
742*103e46e4SHarish Mahendrakar PrintOptionalElement("PrimaryBChromaticityX",
743*103e46e4SHarish Mahendrakar mastering_metadata.primary_b_chromaticity_x);
744*103e46e4SHarish Mahendrakar PrintOptionalElement("PrimaryBChromaticityY",
745*103e46e4SHarish Mahendrakar mastering_metadata.primary_b_chromaticity_y);
746*103e46e4SHarish Mahendrakar PrintOptionalElement("WhitePointChromaticityX",
747*103e46e4SHarish Mahendrakar mastering_metadata.white_point_chromaticity_x);
748*103e46e4SHarish Mahendrakar PrintOptionalElement("WhitePointChromaticityY",
749*103e46e4SHarish Mahendrakar mastering_metadata.white_point_chromaticity_y);
750*103e46e4SHarish Mahendrakar PrintOptionalElement("LuminanceMax", mastering_metadata.luminance_max);
751*103e46e4SHarish Mahendrakar PrintOptionalElement("LuminanceMin", mastering_metadata.luminance_min);
752*103e46e4SHarish Mahendrakar }
753*103e46e4SHarish Mahendrakar
PrintMasterElement(const Projection & projection)754*103e46e4SHarish Mahendrakar void PrintMasterElement(const Projection& projection) {
755*103e46e4SHarish Mahendrakar PrintMandatoryElement("ProjectionType", projection.type);
756*103e46e4SHarish Mahendrakar PrintOptionalElement("ProjectionPrivate", projection.projection_private);
757*103e46e4SHarish Mahendrakar PrintMandatoryElement("ProjectionPoseYaw", projection.pose_yaw);
758*103e46e4SHarish Mahendrakar PrintMandatoryElement("ProjectionPosePitch", projection.pose_pitch);
759*103e46e4SHarish Mahendrakar PrintMandatoryElement("ProjectionPoseRoll", projection.pose_roll);
760*103e46e4SHarish Mahendrakar }
761*103e46e4SHarish Mahendrakar
PrintMasterElement(const Audio & audio)762*103e46e4SHarish Mahendrakar void PrintMasterElement(const Audio& audio) {
763*103e46e4SHarish Mahendrakar PrintMandatoryElement("SamplingFrequency", audio.sampling_frequency);
764*103e46e4SHarish Mahendrakar PrintOptionalElement("OutputSamplingFrequency", audio.output_frequency);
765*103e46e4SHarish Mahendrakar PrintMandatoryElement("Channels", audio.channels);
766*103e46e4SHarish Mahendrakar PrintOptionalElement("BitDepth", audio.bit_depth);
767*103e46e4SHarish Mahendrakar }
768*103e46e4SHarish Mahendrakar
PrintMasterElement(const ContentEncodings & content_encodings)769*103e46e4SHarish Mahendrakar void PrintMasterElement(const ContentEncodings& content_encodings) {
770*103e46e4SHarish Mahendrakar PrintMasterElement("ContentEncoding", content_encodings.encodings);
771*103e46e4SHarish Mahendrakar }
772*103e46e4SHarish Mahendrakar
PrintMasterElement(const ContentEncoding & content_encoding)773*103e46e4SHarish Mahendrakar void PrintMasterElement(const ContentEncoding& content_encoding) {
774*103e46e4SHarish Mahendrakar PrintMandatoryElement("ContentEncodingOrder", content_encoding.order);
775*103e46e4SHarish Mahendrakar PrintMandatoryElement("ContentEncodingScope", content_encoding.scope);
776*103e46e4SHarish Mahendrakar PrintMandatoryElement("ContentEncodingType", content_encoding.type);
777*103e46e4SHarish Mahendrakar PrintMasterElement("ContentEncryption", content_encoding.encryption);
778*103e46e4SHarish Mahendrakar }
779*103e46e4SHarish Mahendrakar
PrintMasterElement(const ContentEncryption & content_encryption)780*103e46e4SHarish Mahendrakar void PrintMasterElement(const ContentEncryption& content_encryption) {
781*103e46e4SHarish Mahendrakar PrintOptionalElement("ContentEncAlgo", content_encryption.algorithm);
782*103e46e4SHarish Mahendrakar PrintOptionalElement("ContentEncKeyID", content_encryption.key_id);
783*103e46e4SHarish Mahendrakar PrintMasterElement("ContentEncAESSettings",
784*103e46e4SHarish Mahendrakar content_encryption.aes_settings);
785*103e46e4SHarish Mahendrakar }
786*103e46e4SHarish Mahendrakar
PrintMasterElement(const ContentEncAesSettings & content_enc_aes_settings)787*103e46e4SHarish Mahendrakar void PrintMasterElement(
788*103e46e4SHarish Mahendrakar const ContentEncAesSettings& content_enc_aes_settings) {
789*103e46e4SHarish Mahendrakar PrintMandatoryElement("AESSettingsCipherMode",
790*103e46e4SHarish Mahendrakar content_enc_aes_settings.aes_settings_cipher_mode);
791*103e46e4SHarish Mahendrakar }
792*103e46e4SHarish Mahendrakar
PrintMasterElement(const CueTrackPositions & cue_track_positions)793*103e46e4SHarish Mahendrakar void PrintMasterElement(const CueTrackPositions& cue_track_positions) {
794*103e46e4SHarish Mahendrakar PrintMandatoryElement("CueTrack", cue_track_positions.track);
795*103e46e4SHarish Mahendrakar PrintMandatoryElement("CueClusterPosition",
796*103e46e4SHarish Mahendrakar cue_track_positions.cluster_position);
797*103e46e4SHarish Mahendrakar PrintOptionalElement("CueRelativePosition",
798*103e46e4SHarish Mahendrakar cue_track_positions.relative_position);
799*103e46e4SHarish Mahendrakar PrintOptionalElement("CueDuration", cue_track_positions.duration);
800*103e46e4SHarish Mahendrakar PrintOptionalElement("CueBlockNumber", cue_track_positions.block_number);
801*103e46e4SHarish Mahendrakar }
802*103e46e4SHarish Mahendrakar
PrintMasterElement(const ChapterAtom & chapter_atom)803*103e46e4SHarish Mahendrakar void PrintMasterElement(const ChapterAtom& chapter_atom) {
804*103e46e4SHarish Mahendrakar PrintMandatoryElement("ChapterUID", chapter_atom.uid);
805*103e46e4SHarish Mahendrakar PrintOptionalElement("ChapterStringUID", chapter_atom.string_uid);
806*103e46e4SHarish Mahendrakar PrintMandatoryElement("ChapterTimeStart", chapter_atom.time_start);
807*103e46e4SHarish Mahendrakar PrintOptionalElement("ChapterTimeEnd", chapter_atom.time_end);
808*103e46e4SHarish Mahendrakar PrintMasterElement("ChapterDisplay", chapter_atom.displays);
809*103e46e4SHarish Mahendrakar PrintMasterElement("ChapterAtom", chapter_atom.atoms);
810*103e46e4SHarish Mahendrakar }
811*103e46e4SHarish Mahendrakar
PrintMasterElement(const ChapterDisplay & chapter_display)812*103e46e4SHarish Mahendrakar void PrintMasterElement(const ChapterDisplay& chapter_display) {
813*103e46e4SHarish Mahendrakar PrintMandatoryElement("ChapString", chapter_display.string);
814*103e46e4SHarish Mahendrakar PrintMandatoryElement("ChapLanguage", chapter_display.languages);
815*103e46e4SHarish Mahendrakar PrintOptionalElement("ChapCountry", chapter_display.countries);
816*103e46e4SHarish Mahendrakar }
817*103e46e4SHarish Mahendrakar
PrintMasterElement(const Targets & targets)818*103e46e4SHarish Mahendrakar void PrintMasterElement(const Targets& targets) {
819*103e46e4SHarish Mahendrakar PrintOptionalElement("TargetTypeValue", targets.type_value);
820*103e46e4SHarish Mahendrakar PrintOptionalElement("TargetType", targets.type);
821*103e46e4SHarish Mahendrakar PrintMandatoryElement("TagTrackUID", targets.track_uids);
822*103e46e4SHarish Mahendrakar }
823*103e46e4SHarish Mahendrakar
PrintMasterElement(const SimpleTag & simple_tag)824*103e46e4SHarish Mahendrakar void PrintMasterElement(const SimpleTag& simple_tag) {
825*103e46e4SHarish Mahendrakar PrintMandatoryElement("TagName", simple_tag.name);
826*103e46e4SHarish Mahendrakar PrintMandatoryElement("TagLanguage", simple_tag.language);
827*103e46e4SHarish Mahendrakar PrintMandatoryElement("TagDefault", simple_tag.is_default);
828*103e46e4SHarish Mahendrakar PrintOptionalElement("TagString", simple_tag.string);
829*103e46e4SHarish Mahendrakar PrintOptionalElement("TagBinary", simple_tag.binary);
830*103e46e4SHarish Mahendrakar PrintMasterElement("SimpleTag", simple_tag.tags);
831*103e46e4SHarish Mahendrakar }
832*103e46e4SHarish Mahendrakar
833*103e46e4SHarish Mahendrakar // When printing a master element that's wrapped in Element<>, peel off the
834*103e46e4SHarish Mahendrakar // Element<> wrapper and print the underlying master element if it's present.
835*103e46e4SHarish Mahendrakar template <typename T>
PrintMasterElement(const std::string & name,const Element<T> & element)836*103e46e4SHarish Mahendrakar void PrintMasterElement(const std::string& name, const Element<T>& element) {
837*103e46e4SHarish Mahendrakar if (element.is_present()) {
838*103e46e4SHarish Mahendrakar std::cout << std::string(indent * spaces_per_indent, ' ') << name << "\n";
839*103e46e4SHarish Mahendrakar ++indent;
840*103e46e4SHarish Mahendrakar PrintMasterElement(element.value());
841*103e46e4SHarish Mahendrakar --indent;
842*103e46e4SHarish Mahendrakar }
843*103e46e4SHarish Mahendrakar }
844*103e46e4SHarish Mahendrakar
845*103e46e4SHarish Mahendrakar template <typename T>
PrintMasterElement(const std::string & name,const std::vector<Element<T>> & elements)846*103e46e4SHarish Mahendrakar void PrintMasterElement(const std::string& name,
847*103e46e4SHarish Mahendrakar const std::vector<Element<T>>& elements) {
848*103e46e4SHarish Mahendrakar for (const Element<T>& element : elements) {
849*103e46e4SHarish Mahendrakar PrintMasterElement(name, element);
850*103e46e4SHarish Mahendrakar }
851*103e46e4SHarish Mahendrakar }
852*103e46e4SHarish Mahendrakar
853*103e46e4SHarish Mahendrakar template <typename T>
PrintValue(const std::string & name,const T & value)854*103e46e4SHarish Mahendrakar void PrintValue(const std::string& name, const T& value) {
855*103e46e4SHarish Mahendrakar std::cout << std::string(indent * spaces_per_indent, ' ') << name << ": "
856*103e46e4SHarish Mahendrakar << value << '\n';
857*103e46e4SHarish Mahendrakar }
858*103e46e4SHarish Mahendrakar
OnElementBegin(const ElementMetadata & metadata,Action * action)859*103e46e4SHarish Mahendrakar Status OnElementBegin(const ElementMetadata& metadata,
860*103e46e4SHarish Mahendrakar Action* action) override {
861*103e46e4SHarish Mahendrakar // Print out metadata for some level 1 elements that don't have explicit
862*103e46e4SHarish Mahendrakar // callbacks.
863*103e46e4SHarish Mahendrakar switch (metadata.id) {
864*103e46e4SHarish Mahendrakar case Id::kSeekHead:
865*103e46e4SHarish Mahendrakar indent = 1;
866*103e46e4SHarish Mahendrakar PrintElementMetadata("SeekHead", metadata);
867*103e46e4SHarish Mahendrakar break;
868*103e46e4SHarish Mahendrakar case Id::kTracks:
869*103e46e4SHarish Mahendrakar indent = 1;
870*103e46e4SHarish Mahendrakar PrintElementMetadata("Tracks", metadata);
871*103e46e4SHarish Mahendrakar break;
872*103e46e4SHarish Mahendrakar case Id::kCues:
873*103e46e4SHarish Mahendrakar indent = 1;
874*103e46e4SHarish Mahendrakar PrintElementMetadata("Cues", metadata);
875*103e46e4SHarish Mahendrakar break;
876*103e46e4SHarish Mahendrakar case Id::kChapters:
877*103e46e4SHarish Mahendrakar indent = 1;
878*103e46e4SHarish Mahendrakar PrintElementMetadata("Chapters", metadata);
879*103e46e4SHarish Mahendrakar break;
880*103e46e4SHarish Mahendrakar case Id::kTags:
881*103e46e4SHarish Mahendrakar indent = 1;
882*103e46e4SHarish Mahendrakar PrintElementMetadata("Tags", metadata);
883*103e46e4SHarish Mahendrakar break;
884*103e46e4SHarish Mahendrakar default:
885*103e46e4SHarish Mahendrakar break;
886*103e46e4SHarish Mahendrakar }
887*103e46e4SHarish Mahendrakar
888*103e46e4SHarish Mahendrakar *action = Action::kRead;
889*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
890*103e46e4SHarish Mahendrakar }
891*103e46e4SHarish Mahendrakar
OnUnknownElement(const ElementMetadata & metadata,Reader * reader,std::uint64_t * bytes_remaining)892*103e46e4SHarish Mahendrakar Status OnUnknownElement(const ElementMetadata& metadata, Reader* reader,
893*103e46e4SHarish Mahendrakar std::uint64_t* bytes_remaining) override {
894*103e46e4SHarish Mahendrakar // Output unknown elements without any indentation because we aren't
895*103e46e4SHarish Mahendrakar // tracking which element contains them.
896*103e46e4SHarish Mahendrakar int original_indent = indent;
897*103e46e4SHarish Mahendrakar indent = 0;
898*103e46e4SHarish Mahendrakar PrintElementMetadata("UNKNOWN_ELEMENT!", metadata);
899*103e46e4SHarish Mahendrakar indent = original_indent;
900*103e46e4SHarish Mahendrakar // The base class's implementation will just skip the element via
901*103e46e4SHarish Mahendrakar // Reader::Skip().
902*103e46e4SHarish Mahendrakar return Callback::OnUnknownElement(metadata, reader, bytes_remaining);
903*103e46e4SHarish Mahendrakar }
904*103e46e4SHarish Mahendrakar
OnEbml(const ElementMetadata & metadata,const Ebml & ebml)905*103e46e4SHarish Mahendrakar Status OnEbml(const ElementMetadata& metadata, const Ebml& ebml) override {
906*103e46e4SHarish Mahendrakar indent = 0;
907*103e46e4SHarish Mahendrakar PrintElementMetadata("EBML", metadata);
908*103e46e4SHarish Mahendrakar indent = 1;
909*103e46e4SHarish Mahendrakar PrintMandatoryElement("EBMLVersion", ebml.ebml_version);
910*103e46e4SHarish Mahendrakar PrintMandatoryElement("EBMLReadVersion", ebml.ebml_read_version);
911*103e46e4SHarish Mahendrakar PrintMandatoryElement("EBMLMaxIDLength", ebml.ebml_max_id_length);
912*103e46e4SHarish Mahendrakar PrintMandatoryElement("EBMLMaxSizeLength", ebml.ebml_max_size_length);
913*103e46e4SHarish Mahendrakar PrintMandatoryElement("DocType", ebml.doc_type);
914*103e46e4SHarish Mahendrakar PrintMandatoryElement("DocTypeVersion", ebml.doc_type_version);
915*103e46e4SHarish Mahendrakar PrintMandatoryElement("DocTypeReadVersion", ebml.doc_type_read_version);
916*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
917*103e46e4SHarish Mahendrakar }
918*103e46e4SHarish Mahendrakar
OnVoid(const ElementMetadata & metadata,Reader * reader,std::uint64_t * bytes_remaining)919*103e46e4SHarish Mahendrakar Status OnVoid(const ElementMetadata& metadata, Reader* reader,
920*103e46e4SHarish Mahendrakar std::uint64_t* bytes_remaining) override {
921*103e46e4SHarish Mahendrakar // Output Void elements without any indentation because we aren't tracking
922*103e46e4SHarish Mahendrakar // which element contains them.
923*103e46e4SHarish Mahendrakar int original_indent = indent;
924*103e46e4SHarish Mahendrakar indent = 0;
925*103e46e4SHarish Mahendrakar PrintElementMetadata("Void", metadata);
926*103e46e4SHarish Mahendrakar indent = original_indent;
927*103e46e4SHarish Mahendrakar // The base class's implementation will just skip the element via
928*103e46e4SHarish Mahendrakar // Reader::Skip().
929*103e46e4SHarish Mahendrakar return Callback::OnVoid(metadata, reader, bytes_remaining);
930*103e46e4SHarish Mahendrakar }
931*103e46e4SHarish Mahendrakar
OnSegmentBegin(const ElementMetadata & metadata,Action * action)932*103e46e4SHarish Mahendrakar Status OnSegmentBegin(const ElementMetadata& metadata,
933*103e46e4SHarish Mahendrakar Action* action) override {
934*103e46e4SHarish Mahendrakar indent = 0;
935*103e46e4SHarish Mahendrakar PrintElementMetadata("Segment", metadata);
936*103e46e4SHarish Mahendrakar indent = 1;
937*103e46e4SHarish Mahendrakar *action = Action::kRead;
938*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
939*103e46e4SHarish Mahendrakar }
940*103e46e4SHarish Mahendrakar
OnSeek(const ElementMetadata & metadata,const Seek & seek)941*103e46e4SHarish Mahendrakar Status OnSeek(const ElementMetadata& metadata, const Seek& seek) override {
942*103e46e4SHarish Mahendrakar indent = 2;
943*103e46e4SHarish Mahendrakar PrintElementMetadata("Seek", metadata);
944*103e46e4SHarish Mahendrakar indent = 3;
945*103e46e4SHarish Mahendrakar PrintMandatoryElement("SeekID", seek.id);
946*103e46e4SHarish Mahendrakar PrintMandatoryElement("SeekPosition", seek.position);
947*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
948*103e46e4SHarish Mahendrakar }
949*103e46e4SHarish Mahendrakar
OnInfo(const ElementMetadata & metadata,const Info & info)950*103e46e4SHarish Mahendrakar Status OnInfo(const ElementMetadata& metadata, const Info& info) override {
951*103e46e4SHarish Mahendrakar indent = 1;
952*103e46e4SHarish Mahendrakar PrintElementMetadata("Info", metadata);
953*103e46e4SHarish Mahendrakar indent = 2;
954*103e46e4SHarish Mahendrakar PrintMandatoryElement("TimecodeScale", info.timecode_scale);
955*103e46e4SHarish Mahendrakar PrintOptionalElement("Duration", info.duration);
956*103e46e4SHarish Mahendrakar PrintOptionalElement("DateUTC", info.date_utc);
957*103e46e4SHarish Mahendrakar PrintOptionalElement("Title", info.title);
958*103e46e4SHarish Mahendrakar PrintOptionalElement("MuxingApp", info.muxing_app);
959*103e46e4SHarish Mahendrakar PrintOptionalElement("WritingApp", info.writing_app);
960*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
961*103e46e4SHarish Mahendrakar }
962*103e46e4SHarish Mahendrakar
OnClusterBegin(const ElementMetadata & metadata,const Cluster & cluster,Action * action)963*103e46e4SHarish Mahendrakar Status OnClusterBegin(const ElementMetadata& metadata, const Cluster& cluster,
964*103e46e4SHarish Mahendrakar Action* action) override {
965*103e46e4SHarish Mahendrakar indent = 1;
966*103e46e4SHarish Mahendrakar PrintElementMetadata("Cluster", metadata);
967*103e46e4SHarish Mahendrakar // A properly muxed file will have Timecode and PrevSize first before any
968*103e46e4SHarish Mahendrakar // SimpleBlock or BlockGroups. The parser takes advantage of this and delays
969*103e46e4SHarish Mahendrakar // calling OnClusterBegin() until it hits the first SimpleBlock or
970*103e46e4SHarish Mahendrakar // BlockGroup child (or the Cluster ends if it's empty). It's possible for
971*103e46e4SHarish Mahendrakar // an improperly muxed file to have Timecode or PrevSize after the first
972*103e46e4SHarish Mahendrakar // block, in which case they'll be absent here and may be accessed in
973*103e46e4SHarish Mahendrakar // OnClusterEnd() when the Cluster and all its children have been fully
974*103e46e4SHarish Mahendrakar // parsed. In this demo we assume the file has been properly muxed.
975*103e46e4SHarish Mahendrakar indent = 2;
976*103e46e4SHarish Mahendrakar PrintMandatoryElement("Timecode", cluster.timecode);
977*103e46e4SHarish Mahendrakar PrintOptionalElement("PrevSize", cluster.previous_size);
978*103e46e4SHarish Mahendrakar *action = Action::kRead;
979*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
980*103e46e4SHarish Mahendrakar }
981*103e46e4SHarish Mahendrakar
OnSimpleBlockBegin(const ElementMetadata & metadata,const SimpleBlock & simple_block,Action * action)982*103e46e4SHarish Mahendrakar Status OnSimpleBlockBegin(const ElementMetadata& metadata,
983*103e46e4SHarish Mahendrakar const SimpleBlock& simple_block,
984*103e46e4SHarish Mahendrakar Action* action) override {
985*103e46e4SHarish Mahendrakar indent = 2;
986*103e46e4SHarish Mahendrakar PrintElementMetadata("SimpleBlock", metadata);
987*103e46e4SHarish Mahendrakar indent = 3;
988*103e46e4SHarish Mahendrakar PrintValue("track number", simple_block.track_number);
989*103e46e4SHarish Mahendrakar PrintValue("frames", simple_block.num_frames);
990*103e46e4SHarish Mahendrakar PrintValue("timecode", simple_block.timecode);
991*103e46e4SHarish Mahendrakar PrintValue("lacing", simple_block.lacing);
992*103e46e4SHarish Mahendrakar std::string flags = (simple_block.is_visible) ? "visible" : "invisible";
993*103e46e4SHarish Mahendrakar if (simple_block.is_key_frame)
994*103e46e4SHarish Mahendrakar flags += ", key frame";
995*103e46e4SHarish Mahendrakar if (simple_block.is_discardable)
996*103e46e4SHarish Mahendrakar flags += ", discardable";
997*103e46e4SHarish Mahendrakar PrintValue("flags", flags);
998*103e46e4SHarish Mahendrakar *action = Action::kRead;
999*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1000*103e46e4SHarish Mahendrakar }
1001*103e46e4SHarish Mahendrakar
OnSimpleBlockEnd(const ElementMetadata &,const SimpleBlock &)1002*103e46e4SHarish Mahendrakar Status OnSimpleBlockEnd(const ElementMetadata& /* metadata */,
1003*103e46e4SHarish Mahendrakar const SimpleBlock& /* simple_block */) override {
1004*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1005*103e46e4SHarish Mahendrakar }
1006*103e46e4SHarish Mahendrakar
OnBlockGroupBegin(const ElementMetadata & metadata,Action * action)1007*103e46e4SHarish Mahendrakar Status OnBlockGroupBegin(const ElementMetadata& metadata,
1008*103e46e4SHarish Mahendrakar Action* action) override {
1009*103e46e4SHarish Mahendrakar indent = 2;
1010*103e46e4SHarish Mahendrakar PrintElementMetadata("BlockGroup", metadata);
1011*103e46e4SHarish Mahendrakar *action = Action::kRead;
1012*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1013*103e46e4SHarish Mahendrakar }
1014*103e46e4SHarish Mahendrakar
OnBlockBegin(const ElementMetadata & metadata,const Block & block,Action * action)1015*103e46e4SHarish Mahendrakar Status OnBlockBegin(const ElementMetadata& metadata, const Block& block,
1016*103e46e4SHarish Mahendrakar Action* action) override {
1017*103e46e4SHarish Mahendrakar indent = 3;
1018*103e46e4SHarish Mahendrakar PrintElementMetadata("Block", metadata);
1019*103e46e4SHarish Mahendrakar indent = 4;
1020*103e46e4SHarish Mahendrakar PrintValue("track number", block.track_number);
1021*103e46e4SHarish Mahendrakar PrintValue("frames", block.num_frames);
1022*103e46e4SHarish Mahendrakar PrintValue("timecode", block.timecode);
1023*103e46e4SHarish Mahendrakar PrintValue("lacing", block.lacing);
1024*103e46e4SHarish Mahendrakar PrintValue("flags", (block.is_visible) ? "visible" : "invisible");
1025*103e46e4SHarish Mahendrakar *action = Action::kRead;
1026*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1027*103e46e4SHarish Mahendrakar }
1028*103e46e4SHarish Mahendrakar
OnBlockEnd(const ElementMetadata &,const Block &)1029*103e46e4SHarish Mahendrakar Status OnBlockEnd(const ElementMetadata& /* metadata */,
1030*103e46e4SHarish Mahendrakar const Block& /* block */) override {
1031*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1032*103e46e4SHarish Mahendrakar }
1033*103e46e4SHarish Mahendrakar
OnBlockGroupEnd(const ElementMetadata &,const BlockGroup & block_group)1034*103e46e4SHarish Mahendrakar Status OnBlockGroupEnd(const ElementMetadata& /* metadata */,
1035*103e46e4SHarish Mahendrakar const BlockGroup& block_group) override {
1036*103e46e4SHarish Mahendrakar if (block_group.virtual_block.is_present()) {
1037*103e46e4SHarish Mahendrakar std::cout << std::string(indent * spaces_per_indent, ' ')
1038*103e46e4SHarish Mahendrakar << "BlockVirtual\n";
1039*103e46e4SHarish Mahendrakar indent = 4;
1040*103e46e4SHarish Mahendrakar PrintValue("track number",
1041*103e46e4SHarish Mahendrakar block_group.virtual_block.value().track_number);
1042*103e46e4SHarish Mahendrakar PrintValue("timecode", block_group.virtual_block.value().timecode);
1043*103e46e4SHarish Mahendrakar }
1044*103e46e4SHarish Mahendrakar indent = 3;
1045*103e46e4SHarish Mahendrakar PrintMasterElement("BlockAdditions", block_group.additions);
1046*103e46e4SHarish Mahendrakar PrintOptionalElement("BlockDuration", block_group.duration);
1047*103e46e4SHarish Mahendrakar PrintOptionalElement("ReferenceBlock", block_group.references);
1048*103e46e4SHarish Mahendrakar PrintOptionalElement("DiscardPadding", block_group.discard_padding);
1049*103e46e4SHarish Mahendrakar PrintMasterElement("Slices", block_group.slices);
1050*103e46e4SHarish Mahendrakar // BlockGroup::block has been set, but we've already printed it in
1051*103e46e4SHarish Mahendrakar // OnBlockBegin().
1052*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1053*103e46e4SHarish Mahendrakar }
1054*103e46e4SHarish Mahendrakar
OnFrame(const FrameMetadata & metadata,Reader * reader,std::uint64_t * bytes_remaining)1055*103e46e4SHarish Mahendrakar Status OnFrame(const FrameMetadata& metadata, Reader* reader,
1056*103e46e4SHarish Mahendrakar std::uint64_t* bytes_remaining) override {
1057*103e46e4SHarish Mahendrakar PrintValue("frame byte range",
1058*103e46e4SHarish Mahendrakar '[' + std::to_string(metadata.position) + ", " +
1059*103e46e4SHarish Mahendrakar std::to_string(metadata.position + metadata.size) + ')');
1060*103e46e4SHarish Mahendrakar // The base class's implementation will just skip the frame via
1061*103e46e4SHarish Mahendrakar // Reader::Skip().
1062*103e46e4SHarish Mahendrakar return Callback::OnFrame(metadata, reader, bytes_remaining);
1063*103e46e4SHarish Mahendrakar }
1064*103e46e4SHarish Mahendrakar
OnClusterEnd(const ElementMetadata &,const Cluster &)1065*103e46e4SHarish Mahendrakar Status OnClusterEnd(const ElementMetadata& /* metadata */,
1066*103e46e4SHarish Mahendrakar const Cluster& /* cluster */) override {
1067*103e46e4SHarish Mahendrakar // The Cluster and all its children have been fully parsed at this point. If
1068*103e46e4SHarish Mahendrakar // the file wasn't properly muxed and Timecode or PrevSize were missing in
1069*103e46e4SHarish Mahendrakar // OnClusterBegin(), they'll be set here (if the Cluster contained them). In
1070*103e46e4SHarish Mahendrakar // this demo we already handled them, though.
1071*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1072*103e46e4SHarish Mahendrakar }
1073*103e46e4SHarish Mahendrakar
OnTrackEntry(const ElementMetadata & metadata,const TrackEntry & track_entry)1074*103e46e4SHarish Mahendrakar Status OnTrackEntry(const ElementMetadata& metadata,
1075*103e46e4SHarish Mahendrakar const TrackEntry& track_entry) override {
1076*103e46e4SHarish Mahendrakar indent = 2;
1077*103e46e4SHarish Mahendrakar PrintElementMetadata("TrackEntry", metadata);
1078*103e46e4SHarish Mahendrakar indent = 3;
1079*103e46e4SHarish Mahendrakar PrintMandatoryElement("TrackNumber", track_entry.track_number);
1080*103e46e4SHarish Mahendrakar PrintMandatoryElement("TrackUID", track_entry.track_uid);
1081*103e46e4SHarish Mahendrakar PrintMandatoryElement("TrackType", track_entry.track_type);
1082*103e46e4SHarish Mahendrakar PrintMandatoryElement("FlagEnabled", track_entry.is_enabled);
1083*103e46e4SHarish Mahendrakar PrintMandatoryElement("FlagDefault", track_entry.is_default);
1084*103e46e4SHarish Mahendrakar PrintMandatoryElement("FlagForced", track_entry.is_forced);
1085*103e46e4SHarish Mahendrakar PrintMandatoryElement("FlagLacing", track_entry.uses_lacing);
1086*103e46e4SHarish Mahendrakar PrintOptionalElement("DefaultDuration", track_entry.default_duration);
1087*103e46e4SHarish Mahendrakar PrintOptionalElement("Name", track_entry.name);
1088*103e46e4SHarish Mahendrakar PrintOptionalElement("Language", track_entry.language);
1089*103e46e4SHarish Mahendrakar PrintMandatoryElement("CodecID", track_entry.codec_id);
1090*103e46e4SHarish Mahendrakar PrintOptionalElement("CodecPrivate", track_entry.codec_private);
1091*103e46e4SHarish Mahendrakar PrintOptionalElement("CodecName", track_entry.codec_name);
1092*103e46e4SHarish Mahendrakar PrintOptionalElement("CodecDelay", track_entry.codec_delay);
1093*103e46e4SHarish Mahendrakar PrintMandatoryElement("SeekPreRoll", track_entry.seek_pre_roll);
1094*103e46e4SHarish Mahendrakar PrintMasterElement("Video", track_entry.video);
1095*103e46e4SHarish Mahendrakar PrintMasterElement("Audio", track_entry.audio);
1096*103e46e4SHarish Mahendrakar PrintMasterElement("ContentEncodings", track_entry.content_encodings);
1097*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1098*103e46e4SHarish Mahendrakar }
1099*103e46e4SHarish Mahendrakar
OnCuePoint(const ElementMetadata & metadata,const CuePoint & cue_point)1100*103e46e4SHarish Mahendrakar Status OnCuePoint(const ElementMetadata& metadata,
1101*103e46e4SHarish Mahendrakar const CuePoint& cue_point) override {
1102*103e46e4SHarish Mahendrakar indent = 2;
1103*103e46e4SHarish Mahendrakar PrintElementMetadata("CuePoint", metadata);
1104*103e46e4SHarish Mahendrakar indent = 3;
1105*103e46e4SHarish Mahendrakar PrintMandatoryElement("CueTime", cue_point.time);
1106*103e46e4SHarish Mahendrakar PrintMasterElement("CueTrackPositions", cue_point.cue_track_positions);
1107*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1108*103e46e4SHarish Mahendrakar }
1109*103e46e4SHarish Mahendrakar
OnEditionEntry(const ElementMetadata & metadata,const EditionEntry & edition_entry)1110*103e46e4SHarish Mahendrakar Status OnEditionEntry(const ElementMetadata& metadata,
1111*103e46e4SHarish Mahendrakar const EditionEntry& edition_entry) override {
1112*103e46e4SHarish Mahendrakar indent = 2;
1113*103e46e4SHarish Mahendrakar PrintElementMetadata("EditionEntry", metadata);
1114*103e46e4SHarish Mahendrakar indent = 3;
1115*103e46e4SHarish Mahendrakar PrintMasterElement("ChapterAtom", edition_entry.atoms);
1116*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1117*103e46e4SHarish Mahendrakar }
1118*103e46e4SHarish Mahendrakar
OnTag(const ElementMetadata & metadata,const Tag & tag)1119*103e46e4SHarish Mahendrakar Status OnTag(const ElementMetadata& metadata, const Tag& tag) override {
1120*103e46e4SHarish Mahendrakar indent = 2;
1121*103e46e4SHarish Mahendrakar PrintElementMetadata("Tag", metadata);
1122*103e46e4SHarish Mahendrakar indent = 3;
1123*103e46e4SHarish Mahendrakar PrintMasterElement("Targets", tag.targets);
1124*103e46e4SHarish Mahendrakar PrintMasterElement("SimpleTag", tag.tags);
1125*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1126*103e46e4SHarish Mahendrakar }
1127*103e46e4SHarish Mahendrakar
OnSegmentEnd(const ElementMetadata &)1128*103e46e4SHarish Mahendrakar Status OnSegmentEnd(const ElementMetadata& /* metadata */) override {
1129*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
1130*103e46e4SHarish Mahendrakar }
1131*103e46e4SHarish Mahendrakar };
1132*103e46e4SHarish Mahendrakar
main(int argc,char * argv[])1133*103e46e4SHarish Mahendrakar int main(int argc, char* argv[]) {
1134*103e46e4SHarish Mahendrakar if ((argc != 1 && argc != 2) ||
1135*103e46e4SHarish Mahendrakar (argc == 2 && argv[1] == std::string("--help"))) {
1136*103e46e4SHarish Mahendrakar std::cerr << "Usage:\n"
1137*103e46e4SHarish Mahendrakar << argv[0] << " [path-to-webm-file]\n\n"
1138*103e46e4SHarish Mahendrakar << "Prints info for the WebM file specified in the command line. "
1139*103e46e4SHarish Mahendrakar "If no file is\n"
1140*103e46e4SHarish Mahendrakar << "specified, stdin is used as input.\n";
1141*103e46e4SHarish Mahendrakar return EXIT_FAILURE;
1142*103e46e4SHarish Mahendrakar }
1143*103e46e4SHarish Mahendrakar
1144*103e46e4SHarish Mahendrakar FILE* file = (argc == 2) ? std::fopen(argv[1], "rb")
1145*103e46e4SHarish Mahendrakar : std::freopen(nullptr, "rb", stdin);
1146*103e46e4SHarish Mahendrakar if (!file) {
1147*103e46e4SHarish Mahendrakar std::cerr << "File cannot be opened\n";
1148*103e46e4SHarish Mahendrakar return EXIT_FAILURE;
1149*103e46e4SHarish Mahendrakar }
1150*103e46e4SHarish Mahendrakar
1151*103e46e4SHarish Mahendrakar FileReader reader(file);
1152*103e46e4SHarish Mahendrakar DemoCallback callback;
1153*103e46e4SHarish Mahendrakar WebmParser parser;
1154*103e46e4SHarish Mahendrakar Status status = parser.Feed(&callback, &reader);
1155*103e46e4SHarish Mahendrakar if (!status.completed_ok()) {
1156*103e46e4SHarish Mahendrakar std::cerr << "Parsing error; status code: " << status.code << '\n';
1157*103e46e4SHarish Mahendrakar return EXIT_FAILURE;
1158*103e46e4SHarish Mahendrakar }
1159*103e46e4SHarish Mahendrakar
1160*103e46e4SHarish Mahendrakar return 0;
1161*103e46e4SHarish Mahendrakar }
1162