Go to the documentation of this file.
26 #include "config_components.h"
87 static int64_t
add_ctts_entry(
MOVCtts** ctts_data,
unsigned int* ctts_count,
unsigned int* allocated_size,
91 unsigned len,
const char *
key)
95 short current, total = 0;
101 snprintf(buf,
sizeof(buf),
"%d", current);
103 snprintf(buf,
sizeof(buf),
"%d/%d", current, total);
111 unsigned len,
const char *
key)
125 unsigned len,
const char *
key)
134 unsigned len,
const char *
key)
150 0x00C4,0x00C5,0x00C7,0x00C9,0x00D1,0x00D6,0x00DC,0x00E1,
151 0x00E0,0x00E2,0x00E4,0x00E3,0x00E5,0x00E7,0x00E9,0x00E8,
152 0x00EA,0x00EB,0x00ED,0x00EC,0x00EE,0x00EF,0x00F1,0x00F3,
153 0x00F2,0x00F4,0x00F6,0x00F5,0x00FA,0x00F9,0x00FB,0x00FC,
154 0x2020,0x00B0,0x00A2,0x00A3,0x00A7,0x2022,0x00B6,0x00DF,
155 0x00AE,0x00A9,0x2122,0x00B4,0x00A8,0x2260,0x00C6,0x00D8,
156 0x221E,0x00B1,0x2264,0x2265,0x00A5,0x00B5,0x2202,0x2211,
157 0x220F,0x03C0,0x222B,0x00AA,0x00BA,0x03A9,0x00E6,0x00F8,
158 0x00BF,0x00A1,0x00AC,0x221A,0x0192,0x2248,0x2206,0x00AB,
159 0x00BB,0x2026,0x00A0,0x00C0,0x00C3,0x00D5,0x0152,0x0153,
160 0x2013,0x2014,0x201C,0x201D,0x2018,0x2019,0x00F7,0x25CA,
161 0x00FF,0x0178,0x2044,0x20AC,0x2039,0x203A,0xFB01,0xFB02,
162 0x2021,0x00B7,0x201A,0x201E,0x2030,0x00C2,0x00CA,0x00C1,
163 0x00CB,0x00C8,0x00CD,0x00CE,0x00CF,0x00CC,0x00D3,0x00D4,
164 0xF8FF,0x00D2,0x00DA,0x00DB,0x00D9,0x0131,0x02C6,0x02DC,
165 0x00AF,0x02D8,0x02D9,0x02DA,0x00B8,0x02DD,0x02DB,0x02C7,
169 char *dst,
int dstlen)
172 char *end = dst+dstlen-1;
175 for (
i = 0;
i <
len;
i++) {
194 if (
c->fc->nb_streams < 1)
197 for (
int i = 0;
i <
c->nb_heif_item;
i++) {
202 if (item->
st->
id !=
c->cur_item_id)
209 st =
c->fc->streams[
c->fc->nb_streams-1];
239 st =
c->fc->streams[
c->fc->nb_streams - 1];
260 char buf[200], place[100];
261 uint16_t langcode = 0;
262 double longitude, latitude, altitude;
263 const char *
key =
"location";
265 if (
len < 4 + 2 + 1 + 1 + 4 + 4 + 4) {
285 "loci too short (%u bytes left, need at least %d)\n",
len, 12);
293 snprintf(buf,
sizeof(buf),
"%+08.4f%+09.4f", latitude, longitude);
313 if (
c->ignore_chapters)
317 if (n_hmmt >
len / 4)
334 uint16_t langcode = 0;
335 uint32_t data_type = 0, str_size, str_size_alloc;
341 case MKTAG(
'@',
'P',
'R',
'M'):
key =
"premiere_version"; raw = 1;
break;
342 case MKTAG(
'@',
'P',
'R',
'Q'):
key =
"quicktime_version"; raw = 1;
break;
343 case MKTAG(
'X',
'M',
'P',
'_'):
344 if (
c->export_xmp) {
key =
"xmp"; raw = 1; }
break;
345 case MKTAG(
'a',
'A',
'R',
'T'):
key =
"album_artist";
break;
346 case MKTAG(
'a',
'k',
'I',
'D'):
key =
"account_type";
348 case MKTAG(
'a',
'p',
'I',
'D'):
key =
"account_id";
break;
349 case MKTAG(
'c',
'a',
't',
'g'):
key =
"category";
break;
350 case MKTAG(
'c',
'p',
'i',
'l'):
key =
"compilation";
352 case MKTAG(
'c',
'p',
'r',
't'):
key =
"copyright";
break;
353 case MKTAG(
'd',
'e',
's',
'c'):
key =
"description";
break;
354 case MKTAG(
'd',
'i',
's',
'k'):
key =
"disc";
356 case MKTAG(
'e',
'g',
'i',
'd'):
key =
"episode_uid";
358 case MKTAG(
'F',
'I',
'R',
'M'):
key =
"firmware"; raw = 1;
break;
359 case MKTAG(
'g',
'n',
'r',
'e'):
key =
"genre";
361 case MKTAG(
'h',
'd',
'v',
'd'):
key =
"hd_video";
363 case MKTAG(
'H',
'M',
'M',
'T'):
365 case MKTAG(
'k',
'e',
'y',
'w'):
key =
"keywords";
break;
366 case MKTAG(
'l',
'd',
'e',
's'):
key =
"synopsis";
break;
367 case MKTAG(
'l',
'o',
'c',
'i'):
369 case MKTAG(
'm',
'a',
'n',
'u'):
key =
"make";
break;
370 case MKTAG(
'm',
'o',
'd',
'l'):
key =
"model";
break;
371 case MKTAG(
'p',
'c',
's',
't'):
key =
"podcast";
373 case MKTAG(
'p',
'g',
'a',
'p'):
key =
"gapless_playback";
375 case MKTAG(
'p',
'u',
'r',
'd'):
key =
"purchase_date";
break;
376 case MKTAG(
'r',
't',
'n',
'g'):
key =
"rating";
378 case MKTAG(
's',
'o',
'a',
'a'):
key =
"sort_album_artist";
break;
379 case MKTAG(
's',
'o',
'a',
'l'):
key =
"sort_album";
break;
380 case MKTAG(
's',
'o',
'a',
'r'):
key =
"sort_artist";
break;
381 case MKTAG(
's',
'o',
'c',
'o'):
key =
"sort_composer";
break;
382 case MKTAG(
's',
'o',
'n',
'm'):
key =
"sort_name";
break;
383 case MKTAG(
's',
'o',
's',
'n'):
key =
"sort_show";
break;
384 case MKTAG(
's',
't',
'i',
'k'):
key =
"media_type";
386 case MKTAG(
't',
'r',
'k',
'n'):
key =
"track";
388 case MKTAG(
't',
'v',
'e',
'n'):
key =
"episode_id";
break;
389 case MKTAG(
't',
'v',
'e',
's'):
key =
"episode_sort";
391 case MKTAG(
't',
'v',
'n',
'n'):
key =
"network";
break;
392 case MKTAG(
't',
'v',
's',
'h'):
key =
"show";
break;
393 case MKTAG(
't',
'v',
's',
'n'):
key =
"season_number";
395 case MKTAG(0xa9,
'A',
'R',
'T'):
key =
"artist";
break;
396 case MKTAG(0xa9,
'P',
'R',
'D'):
key =
"producer";
break;
397 case MKTAG(0xa9,
'a',
'l',
'b'):
key =
"album";
break;
398 case MKTAG(0xa9,
'a',
'u',
't'):
key =
"artist";
break;
399 case MKTAG(0xa9,
'c',
'h',
'p'):
key =
"chapter";
break;
400 case MKTAG(0xa9,
'c',
'm',
't'):
key =
"comment";
break;
401 case MKTAG(0xa9,
'c',
'o',
'm'):
key =
"composer";
break;
402 case MKTAG(0xa9,
'c',
'p',
'y'):
key =
"copyright";
break;
403 case MKTAG(0xa9,
'd',
'a',
'y'):
key =
"date";
break;
404 case MKTAG(0xa9,
'd',
'i',
'r'):
key =
"director";
break;
405 case MKTAG(0xa9,
'd',
'i',
's'):
key =
"disclaimer";
break;
406 case MKTAG(0xa9,
'e',
'd',
'1'):
key =
"edit_date";
break;
407 case MKTAG(0xa9,
'e',
'n',
'c'):
key =
"encoder";
break;
408 case MKTAG(0xa9,
'f',
'm',
't'):
key =
"original_format";
break;
409 case MKTAG(0xa9,
'g',
'e',
'n'):
key =
"genre";
break;
410 case MKTAG(0xa9,
'g',
'r',
'p'):
key =
"grouping";
break;
411 case MKTAG(0xa9,
'h',
's',
't'):
key =
"host_computer";
break;
412 case MKTAG(0xa9,
'i',
'n',
'f'):
key =
"comment";
break;
413 case MKTAG(0xa9,
'l',
'y',
'r'):
key =
"lyrics";
break;
414 case MKTAG(0xa9,
'm',
'a',
'k'):
key =
"make";
break;
415 case MKTAG(0xa9,
'm',
'o',
'd'):
key =
"model";
break;
416 case MKTAG(0xa9,
'n',
'a',
'm'):
key =
"title";
break;
417 case MKTAG(0xa9,
'o',
'p',
'e'):
key =
"original_artist";
break;
418 case MKTAG(0xa9,
'p',
'r',
'd'):
key =
"producer";
break;
419 case MKTAG(0xa9,
'p',
'r',
'f'):
key =
"performers";
break;
420 case MKTAG(0xa9,
'r',
'e',
'q'):
key =
"playback_requirements";
break;
421 case MKTAG(0xa9,
's',
'r',
'c'):
key =
"original_source";
break;
422 case MKTAG(0xa9,
's',
't',
'3'):
key =
"subtitle";
break;
423 case MKTAG(0xa9,
's',
'w',
'r'):
key =
"encoder";
break;
424 case MKTAG(0xa9,
't',
'o',
'o'):
key =
"encoder";
break;
425 case MKTAG(0xa9,
't',
'r',
'k'):
key =
"track";
break;
426 case MKTAG(0xa9,
'u',
'r',
'l'):
key =
"URL";
break;
427 case MKTAG(0xa9,
'w',
'r',
'n'):
key =
"warning";
break;
428 case MKTAG(0xa9,
'w',
'r',
't'):
key =
"composer";
break;
429 case MKTAG(0xa9,
'x',
'y',
'z'):
key =
"location";
break;
432 if (
c->itunes_metadata && atom.
size > 8) {
435 if (
tag ==
MKTAG(
'd',
'a',
't',
'a') && data_size <= atom.size && data_size >= 16) {
438 str_size = data_size - 16;
441 if (!
key &&
c->found_hdlr_mdta &&
c->meta_keys) {
443 if (index < c->meta_keys_count &&
index > 0) {
445 }
else if (atom.
type !=
MKTAG(
'c',
'o',
'v',
'r')) {
447 "The index of 'data' is out of range: %"PRId32
" < 1 or >= %d.\n",
448 index,
c->meta_keys_count);
451 if (atom.
type ==
MKTAG(
'c',
'o',
'v',
'r') ||
452 (
key && !strcmp(
key,
"com.apple.quicktime.artwork"))) {
458 atom.
size -= str_size;
464 }
else if (atom.
size > 4 &&
key && !
c->itunes_metadata && !raw) {
466 if (str_size > atom.
size) {
476 str_size = atom.
size;
478 if (
c->export_all && !
key) {
484 if (atom.
size < 0 || str_size >= INT_MAX/2)
489 num = (data_type >= 21 && data_type <= 23);
490 str_size_alloc = (num ? 512 : (raw ? str_size : str_size * 2)) + 1;
498 if (!raw && (data_type == 3 || (data_type == 0 && (langcode < 0x400 || langcode == 0x7fff)))) {
500 }
else if (data_type == 21) {
504 else if (str_size == 2)
506 else if (str_size == 3)
508 else if (str_size == 4)
510 if (
snprintf(str, str_size_alloc,
"%d",
val) >= str_size_alloc) {
512 "Failed to store the number (%d) in string.\n",
val);
516 }
else if (data_type == 22) {
517 unsigned int val = 0;
520 else if (str_size == 2)
522 else if (str_size == 3)
524 else if (str_size == 4)
526 if (
snprintf(str, str_size_alloc,
"%u",
val) >= str_size_alloc) {
528 "Failed to store the number (%u) in string.\n",
val);
532 }
else if (data_type == 23 && str_size >= 4) {
534 if (
snprintf(str, str_size_alloc,
"%f",
val) >= str_size_alloc) {
536 "Failed to store the float32 number (%f) in string.\n",
val);
540 }
else if (data_type > 1 && data_type != 4) {
562 if (!strcmp(
key,
"encoder")) {
563 int major, minor, micro;
564 if (sscanf(str,
"HandBrake %d.%d.%d", &major, &minor, µ) == 3) {
565 c->handbrake_version = 1000000*major + 1000*minor + micro;
577 int i, nb_chapters, str_len,
version;
581 if (
c->ignore_chapters)
584 if ((atom.
size -= 5) < 0)
593 for (
i = 0;
i < nb_chapters;
i++) {
600 if ((atom.
size -= 9+str_len) < 0)
612 #define MIN_DATA_ENTRY_BOX_SIZE 12
619 if (
c->fc->nb_streams < 1)
621 st =
c->fc->streams[
c->fc->nb_streams-1];
628 entries >= UINT_MAX /
sizeof(*sc->
drefs))
643 for (
i = 0;
i < entries;
i++) {
648 if (
size < 12 || next < 0 || next > INT64_MAX -
size)
658 uint16_t volume_len,
len;
665 volume_len =
FFMIN(volume_len, 27);
669 dref->
volume[volume_len] = 0;
711 if (
len > volume_len && !strncmp(dref->
path, dref->
volume, volume_len)) {
717 for (j =
len - 1; j >= 0; j--) {
718 if (dref->
path[j] == 0)
723 for (j = 0; j <
len; j++)
724 if (dref->
path[j] ==
':' || dref->
path[j] == 0)
727 }
else if (
type == 0) {
739 for (j = 0; j <
len; j++)
740 if (dref->
dir[j] ==
':')
776 if (
c->trak_index < 0) {
778 c->found_hdlr_mdta = 1;
783 st =
c->fc->streams[
c->fc->nb_streams-1];
798 title_size = atom.
size - 24;
799 if (title_size > 0) {
800 if (title_size >
FFMIN(INT_MAX, SIZE_MAX-1))
811 title_str[title_size] = 0;
813 int off = (!
c->isom && title_str[0] == title_size - 1);
833 int ac3info, acmod, lfeon, bsmod;
836 if (
c->fc->nb_streams < 1)
838 st =
c->fc->streams[
c->fc->nb_streams-1];
849 bsmod = (ac3info >> 14) & 0x7;
850 acmod = (ac3info >> 11) & 0x7;
851 lfeon = (ac3info >> 10) & 0x1;
875 unsigned descriptors_size;
876 int nb_frames, disposition;
882 if (
c->fc->nb_streams < 1)
893 if (!descriptors_size || descriptors_size > INT_MAX)
896 st =
c->fc->streams[
c->fc->nb_streams - 1];
910 if (
ret != descriptors_size)
914 descriptor_pb = &
b.pub;
1011 for (
int j = 0; j <
mix->nb_submixes; j++) {
1018 for (
int l = 0; l <
c->fc->nb_stream_groups; l++)
1021 audio_element =
c->fc->stream_groups[l];
1026 for (
int l = 0; l < audio_element->
nb_streams; l++) {
1051 int eac3info, acmod, lfeon, bsmod;
1054 if (
c->fc->nb_streams < 1)
1056 st =
c->fc->streams[
c->fc->nb_streams-1];
1072 bsmod = (eac3info >> 12) & 0x1f;
1073 acmod = (eac3info >> 9) & 0x7;
1074 lfeon = (eac3info >> 8) & 0x1;
1091 #define DDTS_SIZE 20
1094 uint32_t frame_duration_code = 0;
1095 uint32_t channel_layout_code = 0;
1104 if (
c->fc->nb_streams < 1) {
1107 st =
c->fc->streams[
c->fc->nb_streams-1];
1117 frame_duration_code =
get_bits(&gb, 2);
1119 channel_layout_code =
get_bits(&gb, 16);
1122 (frame_duration_code == 0) ? 512 :
1123 (frame_duration_code == 1) ? 1024 :
1124 (frame_duration_code == 2) ? 2048 :
1125 (frame_duration_code == 3) ? 4096 : 0;
1127 if (channel_layout_code > 0xff) {
1146 if (
c->fc->nb_streams < 1)
1148 st =
c->fc->streams[
c->fc->nb_streams-1];
1168 if (
c->fc->nb_streams < 1)
1170 st =
c->fc->streams[
c->fc->nb_streams-1];
1176 "Unsupported 'chnl' box with version %d, flags: %#x",
1198 if (
c->fc->nb_streams < 1)
1200 st =
c->fc->streams[
c->fc->nb_streams-1];
1215 if (
c->fc->nb_streams < 1)
1217 st =
c->fc->streams[
c->fc->nb_streams-1];
1235 #define DRM_BLOB_SIZE 56
1239 uint8_t intermediate_key[20];
1240 uint8_t intermediate_iv[20];
1243 uint8_t file_checksum[20];
1244 uint8_t calculated_checksum[20];
1245 char checksum_string[2 *
sizeof(file_checksum) + 1];
1249 uint8_t *activation_bytes =
c->activation_bytes;
1250 uint8_t *fixed_key =
c->audible_fixed_key;
1259 if (!
c->aes_decrypt) {
1271 ff_data_to_hex(checksum_string, file_checksum,
sizeof(file_checksum), 1);
1275 if (!activation_bytes) {
1280 if (
c->activation_bytes_size != 4) {
1287 if (
c->audible_fixed_key_size != 16) {
1307 if (memcmp(calculated_checksum, file_checksum, 20)) {
1314 for (
i = 0;
i < 4;
i++) {
1316 if (activation_bytes[
i] !=
output[3 -
i]) {
1322 memcpy(
c->file_key,
output + 8, 16);
1338 if (
c->audible_key_size != 16) {
1343 if (
c->audible_iv_size != 16) {
1349 if (!
c->aes_decrypt) {
1353 memcpy(
c->file_key,
c->audible_key, 16);
1354 memcpy(
c->file_iv,
c->audible_iv, 16);
1364 unsigned char iv[16];
1366 memcpy(iv,
c->file_iv, 16);
1378 int comp_brand_size;
1379 char* comp_brands_str;
1380 uint8_t
type[5] = {0};
1384 if (
c->fc->nb_streams) {
1391 if (strcmp(
type,
"qt "))
1398 comp_brand_size = atom.
size - 8;
1399 if (comp_brand_size < 0 || comp_brand_size == INT_MAX)
1401 comp_brands_str =
av_malloc(comp_brand_size + 1);
1402 if (!comp_brands_str)
1410 comp_brands_str[comp_brand_size] = 0;
1415 if (!strcmp(
type,
"aaxc")) {
1427 if (
c->found_moov) {
1449 if (index < 0 || index >= frag_index->
nb_items)
1465 if (frag_index->
current < 0 ||
1484 if (frag_index->
current < 0 ||
1499 int64_t moof_offset;
1512 if (moof_offset >=
offset)
1514 if (moof_offset <=
offset)
1552 for (j = 0; j <
s->nb_streams; j++) {
1554 if (sc2->
id == frag_stream_info->
id)
1555 frag_stream =
s->streams[j];
1578 m0 = m = (
a +
b) >> 1;
1584 if (m <
b && frag_time <= timestamp)
1601 if (index < c->frag_index.nb_items &&
1608 &
c->frag_index.allocated_size,
1609 (
c->frag_index.nb_items + 1) *
1610 sizeof(*
c->frag_index.item));
1613 c->frag_index.item = item;
1617 if (!frag_stream_info)
1620 for (
i = 0;
i <
c->fc->nb_streams;
i++) {
1628 frag_stream_info[
i].
id = sc->
id;
1639 if (index < c->frag_index.nb_items)
1640 memmove(
c->frag_index.item +
index + 1,
c->frag_index.item +
index,
1641 (
c->frag_index.nb_items -
index) *
sizeof(*
c->frag_index.item));
1643 item = &
c->frag_index.item[
index];
1649 c->frag_index.nb_items++;
1655 int id,
int entries)
1664 if (frag_stream_info && frag_stream_info->
index_entry >= 0)
1672 c->fragment.found_tfhd = 0;
1674 if (!
c->has_looked_for_mfra &&
c->use_mfra_for > 0) {
1675 c->has_looked_for_mfra = 1;
1682 "read the mfra (may be a live ismv)\n");
1686 "seekable, can not look for mfra\n");
1689 c->fragment.moof_offset =
c->fragment.implicit_offset =
avio_tell(pb) - 8;
1708 if (time > 0 && time < 2082844800) {
1716 if ((int64_t)(time * 1000000ULL) / 1000000 != time) {
1733 if (
c->fc->nb_streams < 1)
1735 st =
c->fc->streams[
c->fc->nb_streams-1];
1779 if (
c->time_scale <= 0) {
1793 for (
i = 0;
i < 3;
i++) {
1814 if (
fc->nb_streams < 1)
1816 st =
fc->streams[
fc->nb_streams-1];
1841 int little_endian =
avio_rb16(pb) & 0xFF;
1843 if (little_endian == 1)
1852 int pcm_sample_size;
1857 if (atom.
size < 6) {
1867 "Unsupported 'pcmC' box with version %d, flags: %x",
1873 pcm_sample_size =
avio_r8(pb);
1875 if (
fc->nb_streams < 1)
1878 st =
fc->streams[
fc->nb_streams - 1];
1882 switch (pcm_sample_size) {
1896 switch (pcm_sample_size) {
1918 if (format_flags & 1)
1928 char color_parameter_type[5] = { 0 };
1939 if (strncmp(color_parameter_type,
"nclx", 4) &&
1940 strncmp(color_parameter_type,
"nclc", 4) &&
1941 strncmp(color_parameter_type,
"prof", 4)) {
1943 color_parameter_type);
1947 if (!strncmp(color_parameter_type,
"prof", 4)) {
1963 "%s: pri %d trc %d matrix %d",
1966 if (!strncmp(color_parameter_type,
"nclx", 4)) {
1993 unsigned mov_field_order;
1996 if (
c->fc->nb_streams < 1)
1998 st =
c->fc->streams[
c->fc->nb_streams-1];
2002 if ((mov_field_order & 0xFF00) == 0x0100)
2004 else if ((mov_field_order & 0xFF00) == 0x0200) {
2005 switch (mov_field_order & 0xFF) {
2028 if (
size > INT_MAX || (uint64_t)atom.
size > INT_MAX)
2051 }
else if (err < atom.
size) {
2065 uint64_t original_size;
2068 if (
c->fc->nb_streams < 1)
2070 st =
c->fc->streams[
c->fc->nb_streams-1];
2119 if (!
ret &&
c->fc->nb_streams >= 1) {
2131 if (
c->fc->nb_streams >= 1) {
2132 AVStream *
const st =
c->fc->streams[
c->fc->nb_streams - 1];
2143 if (
cid == 0xd4d ||
cid == 0xd4e)
2154 if (num <= 0 || den <= 0)
2158 if (den >= INT_MAX / 2)
2176 uint64_t original_size;
2177 if (
c->fc->nb_streams >= 1) {
2181 if (atom.
size == 16) {
2186 if (length == atom.
size) {
2187 const uint8_t range_value = par->
extradata[original_size + 19];
2188 switch (range_value) {
2225 if (
c->fc->nb_streams < 1)
2227 st =
c->fc->streams[
c->fc->nb_streams-1];
2229 if ((uint64_t)atom.
size > (1<<30))
2239 }
else if (atom.
size > 8) {
2253 #define ALAC_EXTRADATA_SIZE 36
2286 if ((uint64_t)atom.
size > (1<<30))
2289 if (atom.
type ==
MKTAG(
'v',
'v',
'c',
'C')) {
2294 if (atom.
size >= 10) {
2326 uint8_t profile_level;
2329 if (
c->fc->nb_streams < 1)
2331 st =
c->fc->streams[
c->fc->nb_streams-1];
2333 if (atom.
size >= (1<<28) || atom.
size < 7)
2337 if ((profile_level & 0xf0) != 0xc0)
2358 if (
c->fc->nb_streams < 1)
2360 if (atom.
size <= 40)
2362 st =
c->fc->streams[
c->fc->nb_streams-1];
2364 if ((uint64_t)atom.
size > (1<<30))
2379 unsigned int i, entries;
2381 if (
c->trak_index < 0) {
2385 if (
c->fc->nb_streams < 1)
2387 st =
c->fc->streams[
c->fc->nb_streams-1];
2399 (atom.
type ==
MKTAG(
's',
't',
'c',
'o') ? 4 : 8)));
2416 if (atom.
type ==
MKTAG(
's',
't',
'c',
'o'))
2419 else if (atom.
type ==
MKTAG(
'c',
'o',
'6',
'4'))
2445 ((
format & 0xFFFF) ==
'm' + (
's' << 8) ||
2446 (
format & 0xFFFF) ==
'T' + (
'S' << 8)))
2483 uint8_t codec_name[32] = { 0 };
2518 if (!strncmp(codec_name,
"Planar Y'CbCr 8-bit 4:2:0", 25)) {
2525 !strncmp(codec_name,
"Sorenson H263", 13))
2541 int bits_per_sample,
flags;
2566 (compatible_brands && strstr(compatible_brands->
value,
"qt ")) ||
2676 y = (ycbcr >> 16) & 0xFF;
2677 cr = (ycbcr >> 8) & 0xFF;
2684 return (
r << 16) | (
g << 8) |
b;
2689 char buf[256] = {0};
2697 snprintf(buf,
sizeof(buf),
"size: %dx%d\n",
2701 for (
i = 0;
i < 16;
i++) {
2705 av_strlcatf(buf,
sizeof(buf),
"%06"PRIx32
"%s", rgba,
i != 15 ?
", " :
"");
2708 if (
av_strlcat(buf,
"\n",
sizeof(buf)) >=
sizeof(buf))
2745 if (str_size > 0 &&
size >= (
int)str_size + 30 &&
2747 char *reel_name =
av_malloc(str_size + 1);
2751 reel_name[str_size] = 0;
2776 #if CONFIG_DV_DEMUXER
2866 int codec_tag,
int format,
2878 : codec_tag !=
MKTAG(
'j',
'p',
'e',
'g')))) {
2895 int pseudo_stream_id;
2898 st =
c->fc->streams[
c->fc->nb_streams-1];
2901 for (pseudo_stream_id = 0;
2903 pseudo_stream_id++) {
2906 int ret, dref_id = 1;
2916 }
else if (
size <= 7) {
2918 "invalid size %"PRId64
" in stsd\n",
size);
2935 "size=%"PRId64
" 4CC=%s codec_type=%d\n",
size,
2965 }
else if (
a.size > 0)
2994 if (
c->fc->nb_streams < 1)
2996 st =
c->fc->streams[
c->fc->nb_streams - 1];
3004 if (entries <= 0 || entries > atom.
size / 8 || entries > 1024) {
3011 "Duplicate stsd found in this track.\n");
3057 unsigned int i, entries;
3059 if (
c->fc->nb_streams < 1)
3061 st =
c->fc->streams[
c->fc->nb_streams-1];
3068 if ((uint64_t)entries * 12 + 4 > atom.
size)
3093 int64_t first_min =
i + 1;
3153 unsigned i, entries;
3155 if (
c->fc->nb_streams < 1)
3157 st =
c->fc->streams[
c->fc->nb_streams-1];
3190 unsigned int i, entries;
3192 if (
c->fc->nb_streams < 1)
3194 st =
c->fc->streams[
c->fc->nb_streams-1];
3213 if (entries >= UINT_MAX /
sizeof(
int))
3239 unsigned int i, entries, sample_size, field_size, num_bytes;
3244 if (
c->fc->nb_streams < 1)
3246 st =
c->fc->streams[
c->fc->nb_streams-1];
3252 if (atom.
type ==
MKTAG(
's',
't',
's',
'z')) {
3271 if (field_size != 4 && field_size != 8 && field_size != 16 && field_size != 32) {
3288 num_bytes = (entries*field_size+4)>>3;
3306 for (
i = 0;
i < entries;
i++) {
3327 unsigned int i, entries, alloc_size = 0;
3329 int64_t total_sample_count = 0;
3330 int64_t current_dts = 0;
3331 int64_t corrected_dts = 0;
3333 if (
c->fc->nb_streams < 1)
3335 st =
c->fc->streams[
c->fc->nb_streams-1];
3343 c->fc->nb_streams-1, entries);
3349 if (entries >= INT_MAX /
sizeof(*sc->
stts_data))
3353 unsigned int sample_duration;
3354 unsigned int sample_count;
3355 unsigned int min_entries =
FFMIN(
FFMAX(
i + 1, 1024 * 1024), entries);
3373 sample_count, sample_duration);
3378 if (sample_duration >
c->max_stts_delta) {
3381 av_log(
c->fc,
AV_LOG_WARNING,
"Too large sample offset %u in stts entry %u with count %u in st:%d. Clipping to 1.\n",
3382 sample_duration,
i, sample_count, st->
index);
3384 corrected_dts += (delta_magnitude < 0 ? (int64_t)delta_magnitude : 1) * sample_count;
3386 corrected_dts += sample_duration * sample_count;
3391 if (current_dts > corrected_dts) {
3392 int64_t drift = (current_dts - corrected_dts)/
FFMAX(sample_count, 1);
3394 current_dts -= correction * sample_count;
3405 duration <= INT64_MAX - sc->duration_for_fps &&
3406 total_sample_count <= INT_MAX - sc->nb_frames_for_fps) {
3428 "All samples in data stream index:id [%d:%d] have zero "
3429 "duration, stream set to be discarded by default. Override "
3430 "using AVStream->discard or -discard for ffmpeg command.\n",
3444 if (
c->fc->nb_streams < 1)
3446 st =
c->fc->streams[
c->fc->nb_streams - 1];
3451 entries = atom.
size - 4;
3454 c->fc->nb_streams - 1, entries);
3487 unsigned int i, entries, ctts_count = 0;
3489 if (
c->fc->nb_streams < 1)
3491 st =
c->fc->streams[
c->fc->nb_streams-1];
3502 if (entries >= UINT_MAX /
sizeof(*sc->
ctts_data))
3515 "ignoring CTTS entry with count=%d duration=%d\n",
3554 uint32_t grouping_type;
3555 uint32_t default_length;
3556 av_unused uint32_t default_group_description_index;
3557 uint32_t entry_count;
3559 if (
c->fc->nb_streams < 1)
3561 st =
c->fc->streams[
c->fc->nb_streams - 1];
3572 if (grouping_type !=
MKTAG(
's',
'y',
'n',
'c'))
3586 uint32_t description_length = default_length;
3587 if (
version >= 1 && default_length == 0)
3589 if (grouping_type ==
MKTAG(
's',
'y',
'n',
'c')) {
3590 const uint8_t nal_unit_type =
avio_r8(pb) & 0x3f;
3592 description_length -= 1;
3609 unsigned int i, entries;
3611 uint32_t grouping_type;
3615 if (
c->fc->nb_streams < 1)
3617 st =
c->fc->streams[
c->fc->nb_streams-1];
3624 if (grouping_type ==
MKTAG(
'r',
'a',
'p',
' ')) {
3627 }
else if (grouping_type ==
MKTAG(
's',
'y',
'n',
'c')) {
3668 unsigned int edit_list_index,
3669 int64_t *edit_list_media_time,
3670 int64_t *edit_list_duration,
3671 int64_t global_timescale)
3676 *edit_list_media_time = msc->
elst_data[edit_list_index].
time;
3680 if (global_timescale == 0) {
3713 int64_t timestamp_pts,
3716 int64_t* ctts_index,
3717 int64_t* ctts_sample)
3724 int64_t index_ctts_count;
3752 if (ctts_data && *
index >= 0) {
3758 for (index_ctts_count = 0; index_ctts_count < *
index; index_ctts_count++) {
3759 if (*ctts_index < ctts_count) {
3761 if (ctts_data[*ctts_index].
count == *ctts_sample) {
3768 while (*
index >= 0 && (*ctts_index) >= 0 && (*ctts_index) < ctts_count) {
3772 if ((e_old[*
index].timestamp + ctts_data[*ctts_index].
duration) <= timestamp_pts &&
3778 if (*ctts_sample == 0) {
3780 if (*ctts_index >= 0)
3781 *ctts_sample = ctts_data[*ctts_index].
count - 1;
3791 return *
index >= 0 ? 0 : -1;
3815 const size_t requested_size =
3832 ie= &entries[
index];
3847 int64_t* frame_duration_buffer,
3848 int frame_duration_buffer_size) {
3851 av_assert0(end_index >= 0 && end_index <= sti->nb_index_entries);
3852 for (
i = 0;
i < frame_duration_buffer_size;
i++) {
3853 end_ts -= frame_duration_buffer[frame_duration_buffer_size - 1 -
i];
3866 const size_t min_size_needed = (*ctts_count + 1) *
sizeof(
MOVCtts);
3867 const size_t requested_size =
3868 min_size_needed > *allocated_size ?
3869 FFMAX(min_size_needed, 2 * (*allocated_size)) :
3872 if ((
unsigned)(*ctts_count) >= UINT_MAX /
sizeof(
MOVCtts) - 1)
3875 ctts_buf_new =
av_fast_realloc(*ctts_data, allocated_size, requested_size);
3880 *ctts_data = ctts_buf_new;
3885 *ctts_count = (*ctts_count) + 1;
3889 #define MAX_REORDER_DELAY 16
3895 int ctts_sample = 0;
3898 int j,
r, num_swaps;
3901 pts_buf[j] = INT64_MIN;
3909 buf_start = (buf_start + 1);
3922 while (j != buf_start) {
3925 if (pts_buf[j] < pts_buf[
r]) {
3926 FFSWAP(int64_t, pts_buf[j], pts_buf[
r]);
3984 if (range_size > current_sample) {
3988 current_sample -= range_size;
4007 int64_t ctts_index_old = 0;
4008 int64_t ctts_sample_old = 0;
4010 int64_t edit_list_media_time = 0;
4011 int64_t edit_list_duration = 0;
4012 int64_t frame_duration = 0;
4013 int64_t edit_list_dts_counter = 0;
4014 int64_t edit_list_dts_entry_end = 0;
4015 int64_t edit_list_start_ctts_sample = 0;
4017 int64_t curr_ctts = 0;
4018 int64_t empty_edits_sum_duration = 0;
4019 int64_t edit_list_index = 0;
4022 int64_t start_dts = 0;
4023 int64_t edit_list_start_encountered = 0;
4024 int64_t search_timestamp = 0;
4025 int64_t* frame_duration_buffer =
NULL;
4026 int num_discarded_begin = 0;
4027 int first_non_zero_audio_edit = -1;
4028 int packet_skip_samples = 0;
4030 int found_keyframe_after_edit = 0;
4031 int found_non_empty_edit = 0;
4064 edit_list_dts_entry_end -= msc->
dts_shift;
4068 start_dts = edit_list_dts_entry_end;
4072 av_log(mov->
fc,
AV_LOG_DEBUG,
"Processing st: %d, edit list %"PRId64
" - media time: %"PRId64
", duration: %"PRId64
"\n",
4073 st->
index, edit_list_index, edit_list_media_time, edit_list_duration);
4075 edit_list_dts_counter = edit_list_dts_entry_end;
4076 edit_list_dts_entry_end += edit_list_duration;
4077 num_discarded_begin = 0;
4078 if (!found_non_empty_edit && edit_list_media_time == -1) {
4079 empty_edits_sum_duration += edit_list_duration;
4082 found_non_empty_edit = 1;
4087 if (first_non_zero_audio_edit < 0) {
4088 first_non_zero_audio_edit = 1;
4090 first_non_zero_audio_edit = 0;
4093 if (first_non_zero_audio_edit > 0)
4101 search_timestamp = edit_list_media_time;
4110 &
index, &ctts_index_old, &ctts_sample_old) < 0) {
4112 "st: %d edit list: %"PRId64
" Missing key frame while searching for timestamp: %"PRId64
"\n",
4113 st->
index, edit_list_index, search_timestamp);
4115 &
index, &ctts_index_old, &ctts_sample_old) < 0) {
4117 "st: %d edit list %"PRId64
" Cannot find an index entry before timestamp: %"PRId64
".\n",
4118 st->
index, edit_list_index, search_timestamp);
4121 ctts_sample_old = 0;
4124 current = e_old +
index;
4125 edit_list_start_ctts_sample = ctts_sample_old;
4128 edit_list_start_encountered = 0;
4129 found_keyframe_after_edit = 0;
4130 for (; current < e_old_end; current++,
index++) {
4132 frame_duration = (current + 1 < e_old_end) ?
4133 ((current + 1)->timestamp - current->
timestamp) : edit_list_duration;
4141 if (ctts_data_old && ctts_index_old < ctts_count_old) {
4142 curr_ctts = ctts_data_old[ctts_index_old].
duration;
4143 av_log(mov->
fc,
AV_LOG_TRACE,
"stts: %"PRId64
" ctts: %"PRId64
", ctts_index: %"PRId64
", ctts_count: %"PRId64
"\n",
4144 curr_cts, curr_ctts, ctts_index_old, ctts_count_old);
4145 curr_cts += curr_ctts;
4147 if (ctts_sample_old == ctts_data_old[ctts_index_old].
count) {
4150 ctts_data_old[ctts_index_old].
count - edit_list_start_ctts_sample,
4151 ctts_data_old[ctts_index_old].
duration) == -1) {
4154 ctts_data_old[ctts_index_old].
count - edit_list_start_ctts_sample,
4155 ctts_data_old[ctts_index_old].
duration);
4159 ctts_sample_old = 0;
4160 edit_list_start_ctts_sample = 0;
4164 if (curr_cts < edit_list_media_time || curr_cts >= (edit_list_duration + edit_list_media_time)) {
4166 curr_cts < edit_list_media_time && curr_cts + frame_duration > edit_list_media_time &&
4167 first_non_zero_audio_edit > 0) {
4168 packet_skip_samples = edit_list_media_time - curr_cts;
4172 edit_list_dts_counter -= packet_skip_samples;
4173 if (edit_list_start_encountered == 0) {
4174 edit_list_start_encountered = 1;
4177 if (frame_duration_buffer) {
4179 frame_duration_buffer, num_discarded_begin);
4184 av_log(mov->
fc,
AV_LOG_DEBUG,
"skip %d audio samples from curr_cts: %"PRId64
"\n", packet_skip_samples, curr_cts);
4189 if (edit_list_start_encountered == 0) {
4190 num_discarded_begin++;
4191 frame_duration_buffer =
av_realloc(frame_duration_buffer,
4192 num_discarded_begin *
sizeof(int64_t));
4193 if (!frame_duration_buffer) {
4197 frame_duration_buffer[num_discarded_begin - 1] = frame_duration;
4212 if (edit_list_start_encountered == 0) {
4213 edit_list_start_encountered = 1;
4216 if (frame_duration_buffer) {
4218 frame_duration_buffer, num_discarded_begin);
4231 if (!current_index_range ||
index != current_index_range->
end) {
4232 current_index_range = current_index_range ? current_index_range + 1
4236 current_index_range->
end =
index + 1;
4239 if (edit_list_start_encountered > 0) {
4240 edit_list_dts_counter = edit_list_dts_counter + frame_duration;
4244 if ((curr_cts + frame_duration >= (edit_list_duration + edit_list_media_time)) &&
4246 if (ctts_data_old) {
4251 found_keyframe_after_edit = 1;
4254 if (ctts_sample_old != 0) {
4257 ctts_sample_old - edit_list_start_ctts_sample,
4258 ctts_data_old[ctts_index_old].
duration) == -1) {
4260 ctts_index_old, ctts_sample_old - edit_list_start_ctts_sample,
4261 ctts_data_old[ctts_index_old].
duration);
4296 current_index_range = current_index_range ? current_index_range + 1
4298 current_index_range->
start = 0;
4299 current_index_range->
end = 0;
4358 if (sg->
index == cra_index)
4359 for (uint32_t j = 0; j < sg->
count; j++)
4361 if (sg->
count > INT_MAX - sample_id)
4363 sample_id += sg->
count;
4378 int64_t current_offset;
4379 int64_t current_dts = 0;
4380 unsigned int stts_index = 0;
4381 unsigned int stsc_index = 0;
4382 unsigned int stss_index = 0;
4383 unsigned int stps_index = 0;
4385 uint64_t stream_size = 0;
4387 unsigned int ctts_count_old = sc->
ctts_count;
4394 int i, edit_start_index = 0, multiple_edits = 0;
4395 int64_t empty_duration = 0;
4400 if (
i == 0 && e->
time == -1) {
4404 edit_start_index = 1;
4405 }
else if (
i == edit_start_index && e->
time >= 0) {
4415 "not supported in fragmented MP4 files\n");
4418 "Use -advanced_editlist to correctly decode otherwise "
4419 "a/v desync might occur\n");
4444 unsigned int current_sample = 0;
4445 unsigned int stts_sample = 0;
4446 unsigned int sample_size;
4448 unsigned int rap_group_index = 0;
4449 unsigned int rap_group_sample = 0;
4467 if (ctts_data_old) {
4482 for (
i = 0;
i < ctts_count_old &&
4484 for (j = 0; j < ctts_data_old[
i].
count &&
4525 if (rap_group_present && rap_group_index < sc->rap_group_count) {
4528 if (++rap_group_sample == sc->
rap_group[rap_group_index].
count) {
4529 rap_group_sample = 0;
4535 && !rap_group_present
4541 if (current_offset > INT64_MAX - sample_size) {
4551 if (sample_size > 0x3FFFFFFF) {
4556 e->
pos = current_offset;
4558 e->
size = sample_size;
4561 av_log(mov->
fc,
AV_LOG_TRACE,
"AVIndex stream %d, sample %u, offset %"PRIx64
", dts %"PRId64
", "
4562 "size %u, distance %u, keyframe %d\n", st->
index, current_sample,
4563 current_offset, current_dts, sample_size,
distance, keyframe);
4568 current_offset += sample_size;
4569 stream_size += sample_size;
4585 unsigned chunk_samples, total = 0;
4592 unsigned count, chunk_count;
4607 count = (chunk_samples+1023) / 1024;
4614 total += chunk_count *
count;
4636 while (chunk_samples > 0) {
4642 "Zero bytes per frame, but %d samples per frame",
4665 if (
size > 0x3FFFFFFF) {
4670 e->
pos = current_offset;
4676 "size %u, duration %u\n", st->
index,
i, current_offset, current_dts,
4679 current_offset +=
size;
4712 av_url_split(src_proto,
sizeof(src_proto), src_auth,
sizeof(src_auth), src_host,
sizeof(src_host), &src_port,
NULL, 0,
src);
4713 av_url_split(ref_proto,
sizeof(ref_proto), ref_auth,
sizeof(ref_auth), ref_host,
sizeof(ref_host), &ref_port,
NULL, 0,
ref);
4715 if (strlen(
src) == 0) {
4717 }
else if (strlen(src_auth) + 1 >=
sizeof(src_auth) ||
4718 strlen(ref_auth) + 1 >=
sizeof(ref_auth) ||
4719 strlen(src_host) + 1 >=
sizeof(src_host) ||
4720 strlen(ref_host) + 1 >=
sizeof(ref_host)) {
4722 }
else if (strcmp(src_proto, ref_proto) ||
4723 strcmp(src_auth, ref_auth) ||
4724 strcmp(src_host, ref_host) ||
4725 src_port != ref_port) {
4735 if (
ref->nlvl_to > 0 &&
ref->nlvl_from > 0) {
4736 char filename[1025];
4737 const char *src_path;
4741 src_path = strrchr(
src,
'/');
4748 for (
i = 0, l = strlen(
ref->path) - 1; l >= 0; l--)
4749 if (
ref->path[l] ==
'/') {
4750 if (
i ==
ref->nlvl_to - 1)
4757 if (
i ==
ref->nlvl_to - 1 && src_path -
src <
sizeof(filename)) {
4758 memcpy(filename,
src, src_path -
src);
4759 filename[src_path -
src] = 0;
4761 for (
i = 1;
i <
ref->nlvl_from;
i++)
4762 av_strlcat(filename,
"../",
sizeof(filename));
4765 if (!
c->use_absolute_path) {
4770 "Reference with mismatching origin, %s not tried for security reasons, "
4771 "set demuxer option use_absolute_path to allow it anyway\n",
4776 if (strstr(
ref->path + l + 1,
"..") ||
4777 strstr(
ref->path + l + 1,
":") ||
4778 (
ref->nlvl_from > 1 && same_origin < 0) ||
4779 (filename[0] ==
'/' && src_path ==
src))
4783 if (strlen(filename) + 1 ==
sizeof(filename))
4788 }
else if (
c->use_absolute_path) {
4790 "this is a possible security issue\n");
4795 "Absolute path %s not tried for security reasons, "
4796 "set demuxer option use_absolute_path to allow absolute paths\n",
4821 for (
int j = 0; j <
c->fc->nb_stream_groups; j++)
4823 stg =
c->fc->stream_groups[j];
4831 out->codecpar->bit_rate = 0;
4863 if (
c->found_iinf) {
4866 for (
int i =
c->nb_heif_item - 1;
i >= 0;
i--) {
4876 c->nb_heif_item = 0;
4877 c->found_iinf =
c->found_iloc = 0;
4881 if (!st)
return AVERROR(ENOMEM);
4884 if (!sc)
return AVERROR(ENOMEM);
4889 c->trak_index = st->
index;
4930 "MP4. disabling.\n");
4931 c->advanced_editlist = 0;
4932 c->advanced_editlist_autodisabled = 1;
4945 if (
c->enable_drefs) {
4948 "stream %d, error opening alias: path='%s', dir='%s', "
4949 "filename='%s', volume='%s', nlvl_from=%d, nlvl_to=%d\n",
4954 "Skipped opening external track: "
4955 "stream %d, alias: path='%s', dir='%s', "
4956 "filename='%s', volume='%s', nlvl_from=%d, nlvl_to=%d."
4957 "Set enable_drefs to allow this.\n",
4974 #if FF_API_R_FRAME_RATE
4990 #if CONFIG_H261_DECODER
4993 #if CONFIG_H263_DECODER
4996 #if CONFIG_MPEG4_DECODER
5028 c->itunes_metadata = 1;
5030 c->itunes_metadata = 0;
5044 if (
count > UINT_MAX /
sizeof(*
c->meta_keys) - 1) {
5046 "The 'keys' atom with the invalid key count: %"PRIu32
"\n",
count);
5050 c->meta_keys_count =
count + 1;
5051 c->meta_keys =
av_mallocz(
c->meta_keys_count *
sizeof(*
c->meta_keys));
5060 "The key# %"PRIu32
" in meta has invalid size:"
5061 "%"PRIu32
"\n",
i, key_size);
5069 if (!
c->meta_keys[
i])
5086 if (
c->fc->nb_streams < 1)
5088 st =
c->fc->streams[
c->fc->nb_streams-1];
5091 for (
i = 0;
i < 3;
i++) {
5102 if (len < 12 || len - 12 > end -
avio_tell(pb))
5106 if (
tag ==
MKTAG(
'm',
'e',
'a',
'n'))
5108 else if (
tag ==
MKTAG(
'n',
'a',
'm',
'e'))
5110 else if (
tag ==
MKTAG(
'd',
'a',
't',
'a') &&
len > 4) {
5134 if (strcmp(
key,
"iTunSMPB") == 0) {
5135 int priming, remainder,
samples;
5136 if(sscanf(
val,
"%*X %X %X %X", &priming, &remainder, &
samples) == 3){
5137 if(priming>0 && priming<16384)
5141 if (strcmp(
key,
"cdec") != 0) {
5148 "Unhandled or malformed custom metadata of size %"PRId64
"\n", atom.
size);
5217 while (atom.
size > 8) {
5223 if (
tag ==
MKTAG(
'h',
'd',
'l',
'r')) {
5233 #define IS_MATRIX_IDENT(matrix) \
5234 ( (matrix)[0][0] == (1 << 16) && \
5235 (matrix)[1][1] == (1 << 16) && \
5236 (matrix)[2][2] == (1 << 30) && \
5237 !(matrix)[0][1] && !(matrix)[0][2] && \
5238 !(matrix)[1][0] && !(matrix)[1][2] && \
5239 !(matrix)[2][0] && !(matrix)[2][1])
5246 int display_matrix[3][3];
5247 int res_display_matrix[3][3] = { { 0 } };
5253 if (
c->fc->nb_streams < 1)
5255 st =
c->fc->streams[
c->fc->nb_streams-1];
5292 for (
i = 0;
i < 3;
i++) {
5304 for (
i = 0;
i < 3;
i++) {
5305 const int sh[3] = { 16, 16, 30 };
5306 for (j = 0; j < 3; j++) {
5307 for (e = 0; e < 3; e++) {
5308 res_display_matrix[
i][j] +=
5309 ((int64_t) display_matrix[
i][e] *
5310 c->movie_display_matrix[e][j]) >> sh[e];
5322 for (
i = 0;
i < 3;
i++)
5323 for (j = 0; j < 3; j++)
5330 double disp_transform[2];
5332 for (
i = 0;
i < 2;
i++)
5336 if (disp_transform[0] > 1 && disp_transform[1] > 1 &&
5337 disp_transform[0] < (1<<24) && disp_transform[1] < (1<<24) &&
5338 fabs((disp_transform[0] / disp_transform[1]) - 1.0) > 0.01)
5340 disp_transform[0] / disp_transform[1],
5359 for (
i = 0;
i <
c->trex_count;
i++)
5360 if (
c->trex_data[
i].track_id == track_id) {
5361 trex = &
c->trex_data[
i];
5368 c->fragment.found_tfhd = 1;
5386 if (frag_stream_info) {
5398 num = atom.
size / 4;
5403 c->chapter_tracks = new_tracks;
5404 c->nb_chapter_tracks = num;
5409 c->nb_chapter_tracks =
i;
5419 if ((uint64_t)
c->trex_count+1 >= UINT_MAX /
sizeof(*
c->trex_data))
5422 sizeof(*
c->trex_data))) < 0) {
5429 trex = &
c->trex_data[
c->trex_count++];
5447 int64_t base_media_decode_time;
5449 for (
i = 0;
i <
c->fc->nb_streams;
i++) {
5450 sc =
c->fc->streams[
i]->priv_data;
5452 st =
c->fc->streams[
i];
5472 if (frag_stream_info)
5473 frag_stream_info->
tfdt_dts = base_media_decode_time;
5488 int data_offset = 0;
5489 unsigned entries, first_sample_flags = frag->
flags;
5492 int next_frag_index = -1, index_entry_pos;
5493 size_t requested_size;
5494 size_t old_ctts_allocated_size;
5503 for (
i = 0;
i <
c->fc->nb_streams;
i++) {
5504 sc =
c->fc->streams[
i]->priv_data;
5506 st =
c->fc->streams[
i];
5526 for (
i =
c->frag_index.current + 1; i < c->frag_index.nb_items;
i++) {
5528 if (frag_stream_info && frag_stream_info->
index_entry >= 0) {
5529 next_frag_index =
i;
5534 av_assert0(index_entry_pos <= sti->nb_index_entries);
5547 if (frag_stream_info) {
5554 ", using it for pts\n",
pts);
5559 ", using it for dts\n",
pts);
5563 int fallback_tfdt = !
c->use_tfdt && !has_sidx && has_tfdt;
5564 int fallback_sidx =
c->use_tfdt && !has_tfdt && has_sidx;
5566 if (fallback_sidx) {
5569 if (fallback_tfdt) {
5573 if (has_tfdt &&
c->use_tfdt || fallback_tfdt) {
5576 ", using it for dts\n", dts);
5577 }
else if (has_sidx && !
c->use_tfdt || fallback_sidx) {
5582 ", using it for dts\n", frag_stream_info->
sidx_pts);
5586 ", using it for dts\n", dts);
5592 ", using it for dts\n", dts);
5625 memset((uint8_t*)(sc->
ctts_data) + old_ctts_allocated_size, 0,
5628 if (index_entry_pos < sti->nb_index_entries) {
5634 memmove(sc->
ctts_data + index_entry_pos + entries,
5637 if (index_entry_pos < sc->current_sample) {
5646 if (frag_stream_info) {
5649 frag_stream_info->
index_base = index_entry_pos;
5652 if (index_entry_pos > 0)
5656 unsigned sample_size = frag->
size;
5657 int sample_flags =
i ? frag->
flags : first_sample_flags;
5658 unsigned sample_duration = frag->
duration;
5659 unsigned ctts_duration = 0;
5661 int index_entry_flags = 0;
5672 dts -= ctts_duration;
5677 "pts %"PRId64
" calculated dts %"PRId64
5678 " sc->dts_shift %d ctts.duration %d"
5679 " sc->time_offset %"PRId64
5680 " flags & MOV_TRUN_SAMPLE_CTS %d\n",
5699 if (prev_dts >= dts)
5712 av_log(
c->fc,
AV_LOG_TRACE,
"AVIndex stream %d, sample %d, offset %"PRIx64
", dts %"PRId64
", "
5713 "size %u, distance %d, keyframe %d\n", st->
index,
5716 if (
av_sat_add64(dts, sample_duration) != dts + (uint64_t)sample_duration)
5720 dts += sample_duration;
5724 if (sample_duration <= INT64_MAX - sc->duration_for_fps &&
5731 if (frag_stream_info)
5736 int gap = entries -
i;
5741 memmove(sc->
ctts_data + index_entry_pos,
5748 if (index_entry_pos < sc->current_sample) {
5758 if (index_entry_pos > 0)
5761 if (prev_dts < sti->index_entries[
i].timestamp)
5792 unsigned i, j, track_id, item_count;
5807 for (
i = 0;
i <
c->fc->nb_streams;
i++) {
5808 sc =
c->fc->streams[
i]->priv_data;
5809 if (sc->
id == track_id) {
5810 st =
c->fc->streams[
i];
5823 if (timescale.
den <= 0) {
5838 offset += (uint64_t)offadd;
5843 if (item_count == 0)
5846 for (
i = 0;
i < item_count;
i++) {
5851 if (
size & 0x80000000) {
5860 if (frag_stream_info)
5861 frag_stream_info->
sidx_pts = timestamp;
5876 is_complete =
offset == stream_size;
5880 if (!
c->have_read_mfra_size) {
5881 if ((
ret =
avio_seek(pb, stream_size - 4, SEEK_SET)) < 0)
5884 c->have_read_mfra_size = 1;
5888 if (
offset == stream_size -
c->mfra_size)
5895 for (
i = 0;
i <
c->frag_index.nb_items;
i++) {
5901 ref_st =
c->fc->streams[j];
5907 if (ref_st)
for (
i = 0;
i <
c->fc->nb_streams;
i++) {
5908 st =
c->fc->streams[
i];
5915 c->frag_index.complete = 1;
5936 if (atom.
type !=
MKTAG(
'm',
'd',
'a',
't')) {
5950 long cmov_len, moov_len;
5964 cmov_len = atom.
size - 6 * 4;
5976 goto free_and_return;
5979 if (uncompress (moov_data, (uLongf *) &moov_len, (
const Bytef *)cmov_data, cmov_len) != Z_OK)
5980 goto free_and_return;
5984 atom.
size = moov_len;
6001 int64_t elst_entry_size;
6003 if (
c->fc->nb_streams < 1 ||
c->ignore_editlist)
6005 sc =
c->fc->streams[
c->fc->nb_streams-1]->priv_data;
6012 elst_entry_size =
version == 1 ? 20 : 12;
6013 if (atom.
size != edit_count * elst_entry_size) {
6015 av_log(
c->fc,
AV_LOG_ERROR,
"Invalid edit list entry_count: %d for elst atom of size: %"PRId64
" bytes.\n",
6016 edit_count, atom.
size + 8);
6019 edit_count = atom.
size / elst_entry_size;
6020 if (edit_count * elst_entry_size != atom.
size) {
6054 if (e->
time < 0 && e->
time != -1 &&
6056 av_log(
c->fc,
AV_LOG_ERROR,
"Track %d, edit %d: Invalid edit list media time=%"PRId64
"\n",
6057 c->fc->nb_streams-1,
i, e->
time);
6070 if (
c->fc->nb_streams < 1)
6072 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
6082 if (
c->fc->nb_streams < 1)
6084 st =
c->fc->streams[
c->fc->nb_streams - 1];
6086 if (atom.
size < 5) {
6126 if (
c->fc->nb_streams < 1)
6129 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
6131 if (atom.
size < 5) {
6150 for (
i = 0;
i < 3;
i++) {
6169 const int mapping[3] = {1, 2, 0};
6170 const int chroma_den = 50000;
6171 const int luma_den = 10000;
6174 if (
c->fc->nb_streams < 1)
6177 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
6188 for (
i = 0;
i < 3;
i++) {
6189 const int j = mapping[
i];
6210 if (
c->fc->nb_streams < 1)
6213 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
6215 if (atom.
size < 5) {
6246 if (
c->fc->nb_streams < 1)
6249 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
6251 if (atom.
size < 4) {
6274 const int illuminance_den = 10000;
6275 const int ambient_den = 50000;
6276 if (
c->fc->nb_streams < 1)
6278 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
6279 if (atom.
size < 6) {
6303 if (
c->fc->nb_streams < 1)
6306 st =
c->fc->streams[
c->fc->nb_streams - 1];
6309 if (atom.
size < 5) {
6349 uint32_t l = 0, t = 0,
r = 0,
b = 0;
6350 uint32_t
tag, padding = 0;
6353 if (
c->fc->nb_streams < 1)
6356 st =
c->fc->streams[
c->fc->nb_streams - 1];
6359 if (atom.
size < 8) {
6365 if (size <= 12 || size > atom.
size)
6369 if (
tag !=
MKTAG(
's',
'v',
'h',
'd')) {
6387 if (
tag !=
MKTAG(
'p',
'r',
'o',
'j')) {
6397 if (
tag !=
MKTAG(
'p',
'r',
'h',
'd')) {
6427 case MKTAG(
'c',
'b',
'm',
'p'):
6431 "Unsupported cubemap layout %d\n",
layout);
6437 case MKTAG(
'e',
'q',
'u',
'i'):
6443 if (
b >= UINT_MAX - t ||
r >= UINT_MAX - l) {
6445 "Invalid bounding rectangle coordinates "
6446 "%"PRIu32
",%"PRIu32
",%"PRIu32
",%"PRIu32
"\n", l, t,
r,
b);
6450 if (l || t ||
r ||
b)
6549 static const AVUUID uuid_isml_manifest = {
6550 0xa5, 0xd4, 0x0b, 0x30, 0xe8, 0x14, 0x11, 0xdd,
6551 0xba, 0x2f, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66
6553 static const AVUUID uuid_xmp = {
6554 0xbe, 0x7a, 0xcf, 0xcb, 0x97, 0xa9, 0x42, 0xe8,
6555 0x9c, 0x71, 0x99, 0x94, 0x91, 0xe3, 0xaf, 0xac
6557 static const AVUUID uuid_spherical = {
6558 0xff, 0xcc, 0x82, 0x63, 0xf8, 0x55, 0x4a, 0x93,
6559 0x88, 0x14, 0x58, 0x7a, 0x02, 0x52, 0x1f, 0xdd,
6565 if (
c->fc->nb_streams < 1)
6567 st =
c->fc->streams[
c->fc->nb_streams - 1];
6595 while ((ptr =
av_stristr(ptr,
"systemBitrate=\""))) {
6596 ptr +=
sizeof(
"systemBitrate=\"") - 1;
6597 c->bitrates_count++;
6598 c->bitrates =
av_realloc_f(
c->bitrates,
c->bitrates_count,
sizeof(*
c->bitrates));
6600 c->bitrates_count = 0;
6605 ret = strtol(ptr, &endptr, 10);
6606 if (
ret < 0 || errno || *endptr !=
'"') {
6607 c->bitrates[
c->bitrates_count - 1] = 0;
6609 c->bitrates[
c->bitrates_count - 1] =
ret;
6617 if (
c->export_xmp) {
6651 uint8_t content[16];
6662 && !memcmp(content,
"Anevia\x1A\x1A", 8)
6677 if (
c->fc->nb_streams < 1)
6679 st =
c->fc->streams[
c->fc->nb_streams - 1];
6684 case MKTAG(
'e',
'n',
'c',
'v'):
6685 case MKTAG(
'e',
'n',
'c',
'a'):
6690 "ignoring 'frma' atom of '%.4s', stream has codec id %d\n",
6702 "ignoring 'frma' atom of '%.4s', stream format is '%.4s'\n",
6724 if (frag_stream_info) {
6725 for (
i = 0;
i <
c->fc->nb_streams;
i++) {
6726 *sc =
c->fc->streams[
i]->priv_data;
6727 if ((*sc)->id == frag_stream_info->
id) {
6728 st =
c->fc->streams[
i];
6732 if (
i ==
c->fc->nb_streams)
6738 if (!(*sc)->cenc.default_encrypted_sample)
6749 if (
c->fc->nb_streams < 1)
6751 st =
c->fc->streams[
c->fc->nb_streams - 1];
6754 if (!(*sc)->cenc.encryption_index) {
6756 if (!(*sc)->cenc.default_encrypted_sample)
6759 if (!(*sc)->cenc.encryption_index)
6763 *encryption_index = (*sc)->cenc.encryption_index;
6771 unsigned int subsample_count;
6795 if (use_subsamples) {
6797 av_free((*sample)->subsamples);
6798 (*sample)->subsamples =
av_calloc(subsample_count,
sizeof(*subsamples));
6799 if (!(*sample)->subsamples) {
6806 (*sample)->subsamples[
i].bytes_of_clear_data =
avio_rb16(pb);
6807 (*sample)->subsamples[
i].bytes_of_protected_data =
avio_rb32(pb);
6816 (*sample)->subsample_count = subsample_count;
6827 int use_subsamples,
ret;
6828 unsigned int sample_count,
i, alloc_size = 0;
6844 if (sample_count >= INT_MAX /
sizeof(*encrypted_samples))
6847 for (
i = 0;
i < sample_count;
i++) {
6848 unsigned int min_samples =
FFMIN(
FFMAX(
i + 1, 1024 * 1024), sample_count);
6850 min_samples *
sizeof(*encrypted_samples));
6851 if (encrypted_samples) {
6882 size_t sample_count, sample_info_size,
i;
6884 unsigned int alloc_size = 0;
6893 if (sample_count >= INT_MAX /
sizeof(*encrypted_samples))
6899 av_log(
c->fc,
AV_LOG_INFO,
"Failed to seek for auxiliary info, will only parse senc atoms for encryption info\n");
6904 unsigned int min_samples =
FFMIN(
FFMAX(
i + 1, 1024 * 1024), sample_count);
6906 min_samples *
sizeof(*encrypted_samples));
6907 if (!encrypted_samples) {
6932 for (;
i > 0;
i--) {
6945 unsigned int sample_count, aux_info_type, aux_info_param;
6971 if (aux_info_param != 0) {
6977 if ((aux_info_type ==
MKBETAG(
'c',
'e',
'n',
'c') ||
6978 aux_info_type ==
MKBETAG(
'c',
'e',
'n',
's') ||
6979 aux_info_type ==
MKBETAG(
'c',
'b',
'c',
'1') ||
6980 aux_info_type ==
MKBETAG(
'c',
'b',
'c',
's')) &&
6981 aux_info_param == 0) {
7002 if (
ret != sample_count) {
7023 uint64_t *auxiliary_offsets;
7027 unsigned int version, entry_count, aux_info_type, aux_info_param;
7028 unsigned int alloc_size = 0;
7054 if (aux_info_param != 0) {
7060 if ((aux_info_type ==
MKBETAG(
'c',
'e',
'n',
'c') ||
7061 aux_info_type ==
MKBETAG(
'c',
'e',
'n',
's') ||
7062 aux_info_type ==
MKBETAG(
'c',
'b',
'c',
'1') ||
7063 aux_info_type ==
MKBETAG(
'c',
'b',
'c',
's')) &&
7064 aux_info_param == 0) {
7077 if (entry_count >= INT_MAX /
sizeof(*auxiliary_offsets))
7081 unsigned int min_offsets =
FFMIN(
FFMAX(
i + 1, 1024), entry_count);
7084 min_offsets *
sizeof(*auxiliary_offsets));
7085 if (!auxiliary_offsets) {
7096 if (
c->frag_index.current >= 0) {
7122 uint8_t *side_data, *extra_data;
7123 size_t side_data_size;
7125 unsigned int version, kid_count, extra_data_size, alloc_size = 0;
7127 if (
c->fc->nb_streams < 1)
7129 st =
c->fc->streams[
c->fc->nb_streams-1];
7146 if (kid_count >= INT_MAX /
sizeof(*key_ids)) {
7151 for (
unsigned int i = 0;
i < kid_count && !pb->
eof_reached;
i++) {
7152 unsigned int min_kid_count =
FFMIN(
FFMAX(
i + 1, 1024), kid_count);
7154 min_kid_count *
sizeof(*key_ids));
7159 info->key_ids = key_ids;
7162 if (!
info->key_ids[
i]) {
7166 info->num_key_ids =
i + 1;
7182 extra_data =
av_malloc(extra_data_size);
7188 if (
ret != extra_data_size) {
7197 info->data = extra_data;
7198 info->data_size = extra_data_size;
7203 if (old_side_data) {
7205 if (old_init_info) {
7213 info = old_init_info;
7229 side_data, side_data_size, 0))
7242 if (
c->fc->nb_streams < 1)
7244 st =
c->fc->streams[
c->fc->nb_streams-1];
7248 av_log(
c->fc,
AV_LOG_ERROR,
"schm boxes are only supported in first sample descriptor\n");
7272 unsigned int version, pattern, is_protected, iv_size;
7274 if (
c->fc->nb_streams < 1)
7276 st =
c->fc->streams[
c->fc->nb_streams-1];
7325 if (iv_size != 8 && iv_size != 16) {
7345 if (
c->fc->nb_streams < 1)
7347 st =
c->fc->streams[
c->fc->nb_streams-1];
7349 if ((uint64_t)atom.
size > (1<<30) || atom.
size < 42)
7358 if (
avio_read(pb, buf,
sizeof(buf)) !=
sizeof(buf)) {
7382 int bytes_of_protected_data;
7399 if (!
sample->subsample_count) {
7405 for (
i = 0;
i <
sample->subsample_count;
i++) {
7406 if (
sample->subsamples[
i].bytes_of_clear_data +
sample->subsamples[
i].bytes_of_protected_data >
size) {
7413 size -=
sample->subsamples[
i].bytes_of_clear_data;
7417 bytes_of_protected_data =
sample->subsamples[
i].bytes_of_protected_data;
7420 input += bytes_of_protected_data;
7421 size -= bytes_of_protected_data;
7435 int num_of_encrypted_blocks;
7451 memcpy(iv,
sample->iv, 16);
7454 if (!
sample->subsample_count) {
7460 for (
i = 0;
i <
sample->subsample_count;
i++) {
7461 if (
sample->subsamples[
i].bytes_of_clear_data +
sample->subsamples[
i].bytes_of_protected_data >
size) {
7466 if (
sample->subsamples[
i].bytes_of_protected_data % 16) {
7473 size -=
sample->subsamples[
i].bytes_of_clear_data;
7476 num_of_encrypted_blocks =
sample->subsamples[
i].bytes_of_protected_data/16;
7477 if (num_of_encrypted_blocks > 0) {
7480 input +=
sample->subsamples[
i].bytes_of_protected_data;
7481 size -=
sample->subsamples[
i].bytes_of_protected_data;
7494 int i,
ret, rem_bytes;
7513 if (!
sample->subsample_count) {
7517 }
else if (!
sample->crypt_byte_block && !
sample->skip_byte_block) {
7522 for (
i = 0;
i <
sample->subsample_count;
i++) {
7523 if (
sample->subsamples[
i].bytes_of_clear_data +
sample->subsamples[
i].bytes_of_protected_data >
size) {
7530 size -=
sample->subsamples[
i].bytes_of_clear_data;
7534 rem_bytes =
sample->subsamples[
i].bytes_of_protected_data;
7535 while (rem_bytes > 0) {
7536 if (rem_bytes < 16*sample->crypt_byte_block) {
7541 rem_bytes -= 16*
sample->crypt_byte_block;
7543 rem_bytes -=
FFMIN(16*
sample->skip_byte_block, rem_bytes);
7545 input +=
sample->subsamples[
i].bytes_of_protected_data;
7546 size -=
sample->subsamples[
i].bytes_of_protected_data;
7559 int i,
ret, rem_bytes;
7577 if (!
sample->subsample_count) {
7579 memcpy(iv,
sample->iv, 16);
7582 }
else if (!
sample->crypt_byte_block && !
sample->skip_byte_block) {
7587 for (
i = 0;
i <
sample->subsample_count;
i++) {
7588 if (
sample->subsamples[
i].bytes_of_clear_data +
sample->subsamples[
i].bytes_of_protected_data >
size) {
7595 size -=
sample->subsamples[
i].bytes_of_clear_data;
7598 memcpy(iv,
sample->iv, 16);
7600 rem_bytes =
sample->subsamples[
i].bytes_of_protected_data;
7601 while (rem_bytes > 0) {
7602 if (rem_bytes < 16*sample->crypt_byte_block) {
7607 rem_bytes -= 16*
sample->crypt_byte_block;
7609 rem_bytes -=
FFMIN(16*
sample->skip_byte_block, rem_bytes);
7611 input +=
sample->subsamples[
i].bytes_of_protected_data;
7612 size -=
sample->subsamples[
i].bytes_of_protected_data;
7641 int current = frag_index->
current;
7647 if (current >= 0 && current < frag_index->nb_items) {
7649 (current + 1 == frag_index->
nb_items ||
7660 frag_index->
current = current;
7669 int encrypted_index,
ret;
7672 encrypted_index = current_index;
7673 encryption_index =
NULL;
7674 if (frag_stream_info) {
7676 if (frag_stream_info->
stsd_id == 1) {
7678 encrypted_index = current_index - frag_stream_info->
index_base;
7688 if (encryption_index) {
7703 }
else if (encrypted_index >= 0 && encrypted_index < encryption_index->nb_encrypted_samples) {
7706 if (!encrypted_sample)
7738 if (
c->fc->nb_streams < 1)
7740 st =
c->fc->streams[
c->fc->nb_streams-1];
7742 if ((uint64_t)atom.
size > (1<<30) || atom.
size < 11)
7782 unsigned format_info;
7783 int channel_assignment, channel_assignment1, channel_assignment2;
7787 if (
c->fc->nb_streams < 1)
7789 st =
c->fc->streams[
c->fc->nb_streams-1];
7796 ratebits = (format_info >> 28) & 0xF;
7797 channel_assignment1 = (format_info >> 15) & 0x1F;
7798 channel_assignment2 = format_info & 0x1FFF;
7799 if (channel_assignment2)
7800 channel_assignment = channel_assignment2;
7802 channel_assignment = channel_assignment1;
7819 int64_t read_size = atom.
size;
7821 if (
c->fc->nb_streams < 1)
7823 st =
c->fc->streams[
c->fc->nb_streams-1];
7838 AVBPrint scheme_buf, value_buf;
7839 int64_t scheme_str_len = 0, value_str_len = 0;
7847 if (
c->fc->nb_streams < 1)
7849 st =
c->fc->streams[
c->fc->nb_streams-1];
7857 "Unsupported 'kind' box with version %d, flags: %x",
7867 ret = scheme_str_len;
7871 if (scheme_str_len + 1 >=
size) {
7879 size -= scheme_str_len + 1;
7883 ret = value_str_len;
7887 if (value_str_len ==
size) {
7894 "%s stream %d KindBox(scheme: %s, value: %s)\n",
7897 scheme_buf.str, value_buf.str);
7904 for (
int j = 0;
map.value_maps[j].disposition; j++) {
7929 if (
c->fc->nb_streams < 1)
7932 st =
c->fc->streams[
c->fc->nb_streams - 1];
7934 if (atom.
size < 16) {
7948 "Unsupported ambisonic type %d\n",
type);
7955 if (channel_order) {
7957 "Unsupported channel_order %d\n", channel_order);
7962 if (normalization) {
7964 "Unsupported normalization %d\n", normalization);
7971 "Invalid number of channels (%d / %d)\n",
7976 for (
i = 0;
i < channel_count;
i++) {
7979 "Ambisonic channel reordering is not supported\n");
7996 if (
c->fc->nb_streams < 1)
7999 st =
c->fc->streams[
c->fc->nb_streams - 1];
8001 if (atom.
size < 5) {
8051 int version, offset_size, length_size, base_offset_size, index_size;
8052 int item_count, extent_count;
8053 int64_t base_offset, extent_offset, extent_length;
8056 if (
c->found_moov) {
8066 offset_size = (
value >> 4) & 0xF;
8067 length_size =
value & 0xF;
8069 base_offset_size = (
value >> 4) & 0xF;
8080 c->heif_item = heif_item;
8081 if (item_count >
c->nb_heif_item)
8082 memset(
c->heif_item +
c->nb_heif_item, 0,
8083 sizeof(*
c->heif_item) * (item_count -
c->nb_heif_item));
8084 c->nb_heif_item =
FFMAX(
c->nb_heif_item, item_count);
8088 for (
int i = 0;
i < item_count;
i++) {
8094 if (offset_type > 1) {
8098 c->heif_item[
i].item_id = item_id;
8101 if (
rb_size(pb, &base_offset, base_offset_size) < 0)
8104 if (extent_count > 1) {
8109 for (
int j = 0; j < extent_count; j++) {
8110 if (
rb_size(pb, &extent_offset, offset_size) < 0 ||
8111 rb_size(pb, &extent_length, length_size) < 0)
8113 if (offset_type == 1)
8114 c->heif_item[
i].is_idat_relative = 1;
8115 c->heif_item[
i].extent_length = extent_length;
8116 c->heif_item[
i].extent_offset = base_offset + extent_offset;
8118 "extent_offset %"PRId64
", extent_length %"PRId64
"\n",
8119 i, offset_type,
c->heif_item[
i].extent_offset,
c->heif_item[
i].extent_length);
8165 c->heif_item[
c->cur_item_id].item_id = item_id;
8166 c->heif_item[
c->cur_item_id].type = item_type;
8168 switch (item_type) {
8169 case MKTAG(
'a',
'v',
'0',
'1'):
8170 case MKTAG(
'h',
'v',
'c',
'1'):
8188 if (
c->found_iinf) {
8192 if (
c->found_moov) {
8205 c->heif_item = heif_item;
8206 if (entry_count >
c->nb_heif_item)
8207 memset(
c->heif_item +
c->nb_heif_item, 0,
8208 sizeof(*
c->heif_item) * (entry_count -
c->nb_heif_item));
8209 c->nb_heif_item =
FFMAX(
c->nb_heif_item, entry_count);
8212 for (
int i = 0;
i < entry_count;
i++) {
8233 for (
int i = 0;
i <
c->nb_heif_grid;
i++) {
8234 if (
c->heif_grid[
i].item->item_id == from_item_id) {
8236 "referencing the same Derived Image item\n");
8240 for (
int i = 0;
i <
c->nb_heif_item;
i++) {
8241 if (
c->heif_item[
i].item_id != from_item_id)
8243 item = &
c->heif_item[
i];
8245 switch (item->
type) {
8246 case MKTAG(
'g',
'r',
'i',
'd'):
8247 case MKTAG(
'i',
'o',
'v',
'l'):
8262 sizeof(*
c->heif_grid));
8265 c->heif_grid = grid;
8266 grid = &grid[
c->nb_heif_grid++];
8274 for (
i = 0;
i < entries;
i++)
8280 from_item_id, entries);
8298 if (to_item_id !=
c->primary_item_id)
8301 c->thmb_item_id = from_item_id;
8304 from_item_id, entries);
8324 if (
size < 14 || next < 0 || next > INT64_MAX -
size)
8330 case MKTAG(
'd',
'i',
'm',
'g'):
8333 case MKTAG(
't',
'h',
'm',
'b'):
8351 if (
c->found_moov) {
8365 for (
int i = 0;
i <
c->nb_heif_item;
i++) {
8366 if (
c->heif_item[
i].item_id ==
c->cur_item_id) {
8367 c->heif_item[
i].width =
width;
8378 typedef struct MOVAtoms {
8384 MOVAtoms *atoms =
NULL;
8391 if (
c->found_moov) {
8400 if (
a.size < 8 ||
a.type !=
MKTAG(
'i',
'p',
'c',
'o'))
8404 while (
a.size >= 8) {
8413 if (
ref->size >
a.size ||
ref->size < 8)
8427 a.size -=
ref->size;
8438 if (
a.size < 8 ||
a.type !=
MKTAG(
'i',
'p',
'm',
'a')) {
8447 for (
int i = 0;
i < count;
i++) {
8449 int assoc_count =
avio_r8(pb);
8451 for (
int j = 0; j < assoc_count; j++) {
8467 c->cur_item_id = item_id;
8470 (
MOVAtom) { .size = ref->size,
8471 .type = MKTAG(
'i',
'p',
'c',
'o') });
8480 for (
int i = 0;
i < nb_atoms;
i++)
8607 int64_t total_size = 0;
8611 if (
c->atom_depth > 10) {
8618 atom.
size = INT64_MAX;
8619 while (total_size <= atom.
size - 8) {
8625 if (((
a.type ==
MKTAG(
'f',
'r',
'e',
'e') &&
c->moov_retry) ||
8626 a.type ==
MKTAG(
'h',
'o',
'o',
'v')) &&
8638 a.type =
MKTAG(
'm',
'o',
'o',
'v');
8641 if (atom.
type !=
MKTAG(
'r',
'o',
'o',
't') &&
8643 if (
a.type ==
MKTAG(
't',
'r',
'a',
'k') ||
8644 a.type ==
MKTAG(
'm',
'd',
'a',
't')) {
8652 if (
a.size == 1 && total_size + 8 <= atom.
size) {
8659 a.size = atom.
size - total_size + 8;
8681 if (!
parse &&
c->found_hdlr_mdta &&
8683 a.type ==
MKTAG(
'k',
'e',
'y',
's') &&
8684 c->meta_keys_count == 0) {
8698 if (
c->found_moov &&
c->found_mdat &&
a.size <= INT64_MAX - start_pos &&
8702 c->next_root_atom = start_pos +
a.size;
8709 else if (
left < 0) {
8711 "overread end of atom '%s' by %"PRId64
" bytes\n",
8717 total_size +=
a.size;
8720 if (total_size < atom.
size && atom.
size < 0x7ffff)
8732 int moov_offset = -1;
8746 }
else if (
size == 0) {
8749 if (
size < minsize) {
8756 case MKTAG(
'm',
'o',
'o',
'v'):
8757 moov_offset =
offset + 4;
8758 case MKTAG(
'm',
'd',
'a',
't'):
8759 case MKTAG(
'p',
'n',
'o',
't'):
8760 case MKTAG(
'u',
'd',
't',
'a'):
8761 case MKTAG(
'f',
't',
'y',
'p'):
8762 if (
tag ==
MKTAG(
'f',
't',
'y',
'p') &&
8767 score =
FFMAX(score, 5);
8773 case MKTAG(
'e',
'd',
'i',
'w'):
8774 case MKTAG(
'w',
'i',
'd',
'e'):
8775 case MKTAG(
'f',
'r',
'e',
'e'):
8776 case MKTAG(
'j',
'u',
'n',
'k'):
8777 case MKTAG(
'p',
'i',
'c',
't'):
8780 case MKTAG(0x82,0x82,0x7f,0x7d):
8783 case MKTAG(
's',
'k',
'i',
'p'):
8784 case MKTAG(
'u',
'u',
'i',
'd'):
8785 case MKTAG(
'p',
'r',
'f',
'l'):
8833 for (
i = 0;
i <
s->nb_streams;
i++) {
8835 if (sc->
id == chapter_track) {
8873 if (end < sample->timestamp) {
8887 title_len = 2*
len + 1;
8900 else if (ch == 0xfffe)
8904 if (
len == 1 ||
len == 2)
8940 int hh, mm,
ss, ff, drop;
8953 hh, mm,
ss, drop ?
';' :
':', ff);
8969 int rounded_tc_rate;
8974 if (!tc_rate.
num || !tc_rate.
den || !tmcd_nb_frames)
8993 rounded_tc_rate = (tc_rate.
num + tc_rate.
den / 2) / tc_rate.
den;
8996 if (tmcd_nb_frames == tc_rate.
num / tc_rate.
den &&
8998 tmcd_nb_frames = rounded_tc_rate;
9010 for (
i = 0;
i < (*index)->nb_encrypted_samples;
i++) {
9013 av_freep(&(*index)->encrypted_samples);
9014 av_freep(&(*index)->auxiliary_info_sizes);
9015 av_freep(&(*index)->auxiliary_offsets);
9083 for (
i = 0;
i <
s->nb_streams;
i++) {
9130 for (
i = 0;
i <
s->nb_streams;
i++) {
9146 for (
i = 0;
i <
s->nb_streams;
i++) {
9165 unsigned track_id, item_count;
9177 for (
i = 0;
i < item_count;
i++) {
9199 if (frag_stream_info &&
9203 for (j = 0; j < ((fieldlength >> 4) & 3) + 1; j++)
9205 for (j = 0; j < ((fieldlength >> 2) & 3) + 1; j++)
9207 for (j = 0; j < ((fieldlength >> 0) & 3) + 1; j++)
9221 if ((seek_ret =
avio_seek(
f, stream_size - 4, SEEK_SET)) < 0) {
9226 c->have_read_mfra_size = 1;
9227 if (!
c->mfra_size ||
c->mfra_size > stream_size) {
9231 if ((seek_ret =
avio_seek(
f, -((int64_t)
c->mfra_size), SEEK_CUR)) < 0) {
9250 c->frag_index.complete = 1;
9252 seek_ret =
avio_seek(
f, original_pos, SEEK_SET);
9255 "failed to seek back after looking for mfra\n");
9267 int x = 0, y = 0,
i = 0;
9276 if (!
c->idat_offset) {
9294 av_log(
c->fc,
AV_LOG_TRACE,
"grid: grid_rows %d grid_cols %d output_width %d output_height %d\n",
9314 while (y < tile_grid->coded_height) {
9317 while (x < tile_grid->coded_width) {
9350 uint16_t canvas_fill_value[4];
9359 if (!
c->idat_offset) {
9371 for (
int i = 0;
i < 4;
i++)
9374 canvas_fill_value[0], canvas_fill_value[1],
9375 canvas_fill_value[2], canvas_fill_value[3]);
9376 for (
int i = 0;
i < 4;
i++)
9399 "horizontal_offset[%d] %d, vertical_offset[%d] %d\n",
9426 for (
int j = 0; j < grid->
nb_tiles; j++) {
9437 "reference a stream\n",
9447 if (err < 0 && err !=
AVERROR(EEXIST))
9463 case MKTAG(
'g',
'r',
'i',
'd'):
9466 case MKTAG(
'i',
'o',
'v',
'l'):
9507 atom.
size = INT64_MAX;
9570 for (
i = 0;
i <
s->nb_streams;
i++)
9571 if (
s->streams[
i]->codecpar->codec_tag ==
AV_RL32(
"tmcd")) {
9573 }
else if (
s->streams[
i]->codecpar->codec_tag ==
AV_RL32(
"rtmd")) {
9579 for (
i = 0;
i <
s->nb_streams;
i++) {
9584 int tmcd_st_id = -1;
9586 for (j = 0; j <
s->nb_streams; j++) {
9592 if (tmcd_st_id < 0 || tmcd_st_id ==
i)
9601 for (
i = 0;
i <
s->nb_streams;
i++) {
9632 for (
i = 0;
i <
s->nb_streams;
i++) {
9650 for (
i = 0;
i <
s->nb_streams;
i++) {
9669 s->streams[
i]->codecpar->bit_rate = mov->
bitrates[
i];
9675 for (
i = 0;
i <
s->nb_streams;
i++) {
9749 int64_t best_dts = INT64_MAX;
9753 for (
i = 0;
i <
s->nb_streams;
i++) {
9760 uint64_t dtsdiff = best_dts > dts ? best_dts - (uint64_t)dts : ((uint64_t)dts - best_dts);
9762 if (!
sample || (no_interleave && current_sample->
pos <
sample->pos) ||
9765 ((dtsdiff <= AV_TIME_BASE && current_sample->pos < sample->
pos) ||
9788 if (
index >= 0 && index < mov->frag_index.nb_items)
9790 if (
avio_seek(
s->pb, target, SEEK_SET) != target) {
9798 if (index < mov->frag_index.nb_items &&
9822 uint8_t *side, *extradata;
9837 memcpy(side, extradata, extradata_size);
9849 new_size = ((
size - 8) / 2) * 3;
9855 for (
int j = 0; j < new_size; j += 3) {
9887 if (next_dts >=
pkt->
dts)
9894 uint8_t sample_is_depended_on = (sample_flags >> 2) & 0x3;
9928 int64_t current_index;
9952 if (ret64 !=
sample->pos) {
9957 }
else if (ret64 < 0) {
9970 else if (sc->
iamf) {
10000 #if CONFIG_DV_DEMUXER
10086 int64_t key_sample_dts, key_sample_pts;
10126 if (sample < 0 && sti->nb_index_entries && timestamp < sti->index_entries[0].timestamp)
10148 time_sample = next;
10163 time_sample = next;
10183 (
AVRational){1, st->codecpar->sample_rate});
10195 if (stream_index >=
s->nb_streams)
10198 st =
s->streams[stream_index];
10204 if (
mc->seek_individually) {
10209 for (
i = 0;
i <
s->nb_streams;
i++) {
10214 if (stream_index ==
i)
10223 for (
i = 0;
i <
s->nb_streams;
i++) {
10225 st =
s->streams[
i];
10243 #define OFFSET(x) offsetof(MOVContext, x)
10244 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
10246 {
"use_absolute_path",
10247 "allow using absolute path when opening alias, this is a possible security issue",
10250 {
"seek_streams_individually",
10251 "Seek each stream individually to the closest point",
10254 {
"ignore_editlist",
"Ignore the edit list atom.",
OFFSET(ignore_editlist),
AV_OPT_TYPE_BOOL, {.i64 = 0},
10256 {
"advanced_editlist",
10257 "Modify the AVIndex according to the editlists. Use this option to decode in the order specified by the edits.",
10263 "use mfra for fragment timestamps",
10266 .unit =
"use_mfra_for"},
10268 FLAGS, .unit =
"use_mfra_for" },
10270 FLAGS, .unit =
"use_mfra_for" },
10272 FLAGS, .unit =
"use_mfra_for" },
10275 {
"export_all",
"Export unrecognized metadata entries",
OFFSET(export_all),
10277 {
"export_xmp",
"Export full XMP metadata",
OFFSET(export_xmp),
10279 {
"activation_bytes",
"Secret bytes for Audible AAX files",
OFFSET(activation_bytes),
10281 {
"audible_key",
"AES-128 Key for Audible AAXC files",
OFFSET(audible_key),
10283 {
"audible_iv",
"AES-128 IV for Audible AAXC files",
OFFSET(audible_iv),
10285 {
"audible_fixed_key",
10286 "Fixed key used for handling Audible AAX files",
OFFSET(audible_fixed_key),
10291 {.i64 = 0}, 0, 1,
FLAGS },
10306 .
p.
name =
"mov,mp4,m4a,3gp,3g2,mj2",
10309 .p.extensions =
"mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v,avif,heic,heif",
AVChapter * avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_base, int64_t start, int64_t end, const char *title)
Add a new chapter.
unsigned int ctts_allocated_size
static int mov_update_iamf_streams(MOVContext *c, const AVStream *st)
static int mov_read_chpl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_frma(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_meta(MOVContext *c, AVIOContext *pb, MOVAtom atom)
@ AV_PKT_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
int found_iloc
'iloc' atom has been found
int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
add frame for rfps calculation.
static int read_image_iovl(AVFormatContext *s, const HEIFGrid *grid, AVStreamGroupTileGrid *tile_grid)
AVIAMFSubmixElement ** elements
Array of submix elements.
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_BPRINT_SIZE_UNLIMITED
#define MOV_TFHD_DEFAULT_FLAGS
#define PUT_UTF8(val, tmp, PUT_BYTE)
#define AV_TIMECODE_STR_SIZE
int av_aes_init(AVAES *a, const uint8_t *key, int key_bits, int decrypt)
Initialize an AVAES context.
int skip_samples
Number of samples to skip at the start of the frame decoded from the next packet.
int16_t audio_cid
stsd audio compression id
AVSphericalProjection
Projection of the video surface(s) on a sphere.
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
static int mov_read_dops(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int can_seek_to_key_sample(AVStream *st, int sample, int64_t requested_pts)
@ AV_CODEC_ID_ADPCM_IMA_QT
#define AV_EF_EXPLODE
abort decoding on minor error detection
int64_t id
Group type-specific group ID.
#define MOV_TRUN_SAMPLE_FLAGS
@ AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT
Ambient viewing environment metadata, as defined by H.274.
unsigned int nb_chapter_tracks
static int mix(int c0, int c1)
const uint16_t ff_ac3_channel_layout_tab[8]
Map audio coding mode (acmod) to channel layout mask.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
#define MOV_TKHD_FLAG_ENABLED
enum AVMediaType codec_type
General type of the encoded data.
struct AVStreamGroupTileGrid * tile_grid
enum AVSphericalProjection projection
Projection type.
uint8_t ** extradata
extradata array (and size) for multiple stsd
static const AVClass mov_class
uint32_t bound_bottom
Distance from the bottom edge.
uint8_t AVUUID[AV_UUID_LEN]
static int mov_read_targa_y216(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_chnl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_moof(MOVContext *c, AVIOContext *pb, MOVAtom atom)
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
static double cb(void *priv, double x, double y)
This struct describes the properties of an encoded stream.
char * av_stristr(const char *s1, const char *s2)
Locate the first case-independent occurrence in the string haystack of the string needle.
enum AVColorSpace color_space
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
int ff_replaygain_export(AVStream *st, AVDictionary *metadata)
Parse replaygain tags and export them as per-stream side data.
static int tmcd_is_referenced(AVFormatContext *s, int tmcd_id)
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
unsigned int nb_substreams
#define AVERROR_EOF
End of file.
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
static const AVOption mov_options[]
static int mov_codec_id(AVStream *st, uint32_t format)
@ AV_PKT_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata (based on SMPTE-2086:2014).
static av_always_inline double av_int2double(uint64_t i)
Reinterpret a 64-bit integer as a double.
static int mov_read_iloc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define AV_PKT_FLAG_DISCARD
Flag is used to discard packets which are required to maintain valid decoder state but are not requir...
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce output
static int mov_read_alac(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int test_same_origin(const char *src, const char *ref)
static int cbcs_scheme_decrypt(MOVContext *c, MOVStreamContext *sc, AVEncryptionInfo *sample, uint8_t *input, int size)
uint64_t base_data_offset
static int ambisonic_order(const AVChannelLayout *channel_layout)
If the layout is n-th order standard-order ambisonic, with optional extra non-diegetic channels at th...
int ff_buffer_packet(AVFormatContext *s, AVPacket *pkt)
#define IS_MATRIX_IDENT(matrix)
int disposition
Stream group disposition - a combination of AV_DISPOSITION_* flags.
static void mov_update_dts_shift(MOVStreamContext *sc, int duration, void *logctx)
AVSphericalMapping * spherical
unsigned MaxCLL
Max content light level (cd/m^2).
int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen)
void av_encryption_init_info_free(AVEncryptionInitInfo *info)
Frees the given encryption init info object.
static int mov_read_avss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int found_moov
'moov' atom has been found
static int mov_read_custom(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static av_cold void cleanup(FlashSV2Context *s)
AVStream ** streams
A list of all streams in the file.
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom, enum AVCodecID codec_id)
@ AVCOL_RANGE_JPEG
Full range content.
unsigned int rap_group_count
av_cold int av_sha_init(AVSHA *ctx, int bits)
Initialize SHA-1 or SHA-2 hashing.
static int mov_read_mvhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_idat(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int found_mdat
'mdat' atom has been found
uint32_t crypt_byte_block
Only used for pattern encryption.
@ AV_PKT_DATA_ENCRYPTION_INIT_INFO
This side data is encryption initialization data.
static int mov_read_avid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
AVRational ambient_light_x
Normalized x chromaticity coordinate of the environmental ambient light in the nominal viewing enviro...
int seek_preroll
Audio only.
void * av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, const uint8_t *elem_data)
Add an element of size elem_size to a dynamic array.
static int parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
static int mov_read_stps(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int * bitrates
bitrates read before streams creation
static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
AVRational avg_frame_rate
Average framerate.
static const uint16_t table[]
static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static void set_last_stream_little_endian(AVFormatContext *fc)
static int mov_read_strf(MOVContext *c, AVIOContext *pb, MOVAtom atom)
An strf atom is a BITMAPINFOHEADER struct.
static uint32_t yuv_to_rgba(uint32_t ycbcr)
#define FF_COMPLIANCE_STRICT
Strictly conform to all the things in the spec no matter what consequences.
int error
contains the error code or 0 if no error happened
void av_iamf_mix_presentation_free(AVIAMFMixPresentation **pmix_presentation)
Free an AVIAMFMixPresentation and all its contents.
static int mov_parse_auxiliary_info(MOVContext *c, MOVStreamContext *sc, AVIOContext *pb, MOVEncryptionIndex *encryption_index)
static int mov_seek_stream(AVFormatContext *s, AVStream *st, int64_t timestamp, int flags)
static int mov_read_saio(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int64_t mov_get_stsc_samples(MOVStreamContext *sc, unsigned int index)
int ff_get_wav_header(void *logctx, AVIOContext *pb, AVCodecParameters *par, int size, int big_endian)
#define AV_LOG_VERBOSE
Detailed information.
const AVCodecTag ff_codec_wav_tags[]
static int get_edit_list_entry(MOVContext *mov, const MOVStreamContext *msc, unsigned int edit_list_index, int64_t *edit_list_media_time, int64_t *edit_list_duration, int64_t global_timescale)
Get ith edit list entry (media time, duration).
static int mov_change_extradata(AVStream *st, AVPacket *pkt)
#define fc(width, name, range_min, range_max)
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
@ AV_SPHERICAL_EQUIRECTANGULAR_TILE
Video represents a portion of a sphere mapped on a flat surface using equirectangular projection.
static void mov_current_sample_set(MOVStreamContext *sc, int current_sample)
void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
Wrap a buffer in an AVIOContext for reading.
#define AV_PKT_FLAG_DISPOSABLE
Flag is used to indicate packets that contain frames that can be discarded by the decoder.
int buf_size
Size of buf except extra allocated bytes.
enum AVChannelOrder order
Channel order used in this layout.
int vertical
Offset in pixels from the top edge of the canvas where the tile should be placed.
static int mov_read_moov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define FFNABS(a)
Negative Absolute value.
static int mov_read_esds(MOVContext *c, AVIOContext *pb, MOVAtom atom)
unsigned int sample_count
int nb_channels
Number of channels in this layout.
@ AV_SPHERICAL_EQUIRECTANGULAR
Video represents a sphere mapped on a flat surface using equirectangular projection.
AVEncryptionInitInfo * av_encryption_init_info_get_side_data(const uint8_t *side_data, size_t side_data_size)
Creates a copy of the AVEncryptionInitInfo that is contained in the given side data.
int advanced_editlist_autodisabled
int64_t avio_size(AVIOContext *s)
Get the filesize.
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
struct AVAESCTR * aes_ctr
static int cenc_filter(MOVContext *mov, AVStream *st, MOVStreamContext *sc, AVPacket *pkt, int current_index)
static int mov_read_sdtp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_jp2h(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_tfhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define OPUS_SEEK_PREROLL_MS
const AVIAMFMixPresentation * cmix
static int mov_read_wide(MOVContext *c, AVIOContext *pb, MOVAtom atom)
@ AV_FIELD_BT
Bottom coded first, top displayed first.
int ff_mov_lang_to_iso639(unsigned code, char to[4])
int ff_generate_avci_extradata(AVStream *st)
Generate standard extradata for AVC-Intra based on width/height and field order.
int ff_get_extradata(void *logctx, AVCodecParameters *par, AVIOContext *pb, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0 and f...
static void skip_bits(GetBitContext *s, int n)
enum AVColorPrimaries color_primaries
uint32_t scheme
The fourcc encryption scheme, in big-endian byte order.
@ AV_STEREO3D_SIDEBYSIDE
Views are next to each other.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
HEIFItem ** tile_item_list
@ AV_FIELD_TT
Top coded_first, top displayed first.
int ff_iamf_read_packet(AVFormatContext *s, IAMFDemuxContext *c, AVIOContext *pb, int max_size, AVPacket *pkt)
uint32_t skip_byte_block
Only used for pattern encryption.
static int aax_filter(uint8_t *input, int size, MOVContext *c)
@ AV_OPT_TYPE_BINARY
offset must point to a pointer immediately followed by an int for the length
const char * av_color_space_name(enum AVColorSpace space)
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as a packet side data.
AVMasteringDisplayMetadata * mastering
#define AV_FOURCC_MAX_STRING_SIZE
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
static int mov_read_mdhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC
static int mov_read_aclr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
AVStreamGroupTileGrid holds information on how to combine several independent images on a single canv...
@ AV_STEREO3D_2D
Video is not stereoscopic (and metadata has to be there).
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
static MOVFragmentStreamInfo * get_current_frag_stream_info(MOVFragmentIndex *frag_index)
char * av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum)
Load timecode string in buf.
static int rb_size(AVIOContext *pb, uint64_t *value, int size)
int coded_width
Width of the canvas.
void av_iamf_audio_element_free(AVIAMFAudioElement **paudio_element)
Free an AVIAMFAudioElement and all its contents.
unsigned int index_entries_allocated_size
static av_cold int read_close(AVFormatContext *ctx)
static int mov_read_amve(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_chap(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
#define MOV_TRUN_SAMPLE_DURATION
static double val(void *priv, double ch)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
int coded_height
Width of the canvas.
uint8_t * iv
The initialization vector.
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
int64_t duration
Decoding: duration of the stream, in stream time base.
AVRational ambient_illuminance
Environmental illuminance of the ambient viewing environment in lux.
#define ss(width, name, subs,...)
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
enum AVIAMFAudioElementType audio_element_type
Audio element type as defined in section 3.6 of IAMF.
static int update_frag_index(MOVContext *c, int64_t offset)
size_t auxiliary_info_sample_count
@ AV_FIELD_TB
Top coded first, bottom displayed first.
AVPacket attached_pic
For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet will contain the attached pictu...
static int mov_read_saiz(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES
#define MOV_TRUN_DATA_OFFSET
AVEncryptionInfo * av_encryption_info_clone(const AVEncryptionInfo *info)
Allocates an AVEncryptionInfo structure with a copy of the given data.
AVAmbientViewingEnvironment * av_ambient_viewing_environment_alloc(size_t *size)
Allocate an AVAmbientViewingEnvironment structure.
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
AVIAMFAudioElement * element
element backs celement iff the AVIAMFAudioElement is owned by this structure.
static int mov_read_ares(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_adrm(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int av_get_bits_per_sample(enum AVCodecID codec_id)
Return codec bits per sample.
enum AVColorTransferCharacteristic color_trc
IAMFAudioElement ** audio_elements
unsigned int avio_rb32(AVIOContext *s)
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static void mov_free_encryption_index(MOVEncryptionIndex **index)
#define AV_CH_LOW_FREQUENCY
uint64_t * auxiliary_offsets
Absolute seek position.
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
int dts_shift
dts shift when ctts is negative
int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx)
Init a timecode struct with the passed parameters.
static const uint16_t mask[17]
int frame_size
Audio only.
int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen)
Read a UTF-16 string from pb and convert it to UTF-8.
static int mov_metadata_track_or_disc_number(MOVContext *c, AVIOContext *pb, unsigned len, const char *key)
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
int ff_add_attached_pic(AVFormatContext *s, AVStream *st, AVIOContext *pb, AVBufferRef **buf, int size)
Add an attached pic to an AVStream.
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.
#define FF_MOV_FLAG_MFRA_PTS
int ff_mov_read_esds(AVFormatContext *fc, AVIOContext *pb)
static int mov_read_coll(MOVContext *c, AVIOContext *pb, MOVAtom atom)
MOVEncryptionIndex * encryption_index
static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom)
unsigned int audio_substream_id
#define MOV_TFHD_DEFAULT_BASE_IS_MOOF
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
unsigned int substream_count
#define MOV_TFHD_DEFAULT_DURATION
#define ALAC_EXTRADATA_SIZE
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
struct AVAES * aes_decrypt
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
uint32_t bound_top
Distance from the top edge.
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
#define MOV_TRUN_FIRST_SAMPLE_FLAGS
int av_channel_layout_from_mask(AVChannelLayout *channel_layout, uint64_t mask)
Initialize a native channel layout from a bitmask indicating which channels are present.
static void mov_estimate_video_delay(MOVContext *c, AVStream *st)
int64_t timestamp
Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int64_t min_corrected_pts
minimum Composition time shown by the edits excluding empty edits.
unsigned int ffio_read_leb(AVIOContext *s)
Read a unsigned integer coded as a variable number of up to eight little-endian bytes,...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static int mov_read_sidx(MOVContext *c, AVIOContext *pb, MOVAtom atom)
@ AV_PKT_DATA_STEREO3D
This side data should be associated with a video stream and contains Stereoscopic 3D information in f...
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
int ff_iamfdec_read_descriptors(IAMFContext *c, AVIOContext *pb, int max_size, void *log_ctx)
AVRational display_aspect_ratio
display aspect ratio (0 if unknown)
static AVIndexEntry * mov_find_next_sample(AVFormatContext *s, AVStream **st)
int min_distance
Minimum distance between this and the previous keyframe, used to avoid unneeded searching.
static int mov_read_dvcc_dvvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int(* parse)(MOVContext *ctx, AVIOContext *pb, MOVAtom atom)
int nb_coded_side_data
Amount of entries in coded_side_data.
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_ddts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
void av_sha_final(AVSHA *ctx, uint8_t *digest)
Finish hashing and output digest value.
#define MAX_REORDER_DELAY
AVEncryptionInfo ** encrypted_samples
static int mov_read_close(AVFormatContext *s)
static enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
Compute codec id for 'lpcm' tag.
@ FLAC_METADATA_TYPE_STREAMINFO
static int mov_read_cmov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_sample_encryption_info(MOVContext *c, AVIOContext *pb, MOVStreamContext *sc, AVEncryptionInfo **sample, int use_subsamples)
enum AVStreamParseType need_parsing
unsigned int keyframe_count
static int mov_read_SAND(MOVContext *c, AVIOContext *pb, MOVAtom atom)
unsigned int audio_element_id
@ AVDISCARD_ALL
discard all
#define av_realloc_f(p, o, n)
static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
MOVIndexRange * index_ranges
static void set_frag_stream(MOVFragmentIndex *frag_index, int id)
static int mov_read_free(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_realloc_extradata(AVCodecParameters *par, MOVAtom atom)
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define LIBAVUTIL_VERSION_INT
static int read_header(FFV1Context *f)
Describe the class of an AVClass context structure.
and forward the result(frame or status change) to the corresponding input. If nothing is possible
@ AV_CHANNEL_ORDER_AMBISONIC
The audio is represented as the decomposition of the sound field into spherical harmonics.
static __device__ float fabs(float a)
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
static uint64_t truehd_layout(int chanmap)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
This describes info used to initialize an encryption key system.
static int mov_read_ftyp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int read_image_grid(AVFormatContext *s, const HEIFGrid *grid, AVStreamGroupTileGrid *tile_grid)
struct AVAESCTR * av_aes_ctr_alloc(void)
Allocate an AVAESCTR context.
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.
Rational number (pair of numerator and denominator).
static int mov_read_sgpd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_probe(const AVProbeData *p)
@ AV_CODEC_ID_DVD_SUBTITLE
int64_t time_offset
time offset of the edit list entries
static int mov_read_smdm(MOVContext *c, AVIOContext *pb, MOVAtom atom)
const char * av_default_item_name(void *ptr)
Return the context name.
uint64_t avio_rb64(AVIOContext *s)
void av_aes_crypt(AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt)
Encrypt or decrypt a buffer using a previously initialized context.
MOVIndexRange * current_index_range
static int mov_open_dref(MOVContext *c, AVIOContext **pb, const char *src, MOVDref *ref)
This structure contains the data a format has to probe a file.
struct AVAES * av_aes_alloc(void)
Allocate an AVAES context.
static int mov_read_schm(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define FLAC_STREAMINFO_SIZE
const char * av_color_primaries_name(enum AVColorPrimaries primaries)
#define FF_MOV_FLAG_MFRA_DTS
#define MOV_SAMPLE_DEPENDENCY_NO
static int mov_read_iref_thmb(MOVContext *c, AVIOContext *pb, int version)
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
const AVCodecTag ff_codec_movvideo_tags[]
static int mov_read_ilst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define AV_CH_FRONT_CENTER
AVChannelLayout ch_layout
Audio only.
static MOVFragmentStreamInfo * get_frag_stream_info_from_pkt(MOVFragmentIndex *frag_index, AVPacket *pkt, int id)
static uint32_t get_sgpd_sync_index(const MOVStreamContext *sc, int nal_unit_type)
static int mov_read_fiel(MOVContext *c, AVIOContext *pb, MOVAtom atom)
@ AV_PKT_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
uint8_t * av_encryption_info_add_side_data(const AVEncryptionInfo *info, size_t *size)
Allocates and initializes side data that holds a copy of the given encryption info.
#define MOV_TFHD_BASE_DATA_OFFSET
int open_key_samples_count
const AVCodecTag ff_codec_movaudio_tags[]
const AVCodecTag ff_codec_movdata_tags[]
static int mov_read_wfex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
int sample_rate
Audio only.
static void mov_parse_stsd_subtitle(MOVContext *c, AVIOContext *pb, AVStream *st, MOVStreamContext *sc, int64_t size)
static int mov_skip_multiple_stsd(MOVContext *c, AVIOContext *pb, int codec_tag, int format, int64_t size)
@ AV_CODEC_ID_GSM
as in Berlin toast format
int64_t nb_frames
number of frames in this stream if known or 0
AVCodecID
Identify the syntax and semantics of the bitstream.
const AVPacketSideData * av_packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Get side information from a side data array.
unsigned int audio_element_id
The id of the Audio Element this submix element references.
static int should_retry(AVIOContext *pb, int error_code)
int avformat_stream_group_add_stream(AVStreamGroup *stg, AVStream *st)
Add an already allocated stream to a stream group.
@ AV_PKT_DATA_SPHERICAL
This side data should be associated with a video stream and corresponds to the AVSphericalMapping str...
int extradata_size
Size of the extradata content in bytes.
Submix layout as defined in section 3.7 of IAMF.
static int mov_read_pasp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
DVDemuxContext * dv_demux
static const AVColorPrimariesDesc color_primaries[AVCOL_PRI_NB]
static int mov_read_SA3D(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_elst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
uint8_t auxiliary_info_default_size
static int mov_read_header(AVFormatContext *s)
static int cbc1_scheme_decrypt(MOVContext *c, MOVStreamContext *sc, AVEncryptionInfo *sample, uint8_t *input, int size)
unsigned int avio_rl32(AVIOContext *s)
@ AVDISCARD_NONKEY
discard all frames except keyframes
static int mov_read_wave(MOVContext *c, AVIOContext *pb, MOVAtom atom)
@ AV_SPHERICAL_CUBEMAP
Video frame is split into 6 faces of a cube, and arranged on a 3x2 layout.
unsigned int avio_rb24(AVIOContext *s)
static int cens_scheme_decrypt(MOVContext *c, MOVStreamContext *sc, AVEncryptionInfo *sample, uint8_t *input, int size)
static void mov_free_stream_context(AVFormatContext *s, AVStream *st)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
static int get_current_encryption_info(MOVContext *c, MOVEncryptionIndex **encryption_index, MOVStreamContext **sc)
Gets the current encryption info and associated current stream context.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
int av_aes_ctr_init(struct AVAESCTR *a, const uint8_t *key)
Initialize an AVAESCTR context.
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
An AVChannelLayout holds information about the channel layout of audio data.
static int mov_read_dref(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static void mov_current_sample_dec(MOVStreamContext *sc)
uint32_t bound_right
Distance from the right edge.
static int find_prev_closest_index(AVStream *st, AVIndexEntry *e_old, int nb_old, MOVCtts *ctts_data, int64_t ctts_count, int64_t timestamp_pts, int flag, int64_t *index, int64_t *ctts_index, int64_t *ctts_sample)
Find the closest previous frame to the timestamp_pts, in e_old index entries.
unsigned int stsz_sample_size
always contains sample size from stsz atom
#define FF_MOV_FLAG_MFRA_AUTO
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
static int64_t start_time
static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen)
Read a string from pb into buf.
static int mov_read_iprp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
void av_sha_update(struct AVSHA *ctx, const uint8_t *data, size_t len)
Update hash value.
static av_const double hypot(double x, double y)
static int mov_read_chan(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static AVRational av_make_q(int num, int den)
Create an AVRational.
static int mov_read_stsc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
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,...
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define MKBETAG(a, b, c, d)
char * av_fourcc_make_string(char *buf, uint32_t fourcc)
Fill the provided buffer with a string containing a FourCC (four-character code) representation.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
void av_aes_ctr_set_full_iv(struct AVAESCTR *a, const uint8_t *iv)
Forcefully change the "full" 16-byte iv, including the counter.
struct AVIAMFAudioElement * iamf_audio_element
AVContentLightMetadata * coll
static int64_t add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add index entry with the given values, to the end of ffstream(st)->index_entries.
static void mov_current_sample_inc(MOVStreamContext *sc)
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
static void fix_timescale(MOVContext *c, MOVStreamContext *sc)
int avio_r8(AVIOContext *s)
IAMFSubStream * substreams
uint32_t padding
Number of pixels to pad from the edge of each cube face.
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
Information on how to combine one or more audio streams, as defined in section 3.6 of IAMF.
static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom)
@ AV_TIMECODE_FLAG_24HOURSMAX
timecode wraps after 24 hours
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
unsigned int nb_tiles
Amount of tiles in the grid.
AVPacketSideData * av_packet_side_data_add(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, void *data, size_t size, int flags)
Wrap existing data as packet side data.
static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
static int mov_read_infe(MOVContext *c, AVIOContext *pb, MOVAtom atom)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
size_t auxiliary_offsets_count
int flags
A combination of AV_PKT_FLAG values.
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
void av_encryption_info_free(AVEncryptionInfo *info)
Frees the given encryption info object.
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
This file is part of FFmpeg.
MOVFragmentStreamInfo * stream_info
struct AVEncryptionInitInfo * next
An optional pointer to the next initialization info in the list.
AVStream ** streams
A list of streams in the group.
void ff_rfps_calculate(AVFormatContext *ic)
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some input
static int mov_read_clli(MOVContext *c, AVIOContext *pb, MOVAtom atom)
struct AVIAMFMixPresentation * iamf_mix_presentation
MOVFragmentIndexItem * item
#define AV_LOG_INFO
Standard information.
struct IAMFDemuxContext * iamf
#define FFERROR_REDO
Returned by demuxers to indicate that data was consumed but discarded (ignored streams or junk data).
AVEncryptionInitInfo * av_encryption_init_info_alloc(uint32_t system_id_size, uint32_t num_key_ids, uint32_t key_id_size, uint32_t data_size)
Allocates an AVEncryptionInitInfo structure and sub-pointers to hold the given sizes.
void av_aes_ctr_free(struct AVAESCTR *a)
Release an AVAESCTR context.
static int mov_read_dfla(MOVContext *c, AVIOContext *pb, MOVAtom atom)
uint64_t count
number of bytes in buffer
static const MOVParseTableEntry mov_default_parse_table[]
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel layout
static int mov_read_iacb(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static void mov_metadata_creation_time(MOVContext *c, AVIOContext *pb, AVDictionary **metadata, int version)
static int mov_metadata_hmmt(MOVContext *c, AVIOContext *pb, unsigned len)
struct AVSHA * av_sha_alloc(void)
Allocate an AVSHA context.
static int mov_read_tenc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int av_uuid_equal(const AVUUID uu1, const AVUUID uu2)
Compares two UUIDs for equality.
static int mov_stsc_index_valid(unsigned int index, unsigned int count)
static int mov_finalize_packet(AVFormatContext *s, AVStream *st, AVIndexEntry *sample, int64_t current_index, AVPacket *pkt)
static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
static const uint32_t mac_to_unicode[128]
int width
Width of the final image for presentation.
unsigned int bytes_per_frame
int32_t roll
Rotation around the forward vector [-180, 180].
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static int mov_read_trex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int search_frag_timestamp(AVFormatContext *s, MOVFragmentIndex *frag_index, AVStream *st, int64_t timestamp)
static void mov_fix_index(MOVContext *mov, AVStream *st)
Fix ffstream(st)->index_entries, so that it contains only the entries (and the entries which are need...
int ff_isom_parse_dvcc_dvvc(void *logctx, AVStream *st, const uint8_t *buf_ptr, uint64_t size)
static int mov_read_pssh(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_stsd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_rewrite_dvd_sub_extradata(AVStream *st)
#define AV_TIME_BASE
Internal time base represented as integer.
int block_align
Audio only.
#define av_malloc_array(a, b)
int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
@ AV_PKT_DATA_ICC_PROFILE
ICC profile data consisting of an opaque octet buffer following the format described by ISO 15076-1.
@ AV_STEREO3D_TOPBOTTOM
Views are on top of each other.
Information on how to render and mix one or more AVIAMFAudioElement to generate the final audio outpu...
const char *const ff_id3v1_genre_str[ID3v1_GENRE_MAX+1]
ID3v1 genres.
MOVFragmentIndex frag_index
static int mov_read_vpcc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
void av_url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url)
Split a URL string into components.
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
static void fix_frag_index_entries(MOVFragmentIndex *frag_index, int index, int id, int entries)
static int mov_finalize_stsd_codec(MOVContext *c, AVIOContext *pb, AVStream *st, MOVStreamContext *sc)
static int mov_read_mdcv(MOVContext *c, AVIOContext *pb, MOVAtom atom)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
@ AV_TIMECODE_FLAG_ALLOWNEGATIVE
negative time values are allowed
static int mov_read_mdat(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_keys(MOVContext *c, AVIOContext *pb, MOVAtom atom)
enum AVColorRange color_range
Video only.
#define MOV_TFHD_DEFAULT_SIZE
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
static void mov_build_index(MOVContext *mov, AVStream *st)
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
static int mov_read_svq3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
union AVStreamGroup::@298 params
Group type-specific parameters.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
void * av_calloc(size_t nmemb, size_t size)
@ AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE
enum AVFieldOrder field_order
Video only.
static int mov_read_iinf(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int64_t ff_read_string_to_bprint_overwrite(AVIOContext *s, struct AVBPrint *bp, int64_t max_len)
Read a whole null-terminated string of text from AVIOContext to an AVBPrint buffer overwriting its co...
int horizontal
Offset in pixels from the left edge of the canvas where the tile should be placed.
static int64_t get_stream_info_time(MOVFragmentStreamInfo *frag_stream_info)
static void fix_index_entry_timestamps(AVStream *st, int end_index, int64_t end_ts, int64_t *frame_duration_buffer, int frame_duration_buffer_size)
Rewrite timestamps of index entries in the range [end_index - frame_duration_buffer_size,...
@ AV_TIMECODE_FLAG_DROPFRAME
timecode is drop frame
Undefined Behavior In the C language
AVAmbientViewingEnvironment * ambient
static int mov_read_tmcd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
int id
Format-specific stream ID.
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
unsigned int nb_encrypted_samples
AVStereo3D * av_stereo3d_alloc(void)
Allocate an AVStereo3D structure and set its fields to default values.
static int mov_read_senc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
#define FFSWAP(type, a, b)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
uint8_t * key_id
The ID of the key used to encrypt the packet.
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,...
int32_t pitch
Rotation around the right vector [-90, 90].
AVDictionary * metadata
Metadata that applies to the whole group.
unsigned int avio_rb16(AVIOContext *s)
enum AVStereo3DType type
How views are packed within the video.
AVPacketSideData * av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, size_t size, int flags)
Allocate a new packet side data.
@ AV_AUDIO_SERVICE_TYPE_KARAOKE
static int mov_read_dmlp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define AV_INPUT_BUFFER_PADDING_SIZE
int pseudo_stream_id
-1 means demux all ids
static int mov_read_tfdt(MOVContext *c, AVIOContext *pb, MOVAtom atom)
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
static int heif_add_stream(MOVContext *c, HEIFItem *item)
static int search_frag_moof_offset(MOVFragmentIndex *frag_index, int64_t offset)
#define AV_DICT_MATCH_CASE
Only get an entry with exact-case key match.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
static int mov_switch_root(AVFormatContext *s, int64_t target, int index)
This describes encryption info for a packet.
static int64_t add_ctts_entry(MOVCtts **ctts_data, unsigned int *ctts_count, unsigned int *allocated_size, int count, int duration)
Append a new ctts entry to ctts_data.
MOVEncryptionIndex * encryption_index
#define MIN_DATA_ENTRY_BOX_SIZE
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
int index
stream index in AVFormatContext
static int mov_seek_fragment(AVFormatContext *s, AVStream *st, int64_t timestamp)
void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
static void mov_parse_stsd_video(MOVContext *c, AVIOContext *pb, AVStream *st, MOVStreamContext *sc)
const AVCodecTag ff_codec_bmp_tags[]
static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int64_t get_frag_time(AVFormatContext *s, AVStream *dst_st, MOVFragmentIndex *frag_index, int index)
unsigned int sample_size
may contain value calculated from stsd or value from stsz atom
unsigned int nb_streams
Number of elements in AVStreamGroup.streams.
static int mlp_samplerate(int in)
#define ISOM_DVCC_DVVC_SIZE
static int mov_read_sbgp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
static int mov_read_glbl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
This function reads atom content and puts data in extradata without tag nor size unlike mov_read_extr...
static int mov_parse_uuid_spherical(MOVStreamContext *sc, AVIOContext *pb, size_t len)
AVFormatContext * dv_fctx
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
unsigned int aax_mode
'aax' file has been detected
static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
static int mov_aaxc_crypto(MOVContext *c)
static int64_t mov_get_skip_samples(AVStream *st, int sample)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_WB16 unsigned int_TMPL AV_RB8
static int ref[MAX_W *MAX_W]
AVRational r_frame_rate
Real base framerate of the stream.
int64_t track_end
used for dts generation in fragmented movie files
MOVFragment fragment
current fragment in moof atom
int eof_reached
true if was unable to read due to error or eof
static int mov_metadata_int8_bypass_padding(MOVContext *c, AVIOContext *pb, unsigned len, const char *key)
Filter the word “frame” indicates either a video frame or a group of audio samples
static float mean(const float *input, int size)
static int mov_read_covr(MOVContext *c, AVIOContext *pb, int type, int len)
unsigned int per_sample_iv_size
const AVCodecTag ff_codec_movsubtitle_tags[]
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
static void export_orphan_timecode(AVFormatContext *s)
#define AV_CH_FRONT_RIGHT
void av_aes_ctr_crypt(struct AVAESCTR *a, uint8_t *dst, const uint8_t *src, int count)
Process a buffer using a previously initialized context.
static int mov_metadata_gnre(MOVContext *c, AVIOContext *pb, unsigned len, const char *key)
@ AV_PKT_DATA_ENCRYPTION_INFO
This side data contains encryption info for how to decrypt the packet.
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
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.
static int mov_read_dpxe(MOVContext *c, AVIOContext *pb, MOVAtom atom)
unsigned int nb_elements
Number of elements in the submix.
#define AVIO_FLAG_READ
read-only
@ AV_PKT_DATA_AUDIO_SERVICE_TYPE
This side data should be associated with an audio stream and corresponds to enum AVAudioServiceType.
AVSphericalMapping * av_spherical_alloc(size_t *size)
Allocate a AVSphericalVideo structure and initialize its fields to default values.
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
static int mov_read_rtmd_track(AVFormatContext *s, AVStream *st)
static int read_probe(const AVProbeData *p)
int bits_per_coded_sample
The number of bits per sample in the codedwords.
static int mov_parse_tiles(AVFormatContext *s)
static int mov_read_iref_dimg(MOVContext *c, AVIOContext *pb, int version)
static int mov_read_pcmc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int build_open_gop_key_points(AVStream *st)
static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb, AVStream *st, MOVStreamContext *sc)
IAMFMixPresentation ** mix_presentations
int trak_index
Index of the current 'trak'.
static int mov_read_timecode_track(AVFormatContext *s, AVStream *st)
uint32_t bound_left
Distance from the left edge.
static int mov_read_mac_string(MOVContext *c, AVIOContext *pb, int len, char *dst, int dstlen)
uint8_t * auxiliary_info_sizes
int video_delay
Video only.
#define avpriv_request_sample(...)
const VDPAUPixFmtMap * map
AVStreamGroup * avformat_stream_group_create(AVFormatContext *s, enum AVStreamGroupParamsType type, AVDictionary **options)
Add a new empty stream group to a media file.
#define AV_CHANNEL_LAYOUT_MONO
int height
Height of the final image for presentation.
static int read_tfra(MOVContext *mov, AVIOContext *f)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
This structure stores compressed data.
unsigned MaxFALL
Max average light level per frame (cd/m^2).
static double cr(void *priv, double x, double y)
unsigned * stps_data
partial sync sample for mpeg-2 open gop
@ AV_CODEC_ID_ADPCM_IMA_WAV
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
AVEncryptionInfo * av_encryption_info_alloc(uint32_t subsample_count, uint32_t key_id_size, uint32_t iv_size)
Allocates an AVEncryptionInfo structure and sub-pointers to hold the given number of subsamples.
int64_t pos
byte position in stream, -1 if unknown
static int mov_metadata_loci(MOVContext *c, AVIOContext *pb, unsigned len)
#define MOV_TRUN_SAMPLE_SIZE
uint32_t tmcd_flags
tmcd track flags
static float distance(float x, float y, int band)
static int parse_timecode_in_framenum_format(AVFormatContext *s, AVStream *st, int64_t value, int flags)
uint8_t tmcd_nb_frames
tmcd number of frames per tick / second
Submix element as defined in section 3.7 of IAMF.
struct AVStreamGroupTileGrid::@297 * offsets
An nb_tiles sized array of offsets in pixels from the topleft edge of the canvas, indicating where ea...
#define flags(name, subs,...)
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
int start_pad
amount of samples to skip due to enc-dec delay
AVStereo3DType
List of possible 3D Types.
int ff_mov_read_chnl(AVFormatContext *s, AVIOContext *pb, AVStream *st)
Read 'chnl' tag from the input stream.
const FFInputFormat ff_mov_demuxer
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
uint32_t min_sample_duration
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
const struct MP4TrackKindMapping ff_mov_track_kind_table[]
static AVStream * get_curr_st(MOVContext *c)
static int cenc_decrypt(MOVContext *c, MOVStreamContext *sc, AVEncryptionInfo *sample, uint8_t *input, int size)
#define MKTAG(a, b, c, d)
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
unsigned int sync_group_count
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base.
unsigned int samples_per_frame
static int mov_read_ispe(MOVContext *c, AVIOContext *pb, MOVAtom atom)
AVRational ambient_light_y
Normalized y chromaticity coordinate of the environmental ambient light in the nominal viewing enviro...
static int mov_read_iref(MOVContext *c, AVIOContext *pb, MOVAtom atom)
AVIAMFMixPresentation * mix
mix backs cmix iff the AVIAMFMixPresentation is owned by this structure.
static int mov_read_mfra(MOVContext *c, AVIOContext *f)
static int mov_metadata_int8_no_padding(MOVContext *c, AVIOContext *pb, unsigned len, const char *key)
unsigned int idx
Index of the stream in the group this tile references.
struct MOVStreamContext::@319 cenc
static MOVFragmentStreamInfo * get_frag_stream_info(MOVFragmentIndex *frag_index, int index, int id)
AVCodecParameters * codecpar
static int mov_read_kind(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define MOV_TRUN_SAMPLE_CTS
#define MOV_ISMV_TTML_TAG
unsigned int mix_presentation_id
int initial_padding
Audio only.
static int get_eia608_packet(AVIOContext *pb, AVPacket *pkt, int size)
static int mov_read_st3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int is_open_key_sample(const MOVStreamContext *sc, int sample)
static int mov_read_dvc1(MOVContext *c, AVIOContext *pb, MOVAtom atom)
const char * av_color_transfer_name(enum AVColorTransferCharacteristic transfer)
int avpriv_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp)
Set a dictionary value to an ISO-8601 compliant timestamp string.
static int64_t mov_read_atom_into_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom, AVCodecParameters *par, uint8_t *buf)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_RB64
int32_t yaw
Rotation around the up vector [-180, 180].
static void mov_read_chapters(AVFormatContext *s)
AVEncryptionInfo * default_encrypted_sample
#define AV_DICT_DONT_STRDUP_KEY
Take ownership of a key that's been allocated with av_malloc() or another memory allocation function.
int64_t next_root_atom
offset of the next root atom
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
uint8_t background[4]
The pixel value per channel in RGBA format used if no pixel of any tile is located at a particular pi...
static int cenc_scheme_decrypt(MOVContext *c, MOVStreamContext *sc, AVEncryptionInfo *sample, uint8_t *input, int size)
static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_parse_stsd_data(MOVContext *c, AVIOContext *pb, AVStream *st, MOVStreamContext *sc, int64_t size)
void ff_iamf_read_deinit(IAMFDemuxContext *c)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
uint8_t * av_encryption_init_info_add_side_data(const AVEncryptionInitInfo *info, size_t *side_data_size)
Allocates and initializes side data that holds a copy of the given encryption init info.
#define av_fourcc2str(fourcc)
int ff_mov_read_chan(AVFormatContext *s, AVIOContext *pb, AVStream *st, int64_t size)
Read 'chan' tag from the input stream.
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags)
Get the index for a specific timestamp.
static int mov_read_pitm(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
int ffindex
AVStream index.
static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom)