25#include "config_components.h"
77#define MAX_SEEKHEAD_ENTRIES 7
80#define MAX_EBML_LENGTH ((1ULL << 56) - 2)
83#define MAX_SUPPORTED_EBML_LENGTH FFMIN(MAX_EBML_LENGTH, INT_MAX)
85#define MODE_MATROSKAv2 0x01
88#define IS_WEBM(mkv) (CONFIG_WEBM_MUXER && CONFIG_MATROSKA_MUXER ? \
89 ((mkv)->mode == MODE_WEBM) : CONFIG_WEBM_MUXER)
90#define IS_SEEKABLE(pb, mkv) (((pb)->seekable & AVIO_SEEKABLE_NORMAL) && \
156#define EBML_WRITER(max_nb_elems) \
157 EbmlElement elements[max_nb_elems]; \
158 EbmlWriter writer = (EbmlWriter){ .elements = elements, \
159 .current_master_element = -1 }
271#define MAX_SEEKENTRY_SIZE 21
274#define MAX_CUETRACKPOS_SIZE 40
278#define DURATION_STRING_LENGTH 19
281#define DURATION_SIMPLETAG_SIZE (2 + 1 + (2 + 1 + 8) + (2 + 1 + DURATION_STRING_LENGTH))
284#define OPUS_SEEK_PREROLL 80000000
291 int code = buf[0] & 0x3;
292 int config = buf[0] >> 3;
308 frame_count = buf[1] & 0x3F;
323 avio_w8(pb, (uint8_t)(
id >> (
i * 8)));
368 num |= 1ULL << bytes * 7;
369 for (
int i = bytes - 1;
i >= 0;
i--)
370 avio_w8(pb, (uint8_t)(num >>
i * 8));
387 bytes = needed_bytes;
413 for (
i = bytes - 1;
i >= 0;
i--)
425 const void *buf,
int size)
463 uint64_t expectedsize)
546#if SIZE_MAX > UINT64_MAX
591#if SIZE_MAX > UINT64_MAX
592 len = FF_MIN(
len, UINT64_MAX);
626 int remaining_elems);
633 uint64_t total_size = 0;
635 master->priv.master.nb_elements = nb_elems;
636 for (; elem++, nb_elems > 0;) {
647 elem += ret, nb_elems -= ret;
649 master->size = total_size;
651 return master->priv.master.nb_elements;
666 "a packet from stream %d.\n",
pkt->stream_index);
694 const uint8_t *
data =
pkt->data;
705 switch (elem->
type) {
738 switch (elem->
type) {
750 for (
int i = elem->
size; --
i >= 0; )
757 : (
const uint8_t*)elem->
priv.
str;
768 for (
int i = 0;
i < nb_elems;
i++)
813 int length_size,
int keep_buffer,
816 uint8_t *buf, crc[4];
820 if ((ret = (*dyn_cp)->error) < 0)
922 int error_on_seek_failure,
int64_t destpos)
930 return error_on_seek_failure ? ret64 : 0;
956 if ((ret64 =
avio_seek(pb, destpos, SEEK_SET)) < 0)
978 while (idx > 0 && entries[idx - 1].
pts > ts)
980 memmove(&entries[idx + 1], &entries[idx],
983 entries[idx].
pts = ts;
1008 for (
int j = 0; j < num_tracks; j++)
1009 tracks[j].has_cue = 0;
1012 int idx =
entry->stream_idx;
1022 if (
entry->duration > 0)
1027 if (cuepoint->
error < 0)
1028 return cuepoint->
error;
1038 const uint8_t *extradata,
int extradata_size)
1040 const uint8_t *header_start[3];
1042 int first_header_size;
1046 first_header_size = 30;
1048 first_header_size = 42;
1051 first_header_size, header_start, header_len);
1058 for (j = 0; j < 2; j++) {
1061 for (j = 0; j < 3; j++)
1062 avio_write(pb, header_start[j], header_len[j]);
1067#if CONFIG_MATROSKA_MUXER
1068static int put_wv_codecpriv(
AVIOContext *pb,
const uint8_t *extradata,
int extradata_size)
1070 if (extradata && extradata_size == 2)
1079 const uint8_t *extradata,
int extradata_size)
1090 if (write_comment) {
1098 av_dict_set(&dict,
"WAVEFORMATEXTENSIBLE_CHANNEL_MASK", buf, 0);
1117 const uint8_t *extradata,
int extradata_size,
1118 int *sample_rate,
int *output_sample_rate)
1129 if (ret < 0 && (extradata_size || !
IS_SEEKABLE(
s->pb, mkv))) {
1131 "Error parsing AAC extradata, unable to determine samplerate.\n");
1141 *output_sample_rate = *sample_rate;
1152 const uint8_t *extradata,
1154 unsigned *size_to_reserve)
1167#if CONFIG_MATROSKA_MUXER
1169 return put_flac_codecpriv(
s, dyn_cp, par, extradata, extradata_size);
1171 return put_wv_codecpriv(dyn_cp, extradata, extradata_size);
1177 extradata_size, 0,
s);
1182 if (extradata_size < 36) {
1184 "Invalid extradata found, ALAC expects a 36-byte "
1189 extradata_size - 12);
1193 avio_write(dyn_cp, extradata, extradata_size);
1198 unsigned stream_identifier, data_component_id;
1201 stream_identifier = 0x30;
1202 data_component_id = 0x0008;
1205 stream_identifier = 0x87;
1206 data_component_id = 0x0012;
1210 "Unset/unknown ARIB caption profile %d utilized!\n",
1214 avio_w8(dyn_cp, stream_identifier);
1224 avio_write(dyn_cp, extradata, extradata_size);
1232 const uint8_t *extradata,
int extradata_size,
1233 int native_id,
int qt_id,
1234 uint8_t **codecpriv,
int *codecpriv_size,
1235 unsigned *max_payload_size)
1238 unsigned size_to_reserve = 0;
1243 extradata, extradata_size,
1247#if CONFIG_MATROSKA_MUXER
1256 avio_wb32(dyn_cp, 0x5a + extradata_size);
1260 avio_write(dyn_cp, extradata, extradata_size);
1298 if (dyn_cp->
error < 0)
1299 return dyn_cp->
error;
1300 *max_payload_size = *codecpriv_size + size_to_reserve;
1306 const uint8_t *codecpriv,
unsigned codecpriv_size)
1308 unsigned total_codecpriv_size = 0, total_size;
1310 av_assert1(codecpriv_size <= max_payload_size);
1312 if (!max_payload_size)
1317 if (codecpriv_size) {
1320 total_codecpriv_size = 2U + length_size + codecpriv_size;
1321 if (total_codecpriv_size + 1 == total_size) {
1324 total_codecpriv_size++;
1330 if (total_codecpriv_size < total_size)
1335 uint8_t *side_data,
int side_data_size,
1337 mkv_track *track,
unsigned alternative_size)
1341 unsigned max_payload_size;
1342 int ret, codecpriv_size;
1345 side_data, side_data_size, 1, 0,
1346 &codecpriv, &codecpriv_size, &max_payload_size);
1349 if (codecpriv_size > track->
codecpriv_size && !alternative_size) {
1353 av_assert1(alternative_size < track->codecpriv_size);
1354 codecpriv_size = alternative_size;
1358 codecpriv, codecpriv_size);
1364 memcpy(par->
extradata, side_data, side_data_size);
1371#define MAX_VIDEO_COLOR_ELEMS 20
1454#define MAX_VIDEO_PROJECTION_ELEMS 6
1456 double *yaw,
double *roll)
1501 "non-orthogonal transformation.\n");
1512 double *yaw,
double *pitch,
double *roll)
1563 *yaw = (
double) spherical->
yaw / (1 << 16);
1565 *roll = (
double) spherical->
roll / (1 << 16);
1574 double yaw = 0, pitch = 0, roll = 0;
1593#define MAX_FIELD_ORDER_ELEMS 2
1597 switch (field_order) {
1611 switch (field_order) {
1633#define MAX_STEREO_MODE_ELEMS 1
1637 int *h_width,
int *h_height)
1639 const char *error_message_addendum =
"";
1646#define FLAG(STEREOMODETYPE, BOOL) | (BOOL) << (STEREOMODETYPE)
1647#define WDIV1(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
1648 FLAG(STEREOMODETYPE, WDIV)
1649#define WDIV2(STEREOMODETYPE, WDIV, HDIV, WEBM) \
1650 FLAG(STEREOMODETYPE, WDIV)
1654#define HDIV1(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
1655 FLAG(STEREOMODETYPE, HDIV)
1656#define HDIV2(STEREOMODETYPE, WDIV, HDIV, WEBM) \
1657 FLAG(STEREOMODETYPE, HDIV)
1660#define WEBM1(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
1661 FLAG(STEREOMODETYPE, WEBM)
1662#define WEBM2(STEREOMODETYPE, WDIV, HDIV, WEBM) \
1663 FLAG(STEREOMODETYPE, WEBM)
1678 long stereo_mode = strtol(
tag->value,
NULL, 0);
1688#define STEREOMODE(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
1689 [(STEREO3DTYPE)][!!((FLAGS) & AV_STEREO3D_FLAG_INVERT)] = (STEREOMODETYPE) + 1,
1690#define NOTHING(STEREOMODETYPE, WDIV, HDIV, WEBM)
1691 static const unsigned char conversion_table[][2] = {
1715 if (is_webm && !(webm_bitfield >>
format)) {
1716 error_message_addendum =
" for WebM";
1720 *h_width = 1 << ((width_bitfield >>
format) & 1);
1721 *h_height = 1 << ((height_bitfield >>
format) & 1);
1729 "The specified stereo mode is not valid%s.\n",
1730 error_message_addendum);
1738#if CONFIG_MATROSKA_MUXER
1829 int display_width_div = 1, display_height_div = 1;
1830 uint8_t color_space[4], projection_private[20];
1834 int cropped_width = par->
width, cropped_height = par->
height;
1848 &display_height_div);
1858 if (sd && sd->
size ==
sizeof(uint32_t) * 4) {
1859 uint64_t top, bottom,
left, right;
1867 (top + bottom) >= par->
height) {
1881 cropped_width -=
left + right;
1882 cropped_height -= top + bottom;
1889 if (d_width > INT_MAX) {
1893 if (d_width != cropped_width || display_width_div != 1 || display_height_div != 1) {
1894 if (
IS_WEBM(mkv) || display_width_div != 1 || display_height_div != 1) {
1896 d_width / display_width_div);
1898 cropped_height / display_height_div);
1906 display_aspect_ratio.
num);
1908 display_aspect_ratio.
den);
1913 }
else if (display_width_div != 1 || display_height_div != 1) {
1915 cropped_width / display_width_div);
1917 cropped_height / display_height_div);
1925 color_space,
sizeof(color_space));
1953 int output_sample_rate = 0;
1969 tag &&
tag->value[0] ?
tag->value :
"und");
1994 codec_id =
"D_WEBVTT/DESCRIPTIONS";
2007 "Only VP8 or VP9 or AV1 video and Vorbis or Opus audio and WebVTT subtitles are supported for WebM.\n");
2043 av_log(
s,
AV_LOG_ERROR,
"Raw RGB is not supported Natively in Matroska, you can use AVI or NUT or\n"
2044 "If you would like to store it anyway using VFW mode, enable allow_raw_vfw (-allow_raw_vfw 1)\n");
2052 int audio_frame_samples;
2064 if (frame_rate.
num > 0)
2067 if (CONFIG_MATROSKA_MUXER && !native_id &&
2077 else if (!native_id) {
2095 if (codecdelay < 0) {
2108#if CONFIG_MATROSKA_MUXER
2111 &sample_rate, &output_sample_rate);
2120 if (!audio_frame_samples)
2122 if (audio_frame_samples)
2134 if (output_sample_rate)
2166 av_log(
s,
AV_LOG_ERROR,
"Only audio, video, and subtitles are supported for Matroska.\n");
2174 int codecpriv_size, max_payload_size;
2179 &codecpriv, &codecpriv_size, &max_payload_size);
2198 int video_default_idx = -1, audio_default_idx = -1, subtitle_default_idx = -1;
2209 int video_idx = -1, audio_idx = -1, subtitle_idx = -1;
2211 for (
i =
s->nb_streams - 1;
i >= 0;
i--) {
2215#define CASE(type, variable) \
2216 case AVMEDIA_TYPE_ ## type: \
2217 variable ## _idx = i; \
2218 if (st->disposition & AV_DISPOSITION_DEFAULT) \
2219 variable ## _default_idx = i; \
2223 CASE(SUBTITLE, subtitle)
2228 video_default_idx =
FFMAX(video_default_idx, video_idx);
2229 audio_default_idx =
FFMAX(audio_default_idx, audio_idx);
2231 subtitle_default_idx =
FFMAX(subtitle_default_idx, subtitle_idx);
2233 for (
i = 0;
i <
s->nb_streams;
i++) {
2236 i == video_default_idx ||
i == audio_default_idx ||
2237 i == subtitle_default_idx;
2253 const uint8_t *lang =
NULL;
2259 if ((p = strrchr(p,
'-')) &&
2267 else if (*p >=
'a' && *p <=
'z')
2284 uint32_t elementid, uint64_t
uid)
2309 uint32_t elementid, uint64_t
uid)
2314 int ret = 0,
size, tag_written = 0;
2328 else if (!tag_written)
2332 if (tmp_bc->
error) {
2333 ret = tmp_bc->
error;
2361 for (
i = 0;
i <
s->nb_streams;
i++) {
2378 for (
i = 0;
i <
s->nb_streams;
i++) {
2401 for (
unsigned i = 0;
i <
s->nb_chapters;
i++) {
2402 if (!
s->chapters[
i]->id)
2404 for (
unsigned j = 0; j <
i; j++)
2405 if (
s->chapters[j]->id ==
s->chapters[
i]->id)
2417 int ret, create_new_ids;
2437 for (
unsigned i = 0;
i <
s->nb_chapters;
i++) {
2442 uint64_t
uid = create_new_ids ?
i + 1ULL :
c->id;
2445 if (chapterstart < 0 || chapterstart > chapterend || chapterend < 0) {
2447 "Invalid chapter start (%"PRId64
") or end (%"PRId64
").\n",
2448 chapterstart, chapterend);
2505 return desc->mime_types[0];
2507 return "text/plain";
2526 for (
i = 0;
i <
s->nb_streams;
i++) {
2531 const char *mimetype;
2571 av_log(
s,
AV_LOG_DEBUG,
"get_metadata_duration found duration in context metadata: %" PRId64
"\n",
us);
2575 for (
unsigned i = 0;
i <
s->nb_streams;
i++) {
2588 const char *doctype,
int version)
2627 const char *ident =
"Lavf";
2634 int64_t date_utc = (creation_time - 978307200000000LL) * 1000;
2635 uint8_t date_utc_buf[8];
2636 AV_WB64(date_utc_buf, date_utc);
2646 if (
s->duration > 0) {
2649 av_log(
s,
AV_LOG_DEBUG,
"Write early duration from recording time = %" PRIu64
"\n", scaledDuration);
2650 }
else if (metadata_duration > 0) {
2653 av_log(
s,
AV_LOG_DEBUG,
"Write early duration from metadata = %" PRIu64
"\n", scaledDuration);
2677 for (
unsigned i = 0;
i <
s->nb_streams;
i++) {
2723 if (
s->metadata_header_padding > 0) {
2724 if (
s->metadata_header_padding == 1)
2725 s->metadata_header_padding++;
2760#if CONFIG_MATROSKA_MUXER
2779 const uint8_t *
src =
pkt->data;
2780 int srclen =
pkt->size;
2793 if (srclen <
header.blocksize)
2809 srclen -=
header.blocksize;
2831 const uint8_t *
id, *settings;
2832 size_t id_size, settings_size;
2833 unsigned total =
pkt->size + 2U;
2835 if (total > INT_MAX)
2842 if (id_size > INT_MAX - total || settings_size > INT_MAX - (total += id_size))
2844 *
size = total += settings_size;
2856 size_t size, uint64_t additional_id)
2868 int force_blockgroup,
int64_t relative_packet_pos)
2872#define SMPTE_2094_APP5_MAX_SIZE 855
2874 uint8_t *lcevc =
NULL;
2876 size_t side_data_size;
2877 uint64_t additional_id;
2878 unsigned track_number = track->
track_num;
2916 "Writing block of size %d with pts %" PRId64
", dts %" PRId64
", "
2917 "duration %" PRId64
" at relative offset %" PRId64
" in cluster "
2918 "at offset %" PRId64
". TrackNumber %u, keyframe %d\n",
2919 pkt->size,
pkt->pts,
pkt->dts,
pkt->duration, relative_packet_pos,
2925 if (side_data && side_data_size >= 10) {
2927 if (discard_padding) {
2939 if (side_data && side_data_size >= 8 &&
2952 uint8_t *payload = t35_buf;
2953 size_t payload_size =
sizeof(t35_buf) - 6;
2957 bytestream_put_be16(&payload, 0x01);
2958 bytestream_put_byte(&payload, 0x04);
2974 uint8_t *payload = smpte_2094_app5_buf;
2975 size_t payload_size =
sizeof(smpte_2094_app5_buf) - 5;
2979 bytestream_put_be16(&payload, 0x01);
2982 &payload, &payload_size);
2994 size_t payload_size = side_data_size + 4;
3003 memcpy (lcevc + 4, side_data, side_data_size);
3014 if (!force_blockgroup && writer.nb_elements == 2) {
3017 writer.nb_elements--;
3022 }
else if (!keyframe)
3039 for (
unsigned i = 0;
i <
s->nb_streams;
i++)
3058 size_t side_data_size;
3065#if CONFIG_MATROSKA_MUXER
3067 if (side_data_size && mkv->
track.
bc) {
3068 int output_sample_rate = 0;
3069 ret = get_aac_sample_rates(
s, mkv, side_data, side_data_size,
3073 if (!output_sample_rate)
3076 par, mkv->
track.
bc, track, 0);
3084 av_log(
s,
AV_LOG_ERROR,
"Error parsing AAC extradata, unable to determine samplerate.\n");
3089 if (side_data_size && mkv->
track.
bc) {
3096 par, mkv->
track.
bc, track, 0);
3109 par, mkv->
track.
bc, track, 4);
3148 if ((int16_t)cluster_time != cluster_time) {
3165 "Starting new cluster with timestamp "
3166 "%" PRId64
" at offset %" PRId64
" bytes\n",
3178 relative_packet_pos);
3203 int codec_type =
s->streams[
pkt->stream_index]->codecpar->codec_type;
3208 int start_new_cluster;
3227 start_new_cluster = keyframe;
3231 start_new_cluster = 1;
3236 cluster_size > 4 * 1024))) {
3237 start_new_cluster = 1;
3239 start_new_cluster = 0;
3241 if (start_new_cluster) {
3259 "Could not write cached audio packet ret:%d\n", ret);
3284 "Flushing cluster at offset %" PRIu64
" bytes\n",
3304 "Could not write cached audio packet ret:%d\n", ret);
3328 int length_size = 0;
3345 size += 4 + length_size;
3353 "Insufficient space reserved for Cues: "
3354 "%d < %"PRIu64
". No Cues will be output.\n",
3422 for (
unsigned i = 0;
i <
s->nb_streams;
i++) {
3456 for (
i = 0;
i <
s->nb_streams; ++
i) {
3473 snprintf(duration_string,
sizeof(duration_string),
"%02d:%02d:%012.9f",
3474 (
int) duration_sec / 3600, ((
int) duration_sec / 60) % 60,
3475 fmod(duration_sec, 60));
3504 for (k = 0; k <
i; k++) {
3505 if (tracks[k].
uid ==
uid)
3518 unsigned nb_tracks = 0;
3523 for (
i = 0;
i <
s->nb_streams;
i++) {
3532 "The Matroska muxer does not yet support muxing %s\n",
3538 if (
s->avoid_negative_ts < 0) {
3539 s->avoid_negative_ts = 1;
3543 if (!CONFIG_MATROSKA_MUXER ||
3544 (CONFIG_WEBM_MUXER && !strcmp(
s->oformat->name,
"webm"))) {
3560 for (
i = 0;
i < 4;
i++)
3564 for (
i = 0;
i <
s->nb_streams;
i++) {
3570#if CONFIG_MATROSKA_MUXER
3572 track->
reformat = mkv_reformat_wavpack;
3581 track->
reformat = mkv_reformat_h2645;
3609 "as WebM doesn't support attachments.\n",
i);
3612 "tag and it cannot be deduced from the codec id.\n",
i);
3624 if (mkv->
is_dash && nb_tracks != 1)
3636 if (
pkt->size > 2 && (
AV_RB16(
pkt->data) & 0xfff0) == 0xfff0)
3640 }
else if (CONFIG_MATROSKA_MUXER &&
3671#define OFFSET(x) offsetof(MatroskaMuxContext, x)
3672#define FLAGS AV_OPT_FLAG_ENCODING_PARAM
3674 {
"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 },
3675 {
"cues_to_front",
"move Cues (the index) to the front by shifting data if necessary",
OFFSET(move_cues_to_front),
AV_OPT_TYPE_BOOL, { .i64 = 0}, 0, 1,
FLAGS },
3676 {
"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 },
3677 {
"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 },
3678 {
"dash",
"create a WebM file conforming to WebM DASH specification",
OFFSET(is_dash),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
FLAGS },
3679 {
"dash_track_number",
"track number for the DASH stream",
OFFSET(dash_track_number),
AV_OPT_TYPE_INT, { .i64 = 1 }, 1, INT_MAX,
FLAGS },
3682 {
"flipped_raw_rgb",
"store raw RGB bitmaps in VFW mode in bottom-up mode",
OFFSET(flipped_raw_rgb),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
FLAGS },
3683 {
"write_crc32",
"write a CRC32 element inside every Level 1 element",
OFFSET(write_crc),
AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1,
FLAGS },
3685 {
"infer",
"for each track type, mark each track of disposition default as default; if none exists, mark the first track as default", 0,
AV_OPT_TYPE_CONST, { .i64 =
DEFAULT_MODE_INFER }, 0, 0,
FLAGS, .unit =
"default_mode" },
3686 {
"infer_no_subs",
"for each track type, mark each track of disposition default as default; for audio and video: if none exists, mark the first track as default", 0,
AV_OPT_TYPE_CONST, { .i64 =
DEFAULT_MODE_INFER_NO_SUBS }, 0, 0,
FLAGS, .unit =
"default_mode" },
3692 .class_name =
"matroska/webm muxer",
3698#if CONFIG_MATROSKA_MUXER
3716 .p.name =
"matroska",
3718 .p.mime_type =
"video/x-matroska",
3719 .p.extensions =
"mkv",
3721 .
p.audio_codec = CONFIG_LIBVORBIS_ENCODER ?
3723 .
p.video_codec = CONFIG_LIBX264_ENCODER ?
3737 .query_codec = mkv_query_codec,
3744#if CONFIG_WEBM_MUXER
3757 .p.mime_type =
"video/webm",
3758 .p.extensions =
"webm",
3777#if CONFIG_MATROSKA_AUDIO_MUXER
3779 .p.name =
"matroska",
3781 .p.mime_type =
"audio/x-matroska",
3782 .p.extensions =
"mka",
3784 .
p.audio_codec = CONFIG_LIBVORBIS_ENCODER ?
static double val(void *priv, double ch)
static const char *const format[]
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size, int write_seq_header)
Writes AV1 extradata (Sequence Header and Metadata OBUs) to the provided AVIOContext.
int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size)
Filter out AV1 OBUs not meant to be present in ISOBMFF sample data and write the resulting bitstream ...
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len)
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type)
Mark the written bytestream as a specific type.
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
void avio_wl32(AVIOContext *s, unsigned int val)
void avio_wl16(AVIOContext *s, unsigned int val)
void avio_w8(AVIOContext *s, int b)
void avio_wb32(AVIOContext *s, unsigned int val)
void avio_wb16(AVIOContext *s, unsigned int val)
@ AVIO_DATA_MARKER_BOUNDARY_POINT
A point in the output bytestream where a demuxer can start parsing (for non self synchronizing bytest...
@ AVIO_DATA_MARKER_FLUSH_POINT
A point in the output bytestream where the underlying AVIOContext might flush the buffer depending on...
@ AVIO_DATA_MARKER_SYNC_POINT
A point in the output bytestream where a decoder can start decoding (i.e.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
void avio_wb24(AVIOContext *s, unsigned int val)
void avio_wb64(AVIOContext *s, uint64_t val)
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
void ffio_reset_dyn_buf(AVIOContext *s)
Reset a dynamic buffer.
void ffio_fill(AVIOContext *s, int b, int64_t count)
const char * ff_convert_lang_to(const char *lang, enum AVLangCodespace target_codespace)
Convert a language code to a target codespace.
static void BS_FUNC skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
static int FUNC metadata(CodedBitstreamContext *ctx, RWContext *rw, APVRawMetadata *current)
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
Public libavutil channel layout APIs header.
static void deinit(AVFormatContext *s)
Public header for CRC hash function implementation.
Misc types and constants that do not belong anywhere else.
#define AV_PROFILE_ARIB_PROFILE_A
#define AV_PROFILE_ARIB_PROFILE_C
#define FF_COMPLIANCE_NORMAL
@ AV_FIELD_TT
Top coded_first, top displayed first.
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
@ AV_FIELD_BT
Bottom coded first, top displayed first.
@ AV_FIELD_TB
Top coded first, bottom displayed first.
void ff_isom_put_dvcc_dvvc(void *logctx, uint8_t out[ISOM_DVCC_DVVC_SIZE], const AVDOVIDecoderConfigurationRecord *dovi)
#define ISOM_DVCC_DVVC_SIZE
int(* init)(AVBSFContext *ctx)
static int write_packet(Muxer *mux, OutputStream *ost, AVPacket *pkt)
static void write_header(FFV1Context *f)
int ff_flac_write_header(AVIOContext *pb, const uint8_t *extradata, int extradata_size, int last_block)
int ff_flac_is_native_layout(uint64_t channel_layout)
const uint16_t ff_opus_frame_duration[32]
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT64
Underlying C type is int64_t.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
int av_get_bits_per_sample(enum AVCodecID codec_id)
Return codec bits per sample.
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
enum AVMediaType avcodec_get_type(enum AVCodecID codec_id)
Get the type of the given codec.
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
AVCodecID
Identify the syntax and semantics of the bitstream.
@ AV_CODEC_ID_HDMV_PGS_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVD_SUBTITLE
@ AV_CODEC_ID_TEXT
raw UTF-8 text
@ AV_CODEC_ID_ARIB_CAPTION
const AVPacketSideData * av_packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Get side information from a side data array.
@ AV_PKT_DATA_HEVC_CONF
Dolby Vision enhancement-layer HEVC decoder configuration.
@ AV_PKT_DATA_SKIP_SAMPLES
Recommends skipping the specified number of samples.
@ AV_PKT_DATA_DYNAMIC_HDR10_PLUS
HDR10+ dynamic metadata associated with a video frame.
@ AV_PKT_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata (based on SMPTE-2086:2014).
@ AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL
Data found in BlockAdditional element of matroska container.
@ AV_PKT_DATA_SPHERICAL
This side data should be associated with a video stream and corresponds to the AVSphericalMapping str...
@ AV_PKT_DATA_WEBVTT_SETTINGS
The optional settings (rendering instructions) that immediately follow the timestamp specifier of a W...
@ AV_PKT_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
@ AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5
HDR dynamic metadata associated with a video frame.
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
@ AV_PKT_DATA_STEREO3D
This side data should be associated with a video stream and contains Stereoscopic 3D information in f...
@ AV_PKT_DATA_WEBVTT_IDENTIFIER
The optional first identifier line of a WebVTT cue.
@ AV_PKT_DATA_FRAME_CROPPING
The number of pixels to discard from the top/bottom/left/right border of the decoded frame to obtain ...
@ AV_PKT_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
@ AV_PKT_DATA_LCEVC
Raw LCEVC payload data, as a uint8_t array, with NAL emulation bytes intact.
@ AV_PKT_DATA_DOVI_CONF
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2....
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
@ AV_CHANNEL_ORDER_NATIVE
The native channel order, i.e.
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
static double av_q2d(AVRational a)
Convert an AVRational to a double.
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define AV_TIME_BASE
Internal time base represented as integer.
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
#define LIBAVUTIL_VERSION_INT
@ AV_SPHERICAL_EQUIRECTANGULAR
Video represents a sphere mapped on a flat surface using equirectangular projection.
@ AV_SPHERICAL_EQUIRECTANGULAR_TILE
Video represents a portion of a sphere mapped on a flat surface using equirectangular projection.
@ AV_SPHERICAL_CUBEMAP
Video frame is split into 6 faces of a cube, and arranged on a 3x2 layout.
#define AV_STEREO3D_FLAG_INVERT
Inverted views, Right/Bottom represents the left view.
int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data, int size, int ps_array_completeness, void *logctx)
Writes HEVC extradata (parameter sets and declarative SEI NAL units with nuh_layer_id == 0,...
#define NOTHING(PROFILE, W, H, NUM_SLICES, TAB_W, TAB_H)
static int query_codec(enum AVCodecID id, int std_compliance)
static av_always_inline uint64_t av_double2int(double f)
Reinterpret a double as a 64-bit integer.
static void scale(int *out, const int *in, const int w, const int h, const int shift)
const AVCodecTag ff_codec_movvideo_tags[]
#define ITU_T_T35_PROVIDER_CODE_SMPTE
#define ITU_T_T35_PROVIDER_CODE_VNOVA
#define ITU_T_T35_COUNTRY_CODE_US
#define ITU_T_T35_COUNTRY_CODE_UK
#define ITU_T_T35_PROVIDER_CODE_SAMSUNG
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
#define AV1_SANE_SEQUENCE_HEADER_MAX_BITS
#define us(width, name, range_min, range_max, subs,...)
int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes)
#define av_builtin_constant_p
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
const CodecTags ff_webm_codec_tags[]
const char *const ff_matroska_video_stereo_mode[MATROSKA_VIDEO_STEREOMODE_TYPE_NB]
const CodecTags ff_mkv_codec_tags[]
const AVMetadataConv ff_mkv_metadata_conv[]
@ MATROSKA_BLOCK_ADD_ID_TYPE_OPAQUE
@ MATROSKA_BLOCK_ADD_ID_TYPE_DVCC
@ MATROSKA_BLOCK_ADD_ID_TYPE_HVCE
@ MATROSKA_BLOCK_ADD_ID_TYPE_DVVC
@ MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35
#define MATROSKA_ID_VIDEOPROJECTIONPOSEROLL
#define MATROSKA_ID_FILEMIMETYPE
#define MATROSKA_ID_DISCARDPADDING
#define MATROSKA_ID_TRACKFLAGLACING
#define MATROSKA_ID_TAGTARGETS
#define MATROSKA_ID_TRACKAUDIO
#define MATROSKA_ID_TRACKUID
#define MATROSKA_ID_CUERELATIVEPOSITION
#define MATROSKA_ID_CHAPSTRING
#define MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED
#define MATROSKA_ID_TRACKFLAGTEXTDESCRIPTIONS
#define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN
MatroskaVideoStereoModeType
@ MATROSKA_VIDEO_STEREOMODE_TYPE_NB
#define MATROSKA_ID_VIDEOSTEREOMODE
#define MATROSKA_ID_CHAPTERS
#define MATROSKA_ID_SIMPLETAG
#define MATROSKA_ID_TIMECODESCALE
#define HVCE_BLOCK_TYPE_NAME
#define EBML_ID_EBMLVERSION
#define MATROSKA_ID_VIDEOPIXELWIDTH
#define EBML_ID_DOCTYPEVERSION
#define MATROSKA_ID_ATTACHMENTS
#define MATROSKA_ID_BLOCKDURATION
#define MATROSKA_ID_TITLE
#define MATROSKA_ID_TRACKLANGUAGE
#define MATROSKA_ID_SEEKID
#define MATROSKA_ID_VIDEOCOLORMAXFALL
#define MATROSKA_ID_VIDEOCOLOR_GY
#define MATROSKA_ID_CHAPTERATOM
#define MATROSKA_ID_VIDEOFIELDORDER
#define DVCC_DVVC_BLOCK_TYPE_NAME
#define MATROSKA_ID_VIDEOPROJECTIONTYPE
#define MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
#define MATROSKA_ID_CODECDELAY
#define MATROSKA_ID_VIDEOALPHAMODE
#define MATROSKA_ID_TRACKNAME
#define MATROSKA_ID_CHAPTERTIMESTART
#define MATROSKA_ID_MUXINGAPP
#define MATROSKA_ID_SEEKHEAD
#define MATROSKA_ID_CUETIME
#define MATROSKA_ID_FILEUID
#define MATROSKA_ID_VIDEOCOLORSPACE
#define MATROSKA_ID_BLKADDIDEXTRADATA
#define MATROSKA_ID_VIDEOCOLOR_BY
#define MATROSKA_ID_VIDEOCOLOR_RY
#define MATROSKA_ID_EDITIONFLAGDEFAULT
#define MATROSKA_ID_SEEKPREROLL
#define MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS
#define MATROSKA_ID_AUDIOCHANNELS
#define MATROSKA_BLOCK_ADD_ID_ITU_T_T35
#define MATROSKA_ID_VIDEOCOLOR_BX
#define MATROSKA_ID_FILEDESC
#define MATROSKA_ID_VIDEODISPLAYUNIT
#define MATROSKA_ID_SIMPLEBLOCK
#define MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ
#define MATROSKA_ID_BLOCKGROUP
#define MATROSKA_ID_AUDIOBITDEPTH
#define STEREOMODE_STEREO3D_MAPPING(MAP, MKV_ONLY)
#define MATROSKA_ID_VIDEOPIXELHEIGHT
#define MATROSKA_ID_DATEUTC
#define MATROSKA_ID_VIDEOPIXELCROPL
#define MATROSKA_ID_CUETRACK
@ MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED
@ MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE
#define MATROSKA_ID_TRACKNUMBER
#define MATROSKA_ID_POINTENTRY
#define MATROSKA_ID_VIDEOPROJECTIONPRIVATE
#define MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT
#define MATROSKA_ID_TRACKFLAGORIGINAL
#define MATROSKA_ID_VIDEOCOLORMASTERINGMETA
@ MATROSKA_VIDEO_FIELDORDER_TB
@ MATROSKA_VIDEO_FIELDORDER_BT
@ MATROSKA_VIDEO_FIELDORDER_BB
@ MATROSKA_VIDEO_FIELDORDER_TT
#define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX
#define MATROSKA_ID_BLOCK
#define MATROSKA_ID_TAGLANG
#define MATROSKA_ID_TAGSTRING
#define MATROSKA_ID_CLUSTER
#define MATROSKA_ID_TRACKBLKADDMAPPING
#define MATROSKA_ID_BLOCKREFERENCE
#define MATROSKA_ID_CHAPTERTIMEEND
#define MATROSKA_ID_VIDEODISPLAYHEIGHT
#define MATROSKA_ID_ATTACHEDFILE
#define MATROSKA_ID_TRACKTYPE
#define MATROSKA_ID_TRACKENTRY
#define MATROSKA_ID_SEGMENTUID
#define EBML_ID_DOCTYPEREADVERSION
#define MATROSKA_ID_TRACKDEFAULTDURATION
@ MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP
@ MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR
#define MATROSKA_ID_TRACKS
#define MATROSKA_ID_VIDEOFLAGINTERLACED
#define MATROSKA_ID_FILENAME
#define MATROSKA_ID_TRACKFLAGFORCED
#define MATROSKA_ID_TRACKVIDEO
#define MATROSKA_ID_TAGTARGETS_CHAPTERUID
#define MATROSKA_ID_VIDEOCOLORRANGE
#define MATROSKA_ID_FILEDATA
#define MATROSKA_ID_TRACKMAXBLKADDID
#define MATROSKA_ID_VIDEOCOLOR_RX
#define MATROSKA_ID_BLOCKADDITIONAL
#define MATROSKA_ID_TAGTARGETS_TRACKUID
#define MATROSKA_ID_CUEDURATION
#define EBML_ID_EBMLMAXIDLENGTH
#define MATROSKA_ID_TRACKFLAGDEFAULT
#define MATROSKA_ID_SEEKENTRY
#define MATROSKA_ID_VIDEOCOLOR_WHITEY
#define MATROSKA_ID_VIDEOCOLORMAXCLL
#define MATROSKA_ID_BLKADDIDVALUE
@ MATROSKA_TRACK_TYPE_VIDEO
@ MATROSKA_TRACK_TYPE_METADATA
@ MATROSKA_TRACK_TYPE_SUBTITLE
@ MATROSKA_TRACK_TYPE_AUDIO
#define MATROSKA_ID_VIDEOCOLORPRIMARIES
#define MATROSKA_ID_BLOCKADDID
#define MATROSKA_ID_VIDEOCOLOR_WHITEX
#define EBML_ID_EBMLMAXSIZELENGTH
#define MATROSKA_ID_SEEKPOSITION
#define MATROSKA_ID_CODECPRIVATE
#define MATROSKA_ID_TAGNAME
#define MATROSKA_ID_DURATION
#define MATROSKA_ID_CHAPTERUID
#define MATROSKA_ID_CODECID
#define MATROSKA_ID_BLOCKMORE
#define MATROSKA_ID_TRACKFLAGVISUALIMPAIRED
#define MATROSKA_ID_TRACKFLAGCOMMENTARY
#define MATROSKA_ID_CUECLUSTERPOSITION
#define MATROSKA_ID_BLKADDIDNAME
#define MATROSKA_ID_VIDEOPROJECTIONPOSEYAW
#define MATROSKA_ID_BLKADDIDTYPE
#define MATROSKA_ID_VIDEOPIXELCROPB
#define MATROSKA_ID_CUETRACKPOSITION
#define MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH
#define MATROSKA_ID_EDITIONENTRY
#define MATROSKA_ID_CLUSTERTIMECODE
#define MATROSKA_ID_VIDEOCOLOR
#define MATROSKA_ID_VIDEODISPLAYWIDTH
#define MATROSKA_ID_CHAPTERDISPLAY
#define MATROSKA_ID_VIDEOCOLORMATRIXCOEFF
#define MATROSKA_ID_CHAPLANG
#define MATROSKA_ID_VIDEOPROJECTION
#define MATROSKA_ID_AUDIOSAMPLINGFREQ
#define MATROSKA_ID_VIDEOPIXELCROPT
#define EBML_ID_EBMLREADVERSION
@ MATROSKA_VIDEO_DISPLAYUNIT_DAR
@ MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN
#define MATROSKA_ID_BLOCKADDITIONS
#define MATROSKA_ID_WRITINGAPP
#define MATROSKA_ID_TAGTARGETS_ATTACHUID
#define MATROSKA_ID_SEGMENT
#define MATROSKA_ID_VIDEOCOLOR_GX
#define MATROSKA_ID_VIDEOPIXELCROPR
static int mkv_assemble_cues(AVStream **streams, AVIOContext *dyn_cp, AVIOContext *cuepoint, const mkv_cues *cues, mkv_track *tracks, int num_tracks, uint64_t offset)
static void mkv_handle_rotation(void *logctx, const AVCodecParameters *par, double *yaw, double *roll)
static int ebml_num_size(uint64_t num)
Returns how many bytes are needed to represent a number as EBML variable length integer.
static int ebml_writer_uint_len(EbmlElement *elem)
static void ebml_writer_add_sint(EbmlWriter *writer, uint32_t id, int64_t val)
static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, AVCodecParameters *par, const uint8_t *extradata, int extradata_size, int native_id, int qt_id, uint8_t **codecpriv, int *codecpriv_size, unsigned *max_payload_size)
static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv, int error_on_seek_failure, int64_t destpos)
Write the SeekHead to the file at the location reserved for it and seek to destpos afterwards.
static void mkv_write_video_color(EbmlWriter *writer, const AVStream *st, const AVCodecParameters *par)
#define WDIV1(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM)
static void ebml_write_header(AVIOContext *pb, const char *doctype, int version)
static int mkv_write_simpletag(AVIOContext *pb, const AVDictionaryEntry *t)
static int mkv_reformat_av1(MatroskaMuxContext *mkv, AVIOContext *pb, const AVPacket *pkt, int *size)
static int ebml_writer_block_len(EbmlElement *elem)
@ EBML_BLOCK
pseudo-type for writing (Simple)Blocks
static void mkv_write_default_duration(mkv_track *track, AVIOContext *pb, AVRational duration)
static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt)
static void ebml_writer_add_string(EbmlWriter *writer, uint32_t id, const char *str)
#define WEBM1(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM)
static void put_ebml_uint(AVIOContext *pb, uint32_t elementid, uint64_t val)
#define OPUS_SEEK_PREROLL
Seek preroll value for opus.
#define SMPTE_2094_APP5_MAX_SIZE
static int mkv_write_trailer(AVFormatContext *s)
static int ebml_writer_str_len(EbmlElement *elem)
static void ebml_writer_add_float(EbmlWriter *writer, uint32_t id, double val)
#define MAX_FIELD_ORDER_ELEMS
static void mkv_write_field_order(EbmlWriter *writer, int is_webm, enum AVFieldOrder field_order)
static int end_ebml_master_crc32_tentatively(AVIOContext *pb, ebml_stored_master *elem, MatroskaMuxContext *mkv, uint32_t id)
Output EBML master.
static int mkv_write_packet(AVFormatContext *s, const AVPacket *pkt)
static int mkv_update_codecprivate(AVFormatContext *s, MatroskaMuxContext *mkv, uint8_t *side_data, int side_data_size, AVCodecParameters *par, AVIOContext *pb, mkv_track *track, unsigned alternative_size)
static int webm_reformat_vtt(MatroskaMuxContext *mkv, AVIOContext *pb, const AVPacket *pkt, int *size)
static void mkv_write_tag_targets(MatroskaMuxContext *mkv, AVIOContext *pb, uint32_t elementid, uint64_t uid)
#define MAX_VIDEO_PROJECTION_ELEMS
static int mkv_write_tags(AVFormatContext *s)
static const char * get_mimetype(const AVStream *st)
static void put_ebml_length(AVIOContext *pb, uint64_t length, int bytes)
Write a length as EBML variable length integer.
static int mkv_write_chapters(AVFormatContext *s)
static void put_ebml_id(AVIOContext *pb, uint32_t id)
static const AVCodecTag additional_subtitle_tags[]
static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv, AVIOContext *pb, const AVStream *st, mkv_track *track, const AVPacket *pkt, int keyframe, int64_t ts, uint64_t duration, int force_blockgroup, int64_t relative_packet_pos)
static int mkv_write_info(AVFormatContext *s)
static int ebml_writer_elem_len(EbmlWriter *writer, EbmlElement *elem, int remaining_elems)
static int mkv_write_flush_packet(AVFormatContext *s, AVPacket *pkt)
static void ebml_writer_add_uint(EbmlWriter *writer, uint32_t id, uint64_t val)
static int ebml_id_size(uint32_t id)
#define HDIV1(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM)
static int ebml_writer_sint_len(EbmlElement *elem)
static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, const AVCodecParameters *par, const uint8_t *extradata, int extradata_size)
#define MAX_SEEKHEAD_ENTRIES
static int mkv_new_chapter_ids_needed(const AVFormatContext *s)
@ DEFAULT_MODE_INFER_NO_SUBS
@ DEFAULT_MODE_PASSTHROUGH
static void put_ebml_uid(AVIOContext *pb, uint32_t elementid, uint64_t uid)
Write a (random) UID with fixed size to make the output more deterministic.
static int mkv_write_header(AVFormatContext *s)
static void mkv_put_codecprivate(AVIOContext *pb, unsigned max_payload_size, const uint8_t *codecpriv, unsigned codecpriv_size)
static void ebml_writer_add_bin(EbmlWriter *writer, uint32_t id, const uint8_t *data, size_t size)
static int ebml_writer_master_len(EbmlWriter *writer, EbmlElement *elem, int remaining_elems)
static int mkv_init(struct AVFormatContext *s)
static const AVClass matroska_webm_class
#define DURATION_SIMPLETAG_SIZE
2 + 1 Simpletag header, 2 + 1 + 8 Name "DURATION", rest for TagString
#define MAX_SUPPORTED_EBML_LENGTH
#define IS_SEEKABLE(pb, mkv)
static int ebml_writer_elem_write(const EbmlElement *elem, AVIOContext *pb)
static uint64_t mkv_get_uid(const mkv_track *tracks, int i, AVLFG *c)
static void ebml_writer_open_master(EbmlWriter *writer, uint32_t id)
static int parse_opus_packet_duration(const uint8_t *buf, int buf_size)
Returns the duration of an Opus packet in samples.
static bool codec_has_blockadditional_alpha(AVFormatContext *s, const AVStream *st, const AVCodecParameters *par)
static void ebml_writer_add_uid(EbmlWriter *writer, uint32_t id, uint64_t val)
#define EBML_WRITER(max_nb_elems)
static int64_t get_metadata_duration(AVFormatContext *s)
static int mkv_handle_spherical(void *logctx, EbmlWriter *writer, const AVCodecParameters *par, uint8_t private[], double *yaw, double *pitch, double *roll)
static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, const AVCodecParameters *par, const uint8_t *extradata, int extradata_size, unsigned *size_to_reserve)
static int start_ebml_master_crc32(AVIOContext **dyn_cp, MatroskaMuxContext *mkv)
static const AVCodecTag additional_audio_tags[]
static int mkv_write_track_video(AVFormatContext *s, MatroskaMuxContext *mkv, const AVStream *st, const AVCodecParameters *par, AVIOContext *pb)
static void put_ebml_binary(AVIOContext *pb, uint32_t elementid, const void *buf, int size)
#define MAX_SEEKENTRY_SIZE
2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit offset, 4 bytes for target EBML I...
static int mkv_write_tag(MatroskaMuxContext *mkv, const AVDictionary *m, AVIOContext **pb, unsigned reserved_size, uint32_t elementid, uint64_t uid)
#define WDIV2(STEREOMODETYPE, WDIV, HDIV, WEBM)
static int mkv_check_bitstream(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
static av_const int uint_size(uint64_t val)
static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, AVStream *st, mkv_track *track, AVIOContext *pb, int is_default)
static void mkv_start_seekhead(MatroskaMuxContext *mkv, AVIOContext *pb)
Initialize the SeekHead element to be ready to index level 1 Matroska elements.
static int mkv_end_cluster(AVFormatContext *s)
static void ebml_writer_write_block(const EbmlElement *elem, AVIOContext *pb)
static EbmlElement * ebml_writer_add(EbmlWriter *writer, uint32_t id, EbmlType type)
#define MAX_CUETRACKPOS_SIZE
4 * (1-byte EBML ID, 1-byte EBML size, 8-byte uint max)
static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int64_t ts, int64_t cluster_pos, int64_t relative_pos, int64_t duration)
static void put_ebml_void(AVIOContext *pb, int size)
Write a void element of a given size.
static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid, uint64_t filepos)
static int mkv_check_tag_name(const char *name, uint32_t elementid)
static void mkv_write_video_projection(void *logctx, EbmlWriter *wr, const AVCodecParameters *par, uint8_t private[])
static void mkv_deinit(AVFormatContext *s)
Free the members allocated in the mux context.
#define STEREOMODE(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM)
#define HDIV2(STEREOMODETYPE, WDIV, HDIV, WEBM)
static void mkv_write_blockadditional(EbmlWriter *writer, const uint8_t *buf, size_t size, uint64_t additional_id)
static int ebml_writer_write(EbmlWriter *writer, AVIOContext *pb)
static void put_xiph_size(AVIOContext *pb, int size)
static void mkv_write_blockadditionmapping(AVFormatContext *s, const MatroskaMuxContext *mkv, const AVCodecParameters *par, AVIOContext *pb, mkv_track *track, const AVStream *st)
#define CASE(type, variable)
#define MAX_STEREO_MODE_ELEMS
static void put_ebml_string(AVIOContext *pb, uint32_t elementid, const char *str)
static int end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv, uint32_t id, int length_size, int keep_buffer, int add_seekentry)
static void ebml_writer_add_block(EbmlWriter *writer, MatroskaMuxContext *mkv)
#define WEBM2(STEREOMODETYPE, WDIV, HDIV, WEBM)
static int mkv_write_attachments(AVFormatContext *s)
static av_const int sint_size(int64_t val)
static int ebml_length_size(uint64_t length)
Calculate how many bytes are needed to represent the length field of an EBML element whose payload ha...
static void ebml_writer_close_or_discard_master(EbmlWriter *writer)
static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes)
Write a number as EBML variable length integer on bytes bytes.
static ebml_master start_ebml_master(AVIOContext *pb, uint32_t elementid, uint64_t expectedsize)
#define DURATION_STRING_LENGTH
DURATION_STRING_LENGTH must be <= 112 or the containing simpletag will need more than one byte for it...
static int mkv_write_tracks(AVFormatContext *s)
static void put_ebml_float(AVIOContext *pb, uint32_t elementid, double val)
static int mkv_write_stereo_mode(AVFormatContext *s, EbmlWriter *writer, const AVCodecParameters *par, const AVStream *st, int is_webm, int *h_width, int *h_height)
static void ebml_writer_close_master(EbmlWriter *writer)
#define MAX_VIDEO_COLOR_ELEMS
static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
Write an EBML size meaning "unknown size".
static void end_ebml_master(AVIOContext *pb, ebml_master master)
static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
int avpriv_mpeg4audio_get_config2(MPEG4AudioConfig *c, const uint8_t *buf, int size, int sync_extension, void *logctx)
Parse MPEG-4 systems extradata from a raw buffer to retrieve audio configuration.
#define MAX_PCE_SIZE
Maximum size of a PCE including the 3-bit ID_PCE marker and the comment.
#define FF_OFMT_FLAG_ALLOW_FLUSH
This flag indicates that the muxer stores data internally and supports flushing it.
int ff_format_shift_data(AVFormatContext *s, int64_t read_start, int shift_size)
Make shift_size amount of space at read_start by shifting data in the output at read_start until the ...
int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
Parse creation_time in AVFormatContext metadata if exists and warn if the parsing fails.
void ff_nal_units_write_list(const NALUList *list, AVIOContext *pb, const uint8_t *buf)
int ff_nal_units_create_list(NALUList *list, const uint8_t *buf, int size)
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
int av_parse_time(int64_t *timeval, const char *timestr, int duration)
Parse timestr and return in *time a corresponding number of microseconds.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
int av_chroma_location_enum_to_pos(int *xpos, int *ypos, enum AVChromaLocation pos)
Converts AVChromaLocation to swscale x/y chroma position.
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
@ AVCHROMA_LOC_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_NB
Not part of ABI.
@ AVCOL_PRI_NB
Not part of ABI.
@ AVCOL_TRC_NB
Not part of ABI.
@ AVCOL_SPC_NB
Not part of ABI.
Utilities for rational number calculation.
const AVCodecTag ff_codec_bmp_tags[]
const AVCodecTag ff_codec_wav_tags[]
internal header for RIFF based (de)muxers do NOT include this in end user applications
#define FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX
Tell ff_put_wav_header() to use WAVEFORMATEX even for PCM codecs.
void ff_put_bmp_header(AVIOContext *pb, AVCodecParameters *par, int for_asf, int ignore_extradata, int rgb_frame_is_flipped)
int ff_put_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int flags)
Write WAVEFORMAT header structure.
enum AVMediaType codec_type
static const uint8_t header[24]
#define FF_ARRAY_ELEMS(a)
enum AVChannelOrder order
Channel order used in this layout.
uint64_t mask
This member must be used for AV_CHANNEL_ORDER_NATIVE, and may be used for AV_CHANNEL_ORDER_AMBISONIC ...
union AVChannelLayout::@162063043056170047076125117143030261346263330336 u
Details about which channels are present in this layout.
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
This struct describes the properties of a single codec described by an AVCodecID.
This struct describes the properties of an encoded stream.
enum AVColorSpace color_space
int extradata_size
Size of the extradata content in bytes.
int frame_size
Audio frame size, if known.
enum AVFieldOrder field_order
The order of the fields in interlaced video.
int height
The height of the video frame in pixels.
int nb_coded_side_data
Amount of entries in coded_side_data.
int bits_per_coded_sample
The number of bits per sample in the codedwords.
AVChannelLayout ch_layout
The channel layout and number of channels.
int width
The width of the video frame in pixels.
enum AVMediaType codec_type
General type of the encoded data.
int profile
Codec-specific bitstream restrictions that the stream conforms to.
int bits_per_raw_sample
The number of valid bits in each output sample.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
enum AVColorPrimaries color_primaries
int sample_rate
The number of audio samples per second.
enum AVColorTransferCharacteristic color_trc
int initial_padding
Number of padding audio samples at the start.
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
enum AVChromaLocation chroma_location
enum AVColorRange color_range
Additional colorspace characteristics.
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
This struct represents dynamic metadata for color volume transform - application 4 of SMPTE 2094-40:2...
This struct represents dynamic metadata for color volume transform as specified in the SMPTE 2094-50 ...
int direct
avio_read and avio_write should if possible be satisfied directly instead of going through a buffer,...
int error
contains the error code or 0 if no error happened
Context structure for the Lagged Fibonacci PRNG.
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
This structure stores compressed data.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Rational number (pair of numerator and denominator).
This structure describes how to handle spherical videos, outlining information about projection,...
uint32_t bound_left
Distance from the left edge.
enum AVSphericalProjection projection
Projection type.
uint32_t bound_top
Distance from the top edge.
uint32_t bound_bottom
Distance from the bottom edge.
uint32_t bound_right
Distance from the right edge.
int32_t pitch
Rotation around the right vector [-90, 90].
int32_t roll
Rotation around the forward vector [-180, 180].
int32_t yaw
Rotation around the up vector [-180, 180].
uint32_t padding
Number of pixels to pad from the edge of each cube face.
Stereo 3D type: this structure describes how two videos are packed within a single video surface,...
enum AVStereo3DType type
How views are packed within the video.
int flags
Additional information about the frame packing.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
AVRational avg_frame_rate
Average framerate.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
AVRational r_frame_rate
Real base framerate of the stream.
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
uint64_t size
excluding id and length field
union EbmlElement::@322146226050105363311012227307205347315121024315 priv
struct MatroskaMuxContext * mkv
used by EBML_BLOCK
int nb_elements
-1 if not finished
int containing_master
-1 if no parent exists
int current_master_element
int avoid_negative_ts_use_pts
AVPacket * pkt
Used to hold temporary packets for the generic demuxing code.
int64_t lowest_ts_allowed
This is the lowest ts allowed in this track; it may be set by the muxer during init or write_header a...
int64_t cluster_pos
file offset of the current Cluster
int64_t cluster_time_limit
int64_t pos
absolute offset in the containing AVIOContext where the master's elements start
int sizebytes
how many bytes were reserved for the size
int64_t cluster_pos
offset of the cluster containing the block relative to the segment
int64_t duration
duration of the block according to time base
int64_t relative_pos
relative offset from the position of the cluster containing the block
mkv_seekhead_entry entries[MAX_SEEKHEAD_ENTRIES]
uint64_t default_duration_low
int64_t blockadditionmapping_offset
unsigned codecpriv_size
size reserved for CodecPrivate excluding header+length field
int64_t sample_rate_offset
uint64_t default_duration_high
int(* reformat)(struct MatroskaMuxContext *, AVIOContext *, const AVPacket *, int *size)
static int write_trailer(AVFormatContext *s1)
int ff_isom_write_vvcc(AVIOContext *pb, const uint8_t *data, int size, int ps_array_completeness)
Writes H.266/VVC extradata (parameter sets, declarative SEI NAL units) to the provided AVIOContext.
int ff_wv_parse_header(WvHeader *wv, const uint8_t *data)
Parse a WavPack block header.
int avpriv_split_xiph_headers(const uint8_t *extradata, int extradata_size, int first_header_size, const uint8_t *header_start[3], int header_len[3])
Split a single extradata buffer into the three headers that most Xiph codecs use.