12ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Copyright (c) 2012 The WebM project authors. All Rights Reserved. 22ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// 32ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Use of this source code is governed by a BSD-style license 42ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// that can be found in the LICENSE file in the root of the source 52ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// tree. An additional intellectual property rights grant can be found 62ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// in the file PATENTS. All contributing project authors may 72ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// be found in the AUTHORS file in the root of the source tree. 82ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 92ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifndef MKVMUXER_HPP 102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define MKVMUXER_HPP 112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "mkvmuxertypes.hpp" 132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// For a description of the WebM elements see 152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// http://www.webmproject.org/code/specs/container/. 162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramaniannamespace mkvparser { 18ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianclass IMkvReader; 192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian} // end namespace 202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramaniannamespace mkvmuxer { 222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass MkvWriter; 242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass Segment; 252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 26da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianconst uint64 kMaxTrackNumber = 126; 27da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Interface used by the mkvmuxer to write out the Mkv data. 302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass IMkvWriter { 312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Writes out |len| bytes of |buf|. Returns 0 on success. 332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual int32 Write(const void* buf, uint32 len) = 0; 342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the offset of the output position from the beginning of the 362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // output. 372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual int64 Position() const = 0; 382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Set the current File position. Returns 0 on success. 402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual int32 Position(int64 position) = 0; 412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns true if the writer is seekable. 432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual bool Seekable() const = 0; 442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Element start notification. Called whenever an element identifier is about 462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // to be written to the stream. |element_id| is the element identifier, and 472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |position| is the location in the WebM stream where the first octet of the 482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // element identifier will be written. 492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Note: the |MkvId| enumeration in webmids.hpp defines element values. 502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual void ElementStartNotify(uint64 element_id, int64 position) = 0; 512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian protected: 532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian IMkvWriter(); 542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual ~IMkvWriter(); 552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(IMkvWriter); 582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Writes out the EBML header for a WebM file. This function must be called 612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// before any other libwebm writing functions are called. 62da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianbool WriteEbmlHeader(IMkvWriter* writer, uint64 doc_type_version); 63da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 64da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// Deprecated. Writes out EBML header with doc_type_version as 65da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// kDefaultDocTypeVersion. Exists for backward compatibility. 662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianbool WriteEbmlHeader(IMkvWriter* writer); 672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Copies in Chunk from source to destination between the given byte positions 69ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianbool ChunkedCopy(mkvparser::IMkvReader* source, IMkvWriter* dst, int64 start, 70ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int64 size); 712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Class to hold data the will be written to a block. 742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass Frame { 752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Frame(); 772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~Frame(); 782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 79da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Sets this frame's contents based on |frame|. Returns true on success. On 80da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // failure, this frame's existing contents may be lost. 81da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool CopyFrom(const Frame& frame); 82da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Copies |frame| data into |frame_|. Returns true on success. 842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Init(const uint8* frame, uint64 length); 852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Copies |additional| data into |additional_|. Returns true on success. 87ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian bool AddAdditionalData(const uint8* additional, uint64 length, uint64 add_id); 882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 89da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Returns true if the frame has valid parameters. 90da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool IsValid() const; 91da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 92da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Returns true if the frame can be written as a SimpleBlock based on current 93da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // parameters. 94da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool CanBeSimpleBlock() const; 95da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 add_id() const { return add_id_; } 972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint8* additional() const { return additional_; } 982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 additional_length() const { return additional_length_; } 992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_duration(uint64 duration) { duration_ = duration; } 1002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 duration() const { return duration_; } 1012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint8* frame() const { return frame_; } 1022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_is_key(bool key) { is_key_ = key; } 1032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool is_key() const { return is_key_; } 1042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 length() const { return length_; } 1052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_track_number(uint64 track_number) { track_number_ = track_number; } 1062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 track_number() const { return track_number_; } 1072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_timestamp(uint64 timestamp) { timestamp_ = timestamp; } 1082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 timestamp() const { return timestamp_; } 109da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void set_discard_padding(int64 discard_padding) { 1102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian discard_padding_ = discard_padding; 1112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 112da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int64 discard_padding() const { return discard_padding_; } 113da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void set_reference_block_timestamp(int64 reference_block_timestamp); 114da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int64 reference_block_timestamp() const { return reference_block_timestamp_; } 115da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool reference_block_timestamp_set() const { 116da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return reference_block_timestamp_set_; 117da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 1202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Id of the Additional data. 1212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 add_id_; 1222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Pointer to additional data. Owned by this class. 1242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint8* additional_; 1252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Length of the additional data. 1272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 additional_length_; 1282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Duration of the frame in nanoseconds. 1302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 duration_; 1312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Pointer to the data. Owned by this class. 1332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint8* frame_; 1342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Flag telling if the data should set the key flag of a block. 1362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool is_key_; 1372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Length of the data. 1392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 length_; 1402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Mkv track number the data is associated with. 1422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 track_number_; 1432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Timestamp of the data in nanoseconds. 1452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 timestamp_; 1462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Discard padding for the frame. 1482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64 discard_padding_; 149da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 150da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Reference block timestamp. 151da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int64 reference_block_timestamp_; 152da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 153da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Flag indicating if |reference_block_timestamp_| has been set. 154da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool reference_block_timestamp_set_; 155da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 156da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Frame); 1572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 1582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 1602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Class to hold one cue point in a Cues element. 1612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass CuePoint { 1622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 1632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian CuePoint(); 1642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~CuePoint(); 1652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the entire CuePoint element. 1672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 Size() const; 1682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Output the CuePoint element to the writer. Returns true on success. 1702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Write(IMkvWriter* writer) const; 1712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_time(uint64 time) { time_ = time; } 1732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 time() const { return time_; } 1742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_track(uint64 track) { track_ = track; } 1752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 track() const { return track_; } 1762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_cluster_pos(uint64 cluster_pos) { cluster_pos_ = cluster_pos; } 1772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 cluster_pos() const { return cluster_pos_; } 1782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_block_number(uint64 block_number) { block_number_ = block_number; } 1792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 block_number() const { return block_number_; } 1802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_output_block_number(bool output_block_number) { 1812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian output_block_number_ = output_block_number; 1822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 1832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool output_block_number() const { return output_block_number_; } 1842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 1862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the payload of the CuePoint element. 1872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 PayloadSize() const; 1882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Absolute timecode according to the segment time base. 1902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 time_; 1912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The Track element associated with the CuePoint. 1932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 track_; 1942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The position of the Cluster containing the Block. 1962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 cluster_pos_; 1972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of the Block within the Cluster, starting from 1. 1992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 block_number_; 2002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // If true the muxer will write out the block number for the cue if the 2022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // block number is different than the default of 1. Default is set to true. 2032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool output_block_number_; 2042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(CuePoint); 2062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 2072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 2092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Cues element. 2102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass Cues { 2112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 2122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Cues(); 2132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~Cues(); 2142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a cue point to the Cues element. Returns true on success. 2162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool AddCue(CuePoint* cue); 2172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the cue point by index. Returns NULL if there is no cue point 2192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // match. 2202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian CuePoint* GetCueByIndex(int32 index) const; 2212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the total size of the Cues element 2232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 Size(); 2242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Output the Cues element to the writer. Returns true on success. 2262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Write(IMkvWriter* writer) const; 2272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int32 cue_entries_size() const { return cue_entries_size_; } 2292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_output_block_number(bool output_block_number) { 2302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian output_block_number_ = output_block_number; 2312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 2322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool output_block_number() const { return output_block_number_; } 2332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 2352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of allocated elements in |cue_entries_|. 2362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int32 cue_entries_capacity_; 2372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of CuePoints in |cue_entries_|. 2392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int32 cue_entries_size_; 2402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // CuePoint list. 2422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian CuePoint** cue_entries_; 2432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // If true the muxer will write out the block number for the cue if the 2452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // block number is different than the default of 1. Default is set to true. 2462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool output_block_number_; 2472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Cues); 2492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 2502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 2522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// ContentEncAESSettings element 2532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass ContentEncAESSettings { 2542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 255ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian enum { kCTR = 1 }; 2562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ContentEncAESSettings(); 2582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~ContentEncAESSettings() {} 2592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the ContentEncAESSettings element. 2612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 Size() const; 2622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Writes out the ContentEncAESSettings element to |writer|. Returns true on 2642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // success. 2652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Write(IMkvWriter* writer) const; 2662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 cipher_mode() const { return cipher_mode_; } 2682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 2702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the payload of the ContentEncAESSettings 2712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // element. 2722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 PayloadSize() const; 2732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sub elements 2752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 cipher_mode_; 2762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncAESSettings); 2782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 2792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 2812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// ContentEncoding element 2822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Elements used to describe if the track data has been encrypted or 2832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// compressed with zlib or header stripping. 2842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Currently only whole frames can be encrypted with AES. This dictates that 2852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// ContentEncodingOrder will be 0, ContentEncodingScope will be 1, 2862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// ContentEncodingType will be 1, and ContentEncAlgo will be 5. 2872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass ContentEncoding { 2882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 2892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ContentEncoding(); 2902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~ContentEncoding(); 2912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sets the content encryption id. Copies |length| bytes from |id| to 2932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |enc_key_id_|. Returns true on success. 2942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool SetEncryptionID(const uint8* id, uint64 length); 2952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the ContentEncoding element. 2972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 Size() const; 2982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Writes out the ContentEncoding element to |writer|. Returns true on 3002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // success. 3012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Write(IMkvWriter* writer) const; 3022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 enc_algo() const { return enc_algo_; } 3042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 encoding_order() const { return encoding_order_; } 3052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 encoding_scope() const { return encoding_scope_; } 3062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 encoding_type() const { return encoding_type_; } 3072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ContentEncAESSettings* enc_aes_settings() { return &enc_aes_settings_; } 3082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 3102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the encoding elements. 3112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 EncodingSize(uint64 compresion_size, uint64 encryption_size) const; 3122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the encryption elements. 3142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 EncryptionSize() const; 3152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Track element names 3172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 enc_algo_; 3182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint8* enc_key_id_; 3192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 encoding_order_; 3202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 encoding_scope_; 3212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 encoding_type_; 3222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // ContentEncAESSettings element. 3242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ContentEncAESSettings enc_aes_settings_; 3252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Size of the ContentEncKeyID data in bytes. 3272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 enc_key_id_length_; 3282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncoding); 3302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 3312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 3332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Track element. 3342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass Track { 3352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 3362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The |seed| parameter is used to synthesize a UID for the track. 3372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian explicit Track(unsigned int* seed); 3382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual ~Track(); 3392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a ContentEncoding element to the Track. Returns true on success. 3412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual bool AddContentEncoding(); 3422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the ContentEncoding by index. Returns NULL if there is no 3442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // ContentEncoding match. 3452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ContentEncoding* GetContentEncodingByIndex(uint32 index) const; 3462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the payload of the Track element. 3482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual uint64 PayloadSize() const; 3492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes of the Track element. 3512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual uint64 Size() const; 3522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Output the Track element to the writer. Returns true on success. 3542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual bool Write(IMkvWriter* writer) const; 3552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sets the CodecPrivate element of the Track element. Copies |length| 3572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // bytes from |codec_private| to |codec_private_|. Returns true on success. 3582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool SetCodecPrivate(const uint8* codec_private, uint64 length); 3592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_codec_id(const char* codec_id); 3612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const char* codec_id() const { return codec_id_; } 3622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint8* codec_private() const { return codec_private_; } 3632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_language(const char* language); 3642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const char* language() const { return language_; } 3652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_max_block_additional_id(uint64 max_block_additional_id) { 3662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian max_block_additional_id_ = max_block_additional_id; 3672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 3682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 max_block_additional_id() const { return max_block_additional_id_; } 3692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_name(const char* name); 3702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const char* name() const { return name_; } 3712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_number(uint64 number) { number_ = number; } 3722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 number() const { return number_; } 3732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_type(uint64 type) { type_ = type; } 3742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 type() const { return type_; } 3752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_uid(uint64 uid) { uid_ = uid; } 3762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 uid() const { return uid_; } 3772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_codec_delay(uint64 codec_delay) { codec_delay_ = codec_delay; } 3782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 codec_delay() const { return codec_delay_; } 3792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_seek_pre_roll(uint64 seek_pre_roll) { 3802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian seek_pre_roll_ = seek_pre_roll; 3812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 3822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 seek_pre_roll() const { return seek_pre_roll_; } 383ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian void set_default_duration(uint64 default_duration) { 384ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian default_duration_ = default_duration; 385ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 386ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 default_duration() const { return default_duration_; } 3872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 codec_private_length() const { return codec_private_length_; } 3892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32 content_encoding_entries_size() const { 3902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian return content_encoding_entries_size_; 3912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 3922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 3932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 394ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // Track element names. 3952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* codec_id_; 3962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint8* codec_private_; 3972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* language_; 3982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 max_block_additional_id_; 3992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* name_; 4002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 number_; 4012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 type_; 4022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 uid_; 4032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 codec_delay_; 4042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 seek_pre_roll_; 405ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 default_duration_; 4062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Size of the CodecPrivate data in bytes. 4082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 codec_private_length_; 4092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // ContentEncoding element list. 4112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ContentEncoding** content_encoding_entries_; 4122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of ContentEncoding elements added. 4142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32 content_encoding_entries_size_; 4152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Track); 4172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 4182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 4202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Track that has video specific elements. 4212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass VideoTrack : public Track { 4222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 4232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Supported modes for stereo 3D. 4242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian enum StereoMode { 4252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian kMono = 0, 426ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian kSideBySideLeftIsFirst = 1, 427ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian kTopBottomRightIsFirst = 2, 428ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian kTopBottomLeftIsFirst = 3, 4292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian kSideBySideRightIsFirst = 11 4302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian }; 4312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 432ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian enum AlphaMode { kNoAlpha = 0, kAlpha = 1 }; 4332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The |seed| parameter is used to synthesize a UID for the track. 4352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian explicit VideoTrack(unsigned int* seed); 4362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual ~VideoTrack(); 4372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the payload of the Track element plus the 4392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // video specific elements. 4402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual uint64 PayloadSize() const; 4412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Output the VideoTrack element to the writer. Returns true on success. 4432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual bool Write(IMkvWriter* writer) const; 4442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sets the video's stereo mode. Returns true on success. 4462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool SetStereoMode(uint64 stereo_mode); 4472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sets the video's alpha mode. Returns true on success. 4492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool SetAlphaMode(uint64 alpha_mode); 4502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_display_height(uint64 height) { display_height_ = height; } 4522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 display_height() const { return display_height_; } 4532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_display_width(uint64 width) { display_width_ = width; } 4542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 display_width() const { return display_width_; } 455da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 456da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void set_crop_left(uint64 crop_left) { crop_left_ = crop_left; } 457da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 crop_left() const { return crop_left_; } 458da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void set_crop_right(uint64 crop_right) { crop_right_ = crop_right; } 459da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 crop_right() const { return crop_right_; } 460da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void set_crop_top(uint64 crop_top) { crop_top_ = crop_top; } 461da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 crop_top() const { return crop_top_; } 462da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void set_crop_bottom(uint64 crop_bottom) { crop_bottom_ = crop_bottom; } 463da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 crop_bottom() const { return crop_bottom_; } 464da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 4652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_frame_rate(double frame_rate) { frame_rate_ = frame_rate; } 4662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian double frame_rate() const { return frame_rate_; } 4672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_height(uint64 height) { height_ = height; } 4682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 height() const { return height_; } 4692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 stereo_mode() { return stereo_mode_; } 4702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 alpha_mode() { return alpha_mode_; } 4712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_width(uint64 width) { width_ = width; } 4722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 width() const { return width_; } 4732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 4752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes of the Video element. 4762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 VideoPayloadSize() const; 4772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Video track element names. 4792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 display_height_; 4802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 display_width_; 481da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 crop_left_; 482da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 crop_right_; 483da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 crop_top_; 484da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 crop_bottom_; 4852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian double frame_rate_; 4862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 height_; 4872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 stereo_mode_; 4882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 alpha_mode_; 4892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 width_; 4902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(VideoTrack); 4922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 4932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 4952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Track that has audio specific elements. 4962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass AudioTrack : public Track { 4972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 4982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The |seed| parameter is used to synthesize a UID for the track. 4992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian explicit AudioTrack(unsigned int* seed); 5002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual ~AudioTrack(); 5012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the payload of the Track element plus the 5032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // audio specific elements. 5042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual uint64 PayloadSize() const; 5052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Output the AudioTrack element to the writer. Returns true on success. 5072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual bool Write(IMkvWriter* writer) const; 5082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_bit_depth(uint64 bit_depth) { bit_depth_ = bit_depth; } 5102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 bit_depth() const { return bit_depth_; } 5112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_channels(uint64 channels) { channels_ = channels; } 5122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 channels() const { return channels_; } 5132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_sample_rate(double sample_rate) { sample_rate_ = sample_rate; } 5142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian double sample_rate() const { return sample_rate_; } 5152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 5172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Audio track element names. 5182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 bit_depth_; 5192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 channels_; 5202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian double sample_rate_; 5212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(AudioTrack); 5232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 5242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 5262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Tracks element 5272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass Tracks { 5282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 5292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Audio and video type defined by the Matroska specs. 530ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian enum { kVideo = 0x1, kAudio = 0x2 }; 5312263fc984bdc858ee931d3e35c87c404de923950Johann 5322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian static const char kOpusCodecId[]; 5332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian static const char kVorbisCodecId[]; 5342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian static const char kVp8CodecId[]; 5352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian static const char kVp9CodecId[]; 536da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian static const char kVp10CodecId[]; 5372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Tracks(); 5392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~Tracks(); 5402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a Track element to the Tracks object. |track| will be owned and 5422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // deleted by the Tracks object. Returns true on success. |number| is the 5432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // number to use for the track. |number| must be >= 0. If |number| == 0 5442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // then the muxer will decide on the track number. 5452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool AddTrack(Track* track, int32 number); 5462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the track by index. Returns NULL if there is no track match. 5482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const Track* GetTrackByIndex(uint32 idx) const; 5492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Search the Tracks and return the track that matches |tn|. Returns NULL 5512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // if there is no track match. 5522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Track* GetTrackByNumber(uint64 track_number) const; 5532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns true if the track number is an audio track. 5552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool TrackIsAudio(uint64 track_number) const; 5562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns true if the track number is a video track. 5582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool TrackIsVideo(uint64 track_number) const; 5592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Output the Tracks element to the writer. Returns true on success. 5612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Write(IMkvWriter* writer) const; 5622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32 track_entries_size() const { return track_entries_size_; } 5642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 5662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Track element list. 5672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Track** track_entries_; 5682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of Track elements added. 5702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32 track_entries_size_; 5712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Tracks); 5732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 5742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 5762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Chapter element 5772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// 5782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass Chapter { 5792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 5802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Set the identifier for this chapter. (This corresponds to the 5812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Cue Identifier line in WebVTT.) 5822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // TODO(matthewjheaney): the actual serialization of this item in 5832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // MKV is pending. 5842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool set_id(const char* id); 5852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Converts the nanosecond start and stop times of this chapter to 5872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // their corresponding timecode values, and stores them that way. 588ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian void set_time(const Segment& segment, uint64 start_time_ns, 5892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 end_time_ns); 5902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sets the uid for this chapter. Primarily used to enable 5922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // deterministic output from the muxer. 5932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_uid(const uint64 uid) { uid_ = uid; } 5942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 5952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Add a title string to this chapter, per the semantics described 5962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // here: 5972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // http://www.matroska.org/technical/specs/index.html 5982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // 5992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The title ("chapter string") is a UTF-8 string. 6002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // 6012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The language has ISO 639-2 representation, described here: 6022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // http://www.loc.gov/standards/iso639-2/englangn.html 6032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // http://www.loc.gov/standards/iso639-2/php/English_list.php 6042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // If you specify NULL as the language value, this implies 6052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // English ("eng"). 6062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // 6072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The country value corresponds to the codes listed here: 6082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // http://www.iana.org/domains/root/db/ 6092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // 6102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The function returns false if the string could not be allocated. 611ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian bool add_string(const char* title, const char* language, const char* country); 6122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 6142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian friend class Chapters; 6152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // For storage of chapter titles that differ by language. 6172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian class Display { 6182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 6192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Establish representation invariant for new Display object. 6202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void Init(); 6212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Reclaim resources, in anticipation of destruction. 6232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void Clear(); 6242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Copies the title to the |title_| member. Returns false on 6262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // error. 6272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool set_title(const char* title); 6282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Copies the language to the |language_| member. Returns false 6302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // on error. 6312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool set_language(const char* language); 6322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Copies the country to the |country_| member. Returns false on 6342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // error. 6352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool set_country(const char* country); 6362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // If |writer| is non-NULL, serialize the Display sub-element of 6382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // the Atom into the stream. Returns the Display element size on 6392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // success, 0 if error. 6402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 WriteDisplay(IMkvWriter* writer) const; 6412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 6432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* title_; 6442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* language_; 6452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* country_; 6462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian }; 6472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Chapter(); 6492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~Chapter(); 6502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Establish the representation invariant for a newly-created 6522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Chapter object. The |seed| parameter is used to create the UID 6532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // for this chapter atom. 6542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void Init(unsigned int* seed); 6552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Copies this Chapter object to a different one. This is used when 6572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // expanding a plain array of Chapter objects (see Chapters). 6582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void ShallowCopy(Chapter* dst) const; 6592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Reclaim resources used by this Chapter object, pending its 6612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // destruction. 6622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void Clear(); 6632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // If there is no storage remaining on the |displays_| array for a 6652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // new display object, creates a new, longer array and copies the 6662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // existing Display objects to the new array. Returns false if the 6672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // array cannot be expanded. 6682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool ExpandDisplaysArray(); 6692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // If |writer| is non-NULL, serialize the Atom sub-element into the 6712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // stream. Returns the total size of the element on success, 0 if 6722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // error. 6732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 WriteAtom(IMkvWriter* writer) const; 6742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The string identifier for this chapter (corresponds to WebVTT cue 6762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // identifier). 6772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* id_; 6782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Start timecode of the chapter. 6802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 start_timecode_; 6812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Stop timecode of the chapter. 6832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 end_timecode_; 6842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The binary identifier for this chapter. 6862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 uid_; 6872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The Atom element can contain multiple Display sub-elements, as 6892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // the same logical title can be rendered in different languages. 6902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Display* displays_; 6912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The physical length (total size) of the |displays_| array. 6932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int displays_size_; 6942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The logical length (number of active elements) on the |displays_| 6962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // array. 6972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int displays_count_; 6982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 6992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Chapter); 7002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 7012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 7032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Chapters element 7042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// 7052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass Chapters { 7062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 7072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Chapters(); 7082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~Chapters(); 7092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Chapter* AddChapter(unsigned int* seed); 7112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the number of chapters that have been added. 7132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int Count() const; 7142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Output the Chapters element to the writer. Returns true on success. 7162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Write(IMkvWriter* writer) const; 7172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 7192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Expands the chapters_ array if there is not enough space to contain 7202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // another chapter object. Returns true on success. 7212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool ExpandChaptersArray(); 7222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // If |writer| is non-NULL, serialize the Edition sub-element of the 7242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Chapters element into the stream. Returns the Edition element 7252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // size on success, 0 if error. 7262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 WriteEdition(IMkvWriter* writer) const; 7272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Total length of the chapters_ array. 7292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int chapters_size_; 7302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of active chapters on the chapters_ array. 7322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int chapters_count_; 7332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Array for storage of chapter objects. 7352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Chapter* chapters_; 7362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Chapters); 7382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 7392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 7402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 741da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// Tag element 742da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// 743da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianclass Tag { 744da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian public: 745da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool add_simple_tag(const char* tag_name, const char* tag_string); 746da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 747da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian private: 748da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Tags calls Clear and the destructor of Tag 749da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian friend class Tags; 750da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 751da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // For storage of simple tags 752da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian class SimpleTag { 753da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian public: 754da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Establish representation invariant for new SimpleTag object. 755da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void Init(); 756da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 757da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Reclaim resources, in anticipation of destruction. 758da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void Clear(); 759da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 760da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Copies the title to the |tag_name_| member. Returns false on 761da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // error. 762da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool set_tag_name(const char* tag_name); 763da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 764da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Copies the language to the |tag_string_| member. Returns false 765da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // on error. 766da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool set_tag_string(const char* tag_string); 767da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 768da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // If |writer| is non-NULL, serialize the SimpleTag sub-element of 769da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // the Atom into the stream. Returns the SimpleTag element size on 770da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // success, 0 if error. 771da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 Write(IMkvWriter* writer) const; 772da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 773da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian private: 774da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian char* tag_name_; 775da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian char* tag_string_; 776da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian }; 777da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 778da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian Tag(); 779da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian ~Tag(); 780da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 781da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Copies this Tag object to a different one. This is used when 782da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // expanding a plain array of Tag objects (see Tags). 783da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void ShallowCopy(Tag* dst) const; 784da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 785da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Reclaim resources used by this Tag object, pending its 786da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // destruction. 787da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void Clear(); 788da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 789da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // If there is no storage remaining on the |simple_tags_| array for a 790da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // new display object, creates a new, longer array and copies the 791da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // existing SimpleTag objects to the new array. Returns false if the 792da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // array cannot be expanded. 793da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool ExpandSimpleTagsArray(); 794da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 795da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // If |writer| is non-NULL, serialize the Tag sub-element into the 796da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // stream. Returns the total size of the element on success, 0 if 797da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // error. 798da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 Write(IMkvWriter* writer) const; 799da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 800da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // The Atom element can contain multiple SimpleTag sub-elements 801da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian SimpleTag* simple_tags_; 802da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 803da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // The physical length (total size) of the |simple_tags_| array. 804da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int simple_tags_size_; 805da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 806da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // The logical length (number of active elements) on the |simple_tags_| 807da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // array. 808da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int simple_tags_count_; 809da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 810da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Tag); 811da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}; 812da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 813da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 814da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// Tags element 815da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// 816da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianclass Tags { 817da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian public: 818da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian Tags(); 819da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian ~Tags(); 820da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 821da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian Tag* AddTag(); 822da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 823da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Returns the number of tags that have been added. 824da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int Count() const; 825da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 826da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Output the Tags element to the writer. Returns true on success. 827da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool Write(IMkvWriter* writer) const; 828da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 829da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian private: 830da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Expands the tags_ array if there is not enough space to contain 831da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // another tag object. Returns true on success. 832da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool ExpandTagsArray(); 833da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 834da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Total length of the tags_ array. 835da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int tags_size_; 836da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 837da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Number of active tags on the tags_ array. 838da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int tags_count_; 839da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 840da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Array for storage of tag objects. 841da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian Tag* tags_; 842da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 843da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Tags); 844da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}; 845da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 846da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 8472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Cluster element 8482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// 8492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Notes: 8502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// |Init| must be called before any other method in this class. 8512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass Cluster { 8522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 8532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |timecode| is the absolute timecode of the cluster. |cues_pos| is the 8542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // position for the cluster within the segment that should be written in 855da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // the cues element. |timecode_scale| is the timecode scale of the segment. 856da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian Cluster(uint64 timecode, int64 cues_pos, uint64 timecode_scale); 857da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian ~Cluster(); 858da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 8592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Init(IMkvWriter* ptr_writer); 8602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 8612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a frame to be output in the file. The frame is written out through 8622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |writer_| if successful. Returns true on success. 863da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool AddFrame(const Frame* frame); 864da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 865da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Adds a frame to be output in the file. The frame is written out through 866da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // |writer_| if successful. Returns true on success. 8672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Inputs: 868da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // data: Pointer to the data 8692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // length: Length of the data 8702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // track_number: Track to add the data to. Value returned by Add track 8712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // functions. The range of allowed values is [1, 126]. 8722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // timecode: Absolute (not relative to cluster) timestamp of the 8732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // frame, expressed in timecode units. 8742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // is_key: Flag telling whether or not this frame is a key frame. 875da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool AddFrame(const uint8* data, uint64 length, uint64 track_number, 8762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 timecode, // timecode units (absolute) 8772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool is_key); 8782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 8792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a frame to be output in the file. The frame is written out through 8802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |writer_| if successful. Returns true on success. 8812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Inputs: 882da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // data: Pointer to the data 8832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // length: Length of the data 8842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // additional: Pointer to the additional data 8852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // additional_length: Length of the additional data 8862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // add_id: Value of BlockAddID element 8872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // track_number: Track to add the data to. Value returned by Add track 8882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // functions. The range of allowed values is [1, 126]. 8892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // abs_timecode: Absolute (not relative to cluster) timestamp of the 8902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // frame, expressed in timecode units. 8912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // is_key: Flag telling whether or not this frame is a key frame. 892da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool AddFrameWithAdditional(const uint8* data, uint64 length, 893ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8* additional, uint64 additional_length, 894ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 add_id, uint64 track_number, 895ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 abs_timecode, bool is_key); 8962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 8972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a frame to be output in the file. The frame is written out through 8982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |writer_| if successful. Returns true on success. 8992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Inputs: 900da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // data: Pointer to the data. 9012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // length: Length of the data. 9022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // discard_padding: DiscardPadding element value. 9032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // track_number: Track to add the data to. Value returned by Add track 9042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // functions. The range of allowed values is [1, 126]. 9052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // abs_timecode: Absolute (not relative to cluster) timestamp of the 9062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // frame, expressed in timecode units. 9072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // is_key: Flag telling whether or not this frame is a key frame. 908da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool AddFrameWithDiscardPadding(const uint8* data, uint64 length, 909ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int64 discard_padding, uint64 track_number, 910ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 abs_timecode, bool is_key); 9112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Writes a frame of metadata to the output medium; returns true on 9132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // success. 9142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Inputs: 915da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // data: Pointer to the data 9162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // length: Length of the data 9172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // track_number: Track to add the data to. Value returned by Add track 9182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // functions. The range of allowed values is [1, 126]. 9192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // timecode: Absolute (not relative to cluster) timestamp of the 9202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // metadata frame, expressed in timecode units. 9212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // duration: Duration of metadata frame, in timecode units. 9222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // 9232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The metadata frame is written as a block group, with a duration 9242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // sub-element but no reference time sub-elements (indicating that 9252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // it is considered a keyframe, per Matroska semantics). 926da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool AddMetadata(const uint8* data, uint64 length, uint64 track_number, 927ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 timecode, uint64 duration); 9282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Increments the size of the cluster's data in bytes. 9302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void AddPayloadSize(uint64 size); 9312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Closes the cluster so no more data can be written to it. Will update the 9332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // cluster's size if |writer_| is seekable. Returns true on success. 9342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Finalize(); 9352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the size in bytes for the entire Cluster element. 9372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 Size() const; 9382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 939da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Given |abs_timecode|, calculates timecode relative to most recent timecode. 940da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Returns -1 on failure, or a relative timecode. 941da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int64 GetRelativeTimecode(int64 abs_timecode) const; 942da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 9432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64 size_position() const { return size_position_; } 9442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int32 blocks_added() const { return blocks_added_; } 9452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 payload_size() const { return payload_size_; } 9462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64 position_for_cues() const { return position_for_cues_; } 9472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 timecode() const { return timecode_; } 948da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 timecode_scale() const { return timecode_scale_; } 9492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 9512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Utility method that confirms that blocks can still be added, and that the 952da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // cluster header has been written. Used by |DoWriteFrame*|. Returns true 9532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // when successful. 954da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool PreWriteBlock(); 9552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 956da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Utility method used by the |DoWriteFrame*| methods that handles the book 9572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // keeping required after each block is written. 9582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void PostWriteBlock(uint64 element_size); 9592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 960da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Does some verification and calls WriteFrame. 961da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool DoWriteFrame(const Frame* const frame); 9622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Outputs the Cluster header to |writer_|. Returns true on success. 9642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool WriteClusterHeader(); 9652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of blocks added to the cluster. 9672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int32 blocks_added_; 9682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Flag telling if the cluster has been closed. 9702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool finalized_; 9712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Flag telling if the cluster's header has been written. 9732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool header_written_; 9742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The size of the cluster elements in bytes. 9762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 payload_size_; 9772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The file position used for cue points. 9792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int64 position_for_cues_; 9802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The file position of the cluster's size element. 9822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64 size_position_; 9832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The absolute timecode of the cluster. 9852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint64 timecode_; 9862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 987da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // The timecode scale of the Segment containing the cluster. 988da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const uint64 timecode_scale_; 989da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 9902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Pointer to the writer object. Not owned by this class. 9912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian IMkvWriter* writer_; 9922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Cluster); 9942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 9952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 9962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 9972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// SeekHead element 9982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass SeekHead { 9992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 10002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian SeekHead(); 10012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~SeekHead(); 10022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // TODO(fgalligan): Change this to reserve a certain size. Then check how 10042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // big the seek entry to be added is as not every seek entry will be the 10052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // maximum size it could be. 10062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a seek entry to be written out when the element is finalized. |id| 10072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // must be the coded mkv element id. |pos| is the file position of the 10082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // element. Returns true on success. 10092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool AddSeekEntry(uint32 id, uint64 pos); 10102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Writes out SeekHead and SeekEntry elements. Returns true on success. 10122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Finalize(IMkvWriter* writer) const; 10132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the id of the Seek Entry at the given index. Returns -1 if index is 10152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // out of range. 10162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32 GetId(int index) const; 10172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the position of the Seek Entry at the given index. Returns -1 if 10192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // index is out of range. 10202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 GetPosition(int index) const; 10212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sets the Seek Entry id and position at given index. 10232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns true on success. 10242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool SetSeekEntry(int index, uint32 id, uint64 position); 10252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Reserves space by writing out a Void element which will be updated with 10272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // a SeekHead element later. Returns true on success. 10282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Write(IMkvWriter* writer); 10292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // We are going to put a cap on the number of Seek Entries. 10312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const static int32 kSeekEntryCount = 5; 10322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 10342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the maximum size in bytes of one seek entry. 10352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 MaxEntrySize() const; 10362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Seek entry id element list. 10382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32 seek_entry_id_[kSeekEntryCount]; 10392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Seek entry pos element list. 10412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 seek_entry_pos_[kSeekEntryCount]; 10422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The file position of SeekHead element. 10442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64 start_pos_; 10452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(SeekHead); 10472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 10482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 10502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Segment Information element 10512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass SegmentInfo { 10522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 10532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian SegmentInfo(); 10542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~SegmentInfo(); 10552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Will update the duration if |duration_| is > 0.0. Returns true on success. 10572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Finalize(IMkvWriter* writer) const; 10582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sets |muxing_app_| and |writing_app_|. 10602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Init(); 10612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Output the Segment Information element to the writer. Returns true on 10632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // success. 10642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Write(IMkvWriter* writer); 10652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_duration(double duration) { duration_ = duration; } 10672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian double duration() const { return duration_; } 10682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_muxing_app(const char* app); 10692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const char* muxing_app() const { return muxing_app_; } 10702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_timecode_scale(uint64 scale) { timecode_scale_ = scale; } 10712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 timecode_scale() const { return timecode_scale_; } 10722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_writing_app(const char* app); 10732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const char* writing_app() const { return writing_app_; } 1074ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian void set_date_utc(int64 date_utc) { date_utc_ = date_utc; } 1075ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int64 date_utc() const { return date_utc_; } 10762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 10782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Segment Information element names. 10792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Initially set to -1 to signify that a duration has not been set and should 10802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // not be written out. 10812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian double duration_; 10822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Set to libwebm-%d.%d.%d.%d, major, minor, build, revision. 10832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* muxing_app_; 10842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 timecode_scale_; 10852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Initially set to libwebm-%d.%d.%d.%d, major, minor, build, revision. 10862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* writing_app_; 1087ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // LLONG_MIN when DateUTC is not set. 1088ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int64 date_utc_; 10892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The file position of the duration element. 10912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64 duration_pos_; 10922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(SegmentInfo); 10942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 10952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/////////////////////////////////////////////////////////////// 10972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// This class represents the main segment in a WebM file. Currently only 10982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// supports one Segment element. 10992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// 11002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Notes: 11012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// |Init| must be called before any other method in this class. 11022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass Segment { 11032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 1104ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian enum Mode { kLive = 0x1, kFile = 0x2 }; 11052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian enum CuesPosition { 11072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian kAfterClusters = 0x0, // Position Cues after Clusters - Default 11082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian kBeforeClusters = 0x1 // Position Cues before Clusters 11092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian }; 11102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1111da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const static uint32 kDefaultDocTypeVersion = 2; 11122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const static uint64 kDefaultMaxClusterDuration = 30000000000ULL; 11132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Segment(); 11152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ~Segment(); 11162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Initializes |SegmentInfo| and returns result. Always returns false when 11182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |ptr_writer| is NULL. 11192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Init(IMkvWriter* ptr_writer); 11202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a generic track to the segment. Returns the newly-allocated 11222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // track object (which is owned by the segment) on success, NULL on 11232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // error. |number| is the number to use for the track. |number| 11242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // must be >= 0. If |number| == 0 then the muxer will decide on the 11252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // track number. 11262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Track* AddTrack(int32 number); 11272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a Vorbis audio track to the segment. Returns the number of the track 11292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // on success, 0 on error. |number| is the number to use for the audio track. 11302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |number| must be >= 0. If |number| == 0 then the muxer will decide on 11312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // the track number. 11322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 AddAudioTrack(int32 sample_rate, int32 channels, int32 number); 11332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds an empty chapter to the chapters of this segment. Returns 11352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // non-NULL on success. After adding the chapter, the caller should 11362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // populate its fields via the Chapter member functions. 11372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Chapter* AddChapter(); 11382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1139da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Adds an empty tag to the tags of this segment. Returns 1140da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // non-NULL on success. After adding the tag, the caller should 1141da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // populate its fields via the Tag member functions. 1142da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian Tag* AddTag(); 1143da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 11442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a cue point to the Cues element. |timestamp| is the time in 11452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // nanoseconds of the cue's time. |track| is the Track of the Cue. This 11462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // function must be called after AddFrame to calculate the correct 11472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // BlockNumber for the CuePoint. Returns true on success. 11482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool AddCuePoint(uint64 timestamp, uint64 track); 11492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a frame to be output in the file. Returns true on success. 11512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Inputs: 1152da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // data: Pointer to the data 11532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // length: Length of the data 11542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // track_number: Track to add the data to. Value returned by Add track 11552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // functions. 11562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // timestamp: Timestamp of the frame in nanoseconds from 0. 11572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // is_key: Flag telling whether or not this frame is a key frame. 1158da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool AddFrame(const uint8* data, uint64 length, uint64 track_number, 1159ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 timestamp_ns, bool is_key); 11602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Writes a frame of metadata to the output medium; returns true on 11622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // success. 11632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Inputs: 1164da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // data: Pointer to the data 11652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // length: Length of the data 11662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // track_number: Track to add the data to. Value returned by Add track 11672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // functions. 11682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // timecode: Absolute timestamp of the metadata frame, expressed 11692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // in nanosecond units. 11702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // duration: Duration of metadata frame, in nanosecond units. 11712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // 11722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The metadata frame is written as a block group, with a duration 11732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // sub-element but no reference time sub-elements (indicating that 11742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // it is considered a keyframe, per Matroska semantics). 1175da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool AddMetadata(const uint8* data, uint64 length, uint64 track_number, 1176ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 timestamp_ns, uint64 duration_ns); 11772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Writes a frame with additional data to the output medium; returns true on 11792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // success. 11802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Inputs: 1181da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // data: Pointer to the data. 11822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // length: Length of the data. 11832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // additional: Pointer to additional data. 11842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // additional_length: Length of additional data. 11852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // add_id: Additional ID which identifies the type of additional data. 11862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // track_number: Track to add the data to. Value returned by Add track 11872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // functions. 11882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // timestamp: Absolute timestamp of the frame, expressed in nanosecond 11892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // units. 11902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // is_key: Flag telling whether or not this frame is a key frame. 1191da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool AddFrameWithAdditional(const uint8* data, uint64 length, 1192ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8* additional, uint64 additional_length, 1193ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 add_id, uint64 track_number, 1194ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 timestamp, bool is_key); 11952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 11962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Writes a frame with DiscardPadding to the output medium; returns true on 11972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // success. 11982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Inputs: 1199da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // data: Pointer to the data. 12002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // length: Length of the data. 12012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // discard_padding: DiscardPadding element value. 12022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // track_number: Track to add the data to. Value returned by Add track 12032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // functions. 12042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // timestamp: Absolute timestamp of the frame, expressed in nanosecond 12052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // units. 12062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // is_key: Flag telling whether or not this frame is a key frame. 1207da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian bool AddFrameWithDiscardPadding(const uint8* data, uint64 length, 1208ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int64 discard_padding, uint64 track_number, 1209ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint64 timestamp, bool is_key); 12102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Writes a Frame to the output medium. Chooses the correct way of writing 12122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // the frame (Block vs SimpleBlock) based on the parameters passed. 12132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Inputs: 12142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // frame: frame object 12152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool AddGenericFrame(const Frame* frame); 12162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds a VP8 video track to the segment. Returns the number of the track on 12182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // success, 0 on error. |number| is the number to use for the video track. 12192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |number| must be >= 0. If |number| == 0 then the muxer will decide on 12202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // the track number. 12212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 AddVideoTrack(int32 width, int32 height, int32 number); 12222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // This function must be called after Finalize() if you need a copy of the 12242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // output with Cues written before the Clusters. It will return false if the 12252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // writer is not seekable of if chunking is set to true. 12262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Input parameters: 12272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // reader - an IMkvReader object created with the same underlying file of the 12282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // current writer object. Make sure to close the existing writer 12292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // object before creating this so that all the data is properly 12302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // flushed and available for reading. 12312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // writer - an IMkvWriter object pointing to a *different* file than the one 12322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // pointed by the current writer object. This file will contain the 12332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Cues element before the Clusters. 12342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool CopyAndMoveCuesBeforeClusters(mkvparser::IMkvReader* reader, 12352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian IMkvWriter* writer); 12362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sets which track to use for the Cues element. Must have added the track 12382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // before calling this function. Returns true on success. |track_number| is 12392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // returned by the Add track functions. 12402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool CuesTrack(uint64 track_number); 12412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // This will force the muxer to create a new Cluster when the next frame is 12432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // added. 12442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void ForceNewClusterOnNextFrame(); 12452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Writes out any frames that have not been written out. Finalizes the last 12472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // cluster. May update the size and duration of the segment. May output the 12482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Cues element. May finalize the SeekHead element. Returns true on success. 12492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool Finalize(); 12502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the Cues object. 12522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Cues* GetCues() { return &cues_; } 12532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the Segment Information object. 12552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const SegmentInfo* GetSegmentInfo() const { return &segment_info_; } 12562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian SegmentInfo* GetSegmentInfo() { return &segment_info_; } 12572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Search the Tracks and return the track that matches |track_number|. 12592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns NULL if there is no track match. 12602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Track* GetTrackByNumber(uint64 track_number) const; 12612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Toggles whether to output a cues element. 12632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void OutputCues(bool output_cues); 12642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sets if the muxer will output files in chunks or not. |chunking| is a 12662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // flag telling whether or not to turn on chunking. |filename| is the base 12672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // filename for the chunk files. The header chunk file will be named 12682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |filename|.hdr and the data chunks will be named 12692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // |filename|_XXXXXX.chk. Chunking implies that the muxer will be writing 12702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // to files so the muxer will use the default MkvWriter class to control 12712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // what data is written to what files. Returns true on success. 12722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // TODO: Should we change the IMkvWriter Interface to add Open and Close? 12732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // That will force the interface to be dependent on files. 12742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool SetChunking(bool chunking, const char* filename); 12752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool chunking() const { return chunking_; } 12772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 cues_track() const { return cues_track_; } 12782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_max_cluster_duration(uint64 max_cluster_duration) { 12792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian max_cluster_duration_ = max_cluster_duration; 12802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 12812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 max_cluster_duration() const { return max_cluster_duration_; } 12822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_max_cluster_size(uint64 max_cluster_size) { 12832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian max_cluster_size_ = max_cluster_size; 12842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 12852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 max_cluster_size() const { return max_cluster_size_; } 12862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void set_mode(Mode mode) { mode_ = mode; } 12872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Mode mode() const { return mode_; } 12882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian CuesPosition cues_position() const { return cues_position_; } 12892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool output_cues() const { return output_cues_; } 12902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const SegmentInfo* segment_info() const { return &segment_info_; } 12912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 12922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian private: 12932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Checks if header information has been output and initialized. If not it 12942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // will output the Segment element and initialize the SeekHead elment and 12952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Cues elements. 12962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool CheckHeaderInfo(); 12972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1298da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Sets |doc_type_version_| based on the current element requirements. 1299da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian void UpdateDocTypeVersion(); 1300da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 13012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Sets |name| according to how many chunks have been written. |ext| is the 13022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // file extension. |name| must be deleted by the calling app. Returns true 13032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // on success. 13042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool UpdateChunkName(const char* ext, char** name) const; 13052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Returns the maximum offset within the segment's payload. When chunking 13072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // this function is needed to determine offsets of elements within the 13082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // chunked files. Returns -1 on error. 13092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64 MaxOffset(); 13102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adds the frame to our frame array. 13122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool QueueFrame(Frame* frame); 13132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Output all frames that are queued. Returns -1 on error, otherwise 13152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // it returns the number of frames written. 13162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int WriteFramesAll(); 13172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Output all frames that are queued that have an end time that is less 13192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // then |timestamp|. Returns true on success and if there are no frames 13202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // queued. 13212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool WriteFramesLessThan(uint64 timestamp); 13222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Outputs the segment header, Segment Information element, SeekHead element, 13242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // and Tracks element to |writer_|. 13252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool WriteSegmentHeader(); 13262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Given a frame with the specified timestamp (nanosecond units) and 13282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // keyframe status, determine whether a new cluster should be 13292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // created, before writing enqueued frames and the frame itself. The 13302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // function returns one of the following values: 13312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // -1 = error: an out-of-order frame was detected 13322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // 0 = do not create a new cluster, and write frame to the existing cluster 13332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // 1 = create a new cluster, and write frame to that new cluster 13342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // 2 = create a new cluster, and re-run test 13352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int TestFrame(uint64 track_num, uint64 timestamp_ns, bool key) const; 13362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Create a new cluster, using the earlier of the first enqueued 13382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // frame, or the indicated time. Returns true on success. 13392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool MakeNewCluster(uint64 timestamp_ns); 13402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Checks whether a new cluster needs to be created, and if so 13422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // creates a new cluster. Returns false if creation of a new cluster 13432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // was necessary but creation was not successful. 13442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool DoNewClusterProcessing(uint64 track_num, uint64 timestamp_ns, bool key); 13452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Adjusts Cue Point values (to place Cues before Clusters) so that they 13472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // reflect the correct offsets. 13482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void MoveCuesBeforeClusters(); 13492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // This function recursively computes the correct cluster offsets (this is 13512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // done to move the Cues before Clusters). It recursively updates the change 13522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // in size (which indicates a change in cluster offset) until no sizes change. 13532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Parameters: 13542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // diff - indicates the difference in size of the Cues element that needs to 13552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // accounted for. 13562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // index - index in the list of Cues which is currently being adjusted. 1357da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // cue_size - sum of size of all the CuePoint elements. 13582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void MoveCuesBeforeClustersHelper(uint64 diff, int index, uint64* cue_size); 13592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Seeds the random number generator used to make UIDs. 13612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int seed_; 13622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // WebM elements 13642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Cues cues_; 13652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian SeekHead seek_head_; 13662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian SegmentInfo segment_info_; 13672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Tracks tracks_; 13682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Chapters chapters_; 1369da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian Tags tags_; 13702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of chunks written. 13722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int chunk_count_; 13732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Current chunk filename. 13752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* chunk_name_; 13762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Default MkvWriter object created by this class used for writing clusters 13782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // out in separate files. 13792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian MkvWriter* chunk_writer_cluster_; 13802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Default MkvWriter object created by this class used for writing Cues 13822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // element out to a file. 13832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian MkvWriter* chunk_writer_cues_; 13842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Default MkvWriter object created by this class used for writing the 13862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Matroska header out to a file. 13872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian MkvWriter* chunk_writer_header_; 13882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Flag telling whether or not the muxer is chunking output to multiple 13902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // files. 13912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool chunking_; 13922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Base filename for the chunked files. 13942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char* chunking_base_name_; 13952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // File position offset where the Clusters end. 13972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64 cluster_end_offset_; 13982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 13992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // List of clusters. 14002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Cluster** cluster_list_; 14012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of cluster pointers allocated in the cluster list. 14032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int32 cluster_list_capacity_; 14042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of clusters in the cluster list. 14062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int32 cluster_list_size_; 14072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Indicates whether Cues should be written before or after Clusters 14092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian CuesPosition cues_position_; 14102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Track number that is associated with the cues element for this segment. 14122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 cues_track_; 14132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Tells the muxer to force a new cluster on the next Block. 14152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool force_new_cluster_; 14162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // List of stored audio frames. These variables are used to store frames so 14182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // the muxer can follow the guideline "Audio blocks that contain the video 14192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // key frame's timecode should be in the same cluster as the video key frame 14202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // block." 14212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Frame** frames_; 14222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of frame pointers allocated in the frame list. 14242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int32 frames_capacity_; 14252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Number of frames in the frame list. 14272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int32 frames_size_; 14282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Flag telling if a video track has been added to the segment. 14302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool has_video_; 14312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Flag telling if the segment's header has been written. 14332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool header_written_; 14342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Duration of the last block in nanoseconds. 14362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 last_block_duration_; 14372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Last timestamp in nanoseconds added to a cluster. 14392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 last_timestamp_; 14402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1441da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Last timestamp in nanoseconds by track number added to a cluster. 1442da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint64 last_track_timestamp_[kMaxTrackNumber]; 1443da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 14442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Maximum time in nanoseconds for a cluster duration. This variable is a 14452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // guideline and some clusters may have a longer duration. Default is 30 14462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // seconds. 14472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 max_cluster_duration_; 14482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Maximum size in bytes for a cluster. This variable is a guideline and 14502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // some clusters may have a larger size. Default is 0 which signifies that 14512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // the muxer will decide the size. 14522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64 max_cluster_size_; 14532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The mode that segment is in. If set to |kLive| the writer must not 14552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // seek backwards. 14562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Mode mode_; 14572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Flag telling the muxer that a new cue point should be added. 14592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool new_cuepoint_; 14602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // TODO(fgalligan): Should we add support for more than one Cues element? 14622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Flag whether or not the muxer should output a Cues element. 14632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian bool output_cues_; 14642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1465da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // The size of the EBML header, used to validate the header if 1466da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // WriteEbmlHeader() is called more than once. 1467da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int32 ebml_header_size_; 1468da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 14692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The file position of the segment's payload. 14702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64 payload_pos_; 14712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // The file position of the element's size. 14732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64 size_position_; 14742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1475da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Current DocTypeVersion (|doc_type_version_|) and that written in 1476da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // WriteSegmentHeader(). 1477da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // WriteEbmlHeader() will be called from Finalize() if |doc_type_version_| 1478da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // differs from |doc_type_version_written_|. 1479da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint32 doc_type_version_; 1480da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian uint32 doc_type_version_written_; 1481da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 14822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Pointer to the writer objects. Not owned by this class. 14832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian IMkvWriter* writer_cluster_; 14842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian IMkvWriter* writer_cues_; 14852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian IMkvWriter* writer_header_; 14862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Segment); 14882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 14892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1490ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} // end namespace mkvmuxer 14912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1492ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif // MKVMUXER_HPP 1493