Home | History | Annotate | Download | only in libwebm
      1 // Copyright (c) 2012 The WebM project authors. All Rights Reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style license
      4 // that can be found in the LICENSE file in the root of the source
      5 // tree. An additional intellectual property rights grant can be found
      6 // in the file PATENTS.  All contributing project authors may
      7 // be found in the AUTHORS file in the root of the source tree.
      8 
      9 #ifndef MKVMUXERUTIL_HPP
     10 #define MKVMUXERUTIL_HPP
     11 
     12 #include "mkvmuxertypes.hpp"
     13 
     14 namespace mkvmuxer {
     15 
     16 class IMkvWriter;
     17 
     18 const uint64 kEbmlUnknownValue = 0x01FFFFFFFFFFFFFFULL;
     19 const int64 kMaxBlockTimecode = 0x07FFFLL;
     20 
     21 // Writes out |value| in Big Endian order. Returns 0 on success.
     22 int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size);
     23 
     24 // Returns the size in bytes of the element.
     25 int32 GetUIntSize(uint64 value);
     26 int32 GetCodedUIntSize(uint64 value);
     27 uint64 EbmlMasterElementSize(uint64 type, uint64 value);
     28 uint64 EbmlElementSize(uint64 type, int64 value);
     29 uint64 EbmlElementSize(uint64 type, uint64 value);
     30 uint64 EbmlElementSize(uint64 type, float value);
     31 uint64 EbmlElementSize(uint64 type, const char* value);
     32 uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size);
     33 
     34 // Creates an EBML coded number from |value| and writes it out. The size of
     35 // the coded number is determined by the value of |value|. |value| must not
     36 // be in a coded form. Returns 0 on success.
     37 int32 WriteUInt(IMkvWriter* writer, uint64 value);
     38 
     39 // Creates an EBML coded number from |value| and writes it out. The size of
     40 // the coded number is determined by the value of |size|. |value| must not
     41 // be in a coded form. Returns 0 on success.
     42 int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size);
     43 
     44 // Output an Mkv master element. Returns true if the element was written.
     45 bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 value, uint64 size);
     46 
     47 // Outputs an Mkv ID, calls |IMkvWriter::ElementStartNotify|, and passes the
     48 // ID to |SerializeInt|. Returns 0 on success.
     49 int32 WriteID(IMkvWriter* writer, uint64 type);
     50 
     51 // Output an Mkv non-master element. Returns true if the element was written.
     52 bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value);
     53 bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value);
     54 bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value);
     55 bool WriteEbmlElement(IMkvWriter* writer,
     56                       uint64 type,
     57                       const uint8* value,
     58                       uint64 size);
     59 
     60 // Output an Mkv Simple Block.
     61 // Inputs:
     62 //   data:         Pointer to the data.
     63 //   length:       Length of the data.
     64 //   track_number: Track to add the data to. Value returned by Add track
     65 //                  functions.  Only values in the range [1, 126] are
     66 //                  permitted.
     67 //   timecode:     Relative timecode of the Block.  Only values in the
     68 //                  range [0, 2^15) are permitted.
     69 //   is_key:       Non-zero value specifies that frame is a key frame.
     70 uint64 WriteSimpleBlock(IMkvWriter* writer,
     71                         const uint8* data,
     72                         uint64 length,
     73                         uint64 track_number,
     74                         int64 timecode,
     75                         uint64 is_key);
     76 
     77 // Output a metadata keyframe, using a Block Group element.
     78 // Inputs:
     79 //   data:         Pointer to the (meta)data.
     80 //   length:       Length of the (meta)data.
     81 //   track_number: Track to add the data to. Value returned by Add track
     82 //                  functions.  Only values in the range [1, 126] are
     83 //                  permitted.
     84 //   timecode      Timecode of frame, relative to cluster timecode.  Only
     85 //                  values in the range [0, 2^15) are permitted.
     86 //   duration_timecode  Duration of frame, using timecode units.
     87 uint64 WriteMetadataBlock(IMkvWriter* writer,
     88                           const uint8* data,
     89                           uint64 length,
     90                           uint64 track_number,
     91                           int64 timecode,
     92                           uint64 duration_timecode);
     93 
     94 // Output an Mkv Block with BlockAdditional data.
     95 // Inputs:
     96 //   data:         Pointer to the data.
     97 //   length:       Length of the data.
     98 //   additional:   Pointer to the additional data
     99 //   additional_length: Length of the additional data.
    100 //   add_id: Value of BlockAddID element.
    101 //   track_number: Track to add the data to. Value returned by Add track
    102 //                  functions.  Only values in the range [1, 126] are
    103 //                  permitted.
    104 //   timecode:     Relative timecode of the Block.  Only values in the
    105 //                  range [0, 2^15) are permitted.
    106 //   is_key:       Non-zero value specifies that frame is a key frame.
    107 uint64 WriteBlockWithAdditional(IMkvWriter* writer,
    108                                 const uint8* data,
    109                                 uint64 length,
    110                                 const uint8* additional,
    111                                 uint64 additional_length,
    112                                 uint64 add_id,
    113                                 uint64 track_number,
    114                                 int64 timecode,
    115                                 uint64 is_key);
    116 
    117 // Output an Mkv Block with a DiscardPadding element.
    118 // Inputs:
    119 //   data:            Pointer to the data.
    120 //   length:          Length of the data.
    121 //   discard_padding: DiscardPadding value.
    122 //   track_number:    Track to add the data to. Value returned by Add track
    123 //                    functions. Only values in the range [1, 126] are
    124 //                    permitted.
    125 //   timecode:        Relative timecode of the Block.  Only values in the
    126 //                    range [0, 2^15) are permitted.
    127 //   is_key:          Non-zero value specifies that frame is a key frame.
    128 uint64 WriteBlockWithDiscardPadding(IMkvWriter* writer,
    129                                     const uint8* data,
    130                                     uint64 length,
    131                                     int64 discard_padding,
    132                                     uint64 track_number,
    133                                     int64 timecode,
    134                                     uint64 is_key);
    135 
    136 // Output a void element. |size| must be the entire size in bytes that will be
    137 // void. The function will calculate the size of the void header and subtract
    138 // it from |size|.
    139 uint64 WriteVoidElement(IMkvWriter* writer, uint64 size);
    140 
    141 // Returns the version number of the muxer in |major|, |minor|, |build|,
    142 // and |revision|.
    143 void GetVersion(int32* major, int32* minor, int32* build, int32* revision);
    144 
    145 // Returns a random number to be used for UID, using |seed| to seed
    146 // the random-number generator (see POSIX rand_r() for semantics).
    147 uint64 MakeUID(unsigned int* seed);
    148 
    149 }  //end namespace mkvmuxer
    150 
    151 #endif // MKVMUXERUTIL_HPP
    152