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