42 #include "libavutil/base64.h"
43 #include "libavutil/intfloat.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/lzo.h"
47 #include "libavutil/dict.h"
640 if (
avio_seek(pb, last_pos + 1, SEEK_SET) < 0)
688 int max_size, uint64_t *number)
701 "Read error at pos. %"PRIu64
" (0x%"PRIx64
")\n",
710 if (read > max_size) {
713 "Invalid EBML number size tag 0x%02x at pos %"PRIu64
" (0x%"PRIx64
")\n",
721 total = (total << 8) |
avio_r8(pb);
737 if (res > 0 && *number + 1 == 1ULL << (7 * res))
738 *number = 0xffffffffffffffULL;
756 *num = (*num << 8) |
avio_r8(pb);
769 }
else if (size == 4) {
771 }
else if (size == 8){
872 *num = unum - ((1LL << (7*res - 1)) - 1);
881 uint32_t
id,
void *
data)
884 for (i=0; syntax[i].
id; i++)
885 if (
id == syntax[i].
id)
917 for (i=0; syntax[i].
id; i++)
918 switch (syntax[i].
type) {
920 *(uint64_t *)((
char *)data+syntax[i].
data_offset) = syntax[i].def.
u;
923 *(
double *)((
char *)data+syntax[i].data_offset) = syntax[i].
def.
f;
928 if (syntax[i].def.
s) {
957 uint32_t
id = syntax->
id;
968 list->
elem = newelem;
978 if (max_lengths[syntax->
type] && length > max_lengths[syntax->
type]) {
980 "Invalid length 0x%"PRIx64
" > 0x%"PRIx64
" for syntax element %i\n",
981 length, max_lengths[syntax->
type], syntax->
type);
986 switch (syntax->
type) {
1014 for (i=0; syntax[i].
id; i++) {
1015 void *data_off = (
char *)data + syntax[i].data_offset;
1016 switch (syntax[i].
type) {
1021 if (syntax[i].list_elem_size) {
1023 char *ptr = list->
elem;
1041 int len_mask = 0x80,
size = 1,
n = 1, i;
1049 while (
size <= 8 && !(total & len_mask)) {
1055 total &= (len_mask - 1);
1057 total = (total << 8) | p->
buf[4 +
n++];
1069 if (total < probelen)
1087 if (tracks[i].num == num)
1099 int isize = *buf_size;
1102 int pkt_size = isize;
1106 if (pkt_size >= 10000000
U)
1109 switch (encodings[0].compression.algo) {
1114 if (header_size && !header) {
1122 pkt_size = isize + header_size;
1127 memcpy(pkt_data, header, header_size);
1128 memcpy(pkt_data + header_size, data, isize);
1134 olen = pkt_size *= 3;
1140 pkt_data = newpktdata;
1152 z_stream zstream = {0};
1153 if (inflateInit(&zstream) != Z_OK)
1155 zstream.next_in =
data;
1156 zstream.avail_in = isize;
1161 inflateEnd(&zstream);
1164 pkt_data = newpktdata;
1165 zstream.avail_out = pkt_size - zstream.total_out;
1166 zstream.next_out = pkt_data + zstream.total_out;
1168 result = inflate(&zstream, Z_NO_FLUSH);
1170 result = Z_MEM_ERROR;
1171 }
while (result==Z_OK && pkt_size<10000000);
1172 pkt_size = zstream.total_out;
1173 inflateEnd(&zstream);
1174 if (result != Z_STREAM_END) {
1175 if (result == Z_MEM_ERROR)
1186 bz_stream bzstream = {0};
1187 if (BZ2_bzDecompressInit(&bzstream, 0, 0) != BZ_OK)
1189 bzstream.next_in =
data;
1190 bzstream.avail_in = isize;
1195 BZ2_bzDecompressEnd(&bzstream);
1198 pkt_data = newpktdata;
1199 bzstream.avail_out = pkt_size - bzstream.total_out_lo32;
1200 bzstream.next_out = pkt_data + bzstream.total_out_lo32;
1202 result = BZ2_bzDecompress(&bzstream);
1204 result = BZ_MEM_ERROR;
1205 }
while (result==BZ_OK && pkt_size<10000000);
1206 pkt_size = bzstream.total_out_lo32;
1207 BZ2_bzDecompressEnd(&bzstream);
1208 if (result != BZ_STREAM_END) {
1209 if (result == BZ_MEM_ERROR)
1223 *buf_size = pkt_size;
1235 char *layer, *ptr = pkt->
data, *
end = ptr+pkt->
size;
1236 for (; *ptr!=
',' && ptr<
end-1; ptr++);
1240 for (; *ptr!=
',' && ptr<end-1; ptr++);
1242 int64_t end_pts = pkt->
pts + display_duration;
1244 int ec = matroska->
time_scale * end_pts / 10000000;
1245 int sh, sm, ss, eh, em, es,
len;
1246 sh = sc/360000; sc -= 360000*sh;
1247 sm = sc/ 6000; sc -= 6000*sm;
1248 ss = sc/ 100; sc -= 100*ss;
1249 eh = ec/360000; ec -= 360000*eh;
1250 em = ec/ 6000; ec -= 6000*em;
1251 es = ec/ 100; ec -= 100*es;
1256 snprintf(line->
data, len,
"Dialogue: %s,%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,%s\r\n",
1257 layer, sh, sm, ss, sc, eh, em, es, ec, ptr);
1286 for (i=0; i < list->
nb_elem; i++) {
1287 const char *lang = tags[i].
lang && strcmp(tags[i].lang,
"und") ?
1288 tags[i].
lang : NULL;
1290 if (!tags[i].
name) {
1294 if (prefix)
snprintf(key,
sizeof(key),
"%s/%s", prefix, tags[i].name);
1295 else av_strlcpy(key, tags[i].name,
sizeof(key));
1296 if (tags[i].def || !lang) {
1298 if (tags[i].sub.nb_elem)
1305 if (tags[i].sub.nb_elem)
1319 if (tags[i].target.attachuid) {
1322 if (attachment[j].uid == tags[i].target.attachuid
1325 &attachment[j].stream->metadata, NULL);
1326 }
else if (tags[i].target.chapteruid) {
1329 if (chapter[j].uid == tags[i].target.chapteruid
1332 &chapter[j].chapter->metadata, NULL);
1333 }
else if (tags[i].target.trackuid) {
1336 if (track[j].uid == tags[i].target.trackuid && track[j].
stream)
1338 &track[j].stream->metadata, NULL);
1350 uint32_t level_up = matroska->
level_up;
1357 if (idx >= seekhead_list->
nb_elem
1369 "Max EBML element depth (%d) reached, "
1374 level.
length = (uint64_t)-1;
1379 ret =
ebml_parse(matroska, matroska_segment, matroska);
1384 if (length == (uint64_t)-1)
1408 for (i = 0; i < seekhead_list->
nb_elem; i++) {
1410 if (seekhead[i].pos <= before_pos)
1430 int index_scale = 1;
1433 index_list = &matroska->
index;
1434 index = index_list->
elem;
1440 for (i = 0; i < index_list->
nb_elem; i++) {
1443 for (j = 0; j < pos_list->
nb_elem; j++) {
1445 if (track && track->stream)
1448 index[i].
time/index_scale, 0, 0,
1459 for (i = 0; i < seekhead_list->
nb_elem; i++)
1471 static const char *
const aac_profiles[] = {
"MAIN",
"LC",
"SSR" };
1475 if (strstr(codec_id, aac_profiles[profile]))
1494 time_t creation_time = date_utc / 1000000000 + 978307200;
1495 struct tm *ptm = gmtime(&creation_time);
1497 strftime(buffer,
sizeof(buffer),
"%Y-%m-%d %H:%M:%S", ptm);
1498 av_dict_set(metadata,
"creation_time", buffer, 0);
1509 uint64_t max_start = 0;
1522 "EBML header using unsupported features\n"
1523 "(EBML version %"PRIu64
", doctype %s, doc version %"PRIu64
")\n",
1529 "EBML header using unsupported features\n"
1530 "(EBML version %"PRIu64
", doctype %s, doc version %"PRIu64
")\n",
1547 res =
ebml_parse(matroska, matroska_segments, matroska);
1554 res =
ebml_parse(matroska, matroska_segment, matroska);
1575 int extradata_size = 0;
1576 int extradata_offset = 0;
1577 uint32_t fourcc = 0;
1579 char* key_id_base64 = NULL;
1587 "Unknown or unsupported track type %"PRIu64
"\n",
1607 if (encodings_list->
nb_elem > 1) {
1609 "Multiple combined encodings not supported");
1610 }
else if (encodings_list->
nb_elem == 1) {
1611 if (encodings[0].
type) {
1612 if (encodings[0].encryption.key_id.size > 0) {
1615 const int b64_size =
AV_BASE64_SIZE(encodings[0].encryption.key_id.size);
1617 if (key_id_base64 == NULL)
1621 encodings[0].encryption.key_id.data,
1624 encodings[0].
scope = 0;
1626 "Unsupported encoding type");
1639 encodings[0].
scope = 0;
1641 "Unsupported encoding type");
1651 "Failed to decode codec private data\n");
1673 if (key_id_base64) {
1679 if (!strcmp(track->
codec_id,
"V_MS/VFW/FOURCC")
1685 extradata_offset = 40;
1686 }
else if (!strcmp(track->
codec_id,
"A_MS/ACM")
1691 0, NULL, NULL, NULL, NULL);
1697 }
else if (!strcmp(track->
codec_id,
"V_QUICKTIME")
1719 extradata =
av_mallocz(5 + FF_INPUT_BUFFER_PADDING_SIZE);
1720 if (extradata == NULL)
1722 extradata[0] = (profile << 3) | ((sri&0x0E) >> 1);
1723 extradata[1] = ((sri&0x01) << 7) | (track->
audio.
channels<<3);
1724 if (strstr(track->
codec_id,
"SBR")) {
1726 extradata[2] = 0x56;
1727 extradata[3] = 0xE5;
1728 extradata[4] = 0x80 | (sri<<3);
1737 extradata =
av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1738 if (extradata == NULL)
1740 AV_WB32(extradata, extradata_size);
1741 memcpy(&extradata[4],
"alac", 4);
1746 extradata_size = 30;
1747 extradata =
av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
1748 if (extradata == NULL)
1751 NULL, NULL, NULL, NULL);
1762 extradata_offset = 26;
1772 0, NULL, NULL, NULL, NULL);
1780 if (flavor <= 0 || track->audio.coded_framesize <= 0 ||
1792 static const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
1797 extradata_offset = 78;
1804 "Unknown/unsupported AVCodecID %s.\n", track->
codec_id);
1812 if (strcmp(track->
language,
"und"))
1851 #if FF_API_R_FRAME_RATE
1870 snprintf(buf,
sizeof(buf),
"%s_%d",
1873 if (planes[j].uid == tracks[k].uid) {
1875 "stereo_mode", buf, 0);
1900 if (!strcmp(track->codec_id,
"D_WEBVTT/CAPTIONS")) {
1902 }
else if (!strcmp(track->codec_id,
"D_WEBVTT/DESCRIPTIONS")) {
1904 }
else if (!strcmp(track->codec_id,
"D_WEBVTT/METADATA")) {
1919 attachements = attachements_list->elem;
1920 for (j=0; j<attachements_list->nb_elem; j++) {
1921 if (!(attachements[j].filename && attachements[j].mime &&
1922 attachements[j].bin.data && attachements[j].bin.size > 0)) {
1934 memcpy(st->
codec->
extradata, attachements[j].bin.data, attachements[j].bin.size);
1943 attachements[j].stream = st;
1947 chapters = chapters_list->elem;
1948 for (i=0; i<chapters_list->nb_elem; i++)
1950 && (max_start==0 || chapters[i].
start > max_start)) {
1951 chapters[i].chapter =
1953 chapters[i].start, chapters[i].end,
1956 "title", chapters[i].title, 0);
1957 max_start = chapters[i].start;
1984 matroska->
packets = newpackets;
2014 int* buf_size,
int type,
2015 uint32_t **lace_buf,
int *laces)
2019 uint32_t *lace_size;
2027 *lace_buf[0] =
size;
2035 lace_size =
av_mallocz(*laces *
sizeof(
int));
2043 for (
n = 0; res == 0 &&
n < *laces - 1;
n++) {
2045 if (size <= total) {
2051 lace_size[
n] +=
temp;
2058 if (size <= total) {
2063 lace_size[
n] = size - total;
2068 if (size % (*laces)) {
2072 for (
n = 0;
n < *laces;
n++)
2073 lace_size[
n] = size / *laces;
2080 if (n < 0 || num > INT_MAX) {
2082 "EBML block data error\n");
2088 total = lace_size[0] = num;
2089 for (
n = 1; res == 0 &&
n < *laces - 1;
n++) {
2093 if (r < 0 || lace_size[
n - 1] + snum > (uint64_t)INT_MAX) {
2095 "EBML block data error\n");
2101 lace_size[
n] = lace_size[
n - 1] + snum;
2102 total += lace_size[
n];
2104 if (size <= total) {
2108 lace_size[*laces - 1] = size - total;
2114 *lace_buf = lace_size;
2139 if (size < cfs * h / 2) {
2141 "Corrupt int4 RM-style audio packet size\n");
2144 for (x=0; x<h/2; x++)
2145 memcpy(track->
audio.
buf+x*2*w+y*cfs,
2150 "Corrupt sipr RM-style audio packet size\n");
2153 memcpy(track->
audio.
buf + y*w, data, w);
2155 if (size < sps * w / sps || h<=0) {
2157 "Corrupt generic RM-style audio packet size\n");
2160 for (x=0; x<w/sps; x++)
2161 memcpy(track->
audio.
buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps);
2201 if (srclen < 12 || track->stream->codec->extradata_size < 2)
2210 while (srclen >= 8) {
2216 uint32_t crc =
AV_RL32(src + 4);
2220 multiblock = (flags & 0x1800) != 0x1800;
2232 if (blocksize > srclen) {
2237 tmp =
av_realloc(dst, dstlen + blocksize + 32);
2243 dstlen += blocksize + 32;
2246 AV_WL32(dst + offset + 4, blocksize + 24);
2247 AV_WL16(dst + offset + 8, ver);
2248 AV_WL16(dst + offset + 10, 0);
2249 AV_WL32(dst + offset + 12, 0);
2250 AV_WL32(dst + offset + 16, 0);
2251 AV_WL32(dst + offset + 20, samples);
2252 AV_WL32(dst + offset + 24, flags);
2253 AV_WL32(dst + offset + 28, crc);
2254 memcpy (dst + offset + 32, src, blocksize);
2257 srclen -= blocksize;
2258 offset += blocksize + 32;
2281 int id_len, settings_len, text_len;
2289 q = data + data_len;
2294 if (*p ==
'\r' || *p ==
'\n') {
2303 if (p >= q || *p !=
'\n')
2310 if (*p ==
'\r' || *p ==
'\n') {
2311 settings_len = p - settings;
2319 if (p >= q || *p !=
'\n')
2325 while (text_len > 0) {
2326 const int len = text_len - 1;
2328 if (c !=
'\r' && c !=
'\n')
2343 memcpy(pkt->
data, text, text_len);
2353 memcpy(buf,
id, id_len);
2356 if (settings_len > 0) {
2364 memcpy(buf, settings, settings_len);
2371 pkt->
pts = timecode;
2389 uint64_t timecode, uint64_t lace_duration,
2390 int64_t pos,
int is_keyframe,
2391 uint8_t *additional, uint64_t additional_id,
int additional_size,
2392 uint64_t discard_padding)
2399 if (encodings && !encodings->
type && encodings->
scope & 1) {
2412 if (pkt_data != data)
2430 bytestream_put_be32(&buf, pkt_size);
2431 bytestream_put_be32(&buf,
MKBETAG(
'i',
'c',
'p',
'f'));
2434 memcpy(pkt->
data + offset, pkt_data, pkt_size);
2436 if (pkt_data != data)
2439 pkt->
flags = is_keyframe;
2442 if (additional_size > 0) {
2445 additional_size + 8);
2446 if(side_data == NULL) {
2451 AV_WB64(side_data, additional_id);
2452 memcpy(side_data + 8, additional, additional_size);
2455 if (discard_padding) {
2459 if(side_data == NULL) {
2471 pkt->
dts = timecode;
2473 pkt->
pts = timecode;
2488 lace_duration <= INT_MAX) {
2501 matroska_fix_ass_packet(matroska, pkt, lace_duration);
2508 matroska_merge_packets(matroska->
prev_pkt, pkt);
2520 if (pkt_data != data)
2526 int size, int64_t pos, uint64_t cluster_time,
2527 uint64_t block_duration,
int is_keyframe,
2528 uint8_t *additional, uint64_t additional_id,
int additional_size,
2529 int64_t cluster_pos, uint64_t discard_padding)
2536 uint32_t *lace_size = NULL;
2539 int trust_default_duration = 1;
2549 if (!track || !track->
stream) {
2551 "Invalid stream %"PRIu64
" or size %u\n", num, size);
2553 }
else if (size <= 3)
2564 if (is_keyframe == -1)
2567 if (cluster_time != (uint64_t)-1
2568 && (block_time >= 0 || cluster_time >= -block_time)) {
2569 timecode = cluster_time + block_time;
2571 && timecode < track->end_timecode)
2578 if (timecode < matroska->skip_to_timecode)
2589 &lace_size, &laces);
2598 trust_default_duration = 0;
2602 if (!block_duration && trust_default_duration)
2605 if (cluster_time != (uint64_t)-1 && (block_time >= 0 || cluster_time >= -block_time))
2609 for (n = 0; n < laces; n++) {
2610 int64_t lace_duration = block_duration*(n+1) / laces - block_duration*n / laces;
2612 if (lace_size[n] > size) {
2632 timecode, lace_duration,
2639 timecode, lace_duration,
2640 pos, !n? is_keyframe : 0,
2641 additional, additional_id, additional_size,
2648 timecode = lace_duration ? timecode + lace_duration :
AV_NOPTS_VALUE;
2649 data += lace_size[
n];
2650 size -= lace_size[
n];
2664 matroska_cluster_incremental_parsing,
2679 matroska_clusters_incremental,
2684 matroska_cluster_incremental_parsing,
2692 blocks = blocks_list->
elem;
2696 if (blocks[i].bin.size > 0 && blocks[i].
bin.
data) {
2700 if (!blocks[i].non_simple)
2703 blocks[i].bin.data, blocks[i].
bin.
size,
2730 res =
ebml_parse(matroska, matroska_clusters, &cluster);
2731 blocks_list = &cluster.
blocks;
2732 blocks = blocks_list->
elem;
2733 for (i=0; i<blocks_list->
nb_elem; i++)
2734 if (blocks[i].bin.size > 0 && blocks[i].
bin.
data) {
2737 blocks[i].bin.data, blocks[i].
bin.
size,
2739 blocks[i].
duration, is_keyframe, NULL, 0, 0,
2762 int64_t timestamp,
int flags)
2767 int i,
index, index_sub, index_min;
2802 while(index_sub >= 0
2804 && tracks[i].stream->index_entries[index_sub].pos < st->
index_entries[index_min].
pos
2854 .
name =
"matroska,webm",
#define MATROSKA_ID_SEEKPREROLL
static EbmlSyntax matroska_simpletag[]
#define MATROSKA_ID_BLOCKADDID
#define MATROSKA_ID_TRACKDEFAULTDURATION
static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska, MatroskaTrack *track, AVStream *st, uint8_t *data, int size, uint64_t timecode, int64_t pos)
static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska, int idx)
#define MATROSKA_ID_VIDEOFLAGINTERLACED
#define AVERROR_PATCHWELCOME
const char *const ff_matroska_video_stereo_plane[MATROSKA_VIDEO_STEREO_PLANE_COUNT]
static void matroska_convert_tags(AVFormatContext *s)
#define MATROSKA_ID_DATEUTC
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
void av_free_packet(AVPacket *pkt)
Free a packet.
The optional first identifier line of a WebVTT cue.
#define MATROSKA_ID_TRACKFLAGLACING
#define MATROSKA_ID_TRACKENTRY
static int matroska_deliver_packet(MatroskaDemuxContext *matroska, AVPacket *pkt)
#define MATROSKA_ID_VIDEODISPLAYHEIGHT
static EbmlSyntax matroska_blockmore[]
AVInputFormat ff_matroska_demuxer
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add an index entry into a sorted list.
#define MATROSKA_ID_CUETRACKPOSITION
#define MATROSKA_ID_CODECPRIVATE
const unsigned char ff_sipr_subpk_size[4]
#define MATROSKA_ID_TAGTARGETS_TYPE
#define AV_LOG_WARNING
Something somehow does not look correct.
static int ebml_level_end(MatroskaDemuxContext *matroska)
int64_t pos
byte position in stream, -1 if unknown
static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska, uint8_t *data, uint32_t size, int64_t *num)
char * av_strdup(const char *s) av_malloc_attrib
Duplicate the string s.
#define MATROSKA_ID_ENCODINGTYPE
#define MATROSKA_ID_AUDIOBITDEPTH
#define MATROSKA_ID_TRACKFLAGDEFAULT
static EbmlSyntax matroska_segments[]
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
MatroskaCluster current_cluster
AVCodecContext * codec
Codec context associated with this stream.
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
#define MATROSKA_ID_TAGTARGETS_ATTACHUID
int index
stream index in AVFormatContext
#define MATROSKA_ID_CLUSTERPOSITION
#define MATROSKA_ID_FILEDATA
#define EBML_ID_DOCTYPEREADVERSION
#define MATROSKA_ID_BLOCKREFERENCE
#define MATROSKA_ID_TRACKTYPE
int current_cluster_num_blocks
#define MATROSKA_ID_TAGTARGETS_CHAPTERUID
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
char * av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
Encode data to base64 and null-terminate.
static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size, int64_t pos, uint64_t cluster_time, uint64_t block_duration, int is_keyframe, uint8_t *additional, uint64_t additional_id, int additional_size, int64_t cluster_pos, uint64_t discard_padding)
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional FF_INPUT_BUFFER_PADDING_SIZE at the end w...
#define MATROSKA_ID_VIDEOASPECTRATIO
#define MATROSKA_ID_MUXINGAPP
#define MATROSKA_ID_AUDIOCHANNELS
MatroskaLevel levels[EBML_MAX_DEPTH]
static EbmlSyntax matroska_track_audio[]
#define MATROSKA_ID_CUECLUSTERPOSITION
#define MATROSKA_ID_EDITIONFLAGDEFAULT
#define MATROSKA_ID_CLUSTERTIMECODE
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
static EbmlSyntax matroska_tag[]
#define MATROSKA_ID_ENCODINGENCALGO
static EbmlSyntax matroska_attachment[]
#define MATROSKA_ID_CHAPTERTIMEEND
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
static EbmlSyntax matroska_track[]
#define MATROSKA_ID_TRACKCONTENTENCODINGS
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
void av_freep(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
#define AV_LZO_OUTPUT_FULL
decoded data did not fit into output buffer
if((e=av_dict_get(options,"", NULL, AV_DICT_IGNORE_SUFFIX)))
#define MATROSKA_ID_FILEDESC
#define MATROSKA_ID_TRACKCONTENTENCODING
#define MATROSKA_ID_CODECDOWNLOADURL
static EbmlSyntax matroska_track_operation[]
int ffio_limit(AVIOContext *s, int size)
#define MATROSKA_ID_CHAPLANG
MatroskaTrackOperation operation
#define MATROSKA_ID_EDITIONFLAGORDERED
#define MATROSKA_ID_TRACKLANGUAGE
MatroskaTrackCompression compression
const AVCodecTag ff_codec_movvideo_tags[]
static const uint8_t offset[511][2]
static av_cold int end(AVCodecContext *avctx)
#define MATROSKA_ID_VIDEOPIXELCROPT
#define MATROSKA_ID_TIMECODESCALE
static int matroska_aac_sri(int samplerate)
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
enum AVStreamParseType need_parsing
#define MATROSKA_ID_SIMPLEBLOCK
#define MATROSKA_ID_TAGTARGETS_TYPEVALUE
#define MATROSKA_ID_EDITIONFLAGHIDDEN
#define AV_LZO_OUTPUT_PADDING
static EbmlSyntax matroska_cluster[]
#define MATROSKA_ID_CODECNAME
#define MATROSKA_ID_BLOCKMORE
#define MATROSKA_ID_CUERELATIVEPOSITION
#define MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska)
#define MATROSKA_ID_VIDEODISPLAYWIDTH
#define MATROSKA_ID_EDITIONUID
#define MATROSKA_ID_BLOCKADDITIONS
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
static EbmlSyntax ebml_header[]
#define MATROSKA_ID_CODECDECODEALL
#define MATROSKA_ID_ENCODINGENCRYPTION
static av_cold int read_close(AVFormatContext *ctx)
const uint8_t ff_log2_tab[256]
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
#define MATROSKA_ID_TRACKNUMBER
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
#define MATROSKA_ID_SEGMENTUID
static EbmlSyntax matroska_tracks[]
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, void *data)
#define MATROSKA_ID_CUEBLOCKNUMBER
#define MATROSKA_ID_TRACKUID
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const
Rescale a 64-bit integer by 2 rational numbers.
static EbmlSyntax matroska_info[]
#define MATROSKA_ID_ENCODINGORDER
#define MATROSKA_ID_VIDEOSTEREOMODE
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
static EbmlSyntax matroska_blockadditions[]
AVCodecID
Identify the syntax and semantics of the bitstream.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);ff_audio_convert_init_arm(ac);ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_dlog(ac->avr,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> in
#define MATROSKA_ID_BLOCKDURATION
#define EBML_ID_EBMLREADVERSION
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags)
Get the index for a specific timestamp.
static int ebml_read_length(MatroskaDemuxContext *matroska, AVIOContext *pb, uint64_t *number)
Read a EBML length value.
void * priv_data
Format private data.
static EbmlSyntax matroska_index[]
int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
int64_t timestamp
Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are...
#define MATROSKA_ID_CLUSTER
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define MATROSKA_ID_FILEMIMETYPE
static int matroska_ebmlnum_uint(MatroskaDemuxContext *matroska, uint8_t *data, uint32_t size, uint64_t *num)
int64_t convergence_duration
Time difference in AVStream->time_base units from the pts of this packet to the point at which the ou...
#define MATROSKA_ID_WRITINGAPP
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
#define MATROSKA_ID_TAGDEFAULT_BUG
int cues_parsing_deferred
static EbmlSyntax matroska_clusters[]
static EbmlSyntax matroska_chapter[]
#define MATROSKA_ID_VIDEOPIXELCROPR
#define MATROSKA_ID_TRACKPLANEUID
#define MATROSKA_ID_ENCODINGCOMPSETTINGS
#define EBML_ID_EBMLMAXIDLENGTH
#define MATROSKA_ID_CHAPTERFLAGHIDDEN
AVRational avg_frame_rate
Average framerate.
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
#define av_unused
Disable warnings about deprecated features This is useful for sections of code kept for backward comp...
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
static EbmlSyntax matroska_attachments[]
int flags
A combination of AV_PKT_FLAG values.
static EbmlSyntax matroska_cluster_incremental_parsing[]
static void ebml_free(EbmlSyntax *syntax, void *data)
const CodecMime ff_mkv_mime_tags[]
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
int buf_size
Size of buf except extra allocated bytes.
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
static EbmlSyntax matroska_chapters[]
#define FF_ARRAY_ELEMS(a)
#define MATROSKA_ID_ENCODINGSIGHASHALGO
uint64_t skip_to_timecode
static int matroska_read_header(AVFormatContext *s)
static void matroska_parse_cues(MatroskaDemuxContext *matroska)
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
int bit_rate
the average bitrate
static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
#define EBML_ID_EBMLVERSION
uint8_t * data
The data buffer.
int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const
Rescale a 64-bit integer with rounding to nearest.
#define AV_BASE64_SIZE(x)
Calculate the output size needed to base64-encode x bytes to a null-terminated string.
#define AV_TIME_BASE
Internal time base represented as integer.
void * av_realloc(void *ptr, size_t size) 1(2)
Allocate or reallocate a block of memory.
#define MATROSKA_ID_TAGTARGETS
const AVCodecTag ff_codec_bmp_tags[]
#define MATROSKA_VIDEO_STEREO_PLANE_COUNT
#define MATROSKA_ID_TAGNAME
#define MATROSKA_ID_TRACKTIMECODESCALE
static int ebml_parse_elem(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, void *data)
static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb, int max_size, uint64_t *number)
int width
picture width / height.
const char *const ff_matroska_video_stereo_mode[MATROSKA_VIDEO_STEREO_MODE_COUNT]
#define MATROSKA_ID_CHAPTERFLAGENABLED
static EbmlSyntax matroska_track_encodings[]
static MatroskaTrack * matroska_find_track_by_num(MatroskaDemuxContext *matroska, int num)
void * av_malloc(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
#define MATROSKA_ID_SIMPLETAG
internal header for RIFF based (de)muxers do NOT include this in end user applications ...
static EbmlSyntax matroska_track_encoding[]
#define MATROSKA_ID_TRACKMAXCACHE
#define MATROSKA_ID_CHAPTERPHYSEQUIV
static int matroska_read_close(AVFormatContext *s)
static int ebml_read_ascii(AVIOContext *pb, int size, char **str)
static int matroska_decode_buffer(uint8_t **buf, int *buf_size, MatroskaTrack *track)
#define MATROSKA_ID_CHAPTERATOM
int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen)
Decodes LZO 1x compressed data.
#define MATROSKA_ID_VIDEOCOLORSPACE
static EbmlSyntax matroska_segment[]
#define MATROSKA_ID_CHAPTERS
static int matroska_probe(AVProbeData *p)
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
static void matroska_convert_tag(AVFormatContext *s, EbmlList *list, AVDictionary **metadata, char *prefix)
uint64_t max_block_additional_id
static int matroska_parse_frame(MatroskaDemuxContext *matroska, MatroskaTrack *track, AVStream *st, uint8_t *data, int pkt_size, uint64_t timecode, uint64_t lace_duration, int64_t pos, int is_keyframe, uint8_t *additional, uint64_t additional_id, int additional_size, uint64_t discard_padding)
#define MATROSKA_ID_AUDIOSAMPLINGFREQ
#define MATROSKA_ID_TRACKMINCACHE
static void matroska_metadata_creation_time(AVDictionary **metadata, int64_t date_utc)
static int read_header(FFV1Context *f)
static int matroska_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
static EbmlSyntax matroska_seekhead[]
static int matroska_parse_wavpack(MatroskaTrack *track, uint8_t *src, uint8_t **pdst, int *size)
#define MATROSKA_ID_TRACKPLANETYPE
int frame_size
Number of samples per channel in an audio frame.
int64_t current_cluster_pos
#define MATROSKA_ID_VIDEOPIXELCROPB
#define AV_LOG_INFO
Standard information.
AVBufferRef * av_buffer_alloc(int size)
Allocate an AVBuffer of the given size using av_malloc().
#define MATROSKA_ID_TRACKFLAGFORCED
enum AVMediaType codec_type
static EbmlSyntax matroska_track_plane[]
static int ebml_read_master(MatroskaDemuxContext *matroska, uint64_t length)
#define MATROSKA_ID_TAGDEFAULT
#define MATROSKA_ID_SEEKID
int sample_rate
samples per second
#define MATROSKA_ID_ENCODINGCOMPALGO
#define MATROSKA_ID_BLOCK
#define MATROSKA_ID_TAGTARGETS_TRACKUID
#define AV_EF_EXPLODE
abort decoding on minor error detection
#define MATROSKA_ID_TAGLANG
static EbmlSyntax matroska_tags[]
#define MATROSKA_ID_TRACKCOMBINEPLANES
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
#define MATROSKA_ID_TRACKFLAGENABLED
#define MATROSKA_ID_TRACKS
AVIOContext * pb
I/O context.
#define MATROSKA_ID_TRACKPLANE
Data found in BlockAdditional element of matroska container.
#define MATROSKA_ID_TRACKNAME
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
static EbmlSyntax matroska_cluster_incremental[]
#define MATROSKA_ID_SEEKENTRY
#define MKTAG(a, b, c, d)
#define MATROSKA_ID_EDITIONENTRY
#define MATROSKA_ID_BLOCKGROUP
#define MATROSKA_ID_VIDEOPIXELHEIGHT
rational number numerator/denominator
#define MATROSKA_ID_CUEDURATION
static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf, int *buf_size, int type, uint32_t **lace_buf, int *laces)
#define MATROSKA_ID_CUETIME
#define MATROSKA_ID_ENCODINGSIGALGO
static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt)
static EbmlSyntax matroska_blockgroup[]
static EbmlSyntax matroska_track_encoding_encryption[]
Recommmends skipping the specified number of samples.
static int ebml_parse(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, void *data)
#define MATROSKA_ID_ENCODINGSIGKEYID
#define MATROSKA_ID_TITLE
#define MATROSKA_ID_TRACKVIDEO
static EbmlSyntax matroska_track_combine_planes[]
int error
contains the error code or 0 if no error happened
This structure contains the data a format has to probe a file.
#define MKBETAG(a, b, c, d)
static int ebml_parse_id(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, uint32_t id, void *data)
static EbmlSyntax ebml_syntax[]
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes...
#define MATROSKA_ID_VIDEOFRAMERATE
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
static av_const int sign_extend(int val, unsigned bits)
#define MATROSKA_ID_ATTACHMENTS
#define MATROSKA_ID_TRACKOPERATION
#define MATROSKA_ID_CHAPTERDISPLAY
static void * av_malloc_array(size_t nmemb, size_t size)
#define MATROSKA_ID_FILENAME
#define MATROSKA_ID_BLOCKADDITIONAL
const int avpriv_mpeg4audio_sample_rates[16]
const AVMetadataConv ff_mkv_metadata_conv[]
#define MATROSKA_ID_CODECID
static EbmlSyntax matroska_clusters_incremental[]
#define MATROSKA_ID_VIDEOALPHAMODE
A reference to a data buffer.
void ff_rm_reorder_sipr_data(uint8_t *buf, int sub_packet_h, int framesize)
Perform 4-bit block reordering for SIPR data.
#define MATROSKA_ID_ENCODINGENCAESSETTINGS
#define MATROSKA_ID_CUETRACK
static EbmlSyntax matroska_track_encoding_compression[]
#define MATROSKA_ID_SEEKPOSITION
static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
#define MATROSKA_ID_CODECDELAY
#define MATROSKA_ID_CHAPTERTIMESTART
static av_always_inline double av_int2double(uint64_t i)
Reinterpret a 64-bit integer as a double.
int ffio_init_context(AVIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
union EbmlSyntax::@149 def
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base...
int error_recognition
Error recognition; higher values will detect more errors but may misdetect some more or less valid pa...
int disposition
AV_DISPOSITION_* bit field.
static EbmlSyntax matroska_seekhead_entry[]
int av_grow_packet(AVPacket *pkt, int grow_by)
Increase packet size, correctly zeroing padding.
#define MATROSKA_ID_ENCODINGSIGNATURE
#define MATROSKA_ID_SEGMENT
static EbmlSyntax matroska_tagtargets[]
The optional settings (rendering instructions) that immediately follow the timestamp specifier of a W...
#define MATROSKA_ID_SEEKHEAD
ASS as defined in Matroska.
static int matroska_parse_webvtt(MatroskaDemuxContext *matroska, MatroskaTrack *track, AVStream *st, uint8_t *data, int data_len, uint64_t timecode, uint64_t duration, int64_t pos)
void av_codec_set_seek_preroll(AVCodecContext *avctx, int val)
int skip_to_keyframe
Indicates that everything up to the next keyframe should be discarded.
#define MATROSKA_ID_ENCODINGCOMPRESSION
#define MATROSKA_ID_CLUSTERPREVSIZE
#define AVERROR_INVALIDDATA
#define MATROSKA_ID_POINTENTRY
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);ff_audio_convert_init_arm(ac);ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_dlog(ac->avr,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> out
int channels
number of audio channels
#define MATROSKA_VIDEO_STEREO_MODE_COUNT
#define MATROSKA_ID_FILEUID
#define MATROSKA_ID_VIDEOPIXELCROPL
#define MATROSKA_ID_CHAPTERUID
Opaque data information usually sparse.
static EbmlSyntax matroska_index_entry[]
static int ebml_read_binary(AVIOContext *pb, int length, EbmlBin *bin)
#define MATROSKA_ID_VIDEODISPLAYUNIT
static int ebml_read_uint(AVIOContext *pb, int size, uint64_t *num)
#define MATROSKA_ID_TRACKMAXBLKADDID
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
#define EBML_ID_EBMLMAXSIZELENGTH
int64_t duration
Decoding: duration of the stream, in AV_TIME_BASE fractional seconds.
MatroskaTrackEncryption encryption
#define MATROSKA_ID_CHAPSTRING
#define MATROSKA_ID_TAGSTRING
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static EbmlSyntax matroska_index_pos[]
static int ebml_read_float(AVIOContext *pb, int size, double *num)
#define MATROSKA_ID_DURATION
static int matroska_aac_profile(char *codec_id)
#define EBML_ID_DOCTYPEVERSION
static void matroska_clear_queue(MatroskaDemuxContext *matroska)
static EbmlSyntax matroska_chapter_entry[]
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
AVRational r_frame_rate
Real base framerate of the stream.
#define MATROSKA_ID_ATTACHEDFILE
This structure stores compressed data.
static EbmlSyntax matroska_chapter_display[]
#define MATROSKA_ID_CODECSTATE
uint64_t default_duration
#define MATROSKA_ID_CODECINFOURL
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define MATROSKA_ID_VIDEOPIXELWIDTH
static void matroska_add_index_entries(MatroskaDemuxContext *matroska)
#define MATROSKA_ID_TRACKAUDIO
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define MATROSKA_ID_ENCODINGSCOPE
const CodecTags ff_mkv_codec_tags[]
void * av_mallocz(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
#define MATROSKA_ID_ENCODINGENCKEYID
#define MATROSKA_ID_DISCARDPADDING
static const char *const matroska_doctypes[]
static EbmlSyntax matroska_track_video[]