193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Copyright (c) 2012 The WebM project authors. All Rights Reserved. 293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// 393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Use of this source code is governed by a BSD-style license 493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// that can be found in the LICENSE file in the root of the source 593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// tree. An additional intellectual property rights grant can be found 693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// in the file PATENTS. All contributing project authors may 793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// be found in the AUTHORS file in the root of the source tree. 893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#ifndef MKVMUXER_HPP 1093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#define MKVMUXER_HPP 1193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 1293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "mkvmuxertypes.hpp" 1393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 1493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// For a description of the WebM elements see 1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// http://www.webmproject.org/code/specs/container/. 1693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 1793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgnamespace mkvparser { 18810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgclass IMkvReader; 1993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org} // end namespace 2093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 2193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgnamespace mkvmuxer { 2293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 2393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass MkvWriter; 2493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Segment; 2593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 2693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 2793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Interface used by the mkvmuxer to write out the Mkv data. 2893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass IMkvWriter { 2993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 3093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Writes out |len| bytes of |buf|. Returns 0 on success. 3193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual int32 Write(const void* buf, uint32 len) = 0; 3293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 3393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the offset of the output position from the beginning of the 3493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // output. 3593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual int64 Position() const = 0; 3693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 3793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Set the current File position. Returns 0 on success. 3893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual int32 Position(int64 position) = 0; 3993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 4093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns true if the writer is seekable. 4193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual bool Seekable() const = 0; 4293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 4393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Element start notification. Called whenever an element identifier is about 4493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // to be written to the stream. |element_id| is the element identifier, and 4593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |position| is the location in the WebM stream where the first octet of the 4693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // element identifier will be written. 4793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Note: the |MkvId| enumeration in webmids.hpp defines element values. 4893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual void ElementStartNotify(uint64 element_id, int64 position) = 0; 4993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 5093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org protected: 5193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org IMkvWriter(); 5293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual ~IMkvWriter(); 5393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 5493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 5593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(IMkvWriter); 5693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 5793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 5893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Writes out the EBML header for a WebM file. This function must be called 5993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// before any other libwebm writing functions are called. 6093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgbool WriteEbmlHeader(IMkvWriter* writer); 6193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 6293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Copies in Chunk from source to destination between the given byte positions 63810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgbool ChunkedCopy(mkvparser::IMkvReader* source, IMkvWriter* dst, int64 start, 64810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org int64 size); 6593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 6693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 6793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Class to hold data the will be written to a block. 6893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Frame { 6993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 7093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Frame(); 7193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~Frame(); 7293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 7393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Copies |frame| data into |frame_|. Returns true on success. 7493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Init(const uint8* frame, uint64 length); 7593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 7693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Copies |additional| data into |additional_|. Returns true on success. 77810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool AddAdditionalData(const uint8* additional, uint64 length, uint64 add_id); 7893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 7993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 add_id() const { return add_id_; } 8093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const uint8* additional() const { return additional_; } 8193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 additional_length() const { return additional_length_; } 8293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_duration(uint64 duration) { duration_ = duration; } 8393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 duration() const { return duration_; } 8493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const uint8* frame() const { return frame_; } 8593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_is_key(bool key) { is_key_ = key; } 8693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool is_key() const { return is_key_; } 8793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 length() const { return length_; } 8893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_track_number(uint64 track_number) { track_number_ = track_number; } 8993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 track_number() const { return track_number_; } 9093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_timestamp(uint64 timestamp) { timestamp_ = timestamp; } 9193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 timestamp() const { return timestamp_; } 9293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_discard_padding(uint64 discard_padding) { 9393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org discard_padding_ = discard_padding; 9493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org } 9593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 discard_padding() const { return discard_padding_; } 9693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 9793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 9893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Id of the Additional data. 9993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 add_id_; 10093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 10193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Pointer to additional data. Owned by this class. 10293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint8* additional_; 10393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 10493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Length of the additional data. 10593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 additional_length_; 10693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 10793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Duration of the frame in nanoseconds. 10893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 duration_; 10993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 11093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Pointer to the data. Owned by this class. 11193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint8* frame_; 11293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 11393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Flag telling if the data should set the key flag of a block. 11493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool is_key_; 11593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 11693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Length of the data. 11793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 length_; 11893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 11993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Mkv track number the data is associated with. 12093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 track_number_; 12193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 12293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Timestamp of the data in nanoseconds. 12393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 timestamp_; 12493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 12593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Discard padding for the frame. 12693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 discard_padding_; 12793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 12893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 12993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 13093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Class to hold one cue point in a Cues element. 13193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass CuePoint { 13293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 13393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org CuePoint(); 13493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~CuePoint(); 13593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 13693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the entire CuePoint element. 13793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 Size() const; 13893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 13993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Output the CuePoint element to the writer. Returns true on success. 14093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Write(IMkvWriter* writer) const; 14193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 14293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_time(uint64 time) { time_ = time; } 14393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 time() const { return time_; } 14493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_track(uint64 track) { track_ = track; } 14593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 track() const { return track_; } 14693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_cluster_pos(uint64 cluster_pos) { cluster_pos_ = cluster_pos; } 14793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 cluster_pos() const { return cluster_pos_; } 14893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_block_number(uint64 block_number) { block_number_ = block_number; } 14993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 block_number() const { return block_number_; } 15093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_output_block_number(bool output_block_number) { 15193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org output_block_number_ = output_block_number; 15293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org } 15393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool output_block_number() const { return output_block_number_; } 15493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 15593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 15693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the payload of the CuePoint element. 15793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 PayloadSize() const; 15893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 15993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Absolute timecode according to the segment time base. 16093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 time_; 16193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 16293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The Track element associated with the CuePoint. 16393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 track_; 16493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 16593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The position of the Cluster containing the Block. 16693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 cluster_pos_; 16793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 16893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of the Block within the Cluster, starting from 1. 16993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 block_number_; 17093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 17193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // If true the muxer will write out the block number for the cue if the 17293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // block number is different than the default of 1. Default is set to true. 17393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool output_block_number_; 17493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 17593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(CuePoint); 17693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 17793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 17893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 17993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Cues element. 18093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Cues { 18193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 18293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Cues(); 18393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~Cues(); 18493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 18593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a cue point to the Cues element. Returns true on success. 18693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool AddCue(CuePoint* cue); 18793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 18893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the cue point by index. Returns NULL if there is no cue point 18993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // match. 19093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org CuePoint* GetCueByIndex(int32 index) const; 19193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 19293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the total size of the Cues element 19393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 Size(); 19493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 19593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Output the Cues element to the writer. Returns true on success. 19693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Write(IMkvWriter* writer) const; 19793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 19893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int32 cue_entries_size() const { return cue_entries_size_; } 19993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_output_block_number(bool output_block_number) { 20093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org output_block_number_ = output_block_number; 20193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org } 20293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool output_block_number() const { return output_block_number_; } 20393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 20493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 20593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of allocated elements in |cue_entries_|. 20693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int32 cue_entries_capacity_; 20793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 20893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of CuePoints in |cue_entries_|. 20993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int32 cue_entries_size_; 21093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 21193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // CuePoint list. 21293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org CuePoint** cue_entries_; 21393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 21493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // If true the muxer will write out the block number for the cue if the 21593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // block number is different than the default of 1. Default is set to true. 21693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool output_block_number_; 21793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 21893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Cues); 21993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 22093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 22193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 22293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// ContentEncAESSettings element 22393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass ContentEncAESSettings { 22493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 225810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org enum { kCTR = 1 }; 22693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 22793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ContentEncAESSettings(); 22893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~ContentEncAESSettings() {} 22993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 23093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the ContentEncAESSettings element. 23193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 Size() const; 23293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 23393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Writes out the ContentEncAESSettings element to |writer|. Returns true on 23493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // success. 23593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Write(IMkvWriter* writer) const; 23693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 23793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 cipher_mode() const { return cipher_mode_; } 23893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 23993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 24093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the payload of the ContentEncAESSettings 24193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // element. 24293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 PayloadSize() const; 24393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 24493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sub elements 24593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 cipher_mode_; 24693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 24793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncAESSettings); 24893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 24993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 25093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 25193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// ContentEncoding element 25293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Elements used to describe if the track data has been encrypted or 25393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// compressed with zlib or header stripping. 25493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Currently only whole frames can be encrypted with AES. This dictates that 25593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// ContentEncodingOrder will be 0, ContentEncodingScope will be 1, 25693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// ContentEncodingType will be 1, and ContentEncAlgo will be 5. 25793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass ContentEncoding { 25893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 25993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ContentEncoding(); 26093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~ContentEncoding(); 26193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 26293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sets the content encryption id. Copies |length| bytes from |id| to 26393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |enc_key_id_|. Returns true on success. 26493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool SetEncryptionID(const uint8* id, uint64 length); 26593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 26693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the ContentEncoding element. 26793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 Size() const; 26893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 26993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Writes out the ContentEncoding element to |writer|. Returns true on 27093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // success. 27193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Write(IMkvWriter* writer) const; 27293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 27393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 enc_algo() const { return enc_algo_; } 27493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 encoding_order() const { return encoding_order_; } 27593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 encoding_scope() const { return encoding_scope_; } 27693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 encoding_type() const { return encoding_type_; } 27793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ContentEncAESSettings* enc_aes_settings() { return &enc_aes_settings_; } 27893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 27993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 28093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the encoding elements. 28193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 EncodingSize(uint64 compresion_size, uint64 encryption_size) const; 28293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 28393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the encryption elements. 28493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 EncryptionSize() const; 28593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 28693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Track element names 28793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 enc_algo_; 28893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint8* enc_key_id_; 28993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 encoding_order_; 29093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 encoding_scope_; 29193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 encoding_type_; 29293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 29393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // ContentEncAESSettings element. 29493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ContentEncAESSettings enc_aes_settings_; 29593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 29693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Size of the ContentEncKeyID data in bytes. 29793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 enc_key_id_length_; 29893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 29993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncoding); 30093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 30193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 30293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 30393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Track element. 30493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Track { 30593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 30693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The |seed| parameter is used to synthesize a UID for the track. 30793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org explicit Track(unsigned int* seed); 30893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual ~Track(); 30993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 31093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a ContentEncoding element to the Track. Returns true on success. 31193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual bool AddContentEncoding(); 31293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 31393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the ContentEncoding by index. Returns NULL if there is no 31493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // ContentEncoding match. 31593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ContentEncoding* GetContentEncodingByIndex(uint32 index) const; 31693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 31793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the payload of the Track element. 31893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual uint64 PayloadSize() const; 31993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 32093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes of the Track element. 32193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual uint64 Size() const; 32293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 32393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Output the Track element to the writer. Returns true on success. 32493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual bool Write(IMkvWriter* writer) const; 32593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 32693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sets the CodecPrivate element of the Track element. Copies |length| 32793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // bytes from |codec_private| to |codec_private_|. Returns true on success. 32893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool SetCodecPrivate(const uint8* codec_private, uint64 length); 32993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 33093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_codec_id(const char* codec_id); 33193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const char* codec_id() const { return codec_id_; } 33293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const uint8* codec_private() const { return codec_private_; } 33393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_language(const char* language); 33493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const char* language() const { return language_; } 33593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_max_block_additional_id(uint64 max_block_additional_id) { 33693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org max_block_additional_id_ = max_block_additional_id; 33793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org } 33893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 max_block_additional_id() const { return max_block_additional_id_; } 33993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_name(const char* name); 34093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const char* name() const { return name_; } 34193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_number(uint64 number) { number_ = number; } 34293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 number() const { return number_; } 34393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_type(uint64 type) { type_ = type; } 34493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 type() const { return type_; } 34593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_uid(uint64 uid) { uid_ = uid; } 34693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 uid() const { return uid_; } 34793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_codec_delay(uint64 codec_delay) { codec_delay_ = codec_delay; } 34893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 codec_delay() const { return codec_delay_; } 34993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_seek_pre_roll(uint64 seek_pre_roll) { 35093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org seek_pre_roll_ = seek_pre_roll; 35193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org } 35293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 seek_pre_roll() const { return seek_pre_roll_; } 353810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org void set_default_duration(uint64 default_duration) { 354810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org default_duration_ = default_duration; 355810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org } 356810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 default_duration() const { return default_duration_; } 35793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 35893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 codec_private_length() const { return codec_private_length_; } 35993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint32 content_encoding_entries_size() const { 36093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org return content_encoding_entries_size_; 36193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org } 36293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 36393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 364810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org // Track element names. 36593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* codec_id_; 36693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint8* codec_private_; 36793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* language_; 36893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 max_block_additional_id_; 36993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* name_; 37093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 number_; 37193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 type_; 37293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 uid_; 37393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 codec_delay_; 37493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 seek_pre_roll_; 375810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 default_duration_; 37693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 37793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Size of the CodecPrivate data in bytes. 37893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 codec_private_length_; 37993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 38093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // ContentEncoding element list. 38193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ContentEncoding** content_encoding_entries_; 38293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 38393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of ContentEncoding elements added. 38493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint32 content_encoding_entries_size_; 38593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 38693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Track); 38793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 38893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 38993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 39093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Track that has video specific elements. 39193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass VideoTrack : public Track { 39293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 39393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Supported modes for stereo 3D. 39493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org enum StereoMode { 39593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org kMono = 0, 396810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org kSideBySideLeftIsFirst = 1, 397810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org kTopBottomRightIsFirst = 2, 398810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org kTopBottomLeftIsFirst = 3, 39993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org kSideBySideRightIsFirst = 11 40093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org }; 40193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 402810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org enum AlphaMode { kNoAlpha = 0, kAlpha = 1 }; 40393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 40493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The |seed| parameter is used to synthesize a UID for the track. 40593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org explicit VideoTrack(unsigned int* seed); 40693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual ~VideoTrack(); 40793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 40893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the payload of the Track element plus the 40993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // video specific elements. 41093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual uint64 PayloadSize() const; 41193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 41293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Output the VideoTrack element to the writer. Returns true on success. 41393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual bool Write(IMkvWriter* writer) const; 41493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 41593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sets the video's stereo mode. Returns true on success. 41693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool SetStereoMode(uint64 stereo_mode); 41793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 41893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sets the video's alpha mode. Returns true on success. 41993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool SetAlphaMode(uint64 alpha_mode); 42093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 42193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_display_height(uint64 height) { display_height_ = height; } 42293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 display_height() const { return display_height_; } 42393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_display_width(uint64 width) { display_width_ = width; } 42493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 display_width() const { return display_width_; } 42593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_frame_rate(double frame_rate) { frame_rate_ = frame_rate; } 42693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org double frame_rate() const { return frame_rate_; } 42793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_height(uint64 height) { height_ = height; } 42893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 height() const { return height_; } 42993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 stereo_mode() { return stereo_mode_; } 43093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 alpha_mode() { return alpha_mode_; } 43193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_width(uint64 width) { width_ = width; } 43293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 width() const { return width_; } 43393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 43493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 43593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes of the Video element. 43693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 VideoPayloadSize() const; 43793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 43893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Video track element names. 43993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 display_height_; 44093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 display_width_; 44193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org double frame_rate_; 44293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 height_; 44393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 stereo_mode_; 44493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 alpha_mode_; 44593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 width_; 44693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 44793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(VideoTrack); 44893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 44993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 45093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 45193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Track that has audio specific elements. 45293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass AudioTrack : public Track { 45393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 45493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The |seed| parameter is used to synthesize a UID for the track. 45593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org explicit AudioTrack(unsigned int* seed); 45693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual ~AudioTrack(); 45793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 45893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the payload of the Track element plus the 45993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // audio specific elements. 46093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual uint64 PayloadSize() const; 46193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 46293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Output the AudioTrack element to the writer. Returns true on success. 46393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org virtual bool Write(IMkvWriter* writer) const; 46493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 46593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_bit_depth(uint64 bit_depth) { bit_depth_ = bit_depth; } 46693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 bit_depth() const { return bit_depth_; } 46793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_channels(uint64 channels) { channels_ = channels; } 46893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 channels() const { return channels_; } 46993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_sample_rate(double sample_rate) { sample_rate_ = sample_rate; } 47093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org double sample_rate() const { return sample_rate_; } 47193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 47293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 47393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Audio track element names. 47493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 bit_depth_; 47593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 channels_; 47693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org double sample_rate_; 47793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 47893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(AudioTrack); 47993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 48093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 48193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 48293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Tracks element 48393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Tracks { 48493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 48593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Audio and video type defined by the Matroska specs. 486810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org enum { kVideo = 0x1, kAudio = 0x2 }; 48793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Opus, Vorbis, VP8, and VP9 codec ids defined by the Matroska specs. 48893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org static const char kOpusCodecId[]; 48993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org static const char kVorbisCodecId[]; 49093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org static const char kVp8CodecId[]; 49193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org static const char kVp9CodecId[]; 49293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 49393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Tracks(); 49493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~Tracks(); 49593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 49693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a Track element to the Tracks object. |track| will be owned and 49793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // deleted by the Tracks object. Returns true on success. |number| is the 49893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // number to use for the track. |number| must be >= 0. If |number| == 0 49993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // then the muxer will decide on the track number. 50093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool AddTrack(Track* track, int32 number); 50193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 50293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the track by index. Returns NULL if there is no track match. 50393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const Track* GetTrackByIndex(uint32 idx) const; 50493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 50593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Search the Tracks and return the track that matches |tn|. Returns NULL 50693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // if there is no track match. 50793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Track* GetTrackByNumber(uint64 track_number) const; 50893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 50993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns true if the track number is an audio track. 51093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool TrackIsAudio(uint64 track_number) const; 51193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 51293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns true if the track number is a video track. 51393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool TrackIsVideo(uint64 track_number) const; 51493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 51593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Output the Tracks element to the writer. Returns true on success. 51693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Write(IMkvWriter* writer) const; 51793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 51893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint32 track_entries_size() const { return track_entries_size_; } 51993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 52093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 52193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Track element list. 52293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Track** track_entries_; 52393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 52493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of Track elements added. 52593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint32 track_entries_size_; 52693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 52793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Tracks); 52893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 52993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 53093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 53193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Chapter element 53293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// 53393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Chapter { 53493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 53593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Set the identifier for this chapter. (This corresponds to the 53693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Cue Identifier line in WebVTT.) 53793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // TODO(matthewjheaney): the actual serialization of this item in 53893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // MKV is pending. 53993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool set_id(const char* id); 54093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 54193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Converts the nanosecond start and stop times of this chapter to 54293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // their corresponding timecode values, and stores them that way. 543810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org void set_time(const Segment& segment, uint64 start_time_ns, 54493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 end_time_ns); 54593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 54693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sets the uid for this chapter. Primarily used to enable 54793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // deterministic output from the muxer. 54893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_uid(const uint64 uid) { uid_ = uid; } 54993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 55093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Add a title string to this chapter, per the semantics described 55193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // here: 55293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // http://www.matroska.org/technical/specs/index.html 55393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // 55493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The title ("chapter string") is a UTF-8 string. 55593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // 55693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The language has ISO 639-2 representation, described here: 55793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // http://www.loc.gov/standards/iso639-2/englangn.html 55893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // http://www.loc.gov/standards/iso639-2/php/English_list.php 55993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // If you specify NULL as the language value, this implies 56093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // English ("eng"). 56193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // 56293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The country value corresponds to the codes listed here: 56393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // http://www.iana.org/domains/root/db/ 56493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // 56593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The function returns false if the string could not be allocated. 566810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool add_string(const char* title, const char* language, const char* country); 56793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 56893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 56993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org friend class Chapters; 57093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 57193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // For storage of chapter titles that differ by language. 57293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org class Display { 57393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 57493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Establish representation invariant for new Display object. 57593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void Init(); 57693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 57793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Reclaim resources, in anticipation of destruction. 57893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void Clear(); 57993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 58093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Copies the title to the |title_| member. Returns false on 58193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // error. 58293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool set_title(const char* title); 58393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 58493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Copies the language to the |language_| member. Returns false 58593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // on error. 58693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool set_language(const char* language); 58793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 58893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Copies the country to the |country_| member. Returns false on 58993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // error. 59093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool set_country(const char* country); 59193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 59293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // If |writer| is non-NULL, serialize the Display sub-element of 59393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // the Atom into the stream. Returns the Display element size on 59493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // success, 0 if error. 59593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 WriteDisplay(IMkvWriter* writer) const; 59693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 59793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 59893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* title_; 59993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* language_; 60093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* country_; 60193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org }; 60293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 60393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Chapter(); 60493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~Chapter(); 60593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 60693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Establish the representation invariant for a newly-created 60793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Chapter object. The |seed| parameter is used to create the UID 60893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // for this chapter atom. 60993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void Init(unsigned int* seed); 61093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 61193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Copies this Chapter object to a different one. This is used when 61293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // expanding a plain array of Chapter objects (see Chapters). 61393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void ShallowCopy(Chapter* dst) const; 61493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 61593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Reclaim resources used by this Chapter object, pending its 61693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // destruction. 61793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void Clear(); 61893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 61993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // If there is no storage remaining on the |displays_| array for a 62093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // new display object, creates a new, longer array and copies the 62193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // existing Display objects to the new array. Returns false if the 62293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // array cannot be expanded. 62393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool ExpandDisplaysArray(); 62493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 62593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // If |writer| is non-NULL, serialize the Atom sub-element into the 62693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // stream. Returns the total size of the element on success, 0 if 62793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // error. 62893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 WriteAtom(IMkvWriter* writer) const; 62993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 63093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The string identifier for this chapter (corresponds to WebVTT cue 63193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // identifier). 63293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* id_; 63393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 63493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Start timecode of the chapter. 63593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 start_timecode_; 63693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 63793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Stop timecode of the chapter. 63893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 end_timecode_; 63993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 64093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The binary identifier for this chapter. 64193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 uid_; 64293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 64393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The Atom element can contain multiple Display sub-elements, as 64493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // the same logical title can be rendered in different languages. 64593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Display* displays_; 64693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 64793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The physical length (total size) of the |displays_| array. 64893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int displays_size_; 64993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 65093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The logical length (number of active elements) on the |displays_| 65193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // array. 65293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int displays_count_; 65393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 65493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Chapter); 65593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 65693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 65793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 65893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Chapters element 65993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// 66093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Chapters { 66193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 66293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Chapters(); 66393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~Chapters(); 66493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 66593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Chapter* AddChapter(unsigned int* seed); 66693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 66793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the number of chapters that have been added. 66893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int Count() const; 66993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 67093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Output the Chapters element to the writer. Returns true on success. 67193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Write(IMkvWriter* writer) const; 67293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 67393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 67493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Expands the chapters_ array if there is not enough space to contain 67593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // another chapter object. Returns true on success. 67693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool ExpandChaptersArray(); 67793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 67893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // If |writer| is non-NULL, serialize the Edition sub-element of the 67993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Chapters element into the stream. Returns the Edition element 68093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // size on success, 0 if error. 68193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 WriteEdition(IMkvWriter* writer) const; 68293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 68393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Total length of the chapters_ array. 68493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int chapters_size_; 68593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 68693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of active chapters on the chapters_ array. 68793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int chapters_count_; 68893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 68993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Array for storage of chapter objects. 69093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Chapter* chapters_; 69193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 69293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Chapters); 69393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 69493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 69593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 69693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Cluster element 69793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// 69893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Notes: 69993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// |Init| must be called before any other method in this class. 70093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Cluster { 70193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 70293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Cluster(uint64 timecode, int64 cues_pos); 70393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~Cluster(); 70493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 70593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |timecode| is the absolute timecode of the cluster. |cues_pos| is the 70693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // position for the cluster within the segment that should be written in 70793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // the cues element. 70893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Init(IMkvWriter* ptr_writer); 70993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 71093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a frame to be output in the file. The frame is written out through 71193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |writer_| if successful. Returns true on success. 71293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Inputs: 71393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame: Pointer to the data 71493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // length: Length of the data 71593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // track_number: Track to add the data to. Value returned by Add track 71693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // functions. The range of allowed values is [1, 126]. 71793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // timecode: Absolute (not relative to cluster) timestamp of the 71893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame, expressed in timecode units. 71993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // is_key: Flag telling whether or not this frame is a key frame. 720810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool AddFrame(const uint8* frame, uint64 length, uint64 track_number, 72193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 timecode, // timecode units (absolute) 72293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool is_key); 72393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 72493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a frame to be output in the file. The frame is written out through 72593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |writer_| if successful. Returns true on success. 72693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Inputs: 72793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame: Pointer to the data 72893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // length: Length of the data 72993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // additional: Pointer to the additional data 73093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // additional_length: Length of the additional data 73193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // add_id: Value of BlockAddID element 73293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // track_number: Track to add the data to. Value returned by Add track 73393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // functions. The range of allowed values is [1, 126]. 73493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // abs_timecode: Absolute (not relative to cluster) timestamp of the 73593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame, expressed in timecode units. 73693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // is_key: Flag telling whether or not this frame is a key frame. 737810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool AddFrameWithAdditional(const uint8* frame, uint64 length, 738810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org const uint8* additional, uint64 additional_length, 739810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 add_id, uint64 track_number, 740810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 abs_timecode, bool is_key); 74193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 74293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a frame to be output in the file. The frame is written out through 74393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |writer_| if successful. Returns true on success. 74493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Inputs: 74593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame: Pointer to the data. 74693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // length: Length of the data. 74793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // discard_padding: DiscardPadding element value. 74893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // track_number: Track to add the data to. Value returned by Add track 74993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // functions. The range of allowed values is [1, 126]. 75093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // abs_timecode: Absolute (not relative to cluster) timestamp of the 75193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame, expressed in timecode units. 75293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // is_key: Flag telling whether or not this frame is a key frame. 753810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool AddFrameWithDiscardPadding(const uint8* frame, uint64 length, 754810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org int64 discard_padding, uint64 track_number, 755810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 abs_timecode, bool is_key); 75693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 75793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Writes a frame of metadata to the output medium; returns true on 75893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // success. 75993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Inputs: 76093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame: Pointer to the data 76193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // length: Length of the data 76293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // track_number: Track to add the data to. Value returned by Add track 76393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // functions. The range of allowed values is [1, 126]. 76493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // timecode: Absolute (not relative to cluster) timestamp of the 76593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // metadata frame, expressed in timecode units. 76693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // duration: Duration of metadata frame, in timecode units. 76793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // 76893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The metadata frame is written as a block group, with a duration 76993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // sub-element but no reference time sub-elements (indicating that 77093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // it is considered a keyframe, per Matroska semantics). 771810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool AddMetadata(const uint8* frame, uint64 length, uint64 track_number, 772810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 timecode, uint64 duration); 77393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 77493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Increments the size of the cluster's data in bytes. 77593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void AddPayloadSize(uint64 size); 77693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 77793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Closes the cluster so no more data can be written to it. Will update the 77893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // cluster's size if |writer_| is seekable. Returns true on success. 77993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Finalize(); 78093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 78193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the size in bytes for the entire Cluster element. 78293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 Size() const; 78393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 78493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 size_position() const { return size_position_; } 78593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int32 blocks_added() const { return blocks_added_; } 78693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 payload_size() const { return payload_size_; } 78793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 position_for_cues() const { return position_for_cues_; } 78893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 timecode() const { return timecode_; } 78993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 79093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 79193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Signature that matches either of WriteSimpleBlock or WriteMetadataBlock 79293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // in the muxer utilities package. 793810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org typedef uint64 (*WriteBlock)(IMkvWriter* writer, const uint8* data, 794810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 length, uint64 track_number, 795810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org int64 timecode, uint64 generic_arg); 79693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 79793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Signature that matches WriteBlockWithAdditional 79893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // in the muxer utilities package. 799810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org typedef uint64 (*WriteBlockAdditional)(IMkvWriter* writer, const uint8* data, 800810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 length, const uint8* additional, 80193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 add_id, 80293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 additional_length, 803810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 track_number, int64 timecode, 80493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 is_key); 80593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 80693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Signature that matches WriteBlockWithDiscardPadding 80793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // in the muxer utilities package. 80893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org typedef uint64 (*WriteBlockDiscardPadding)(IMkvWriter* writer, 809810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org const uint8* data, uint64 length, 81093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 discard_padding, 81193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 track_number, 812810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org int64 timecode, uint64 is_key); 81393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 81493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Utility method that confirms that blocks can still be added, and that the 81593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // cluster header has been written. Used by |DoWriteBlock*|. Returns true 81693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // when successful. 81793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org template <typename Type> 81893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool PreWriteBlock(Type* write_function); 81993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 82093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Utility method used by the |DoWriteBlock*| methods that handles the book 82193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // keeping required after each block is written. 82293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void PostWriteBlock(uint64 element_size); 82393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 82493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // To simplify things, we require that there be fewer than 127 82593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // tracks -- this allows us to serialize the track number value for 82693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // a stream using a single byte, per the Matroska encoding. 82793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool IsValidTrackNumber(uint64 track_number) const; 82893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 82993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Given |abs_timecode|, calculates timecode relative to most recent timecode. 83093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns -1 on failure, or a relative timecode. 83193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 GetRelativeTimecode(int64 abs_timecode) const; 83293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 83393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Used to implement AddFrame and AddMetadata. 834810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool DoWriteBlock(const uint8* frame, uint64 length, uint64 track_number, 835810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 absolute_timecode, uint64 generic_arg, 83693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org WriteBlock write_block); 83793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 83893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Used to implement AddFrameWithAdditional 839810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool DoWriteBlockWithAdditional(const uint8* frame, uint64 length, 84093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const uint8* additional, 841810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 additional_length, uint64 add_id, 842810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 track_number, uint64 absolute_timecode, 84393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 generic_arg, 84493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org WriteBlockAdditional write_block); 84593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 84693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Used to implement AddFrameWithDiscardPadding 847810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool DoWriteBlockWithDiscardPadding(const uint8* frame, uint64 length, 84893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 discard_padding, 84993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 track_number, 85093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 absolute_timecode, 85193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 generic_arg, 85293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org WriteBlockDiscardPadding write_block); 85393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 85493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Outputs the Cluster header to |writer_|. Returns true on success. 85593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool WriteClusterHeader(); 85693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 85793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of blocks added to the cluster. 85893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int32 blocks_added_; 85993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 86093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Flag telling if the cluster has been closed. 86193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool finalized_; 86293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 86393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Flag telling if the cluster's header has been written. 86493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool header_written_; 86593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 86693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The size of the cluster elements in bytes. 86793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 payload_size_; 86893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 86993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The file position used for cue points. 87093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const int64 position_for_cues_; 87193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 87293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The file position of the cluster's size element. 87393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 size_position_; 87493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 87593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The absolute timecode of the cluster. 87693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const uint64 timecode_; 87793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 87893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Pointer to the writer object. Not owned by this class. 87993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org IMkvWriter* writer_; 88093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 88193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Cluster); 88293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 88393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 88493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 88593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// SeekHead element 88693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass SeekHead { 88793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 88893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org SeekHead(); 88993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~SeekHead(); 89093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 89193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // TODO(fgalligan): Change this to reserve a certain size. Then check how 89293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // big the seek entry to be added is as not every seek entry will be the 89393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // maximum size it could be. 89493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a seek entry to be written out when the element is finalized. |id| 89593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // must be the coded mkv element id. |pos| is the file position of the 89693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // element. Returns true on success. 89793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool AddSeekEntry(uint32 id, uint64 pos); 89893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 89993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Writes out SeekHead and SeekEntry elements. Returns true on success. 90093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Finalize(IMkvWriter* writer) const; 90193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 90293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the id of the Seek Entry at the given index. Returns -1 if index is 90393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // out of range. 90493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint32 GetId(int index) const; 90593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 90693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the position of the Seek Entry at the given index. Returns -1 if 90793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // index is out of range. 90893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 GetPosition(int index) const; 90993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 91093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sets the Seek Entry id and position at given index. 91193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns true on success. 91293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool SetSeekEntry(int index, uint32 id, uint64 position); 91393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 91493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Reserves space by writing out a Void element which will be updated with 91593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // a SeekHead element later. Returns true on success. 91693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Write(IMkvWriter* writer); 91793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 91893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // We are going to put a cap on the number of Seek Entries. 91993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const static int32 kSeekEntryCount = 5; 92093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 92193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 92293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the maximum size in bytes of one seek entry. 92393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 MaxEntrySize() const; 92493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 92593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Seek entry id element list. 92693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint32 seek_entry_id_[kSeekEntryCount]; 92793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 92893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Seek entry pos element list. 92993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 seek_entry_pos_[kSeekEntryCount]; 93093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 93193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The file position of SeekHead element. 93293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 start_pos_; 93393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 93493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(SeekHead); 93593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 93693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 93793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 93893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Segment Information element 93993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass SegmentInfo { 94093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 94193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org SegmentInfo(); 94293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~SegmentInfo(); 94393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 94493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Will update the duration if |duration_| is > 0.0. Returns true on success. 94593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Finalize(IMkvWriter* writer) const; 94693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 94793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sets |muxing_app_| and |writing_app_|. 94893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Init(); 94993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 95093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Output the Segment Information element to the writer. Returns true on 95193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // success. 95293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Write(IMkvWriter* writer); 95393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 95493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_duration(double duration) { duration_ = duration; } 95593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org double duration() const { return duration_; } 95693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_muxing_app(const char* app); 95793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const char* muxing_app() const { return muxing_app_; } 95893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_timecode_scale(uint64 scale) { timecode_scale_ = scale; } 95993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 timecode_scale() const { return timecode_scale_; } 96093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_writing_app(const char* app); 96193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const char* writing_app() const { return writing_app_; } 962810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org void set_date_utc(int64 date_utc) { date_utc_ = date_utc; } 963810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org int64 date_utc() const { return date_utc_; } 96493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 96593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 96693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Segment Information element names. 96793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Initially set to -1 to signify that a duration has not been set and should 96893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // not be written out. 96993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org double duration_; 97093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Set to libwebm-%d.%d.%d.%d, major, minor, build, revision. 97193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* muxing_app_; 97293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 timecode_scale_; 97393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Initially set to libwebm-%d.%d.%d.%d, major, minor, build, revision. 97493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* writing_app_; 975810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org // LLONG_MIN when DateUTC is not set. 976810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org int64 date_utc_; 97793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 97893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The file position of the duration element. 97993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 duration_pos_; 98093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 98193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(SegmentInfo); 98293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 98393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 98493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/////////////////////////////////////////////////////////////// 98593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// This class represents the main segment in a WebM file. Currently only 98693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// supports one Segment element. 98793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// 98893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Notes: 98993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// |Init| must be called before any other method in this class. 99093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass Segment { 99193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org public: 992810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org enum Mode { kLive = 0x1, kFile = 0x2 }; 99393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 99493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org enum CuesPosition { 99593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org kAfterClusters = 0x0, // Position Cues after Clusters - Default 99693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org kBeforeClusters = 0x1 // Position Cues before Clusters 99793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org }; 99893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 99993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const static uint64 kDefaultMaxClusterDuration = 30000000000ULL; 100093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 100193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Segment(); 100293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org ~Segment(); 100393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 100493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Initializes |SegmentInfo| and returns result. Always returns false when 100593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |ptr_writer| is NULL. 100693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Init(IMkvWriter* ptr_writer); 100793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 100893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a generic track to the segment. Returns the newly-allocated 100993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // track object (which is owned by the segment) on success, NULL on 101093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // error. |number| is the number to use for the track. |number| 101193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // must be >= 0. If |number| == 0 then the muxer will decide on the 101293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // track number. 101393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Track* AddTrack(int32 number); 101493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 101593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a Vorbis audio track to the segment. Returns the number of the track 101693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // on success, 0 on error. |number| is the number to use for the audio track. 101793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |number| must be >= 0. If |number| == 0 then the muxer will decide on 101893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // the track number. 101993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 AddAudioTrack(int32 sample_rate, int32 channels, int32 number); 102093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 102193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds an empty chapter to the chapters of this segment. Returns 102293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // non-NULL on success. After adding the chapter, the caller should 102393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // populate its fields via the Chapter member functions. 102493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Chapter* AddChapter(); 102593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 102693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a cue point to the Cues element. |timestamp| is the time in 102793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // nanoseconds of the cue's time. |track| is the Track of the Cue. This 102893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // function must be called after AddFrame to calculate the correct 102993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // BlockNumber for the CuePoint. Returns true on success. 103093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool AddCuePoint(uint64 timestamp, uint64 track); 103193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 103293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a frame to be output in the file. Returns true on success. 103393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Inputs: 103493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame: Pointer to the data 103593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // length: Length of the data 103693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // track_number: Track to add the data to. Value returned by Add track 103793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // functions. 103893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // timestamp: Timestamp of the frame in nanoseconds from 0. 103993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // is_key: Flag telling whether or not this frame is a key frame. 1040810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool AddFrame(const uint8* frame, uint64 length, uint64 track_number, 1041810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 timestamp_ns, bool is_key); 104293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 104393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Writes a frame of metadata to the output medium; returns true on 104493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // success. 104593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Inputs: 104693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame: Pointer to the data 104793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // length: Length of the data 104893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // track_number: Track to add the data to. Value returned by Add track 104993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // functions. 105093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // timecode: Absolute timestamp of the metadata frame, expressed 105193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // in nanosecond units. 105293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // duration: Duration of metadata frame, in nanosecond units. 105393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // 105493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The metadata frame is written as a block group, with a duration 105593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // sub-element but no reference time sub-elements (indicating that 105693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // it is considered a keyframe, per Matroska semantics). 1057810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool AddMetadata(const uint8* frame, uint64 length, uint64 track_number, 1058810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 timestamp_ns, uint64 duration_ns); 105993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 106093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Writes a frame with additional data to the output medium; returns true on 106193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // success. 106293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Inputs: 106393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame: Pointer to the data. 106493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // length: Length of the data. 106593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // additional: Pointer to additional data. 106693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // additional_length: Length of additional data. 106793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // add_id: Additional ID which identifies the type of additional data. 106893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // track_number: Track to add the data to. Value returned by Add track 106993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // functions. 107093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // timestamp: Absolute timestamp of the frame, expressed in nanosecond 107193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // units. 107293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // is_key: Flag telling whether or not this frame is a key frame. 1073810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool AddFrameWithAdditional(const uint8* frame, uint64 length, 1074810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org const uint8* additional, uint64 additional_length, 1075810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 add_id, uint64 track_number, 1076810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 timestamp, bool is_key); 107793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 107893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Writes a frame with DiscardPadding to the output medium; returns true on 107993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // success. 108093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Inputs: 108193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame: Pointer to the data. 108293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // length: Length of the data. 108393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // discard_padding: DiscardPadding element value. 108493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // track_number: Track to add the data to. Value returned by Add track 108593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // functions. 108693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // timestamp: Absolute timestamp of the frame, expressed in nanosecond 108793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // units. 108893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // is_key: Flag telling whether or not this frame is a key frame. 1089810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org bool AddFrameWithDiscardPadding(const uint8* frame, uint64 length, 1090810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org int64 discard_padding, uint64 track_number, 1091810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org uint64 timestamp, bool is_key); 109293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 109393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Writes a Frame to the output medium. Chooses the correct way of writing 109493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // the frame (Block vs SimpleBlock) based on the parameters passed. 109593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Inputs: 109693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame: frame object 109793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool AddGenericFrame(const Frame* frame); 109893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 109993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds a VP8 video track to the segment. Returns the number of the track on 110093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // success, 0 on error. |number| is the number to use for the video track. 110193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |number| must be >= 0. If |number| == 0 then the muxer will decide on 110293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // the track number. 110393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 AddVideoTrack(int32 width, int32 height, int32 number); 110493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 110593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // This function must be called after Finalize() if you need a copy of the 110693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // output with Cues written before the Clusters. It will return false if the 110793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // writer is not seekable of if chunking is set to true. 110893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Input parameters: 110993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // reader - an IMkvReader object created with the same underlying file of the 111093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // current writer object. Make sure to close the existing writer 111193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // object before creating this so that all the data is properly 111293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // flushed and available for reading. 111393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // writer - an IMkvWriter object pointing to a *different* file than the one 111493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // pointed by the current writer object. This file will contain the 111593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Cues element before the Clusters. 111693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool CopyAndMoveCuesBeforeClusters(mkvparser::IMkvReader* reader, 111793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org IMkvWriter* writer); 111893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 111993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sets which track to use for the Cues element. Must have added the track 112093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // before calling this function. Returns true on success. |track_number| is 112193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // returned by the Add track functions. 112293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool CuesTrack(uint64 track_number); 112393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 112493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // This will force the muxer to create a new Cluster when the next frame is 112593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // added. 112693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void ForceNewClusterOnNextFrame(); 112793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 112893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Writes out any frames that have not been written out. Finalizes the last 112993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // cluster. May update the size and duration of the segment. May output the 113093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Cues element. May finalize the SeekHead element. Returns true on success. 113193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool Finalize(); 113293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 113393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the Cues object. 113493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Cues* GetCues() { return &cues_; } 113593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 113693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the Segment Information object. 113793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const SegmentInfo* GetSegmentInfo() const { return &segment_info_; } 113893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org SegmentInfo* GetSegmentInfo() { return &segment_info_; } 113993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 114093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Search the Tracks and return the track that matches |track_number|. 114193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns NULL if there is no track match. 114293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Track* GetTrackByNumber(uint64 track_number) const; 114393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 114493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Toggles whether to output a cues element. 114593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void OutputCues(bool output_cues); 114693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 114793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sets if the muxer will output files in chunks or not. |chunking| is a 114893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // flag telling whether or not to turn on chunking. |filename| is the base 114993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // filename for the chunk files. The header chunk file will be named 115093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |filename|.hdr and the data chunks will be named 115193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // |filename|_XXXXXX.chk. Chunking implies that the muxer will be writing 115293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // to files so the muxer will use the default MkvWriter class to control 115393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // what data is written to what files. Returns true on success. 115493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // TODO: Should we change the IMkvWriter Interface to add Open and Close? 115593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // That will force the interface to be dependent on files. 115693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool SetChunking(bool chunking, const char* filename); 115793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 115893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool chunking() const { return chunking_; } 115993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 cues_track() const { return cues_track_; } 116093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_max_cluster_duration(uint64 max_cluster_duration) { 116193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org max_cluster_duration_ = max_cluster_duration; 116293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org } 116393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 max_cluster_duration() const { return max_cluster_duration_; } 116493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_max_cluster_size(uint64 max_cluster_size) { 116593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org max_cluster_size_ = max_cluster_size; 116693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org } 116793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 max_cluster_size() const { return max_cluster_size_; } 116893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void set_mode(Mode mode) { mode_ = mode; } 116993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Mode mode() const { return mode_; } 117093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org CuesPosition cues_position() const { return cues_position_; } 117193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool output_cues() const { return output_cues_; } 117293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org const SegmentInfo* segment_info() const { return &segment_info_; } 117393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 117493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org private: 117593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Checks if header information has been output and initialized. If not it 117693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // will output the Segment element and initialize the SeekHead elment and 117793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Cues elements. 117893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool CheckHeaderInfo(); 117993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 118093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Sets |name| according to how many chunks have been written. |ext| is the 118193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // file extension. |name| must be deleted by the calling app. Returns true 118293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // on success. 118393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool UpdateChunkName(const char* ext, char** name) const; 118493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 118593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Returns the maximum offset within the segment's payload. When chunking 118693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // this function is needed to determine offsets of elements within the 118793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // chunked files. Returns -1 on error. 118893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 MaxOffset(); 118993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 119093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adds the frame to our frame array. 119193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool QueueFrame(Frame* frame); 119293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 119393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Output all frames that are queued. Returns -1 on error, otherwise 119493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // it returns the number of frames written. 119593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int WriteFramesAll(); 119693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 119793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Output all frames that are queued that have an end time that is less 119893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // then |timestamp|. Returns true on success and if there are no frames 119993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // queued. 120093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool WriteFramesLessThan(uint64 timestamp); 120193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 120293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Outputs the segment header, Segment Information element, SeekHead element, 120393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // and Tracks element to |writer_|. 120493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool WriteSegmentHeader(); 120593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 120693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Given a frame with the specified timestamp (nanosecond units) and 120793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // keyframe status, determine whether a new cluster should be 120893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // created, before writing enqueued frames and the frame itself. The 120993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // function returns one of the following values: 121093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // -1 = error: an out-of-order frame was detected 121193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // 0 = do not create a new cluster, and write frame to the existing cluster 121293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // 1 = create a new cluster, and write frame to that new cluster 121393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // 2 = create a new cluster, and re-run test 121493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int TestFrame(uint64 track_num, uint64 timestamp_ns, bool key) const; 121593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 121693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Create a new cluster, using the earlier of the first enqueued 121793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // frame, or the indicated time. Returns true on success. 121893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool MakeNewCluster(uint64 timestamp_ns); 121993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 122093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Checks whether a new cluster needs to be created, and if so 122193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // creates a new cluster. Returns false if creation of a new cluster 122293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // was necessary but creation was not successful. 122393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool DoNewClusterProcessing(uint64 track_num, uint64 timestamp_ns, bool key); 122493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 122593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Adjusts Cue Point values (to place Cues before Clusters) so that they 122693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // reflect the correct offsets. 122793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void MoveCuesBeforeClusters(); 122893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 122993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // This function recursively computes the correct cluster offsets (this is 123093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // done to move the Cues before Clusters). It recursively updates the change 123193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // in size (which indicates a change in cluster offset) until no sizes change. 123293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Parameters: 123393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // diff - indicates the difference in size of the Cues element that needs to 123493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // accounted for. 123593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // index - index in the list of Cues which is currently being adjusted. 123693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // cue_size - size of the Cues element. 123793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org void MoveCuesBeforeClustersHelper(uint64 diff, int index, uint64* cue_size); 123893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 123993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Seeds the random number generator used to make UIDs. 124093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org unsigned int seed_; 124193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 124293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // WebM elements 124393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Cues cues_; 124493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org SeekHead seek_head_; 124593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org SegmentInfo segment_info_; 124693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Tracks tracks_; 124793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Chapters chapters_; 124893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 124993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of chunks written. 125093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int chunk_count_; 125193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 125293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Current chunk filename. 125393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* chunk_name_; 125493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 125593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Default MkvWriter object created by this class used for writing clusters 125693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // out in separate files. 125793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org MkvWriter* chunk_writer_cluster_; 125893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 125993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Default MkvWriter object created by this class used for writing Cues 126093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // element out to a file. 126193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org MkvWriter* chunk_writer_cues_; 126293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 126393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Default MkvWriter object created by this class used for writing the 126493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Matroska header out to a file. 126593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org MkvWriter* chunk_writer_header_; 126693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 126793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Flag telling whether or not the muxer is chunking output to multiple 126893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // files. 126993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool chunking_; 127093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 127193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Base filename for the chunked files. 127293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org char* chunking_base_name_; 127393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 127493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // File position offset where the Clusters end. 127593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 cluster_end_offset_; 127693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 127793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // List of clusters. 127893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Cluster** cluster_list_; 127993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 128093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of cluster pointers allocated in the cluster list. 128193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int32 cluster_list_capacity_; 128293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 128393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of clusters in the cluster list. 128493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int32 cluster_list_size_; 128593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 128693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Indicates whether Cues should be written before or after Clusters 128793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org CuesPosition cues_position_; 128893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 128993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Track number that is associated with the cues element for this segment. 129093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 cues_track_; 129193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 129293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Tells the muxer to force a new cluster on the next Block. 129393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool force_new_cluster_; 129493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 129593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // List of stored audio frames. These variables are used to store frames so 129693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // the muxer can follow the guideline "Audio blocks that contain the video 129793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // key frame's timecode should be in the same cluster as the video key frame 129893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // block." 129993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Frame** frames_; 130093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 130193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of frame pointers allocated in the frame list. 130293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int32 frames_capacity_; 130393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 130493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Number of frames in the frame list. 130593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int32 frames_size_; 130693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 130793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Flag telling if a video track has been added to the segment. 130893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool has_video_; 130993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 131093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Flag telling if the segment's header has been written. 131193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool header_written_; 131293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 131393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Duration of the last block in nanoseconds. 131493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 last_block_duration_; 131593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 131693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Last timestamp in nanoseconds added to a cluster. 131793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 last_timestamp_; 131893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 131993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Maximum time in nanoseconds for a cluster duration. This variable is a 132093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // guideline and some clusters may have a longer duration. Default is 30 132193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // seconds. 132293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 max_cluster_duration_; 132393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 132493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Maximum size in bytes for a cluster. This variable is a guideline and 132593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // some clusters may have a larger size. Default is 0 which signifies that 132693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // the muxer will decide the size. 132793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org uint64 max_cluster_size_; 132893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 132993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The mode that segment is in. If set to |kLive| the writer must not 133093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // seek backwards. 133193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org Mode mode_; 133293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 133393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Flag telling the muxer that a new cue point should be added. 133493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool new_cuepoint_; 133593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 133693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // TODO(fgalligan): Should we add support for more than one Cues element? 133793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Flag whether or not the muxer should output a Cues element. 133893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org bool output_cues_; 133993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 134093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The file position of the segment's payload. 134193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 payload_pos_; 134293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 134393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // The file position of the element's size. 134493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org int64 size_position_; 134593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 134693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org // Pointer to the writer objects. Not owned by this class. 134793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org IMkvWriter* writer_cluster_; 134893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org IMkvWriter* writer_cues_; 134993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org IMkvWriter* writer_header_; 135093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 135193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Segment); 135293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}; 135393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 1354810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org} // end namespace mkvmuxer 135593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 1356810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org#endif // MKVMUXER_HPP 1357