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