1*103e46e4SHarish Mahendrakar // Copyright (c) 2012 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 #ifndef MKVPARSER_MKVPARSER_H_
9*103e46e4SHarish Mahendrakar #define MKVPARSER_MKVPARSER_H_
10*103e46e4SHarish Mahendrakar
11*103e46e4SHarish Mahendrakar #include <cstddef>
12*103e46e4SHarish Mahendrakar
13*103e46e4SHarish Mahendrakar namespace mkvparser {
14*103e46e4SHarish Mahendrakar
15*103e46e4SHarish Mahendrakar const int E_PARSE_FAILED = -1;
16*103e46e4SHarish Mahendrakar const int E_FILE_FORMAT_INVALID = -2;
17*103e46e4SHarish Mahendrakar const int E_BUFFER_NOT_FULL = -3;
18*103e46e4SHarish Mahendrakar
19*103e46e4SHarish Mahendrakar class IMkvReader {
20*103e46e4SHarish Mahendrakar public:
21*103e46e4SHarish Mahendrakar virtual int Read(long long pos, long len, unsigned char* buf) = 0;
22*103e46e4SHarish Mahendrakar virtual int Length(long long* total, long long* available) = 0;
23*103e46e4SHarish Mahendrakar
24*103e46e4SHarish Mahendrakar protected:
~IMkvReader()25*103e46e4SHarish Mahendrakar virtual ~IMkvReader() {}
26*103e46e4SHarish Mahendrakar };
27*103e46e4SHarish Mahendrakar
28*103e46e4SHarish Mahendrakar template <typename Type>
29*103e46e4SHarish Mahendrakar Type* SafeArrayAlloc(unsigned long long num_elements,
30*103e46e4SHarish Mahendrakar unsigned long long element_size);
31*103e46e4SHarish Mahendrakar long long GetUIntLength(IMkvReader*, long long, long&);
32*103e46e4SHarish Mahendrakar long long ReadUInt(IMkvReader*, long long, long&);
33*103e46e4SHarish Mahendrakar long long ReadID(IMkvReader* pReader, long long pos, long& len);
34*103e46e4SHarish Mahendrakar long long UnserializeUInt(IMkvReader*, long long pos, long long size);
35*103e46e4SHarish Mahendrakar
36*103e46e4SHarish Mahendrakar long UnserializeFloat(IMkvReader*, long long pos, long long size, double&);
37*103e46e4SHarish Mahendrakar long UnserializeInt(IMkvReader*, long long pos, long long size,
38*103e46e4SHarish Mahendrakar long long& result);
39*103e46e4SHarish Mahendrakar
40*103e46e4SHarish Mahendrakar long UnserializeString(IMkvReader*, long long pos, long long size, char*& str);
41*103e46e4SHarish Mahendrakar
42*103e46e4SHarish Mahendrakar long ParseElementHeader(IMkvReader* pReader,
43*103e46e4SHarish Mahendrakar long long& pos, // consume id and size fields
44*103e46e4SHarish Mahendrakar long long stop, // if you know size of element's parent
45*103e46e4SHarish Mahendrakar long long& id, long long& size);
46*103e46e4SHarish Mahendrakar
47*103e46e4SHarish Mahendrakar bool Match(IMkvReader*, long long&, unsigned long, long long&);
48*103e46e4SHarish Mahendrakar bool Match(IMkvReader*, long long&, unsigned long, unsigned char*&, size_t&);
49*103e46e4SHarish Mahendrakar
50*103e46e4SHarish Mahendrakar void GetVersion(int& major, int& minor, int& build, int& revision);
51*103e46e4SHarish Mahendrakar
52*103e46e4SHarish Mahendrakar struct EBMLHeader {
53*103e46e4SHarish Mahendrakar EBMLHeader();
54*103e46e4SHarish Mahendrakar ~EBMLHeader();
55*103e46e4SHarish Mahendrakar long long m_version;
56*103e46e4SHarish Mahendrakar long long m_readVersion;
57*103e46e4SHarish Mahendrakar long long m_maxIdLength;
58*103e46e4SHarish Mahendrakar long long m_maxSizeLength;
59*103e46e4SHarish Mahendrakar char* m_docType;
60*103e46e4SHarish Mahendrakar long long m_docTypeVersion;
61*103e46e4SHarish Mahendrakar long long m_docTypeReadVersion;
62*103e46e4SHarish Mahendrakar
63*103e46e4SHarish Mahendrakar long long Parse(IMkvReader*, long long&);
64*103e46e4SHarish Mahendrakar void Init();
65*103e46e4SHarish Mahendrakar };
66*103e46e4SHarish Mahendrakar
67*103e46e4SHarish Mahendrakar class Segment;
68*103e46e4SHarish Mahendrakar class Track;
69*103e46e4SHarish Mahendrakar class Cluster;
70*103e46e4SHarish Mahendrakar
71*103e46e4SHarish Mahendrakar class Block {
72*103e46e4SHarish Mahendrakar Block(const Block&);
73*103e46e4SHarish Mahendrakar Block& operator=(const Block&);
74*103e46e4SHarish Mahendrakar
75*103e46e4SHarish Mahendrakar public:
76*103e46e4SHarish Mahendrakar const long long m_start;
77*103e46e4SHarish Mahendrakar const long long m_size;
78*103e46e4SHarish Mahendrakar
79*103e46e4SHarish Mahendrakar Block(long long start, long long size, long long discard_padding);
80*103e46e4SHarish Mahendrakar ~Block();
81*103e46e4SHarish Mahendrakar
82*103e46e4SHarish Mahendrakar long Parse(const Cluster*);
83*103e46e4SHarish Mahendrakar
84*103e46e4SHarish Mahendrakar long long GetTrackNumber() const;
85*103e46e4SHarish Mahendrakar long long GetTimeCode(const Cluster*) const; // absolute, but not scaled
86*103e46e4SHarish Mahendrakar long long GetTime(const Cluster*) const; // absolute, and scaled (ns)
87*103e46e4SHarish Mahendrakar bool IsKey() const;
88*103e46e4SHarish Mahendrakar void SetKey(bool);
89*103e46e4SHarish Mahendrakar bool IsInvisible() const;
90*103e46e4SHarish Mahendrakar
91*103e46e4SHarish Mahendrakar enum Lacing { kLacingNone, kLacingXiph, kLacingFixed, kLacingEbml };
92*103e46e4SHarish Mahendrakar Lacing GetLacing() const;
93*103e46e4SHarish Mahendrakar
94*103e46e4SHarish Mahendrakar int GetFrameCount() const; // to index frames: [0, count)
95*103e46e4SHarish Mahendrakar
96*103e46e4SHarish Mahendrakar struct Frame {
97*103e46e4SHarish Mahendrakar long long pos; // absolute offset
98*103e46e4SHarish Mahendrakar long len;
99*103e46e4SHarish Mahendrakar
100*103e46e4SHarish Mahendrakar long Read(IMkvReader*, unsigned char*) const;
101*103e46e4SHarish Mahendrakar };
102*103e46e4SHarish Mahendrakar
103*103e46e4SHarish Mahendrakar const Frame& GetFrame(int frame_index) const;
104*103e46e4SHarish Mahendrakar
105*103e46e4SHarish Mahendrakar long long GetDiscardPadding() const;
106*103e46e4SHarish Mahendrakar
107*103e46e4SHarish Mahendrakar private:
108*103e46e4SHarish Mahendrakar long long m_track; // Track::Number()
109*103e46e4SHarish Mahendrakar short m_timecode; // relative to cluster
110*103e46e4SHarish Mahendrakar unsigned char m_flags;
111*103e46e4SHarish Mahendrakar
112*103e46e4SHarish Mahendrakar Frame* m_frames;
113*103e46e4SHarish Mahendrakar int m_frame_count;
114*103e46e4SHarish Mahendrakar
115*103e46e4SHarish Mahendrakar protected:
116*103e46e4SHarish Mahendrakar const long long m_discard_padding;
117*103e46e4SHarish Mahendrakar };
118*103e46e4SHarish Mahendrakar
119*103e46e4SHarish Mahendrakar class BlockEntry {
120*103e46e4SHarish Mahendrakar BlockEntry(const BlockEntry&);
121*103e46e4SHarish Mahendrakar BlockEntry& operator=(const BlockEntry&);
122*103e46e4SHarish Mahendrakar
123*103e46e4SHarish Mahendrakar protected:
124*103e46e4SHarish Mahendrakar BlockEntry(Cluster*, long index);
125*103e46e4SHarish Mahendrakar
126*103e46e4SHarish Mahendrakar public:
127*103e46e4SHarish Mahendrakar virtual ~BlockEntry();
128*103e46e4SHarish Mahendrakar
EOS()129*103e46e4SHarish Mahendrakar bool EOS() const { return (GetKind() == kBlockEOS); }
130*103e46e4SHarish Mahendrakar const Cluster* GetCluster() const;
131*103e46e4SHarish Mahendrakar long GetIndex() const;
132*103e46e4SHarish Mahendrakar virtual const Block* GetBlock() const = 0;
133*103e46e4SHarish Mahendrakar
134*103e46e4SHarish Mahendrakar enum Kind { kBlockEOS, kBlockSimple, kBlockGroup };
135*103e46e4SHarish Mahendrakar virtual Kind GetKind() const = 0;
136*103e46e4SHarish Mahendrakar
137*103e46e4SHarish Mahendrakar protected:
138*103e46e4SHarish Mahendrakar Cluster* const m_pCluster;
139*103e46e4SHarish Mahendrakar const long m_index;
140*103e46e4SHarish Mahendrakar };
141*103e46e4SHarish Mahendrakar
142*103e46e4SHarish Mahendrakar class SimpleBlock : public BlockEntry {
143*103e46e4SHarish Mahendrakar SimpleBlock(const SimpleBlock&);
144*103e46e4SHarish Mahendrakar SimpleBlock& operator=(const SimpleBlock&);
145*103e46e4SHarish Mahendrakar
146*103e46e4SHarish Mahendrakar public:
147*103e46e4SHarish Mahendrakar SimpleBlock(Cluster*, long index, long long start, long long size);
148*103e46e4SHarish Mahendrakar long Parse();
149*103e46e4SHarish Mahendrakar
150*103e46e4SHarish Mahendrakar Kind GetKind() const;
151*103e46e4SHarish Mahendrakar const Block* GetBlock() const;
152*103e46e4SHarish Mahendrakar
153*103e46e4SHarish Mahendrakar protected:
154*103e46e4SHarish Mahendrakar Block m_block;
155*103e46e4SHarish Mahendrakar };
156*103e46e4SHarish Mahendrakar
157*103e46e4SHarish Mahendrakar class BlockGroup : public BlockEntry {
158*103e46e4SHarish Mahendrakar BlockGroup(const BlockGroup&);
159*103e46e4SHarish Mahendrakar BlockGroup& operator=(const BlockGroup&);
160*103e46e4SHarish Mahendrakar
161*103e46e4SHarish Mahendrakar public:
162*103e46e4SHarish Mahendrakar BlockGroup(Cluster*, long index,
163*103e46e4SHarish Mahendrakar long long block_start, // absolute pos of block's payload
164*103e46e4SHarish Mahendrakar long long block_size, // size of block's payload
165*103e46e4SHarish Mahendrakar long long prev, long long next, long long duration,
166*103e46e4SHarish Mahendrakar long long discard_padding);
167*103e46e4SHarish Mahendrakar
168*103e46e4SHarish Mahendrakar long Parse();
169*103e46e4SHarish Mahendrakar
170*103e46e4SHarish Mahendrakar Kind GetKind() const;
171*103e46e4SHarish Mahendrakar const Block* GetBlock() const;
172*103e46e4SHarish Mahendrakar
173*103e46e4SHarish Mahendrakar long long GetPrevTimeCode() const; // relative to block's time
174*103e46e4SHarish Mahendrakar long long GetNextTimeCode() const; // as above
175*103e46e4SHarish Mahendrakar long long GetDurationTimeCode() const;
176*103e46e4SHarish Mahendrakar
177*103e46e4SHarish Mahendrakar private:
178*103e46e4SHarish Mahendrakar Block m_block;
179*103e46e4SHarish Mahendrakar const long long m_prev;
180*103e46e4SHarish Mahendrakar const long long m_next;
181*103e46e4SHarish Mahendrakar const long long m_duration;
182*103e46e4SHarish Mahendrakar };
183*103e46e4SHarish Mahendrakar
184*103e46e4SHarish Mahendrakar ///////////////////////////////////////////////////////////////
185*103e46e4SHarish Mahendrakar // ContentEncoding element
186*103e46e4SHarish Mahendrakar // Elements used to describe if the track data has been encrypted or
187*103e46e4SHarish Mahendrakar // compressed with zlib or header stripping.
188*103e46e4SHarish Mahendrakar class ContentEncoding {
189*103e46e4SHarish Mahendrakar public:
190*103e46e4SHarish Mahendrakar enum { kCTR = 1 };
191*103e46e4SHarish Mahendrakar
192*103e46e4SHarish Mahendrakar ContentEncoding();
193*103e46e4SHarish Mahendrakar ~ContentEncoding();
194*103e46e4SHarish Mahendrakar
195*103e46e4SHarish Mahendrakar // ContentCompression element names
196*103e46e4SHarish Mahendrakar struct ContentCompression {
197*103e46e4SHarish Mahendrakar ContentCompression();
198*103e46e4SHarish Mahendrakar ~ContentCompression();
199*103e46e4SHarish Mahendrakar
200*103e46e4SHarish Mahendrakar unsigned long long algo;
201*103e46e4SHarish Mahendrakar unsigned char* settings;
202*103e46e4SHarish Mahendrakar long long settings_len;
203*103e46e4SHarish Mahendrakar };
204*103e46e4SHarish Mahendrakar
205*103e46e4SHarish Mahendrakar // ContentEncAESSettings element names
206*103e46e4SHarish Mahendrakar struct ContentEncAESSettings {
ContentEncAESSettingsContentEncAESSettings207*103e46e4SHarish Mahendrakar ContentEncAESSettings() : cipher_mode(kCTR) {}
~ContentEncAESSettingsContentEncAESSettings208*103e46e4SHarish Mahendrakar ~ContentEncAESSettings() {}
209*103e46e4SHarish Mahendrakar
210*103e46e4SHarish Mahendrakar unsigned long long cipher_mode;
211*103e46e4SHarish Mahendrakar };
212*103e46e4SHarish Mahendrakar
213*103e46e4SHarish Mahendrakar // ContentEncryption element names
214*103e46e4SHarish Mahendrakar struct ContentEncryption {
215*103e46e4SHarish Mahendrakar ContentEncryption();
216*103e46e4SHarish Mahendrakar ~ContentEncryption();
217*103e46e4SHarish Mahendrakar
218*103e46e4SHarish Mahendrakar unsigned long long algo;
219*103e46e4SHarish Mahendrakar unsigned char* key_id;
220*103e46e4SHarish Mahendrakar long long key_id_len;
221*103e46e4SHarish Mahendrakar unsigned char* signature;
222*103e46e4SHarish Mahendrakar long long signature_len;
223*103e46e4SHarish Mahendrakar unsigned char* sig_key_id;
224*103e46e4SHarish Mahendrakar long long sig_key_id_len;
225*103e46e4SHarish Mahendrakar unsigned long long sig_algo;
226*103e46e4SHarish Mahendrakar unsigned long long sig_hash_algo;
227*103e46e4SHarish Mahendrakar
228*103e46e4SHarish Mahendrakar ContentEncAESSettings aes_settings;
229*103e46e4SHarish Mahendrakar };
230*103e46e4SHarish Mahendrakar
231*103e46e4SHarish Mahendrakar // Returns ContentCompression represented by |idx|. Returns NULL if |idx|
232*103e46e4SHarish Mahendrakar // is out of bounds.
233*103e46e4SHarish Mahendrakar const ContentCompression* GetCompressionByIndex(unsigned long idx) const;
234*103e46e4SHarish Mahendrakar
235*103e46e4SHarish Mahendrakar // Returns number of ContentCompression elements in this ContentEncoding
236*103e46e4SHarish Mahendrakar // element.
237*103e46e4SHarish Mahendrakar unsigned long GetCompressionCount() const;
238*103e46e4SHarish Mahendrakar
239*103e46e4SHarish Mahendrakar // Parses the ContentCompression element from |pReader|. |start| is the
240*103e46e4SHarish Mahendrakar // starting offset of the ContentCompression payload. |size| is the size in
241*103e46e4SHarish Mahendrakar // bytes of the ContentCompression payload. |compression| is where the parsed
242*103e46e4SHarish Mahendrakar // values will be stored.
243*103e46e4SHarish Mahendrakar long ParseCompressionEntry(long long start, long long size,
244*103e46e4SHarish Mahendrakar IMkvReader* pReader,
245*103e46e4SHarish Mahendrakar ContentCompression* compression);
246*103e46e4SHarish Mahendrakar
247*103e46e4SHarish Mahendrakar // Returns ContentEncryption represented by |idx|. Returns NULL if |idx|
248*103e46e4SHarish Mahendrakar // is out of bounds.
249*103e46e4SHarish Mahendrakar const ContentEncryption* GetEncryptionByIndex(unsigned long idx) const;
250*103e46e4SHarish Mahendrakar
251*103e46e4SHarish Mahendrakar // Returns number of ContentEncryption elements in this ContentEncoding
252*103e46e4SHarish Mahendrakar // element.
253*103e46e4SHarish Mahendrakar unsigned long GetEncryptionCount() const;
254*103e46e4SHarish Mahendrakar
255*103e46e4SHarish Mahendrakar // Parses the ContentEncAESSettings element from |pReader|. |start| is the
256*103e46e4SHarish Mahendrakar // starting offset of the ContentEncAESSettings payload. |size| is the
257*103e46e4SHarish Mahendrakar // size in bytes of the ContentEncAESSettings payload. |encryption| is
258*103e46e4SHarish Mahendrakar // where the parsed values will be stored.
259*103e46e4SHarish Mahendrakar long ParseContentEncAESSettingsEntry(long long start, long long size,
260*103e46e4SHarish Mahendrakar IMkvReader* pReader,
261*103e46e4SHarish Mahendrakar ContentEncAESSettings* aes);
262*103e46e4SHarish Mahendrakar
263*103e46e4SHarish Mahendrakar // Parses the ContentEncoding element from |pReader|. |start| is the
264*103e46e4SHarish Mahendrakar // starting offset of the ContentEncoding payload. |size| is the size in
265*103e46e4SHarish Mahendrakar // bytes of the ContentEncoding payload. Returns true on success.
266*103e46e4SHarish Mahendrakar long ParseContentEncodingEntry(long long start, long long size,
267*103e46e4SHarish Mahendrakar IMkvReader* pReader);
268*103e46e4SHarish Mahendrakar
269*103e46e4SHarish Mahendrakar // Parses the ContentEncryption element from |pReader|. |start| is the
270*103e46e4SHarish Mahendrakar // starting offset of the ContentEncryption payload. |size| is the size in
271*103e46e4SHarish Mahendrakar // bytes of the ContentEncryption payload. |encryption| is where the parsed
272*103e46e4SHarish Mahendrakar // values will be stored.
273*103e46e4SHarish Mahendrakar long ParseEncryptionEntry(long long start, long long size,
274*103e46e4SHarish Mahendrakar IMkvReader* pReader, ContentEncryption* encryption);
275*103e46e4SHarish Mahendrakar
encoding_order()276*103e46e4SHarish Mahendrakar unsigned long long encoding_order() const { return encoding_order_; }
encoding_scope()277*103e46e4SHarish Mahendrakar unsigned long long encoding_scope() const { return encoding_scope_; }
encoding_type()278*103e46e4SHarish Mahendrakar unsigned long long encoding_type() const { return encoding_type_; }
279*103e46e4SHarish Mahendrakar
280*103e46e4SHarish Mahendrakar private:
281*103e46e4SHarish Mahendrakar // Member variables for list of ContentCompression elements.
282*103e46e4SHarish Mahendrakar ContentCompression** compression_entries_;
283*103e46e4SHarish Mahendrakar ContentCompression** compression_entries_end_;
284*103e46e4SHarish Mahendrakar
285*103e46e4SHarish Mahendrakar // Member variables for list of ContentEncryption elements.
286*103e46e4SHarish Mahendrakar ContentEncryption** encryption_entries_;
287*103e46e4SHarish Mahendrakar ContentEncryption** encryption_entries_end_;
288*103e46e4SHarish Mahendrakar
289*103e46e4SHarish Mahendrakar // ContentEncoding element names
290*103e46e4SHarish Mahendrakar unsigned long long encoding_order_;
291*103e46e4SHarish Mahendrakar unsigned long long encoding_scope_;
292*103e46e4SHarish Mahendrakar unsigned long long encoding_type_;
293*103e46e4SHarish Mahendrakar
294*103e46e4SHarish Mahendrakar // LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncoding);
295*103e46e4SHarish Mahendrakar ContentEncoding(const ContentEncoding&);
296*103e46e4SHarish Mahendrakar ContentEncoding& operator=(const ContentEncoding&);
297*103e46e4SHarish Mahendrakar };
298*103e46e4SHarish Mahendrakar
299*103e46e4SHarish Mahendrakar class Track {
300*103e46e4SHarish Mahendrakar Track(const Track&);
301*103e46e4SHarish Mahendrakar Track& operator=(const Track&);
302*103e46e4SHarish Mahendrakar
303*103e46e4SHarish Mahendrakar public:
304*103e46e4SHarish Mahendrakar class Info;
305*103e46e4SHarish Mahendrakar static long Create(Segment*, const Info&, long long element_start,
306*103e46e4SHarish Mahendrakar long long element_size, Track*&);
307*103e46e4SHarish Mahendrakar
308*103e46e4SHarish Mahendrakar enum Type { kVideo = 1, kAudio = 2, kSubtitle = 0x11, kMetadata = 0x21 };
309*103e46e4SHarish Mahendrakar
310*103e46e4SHarish Mahendrakar Segment* const m_pSegment;
311*103e46e4SHarish Mahendrakar const long long m_element_start;
312*103e46e4SHarish Mahendrakar const long long m_element_size;
313*103e46e4SHarish Mahendrakar virtual ~Track();
314*103e46e4SHarish Mahendrakar
315*103e46e4SHarish Mahendrakar long GetType() const;
316*103e46e4SHarish Mahendrakar long GetNumber() const;
317*103e46e4SHarish Mahendrakar unsigned long long GetUid() const;
318*103e46e4SHarish Mahendrakar const char* GetNameAsUTF8() const;
319*103e46e4SHarish Mahendrakar const char* GetLanguage() const;
320*103e46e4SHarish Mahendrakar const char* GetCodecNameAsUTF8() const;
321*103e46e4SHarish Mahendrakar const char* GetCodecId() const;
322*103e46e4SHarish Mahendrakar const unsigned char* GetCodecPrivate(size_t&) const;
323*103e46e4SHarish Mahendrakar bool GetLacing() const;
324*103e46e4SHarish Mahendrakar unsigned long long GetDefaultDuration() const;
325*103e46e4SHarish Mahendrakar unsigned long long GetCodecDelay() const;
326*103e46e4SHarish Mahendrakar unsigned long long GetSeekPreRoll() const;
327*103e46e4SHarish Mahendrakar
328*103e46e4SHarish Mahendrakar const BlockEntry* GetEOS() const;
329*103e46e4SHarish Mahendrakar
330*103e46e4SHarish Mahendrakar struct Settings {
331*103e46e4SHarish Mahendrakar long long start;
332*103e46e4SHarish Mahendrakar long long size;
333*103e46e4SHarish Mahendrakar };
334*103e46e4SHarish Mahendrakar
335*103e46e4SHarish Mahendrakar class Info {
336*103e46e4SHarish Mahendrakar public:
337*103e46e4SHarish Mahendrakar Info();
338*103e46e4SHarish Mahendrakar ~Info();
339*103e46e4SHarish Mahendrakar int Copy(Info&) const;
340*103e46e4SHarish Mahendrakar void Clear();
341*103e46e4SHarish Mahendrakar long type;
342*103e46e4SHarish Mahendrakar long number;
343*103e46e4SHarish Mahendrakar unsigned long long uid;
344*103e46e4SHarish Mahendrakar unsigned long long defaultDuration;
345*103e46e4SHarish Mahendrakar unsigned long long codecDelay;
346*103e46e4SHarish Mahendrakar unsigned long long seekPreRoll;
347*103e46e4SHarish Mahendrakar char* nameAsUTF8;
348*103e46e4SHarish Mahendrakar char* language;
349*103e46e4SHarish Mahendrakar char* codecId;
350*103e46e4SHarish Mahendrakar char* codecNameAsUTF8;
351*103e46e4SHarish Mahendrakar unsigned char* codecPrivate;
352*103e46e4SHarish Mahendrakar size_t codecPrivateSize;
353*103e46e4SHarish Mahendrakar bool lacing;
354*103e46e4SHarish Mahendrakar Settings settings;
355*103e46e4SHarish Mahendrakar
356*103e46e4SHarish Mahendrakar private:
357*103e46e4SHarish Mahendrakar Info(const Info&);
358*103e46e4SHarish Mahendrakar Info& operator=(const Info&);
359*103e46e4SHarish Mahendrakar int CopyStr(char* Info::*str, Info&) const;
360*103e46e4SHarish Mahendrakar };
361*103e46e4SHarish Mahendrakar
362*103e46e4SHarish Mahendrakar long GetFirst(const BlockEntry*&) const;
363*103e46e4SHarish Mahendrakar long GetNext(const BlockEntry* pCurr, const BlockEntry*& pNext) const;
364*103e46e4SHarish Mahendrakar virtual bool VetEntry(const BlockEntry*) const;
365*103e46e4SHarish Mahendrakar virtual long Seek(long long time_ns, const BlockEntry*&) const;
366*103e46e4SHarish Mahendrakar
367*103e46e4SHarish Mahendrakar const ContentEncoding* GetContentEncodingByIndex(unsigned long idx) const;
368*103e46e4SHarish Mahendrakar unsigned long GetContentEncodingCount() const;
369*103e46e4SHarish Mahendrakar
370*103e46e4SHarish Mahendrakar long ParseContentEncodingsEntry(long long start, long long size);
371*103e46e4SHarish Mahendrakar
372*103e46e4SHarish Mahendrakar protected:
373*103e46e4SHarish Mahendrakar Track(Segment*, long long element_start, long long element_size);
374*103e46e4SHarish Mahendrakar
375*103e46e4SHarish Mahendrakar Info m_info;
376*103e46e4SHarish Mahendrakar
377*103e46e4SHarish Mahendrakar class EOSBlock : public BlockEntry {
378*103e46e4SHarish Mahendrakar public:
379*103e46e4SHarish Mahendrakar EOSBlock();
380*103e46e4SHarish Mahendrakar
381*103e46e4SHarish Mahendrakar Kind GetKind() const;
382*103e46e4SHarish Mahendrakar const Block* GetBlock() const;
383*103e46e4SHarish Mahendrakar };
384*103e46e4SHarish Mahendrakar
385*103e46e4SHarish Mahendrakar EOSBlock m_eos;
386*103e46e4SHarish Mahendrakar
387*103e46e4SHarish Mahendrakar private:
388*103e46e4SHarish Mahendrakar ContentEncoding** content_encoding_entries_;
389*103e46e4SHarish Mahendrakar ContentEncoding** content_encoding_entries_end_;
390*103e46e4SHarish Mahendrakar };
391*103e46e4SHarish Mahendrakar
392*103e46e4SHarish Mahendrakar struct PrimaryChromaticity {
PrimaryChromaticityPrimaryChromaticity393*103e46e4SHarish Mahendrakar PrimaryChromaticity() : x(0), y(0) {}
~PrimaryChromaticityPrimaryChromaticity394*103e46e4SHarish Mahendrakar ~PrimaryChromaticity() {}
395*103e46e4SHarish Mahendrakar static bool Parse(IMkvReader* reader, long long read_pos,
396*103e46e4SHarish Mahendrakar long long value_size, bool is_x,
397*103e46e4SHarish Mahendrakar PrimaryChromaticity** chromaticity);
398*103e46e4SHarish Mahendrakar float x;
399*103e46e4SHarish Mahendrakar float y;
400*103e46e4SHarish Mahendrakar };
401*103e46e4SHarish Mahendrakar
402*103e46e4SHarish Mahendrakar struct MasteringMetadata {
403*103e46e4SHarish Mahendrakar static const float kValueNotPresent;
404*103e46e4SHarish Mahendrakar
MasteringMetadataMasteringMetadata405*103e46e4SHarish Mahendrakar MasteringMetadata()
406*103e46e4SHarish Mahendrakar : r(NULL),
407*103e46e4SHarish Mahendrakar g(NULL),
408*103e46e4SHarish Mahendrakar b(NULL),
409*103e46e4SHarish Mahendrakar white_point(NULL),
410*103e46e4SHarish Mahendrakar luminance_max(kValueNotPresent),
411*103e46e4SHarish Mahendrakar luminance_min(kValueNotPresent) {}
~MasteringMetadataMasteringMetadata412*103e46e4SHarish Mahendrakar ~MasteringMetadata() {
413*103e46e4SHarish Mahendrakar delete r;
414*103e46e4SHarish Mahendrakar delete g;
415*103e46e4SHarish Mahendrakar delete b;
416*103e46e4SHarish Mahendrakar delete white_point;
417*103e46e4SHarish Mahendrakar }
418*103e46e4SHarish Mahendrakar
419*103e46e4SHarish Mahendrakar static bool Parse(IMkvReader* reader, long long element_start,
420*103e46e4SHarish Mahendrakar long long element_size,
421*103e46e4SHarish Mahendrakar MasteringMetadata** mastering_metadata);
422*103e46e4SHarish Mahendrakar
423*103e46e4SHarish Mahendrakar PrimaryChromaticity* r;
424*103e46e4SHarish Mahendrakar PrimaryChromaticity* g;
425*103e46e4SHarish Mahendrakar PrimaryChromaticity* b;
426*103e46e4SHarish Mahendrakar PrimaryChromaticity* white_point;
427*103e46e4SHarish Mahendrakar float luminance_max;
428*103e46e4SHarish Mahendrakar float luminance_min;
429*103e46e4SHarish Mahendrakar };
430*103e46e4SHarish Mahendrakar
431*103e46e4SHarish Mahendrakar struct Colour {
432*103e46e4SHarish Mahendrakar static const long long kValueNotPresent;
433*103e46e4SHarish Mahendrakar
434*103e46e4SHarish Mahendrakar // Unless otherwise noted all values assigned upon construction are the
435*103e46e4SHarish Mahendrakar // equivalent of unspecified/default.
ColourColour436*103e46e4SHarish Mahendrakar Colour()
437*103e46e4SHarish Mahendrakar : matrix_coefficients(kValueNotPresent),
438*103e46e4SHarish Mahendrakar bits_per_channel(kValueNotPresent),
439*103e46e4SHarish Mahendrakar chroma_subsampling_horz(kValueNotPresent),
440*103e46e4SHarish Mahendrakar chroma_subsampling_vert(kValueNotPresent),
441*103e46e4SHarish Mahendrakar cb_subsampling_horz(kValueNotPresent),
442*103e46e4SHarish Mahendrakar cb_subsampling_vert(kValueNotPresent),
443*103e46e4SHarish Mahendrakar chroma_siting_horz(kValueNotPresent),
444*103e46e4SHarish Mahendrakar chroma_siting_vert(kValueNotPresent),
445*103e46e4SHarish Mahendrakar range(kValueNotPresent),
446*103e46e4SHarish Mahendrakar transfer_characteristics(kValueNotPresent),
447*103e46e4SHarish Mahendrakar primaries(kValueNotPresent),
448*103e46e4SHarish Mahendrakar max_cll(kValueNotPresent),
449*103e46e4SHarish Mahendrakar max_fall(kValueNotPresent),
450*103e46e4SHarish Mahendrakar mastering_metadata(NULL) {}
~ColourColour451*103e46e4SHarish Mahendrakar ~Colour() {
452*103e46e4SHarish Mahendrakar delete mastering_metadata;
453*103e46e4SHarish Mahendrakar mastering_metadata = NULL;
454*103e46e4SHarish Mahendrakar }
455*103e46e4SHarish Mahendrakar
456*103e46e4SHarish Mahendrakar static bool Parse(IMkvReader* reader, long long element_start,
457*103e46e4SHarish Mahendrakar long long element_size, Colour** colour);
458*103e46e4SHarish Mahendrakar
459*103e46e4SHarish Mahendrakar long long matrix_coefficients;
460*103e46e4SHarish Mahendrakar long long bits_per_channel;
461*103e46e4SHarish Mahendrakar long long chroma_subsampling_horz;
462*103e46e4SHarish Mahendrakar long long chroma_subsampling_vert;
463*103e46e4SHarish Mahendrakar long long cb_subsampling_horz;
464*103e46e4SHarish Mahendrakar long long cb_subsampling_vert;
465*103e46e4SHarish Mahendrakar long long chroma_siting_horz;
466*103e46e4SHarish Mahendrakar long long chroma_siting_vert;
467*103e46e4SHarish Mahendrakar long long range;
468*103e46e4SHarish Mahendrakar long long transfer_characteristics;
469*103e46e4SHarish Mahendrakar long long primaries;
470*103e46e4SHarish Mahendrakar long long max_cll;
471*103e46e4SHarish Mahendrakar long long max_fall;
472*103e46e4SHarish Mahendrakar
473*103e46e4SHarish Mahendrakar MasteringMetadata* mastering_metadata;
474*103e46e4SHarish Mahendrakar };
475*103e46e4SHarish Mahendrakar
476*103e46e4SHarish Mahendrakar struct Projection {
477*103e46e4SHarish Mahendrakar enum ProjectionType {
478*103e46e4SHarish Mahendrakar kTypeNotPresent = -1,
479*103e46e4SHarish Mahendrakar kRectangular = 0,
480*103e46e4SHarish Mahendrakar kEquirectangular = 1,
481*103e46e4SHarish Mahendrakar kCubeMap = 2,
482*103e46e4SHarish Mahendrakar kMesh = 3,
483*103e46e4SHarish Mahendrakar };
484*103e46e4SHarish Mahendrakar static const float kValueNotPresent;
ProjectionProjection485*103e46e4SHarish Mahendrakar Projection()
486*103e46e4SHarish Mahendrakar : type(kTypeNotPresent),
487*103e46e4SHarish Mahendrakar private_data(NULL),
488*103e46e4SHarish Mahendrakar private_data_length(0),
489*103e46e4SHarish Mahendrakar pose_yaw(kValueNotPresent),
490*103e46e4SHarish Mahendrakar pose_pitch(kValueNotPresent),
491*103e46e4SHarish Mahendrakar pose_roll(kValueNotPresent) {}
~ProjectionProjection492*103e46e4SHarish Mahendrakar ~Projection() { delete[] private_data; }
493*103e46e4SHarish Mahendrakar static bool Parse(IMkvReader* reader, long long element_start,
494*103e46e4SHarish Mahendrakar long long element_size, Projection** projection);
495*103e46e4SHarish Mahendrakar
496*103e46e4SHarish Mahendrakar ProjectionType type;
497*103e46e4SHarish Mahendrakar unsigned char* private_data;
498*103e46e4SHarish Mahendrakar size_t private_data_length;
499*103e46e4SHarish Mahendrakar float pose_yaw;
500*103e46e4SHarish Mahendrakar float pose_pitch;
501*103e46e4SHarish Mahendrakar float pose_roll;
502*103e46e4SHarish Mahendrakar };
503*103e46e4SHarish Mahendrakar
504*103e46e4SHarish Mahendrakar class VideoTrack : public Track {
505*103e46e4SHarish Mahendrakar VideoTrack(const VideoTrack&);
506*103e46e4SHarish Mahendrakar VideoTrack& operator=(const VideoTrack&);
507*103e46e4SHarish Mahendrakar
508*103e46e4SHarish Mahendrakar VideoTrack(Segment*, long long element_start, long long element_size);
509*103e46e4SHarish Mahendrakar
510*103e46e4SHarish Mahendrakar public:
511*103e46e4SHarish Mahendrakar virtual ~VideoTrack();
512*103e46e4SHarish Mahendrakar static long Parse(Segment*, const Info&, long long element_start,
513*103e46e4SHarish Mahendrakar long long element_size, VideoTrack*&);
514*103e46e4SHarish Mahendrakar
515*103e46e4SHarish Mahendrakar long long GetWidth() const;
516*103e46e4SHarish Mahendrakar long long GetHeight() const;
517*103e46e4SHarish Mahendrakar long long GetDisplayWidth() const;
518*103e46e4SHarish Mahendrakar long long GetDisplayHeight() const;
519*103e46e4SHarish Mahendrakar long long GetDisplayUnit() const;
520*103e46e4SHarish Mahendrakar long long GetStereoMode() const;
521*103e46e4SHarish Mahendrakar double GetFrameRate() const;
522*103e46e4SHarish Mahendrakar
523*103e46e4SHarish Mahendrakar bool VetEntry(const BlockEntry*) const;
524*103e46e4SHarish Mahendrakar long Seek(long long time_ns, const BlockEntry*&) const;
525*103e46e4SHarish Mahendrakar
526*103e46e4SHarish Mahendrakar Colour* GetColour() const;
527*103e46e4SHarish Mahendrakar
528*103e46e4SHarish Mahendrakar Projection* GetProjection() const;
529*103e46e4SHarish Mahendrakar
GetColourSpace()530*103e46e4SHarish Mahendrakar const char* GetColourSpace() const { return m_colour_space; }
531*103e46e4SHarish Mahendrakar
532*103e46e4SHarish Mahendrakar private:
533*103e46e4SHarish Mahendrakar long long m_width;
534*103e46e4SHarish Mahendrakar long long m_height;
535*103e46e4SHarish Mahendrakar long long m_display_width;
536*103e46e4SHarish Mahendrakar long long m_display_height;
537*103e46e4SHarish Mahendrakar long long m_display_unit;
538*103e46e4SHarish Mahendrakar long long m_stereo_mode;
539*103e46e4SHarish Mahendrakar char* m_colour_space;
540*103e46e4SHarish Mahendrakar double m_rate;
541*103e46e4SHarish Mahendrakar
542*103e46e4SHarish Mahendrakar Colour* m_colour;
543*103e46e4SHarish Mahendrakar Projection* m_projection;
544*103e46e4SHarish Mahendrakar };
545*103e46e4SHarish Mahendrakar
546*103e46e4SHarish Mahendrakar class AudioTrack : public Track {
547*103e46e4SHarish Mahendrakar AudioTrack(const AudioTrack&);
548*103e46e4SHarish Mahendrakar AudioTrack& operator=(const AudioTrack&);
549*103e46e4SHarish Mahendrakar
550*103e46e4SHarish Mahendrakar AudioTrack(Segment*, long long element_start, long long element_size);
551*103e46e4SHarish Mahendrakar
552*103e46e4SHarish Mahendrakar public:
553*103e46e4SHarish Mahendrakar static long Parse(Segment*, const Info&, long long element_start,
554*103e46e4SHarish Mahendrakar long long element_size, AudioTrack*&);
555*103e46e4SHarish Mahendrakar
556*103e46e4SHarish Mahendrakar double GetSamplingRate() const;
557*103e46e4SHarish Mahendrakar long long GetChannels() const;
558*103e46e4SHarish Mahendrakar long long GetBitDepth() const;
559*103e46e4SHarish Mahendrakar
560*103e46e4SHarish Mahendrakar private:
561*103e46e4SHarish Mahendrakar double m_rate;
562*103e46e4SHarish Mahendrakar long long m_channels;
563*103e46e4SHarish Mahendrakar long long m_bitDepth;
564*103e46e4SHarish Mahendrakar };
565*103e46e4SHarish Mahendrakar
566*103e46e4SHarish Mahendrakar class Tracks {
567*103e46e4SHarish Mahendrakar Tracks(const Tracks&);
568*103e46e4SHarish Mahendrakar Tracks& operator=(const Tracks&);
569*103e46e4SHarish Mahendrakar
570*103e46e4SHarish Mahendrakar public:
571*103e46e4SHarish Mahendrakar Segment* const m_pSegment;
572*103e46e4SHarish Mahendrakar const long long m_start;
573*103e46e4SHarish Mahendrakar const long long m_size;
574*103e46e4SHarish Mahendrakar const long long m_element_start;
575*103e46e4SHarish Mahendrakar const long long m_element_size;
576*103e46e4SHarish Mahendrakar
577*103e46e4SHarish Mahendrakar Tracks(Segment*, long long start, long long size, long long element_start,
578*103e46e4SHarish Mahendrakar long long element_size);
579*103e46e4SHarish Mahendrakar
580*103e46e4SHarish Mahendrakar ~Tracks();
581*103e46e4SHarish Mahendrakar
582*103e46e4SHarish Mahendrakar long Parse();
583*103e46e4SHarish Mahendrakar
584*103e46e4SHarish Mahendrakar unsigned long GetTracksCount() const;
585*103e46e4SHarish Mahendrakar
586*103e46e4SHarish Mahendrakar const Track* GetTrackByNumber(long tn) const;
587*103e46e4SHarish Mahendrakar const Track* GetTrackByIndex(unsigned long idx) const;
588*103e46e4SHarish Mahendrakar
589*103e46e4SHarish Mahendrakar private:
590*103e46e4SHarish Mahendrakar Track** m_trackEntries;
591*103e46e4SHarish Mahendrakar Track** m_trackEntriesEnd;
592*103e46e4SHarish Mahendrakar
593*103e46e4SHarish Mahendrakar long ParseTrackEntry(long long payload_start, long long payload_size,
594*103e46e4SHarish Mahendrakar long long element_start, long long element_size,
595*103e46e4SHarish Mahendrakar Track*&) const;
596*103e46e4SHarish Mahendrakar };
597*103e46e4SHarish Mahendrakar
598*103e46e4SHarish Mahendrakar class Chapters {
599*103e46e4SHarish Mahendrakar Chapters(const Chapters&);
600*103e46e4SHarish Mahendrakar Chapters& operator=(const Chapters&);
601*103e46e4SHarish Mahendrakar
602*103e46e4SHarish Mahendrakar public:
603*103e46e4SHarish Mahendrakar Segment* const m_pSegment;
604*103e46e4SHarish Mahendrakar const long long m_start;
605*103e46e4SHarish Mahendrakar const long long m_size;
606*103e46e4SHarish Mahendrakar const long long m_element_start;
607*103e46e4SHarish Mahendrakar const long long m_element_size;
608*103e46e4SHarish Mahendrakar
609*103e46e4SHarish Mahendrakar Chapters(Segment*, long long payload_start, long long payload_size,
610*103e46e4SHarish Mahendrakar long long element_start, long long element_size);
611*103e46e4SHarish Mahendrakar
612*103e46e4SHarish Mahendrakar ~Chapters();
613*103e46e4SHarish Mahendrakar
614*103e46e4SHarish Mahendrakar long Parse();
615*103e46e4SHarish Mahendrakar
616*103e46e4SHarish Mahendrakar class Atom;
617*103e46e4SHarish Mahendrakar class Edition;
618*103e46e4SHarish Mahendrakar
619*103e46e4SHarish Mahendrakar class Display {
620*103e46e4SHarish Mahendrakar friend class Atom;
621*103e46e4SHarish Mahendrakar Display();
622*103e46e4SHarish Mahendrakar Display(const Display&);
623*103e46e4SHarish Mahendrakar ~Display();
624*103e46e4SHarish Mahendrakar Display& operator=(const Display&);
625*103e46e4SHarish Mahendrakar
626*103e46e4SHarish Mahendrakar public:
627*103e46e4SHarish Mahendrakar const char* GetString() const;
628*103e46e4SHarish Mahendrakar const char* GetLanguage() const;
629*103e46e4SHarish Mahendrakar const char* GetCountry() const;
630*103e46e4SHarish Mahendrakar
631*103e46e4SHarish Mahendrakar private:
632*103e46e4SHarish Mahendrakar void Init();
633*103e46e4SHarish Mahendrakar void ShallowCopy(Display&) const;
634*103e46e4SHarish Mahendrakar void Clear();
635*103e46e4SHarish Mahendrakar long Parse(IMkvReader*, long long pos, long long size);
636*103e46e4SHarish Mahendrakar
637*103e46e4SHarish Mahendrakar char* m_string;
638*103e46e4SHarish Mahendrakar char* m_language;
639*103e46e4SHarish Mahendrakar char* m_country;
640*103e46e4SHarish Mahendrakar };
641*103e46e4SHarish Mahendrakar
642*103e46e4SHarish Mahendrakar class Atom {
643*103e46e4SHarish Mahendrakar friend class Edition;
644*103e46e4SHarish Mahendrakar Atom();
645*103e46e4SHarish Mahendrakar Atom(const Atom&);
646*103e46e4SHarish Mahendrakar ~Atom();
647*103e46e4SHarish Mahendrakar Atom& operator=(const Atom&);
648*103e46e4SHarish Mahendrakar
649*103e46e4SHarish Mahendrakar public:
650*103e46e4SHarish Mahendrakar unsigned long long GetUID() const;
651*103e46e4SHarish Mahendrakar const char* GetStringUID() const;
652*103e46e4SHarish Mahendrakar
653*103e46e4SHarish Mahendrakar long long GetStartTimecode() const;
654*103e46e4SHarish Mahendrakar long long GetStopTimecode() const;
655*103e46e4SHarish Mahendrakar
656*103e46e4SHarish Mahendrakar long long GetStartTime(const Chapters*) const;
657*103e46e4SHarish Mahendrakar long long GetStopTime(const Chapters*) const;
658*103e46e4SHarish Mahendrakar
659*103e46e4SHarish Mahendrakar int GetDisplayCount() const;
660*103e46e4SHarish Mahendrakar const Display* GetDisplay(int index) const;
661*103e46e4SHarish Mahendrakar
662*103e46e4SHarish Mahendrakar private:
663*103e46e4SHarish Mahendrakar void Init();
664*103e46e4SHarish Mahendrakar void ShallowCopy(Atom&) const;
665*103e46e4SHarish Mahendrakar void Clear();
666*103e46e4SHarish Mahendrakar long Parse(IMkvReader*, long long pos, long long size);
667*103e46e4SHarish Mahendrakar static long long GetTime(const Chapters*, long long timecode);
668*103e46e4SHarish Mahendrakar
669*103e46e4SHarish Mahendrakar long ParseDisplay(IMkvReader*, long long pos, long long size);
670*103e46e4SHarish Mahendrakar bool ExpandDisplaysArray();
671*103e46e4SHarish Mahendrakar
672*103e46e4SHarish Mahendrakar char* m_string_uid;
673*103e46e4SHarish Mahendrakar unsigned long long m_uid;
674*103e46e4SHarish Mahendrakar long long m_start_timecode;
675*103e46e4SHarish Mahendrakar long long m_stop_timecode;
676*103e46e4SHarish Mahendrakar
677*103e46e4SHarish Mahendrakar Display* m_displays;
678*103e46e4SHarish Mahendrakar int m_displays_size;
679*103e46e4SHarish Mahendrakar int m_displays_count;
680*103e46e4SHarish Mahendrakar };
681*103e46e4SHarish Mahendrakar
682*103e46e4SHarish Mahendrakar class Edition {
683*103e46e4SHarish Mahendrakar friend class Chapters;
684*103e46e4SHarish Mahendrakar Edition();
685*103e46e4SHarish Mahendrakar Edition(const Edition&);
686*103e46e4SHarish Mahendrakar ~Edition();
687*103e46e4SHarish Mahendrakar Edition& operator=(const Edition&);
688*103e46e4SHarish Mahendrakar
689*103e46e4SHarish Mahendrakar public:
690*103e46e4SHarish Mahendrakar int GetAtomCount() const;
691*103e46e4SHarish Mahendrakar const Atom* GetAtom(int index) const;
692*103e46e4SHarish Mahendrakar
693*103e46e4SHarish Mahendrakar private:
694*103e46e4SHarish Mahendrakar void Init();
695*103e46e4SHarish Mahendrakar void ShallowCopy(Edition&) const;
696*103e46e4SHarish Mahendrakar void Clear();
697*103e46e4SHarish Mahendrakar long Parse(IMkvReader*, long long pos, long long size);
698*103e46e4SHarish Mahendrakar
699*103e46e4SHarish Mahendrakar long ParseAtom(IMkvReader*, long long pos, long long size);
700*103e46e4SHarish Mahendrakar bool ExpandAtomsArray();
701*103e46e4SHarish Mahendrakar
702*103e46e4SHarish Mahendrakar Atom* m_atoms;
703*103e46e4SHarish Mahendrakar int m_atoms_size;
704*103e46e4SHarish Mahendrakar int m_atoms_count;
705*103e46e4SHarish Mahendrakar };
706*103e46e4SHarish Mahendrakar
707*103e46e4SHarish Mahendrakar int GetEditionCount() const;
708*103e46e4SHarish Mahendrakar const Edition* GetEdition(int index) const;
709*103e46e4SHarish Mahendrakar
710*103e46e4SHarish Mahendrakar private:
711*103e46e4SHarish Mahendrakar long ParseEdition(long long pos, long long size);
712*103e46e4SHarish Mahendrakar bool ExpandEditionsArray();
713*103e46e4SHarish Mahendrakar
714*103e46e4SHarish Mahendrakar Edition* m_editions;
715*103e46e4SHarish Mahendrakar int m_editions_size;
716*103e46e4SHarish Mahendrakar int m_editions_count;
717*103e46e4SHarish Mahendrakar };
718*103e46e4SHarish Mahendrakar
719*103e46e4SHarish Mahendrakar class Tags {
720*103e46e4SHarish Mahendrakar Tags(const Tags&);
721*103e46e4SHarish Mahendrakar Tags& operator=(const Tags&);
722*103e46e4SHarish Mahendrakar
723*103e46e4SHarish Mahendrakar public:
724*103e46e4SHarish Mahendrakar Segment* const m_pSegment;
725*103e46e4SHarish Mahendrakar const long long m_start;
726*103e46e4SHarish Mahendrakar const long long m_size;
727*103e46e4SHarish Mahendrakar const long long m_element_start;
728*103e46e4SHarish Mahendrakar const long long m_element_size;
729*103e46e4SHarish Mahendrakar
730*103e46e4SHarish Mahendrakar Tags(Segment*, long long payload_start, long long payload_size,
731*103e46e4SHarish Mahendrakar long long element_start, long long element_size);
732*103e46e4SHarish Mahendrakar
733*103e46e4SHarish Mahendrakar ~Tags();
734*103e46e4SHarish Mahendrakar
735*103e46e4SHarish Mahendrakar long Parse();
736*103e46e4SHarish Mahendrakar
737*103e46e4SHarish Mahendrakar class Tag;
738*103e46e4SHarish Mahendrakar class SimpleTag;
739*103e46e4SHarish Mahendrakar
740*103e46e4SHarish Mahendrakar class SimpleTag {
741*103e46e4SHarish Mahendrakar friend class Tag;
742*103e46e4SHarish Mahendrakar SimpleTag();
743*103e46e4SHarish Mahendrakar SimpleTag(const SimpleTag&);
744*103e46e4SHarish Mahendrakar ~SimpleTag();
745*103e46e4SHarish Mahendrakar SimpleTag& operator=(const SimpleTag&);
746*103e46e4SHarish Mahendrakar
747*103e46e4SHarish Mahendrakar public:
748*103e46e4SHarish Mahendrakar const char* GetTagName() const;
749*103e46e4SHarish Mahendrakar const char* GetTagString() const;
750*103e46e4SHarish Mahendrakar
751*103e46e4SHarish Mahendrakar private:
752*103e46e4SHarish Mahendrakar void Init();
753*103e46e4SHarish Mahendrakar void ShallowCopy(SimpleTag&) const;
754*103e46e4SHarish Mahendrakar void Clear();
755*103e46e4SHarish Mahendrakar long Parse(IMkvReader*, long long pos, long long size);
756*103e46e4SHarish Mahendrakar
757*103e46e4SHarish Mahendrakar char* m_tag_name;
758*103e46e4SHarish Mahendrakar char* m_tag_string;
759*103e46e4SHarish Mahendrakar };
760*103e46e4SHarish Mahendrakar
761*103e46e4SHarish Mahendrakar class Tag {
762*103e46e4SHarish Mahendrakar friend class Tags;
763*103e46e4SHarish Mahendrakar Tag();
764*103e46e4SHarish Mahendrakar Tag(const Tag&);
765*103e46e4SHarish Mahendrakar ~Tag();
766*103e46e4SHarish Mahendrakar Tag& operator=(const Tag&);
767*103e46e4SHarish Mahendrakar
768*103e46e4SHarish Mahendrakar public:
769*103e46e4SHarish Mahendrakar int GetSimpleTagCount() const;
770*103e46e4SHarish Mahendrakar const SimpleTag* GetSimpleTag(int index) const;
771*103e46e4SHarish Mahendrakar
772*103e46e4SHarish Mahendrakar private:
773*103e46e4SHarish Mahendrakar void Init();
774*103e46e4SHarish Mahendrakar void ShallowCopy(Tag&) const;
775*103e46e4SHarish Mahendrakar void Clear();
776*103e46e4SHarish Mahendrakar long Parse(IMkvReader*, long long pos, long long size);
777*103e46e4SHarish Mahendrakar
778*103e46e4SHarish Mahendrakar long ParseSimpleTag(IMkvReader*, long long pos, long long size);
779*103e46e4SHarish Mahendrakar bool ExpandSimpleTagsArray();
780*103e46e4SHarish Mahendrakar
781*103e46e4SHarish Mahendrakar SimpleTag* m_simple_tags;
782*103e46e4SHarish Mahendrakar int m_simple_tags_size;
783*103e46e4SHarish Mahendrakar int m_simple_tags_count;
784*103e46e4SHarish Mahendrakar };
785*103e46e4SHarish Mahendrakar
786*103e46e4SHarish Mahendrakar int GetTagCount() const;
787*103e46e4SHarish Mahendrakar const Tag* GetTag(int index) const;
788*103e46e4SHarish Mahendrakar
789*103e46e4SHarish Mahendrakar private:
790*103e46e4SHarish Mahendrakar long ParseTag(long long pos, long long size);
791*103e46e4SHarish Mahendrakar bool ExpandTagsArray();
792*103e46e4SHarish Mahendrakar
793*103e46e4SHarish Mahendrakar Tag* m_tags;
794*103e46e4SHarish Mahendrakar int m_tags_size;
795*103e46e4SHarish Mahendrakar int m_tags_count;
796*103e46e4SHarish Mahendrakar };
797*103e46e4SHarish Mahendrakar
798*103e46e4SHarish Mahendrakar class SegmentInfo {
799*103e46e4SHarish Mahendrakar SegmentInfo(const SegmentInfo&);
800*103e46e4SHarish Mahendrakar SegmentInfo& operator=(const SegmentInfo&);
801*103e46e4SHarish Mahendrakar
802*103e46e4SHarish Mahendrakar public:
803*103e46e4SHarish Mahendrakar Segment* const m_pSegment;
804*103e46e4SHarish Mahendrakar const long long m_start;
805*103e46e4SHarish Mahendrakar const long long m_size;
806*103e46e4SHarish Mahendrakar const long long m_element_start;
807*103e46e4SHarish Mahendrakar const long long m_element_size;
808*103e46e4SHarish Mahendrakar
809*103e46e4SHarish Mahendrakar SegmentInfo(Segment*, long long start, long long size,
810*103e46e4SHarish Mahendrakar long long element_start, long long element_size);
811*103e46e4SHarish Mahendrakar
812*103e46e4SHarish Mahendrakar ~SegmentInfo();
813*103e46e4SHarish Mahendrakar
814*103e46e4SHarish Mahendrakar long Parse();
815*103e46e4SHarish Mahendrakar
816*103e46e4SHarish Mahendrakar long long GetTimeCodeScale() const;
817*103e46e4SHarish Mahendrakar long long GetDuration() const; // scaled
818*103e46e4SHarish Mahendrakar const char* GetMuxingAppAsUTF8() const;
819*103e46e4SHarish Mahendrakar const char* GetWritingAppAsUTF8() const;
820*103e46e4SHarish Mahendrakar const char* GetTitleAsUTF8() const;
821*103e46e4SHarish Mahendrakar
822*103e46e4SHarish Mahendrakar private:
823*103e46e4SHarish Mahendrakar long long m_timecodeScale;
824*103e46e4SHarish Mahendrakar double m_duration;
825*103e46e4SHarish Mahendrakar char* m_pMuxingAppAsUTF8;
826*103e46e4SHarish Mahendrakar char* m_pWritingAppAsUTF8;
827*103e46e4SHarish Mahendrakar char* m_pTitleAsUTF8;
828*103e46e4SHarish Mahendrakar };
829*103e46e4SHarish Mahendrakar
830*103e46e4SHarish Mahendrakar class SeekHead {
831*103e46e4SHarish Mahendrakar SeekHead(const SeekHead&);
832*103e46e4SHarish Mahendrakar SeekHead& operator=(const SeekHead&);
833*103e46e4SHarish Mahendrakar
834*103e46e4SHarish Mahendrakar public:
835*103e46e4SHarish Mahendrakar Segment* const m_pSegment;
836*103e46e4SHarish Mahendrakar const long long m_start;
837*103e46e4SHarish Mahendrakar const long long m_size;
838*103e46e4SHarish Mahendrakar const long long m_element_start;
839*103e46e4SHarish Mahendrakar const long long m_element_size;
840*103e46e4SHarish Mahendrakar
841*103e46e4SHarish Mahendrakar SeekHead(Segment*, long long start, long long size, long long element_start,
842*103e46e4SHarish Mahendrakar long long element_size);
843*103e46e4SHarish Mahendrakar
844*103e46e4SHarish Mahendrakar ~SeekHead();
845*103e46e4SHarish Mahendrakar
846*103e46e4SHarish Mahendrakar long Parse();
847*103e46e4SHarish Mahendrakar
848*103e46e4SHarish Mahendrakar struct Entry {
849*103e46e4SHarish Mahendrakar Entry();
850*103e46e4SHarish Mahendrakar
851*103e46e4SHarish Mahendrakar // the SeekHead entry payload
852*103e46e4SHarish Mahendrakar long long id;
853*103e46e4SHarish Mahendrakar long long pos;
854*103e46e4SHarish Mahendrakar
855*103e46e4SHarish Mahendrakar // absolute pos of SeekEntry ID
856*103e46e4SHarish Mahendrakar long long element_start;
857*103e46e4SHarish Mahendrakar
858*103e46e4SHarish Mahendrakar // SeekEntry ID size + size size + payload
859*103e46e4SHarish Mahendrakar long long element_size;
860*103e46e4SHarish Mahendrakar };
861*103e46e4SHarish Mahendrakar
862*103e46e4SHarish Mahendrakar int GetCount() const;
863*103e46e4SHarish Mahendrakar const Entry* GetEntry(int idx) const;
864*103e46e4SHarish Mahendrakar
865*103e46e4SHarish Mahendrakar struct VoidElement {
866*103e46e4SHarish Mahendrakar // absolute pos of Void ID
867*103e46e4SHarish Mahendrakar long long element_start;
868*103e46e4SHarish Mahendrakar
869*103e46e4SHarish Mahendrakar // ID size + size size + payload size
870*103e46e4SHarish Mahendrakar long long element_size;
871*103e46e4SHarish Mahendrakar };
872*103e46e4SHarish Mahendrakar
873*103e46e4SHarish Mahendrakar int GetVoidElementCount() const;
874*103e46e4SHarish Mahendrakar const VoidElement* GetVoidElement(int idx) const;
875*103e46e4SHarish Mahendrakar
876*103e46e4SHarish Mahendrakar private:
877*103e46e4SHarish Mahendrakar Entry* m_entries;
878*103e46e4SHarish Mahendrakar int m_entry_count;
879*103e46e4SHarish Mahendrakar
880*103e46e4SHarish Mahendrakar VoidElement* m_void_elements;
881*103e46e4SHarish Mahendrakar int m_void_element_count;
882*103e46e4SHarish Mahendrakar
883*103e46e4SHarish Mahendrakar static bool ParseEntry(IMkvReader*,
884*103e46e4SHarish Mahendrakar long long pos, // payload
885*103e46e4SHarish Mahendrakar long long size, Entry*);
886*103e46e4SHarish Mahendrakar };
887*103e46e4SHarish Mahendrakar
888*103e46e4SHarish Mahendrakar class Cues;
889*103e46e4SHarish Mahendrakar class CuePoint {
890*103e46e4SHarish Mahendrakar friend class Cues;
891*103e46e4SHarish Mahendrakar
892*103e46e4SHarish Mahendrakar CuePoint(long, long long);
893*103e46e4SHarish Mahendrakar ~CuePoint();
894*103e46e4SHarish Mahendrakar
895*103e46e4SHarish Mahendrakar CuePoint(const CuePoint&);
896*103e46e4SHarish Mahendrakar CuePoint& operator=(const CuePoint&);
897*103e46e4SHarish Mahendrakar
898*103e46e4SHarish Mahendrakar public:
899*103e46e4SHarish Mahendrakar long long m_element_start;
900*103e46e4SHarish Mahendrakar long long m_element_size;
901*103e46e4SHarish Mahendrakar
902*103e46e4SHarish Mahendrakar bool Load(IMkvReader*);
903*103e46e4SHarish Mahendrakar
904*103e46e4SHarish Mahendrakar long long GetTimeCode() const; // absolute but unscaled
905*103e46e4SHarish Mahendrakar long long GetTime(const Segment*) const; // absolute and scaled (ns units)
906*103e46e4SHarish Mahendrakar
907*103e46e4SHarish Mahendrakar struct TrackPosition {
908*103e46e4SHarish Mahendrakar long long m_track;
909*103e46e4SHarish Mahendrakar long long m_pos; // of cluster
910*103e46e4SHarish Mahendrakar long long m_block;
911*103e46e4SHarish Mahendrakar // codec_state //defaults to 0
912*103e46e4SHarish Mahendrakar // reference = clusters containing req'd referenced blocks
913*103e46e4SHarish Mahendrakar // reftime = timecode of the referenced block
914*103e46e4SHarish Mahendrakar
915*103e46e4SHarish Mahendrakar bool Parse(IMkvReader*, long long, long long);
916*103e46e4SHarish Mahendrakar };
917*103e46e4SHarish Mahendrakar
918*103e46e4SHarish Mahendrakar const TrackPosition* Find(const Track*) const;
919*103e46e4SHarish Mahendrakar
920*103e46e4SHarish Mahendrakar private:
921*103e46e4SHarish Mahendrakar const long m_index;
922*103e46e4SHarish Mahendrakar long long m_timecode;
923*103e46e4SHarish Mahendrakar TrackPosition* m_track_positions;
924*103e46e4SHarish Mahendrakar size_t m_track_positions_count;
925*103e46e4SHarish Mahendrakar };
926*103e46e4SHarish Mahendrakar
927*103e46e4SHarish Mahendrakar class Cues {
928*103e46e4SHarish Mahendrakar friend class Segment;
929*103e46e4SHarish Mahendrakar
930*103e46e4SHarish Mahendrakar Cues(Segment*, long long start, long long size, long long element_start,
931*103e46e4SHarish Mahendrakar long long element_size);
932*103e46e4SHarish Mahendrakar ~Cues();
933*103e46e4SHarish Mahendrakar
934*103e46e4SHarish Mahendrakar Cues(const Cues&);
935*103e46e4SHarish Mahendrakar Cues& operator=(const Cues&);
936*103e46e4SHarish Mahendrakar
937*103e46e4SHarish Mahendrakar public:
938*103e46e4SHarish Mahendrakar Segment* const m_pSegment;
939*103e46e4SHarish Mahendrakar const long long m_start;
940*103e46e4SHarish Mahendrakar const long long m_size;
941*103e46e4SHarish Mahendrakar const long long m_element_start;
942*103e46e4SHarish Mahendrakar const long long m_element_size;
943*103e46e4SHarish Mahendrakar
944*103e46e4SHarish Mahendrakar bool Find( // lower bound of time_ns
945*103e46e4SHarish Mahendrakar long long time_ns, const Track*, const CuePoint*&,
946*103e46e4SHarish Mahendrakar const CuePoint::TrackPosition*&) const;
947*103e46e4SHarish Mahendrakar
948*103e46e4SHarish Mahendrakar const CuePoint* GetFirst() const;
949*103e46e4SHarish Mahendrakar const CuePoint* GetLast() const;
950*103e46e4SHarish Mahendrakar const CuePoint* GetNext(const CuePoint*) const;
951*103e46e4SHarish Mahendrakar
952*103e46e4SHarish Mahendrakar const BlockEntry* GetBlock(const CuePoint*,
953*103e46e4SHarish Mahendrakar const CuePoint::TrackPosition*) const;
954*103e46e4SHarish Mahendrakar
955*103e46e4SHarish Mahendrakar bool LoadCuePoint() const;
956*103e46e4SHarish Mahendrakar long GetCount() const; // loaded only
957*103e46e4SHarish Mahendrakar // long GetTotal() const; //loaded + preloaded
958*103e46e4SHarish Mahendrakar bool DoneParsing() const;
959*103e46e4SHarish Mahendrakar
960*103e46e4SHarish Mahendrakar private:
961*103e46e4SHarish Mahendrakar bool Init() const;
962*103e46e4SHarish Mahendrakar bool PreloadCuePoint(long&, long long) const;
963*103e46e4SHarish Mahendrakar
964*103e46e4SHarish Mahendrakar mutable CuePoint** m_cue_points;
965*103e46e4SHarish Mahendrakar mutable long m_count;
966*103e46e4SHarish Mahendrakar mutable long m_preload_count;
967*103e46e4SHarish Mahendrakar mutable long long m_pos;
968*103e46e4SHarish Mahendrakar };
969*103e46e4SHarish Mahendrakar
970*103e46e4SHarish Mahendrakar class Cluster {
971*103e46e4SHarish Mahendrakar friend class Segment;
972*103e46e4SHarish Mahendrakar
973*103e46e4SHarish Mahendrakar Cluster(const Cluster&);
974*103e46e4SHarish Mahendrakar Cluster& operator=(const Cluster&);
975*103e46e4SHarish Mahendrakar
976*103e46e4SHarish Mahendrakar public:
977*103e46e4SHarish Mahendrakar Segment* const m_pSegment;
978*103e46e4SHarish Mahendrakar
979*103e46e4SHarish Mahendrakar public:
980*103e46e4SHarish Mahendrakar static Cluster* Create(Segment*,
981*103e46e4SHarish Mahendrakar long index, // index in segment
982*103e46e4SHarish Mahendrakar long long off); // offset relative to segment
983*103e46e4SHarish Mahendrakar // long long element_size);
984*103e46e4SHarish Mahendrakar
985*103e46e4SHarish Mahendrakar Cluster(); // EndOfStream
986*103e46e4SHarish Mahendrakar ~Cluster();
987*103e46e4SHarish Mahendrakar
988*103e46e4SHarish Mahendrakar bool EOS() const;
989*103e46e4SHarish Mahendrakar
990*103e46e4SHarish Mahendrakar long long GetTimeCode() const; // absolute, but not scaled
991*103e46e4SHarish Mahendrakar long long GetTime() const; // absolute, and scaled (nanosecond units)
992*103e46e4SHarish Mahendrakar long long GetFirstTime() const; // time (ns) of first (earliest) block
993*103e46e4SHarish Mahendrakar long long GetLastTime() const; // time (ns) of last (latest) block
994*103e46e4SHarish Mahendrakar
995*103e46e4SHarish Mahendrakar long GetFirst(const BlockEntry*&) const;
996*103e46e4SHarish Mahendrakar long GetLast(const BlockEntry*&) const;
997*103e46e4SHarish Mahendrakar long GetNext(const BlockEntry* curr, const BlockEntry*& next) const;
998*103e46e4SHarish Mahendrakar
999*103e46e4SHarish Mahendrakar const BlockEntry* GetEntry(const Track*, long long ns = -1) const;
1000*103e46e4SHarish Mahendrakar const BlockEntry* GetEntry(const CuePoint&,
1001*103e46e4SHarish Mahendrakar const CuePoint::TrackPosition&) const;
1002*103e46e4SHarish Mahendrakar // const BlockEntry* GetMaxKey(const VideoTrack*) const;
1003*103e46e4SHarish Mahendrakar
1004*103e46e4SHarish Mahendrakar // static bool HasBlockEntries(const Segment*, long long);
1005*103e46e4SHarish Mahendrakar
1006*103e46e4SHarish Mahendrakar static long HasBlockEntries(const Segment*, long long idoff, long long& pos,
1007*103e46e4SHarish Mahendrakar long& size);
1008*103e46e4SHarish Mahendrakar
1009*103e46e4SHarish Mahendrakar long GetEntryCount() const;
1010*103e46e4SHarish Mahendrakar
1011*103e46e4SHarish Mahendrakar long Load(long long& pos, long& size) const;
1012*103e46e4SHarish Mahendrakar
1013*103e46e4SHarish Mahendrakar long Parse(long long& pos, long& size) const;
1014*103e46e4SHarish Mahendrakar long GetEntry(long index, const mkvparser::BlockEntry*&) const;
1015*103e46e4SHarish Mahendrakar
1016*103e46e4SHarish Mahendrakar protected:
1017*103e46e4SHarish Mahendrakar Cluster(Segment*, long index, long long element_start);
1018*103e46e4SHarish Mahendrakar // long long element_size);
1019*103e46e4SHarish Mahendrakar
1020*103e46e4SHarish Mahendrakar public:
1021*103e46e4SHarish Mahendrakar const long long m_element_start;
1022*103e46e4SHarish Mahendrakar long long GetPosition() const; // offset relative to segment
1023*103e46e4SHarish Mahendrakar
1024*103e46e4SHarish Mahendrakar long GetIndex() const;
1025*103e46e4SHarish Mahendrakar long long GetElementSize() const;
1026*103e46e4SHarish Mahendrakar // long long GetPayloadSize() const;
1027*103e46e4SHarish Mahendrakar
1028*103e46e4SHarish Mahendrakar // long long Unparsed() const;
1029*103e46e4SHarish Mahendrakar
1030*103e46e4SHarish Mahendrakar private:
1031*103e46e4SHarish Mahendrakar long m_index;
1032*103e46e4SHarish Mahendrakar mutable long long m_pos;
1033*103e46e4SHarish Mahendrakar // mutable long long m_size;
1034*103e46e4SHarish Mahendrakar mutable long long m_element_size;
1035*103e46e4SHarish Mahendrakar mutable long long m_timecode;
1036*103e46e4SHarish Mahendrakar mutable BlockEntry** m_entries;
1037*103e46e4SHarish Mahendrakar mutable long m_entries_size;
1038*103e46e4SHarish Mahendrakar mutable long m_entries_count;
1039*103e46e4SHarish Mahendrakar
1040*103e46e4SHarish Mahendrakar long ParseSimpleBlock(long long, long long&, long&);
1041*103e46e4SHarish Mahendrakar long ParseBlockGroup(long long, long long&, long&);
1042*103e46e4SHarish Mahendrakar
1043*103e46e4SHarish Mahendrakar long CreateBlock(long long id, long long pos, long long size,
1044*103e46e4SHarish Mahendrakar long long discard_padding);
1045*103e46e4SHarish Mahendrakar long CreateBlockGroup(long long start_offset, long long size,
1046*103e46e4SHarish Mahendrakar long long discard_padding);
1047*103e46e4SHarish Mahendrakar long CreateSimpleBlock(long long, long long);
1048*103e46e4SHarish Mahendrakar };
1049*103e46e4SHarish Mahendrakar
1050*103e46e4SHarish Mahendrakar class Segment {
1051*103e46e4SHarish Mahendrakar friend class Cues;
1052*103e46e4SHarish Mahendrakar friend class Track;
1053*103e46e4SHarish Mahendrakar friend class VideoTrack;
1054*103e46e4SHarish Mahendrakar
1055*103e46e4SHarish Mahendrakar Segment(const Segment&);
1056*103e46e4SHarish Mahendrakar Segment& operator=(const Segment&);
1057*103e46e4SHarish Mahendrakar
1058*103e46e4SHarish Mahendrakar private:
1059*103e46e4SHarish Mahendrakar Segment(IMkvReader*, long long elem_start,
1060*103e46e4SHarish Mahendrakar // long long elem_size,
1061*103e46e4SHarish Mahendrakar long long pos, long long size);
1062*103e46e4SHarish Mahendrakar
1063*103e46e4SHarish Mahendrakar public:
1064*103e46e4SHarish Mahendrakar IMkvReader* const m_pReader;
1065*103e46e4SHarish Mahendrakar const long long m_element_start;
1066*103e46e4SHarish Mahendrakar // const long long m_element_size;
1067*103e46e4SHarish Mahendrakar const long long m_start; // posn of segment payload
1068*103e46e4SHarish Mahendrakar const long long m_size; // size of segment payload
1069*103e46e4SHarish Mahendrakar Cluster m_eos; // TODO: make private?
1070*103e46e4SHarish Mahendrakar
1071*103e46e4SHarish Mahendrakar static long long CreateInstance(IMkvReader*, long long, Segment*&);
1072*103e46e4SHarish Mahendrakar ~Segment();
1073*103e46e4SHarish Mahendrakar
1074*103e46e4SHarish Mahendrakar long Load(); // loads headers and all clusters
1075*103e46e4SHarish Mahendrakar
1076*103e46e4SHarish Mahendrakar // for incremental loading
1077*103e46e4SHarish Mahendrakar // long long Unparsed() const;
1078*103e46e4SHarish Mahendrakar bool DoneParsing() const;
1079*103e46e4SHarish Mahendrakar long long ParseHeaders(); // stops when first cluster is found
1080*103e46e4SHarish Mahendrakar // long FindNextCluster(long long& pos, long& size) const;
1081*103e46e4SHarish Mahendrakar long LoadCluster(long long& pos, long& size); // load one cluster
1082*103e46e4SHarish Mahendrakar long LoadCluster();
1083*103e46e4SHarish Mahendrakar
1084*103e46e4SHarish Mahendrakar long ParseNext(const Cluster* pCurr, const Cluster*& pNext, long long& pos,
1085*103e46e4SHarish Mahendrakar long& size);
1086*103e46e4SHarish Mahendrakar
1087*103e46e4SHarish Mahendrakar const SeekHead* GetSeekHead() const;
1088*103e46e4SHarish Mahendrakar const Tracks* GetTracks() const;
1089*103e46e4SHarish Mahendrakar const SegmentInfo* GetInfo() const;
1090*103e46e4SHarish Mahendrakar const Cues* GetCues() const;
1091*103e46e4SHarish Mahendrakar const Chapters* GetChapters() const;
1092*103e46e4SHarish Mahendrakar const Tags* GetTags() const;
1093*103e46e4SHarish Mahendrakar
1094*103e46e4SHarish Mahendrakar long long GetDuration() const;
1095*103e46e4SHarish Mahendrakar
1096*103e46e4SHarish Mahendrakar unsigned long GetCount() const;
1097*103e46e4SHarish Mahendrakar const Cluster* GetFirst() const;
1098*103e46e4SHarish Mahendrakar const Cluster* GetLast() const;
1099*103e46e4SHarish Mahendrakar const Cluster* GetNext(const Cluster*);
1100*103e46e4SHarish Mahendrakar
1101*103e46e4SHarish Mahendrakar const Cluster* FindCluster(long long time_nanoseconds) const;
1102*103e46e4SHarish Mahendrakar // const BlockEntry* Seek(long long time_nanoseconds, const Track*) const;
1103*103e46e4SHarish Mahendrakar
1104*103e46e4SHarish Mahendrakar const Cluster* FindOrPreloadCluster(long long pos);
1105*103e46e4SHarish Mahendrakar
1106*103e46e4SHarish Mahendrakar long ParseCues(long long cues_off, // offset relative to start of segment
1107*103e46e4SHarish Mahendrakar long long& parse_pos, long& parse_len);
1108*103e46e4SHarish Mahendrakar
1109*103e46e4SHarish Mahendrakar private:
1110*103e46e4SHarish Mahendrakar long long m_pos; // absolute file posn; what has been consumed so far
1111*103e46e4SHarish Mahendrakar Cluster* m_pUnknownSize;
1112*103e46e4SHarish Mahendrakar
1113*103e46e4SHarish Mahendrakar SeekHead* m_pSeekHead;
1114*103e46e4SHarish Mahendrakar SegmentInfo* m_pInfo;
1115*103e46e4SHarish Mahendrakar Tracks* m_pTracks;
1116*103e46e4SHarish Mahendrakar Cues* m_pCues;
1117*103e46e4SHarish Mahendrakar Chapters* m_pChapters;
1118*103e46e4SHarish Mahendrakar Tags* m_pTags;
1119*103e46e4SHarish Mahendrakar Cluster** m_clusters;
1120*103e46e4SHarish Mahendrakar long m_clusterCount; // number of entries for which m_index >= 0
1121*103e46e4SHarish Mahendrakar long m_clusterPreloadCount; // number of entries for which m_index < 0
1122*103e46e4SHarish Mahendrakar long m_clusterSize; // array size
1123*103e46e4SHarish Mahendrakar
1124*103e46e4SHarish Mahendrakar long DoLoadCluster(long long&, long&);
1125*103e46e4SHarish Mahendrakar long DoLoadClusterUnknownSize(long long&, long&);
1126*103e46e4SHarish Mahendrakar long DoParseNext(const Cluster*&, long long&, long&);
1127*103e46e4SHarish Mahendrakar
1128*103e46e4SHarish Mahendrakar bool AppendCluster(Cluster*);
1129*103e46e4SHarish Mahendrakar bool PreloadCluster(Cluster*, ptrdiff_t);
1130*103e46e4SHarish Mahendrakar
1131*103e46e4SHarish Mahendrakar // void ParseSeekHead(long long pos, long long size);
1132*103e46e4SHarish Mahendrakar // void ParseSeekEntry(long long pos, long long size);
1133*103e46e4SHarish Mahendrakar // void ParseCues(long long);
1134*103e46e4SHarish Mahendrakar
1135*103e46e4SHarish Mahendrakar const BlockEntry* GetBlock(const CuePoint&, const CuePoint::TrackPosition&);
1136*103e46e4SHarish Mahendrakar };
1137*103e46e4SHarish Mahendrakar
1138*103e46e4SHarish Mahendrakar } // namespace mkvparser
1139*103e46e4SHarish Mahendrakar
LoadCluster()1140*103e46e4SHarish Mahendrakar inline long mkvparser::Segment::LoadCluster() {
1141*103e46e4SHarish Mahendrakar long long pos;
1142*103e46e4SHarish Mahendrakar long size;
1143*103e46e4SHarish Mahendrakar
1144*103e46e4SHarish Mahendrakar return LoadCluster(pos, size);
1145*103e46e4SHarish Mahendrakar }
1146*103e46e4SHarish Mahendrakar
1147*103e46e4SHarish Mahendrakar #endif // MKVPARSER_MKVPARSER_H_
1148