xref: /aosp_15_r20/external/libwebm/mkvparser/mkvparser.h (revision 103e46e4cd4b6efcf6001f23fa8665fb110abf8d)
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