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