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