FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Functions | Variables
matroskaenc.c File Reference
#include <stdint.h>
#include "avc.h"
#include "hevc.h"
#include "avformat.h"
#include "avio_internal.h"
#include "avlanguage.h"
#include "flacenc.h"
#include "internal.h"
#include "isom.h"
#include "matroska.h"
#include "riff.h"
#include "subtitles.h"
#include "vorbiscomment.h"
#include "wv.h"
#include "libavutil/avstring.h"
#include "libavutil/channel_layout.h"
#include "libavutil/crc.h"
#include "libavutil/dict.h"
#include "libavutil/intfloat.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/lfg.h"
#include "libavutil/mastering_display_metadata.h"
#include "libavutil/mathematics.h"
#include "libavutil/opt.h"
#include "libavutil/parseutils.h"
#include "libavutil/random_seed.h"
#include "libavutil/rational.h"
#include "libavutil/samplefmt.h"
#include "libavutil/sha.h"
#include "libavutil/stereo3d.h"
#include "libavcodec/xiph.h"
#include "libavcodec/mpeg4audio.h"
#include "libavcodec/internal.h"

Go to the source code of this file.

Data Structures

struct  ebml_master
 
struct  mkv_seekhead_entry
 
struct  mkv_seekhead
 
struct  mkv_cuepoint
 
struct  mkv_cues
 
struct  mkv_track
 
struct  mkv_attachment
 
struct  mkv_attachments
 
struct  MatroskaMuxContext
 

Macros

#define MODE_MATROSKAv2   0x01
 
#define MODE_WEBM   0x02
 
#define MAX_TRACKS   126
 Maximum number of tracks allowed in a Matroska file (with track numbers in range 1 to 126 (inclusive) More...
 
#define MAX_SEEKENTRY_SIZE   21
 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit offset, 4 bytes for target EBML ID More...
 
#define MAX_CUETRACKPOS_SIZE   42
 per-cuepoint-track - 5 1-byte EBML IDs, 5 1-byte EBML sizes, 4 8-byte uint max More...
 
#define MAX_CUEPOINT_SIZE(num_tracks)   12 + MAX_CUETRACKPOS_SIZE * num_tracks
 per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max More...
 
#define OPUS_SEEK_PREROLL   80000000
 Seek preroll value for opus. More...
 
#define OFFSET(x)   offsetof(MatroskaMuxContext, x)
 
#define FLAGS   AV_OPT_FLAG_ENCODING_PARAM
 

Functions

static int ebml_id_size (unsigned int id)
 
static void put_ebml_id (AVIOContext *pb, unsigned int id)
 
static void put_ebml_size_unknown (AVIOContext *pb, int bytes)
 Write an EBML size meaning "unknown size". More...
 
static int ebml_num_size (uint64_t num)
 Calculate how many bytes are needed to represent a given number in EBML. More...
 
static void put_ebml_num (AVIOContext *pb, uint64_t num, int bytes)
 Write a number in EBML variable length format. More...
 
static void put_ebml_uint (AVIOContext *pb, unsigned int elementid, uint64_t val)
 
static void put_ebml_sint (AVIOContext *pb, unsigned int elementid, int64_t val)
 
static void put_ebml_float (AVIOContext *pb, unsigned int elementid, double val)
 
static void put_ebml_binary (AVIOContext *pb, unsigned int elementid, const void *buf, int size)
 
static void put_ebml_string (AVIOContext *pb, unsigned int elementid, const char *str)
 
static void put_ebml_void (AVIOContext *pb, uint64_t size)
 Write a void element of a given size. More...
 
static ebml_master start_ebml_master (AVIOContext *pb, unsigned int elementid, uint64_t expectedsize)
 
static void end_ebml_master (AVIOContext *pb, ebml_master master)
 
static int start_ebml_master_crc32 (AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv, ebml_master *master, unsigned int elementid, uint64_t expectedsize)
 
static void end_ebml_master_crc32 (AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv, ebml_master master)
 
static void put_xiph_size (AVIOContext *pb, int size)
 
static void mkv_free (MatroskaMuxContext *mkv)
 Free the members allocated in the mux context. More...
 
static mkv_seekheadmkv_start_seekhead (AVIOContext *pb, int64_t segment_offset, int numelements)
 Initialize a mkv_seekhead element to be ready to index level 1 Matroska elements. More...
 
static int mkv_add_seekhead_entry (mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos)
 
static int64_t mkv_write_seekhead (AVIOContext *pb, MatroskaMuxContext *mkv)
 Write the seek head to the file and free it. More...
 
static mkv_cuesmkv_start_cues (int64_t segment_offset)
 
static int mkv_add_cuepoint (mkv_cues *cues, int stream, int tracknum, int64_t ts, int64_t cluster_pos, int64_t relative_pos, int64_t duration)
 
static int64_t mkv_write_cues (AVFormatContext *s, mkv_cues *cues, mkv_track *tracks, int num_tracks)
 
static int put_xiph_codecpriv (AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par)
 
static int put_wv_codecpriv (AVIOContext *pb, AVCodecParameters *par)
 
static int put_flac_codecpriv (AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par)
 
static int get_aac_sample_rates (AVFormatContext *s, AVCodecParameters *par, int *sample_rate, int *output_sample_rate)
 
static int mkv_write_native_codecprivate (AVFormatContext *s, AVCodecParameters *par, AVIOContext *dyn_cp)
 
static int mkv_write_codecprivate (AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int native_id, int qt_id)
 
static int mkv_write_video_color (AVIOContext *pb, AVCodecParameters *par, AVStream *st)
 
static void mkv_write_field_order (AVIOContext *pb, int mode, enum AVFieldOrder field_order)
 
static int mkv_write_stereo_mode (AVFormatContext *s, AVIOContext *pb, AVStream *st, int mode, int *h_width, int *h_height)
 
static int mkv_write_track (AVFormatContext *s, MatroskaMuxContext *mkv, int i, AVIOContext *pb, int default_stream_exists)
 
static int mkv_write_tracks (AVFormatContext *s)
 
static int mkv_write_chapters (AVFormatContext *s)
 
static int mkv_write_simpletag (AVIOContext *pb, AVDictionaryEntry *t)
 
static int mkv_write_tag_targets (AVFormatContext *s, unsigned int elementid, unsigned int uid, ebml_master *tags, ebml_master *tag)
 
static int mkv_check_tag_name (const char *name, unsigned int elementid)
 
static int mkv_write_tag (AVFormatContext *s, AVDictionary *m, unsigned int elementid, unsigned int uid, ebml_master *tags)
 
static int mkv_check_tag (AVDictionary *m, unsigned int elementid)
 
static int mkv_write_tags (AVFormatContext *s)
 
static int mkv_write_attachments (AVFormatContext *s)
 
static int64_t get_metadata_duration (AVFormatContext *s)
 
static int mkv_write_header (AVFormatContext *s)
 
static int mkv_blockgroup_size (int pkt_size)
 
static int mkv_strip_wavpack (const uint8_t *src, uint8_t **pdst, int *size)
 
static void mkv_write_block (AVFormatContext *s, AVIOContext *pb, unsigned int blockid, AVPacket *pkt, int keyframe)
 
static int mkv_write_vtt_blocks (AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
 
static void mkv_start_new_cluster (AVFormatContext *s, AVPacket *pkt)
 
static int mkv_write_packet_internal (AVFormatContext *s, AVPacket *pkt, int add_cue)
 
static int mkv_write_packet (AVFormatContext *s, AVPacket *pkt)
 
static int mkv_write_flush_packet (AVFormatContext *s, AVPacket *pkt)
 
static int mkv_write_trailer (AVFormatContext *s)
 
static int mkv_query_codec (enum AVCodecID codec_id, int std_compliance)
 
static int mkv_init (struct AVFormatContext *s)
 
static int mkv_check_bitstream (struct AVFormatContext *s, const AVPacket *pkt)
 

Variables

static const AVCodecTag additional_audio_tags []
 
static const AVCodecTag additional_video_tags []
 
static const AVCodecTag additional_subtitle_tags []
 
static const AVOption options []
 

Macro Definition Documentation

#define MODE_MATROSKAv2   0x01

Definition at line 109 of file matroskaenc.c.

Referenced by mkv_write_header().

#define MODE_WEBM   0x02
#define MAX_TRACKS   126

Maximum number of tracks allowed in a Matroska file (with track numbers in range 1 to 126 (inclusive)

Definition at line 114 of file matroskaenc.c.

#define MAX_SEEKENTRY_SIZE   21

2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit offset, 4 bytes for target EBML ID

Definition at line 164 of file matroskaenc.c.

Referenced by mkv_start_seekhead(), and mkv_write_seekhead().

#define MAX_CUETRACKPOS_SIZE   42

per-cuepoint-track - 5 1-byte EBML IDs, 5 1-byte EBML sizes, 4 8-byte uint max

Definition at line 168 of file matroskaenc.c.

Referenced by mkv_write_cues().

#define MAX_CUEPOINT_SIZE (   num_tracks)    12 + MAX_CUETRACKPOS_SIZE * num_tracks

per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max

Definition at line 171 of file matroskaenc.c.

Referenced by mkv_write_cues().

#define OPUS_SEEK_PREROLL   80000000

Seek preroll value for opus.

Definition at line 174 of file matroskaenc.c.

#define OFFSET (   x)    offsetof(MatroskaMuxContext, x)

Definition at line 2441 of file matroskaenc.c.

#define FLAGS   AV_OPT_FLAG_ENCODING_PARAM

Definition at line 2442 of file matroskaenc.c.

Function Documentation

static int ebml_id_size ( unsigned int  id)
static

Definition at line 176 of file matroskaenc.c.

Referenced by mkv_write_seekhead(), and put_ebml_id().

static void put_ebml_id ( AVIOContext pb,
unsigned int  id 
)
static
static void put_ebml_size_unknown ( AVIOContext pb,
int  bytes 
)
static

Write an EBML size meaning "unknown size".

Parameters
bytesThe number of bytes the size should occupy (maximum: 8).

Definition at line 193 of file matroskaenc.c.

Referenced by start_ebml_master().

static int ebml_num_size ( uint64_t  num)
static

Calculate how many bytes are needed to represent a given number in EBML.

Definition at line 203 of file matroskaenc.c.

Referenced by mkv_blockgroup_size(), put_ebml_num(), and start_ebml_master().

static void put_ebml_num ( AVIOContext pb,
uint64_t  num,
int  bytes 
)
static

Write a number in EBML variable length format.

Parameters
bytesThe number of bytes that need to be used to write the number. If zero, any number of bytes can be used.

Definition at line 217 of file matroskaenc.c.

Referenced by end_ebml_master(), mkv_write_block(), mkv_write_seekhead(), mkv_write_vtt_blocks(), put_ebml_binary(), put_ebml_float(), put_ebml_sint(), put_ebml_uint(), and put_ebml_void().

static void put_ebml_uint ( AVIOContext pb,
unsigned int  elementid,
uint64_t  val 
)
static
static void put_ebml_sint ( AVIOContext pb,
unsigned int  elementid,
int64_t  val 
)
static

Definition at line 249 of file matroskaenc.c.

Referenced by mkv_write_block().

static void put_ebml_float ( AVIOContext pb,
unsigned int  elementid,
double  val 
)
static

Definition at line 262 of file matroskaenc.c.

Referenced by mkv_write_header(), mkv_write_trailer(), and mkv_write_video_color().

static void put_ebml_binary ( AVIOContext pb,
unsigned int  elementid,
const void buf,
int  size 
)
static
static void put_ebml_string ( AVIOContext pb,
unsigned int  elementid,
const char *  str 
)
static
static void put_ebml_void ( AVIOContext pb,
uint64_t  size 
)
static

Write a void element of a given size.

Useful for reserving space in the file to be written to later.

Parameters
sizeThe number of bytes to reserve, which must be at least 2.

Definition at line 289 of file matroskaenc.c.

Referenced by mkv_start_seekhead(), mkv_write_header(), mkv_write_seekhead(), mkv_write_tags(), mkv_write_trailer(), and start_ebml_master_crc32().

static ebml_master start_ebml_master ( AVIOContext pb,
unsigned int  elementid,
uint64_t  expectedsize 
)
static
static void end_ebml_master ( AVIOContext pb,
ebml_master  master 
)
static
static int start_ebml_master_crc32 ( AVIOContext pb,
AVIOContext **  dyn_cp,
MatroskaMuxContext mkv,
ebml_master master,
unsigned int  elementid,
uint64_t  expectedsize 
)
static
static void end_ebml_master_crc32 ( AVIOContext pb,
AVIOContext **  dyn_cp,
MatroskaMuxContext mkv,
ebml_master  master 
)
static
static void put_xiph_size ( AVIOContext pb,
int  size 
)
static

Definition at line 367 of file matroskaenc.c.

Referenced by put_xiph_codecpriv().

static void mkv_free ( MatroskaMuxContext mkv)
static

Free the members allocated in the mux context.

Definition at line 376 of file matroskaenc.c.

Referenced by mkv_write_header(), and mkv_write_trailer().

static mkv_seekhead* mkv_start_seekhead ( AVIOContext pb,
int64_t  segment_offset,
int  numelements 
)
static

Initialize a mkv_seekhead element to be ready to index level 1 Matroska elements.

If a maximum number of elements is specified, enough space will be reserved at the current file location to write a seek head of that size.

Parameters
segment_offsetThe absolute offset to the position in the file where the segment begins.
numelementsThe maximum number of elements that will be indexed by this seek head, 0 if unlimited.

Definition at line 405 of file matroskaenc.c.

Referenced by mkv_write_header().

static int mkv_add_seekhead_entry ( mkv_seekhead seekhead,
unsigned int  elementid,
uint64_t  filepos 
)
static
static int64_t mkv_write_seekhead ( AVIOContext pb,
MatroskaMuxContext mkv 
)
static

Write the seek head to the file and free it.

If a maximum number of elements was specified to mkv_start_seekhead(), the seek head will be written at the location reserved for it. Otherwise, it is written at the current location in the file.

Returns
The file offset where the seekhead was written, -1 if an error occurred.

Definition at line 454 of file matroskaenc.c.

Referenced by mkv_write_header(), and mkv_write_trailer().

static mkv_cues* mkv_start_cues ( int64_t  segment_offset)
static

Definition at line 505 of file matroskaenc.c.

Referenced by mkv_write_header().

static int mkv_add_cuepoint ( mkv_cues cues,
int  stream,
int  tracknum,
int64_t  ts,
int64_t  cluster_pos,
int64_t  relative_pos,
int64_t  duration 
)
static

Definition at line 515 of file matroskaenc.c.

Referenced by mkv_write_packet_internal().

static int64_t mkv_write_cues ( AVFormatContext s,
mkv_cues cues,
mkv_track tracks,
int  num_tracks 
)
static

Definition at line 538 of file matroskaenc.c.

Referenced by mkv_write_trailer().

static int put_xiph_codecpriv ( AVFormatContext s,
AVIOContext pb,
AVCodecParameters par 
)
static

Definition at line 598 of file matroskaenc.c.

Referenced by mkv_write_native_codecprivate().

static int put_wv_codecpriv ( AVIOContext pb,
AVCodecParameters par 
)
static

Definition at line 626 of file matroskaenc.c.

Referenced by mkv_write_native_codecprivate().

static int put_flac_codecpriv ( AVFormatContext s,
AVIOContext pb,
AVCodecParameters par 
)
static

Definition at line 635 of file matroskaenc.c.

Referenced by mkv_write_native_codecprivate().

static int get_aac_sample_rates ( AVFormatContext s,
AVCodecParameters par,
int *  sample_rate,
int *  output_sample_rate 
)
static

Definition at line 682 of file matroskaenc.c.

Referenced by mkv_write_track().

static int mkv_write_native_codecprivate ( AVFormatContext s,
AVCodecParameters par,
AVIOContext dyn_cp 
)
static

Definition at line 699 of file matroskaenc.c.

Referenced by mkv_write_codecprivate().

static int mkv_write_codecprivate ( AVFormatContext s,
AVIOContext pb,
AVCodecParameters par,
int  native_id,
int  qt_id 
)
static

Definition at line 739 of file matroskaenc.c.

static int mkv_write_video_color ( AVIOContext pb,
AVCodecParameters par,
AVStream st 
)
static

Definition at line 806 of file matroskaenc.c.

static void mkv_write_field_order ( AVIOContext pb,
int  mode,
enum AVFieldOrder  field_order 
)
static

Definition at line 877 of file matroskaenc.c.

static int mkv_write_stereo_mode ( AVFormatContext s,
AVIOContext pb,
AVStream st,
int  mode,
int *  h_width,
int *  h_height 
)
static

Definition at line 916 of file matroskaenc.c.

static int mkv_write_track ( AVFormatContext s,
MatroskaMuxContext mkv,
int  i,
AVIOContext pb,
int  default_stream_exists 
)
static

Definition at line 1014 of file matroskaenc.c.

Referenced by mkv_write_tracks().

static int mkv_write_tracks ( AVFormatContext s)
static

Definition at line 1264 of file matroskaenc.c.

Referenced by mkv_write_header().

static int mkv_write_chapters ( AVFormatContext s)
static

Definition at line 1292 of file matroskaenc.c.

Referenced by mkv_write_header(), and mkv_write_trailer().

static int mkv_write_simpletag ( AVIOContext pb,
AVDictionaryEntry t 
)
static

Definition at line 1346 of file matroskaenc.c.

Referenced by mkv_write_tag().

static int mkv_write_tag_targets ( AVFormatContext s,
unsigned int  elementid,
unsigned int  uid,
ebml_master tags,
ebml_master tag 
)
static

Definition at line 1380 of file matroskaenc.c.

Referenced by mkv_write_tag(), and mkv_write_tags().

static int mkv_check_tag_name ( const char *  name,
unsigned int  elementid 
)
static

Definition at line 1405 of file matroskaenc.c.

Referenced by mkv_check_tag(), and mkv_write_tag().

static int mkv_write_tag ( AVFormatContext s,
AVDictionary m,
unsigned int  elementid,
unsigned int  uid,
ebml_master tags 
)
static

Definition at line 1419 of file matroskaenc.c.

Referenced by mkv_write_tags().

static int mkv_check_tag ( AVDictionary m,
unsigned int  elementid 
)
static

Definition at line 1443 of file matroskaenc.c.

Referenced by mkv_write_tags().

static int mkv_write_tags ( AVFormatContext s)
static

Definition at line 1454 of file matroskaenc.c.

Referenced by mkv_write_header().

static int mkv_write_attachments ( AVFormatContext s)
static

Definition at line 1537 of file matroskaenc.c.

Referenced by mkv_write_header().

static int64_t get_metadata_duration ( AVFormatContext s)
static

Definition at line 1635 of file matroskaenc.c.

Referenced by mkv_write_header().

static int mkv_write_header ( AVFormatContext s)
static

Definition at line 1659 of file matroskaenc.c.

static int mkv_blockgroup_size ( int  pkt_size)
static

Definition at line 1856 of file matroskaenc.c.

Referenced by mkv_write_packet_internal(), and mkv_write_vtt_blocks().

static int mkv_strip_wavpack ( const uint8_t src,
uint8_t **  pdst,
int *  size 
)
static

Definition at line 1867 of file matroskaenc.c.

Referenced by mkv_write_block().

static void mkv_write_block ( AVFormatContext s,
AVIOContext pb,
unsigned int  blockid,
AVPacket pkt,
int  keyframe 
)
static

Definition at line 1920 of file matroskaenc.c.

Referenced by mkv_write_packet_internal().

static int mkv_write_vtt_blocks ( AVFormatContext s,
AVIOContext pb,
AVPacket pkt 
)
static

Definition at line 2019 of file matroskaenc.c.

Referenced by mkv_write_packet_internal().

static void mkv_start_new_cluster ( AVFormatContext s,
AVPacket pkt 
)
static

Definition at line 2057 of file matroskaenc.c.

Referenced by mkv_write_packet(), and mkv_write_packet_internal().

static int mkv_write_packet_internal ( AVFormatContext s,
AVPacket pkt,
int  add_cue 
)
static

Definition at line 2075 of file matroskaenc.c.

Referenced by mkv_write_packet(), and mkv_write_trailer().

static int mkv_write_packet ( AVFormatContext s,
AVPacket pkt 
)
static

Definition at line 2157 of file matroskaenc.c.

Referenced by mkv_write_flush_packet().

static int mkv_write_flush_packet ( AVFormatContext s,
AVPacket pkt 
)
static

Definition at line 2228 of file matroskaenc.c.

static int mkv_write_trailer ( AVFormatContext s)
static

Definition at line 2249 of file matroskaenc.c.

static int mkv_query_codec ( enum AVCodecID  codec_id,
int  std_compliance 
)
static

Definition at line 2361 of file matroskaenc.c.

static int mkv_init ( struct AVFormatContext s)
static

Definition at line 2378 of file matroskaenc.c.

static int mkv_check_bitstream ( struct AVFormatContext s,
const AVPacket pkt 
)
static

Definition at line 2395 of file matroskaenc.c.

Variable Documentation

const AVCodecTag additional_audio_tags[]
static
Initial value:

Definition at line 2410 of file matroskaenc.c.

const AVCodecTag additional_video_tags[]
static
Initial value:
= {
{ AV_CODEC_ID_RV10, 0xFFFFFFFF },
{ AV_CODEC_ID_RV20, 0xFFFFFFFF },
{ AV_CODEC_ID_RV30, 0xFFFFFFFF },
{ AV_CODEC_ID_RV40, 0xFFFFFFFF },
{ AV_CODEC_ID_VP9, 0xFFFFFFFF },
{ AV_CODEC_ID_NONE, 0xFFFFFFFF }
}

Definition at line 2426 of file matroskaenc.c.

const AVCodecTag additional_subtitle_tags[]
static
Initial value:

Definition at line 2435 of file matroskaenc.c.

const AVOption options[]
static
Initial value:
= {
{ "reserve_index_space", "Reserve a given amount of space (in bytes) at the beginning of the file for the index (cues).", OFFSET(reserve_cues_space), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
{ "cluster_size_limit", "Store at most the provided amount of bytes in a cluster. ", OFFSET(cluster_size_limit), AV_OPT_TYPE_INT , { .i64 = -1 }, -1, INT_MAX, FLAGS },
{ "cluster_time_limit", "Store at most the provided number of milliseconds in a cluster.", OFFSET(cluster_time_limit), AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, FLAGS },
{ "dash", "Create a WebM file conforming to WebM DASH specification", OFFSET(is_dash), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
{ "dash_track_number", "Track number for the DASH stream", OFFSET(dash_track_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 127, FLAGS },
{ "live", "Write files assuming it is a live stream.", OFFSET(is_live), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
{ "allow_raw_vfw", "allow RAW VFW mode", OFFSET(allow_raw_vfw), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
{ "write_crc32", "write a CRC32 element inside every Level 1 element", OFFSET(write_crc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS },
{ NULL },
}
#define NULL
Definition: coverity.c:32
#define FLAGS
Definition: matroskaenc.c:2442
#define OFFSET(x)
Definition: matroskaenc.c:2441

Definition at line 2443 of file matroskaenc.c.