71 #define EBML_UNKNOWN_LENGTH UINT64_MAX 72 #define NEEDS_CHECKING 2 76 #define SKIP_THRESHOLD 1024 * 1024 79 #define UNKNOWN_EQUIV 50 * 1024 393 #define CHILD_OF(parent) { .def = { .n = parent } } 445 CHILD_OF(matroska_track_video_color)
448 static EbmlSyntax matroska_track_video_color[] = {
521 static EbmlSyntax matroska_track_encoding[] = {
530 static EbmlSyntax matroska_track_encodings[] = {
538 CHILD_OF(matroska_track_combine_planes)
541 static EbmlSyntax matroska_track_combine_planes[] = {
546 static EbmlSyntax matroska_track_operation[] = {
607 static EbmlSyntax matroska_chapter_entry[] = {
717 static EbmlSyntax matroska_blockadditions[] = {
735 static EbmlSyntax matroska_cluster_parsing[] = {
779 uint32_t
id, int64_t position)
808 "Seek to desired resync point failed. Seeking to " 809 "earliest point available instead.\n");
811 last_pos + 1), SEEK_SET);
847 int max_size, uint64_t *number,
int eof_forbidden)
861 if (!total || read > max_size) {
865 "0x00 at pos %"PRId64
" (0x%"PRIx64
") invalid as first byte " 866 "of an EBML number\n", pos, pos);
869 "Length %d indicated by an EBML number's first byte 0x%02x " 870 "at pos %"PRId64
" (0x%"PRIx64
") exceeds max length %d.\n",
871 read, (
uint8_t) total, pos, pos, max_size);
879 total = (total << 8) |
avio_r8(pb);
894 "Read error at pos. %"PRIu64
" (0x%"PRIx64
")\n",
900 "at pos. %"PRIu64
" (0x%"PRIx64
")\n", pos, pos);
915 if (res > 0 && *number + 1 == 1ULL << (7 * res))
931 *num = (*num << 8) |
avio_r8(pb);
951 *num = ((uint64_t)*num << 8) |
avio_r8(pb);
1032 uint64_t length, int64_t
pos)
1064 *num = unum - ((1LL << (7 * res - 1)) - 1);
1078 for (i = 0; syntax[
i].
id; i++)
1079 if (
id == syntax[i].
id)
1091 for (
int i = 0; syntax[
i].
id;
i++)
1092 switch (syntax[
i].
type) {
1133 return id && (bits + 7) / 8 == (8 - bits % 8);
1141 uint32_t
id, int64_t
pos)
1213 "at pos. %"PRIu64
" (0x%"PRIx64
")\n", pos, pos);
1220 pos_alt = pos + res;
1233 while (syntax->
def.
n) {
1243 "%"PRId64
"\n",
id, pos);
1260 list->
elem = newelem;
1277 uint64_t elem_end = pos_alt + length,
1280 if (elem_end < level_end) {
1282 }
else if (elem_end == level_end) {
1286 "Element at 0x%"PRIx64
" ending at 0x%"PRIx64
" exceeds " 1287 "containing master element ending at 0x%"PRIx64
"\n",
1288 pos, elem_end, level_end);
1295 "at 0x%"PRIx64
" inside parent with finite size\n", pos);
1305 "Found unknown-length element 0x%"PRIX32
" other than " 1306 "a cluster at 0x%"PRIx64
". Spec-incompliant, but " 1307 "parsing will nevertheless be attempted.\n",
id, pos);
1314 if (max_lengths[syntax->
type] && length > max_lengths[syntax->
type]) {
1317 "Invalid length 0x%"PRIx64
" > 0x%"PRIx64
" for element " 1318 "with ID 0x%"PRIX32
" at 0x%"PRIx64
"\n",
1319 length, max_lengths[syntax->
type],
id, pos);
1322 "Element with ID 0x%"PRIX32
" at pos. 0x%"PRIx64
" has " 1323 "unknown length, yet the length of an element of its " 1324 "type must be known.\n",
id, pos);
1327 "Found unknown-length element with ID 0x%"PRIX32
" at " 1328 "pos. 0x%"PRIx64
" for which no syntax for parsing is " 1329 "available.\n",
id, pos);
1366 "Unknown element %"PRIX32
" at pos. 0x%"PRIx64
" with " 1367 "length 0x%"PRIx64
" considered as invalid data. Last " 1368 "known good position 0x%"PRIx64
", %d unknown elements" 1369 " in a row\n",
id, pos, length, matroska->
resync_pos,
1376 if (update_pos > 0) {
1387 switch (syntax->
type) {
1414 if (!level1_elem->
pos) {
1417 }
else if (level1_elem->
pos != pos)
1435 if ((res2 =
avio_skip(pb, length - 1)) >= 0) {
1490 for (i = 0; syntax[
i].
id; i++) {
1491 void *data_off = (
char *) data + syntax[i].
data_offset;
1492 switch (syntax[i].
type) {
1504 char *ptr = list->
elem;
1505 for (j = 0; j < list->
nb_elem;
1525 int len_mask = 0x80,
size = 1,
n = 1,
i;
1533 while (
size <= 8 && !(total & len_mask)) {
1539 total &= (len_mask - 1);
1541 total = (total << 8) | p->
buf[4 +
n++];
1543 if (total + 1 == 1ULL << (7 *
size)){
1558 if (total < probelen)
1560 for (
n = 4 +
size;
n <= 4 +
size + total - probelen;
n++)
1576 if (tracks[i].num == num)
1588 int isize = *buf_size;
1591 int pkt_size = isize;
1595 if (pkt_size >= 10000000
U)
1598 switch (encodings[0].compression.algo) {
1604 if (header_size && !header) {
1612 pkt_size = isize + header_size;
1617 memcpy(pkt_data, header, header_size);
1618 memcpy(pkt_data + header_size, data, isize);
1625 olen = pkt_size *= 3;
1632 pkt_data = newpktdata;
1645 z_stream zstream = { 0 };
1646 if (!pkt_size || inflateInit(&zstream) != Z_OK)
1648 zstream.next_in =
data;
1649 zstream.avail_in = isize;
1654 inflateEnd(&zstream);
1658 pkt_data = newpktdata;
1659 zstream.avail_out = pkt_size - zstream.total_out;
1660 zstream.next_out = pkt_data + zstream.total_out;
1661 result =
inflate(&zstream, Z_NO_FLUSH);
1662 }
while (result == Z_OK && pkt_size < 10000000);
1663 pkt_size = zstream.total_out;
1664 inflateEnd(&zstream);
1665 if (result != Z_STREAM_END) {
1666 if (result == Z_MEM_ERROR)
1678 bz_stream bzstream = { 0 };
1679 if (!pkt_size || BZ2_bzDecompressInit(&bzstream, 0, 0) != BZ_OK)
1681 bzstream.next_in =
data;
1682 bzstream.avail_in = isize;
1687 BZ2_bzDecompressEnd(&bzstream);
1691 pkt_data = newpktdata;
1692 bzstream.avail_out = pkt_size - bzstream.total_out_lo32;
1693 bzstream.next_out = pkt_data + bzstream.total_out_lo32;
1694 result = BZ2_bzDecompress(&bzstream);
1695 }
while (result == BZ_OK && pkt_size < 10000000);
1696 pkt_size = bzstream.total_out_lo32;
1697 BZ2_bzDecompressEnd(&bzstream);
1698 if (result != BZ_STREAM_END) {
1699 if (result == BZ_MEM_ERROR)
1715 *buf_size = pkt_size;
1730 for (i = 0; i < list->
nb_elem; i++) {
1731 const char *lang = tags[
i].
lang &&
1732 strcmp(tags[i].lang,
"und") ? tags[
i].
lang :
NULL;
1734 if (!tags[i].
name) {
1739 snprintf(key,
sizeof(key),
"%s/%s", prefix, tags[i].name);
1742 if (tags[i].
def || !lang) {
1744 if (tags[i].sub.nb_elem)
1751 if (tags[i].sub.nb_elem)
1765 if (tags[i].target.attachuid) {
1769 if (attachment[j].
uid == tags[i].target.attachuid &&
1772 &attachment[j].stream->metadata,
NULL);
1778 "The tags at index %d refer to a " 1779 "non-existent attachment %"PRId64
".\n",
1780 i, tags[i].target.attachuid);
1782 }
else if (tags[i].target.chapteruid) {
1786 if (chapter[j].
uid == tags[i].target.chapteruid &&
1789 &chapter[j].chapter->metadata,
NULL);
1795 "The tags at index %d refer to a non-existent chapter " 1797 i, tags[i].target.chapteruid);
1799 }
else if (tags[i].target.trackuid) {
1803 if (track[j].
uid == tags[i].target.trackuid &&
1806 &track[j].stream->metadata,
NULL);
1812 "The tags at index %d refer to a non-existent track " 1814 i, tags[i].target.trackuid);
1837 "Max EBML element depth (%d) reached, " 1845 ret =
ebml_parse(matroska, matroska_segment, matroska);
1870 for (i = 0; i < seekhead_list->
nb_elem; i++) {
1872 uint32_t
id = seekheads[
i].
id;
1880 if (!elem || elem->
parsed)
1903 uint64_t index_scale = 1;
1909 index_list = &matroska->
index;
1910 index = index_list->
elem;
1913 if (index[1].time > 1E14 / matroska->
time_scale) {
1917 for (i = 0; i < index_list->
nb_elem; i++) {
1920 for (j = 0; j < pos_list->
nb_elem; j++) {
1923 if (track && track->stream)
1926 index[i].
time / index_scale, 0, 0,
1953 static const char *
const aac_profiles[] = {
"MAIN",
"LC",
"SSR" };
1956 for (profile = 0; profile <
FF_ARRAY_ELEMS(aac_profiles); profile++)
1957 if (strstr(codec_id, aac_profiles[profile]))
1999 int block_last, block_type, block_size;
2005 if (block_size > size)
2014 chmask =
av_dict_get(dict,
"WAVEFORMATEXTENSIBLE_CHANNEL_MASK",
NULL, 0);
2017 if (!mask || mask & ~0x3ffffULL) {
2019 "Invalid value of WAVEFORMATEXTENSIBLE_CHANNEL_MASK\n");
2039 if (matroska->
muxingapp && sscanf(matroska->
muxingapp,
"Lavf%d.%d.%d", &major, &minor, µ) == 3)
2040 bttb = (major == 57 && minor >= 36 && minor <= 51 && micro >= 100);
2042 switch (field_order) {
2061 int *h_width,
int *h_height)
2063 switch (stereo_mode) {
2088 int has_mastering_primaries, has_mastering_luminance;
2095 has_mastering_primaries =
2096 mastering_meta->
r_x > 0 && mastering_meta->
r_y > 0 &&
2097 mastering_meta->
g_x > 0 && mastering_meta->
g_y > 0 &&
2098 mastering_meta->
b_x > 0 && mastering_meta->
b_y > 0 &&
2100 has_mastering_luminance = mastering_meta->
max_luminance > 0;
2133 metadata->MaxCLL = color->
max_cll;
2134 metadata->MaxFALL = color->
max_fall;
2137 if (has_mastering_primaries || has_mastering_luminance) {
2146 if (has_mastering_primaries) {
2157 if (has_mastering_luminance) {
2173 size_t spherical_size;
2174 uint32_t l = 0, t = 0,
r = 0,
b = 0;
2175 uint32_t padding = 0;
2178 if (mkv_projection->
private.
size && priv_data[0] != 0) {
2191 if (
b >= UINT_MAX - t ||
r >= UINT_MAX - l) {
2193 "Invalid bounding rectangle coordinates " 2194 "%"PRIu32
",%"PRIu32
",%"PRIu32
",%"PRIu32
"\n",
2203 if (l || t ||
r ||
b)
2216 "Unknown spherical cubemap layout %"PRIu32
"\n", layout);
2220 padding =
AV_RB32(priv_data + 8);
2231 "Unknown spherical metadata type %"PRIu64
"\n",
2305 int extradata_size = 0;
2306 int extradata_offset = 0;
2309 char* key_id_base64 =
NULL;
2318 "Unknown or unsupported track type %"PRIu64
"\n",
2337 "Invalid sample rate %f, defaulting to 8000 instead.\n",
2345 if (default_duration > UINT64_MAX || default_duration < 0) {
2347 "Invalid frame rate %e. Cannot calculate default duration.\n",
2363 if (encodings_list->
nb_elem > 1) {
2365 "Multiple combined encodings not supported");
2366 }
else if (encodings_list->
nb_elem == 1) {
2367 if (encodings[0].
type) {
2368 if (encodings[0].encryption.key_id.size > 0) {
2371 const int b64_size =
AV_BASE64_SIZE(encodings[0].encryption.key_id.size);
2373 if (key_id_base64 ==
NULL)
2377 encodings[0].encryption.key_id.data,
2380 encodings[0].
scope = 0;
2382 "Unsupported encoding type");
2395 encodings[0].
scope = 0;
2397 "Unsupported encoding type");
2407 "Failed to decode codec private data\n");
2426 encodings[0].
scope & 1 &&
2445 if (key_id_base64) {
2451 if (!strcmp(track->
codec_id,
"V_MS/VFW/FOURCC") &&
2462 extradata_offset = 40;
2463 }
else if (!strcmp(track->
codec_id,
"A_MS/ACM") &&
2476 }
else if (!strcmp(track->
codec_id,
"A_QUICKTIME")
2480 uint16_t sample_size;
2486 if (sample_size == 8) {
2487 fourcc =
MKTAG(
'r',
'a',
'w',
' ');
2489 }
else if (sample_size == 16) {
2490 fourcc =
MKTAG(
't',
'w',
'o',
's');
2494 if ((fourcc ==
MKTAG(
't',
'w',
'o',
's') ||
2495 fourcc ==
MKTAG(
's',
'o',
'w',
't')) &&
2498 }
else if (!strcmp(track->
codec_id,
"V_QUICKTIME") &&
2505 fourcc =
MKTAG(
'S',
'V',
'Q',
'3');
2554 extradata[0] = (profile << 3) | ((sri & 0x0E) >> 1);
2555 extradata[1] = ((sri & 0x01) << 7) | (track->
audio.
channels << 3);
2556 if (strstr(track->
codec_id,
"SBR")) {
2558 extradata[2] = 0x56;
2559 extradata[3] = 0xE5;
2560 extradata[4] = 0x80 | (sri << 3);
2573 AV_WB32(extradata, extradata_size);
2574 memcpy(&extradata[4],
"alac", 4);
2583 "Too large audio channel number %"PRIu64
2584 " or bitdepth %"PRIu64
". Skipping track.\n",
2593 extradata_size = 22;
2598 bytestream_put_be32(&ptr,
AV_RB32(
"TTA1"));
2599 bytestream_put_le16(&ptr, 1);
2610 extradata_offset = 26;
2644 static const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
2653 extradata_offset = 78;
2665 "in absence of valid CodecPrivate.\n");
2680 extradata_offset = 4;
2686 "Unknown/unsupported AVCodecID %s.\n", track->
codec_id);
2691 1000 * 1000 * 1000);
2700 if (strcmp(track->
language,
"und"))
2724 int display_width_mul = 1;
2725 int display_height_mul = 1;
2756 #if FF_API_R_FRAME_RATE 2776 snprintf(buf,
sizeof(buf),
"%s_%d",
2779 if (planes[j].
uid == tracks[k].
uid && tracks[k].stream) {
2781 "stereo_mode", buf, 0);
2815 (
AVRational){1, st->codecpar->codec_id == AV_CODEC_ID_OPUS ?
2816 48000 : st->codecpar->sample_rate});
2826 if (!strcmp(track->
codec_id,
"D_WEBVTT/CAPTIONS")) {
2828 }
else if (!strcmp(track->
codec_id,
"D_WEBVTT/DESCRIPTIONS")) {
2830 }
else if (!strcmp(track->
codec_id,
"D_WEBVTT/METADATA")) {
2848 uint64_t max_start = 0;
2863 ebml.
max_size >
sizeof(uint64_t) ||
2867 "EBML version %"PRIu64
", doctype %s, doc version %"PRIu64,
2873 "EBML header using unsupported features\n" 2874 "(EBML version %"PRIu64
", doctype %s, doc version %"PRIu64
")\n",
2891 res =
ebml_parse(matroska, matroska_segments, matroska);
2898 res =
ebml_parse(matroska, matroska_segment, matroska);
2924 attachments = attachments_list->
elem;
2925 for (j = 0; j < attachments_list->
nb_elem; j++) {
2926 if (!(attachments[j].filename && attachments[j].mime &&
2927 attachments[j].bin.data && attachments[j].
bin.
size > 0)) {
2935 if (attachments[j].description)
2940 if (!strncmp(mkv_image_mime_tags[i].
str, attachments[j].mime,
2941 strlen(mkv_image_mime_tags[i].str))) {
2947 attachments[j].
stream = st;
2970 if (!strncmp(mkv_mime_tags[i].
str, attachments[j].mime,
2971 strlen(mkv_mime_tags[i].str))) {
2980 chapters = chapters_list->
elem;
2981 for (i = 0; i < chapters_list->
nb_elem; i++)
2983 (max_start == 0 || chapters[i].start > max_start)) {
2989 max_start = chapters[
i].
start;
3009 if (matroska->
queue) {
3040 uint32_t lace_size[256],
int *laces)
3047 lace_size[0] =
size;
3063 for (n = 0; n < *laces - 1; n++) {
3071 lace_size[
n] +=
temp;
3074 }
while (temp == 0xff);
3079 lace_size[
n] = size - total;
3084 if (size % (*laces))
3086 for (n = 0; n < *laces; n++)
3087 lace_size[n] = size / *laces;
3104 total = lace_size[0] = num;
3106 for (n = 1; n < *laces - 1; n++) {
3112 if (lace_size[n - 1] + snum > (uint64_t)INT_MAX)
3115 lace_size[
n] = lace_size[n - 1] + snum;
3116 total += lace_size[
n];
3124 lace_size[*laces - 1] = size - total;
3151 if (size < cfs * h / 2) {
3153 "Corrupt int4 RM-style audio packet size\n");
3156 for (x = 0; x < h / 2; x++)
3157 memcpy(track->
audio.
buf + x * 2 * w + y * cfs,
3158 data + x * cfs, cfs);
3162 "Corrupt sipr RM-style audio packet size\n");
3165 memcpy(track->
audio.
buf + y * w, data, w);
3169 "Corrupt generic RM-style audio packet size\n");
3172 for (x = 0; x < w /
sps; x++)
3174 sps * (h * x + ((h + 1) / 2) * (y & 1) + (y >> 1)),
3175 data + x * sps, sps);
3233 while (srclen >= 8) {
3239 uint32_t crc =
AV_RL32(src + 4);
3243 multiblock = (flags & 0x1800) != 0x1800;
3255 if (blocksize > srclen) {
3266 dstlen += blocksize + 32;
3269 AV_WL32(dst + offset + 4, blocksize + 24);
3270 AV_WL16(dst + offset + 8, ver);
3271 AV_WL16(dst + offset + 10, 0);
3272 AV_WL32(dst + offset + 12, 0);
3273 AV_WL32(dst + offset + 16, 0);
3274 AV_WL32(dst + offset + 20, samples);
3275 AV_WL32(dst + offset + 24, flags);
3276 AV_WL32(dst + offset + 28, crc);
3277 memcpy(dst + offset + 32, src, blocksize);
3280 srclen -= blocksize;
3281 offset += blocksize + 32;
3300 int dstlen = *size + 8;
3308 memcpy(dst + 8, *data, dstlen - 8);
3327 int id_len, settings_len, text_len;
3335 q = data + data_len;
3340 if (*p ==
'\r' || *p ==
'\n') {
3349 if (p >= q || *p !=
'\n')
3356 if (*p ==
'\r' || *p ==
'\n') {
3357 settings_len = p - settings;
3365 if (p >= q || *p !=
'\n')
3371 while (text_len > 0) {
3372 const int len = text_len - 1;
3374 if (c !=
'\r' && c !=
'\n')
3387 memcpy(pkt->
data, text, text_len);
3397 memcpy(buf,
id, id_len);
3400 if (settings_len > 0) {
3408 memcpy(buf, settings, settings_len);
3415 pkt->
pts = timecode;
3435 uint64_t timecode, uint64_t lace_duration,
3437 uint8_t *additional, uint64_t additional_id,
int additional_size,
3438 int64_t discard_padding)
3448 "Error parsing a wavpack block.\n");
3461 "Error parsing a prores block.\n");
3469 if (!pkt_size && !additional_size)
3484 pkt->
data = pkt_data;
3485 pkt->
size = pkt_size;
3489 if (additional_size > 0) {
3492 additional_size + 8);
3497 AV_WB64(side_data, additional_id);
3498 memcpy(side_data + 8, additional, additional_size);
3501 if (discard_padding) {
3512 if (discard_padding > 0) {
3513 AV_WL32(side_data + 4, discard_padding);
3515 AV_WL32(side_data, -discard_padding);
3520 pkt->
dts = timecode;
3522 pkt->
pts = timecode;
3526 #if FF_API_CONVERGENCE_DURATION 3529 pkt->convergence_duration = lace_duration;
3550 int size, int64_t
pos, uint64_t cluster_time,
3552 uint8_t *additional, uint64_t additional_id,
int additional_size,
3553 int64_t cluster_pos, int64_t discard_padding)
3561 uint32_t lace_size[256];
3564 int trust_default_duration = 1;
3574 if (!track || size < 3)
3577 if (!(st = track->
stream)) {
3579 "No stream associated to TrackNumber %"PRIu64
". " 3580 "Ignoring Block with this TrackNumber.\n", num);
3586 if (block_duration > INT64_MAX)
3587 block_duration = INT64_MAX;
3593 if (is_keyframe == -1)
3596 if (cluster_time != (uint64_t) -1 &&
3597 (block_time >= 0 || cluster_time >= -block_time)) {
3600 timecode < track->end_timecode)
3625 &pb, lace_size, &laces);
3635 trust_default_duration = 0;
3639 if (!block_duration && trust_default_duration)
3642 if (cluster_time != (uint64_t)-1 && (block_time >= 0 || cluster_time >= -block_time))
3646 for (n = 0; n < laces; n++) {
3647 int64_t lace_duration = block_duration*(n+1) / laces - block_duration*n / laces;
3673 timecode, lace_duration,
3681 out_size, timecode, lace_duration,
3682 pos, !n ? is_keyframe : 0,
3683 additional, additional_id, additional_size,
3690 timecode = lace_duration ? timecode + lace_duration :
AV_NOPTS_VALUE;
3691 data += lace_size[
n];
3712 res =
ebml_parse(matroska, matroska_cluster_enter, cluster);
3720 res =
ebml_parse(matroska, matroska_cluster_parsing, cluster);
3722 if (res >= 0 && block->
bin.
size > 0) {
3736 memset(block, 0,
sizeof(*block));
3742 "end of segment.\n");
3774 int64_t timestamp,
int flags)
3872 return (
CueDesc) {-1, -1, -1, -1};
3873 for (i = 1; i < nb_index_entries; i++) {
3874 if (index_entries[i - 1].timestamp * matroska->
time_scale <= ts &&
3882 if (i != nb_index_entries - 1) {
3899 int64_t cluster_pos, before_pos;
3904 if (index < 0)
return 0;
3908 uint64_t cluster_id, cluster_length;
3914 if (read < 0 || cluster_id != 0xF43B675)
3928 cluster_pos += 4 + read + cluster_length;
3942 double min_buffer,
double*
buffer,
3946 double nano_seconds_per_second = 1000000000.0;
3947 double time_sec = time_ns / nano_seconds_per_second;
3949 int64_t time_to_search_ns = (int64_t)(search_sec * nano_seconds_per_second);
3950 int64_t end_time_ns = time_ns + time_to_search_ns;
3951 double sec_downloaded = 0.0;
3955 *sec_to_download = 0.0;
3959 int64_t cue_nano = desc_curr.
end_time_ns - time_ns;
3962 double timeToDownload = (cueBytes * 8.0) /
bps;
3964 sec_downloaded += (cue_nano / nano_seconds_per_second) - timeToDownload;
3965 *sec_to_download += timeToDownload;
3969 double desc_end_time_sec = desc_curr.
end_time_ns / nano_seconds_per_second;
3970 double percent_to_sub = search_sec / (desc_end_time_sec - time_sec);
3971 sec_downloaded = percent_to_sub * sec_downloaded;
3972 *sec_to_download = percent_to_sub * *sec_to_download;
3975 if ((sec_downloaded + *buffer) <= min_buffer) {
3986 double desc_sec = desc_ns / nano_seconds_per_second;
3987 double bits = (desc_bytes * 8.0);
3988 double time_to_download = bits /
bps;
3990 sec_downloaded += desc_sec - time_to_download;
3991 *sec_to_download += time_to_download;
3994 double desc_end_time_sec = desc_curr.
end_time_ns / nano_seconds_per_second;
3995 double percent_to_sub = search_sec / (desc_end_time_sec - time_sec);
3996 sec_downloaded = percent_to_sub * sec_downloaded;
3997 *sec_to_download = percent_to_sub * *sec_to_download;
3999 if ((sec_downloaded + *buffer) <= min_buffer)
4004 if ((sec_downloaded + *buffer) <= min_buffer) {
4011 *buffer = *buffer + sec_downloaded;
4026 double bandwidth = 0.0;
4030 int64_t prebuffer_ns = 1000000000;
4032 double nano_seconds_per_second = 1000000000.0;
4033 int64_t prebuffered_ns = time_ns + prebuffer_ns;
4034 double prebuffer_bytes = 0.0;
4035 int64_t temp_prebuffer_ns = prebuffer_ns;
4036 int64_t pre_bytes, pre_ns;
4037 double pre_sec, prebuffer, bits_per_second;
4055 bits_per_second = 0.0;
4063 pre_sec = pre_ns / nano_seconds_per_second;
4065 pre_bytes * ((temp_prebuffer_ns / nano_seconds_per_second) / pre_sec);
4067 prebuffer = prebuffer_ns / nano_seconds_per_second;
4070 bits_per_second = 0.0;
4074 double desc_sec, calc_bits_per_second, percent, mod_bits_per_second;
4075 if (desc_bytes <= 0)
4078 desc_sec = desc_ns / nano_seconds_per_second;
4079 calc_bits_per_second = (desc_bytes * 8) / desc_sec;
4082 percent = (desc_bytes - prebuffer_bytes) / desc_bytes;
4083 mod_bits_per_second = calc_bits_per_second * percent;
4085 if (prebuffer < desc_sec) {
4091 int64_t
bps = (int64_t)(mod_bits_per_second) + 1;
4092 const double min_buffer = 0.0;
4093 double buffer = prebuffer;
4094 double sec_to_download = 0.0;
4097 min_buffer, &buffer, &sec_to_download,
4101 }
else if (rv == 0) {
4102 bits_per_second = (double)(bps);
4110 if (bandwidth < bits_per_second) bandwidth = bits_per_second;
4112 return (int64_t)bandwidth;
4121 int64_t cues_start = -1, cues_end = -1, before_pos, bandwidth;
4126 for (i = 0; i < seekhead_list->
nb_elem; i++)
4130 if (i >= seekhead_list->
nb_elem)
return -1;
4134 if (
avio_seek(matroska->
ctx->
pb, cues_start, SEEK_SET) == cues_start) {
4138 uint64_t cues_length, cues_id;
4146 cues_end = cues_start + 4 + bytes_read + cues_length - 1;
4149 if (cues_start == -1 || cues_end == -1)
return -1;
4162 if (cues_start <= init_range)
4167 if (bandwidth < 0)
return -1;
4176 if (!buf)
return -1;
4228 buf = strrchr(s->
url,
'/');
4260 #define OFFSET(x) offsetof(MatroskaDemuxContext, x) 4275 .
name =
"matroska,webm",
4277 .extensions =
"mkv,mk3d,mka,mks",
4284 .mime_type =
"audio/webm,audio/x-matroska,video/webm,video/x-matroska" 4288 .
name =
"webm_dash_manifest",
4294 .priv_class = &webm_dash_class,
int32_t pitch
Rotation around the right vector [-90, 90].
#define MATROSKA_ID_SEEKPREROLL
#define MATROSKA_ID_VIDEOPROJECTIONPOSEYAW
AVSphericalMapping * av_spherical_alloc(size_t *size)
Allocate a AVSphericalVideo structure and initialize its fields to default values.
uint64_t codec_delay_in_track_tb
enum AVChromaLocation chroma_location
static EbmlSyntax matroska_simpletag[]
#define MATROSKA_ID_BLOCKADDID
#define MATROSKA_ID_TRACKDEFAULTDURATION
enum AVFieldOrder field_order
Video only.
static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska, MatroskaTrack *track, AVStream *st, uint8_t *data, int size, uint64_t timecode, int64_t pos)
enum AVColorTransferCharacteristic color_trc
#define MATROSKA_ID_VIDEOFLAGINTERLACED
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define MATROSKA_ID_VIDEOCOLOR_GX
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
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...
The optional first identifier line of a WebVTT cue.
#define MATROSKA_ID_TRACKFLAGLACING
static int webm_dash_manifest_read_packet(AVFormatContext *s, AVPacket *pkt)
#define MATROSKA_ID_TRACKENTRY
static int matroska_deliver_packet(MatroskaDemuxContext *matroska, AVPacket *pkt)
static const CodecMime mkv_image_mime_tags[]
#define MATROSKA_ID_VIDEODISPLAYHEIGHT
static EbmlSyntax matroska_blockmore[]
AVInputFormat ff_matroska_demuxer
static int is_keyframe(NalUnitType naltype)
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_VIDEOPROJECTIONPOSEROLL
#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 EbmlSyntax matroska_track_video[19]
#define LIBAVUTIL_VERSION_INT
#define INITIALIZATION_RANGE
unsigned char * buf_ptr
Current position in the buffer.
int64_t pos
byte position in stream, -1 if unknown
static int webm_clusters_start_with_keyframe(AVFormatContext *s)
#define MATROSKA_ID_ENCODINGTYPE
#define MATROSKA_ID_AUDIOBITDEPTH
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
#define MATROSKA_ID_TRACKFLAGDEFAULT
static int segment_start(AVFormatContext *s, int write_header)
static EbmlSyntax matroska_segments[]
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
MatroskaCluster current_cluster
Video represents a portion of a sphere mapped on a flat surface using equirectangular projection...
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
#define MATROSKA_ID_TAGTARGETS_ATTACHUID
int index
stream index in AVFormatContext
static EbmlSyntax matroska_track_video_projection[]
#define MATROSKA_ID_CLUSTERPOSITION
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
#define MATROSKA_ID_FILEDATA
const char * av_default_item_name(void *ptr)
Return the context name.
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
MatroskaTrackVideoProjection projection
AVFormatInternal * internal
An opaque field for libavformat internal usage.
#define EBML_ID_DOCTYPEREADVERSION
#define MATROSKA_ID_BLOCKREFERENCE
#define MATROSKA_ID_TRACKTYPE
unsigned char * buffer
Start of the buffer.
#define MATROSKA_ID_TAGTARGETS_CHAPTERUID
#define MATROSKA_ID_VIDEOCOLOR_RX
Video represents a sphere mapped on a flat surface using equirectangular projection.
#define MATROSKA_ID_VIDEOASPECTRATIO
uint64_t chroma_siting_vert
#define MATROSKA_ID_MUXINGAPP
#define MATROSKA_ID_AUDIOCHANNELS
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
static EbmlSyntax matroska_index[2]
#define MATROSKA_ID_VIDEOPROJECTIONTYPE
MatroskaLevel levels[EBML_MAX_DEPTH]
static EbmlSyntax matroska_track_audio[]
#define MATROSKA_ID_CUECLUSTERPOSITION
#define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX
static int ebml_read_binary(AVIOContext *pb, int length, int64_t pos, EbmlBin *bin)
unsigned int avio_rb16(AVIOContext *s)
#define MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ
const struct EbmlSyntax * n
#define MATROSKA_ID_EDITIONFLAGDEFAULT
#define MATROSKA_ID_CLUSTERTIMECODE
#define MATROSKA_ID_ENCODINGENCALGO
static EbmlSyntax matroska_attachment[]
#define MATROSKA_ID_CHAPTERTIMEEND
enum AVColorSpace color_space
#define MATROSKA_ID_TRACKCONTENTENCODINGS
int frame_size
Audio only.
Mastering display metadata (based on SMPTE-2086:2014).
#define AV_LZO_OUTPUT_FULL
decoded data did not fit into output buffer
#define MATROSKA_ID_FILEDESC
#define MATROSKA_ID_TRACKCONTENTENCODING
#define MATROSKA_ID_CODECDOWNLOADURL
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static int webm_dash_manifest_read_header(AVFormatContext *s)
static EbmlSyntax matroska_mastering_meta[]
static int ebml_read_sint(AVIOContext *pb, int size, int64_t *num)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int avpriv_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp)
Set a dictionary value to an ISO-8601 compliant timestamp string.
int ffio_limit(AVIOContext *s, int size)
static int matroska_parse_prores(MatroskaTrack *track, uint8_t **data, int *size)
uint64_t bits_per_channel
static av_always_inline double av_int2double(uint64_t i)
Reinterpret a 64-bit integer as a double.
#define MATROSKA_ID_VIDEOCOLOR_BX
#define MATROSKA_ID_CHAPLANG
MatroskaTrackOperation operation
#define MATROSKA_ID_EDITIONFLAGORDERED
static EbmlSyntax matroska_cluster_parsing[8]
static CueDesc get_cue_desc(AVFormatContext *s, int64_t ts, int64_t cues_start)
#define MATROSKA_ID_TRACKLANGUAGE
MatroskaTrackCompression compression
const AVCodecTag ff_codec_movvideo_tags[]
unsigned int avio_rb32(AVIOContext *s)
int ff_mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode)
static av_cold int end(AVCodecContext *avctx)
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
#define MATROSKA_ID_VIDEOPIXELCROPT
#define MATROSKA_ID_TIMECODESCALE
static int matroska_aac_sri(int samplerate)
enum AVStreamParseType need_parsing
#define MATROSKA_ID_VIDEOCOLORCBSUBVERT
#define MATROSKA_ID_SIMPLEBLOCK
#define MATROSKA_ID_TAGTARGETS_TYPEVALUE
#define MATROSKA_ID_EDITIONFLAGHIDDEN
#define AV_LZO_OUTPUT_PADDING
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
#define MATROSKA_ID_CODECNAME
#define MATROSKA_ID_BLOCKMORE
AVStream ** streams
A list of all streams in the file.
#define MATROSKA_ID_CUERELATIVEPOSITION
#define MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
#define MATROSKA_ID_VIDEOCOLOR
int initial_padding
Audio only.
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
int flags
Flags modifying the (de)muxer behaviour.
static EbmlSyntax matroska_tags[2]
#define MATROSKA_ID_VIDEODISPLAYWIDTH
#define MATROSKA_ID_EDITIONUID
int ff_vorbis_comment(AVFormatContext *ms, AVDictionary **m, const uint8_t *buf, int size, int parse_picture)
#define MATROSKA_ID_BLOCKADDITIONS
static EbmlSyntax ebml_header[]
#define AVERROR_EOF
End of file.
#define MATROSKA_ID_CODECDECODEALL
#define MATROSKA_ID_ENCODINGENCRYPTION
static av_cold int read_close(AVFormatContext *ctx)
#define AV_LOG_VERBOSE
Detailed information.
static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track)
static EbmlSyntax matroska_track_operation[2]
uint64_t avio_rb64(AVIOContext *s)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
unsigned int alloc_elem_size
static const uint8_t header[24]
static EbmlSyntax matroska_blockadditions[2]
#define MATROSKA_ID_TRACKNUMBER
#define MATROSKA_ID_VIDEOCOLOR_WHITEY
#define MATROSKA_ID_SEGMENTUID
#define EBML_UNKNOWN_LENGTH
uint64_t channel_layout
Audio only.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
int ff_get_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int size, int big_endian)
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
#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
static EbmlSyntax matroska_tracks[2]
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
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.
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
AVCodecID
Identify the syntax and semantics of the bitstream.
#define MATROSKA_ID_VIDEOCOLOR_BY
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVDictionary * metadata
Metadata that applies to the whole file.
#define MATROSKA_ID_BLOCKDURATION
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette...
#define EBML_ID_EBMLREADVERSION
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags)
Get the index for a specific timestamp.
#define MATROSKA_ID_VIDEOCOLORMAXCLL
MatroskaMasteringMeta mastering_meta
#define MATROSKA_ID_VIDEOCOLOR_WHITEX
static const uint16_t mask[17]
FLAC (Free Lossless Audio Codec) decoder/demuxer common functions.
static int ebml_read_length(MatroskaDemuxContext *matroska, AVIOContext *pb, uint64_t *number)
Read a EBML length value.
int64_t timestamp
Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are...
#define MATROSKA_ID_CLUSTER
static EbmlSyntax matroska_track_encodings[2]
#define MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
enum AVColorPrimaries color_primaries
#define MATROSKA_ID_FILEMIMETYPE
char * url
input or output URL.
union EbmlSyntax::@259 def
#define MATROSKA_ID_WRITINGAPP
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static int matroska_parse_wavpack(MatroskaTrack *track, uint8_t **data, int *size)
const char *const ff_matroska_video_stereo_mode[MATROSKA_VIDEO_STEREOMODE_TYPE_NB]
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
preferred ID for decoding MPEG audio layer 1, 2 or 3
#define av_fourcc2str(fourcc)
enum AVMediaType codec_type
General type of the encoded data.
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska, AVIOContext *pb, int64_t *num)
static int matroska_probe(const AVProbeData *p)
#define MATROSKA_ID_TAGDEFAULT_BUG
int cues_parsing_deferred
#define MATROSKA_ID_VIDEOPIXELCROPR
#define MATROSKA_ID_TRACKPLANEUID
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
#define MATROSKA_ID_ENCODINGCOMPSETTINGS
#define EBML_ID_EBMLMAXIDLENGTH
AVBufferRef * av_buffer_create(uint8_t *data, int size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
#define MATROSKA_ID_CHAPTERFLAGHIDDEN
int av_buffer_realloc(AVBufferRef **pbuf, int size)
Reallocate a given buffer.
static const uint8_t offset[127][2]
char * av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
Encode data to base64 and null-terminate.
AVRational avg_frame_rate
Average framerate.
static EbmlSyntax matroska_chapter_entry[9]
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.
int flags
A combination of AV_PKT_FLAG values.
int extradata_size
Size of the extradata content in bytes.
uint64_t matrix_coefficients
int avio_r8(AVIOContext *s)
static void ebml_free(EbmlSyntax *syntax, void *data)
int buf_size
Size of buf except extra allocated bytes.
char * av_asprintf(const char *fmt,...)
static int matroska_reset_status(MatroskaDemuxContext *matroska, uint32_t id, int64_t position)
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
static EbmlSyntax matroska_track[27]
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
uint32_t bound_bottom
Distance from the bottom edge.
static EbmlSyntax matroska_index_entry[3]
static EbmlSyntax matroska_track_combine_planes[2]
#define MATROSKA_ID_ENCODINGSIGHASHALGO
static const struct @315 planes[]
static const struct TransferCharacteristics transfer_characteristics[AVCOL_TRC_NB]
uint64_t skip_to_timecode
int block_align
Audio only.
static int matroska_read_header(AVFormatContext *s)
static MatroskaTrack * matroska_find_track_by_num(MatroskaDemuxContext *matroska, uint64_t num)
static void matroska_parse_cues(MatroskaDemuxContext *matroska)
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Video frame is split into 6 faces of a cube, and arranged on a 3x2 layout.
static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
#define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN
#define EBML_ID_EBMLVERSION
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
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.
#define MATROSKA_ID_TAGTARGETS
#define MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL
const AVCodecTag ff_codec_bmp_tags[]
int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as stream side data.
#define MATROSKA_VIDEO_STEREO_PLANE_COUNT
#define MATROSKA_ID_TAGNAME
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
#define MATROSKA_ID_TRACKTIMECODESCALE
#define MATROSKA_ID_CHAPTERFLAGENABLED
static void bit_depth(AudioStatsContext *s, uint64_t mask, uint64_t imask, AVRational *depth)
static int webm_dash_manifest_cues(AVFormatContext *s, int64_t init_range)
This side data should be associated with a video stream and corresponds to the AVSphericalMapping str...
uint32_t bound_right
Distance from the right edge.
#define MATROSKA_ID_SIMPLETAG
internal header for RIFF based (de)muxers do NOT include this in end user applications ...
#define MATROSKA_ID_TRACKMAXCACHE
static EbmlSyntax matroska_chapter[6]
static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf, int size, int type, AVIOContext *pb, uint32_t lace_size[256], int *laces)
#define MATROSKA_ID_CHAPTERPHYSEQUIV
static int matroska_read_close(AVFormatContext *s)
#define FLAC_STREAMINFO_SIZE
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
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen)
Decodes LZO 1x compressed data.
int32_t yaw
Rotation around the up vector [-180, 180].
#define AV_EF_EXPLODE
abort decoding on minor error detection
uint8_t * av_stream_new_side_data(AVStream *stream, enum AVPacketSideDataType type, int size)
Allocate new information from stream.
enum AVColorRange color_range
Video only.
Opaque data information usually sparse.
#define MATROSKA_ID_VIDEOCOLORSPACE
#define MATROSKA_ID_CHAPTERS
static void mkv_stereo_mode_display_mul(int stereo_mode, int *h_width, int *h_height)
static void matroska_convert_tag(AVFormatContext *s, EbmlList *list, AVDictionary **metadata, char *prefix)
uint64_t max_block_additional_id
#define MATROSKA_ID_VIDEOCOLORCHROMASUBVERT
const uint8_t ff_log2_tab[256]
#define MATROSKA_ID_AUDIOSAMPLINGFREQ
#define FF_ARRAY_ELEMS(a)
#define MATROSKA_ID_TRACKMINCACHE
the normal 2^n-1 "JPEG" YUV ranges
static void matroska_metadata_creation_time(AVDictionary **metadata, int64_t date_utc)
static int matroska_parse_flac(AVFormatContext *s, MatroskaTrack *track, int *offset)
static int read_header(FFV1Context *f)
static EbmlSyntax matroska_track_video_color[15]
uint32_t padding
Number of pixels to pad from the edge of each cube face.
static int matroska_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define MATROSKA_ID_TRACKPLANETYPE
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
AVSphericalProjection
Projection of the video surface(s) on a sphere.
Content light level (based on CTA-861.3).
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
#define MATROSKA_ID_VIDEOPIXELCROPB
#define AV_LOG_INFO
Standard information.
#define MATROSKA_ID_VIDEOCOLORMATRIXCOEFF
static int matroska_parse_tracks(AVFormatContext *s)
int ff_get_qtpalette(int codec_id, AVIOContext *pb, uint32_t *palette)
Retrieve the palette (or "color table" in QuickTime terms), either from the video sample description...
char * av_strdup(const char *s)
Duplicate a string.
#define MATROSKA_ID_TRACKFLAGFORCED
static EbmlSyntax matroska_track_plane[]
#define MATROSKA_ID_VIDEOCOLORPRIMARIES
const AVCodecTag ff_codec_movaudio_tags[]
#define MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH
#define MATROSKA_ID_TAGDEFAULT
#define MATROSKA_ID_SEEKID
AVIOContext * pb
I/O context.
uint64_t chroma_siting_horz
#define MATROSKA_ID_ENCODINGCOMPALGO
#define MATROSKA_ID_BLOCK
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
#define MATROSKA_ID_TAGTARGETS_TRACKUID
uint8_t * data
The data buffer.
#define MATROSKA_ID_TAGLANG
#define MATROSKA_ID_TRACKCOMBINEPLANES
static const AVClass webm_dash_class
static EbmlSyntax matroska_segment[9]
#define MATROSKA_ID_TRACKFLAGENABLED
#define MATROSKA_ID_TRACKS
static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb, int max_size, uint64_t *number, int eof_forbidden)
#define MATROSKA_ID_TRACKPLANE
Data found in BlockAdditional element of matroska container.
#define MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ
#define MATROSKA_ID_TRACKNAME
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 MATROSKA_ID_SEEKENTRY
Describe the class of an AVClass context structure.
static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track, void *logctx)
#define MATROSKA_ID_CHAPCOUNTRY
#define MATROSKA_ID_EDITIONENTRY
#define MATROSKA_ID_BLOCKGROUP
#define MATROSKA_ID_VIDEOPIXELHEIGHT
int32_t roll
Rotation around the forward vector [-180, 180].
static void inflate(uint8_t *dst, const uint8_t *p1, int width, int threshold, const uint8_t *coordinates[], int coord, int maxc)
Rational number (pair of numerator and denominator).
#define MATROSKA_ID_CUEDURATION
#define MATROSKA_ID_CUETIME
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
#define MATROSKA_ID_ENCODINGSIGALGO
static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt)
static EbmlSyntax matroska_track_encoding_encryption[]
Recommmends skipping the specified number of samples.
static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *codec_id)
static int ebml_parse(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, void *data)
static av_always_inline void flac_parse_block_header(const uint8_t *block_header, int *last, int *type, int *size)
Parse the metadata block parameters from the header.
#define MATROSKA_ID_ENCODINGSIGKEYID
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
#define MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS
static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska, int64_t pos)
#define MATROSKA_ID_TITLE
#define MATROSKA_ID_TRACKVIDEO
This structure describes how to handle spherical videos, outlining information about projection...
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 MATROSKA_ID_VIDEOPROJECTION
#define MATROSKA_ID_VIDEOCOLORMASTERINGMETA
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_VIDEOPROJECTIONPRIVATE
int seek_preroll
Audio only.
#define MATROSKA_ID_VIDEOFRAMERATE
static av_const int sign_extend(int val, unsigned bits)
#define MATROSKA_ID_ATTACHMENTS
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
static EbmlSyntax ebml_syntax[3]
#define MATROSKA_ID_TRACKOPERATION
#define flags(name, subs,...)
#define MATROSKA_ID_CHAPTERDISPLAY
MatroskaLevel1Element level1_elems[64]
#define MATROSKA_ID_FILENAME
#define MATROSKA_ID_BLOCKADDITIONAL
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
uint32_t bound_top
Distance from the top edge.
const int avpriv_mpeg4audio_sample_rates[16]
const AVMetadataConv ff_mkv_metadata_conv[]
static int mkv_field_order(MatroskaDemuxContext *matroska, int64_t field_order)
#define MATROSKA_ID_CODECID
#define MATROSKA_ID_VIDEOFIELDORDER
static EbmlSyntax matroska_seekhead[2]
int sample_rate
Audio only.
#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.
static const CodecMime mkv_mime_tags[]
#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 FF_DISABLE_DEPRECATION_WARNINGS
#define MATROSKA_ID_CHAPTERTIMESTART
enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos)
Converts swscale x/y chroma position to AVChromaLocation.
#define MATROSKA_ID_VIDEOCOLORRANGE
enum AVSphericalProjection projection
Projection type.
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))
static EbmlSyntax matroska_chapters[2]
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set that converts the value to a string and stores it...
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.
AVBufferRef * av_buffer_ref(AVBufferRef *buf)
Create a new reference to an AVBuffer.
static EbmlSyntax matroska_seekhead_entry[]
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
static EbmlSyntax matroska_blockgroup[8]
#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 MKBETAG(a, b, c, d)
static int ebml_read_master(MatroskaDemuxContext *matroska, uint64_t length, int64_t pos)
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
#define MATROSKA_ID_SEEKHEAD
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)
int skip_to_keyframe
Indicates that everything up to the next keyframe should be discarded.
#define MATROSKA_ID_ENCODINGCOMPRESSION
#define MATROSKA_ID_CLUSTERPREVSIZE
static MatroskaLevel1Element * matroska_find_level1_elem(MatroskaDemuxContext *matroska, uint32_t id, int64_t pos)
int eof_reached
true if was unable to read due to error or eof
#define FF_ENABLE_DEPRECATION_WARNINGS
#define MATROSKA_ID_POINTENTRY
static EbmlSyntax matroska_attachments[2]
#define update_pos(td, mb_y, mb_x)
#define MATROSKA_ID_FILEUID
static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf, 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, int64_t discard_padding)
#define MATROSKA_ID_VIDEOPIXELCROPL
void * priv_data
Format private data.
#define MATROSKA_ID_CHAPTERUID
static EbmlSyntax matroska_track_encoding[6]
uint32_t bound_left
Distance from the left edge.
static EbmlSyntax matroska_tag[3]
int bits_per_coded_sample
The number of bits per sample in the codedwords.
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
#define MATROSKA_ID_VIDEOCOLORMAXFALL
#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
Duration of the stream, in AV_TIME_BASE fractional seconds.
MatroskaTrackEncryption encryption
static EbmlSyntax * ebml_parse_id(EbmlSyntax *syntax, uint32_t id)
#define MATROSKA_ID_CHAPSTRING
#define MATROSKA_ID_VIDEOCOLORCBSUBHORZ
#define MATROSKA_ID_TAGSTRING
static const AVOption options[]
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define av_malloc_array(a, b)
static EbmlSyntax matroska_index_pos[]
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
static int buffer_size_after_time_downloaded(int64_t time_ns, double search_sec, int64_t bps, double min_buffer, double *buffer, double *sec_to_download, AVFormatContext *s, int64_t cues_start)
uint64_t transfer_characteristics
static int ebml_read_float(AVIOContext *pb, int size, double *num)
#define MATROSKA_ID_DURATION
static int matroska_aac_profile(char *codec_id)
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
#define EBML_ID_DOCTYPEVERSION
static void matroska_clear_queue(MatroskaDemuxContext *matroska)
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
#define MKTAG(a, b, c, d)
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
#define MATROSKA_ID_VIDEOCOLOR_GY
This structure stores compressed data.
static EbmlSyntax matroska_chapter_display[]
#define MATROSKA_ID_CODECSTATE
uint64_t default_duration
AVInputFormat ff_webm_dash_manifest_demuxer
#define MATROSKA_ID_VIDEOCOLOR_RY
#define MATROSKA_ID_CODECINFOURL
static EbmlSyntax matroska_cluster_enter[]
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)
static int matroska_parse_frame(MatroskaDemuxContext *matroska, MatroskaTrack *track, AVStream *st, AVBufferRef *buf, 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, int64_t discard_padding)
AVPacket attached_pic
For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet will contain the attached pictu...
#define MATROSKA_ID_TRACKAUDIO
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define MATROSKA_ID_ENCODINGSCOPE
const CodecTags ff_mkv_codec_tags[]
#define MATROSKA_ID_ENCODINGENCKEYID
#define MATROSKA_ID_DISCARDPADDING
static int is_ebml_id_valid(uint32_t id)
uint32_t palette[AVPALETTE_COUNT]
static int64_t webm_dash_manifest_compute_bandwidth(AVFormatContext *s, int64_t cues_start)
static const char *const matroska_doctypes[]