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