193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Use of this source code is governed by a BSD-style license
493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// that can be found in the LICENSE file in the root of the source
593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// tree. An additional intellectual property rights grant can be found
693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// in the file PATENTS.  All contributing project authors may
793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// be found in the AUTHORS file in the root of the source tree.
893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#ifndef MKVPARSER_HPP
1093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#define MKVPARSER_HPP
1193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include <cstdlib>
1393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include <cstdio>
1493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include <cstddef>
1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
16810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgnamespace mkvparser {
1793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgconst int E_FILE_FORMAT_INVALID = -2;
1993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgconst int E_BUFFER_NOT_FULL = -3;
2093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
21810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass IMkvReader {
22810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
23810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  virtual int Read(long long pos, long len, unsigned char* buf) = 0;
24810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  virtual int Length(long long* total, long long* available) = 0;
25810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
26810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org protected:
27810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  virtual ~IMkvReader();
2893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
2993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
3093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orglong long GetUIntLength(IMkvReader*, long long, long&);
3193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orglong long ReadUInt(IMkvReader*, long long, long&);
3293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orglong long UnserializeUInt(IMkvReader*, long long pos, long long size);
3393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
3493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orglong UnserializeFloat(IMkvReader*, long long pos, long long size, double&);
3593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orglong UnserializeInt(IMkvReader*, long long pos, long len, long long& result);
3693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
37810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orglong UnserializeString(IMkvReader*, long long pos, long long size, char*& str);
3893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
39810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orglong ParseElementHeader(IMkvReader* pReader,
40810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                        long long& pos,  // consume id and size fields
41810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                        long long stop,  // if you know size of element's parent
42810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                        long long& id, long long& size);
4393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
4493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgbool Match(IMkvReader*, long long&, unsigned long, long long&);
4593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgbool Match(IMkvReader*, long long&, unsigned long, unsigned char*&, size_t&);
4693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
4793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid GetVersion(int& major, int& minor, int& build, int& revision);
4893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
49810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgstruct EBMLHeader {
50810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  EBMLHeader();
51810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~EBMLHeader();
52810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_version;
53810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_readVersion;
54810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_maxIdLength;
55810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_maxSizeLength;
56810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  char* m_docType;
57810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_docTypeVersion;
58810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_docTypeReadVersion;
59810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
60810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long Parse(IMkvReader*, long long&);
61810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  void Init();
6293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
6393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
6493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Segment;
6593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Track;
6693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Cluster;
6793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
68810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass Block {
69810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Block(const Block&);
70810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Block& operator=(const Block&);
7193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
72810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
73810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_start;
74810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_size;
7593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
76810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Block(long long start, long long size, long long discard_padding);
77810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~Block();
7893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
79810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Parse(const Cluster*);
8093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
81810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetTrackNumber() const;
82810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetTimeCode(const Cluster*) const;  // absolute, but not scaled
83810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetTime(const Cluster*) const;  // absolute, and scaled (ns)
84810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool IsKey() const;
85810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  void SetKey(bool);
86810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool IsInvisible() const;
8793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
88810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  enum Lacing { kLacingNone, kLacingXiph, kLacingFixed, kLacingEbml };
89810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Lacing GetLacing() const;
9093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
91810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int GetFrameCount() const;  // to index frames: [0, count)
9293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
93810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  struct Frame {
94810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long pos;  // absolute offset
95810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long len;
9693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
97810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long Read(IMkvReader*, unsigned char*) const;
98810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
9993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
100810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Frame& GetFrame(int frame_index) const;
10193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
102810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetDiscardPadding() const;
10393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
104810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
105810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_track;  // Track::Number()
106810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  short m_timecode;  // relative to cluster
107810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned char m_flags;
10893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
109810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Frame* m_frames;
110810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int m_frame_count;
11193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
112810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org protected:
113810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_discard_padding;
11493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
11593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
116810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass BlockEntry {
117810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  BlockEntry(const BlockEntry&);
118810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  BlockEntry& operator=(const BlockEntry&);
11993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
120810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org protected:
121810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  BlockEntry(Cluster*, long index);
12293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
123810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
124810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  virtual ~BlockEntry();
12593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
126810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool EOS() const;
127810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Cluster* GetCluster() const;
128810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetIndex() const;
129810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  virtual const Block* GetBlock() const = 0;
13093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
131810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  enum Kind { kBlockEOS, kBlockSimple, kBlockGroup };
132810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  virtual Kind GetKind() const = 0;
13393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
134810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org protected:
135810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cluster* const m_pCluster;
136810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long m_index;
13793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
13893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
139810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass SimpleBlock : public BlockEntry {
140810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SimpleBlock(const SimpleBlock&);
141810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SimpleBlock& operator=(const SimpleBlock&);
14293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
143810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
144810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SimpleBlock(Cluster*, long index, long long start, long long size);
145810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Parse();
14693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
147810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Kind GetKind() const;
148810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Block* GetBlock() const;
14993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
150810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org protected:
151810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Block m_block;
15293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
15393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
154810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass BlockGroup : public BlockEntry {
155810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  BlockGroup(const BlockGroup&);
156810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  BlockGroup& operator=(const BlockGroup&);
15793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
158810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
159810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  BlockGroup(Cluster*, long index,
160810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org             long long block_start,  // absolute pos of block's payload
161810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org             long long block_size,  // size of block's payload
162810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org             long long prev, long long next, long long duration,
163810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org             long long discard_padding);
16493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
165810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Parse();
16693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
167810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Kind GetKind() const;
168810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Block* GetBlock() const;
16993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
170810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetPrevTimeCode() const;  // relative to block's time
171810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetNextTimeCode() const;  // as above
172810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetDurationTimeCode() const;
17393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
174810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
175810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Block m_block;
176810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_prev;
177810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_next;
178810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_duration;
17993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
18093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
18193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org///////////////////////////////////////////////////////////////
18293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// ContentEncoding element
18393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Elements used to describe if the track data has been encrypted or
18493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// compressed with zlib or header stripping.
18593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass ContentEncoding {
186810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
187810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  enum { kCTR = 1 };
188810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
189810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ContentEncoding();
190810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~ContentEncoding();
191810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
192810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // ContentCompression element names
193810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  struct ContentCompression {
194810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ContentCompression();
195810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ~ContentCompression();
196810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
197810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long algo;
198810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned char* settings;
199810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long settings_len;
200810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
201810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
202810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // ContentEncAESSettings element names
203810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  struct ContentEncAESSettings {
204810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ContentEncAESSettings() : cipher_mode(kCTR) {}
205810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ~ContentEncAESSettings() {}
206810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
207810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long cipher_mode;
208810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
209810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
210810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // ContentEncryption element names
211810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  struct ContentEncryption {
212810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ContentEncryption();
213810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ~ContentEncryption();
214810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
215810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long algo;
216810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned char* key_id;
217810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long key_id_len;
218810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned char* signature;
219810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long signature_len;
220810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned char* sig_key_id;
221810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long sig_key_id_len;
222810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long sig_algo;
223810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long sig_hash_algo;
224810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
225810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ContentEncAESSettings aes_settings;
226810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
227810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
228810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // Returns ContentCompression represented by |idx|. Returns NULL if |idx|
229810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // is out of bounds.
230810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const ContentCompression* GetCompressionByIndex(unsigned long idx) const;
231810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
232810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // Returns number of ContentCompression elements in this ContentEncoding
233810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // element.
234810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long GetCompressionCount() const;
235810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
236810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // Parses the ContentCompression element from |pReader|. |start| is the
237810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // starting offset of the ContentCompression payload. |size| is the size in
238810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // bytes of the ContentCompression payload. |compression| is where the parsed
239810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // values will be stored.
240810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseCompressionEntry(long long start, long long size,
241810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                             IMkvReader* pReader,
242810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                             ContentCompression* compression);
243810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
244810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // Returns ContentEncryption represented by |idx|. Returns NULL if |idx|
245810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // is out of bounds.
246810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const ContentEncryption* GetEncryptionByIndex(unsigned long idx) const;
247810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
248810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // Returns number of ContentEncryption elements in this ContentEncoding
249810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // element.
250810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long GetEncryptionCount() const;
251810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
252810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // Parses the ContentEncAESSettings element from |pReader|. |start| is the
253810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // starting offset of the ContentEncAESSettings payload. |size| is the
254810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // size in bytes of the ContentEncAESSettings payload. |encryption| is
255810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // where the parsed values will be stored.
256810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseContentEncAESSettingsEntry(long long start, long long size,
257810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                                       IMkvReader* pReader,
258810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                                       ContentEncAESSettings* aes);
259810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
260810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // Parses the ContentEncoding element from |pReader|. |start| is the
261810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // starting offset of the ContentEncoding payload. |size| is the size in
262810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // bytes of the ContentEncoding payload. Returns true on success.
263810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseContentEncodingEntry(long long start, long long size,
264810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                                 IMkvReader* pReader);
265810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
266810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // Parses the ContentEncryption element from |pReader|. |start| is the
267810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // starting offset of the ContentEncryption payload. |size| is the size in
268810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // bytes of the ContentEncryption payload. |encryption| is where the parsed
269810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // values will be stored.
270810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseEncryptionEntry(long long start, long long size,
271810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                            IMkvReader* pReader, ContentEncryption* encryption);
272810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
273810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long long encoding_order() const { return encoding_order_; }
274810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long long encoding_scope() const { return encoding_scope_; }
275810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long long encoding_type() const { return encoding_type_; }
276810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
277810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
278810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // Member variables for list of ContentCompression elements.
279810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ContentCompression** compression_entries_;
280810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ContentCompression** compression_entries_end_;
281810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
282810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // Member variables for list of ContentEncryption elements.
283810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ContentEncryption** encryption_entries_;
284810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ContentEncryption** encryption_entries_end_;
285810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
286810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // ContentEncoding element names
287810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long long encoding_order_;
288810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long long encoding_scope_;
289810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long long encoding_type_;
290810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
291810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncoding);
292810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ContentEncoding(const ContentEncoding&);
293810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ContentEncoding& operator=(const ContentEncoding&);
29493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
29593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
296810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass Track {
297810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Track(const Track&);
298810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Track& operator=(const Track&);
299810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
300810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
301810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  class Info;
302810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  static long Create(Segment*, const Info&, long long element_start,
303810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                     long long element_size, Track*&);
304810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
305810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  enum Type { kVideo = 1, kAudio = 2, kSubtitle = 0x11, kMetadata = 0x21 };
306810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
307810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Segment* const m_pSegment;
308810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_start;
309810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_size;
310810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  virtual ~Track();
311810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
312810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetType() const;
313810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetNumber() const;
314810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long long GetUid() const;
315810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const char* GetNameAsUTF8() const;
316810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const char* GetLanguage() const;
317810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const char* GetCodecNameAsUTF8() const;
318810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const char* GetCodecId() const;
319810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const unsigned char* GetCodecPrivate(size_t&) const;
320810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool GetLacing() const;
321810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long long GetDefaultDuration() const;
322810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long long GetCodecDelay() const;
323810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long long GetSeekPreRoll() const;
324810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
325810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const BlockEntry* GetEOS() const;
326810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
327810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  struct Settings {
328810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long start;
329810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long size;
330810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
331810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
332810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  class Info {
333810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org   public:
334810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Info();
335810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ~Info();
336810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    int Copy(Info&) const;
337810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void Clear();
338810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long type;
339810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long number;
340810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long uid;
341810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long defaultDuration;
342810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long codecDelay;
343810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long seekPreRoll;
344810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    char* nameAsUTF8;
345810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    char* language;
346810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    char* codecId;
347810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    char* codecNameAsUTF8;
348810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned char* codecPrivate;
349810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    size_t codecPrivateSize;
350810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    bool lacing;
351810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Settings settings;
352810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
353810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org   private:
354810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Info(const Info&);
355810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Info& operator=(const Info&);
356810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    int CopyStr(char* Info::*str, Info&) const;
357810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
358810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
359810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetFirst(const BlockEntry*&) const;
360810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetNext(const BlockEntry* pCurr, const BlockEntry*& pNext) const;
361810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  virtual bool VetEntry(const BlockEntry*) const;
362810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  virtual long Seek(long long time_ns, const BlockEntry*&) const;
363810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
364810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const ContentEncoding* GetContentEncodingByIndex(unsigned long idx) const;
365810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long GetContentEncodingCount() const;
366810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
367810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseContentEncodingsEntry(long long start, long long size);
368810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
369810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org protected:
370810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Track(Segment*, long long element_start, long long element_size);
371810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
372810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Info m_info;
373810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
374810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  class EOSBlock : public BlockEntry {
375810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org   public:
376810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    EOSBlock();
377810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
378810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Kind GetKind() const;
379810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    const Block* GetBlock() const;
380810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
381810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
382810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  EOSBlock m_eos;
383810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
384810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
385810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ContentEncoding** content_encoding_entries_;
386810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ContentEncoding** content_encoding_entries_end_;
38793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
38893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
389810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass VideoTrack : public Track {
390810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  VideoTrack(const VideoTrack&);
391810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  VideoTrack& operator=(const VideoTrack&);
392810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
393810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  VideoTrack(Segment*, long long element_start, long long element_size);
394810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
395810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
396810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  static long Parse(Segment*, const Info&, long long element_start,
397810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                    long long element_size, VideoTrack*&);
39893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
399810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetWidth() const;
400810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetHeight() const;
401810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  double GetFrameRate() const;
40293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
403810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool VetEntry(const BlockEntry*) const;
404810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Seek(long long time_ns, const BlockEntry*&) const;
40593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
406810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
407810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_width;
408810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_height;
409810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  double m_rate;
410810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org};
411810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
412810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass AudioTrack : public Track {
413810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  AudioTrack(const AudioTrack&);
414810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  AudioTrack& operator=(const AudioTrack&);
41593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
416810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  AudioTrack(Segment*, long long element_start, long long element_size);
41793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
418810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
419810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  static long Parse(Segment*, const Info&, long long element_start,
420810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                    long long element_size, AudioTrack*&);
42193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
422810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  double GetSamplingRate() const;
423810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetChannels() const;
424810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetBitDepth() const;
42593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
426810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
427810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  double m_rate;
428810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_channels;
429810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_bitDepth;
43093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
43193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
432810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass Tracks {
433810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Tracks(const Tracks&);
434810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Tracks& operator=(const Tracks&);
435810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
436810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
437810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Segment* const m_pSegment;
438810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_start;
439810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_size;
440810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_start;
441810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_size;
442810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
443810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Tracks(Segment*, long long start, long long size, long long element_start,
444810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org         long long element_size);
44593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
446810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~Tracks();
447810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
448810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Parse();
449810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
450810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long GetTracksCount() const;
451810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
452810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Track* GetTrackByNumber(long tn) const;
453810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Track* GetTrackByIndex(unsigned long idx) const;
454810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
455810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
456810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Track** m_trackEntries;
457810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Track** m_trackEntriesEnd;
458810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
459810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseTrackEntry(long long payload_start, long long payload_size,
460810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                       long long element_start, long long element_size,
461810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                       Track*&) const;
46293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
46393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
464810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass Chapters {
465810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Chapters(const Chapters&);
466810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Chapters& operator=(const Chapters&);
46793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
468810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
469810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Segment* const m_pSegment;
470810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_start;
471810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_size;
472810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_start;
473810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_size;
47493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
475810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Chapters(Segment*, long long payload_start, long long payload_size,
476810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org           long long element_start, long long element_size);
47793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
478810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~Chapters();
47993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
480810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Parse();
48193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
482810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  class Atom;
483810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  class Edition;
48493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
485810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  class Display {
486810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    friend class Atom;
487810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Display();
488810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Display(const Display&);
489810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ~Display();
490810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Display& operator=(const Display&);
49193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
492810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org   public:
493810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    const char* GetString() const;
494810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    const char* GetLanguage() const;
495810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    const char* GetCountry() const;
49693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
497810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org   private:
498810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void Init();
499810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void ShallowCopy(Display&) const;
500810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void Clear();
501810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long Parse(IMkvReader*, long long pos, long long size);
50293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
503810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    char* m_string;
504810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    char* m_language;
505810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    char* m_country;
506810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
50793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
508810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  class Atom {
509810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    friend class Edition;
510810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Atom();
511810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Atom(const Atom&);
512810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ~Atom();
513810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Atom& operator=(const Atom&);
51493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
515810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org   public:
516810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long GetUID() const;
517810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    const char* GetStringUID() const;
51893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
519810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long GetStartTimecode() const;
520810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long GetStopTimecode() const;
52193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
522810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long GetStartTime(const Chapters*) const;
523810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long GetStopTime(const Chapters*) const;
524810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
525810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    int GetDisplayCount() const;
526810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    const Display* GetDisplay(int index) const;
527810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
528810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org   private:
529810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void Init();
530810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void ShallowCopy(Atom&) const;
531810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void Clear();
532810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long Parse(IMkvReader*, long long pos, long long size);
533810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    static long long GetTime(const Chapters*, long long timecode);
534810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
535810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long ParseDisplay(IMkvReader*, long long pos, long long size);
536810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    bool ExpandDisplaysArray();
537810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
538810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    char* m_string_uid;
539810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    unsigned long long m_uid;
540810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long m_start_timecode;
541810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long m_stop_timecode;
542810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
543810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Display* m_displays;
544810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    int m_displays_size;
545810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    int m_displays_count;
546810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
547810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
548810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  class Edition {
549810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    friend class Chapters;
550810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Edition();
551810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Edition(const Edition&);
552810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    ~Edition();
553810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Edition& operator=(const Edition&);
554810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
555810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org   public:
556810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    int GetAtomCount() const;
557810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    const Atom* GetAtom(int index) const;
558810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
559810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org   private:
560810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void Init();
561810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void ShallowCopy(Edition&) const;
562810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void Clear();
563810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long Parse(IMkvReader*, long long pos, long long size);
564810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
565810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long ParseAtom(IMkvReader*, long long pos, long long size);
566810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    bool ExpandAtomsArray();
567810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
568810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    Atom* m_atoms;
569810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    int m_atoms_size;
570810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    int m_atoms_count;
571810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
572810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
573810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int GetEditionCount() const;
574810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Edition* GetEdition(int index) const;
57593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
576810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
577810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseEdition(long long pos, long long size);
578810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool ExpandEditionsArray();
57993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
580810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Edition* m_editions;
581810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int m_editions_size;
582810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int m_editions_count;
58393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
58493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
585810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass SegmentInfo {
586810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SegmentInfo(const SegmentInfo&);
587810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SegmentInfo& operator=(const SegmentInfo&);
58893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
589810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
590810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Segment* const m_pSegment;
591810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_start;
592810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_size;
593810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_start;
594810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_size;
59593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
596810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SegmentInfo(Segment*, long long start, long long size,
597810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org              long long element_start, long long element_size);
59893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
599810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~SegmentInfo();
60093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
601810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Parse();
60293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
603810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetTimeCodeScale() const;
604810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetDuration() const;  // scaled
605810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const char* GetMuxingAppAsUTF8() const;
606810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const char* GetWritingAppAsUTF8() const;
607810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const char* GetTitleAsUTF8() const;
60893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
609810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
610810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_timecodeScale;
611810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  double m_duration;
612810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  char* m_pMuxingAppAsUTF8;
613810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  char* m_pWritingAppAsUTF8;
614810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  char* m_pTitleAsUTF8;
615810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org};
616810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
617810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass SeekHead {
618810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SeekHead(const SeekHead&);
619810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SeekHead& operator=(const SeekHead&);
620810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
621810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
622810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Segment* const m_pSegment;
623810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_start;
624810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_size;
625810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_start;
626810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_size;
627810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
628810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SeekHead(Segment*, long long start, long long size, long long element_start,
629810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org           long long element_size);
63093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
631810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~SeekHead();
63293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
633810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Parse();
63493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
635810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  struct Entry {
636810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    // the SeekHead entry payload
637810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long id;
638810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long pos;
639810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
640810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    // absolute pos of SeekEntry ID
641810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long element_start;
64293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
643810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    // SeekEntry ID size + size size + payload
644810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long element_size;
645810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
64693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
647810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int GetCount() const;
648810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Entry* GetEntry(int idx) const;
64993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
650810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  struct VoidElement {
651810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    // absolute pos of Void ID
652810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long element_start;
65393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
654810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    // ID size + size size + payload size
655810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long element_size;
656810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
65793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
658810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int GetVoidElementCount() const;
659810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const VoidElement* GetVoidElement(int idx) const;
66093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
661810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
662810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Entry* m_entries;
663810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int m_entry_count;
66493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
665810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  VoidElement* m_void_elements;
666810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int m_void_element_count;
667810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
668810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  static bool ParseEntry(IMkvReader*,
669810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                         long long pos,  // payload
670810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                         long long size, Entry*);
67193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
67293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
67393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Cues;
674810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass CuePoint {
675810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  friend class Cues;
67693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
677810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  CuePoint(long, long long);
678810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~CuePoint();
67993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
680810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  CuePoint(const CuePoint&);
681810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  CuePoint& operator=(const CuePoint&);
68293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
683810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
684810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_element_start;
685810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_element_size;
68693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
687810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  void Load(IMkvReader*);
68893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
689810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetTimeCode() const;  // absolute but unscaled
690810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetTime(const Segment*) const;  // absolute and scaled (ns units)
69193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
692810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  struct TrackPosition {
693810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long m_track;
694810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long m_pos;  // of cluster
695810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    long long m_block;
696810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    // codec_state  //defaults to 0
697810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    // reference = clusters containing req'd referenced blocks
698810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    //  reftime = timecode of the referenced block
69993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
700810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org    void Parse(IMkvReader*, long long, long long);
701810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  };
70293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
703810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const TrackPosition* Find(const Track*) const;
70493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
705810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
706810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long m_index;
707810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_timecode;
708810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  TrackPosition* m_track_positions;
709810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  size_t m_track_positions_count;
71093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
71193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
712810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass Cues {
713810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  friend class Segment;
71493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
715810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cues(Segment*, long long start, long long size, long long element_start,
716810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org       long long element_size);
717810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~Cues();
71893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
719810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cues(const Cues&);
720810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cues& operator=(const Cues&);
72193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
722810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
723810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Segment* const m_pSegment;
724810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_start;
725810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_size;
726810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_start;
727810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_size;
72893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
729810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool Find(  // lower bound of time_ns
730810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org      long long time_ns, const Track*, const CuePoint*&,
731810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org      const CuePoint::TrackPosition*&) const;
73293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
73393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#if 0
73493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    bool FindNext(  //upper_bound of time_ns
73593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        long long time_ns,
73693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        const Track*,
73793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        const CuePoint*&,
73893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org        const CuePoint::TrackPosition*&) const;
73993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#endif
74093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
741810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const CuePoint* GetFirst() const;
742810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const CuePoint* GetLast() const;
743810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const CuePoint* GetNext(const CuePoint*) const;
74493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
745810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const BlockEntry* GetBlock(const CuePoint*,
746810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                             const CuePoint::TrackPosition*) const;
74793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
748810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool LoadCuePoint() const;
749810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetCount() const;  // loaded only
750810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // long GetTotal() const;  //loaded + preloaded
751810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool DoneParsing() const;
75293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
753810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
754810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  void Init() const;
755810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  void PreloadCuePoint(long&, long long) const;
75693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
757810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  mutable CuePoint** m_cue_points;
758810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  mutable long m_count;
759810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  mutable long m_preload_count;
760810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  mutable long long m_pos;
76193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
76293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
763810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass Cluster {
764810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  friend class Segment;
76593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
766810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cluster(const Cluster&);
767810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cluster& operator=(const Cluster&);
76893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
769810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
770810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Segment* const m_pSegment;
77193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
772810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
773810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  static Cluster* Create(Segment*,
774810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                         long index,  // index in segment
775810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                         long long off);  // offset relative to segment
776810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // long long element_size);
77793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
778810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cluster();  // EndOfStream
779810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~Cluster();
78093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
781810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool EOS() const;
78293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
783810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetTimeCode() const;  // absolute, but not scaled
784810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetTime() const;  // absolute, and scaled (nanosecond units)
785810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetFirstTime() const;  // time (ns) of first (earliest) block
786810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetLastTime() const;  // time (ns) of last (latest) block
78793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
788810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetFirst(const BlockEntry*&) const;
789810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetLast(const BlockEntry*&) const;
790810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetNext(const BlockEntry* curr, const BlockEntry*& next) const;
79193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
792810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const BlockEntry* GetEntry(const Track*, long long ns = -1) const;
793810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const BlockEntry* GetEntry(const CuePoint&,
794810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                             const CuePoint::TrackPosition&) const;
795810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // const BlockEntry* GetMaxKey(const VideoTrack*) const;
79693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
797810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  //    static bool HasBlockEntries(const Segment*, long long);
79893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
799810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  static long HasBlockEntries(const Segment*, long long idoff, long long& pos,
800810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                              long& size);
80193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
802810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetEntryCount() const;
80393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
804810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Load(long long& pos, long& size) const;
80593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
806810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Parse(long long& pos, long& size) const;
807810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetEntry(long index, const mkvparser::BlockEntry*&) const;
80893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
809810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org protected:
810810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cluster(Segment*, long index, long long element_start);
811810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // long long element_size);
81293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
813810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
814810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_start;
815810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetPosition() const;  // offset relative to segment
81693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
817810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long GetIndex() const;
818810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetElementSize() const;
819810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // long long GetPayloadSize() const;
82093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
821810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // long long Unparsed() const;
82293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
823810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
824810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long m_index;
825810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  mutable long long m_pos;
826810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // mutable long long m_size;
827810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  mutable long long m_element_size;
828810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  mutable long long m_timecode;
829810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  mutable BlockEntry** m_entries;
830810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  mutable long m_entries_size;
831810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  mutable long m_entries_count;
83293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
833810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseSimpleBlock(long long, long long&, long&);
834810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseBlockGroup(long long, long long&, long&);
83593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
836810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long CreateBlock(long long id, long long pos, long long size,
837810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                   long long discard_padding);
838810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long CreateBlockGroup(long long start_offset, long long size,
839810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                        long long discard_padding);
840810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long CreateSimpleBlock(long long, long long);
841810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org};
84293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
843810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass Segment {
844810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  friend class Cues;
845810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  friend class Track;
846810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  friend class VideoTrack;
84793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
848810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Segment(const Segment&);
849810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Segment& operator=(const Segment&);
85093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
851810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
852810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Segment(IMkvReader*, long long elem_start,
853810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org          // long long elem_size,
854810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org          long long pos, long long size);
85593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
856810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org public:
857810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  IMkvReader* const m_pReader;
858810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_element_start;
859810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // const long long m_element_size;
860810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_start;  // posn of segment payload
861810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const long long m_size;  // size of segment payload
862810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cluster m_eos;  // TODO: make private?
863810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
864810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  static long long CreateInstance(IMkvReader*, long long, Segment*&);
865810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  ~Segment();
866810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
867810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long Load();  // loads headers and all clusters
868810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
869810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // for incremental loading
870810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // long long Unparsed() const;
871810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  bool DoneParsing() const;
872810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long ParseHeaders();  // stops when first cluster is found
873810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // long FindNextCluster(long long& pos, long& size) const;
874810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long LoadCluster(long long& pos, long& size);  // load one cluster
875810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long LoadCluster();
876810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org
877810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseNext(const Cluster* pCurr, const Cluster*& pNext, long long& pos,
878810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                 long& size);
87993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
88093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#if 0
88193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    //This pair parses one cluster, but only changes the state of the
88293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    //segment object when the cluster is actually added to the index.
88393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    long ParseCluster(long long& cluster_pos, long long& new_pos) const;
88493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    bool AddCluster(long long cluster_pos, long long new_pos);
88593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#endif
88693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
887810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const SeekHead* GetSeekHead() const;
888810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Tracks* GetTracks() const;
889810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const SegmentInfo* GetInfo() const;
890810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Cues* GetCues() const;
891810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Chapters* GetChapters() const;
89293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
893810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long GetDuration() const;
89493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
895810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  unsigned long GetCount() const;
896810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Cluster* GetFirst() const;
897810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Cluster* GetLast() const;
898810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Cluster* GetNext(const Cluster*);
89993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
900810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Cluster* FindCluster(long long time_nanoseconds) const;
901810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // const BlockEntry* Seek(long long time_nanoseconds, const Track*) const;
90293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
903810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const Cluster* FindOrPreloadCluster(long long pos);
90493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
905810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long ParseCues(long long cues_off,  // offset relative to start of segment
906810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                 long long& parse_pos, long& parse_len);
90793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
908810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org private:
909810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long m_pos;  // absolute file posn; what has been consumed so far
910810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cluster* m_pUnknownSize;
91193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
912810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SeekHead* m_pSeekHead;
913810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  SegmentInfo* m_pInfo;
914810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Tracks* m_pTracks;
915810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cues* m_pCues;
916810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Chapters* m_pChapters;
917810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  Cluster** m_clusters;
918810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long m_clusterCount;  // number of entries for which m_index >= 0
919810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long m_clusterPreloadCount;  // number of entries for which m_index < 0
920810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long m_clusterSize;  // array size
92193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
922810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long DoLoadCluster(long long&, long&);
923810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long DoLoadClusterUnknownSize(long long&, long&);
924810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long DoParseNext(const Cluster*&, long long&, long&);
92593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
926810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  void AppendCluster(Cluster*);
927810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  void PreloadCluster(Cluster*, ptrdiff_t);
92893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
929810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // void ParseSeekHead(long long pos, long long size);
930810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // void ParseSeekEntry(long long pos, long long size);
931810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  // void ParseCues(long long);
93293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
933810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  const BlockEntry* GetBlock(const CuePoint&, const CuePoint::TrackPosition&);
93493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org};
93593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
936810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org}  // end namespace mkvparser
93793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
938810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orginline long mkvparser::Segment::LoadCluster() {
939810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long long pos;
940810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  long size;
94193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
942810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  return LoadCluster(pos, size);
94393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}
94493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
945810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org#endif  // MKVPARSER_HPP
946