1f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
2f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian//
3f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian// Use of this source code is governed by a BSD-style license
4f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian// that can be found in the LICENSE file in the root of the source
5f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian// tree. An additional intellectual property rights grant can be found
6f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian// in the file PATENTS.  All contributing project authors may
7f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian// be found in the AUTHORS file in the root of the source tree.
8f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
9f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian#ifndef MKVPARSER_HPP
10f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian#define MKVPARSER_HPP
11f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
12f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian#include <cstdlib>
13f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian#include <cstdio>
14f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian#include <cstddef>
15f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
1604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramaniannamespace mkvparser {
17f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
18f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianconst int E_FILE_FORMAT_INVALID = -2;
19f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianconst int E_BUFFER_NOT_FULL = -3;
20f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
2104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass IMkvReader {
2204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
2304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  virtual int Read(long long pos, long len, unsigned char* buf) = 0;
2404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  virtual int Length(long long* total, long long* available) = 0;
2504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
2604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian protected:
2704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  virtual ~IMkvReader();
28f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
29f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
30f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianlong long GetUIntLength(IMkvReader*, long long, long&);
31f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianlong long ReadUInt(IMkvReader*, long long, long&);
32f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianlong long UnserializeUInt(IMkvReader*, long long pos, long long size);
33f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
34f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianlong UnserializeFloat(IMkvReader*, long long pos, long long size, double&);
35f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianlong UnserializeInt(IMkvReader*, long long pos, long len, long long& result);
36f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
3704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianlong UnserializeString(IMkvReader*, long long pos, long long size, char*& str);
38f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
3904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianlong ParseElementHeader(IMkvReader* pReader,
4004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                        long long& pos,  // consume id and size fields
4104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                        long long stop,  // if you know size of element's parent
4204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                        long long& id, long long& size);
43f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
44f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianbool Match(IMkvReader*, long long&, unsigned long, long long&);
45f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianbool Match(IMkvReader*, long long&, unsigned long, unsigned char*&, size_t&);
46f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
47f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianvoid GetVersion(int& major, int& minor, int& build, int& revision);
48f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
4904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianstruct EBMLHeader {
5004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  EBMLHeader();
5104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~EBMLHeader();
5204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_version;
5304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_readVersion;
5404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_maxIdLength;
5504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_maxSizeLength;
5604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  char* m_docType;
5704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_docTypeVersion;
5804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_docTypeReadVersion;
5904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
6004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long Parse(IMkvReader*, long long&);
6104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  void Init();
62f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
63f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
64f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianclass Segment;
65f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianclass Track;
66f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianclass Cluster;
67f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
6804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass Block {
6904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Block(const Block&);
7004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Block& operator=(const Block&);
71f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
7204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
7304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_start;
7404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_size;
75f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
7604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Block(long long start, long long size, long long discard_padding);
7704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~Block();
78f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
7904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Parse(const Cluster*);
80f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
8104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetTrackNumber() const;
8204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetTimeCode(const Cluster*) const;  // absolute, but not scaled
8304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetTime(const Cluster*) const;  // absolute, and scaled (ns)
8404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool IsKey() const;
8504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  void SetKey(bool);
8604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool IsInvisible() const;
87f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
8804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  enum Lacing { kLacingNone, kLacingXiph, kLacingFixed, kLacingEbml };
8904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Lacing GetLacing() const;
90f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
9104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  int GetFrameCount() const;  // to index frames: [0, count)
92f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
9304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  struct Frame {
9404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long pos;  // absolute offset
9504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long len;
96f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
9704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long Read(IMkvReader*, unsigned char*) const;
9804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
99f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
10004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Frame& GetFrame(int frame_index) const;
101f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
10204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetDiscardPadding() const;
103f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
10404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
10504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_track;  // Track::Number()
10604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  short m_timecode;  // relative to cluster
10704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned char m_flags;
108f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
10904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Frame* m_frames;
11004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  int m_frame_count;
111f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
11204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian protected:
11304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_discard_padding;
114f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
115f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
11604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass BlockEntry {
11704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  BlockEntry(const BlockEntry&);
11804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  BlockEntry& operator=(const BlockEntry&);
119f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
12004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian protected:
12104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  BlockEntry(Cluster*, long index);
122f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
12304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
12404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  virtual ~BlockEntry();
125f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
12604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool EOS() const;
12704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Cluster* GetCluster() const;
12804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetIndex() const;
12904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  virtual const Block* GetBlock() const = 0;
130f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
13104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  enum Kind { kBlockEOS, kBlockSimple, kBlockGroup };
13204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  virtual Kind GetKind() const = 0;
133f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
13404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian protected:
13504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cluster* const m_pCluster;
13604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long m_index;
137f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
138f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
13904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass SimpleBlock : public BlockEntry {
14004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SimpleBlock(const SimpleBlock&);
14104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SimpleBlock& operator=(const SimpleBlock&);
142f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
14304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
14404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SimpleBlock(Cluster*, long index, long long start, long long size);
14504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Parse();
146f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
14704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Kind GetKind() const;
14804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Block* GetBlock() const;
149f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
15004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian protected:
15104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Block m_block;
152f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
153f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
15404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass BlockGroup : public BlockEntry {
15504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  BlockGroup(const BlockGroup&);
15604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  BlockGroup& operator=(const BlockGroup&);
157f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
15804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
15904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  BlockGroup(Cluster*, long index,
16004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian             long long block_start,  // absolute pos of block's payload
16104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian             long long block_size,  // size of block's payload
16204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian             long long prev, long long next, long long duration,
16304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian             long long discard_padding);
164f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
16504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Parse();
166f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
16704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Kind GetKind() const;
16804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Block* GetBlock() const;
169f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
17004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetPrevTimeCode() const;  // relative to block's time
17104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetNextTimeCode() const;  // as above
17204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetDurationTimeCode() const;
173f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
17404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
17504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Block m_block;
17604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_prev;
17704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_next;
17804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_duration;
179f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
180f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
181f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian///////////////////////////////////////////////////////////////
182f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian// ContentEncoding element
183f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian// Elements used to describe if the track data has been encrypted or
184f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian// compressed with zlib or header stripping.
185f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianclass ContentEncoding {
18604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
18704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  enum { kCTR = 1 };
18804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
18904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ContentEncoding();
19004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~ContentEncoding();
19104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
19204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // ContentCompression element names
19304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  struct ContentCompression {
19404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ContentCompression();
19504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ~ContentCompression();
19604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
19704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long algo;
19804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned char* settings;
19904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long settings_len;
20004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
20104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
20204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // ContentEncAESSettings element names
20304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  struct ContentEncAESSettings {
20404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ContentEncAESSettings() : cipher_mode(kCTR) {}
20504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ~ContentEncAESSettings() {}
20604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
20704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long cipher_mode;
20804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
20904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
21004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // ContentEncryption element names
21104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  struct ContentEncryption {
21204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ContentEncryption();
21304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ~ContentEncryption();
21404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
21504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long algo;
21604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned char* key_id;
21704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long key_id_len;
21804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned char* signature;
21904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long signature_len;
22004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned char* sig_key_id;
22104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long sig_key_id_len;
22204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long sig_algo;
22304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long sig_hash_algo;
22404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
22504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ContentEncAESSettings aes_settings;
22604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
22704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
22804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // Returns ContentCompression represented by |idx|. Returns NULL if |idx|
22904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // is out of bounds.
23004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const ContentCompression* GetCompressionByIndex(unsigned long idx) const;
23104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
23204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // Returns number of ContentCompression elements in this ContentEncoding
23304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // element.
23404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long GetCompressionCount() const;
23504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
23604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // Parses the ContentCompression element from |pReader|. |start| is the
23704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // starting offset of the ContentCompression payload. |size| is the size in
23804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // bytes of the ContentCompression payload. |compression| is where the parsed
23904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // values will be stored.
24004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseCompressionEntry(long long start, long long size,
24104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                             IMkvReader* pReader,
24204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                             ContentCompression* compression);
24304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
24404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // Returns ContentEncryption represented by |idx|. Returns NULL if |idx|
24504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // is out of bounds.
24604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const ContentEncryption* GetEncryptionByIndex(unsigned long idx) const;
24704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
24804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // Returns number of ContentEncryption elements in this ContentEncoding
24904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // element.
25004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long GetEncryptionCount() const;
25104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
25204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // Parses the ContentEncAESSettings element from |pReader|. |start| is the
25304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // starting offset of the ContentEncAESSettings payload. |size| is the
25404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // size in bytes of the ContentEncAESSettings payload. |encryption| is
25504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // where the parsed values will be stored.
25604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseContentEncAESSettingsEntry(long long start, long long size,
25704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                                       IMkvReader* pReader,
25804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                                       ContentEncAESSettings* aes);
25904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
26004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // Parses the ContentEncoding element from |pReader|. |start| is the
26104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // starting offset of the ContentEncoding payload. |size| is the size in
26204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // bytes of the ContentEncoding payload. Returns true on success.
26304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseContentEncodingEntry(long long start, long long size,
26404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                                 IMkvReader* pReader);
26504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
26604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // Parses the ContentEncryption element from |pReader|. |start| is the
26704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // starting offset of the ContentEncryption payload. |size| is the size in
26804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // bytes of the ContentEncryption payload. |encryption| is where the parsed
26904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // values will be stored.
27004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseEncryptionEntry(long long start, long long size,
27104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                            IMkvReader* pReader, ContentEncryption* encryption);
27204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
27304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long long encoding_order() const { return encoding_order_; }
27404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long long encoding_scope() const { return encoding_scope_; }
27504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long long encoding_type() const { return encoding_type_; }
27604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
27704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
27804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // Member variables for list of ContentCompression elements.
27904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ContentCompression** compression_entries_;
28004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ContentCompression** compression_entries_end_;
28104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
28204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // Member variables for list of ContentEncryption elements.
28304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ContentEncryption** encryption_entries_;
28404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ContentEncryption** encryption_entries_end_;
28504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
28604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // ContentEncoding element names
28704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long long encoding_order_;
28804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long long encoding_scope_;
28904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long long encoding_type_;
29004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
29104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncoding);
29204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ContentEncoding(const ContentEncoding&);
29304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ContentEncoding& operator=(const ContentEncoding&);
294f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
295f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
29604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass Track {
29704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Track(const Track&);
29804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Track& operator=(const Track&);
29904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
30004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
30104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  class Info;
30204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  static long Create(Segment*, const Info&, long long element_start,
30304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                     long long element_size, Track*&);
30404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
30504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  enum Type { kVideo = 1, kAudio = 2, kSubtitle = 0x11, kMetadata = 0x21 };
30604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
30704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Segment* const m_pSegment;
30804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_start;
30904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_size;
31004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  virtual ~Track();
31104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
31204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetType() const;
31304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetNumber() const;
31404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long long GetUid() const;
31504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const char* GetNameAsUTF8() const;
31604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const char* GetLanguage() const;
31704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const char* GetCodecNameAsUTF8() const;
31804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const char* GetCodecId() const;
31904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const unsigned char* GetCodecPrivate(size_t&) const;
32004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool GetLacing() const;
32104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long long GetDefaultDuration() const;
32204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long long GetCodecDelay() const;
32304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long long GetSeekPreRoll() const;
32404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
32504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const BlockEntry* GetEOS() const;
32604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
32704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  struct Settings {
32804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long start;
32904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long size;
33004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
33104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
33204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  class Info {
33304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian   public:
33404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Info();
33504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ~Info();
33604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    int Copy(Info&) const;
33704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void Clear();
33804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long type;
33904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long number;
34004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long uid;
34104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long defaultDuration;
34204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long codecDelay;
34304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long seekPreRoll;
34404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    char* nameAsUTF8;
34504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    char* language;
34604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    char* codecId;
34704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    char* codecNameAsUTF8;
34804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned char* codecPrivate;
34904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    size_t codecPrivateSize;
35004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    bool lacing;
35104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Settings settings;
35204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
35304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian   private:
35404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Info(const Info&);
35504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Info& operator=(const Info&);
35604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    int CopyStr(char* Info::*str, Info&) const;
35704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
35804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
35904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetFirst(const BlockEntry*&) const;
36004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetNext(const BlockEntry* pCurr, const BlockEntry*& pNext) const;
36104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  virtual bool VetEntry(const BlockEntry*) const;
36204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  virtual long Seek(long long time_ns, const BlockEntry*&) const;
36304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
36404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const ContentEncoding* GetContentEncodingByIndex(unsigned long idx) const;
36504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long GetContentEncodingCount() const;
36604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
36704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseContentEncodingsEntry(long long start, long long size);
36804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
36904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian protected:
37004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Track(Segment*, long long element_start, long long element_size);
37104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
37204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Info m_info;
37304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
37404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  class EOSBlock : public BlockEntry {
37504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian   public:
37604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    EOSBlock();
37704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
37804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Kind GetKind() const;
37904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    const Block* GetBlock() const;
38004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
38104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
38204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  EOSBlock m_eos;
38304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
38404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
38504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ContentEncoding** content_encoding_entries_;
38604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ContentEncoding** content_encoding_entries_end_;
387f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
388f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
38904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass VideoTrack : public Track {
39004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  VideoTrack(const VideoTrack&);
39104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  VideoTrack& operator=(const VideoTrack&);
39204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
39304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  VideoTrack(Segment*, long long element_start, long long element_size);
39404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
39504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
39604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  static long Parse(Segment*, const Info&, long long element_start,
39704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                    long long element_size, VideoTrack*&);
398f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
39904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetWidth() const;
40004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetHeight() const;
40104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  double GetFrameRate() const;
402f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
40304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool VetEntry(const BlockEntry*) const;
40404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Seek(long long time_ns, const BlockEntry*&) const;
405f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
40604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
40704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_width;
40804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_height;
40904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  double m_rate;
41004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian};
41104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
41204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass AudioTrack : public Track {
41304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  AudioTrack(const AudioTrack&);
41404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  AudioTrack& operator=(const AudioTrack&);
415f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
41604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  AudioTrack(Segment*, long long element_start, long long element_size);
417f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
41804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
41904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  static long Parse(Segment*, const Info&, long long element_start,
42004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                    long long element_size, AudioTrack*&);
421f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
42204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  double GetSamplingRate() const;
42304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetChannels() const;
42404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetBitDepth() const;
425f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
42604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
42704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  double m_rate;
42804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_channels;
42904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_bitDepth;
430f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
431f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
43204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass Tracks {
43304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Tracks(const Tracks&);
43404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Tracks& operator=(const Tracks&);
43504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
43604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
43704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Segment* const m_pSegment;
43804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_start;
43904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_size;
44004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_start;
44104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_size;
44204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
44304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Tracks(Segment*, long long start, long long size, long long element_start,
44404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian         long long element_size);
445f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
44604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~Tracks();
44704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
44804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Parse();
44904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
45004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long GetTracksCount() const;
45104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
45204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Track* GetTrackByNumber(long tn) const;
45304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Track* GetTrackByIndex(unsigned long idx) const;
45404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
45504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
45604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Track** m_trackEntries;
45704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Track** m_trackEntriesEnd;
45804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
45904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseTrackEntry(long long payload_start, long long payload_size,
46004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                       long long element_start, long long element_size,
46104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                       Track*&) const;
462f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
463f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
46404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass Chapters {
46504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Chapters(const Chapters&);
46604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Chapters& operator=(const Chapters&);
467f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
46804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
46904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Segment* const m_pSegment;
47004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_start;
47104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_size;
47204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_start;
47304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_size;
474f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
47504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Chapters(Segment*, long long payload_start, long long payload_size,
47604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian           long long element_start, long long element_size);
477f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
47804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~Chapters();
479f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
48004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Parse();
481f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
48204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  class Atom;
48304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  class Edition;
484f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
48504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  class Display {
48604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    friend class Atom;
48704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Display();
48804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Display(const Display&);
48904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ~Display();
49004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Display& operator=(const Display&);
491f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
49204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian   public:
49304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    const char* GetString() const;
49404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    const char* GetLanguage() const;
49504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    const char* GetCountry() const;
496f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
49704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian   private:
49804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void Init();
49904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void ShallowCopy(Display&) const;
50004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void Clear();
50104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long Parse(IMkvReader*, long long pos, long long size);
502f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
50304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    char* m_string;
50404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    char* m_language;
50504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    char* m_country;
50604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
507f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
50804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  class Atom {
50904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    friend class Edition;
51004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Atom();
51104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Atom(const Atom&);
51204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ~Atom();
51304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Atom& operator=(const Atom&);
514f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
51504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian   public:
51604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long GetUID() const;
51704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    const char* GetStringUID() const;
518f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
51904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long GetStartTimecode() const;
52004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long GetStopTimecode() const;
521f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
52204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long GetStartTime(const Chapters*) const;
52304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long GetStopTime(const Chapters*) const;
52404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
52504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    int GetDisplayCount() const;
52604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    const Display* GetDisplay(int index) const;
52704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
52804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian   private:
52904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void Init();
53004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void ShallowCopy(Atom&) const;
53104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void Clear();
53204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long Parse(IMkvReader*, long long pos, long long size);
53304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    static long long GetTime(const Chapters*, long long timecode);
53404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
53504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long ParseDisplay(IMkvReader*, long long pos, long long size);
53604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    bool ExpandDisplaysArray();
53704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
53804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    char* m_string_uid;
53904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    unsigned long long m_uid;
54004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long m_start_timecode;
54104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long m_stop_timecode;
54204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
54304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Display* m_displays;
54404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    int m_displays_size;
54504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    int m_displays_count;
54604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
54704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
54804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  class Edition {
54904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    friend class Chapters;
55004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Edition();
55104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Edition(const Edition&);
55204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    ~Edition();
55304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Edition& operator=(const Edition&);
55404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
55504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian   public:
55604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    int GetAtomCount() const;
55704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    const Atom* GetAtom(int index) const;
55804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
55904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian   private:
56004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void Init();
56104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void ShallowCopy(Edition&) const;
56204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void Clear();
56304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long Parse(IMkvReader*, long long pos, long long size);
56404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
56504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long ParseAtom(IMkvReader*, long long pos, long long size);
56604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    bool ExpandAtomsArray();
56704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
56804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    Atom* m_atoms;
56904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    int m_atoms_size;
57004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    int m_atoms_count;
57104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
57204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
57304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  int GetEditionCount() const;
57404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Edition* GetEdition(int index) const;
575f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
57604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
57704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseEdition(long long pos, long long size);
57804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool ExpandEditionsArray();
579f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
58004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Edition* m_editions;
58104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  int m_editions_size;
58204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  int m_editions_count;
583f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
584f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
58504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass SegmentInfo {
58604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SegmentInfo(const SegmentInfo&);
58704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SegmentInfo& operator=(const SegmentInfo&);
588f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
58904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
59004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Segment* const m_pSegment;
59104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_start;
59204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_size;
59304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_start;
59404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_size;
595f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
59604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SegmentInfo(Segment*, long long start, long long size,
59704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian              long long element_start, long long element_size);
598f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
59904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~SegmentInfo();
600f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
60104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Parse();
602f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
60304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetTimeCodeScale() const;
60404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetDuration() const;  // scaled
60504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const char* GetMuxingAppAsUTF8() const;
60604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const char* GetWritingAppAsUTF8() const;
60704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const char* GetTitleAsUTF8() const;
608f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
60904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
61004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_timecodeScale;
61104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  double m_duration;
61204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  char* m_pMuxingAppAsUTF8;
61304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  char* m_pWritingAppAsUTF8;
61404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  char* m_pTitleAsUTF8;
61504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian};
61604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
61704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass SeekHead {
61804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SeekHead(const SeekHead&);
61904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SeekHead& operator=(const SeekHead&);
62004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
62104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
62204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Segment* const m_pSegment;
62304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_start;
62404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_size;
62504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_start;
62604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_size;
62704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
62804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SeekHead(Segment*, long long start, long long size, long long element_start,
62904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian           long long element_size);
630f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
63104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~SeekHead();
632f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
63304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Parse();
634f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
63504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  struct Entry {
63604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    // the SeekHead entry payload
63704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long id;
63804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long pos;
63904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
64004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    // absolute pos of SeekEntry ID
64104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long element_start;
642f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
64304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    // SeekEntry ID size + size size + payload
64404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long element_size;
64504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
646f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
64704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  int GetCount() const;
64804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Entry* GetEntry(int idx) const;
649f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
65004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  struct VoidElement {
65104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    // absolute pos of Void ID
65204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long element_start;
653f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
65404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    // ID size + size size + payload size
65504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long element_size;
65604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
657f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
65804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  int GetVoidElementCount() const;
65904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const VoidElement* GetVoidElement(int idx) const;
660f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
66104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
66204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Entry* m_entries;
66304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  int m_entry_count;
664f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
66504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  VoidElement* m_void_elements;
66604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  int m_void_element_count;
66704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
66804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  static bool ParseEntry(IMkvReader*,
66904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                         long long pos,  // payload
67004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                         long long size, Entry*);
671f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
672f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
673f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanianclass Cues;
67404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass CuePoint {
67504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  friend class Cues;
676f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
67704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  CuePoint(long, long long);
67804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~CuePoint();
679f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
68004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  CuePoint(const CuePoint&);
68104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  CuePoint& operator=(const CuePoint&);
682f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
68304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
68404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_element_start;
68504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_element_size;
686f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
68704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  void Load(IMkvReader*);
688f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
68904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetTimeCode() const;  // absolute but unscaled
69004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetTime(const Segment*) const;  // absolute and scaled (ns units)
691f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
69204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  struct TrackPosition {
69304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long m_track;
69404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long m_pos;  // of cluster
69504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    long long m_block;
69604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    // codec_state  //defaults to 0
69704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    // reference = clusters containing req'd referenced blocks
69804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    //  reftime = timecode of the referenced block
699f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
70004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian    void Parse(IMkvReader*, long long, long long);
70104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  };
702f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
70304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const TrackPosition* Find(const Track*) const;
704f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
70504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
70604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long m_index;
70704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_timecode;
70804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  TrackPosition* m_track_positions;
70904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  size_t m_track_positions_count;
710f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
711f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
71204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass Cues {
71304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  friend class Segment;
714f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
71504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cues(Segment*, long long start, long long size, long long element_start,
71604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian       long long element_size);
71704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~Cues();
718f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
71904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cues(const Cues&);
72004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cues& operator=(const Cues&);
721f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
72204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
72304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Segment* const m_pSegment;
72404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_start;
72504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_size;
72604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_start;
72704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_size;
728f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
72904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool Find(  // lower bound of time_ns
73004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian      long long time_ns, const Track*, const CuePoint*&,
73104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian      const CuePoint::TrackPosition*&) const;
732f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
733f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian#if 0
734f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian    bool FindNext(  //upper_bound of time_ns
735f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian        long long time_ns,
736f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian        const Track*,
737f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian        const CuePoint*&,
738f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian        const CuePoint::TrackPosition*&) const;
739f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian#endif
740f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
74104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const CuePoint* GetFirst() const;
74204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const CuePoint* GetLast() const;
74304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const CuePoint* GetNext(const CuePoint*) const;
744f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
74504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const BlockEntry* GetBlock(const CuePoint*,
74604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                             const CuePoint::TrackPosition*) const;
747f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
74804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool LoadCuePoint() const;
74904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetCount() const;  // loaded only
75004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // long GetTotal() const;  //loaded + preloaded
75104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool DoneParsing() const;
752f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
75304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
75404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  void Init() const;
75504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  void PreloadCuePoint(long&, long long) const;
756f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
75704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  mutable CuePoint** m_cue_points;
75804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  mutable long m_count;
75904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  mutable long m_preload_count;
76004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  mutable long long m_pos;
761f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
762f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
76304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass Cluster {
76404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  friend class Segment;
765f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
76604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cluster(const Cluster&);
76704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cluster& operator=(const Cluster&);
768f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
76904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
77004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Segment* const m_pSegment;
771f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
77204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
77304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  static Cluster* Create(Segment*,
77404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                         long index,  // index in segment
77504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                         long long off);  // offset relative to segment
77604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // long long element_size);
777f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
77804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cluster();  // EndOfStream
77904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~Cluster();
780f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
78104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool EOS() const;
782f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
78304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetTimeCode() const;  // absolute, but not scaled
78404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetTime() const;  // absolute, and scaled (nanosecond units)
78504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetFirstTime() const;  // time (ns) of first (earliest) block
78604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetLastTime() const;  // time (ns) of last (latest) block
787f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
78804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetFirst(const BlockEntry*&) const;
78904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetLast(const BlockEntry*&) const;
79004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetNext(const BlockEntry* curr, const BlockEntry*& next) const;
791f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
79204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const BlockEntry* GetEntry(const Track*, long long ns = -1) const;
79304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const BlockEntry* GetEntry(const CuePoint&,
79404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                             const CuePoint::TrackPosition&) const;
79504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // const BlockEntry* GetMaxKey(const VideoTrack*) const;
796f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
79704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  //    static bool HasBlockEntries(const Segment*, long long);
798f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
79904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  static long HasBlockEntries(const Segment*, long long idoff, long long& pos,
80004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                              long& size);
801f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
80204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetEntryCount() const;
803f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
80404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Load(long long& pos, long& size) const;
805f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
80604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Parse(long long& pos, long& size) const;
80704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetEntry(long index, const mkvparser::BlockEntry*&) const;
808f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
80904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian protected:
81004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cluster(Segment*, long index, long long element_start);
81104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // long long element_size);
812f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
81304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
81404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_start;
81504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetPosition() const;  // offset relative to segment
816f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
81704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long GetIndex() const;
81804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetElementSize() const;
81904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // long long GetPayloadSize() const;
820f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
82104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // long long Unparsed() const;
822f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
82304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
82404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long m_index;
82504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  mutable long long m_pos;
82604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // mutable long long m_size;
82704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  mutable long long m_element_size;
82804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  mutable long long m_timecode;
82904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  mutable BlockEntry** m_entries;
83004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  mutable long m_entries_size;
83104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  mutable long m_entries_count;
832f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
83304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseSimpleBlock(long long, long long&, long&);
83404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseBlockGroup(long long, long long&, long&);
835f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
83604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long CreateBlock(long long id, long long pos, long long size,
83704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                   long long discard_padding);
83804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long CreateBlockGroup(long long start_offset, long long size,
83904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                        long long discard_padding);
84004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long CreateSimpleBlock(long long, long long);
84104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian};
842f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
84304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianclass Segment {
84404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  friend class Cues;
84504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  friend class Track;
84604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  friend class VideoTrack;
847f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
84804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Segment(const Segment&);
84904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Segment& operator=(const Segment&);
850f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
85104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
85204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Segment(IMkvReader*, long long elem_start,
85304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian          // long long elem_size,
85404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian          long long pos, long long size);
855f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
85604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian public:
85704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  IMkvReader* const m_pReader;
85804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_element_start;
85904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // const long long m_element_size;
86004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_start;  // posn of segment payload
86104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const long long m_size;  // size of segment payload
86204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cluster m_eos;  // TODO: make private?
86304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
86404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  static long long CreateInstance(IMkvReader*, long long, Segment*&);
86504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  ~Segment();
86604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
86704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long Load();  // loads headers and all clusters
86804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
86904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // for incremental loading
87004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // long long Unparsed() const;
87104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  bool DoneParsing() const;
87204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long ParseHeaders();  // stops when first cluster is found
87304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // long FindNextCluster(long long& pos, long& size) const;
87404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long LoadCluster(long long& pos, long& size);  // load one cluster
87504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long LoadCluster();
87604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian
87704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseNext(const Cluster* pCurr, const Cluster*& pNext, long long& pos,
87804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                 long& size);
879f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
880f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian#if 0
881f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian    //This pair parses one cluster, but only changes the state of the
882f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian    //segment object when the cluster is actually added to the index.
883f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian    long ParseCluster(long long& cluster_pos, long long& new_pos) const;
884f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian    bool AddCluster(long long cluster_pos, long long new_pos);
885f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian#endif
886f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
88704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const SeekHead* GetSeekHead() const;
88804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Tracks* GetTracks() const;
88904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const SegmentInfo* GetInfo() const;
89004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Cues* GetCues() const;
89104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Chapters* GetChapters() const;
892f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
89304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long GetDuration() const;
894f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
89504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  unsigned long GetCount() const;
89604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Cluster* GetFirst() const;
89704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Cluster* GetLast() const;
89804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Cluster* GetNext(const Cluster*);
899f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
90004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Cluster* FindCluster(long long time_nanoseconds) const;
90104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // const BlockEntry* Seek(long long time_nanoseconds, const Track*) const;
902f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
90304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const Cluster* FindOrPreloadCluster(long long pos);
904f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
90504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long ParseCues(long long cues_off,  // offset relative to start of segment
90604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian                 long long& parse_pos, long& parse_len);
907f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
90804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian private:
90904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long m_pos;  // absolute file posn; what has been consumed so far
91004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cluster* m_pUnknownSize;
911f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
91204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SeekHead* m_pSeekHead;
91304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  SegmentInfo* m_pInfo;
91404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Tracks* m_pTracks;
91504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cues* m_pCues;
91604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Chapters* m_pChapters;
91704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  Cluster** m_clusters;
91804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long m_clusterCount;  // number of entries for which m_index >= 0
91904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long m_clusterPreloadCount;  // number of entries for which m_index < 0
92004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long m_clusterSize;  // array size
921f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
92204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long DoLoadCluster(long long&, long&);
92304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long DoLoadClusterUnknownSize(long long&, long&);
92404839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long DoParseNext(const Cluster*&, long long&, long&);
925f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
92604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  void AppendCluster(Cluster*);
92704839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  void PreloadCluster(Cluster*, ptrdiff_t);
928f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
92904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // void ParseSeekHead(long long pos, long long size);
93004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // void ParseSeekEntry(long long pos, long long size);
93104839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  // void ParseCues(long long);
932f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
93304839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  const BlockEntry* GetBlock(const CuePoint&, const CuePoint::TrackPosition&);
934f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian};
935f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
93604839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian}  // end namespace mkvparser
937f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
93804839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanianinline long mkvparser::Segment::LoadCluster() {
93904839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long long pos;
94004839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  long size;
941f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
94204839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian  return LoadCluster(pos, size);
943f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian}
944f0ceed9d146017d218d64ca946d5c2b31356389bVignesh Venkatasubramanian
94504839626ed859623901ebd3a5fd483982186b59dVignesh Venkatasubramanian#endif  // MKVPARSER_HPP
946