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