Go to the documentation of this file.
26 #include "config_components.h"
84 static int64_t
add_ctts_entry(
MOVCtts** ctts_data,
unsigned int* ctts_count,
unsigned int* allocated_size,
88 unsigned len,
const char *
key)
92 short current, total = 0;
98 snprintf(buf,
sizeof(buf),
"%d", current);
100 snprintf(buf,
sizeof(buf),
"%d/%d", current, total);
108 unsigned len,
const char *
key)
122 unsigned len,
const char *
key)
131 unsigned len,
const char *
key)
147 0x00C4,0x00C5,0x00C7,0x00C9,0x00D1,0x00D6,0x00DC,0x00E1,
148 0x00E0,0x00E2,0x00E4,0x00E3,0x00E5,0x00E7,0x00E9,0x00E8,
149 0x00EA,0x00EB,0x00ED,0x00EC,0x00EE,0x00EF,0x00F1,0x00F3,
150 0x00F2,0x00F4,0x00F6,0x00F5,0x00FA,0x00F9,0x00FB,0x00FC,
151 0x2020,0x00B0,0x00A2,0x00A3,0x00A7,0x2022,0x00B6,0x00DF,
152 0x00AE,0x00A9,0x2122,0x00B4,0x00A8,0x2260,0x00C6,0x00D8,
153 0x221E,0x00B1,0x2264,0x2265,0x00A5,0x00B5,0x2202,0x2211,
154 0x220F,0x03C0,0x222B,0x00AA,0x00BA,0x03A9,0x00E6,0x00F8,
155 0x00BF,0x00A1,0x00AC,0x221A,0x0192,0x2248,0x2206,0x00AB,
156 0x00BB,0x2026,0x00A0,0x00C0,0x00C3,0x00D5,0x0152,0x0153,
157 0x2013,0x2014,0x201C,0x201D,0x2018,0x2019,0x00F7,0x25CA,
158 0x00FF,0x0178,0x2044,0x20AC,0x2039,0x203A,0xFB01,0xFB02,
159 0x2021,0x00B7,0x201A,0x201E,0x2030,0x00C2,0x00CA,0x00C1,
160 0x00CB,0x00C8,0x00CD,0x00CE,0x00CF,0x00CC,0x00D3,0x00D4,
161 0xF8FF,0x00D2,0x00DA,0x00DB,0x00D9,0x0131,0x02C6,0x02DC,
162 0x00AF,0x02D8,0x02D9,0x02DA,0x00B8,0x02DD,0x02DB,0x02C7,
166 char *dst,
int dstlen)
169 char *end = dst+dstlen-1;
172 for (
i = 0;
i <
len;
i++) {
212 st =
c->fc->streams[
c->fc->nb_streams - 1];
231 char buf[200], place[100];
232 uint16_t langcode = 0;
233 double longitude, latitude, altitude;
234 const char *
key =
"location";
236 if (
len < 4 + 2 + 1 + 1 + 4 + 4 + 4) {
256 "loci too short (%u bytes left, need at least %d)\n",
len, 12);
264 snprintf(buf,
sizeof(buf),
"%+08.4f%+09.4f", latitude, longitude);
284 if (
c->ignore_chapters)
288 if (n_hmmt >
len / 4)
305 uint16_t langcode = 0;
306 uint32_t data_type = 0, str_size, str_size_alloc;
312 case MKTAG(
'@',
'P',
'R',
'M'):
key =
"premiere_version"; raw = 1;
break;
313 case MKTAG(
'@',
'P',
'R',
'Q'):
key =
"quicktime_version"; raw = 1;
break;
314 case MKTAG(
'X',
'M',
'P',
'_'):
315 if (
c->export_xmp) {
key =
"xmp"; raw = 1; }
break;
316 case MKTAG(
'a',
'A',
'R',
'T'):
key =
"album_artist";
break;
317 case MKTAG(
'a',
'k',
'I',
'D'):
key =
"account_type";
319 case MKTAG(
'a',
'p',
'I',
'D'):
key =
"account_id";
break;
320 case MKTAG(
'c',
'a',
't',
'g'):
key =
"category";
break;
321 case MKTAG(
'c',
'p',
'i',
'l'):
key =
"compilation";
323 case MKTAG(
'c',
'p',
'r',
't'):
key =
"copyright";
break;
324 case MKTAG(
'd',
'e',
's',
'c'):
key =
"description";
break;
325 case MKTAG(
'd',
'i',
's',
'k'):
key =
"disc";
327 case MKTAG(
'e',
'g',
'i',
'd'):
key =
"episode_uid";
329 case MKTAG(
'F',
'I',
'R',
'M'):
key =
"firmware"; raw = 1;
break;
330 case MKTAG(
'g',
'n',
'r',
'e'):
key =
"genre";
332 case MKTAG(
'h',
'd',
'v',
'd'):
key =
"hd_video";
334 case MKTAG(
'H',
'M',
'M',
'T'):
336 case MKTAG(
'k',
'e',
'y',
'w'):
key =
"keywords";
break;
337 case MKTAG(
'l',
'd',
'e',
's'):
key =
"synopsis";
break;
338 case MKTAG(
'l',
'o',
'c',
'i'):
340 case MKTAG(
'm',
'a',
'n',
'u'):
key =
"make";
break;
341 case MKTAG(
'm',
'o',
'd',
'l'):
key =
"model";
break;
342 case MKTAG(
'p',
'c',
's',
't'):
key =
"podcast";
344 case MKTAG(
'p',
'g',
'a',
'p'):
key =
"gapless_playback";
346 case MKTAG(
'p',
'u',
'r',
'd'):
key =
"purchase_date";
break;
347 case MKTAG(
'r',
't',
'n',
'g'):
key =
"rating";
349 case MKTAG(
's',
'o',
'a',
'a'):
key =
"sort_album_artist";
break;
350 case MKTAG(
's',
'o',
'a',
'l'):
key =
"sort_album";
break;
351 case MKTAG(
's',
'o',
'a',
'r'):
key =
"sort_artist";
break;
352 case MKTAG(
's',
'o',
'c',
'o'):
key =
"sort_composer";
break;
353 case MKTAG(
's',
'o',
'n',
'm'):
key =
"sort_name";
break;
354 case MKTAG(
's',
'o',
's',
'n'):
key =
"sort_show";
break;
355 case MKTAG(
's',
't',
'i',
'k'):
key =
"media_type";
357 case MKTAG(
't',
'r',
'k',
'n'):
key =
"track";
359 case MKTAG(
't',
'v',
'e',
'n'):
key =
"episode_id";
break;
360 case MKTAG(
't',
'v',
'e',
's'):
key =
"episode_sort";
362 case MKTAG(
't',
'v',
'n',
'n'):
key =
"network";
break;
363 case MKTAG(
't',
'v',
's',
'h'):
key =
"show";
break;
364 case MKTAG(
't',
'v',
's',
'n'):
key =
"season_number";
366 case MKTAG(0xa9,
'A',
'R',
'T'):
key =
"artist";
break;
367 case MKTAG(0xa9,
'P',
'R',
'D'):
key =
"producer";
break;
368 case MKTAG(0xa9,
'a',
'l',
'b'):
key =
"album";
break;
369 case MKTAG(0xa9,
'a',
'u',
't'):
key =
"artist";
break;
370 case MKTAG(0xa9,
'c',
'h',
'p'):
key =
"chapter";
break;
371 case MKTAG(0xa9,
'c',
'm',
't'):
key =
"comment";
break;
372 case MKTAG(0xa9,
'c',
'o',
'm'):
key =
"composer";
break;
373 case MKTAG(0xa9,
'c',
'p',
'y'):
key =
"copyright";
break;
374 case MKTAG(0xa9,
'd',
'a',
'y'):
key =
"date";
break;
375 case MKTAG(0xa9,
'd',
'i',
'r'):
key =
"director";
break;
376 case MKTAG(0xa9,
'd',
'i',
's'):
key =
"disclaimer";
break;
377 case MKTAG(0xa9,
'e',
'd',
'1'):
key =
"edit_date";
break;
378 case MKTAG(0xa9,
'e',
'n',
'c'):
key =
"encoder";
break;
379 case MKTAG(0xa9,
'f',
'm',
't'):
key =
"original_format";
break;
380 case MKTAG(0xa9,
'g',
'e',
'n'):
key =
"genre";
break;
381 case MKTAG(0xa9,
'g',
'r',
'p'):
key =
"grouping";
break;
382 case MKTAG(0xa9,
'h',
's',
't'):
key =
"host_computer";
break;
383 case MKTAG(0xa9,
'i',
'n',
'f'):
key =
"comment";
break;
384 case MKTAG(0xa9,
'l',
'y',
'r'):
key =
"lyrics";
break;
385 case MKTAG(0xa9,
'm',
'a',
'k'):
key =
"make";
break;
386 case MKTAG(0xa9,
'm',
'o',
'd'):
key =
"model";
break;
387 case MKTAG(0xa9,
'n',
'a',
'm'):
key =
"title";
break;
388 case MKTAG(0xa9,
'o',
'p',
'e'):
key =
"original_artist";
break;
389 case MKTAG(0xa9,
'p',
'r',
'd'):
key =
"producer";
break;
390 case MKTAG(0xa9,
'p',
'r',
'f'):
key =
"performers";
break;
391 case MKTAG(0xa9,
'r',
'e',
'q'):
key =
"playback_requirements";
break;
392 case MKTAG(0xa9,
's',
'r',
'c'):
key =
"original_source";
break;
393 case MKTAG(0xa9,
's',
't',
'3'):
key =
"subtitle";
break;
394 case MKTAG(0xa9,
's',
'w',
'r'):
key =
"encoder";
break;
395 case MKTAG(0xa9,
't',
'o',
'o'):
key =
"encoder";
break;
396 case MKTAG(0xa9,
't',
'r',
'k'):
key =
"track";
break;
397 case MKTAG(0xa9,
'u',
'r',
'l'):
key =
"URL";
break;
398 case MKTAG(0xa9,
'w',
'r',
'n'):
key =
"warning";
break;
399 case MKTAG(0xa9,
'w',
'r',
't'):
key =
"composer";
break;
400 case MKTAG(0xa9,
'x',
'y',
'z'):
key =
"location";
break;
403 if (
c->itunes_metadata && atom.
size > 8) {
406 if (
tag ==
MKTAG(
'd',
'a',
't',
'a') && data_size <= atom.size && data_size >= 16) {
409 str_size = data_size - 16;
412 if (!
key &&
c->found_hdlr_mdta &&
c->meta_keys) {
414 if (index < c->meta_keys_count &&
index > 0) {
416 }
else if (atom.
type !=
MKTAG(
'c',
'o',
'v',
'r')) {
418 "The index of 'data' is out of range: %"PRId32
" < 1 or >= %d.\n",
419 index,
c->meta_keys_count);
422 if (atom.
type ==
MKTAG(
'c',
'o',
'v',
'r') ||
423 (
key && !strcmp(
key,
"com.apple.quicktime.artwork"))) {
429 atom.
size -= str_size;
435 }
else if (atom.
size > 4 &&
key && !
c->itunes_metadata && !raw) {
437 if (str_size > atom.
size) {
447 str_size = atom.
size;
449 if (
c->export_all && !
key) {
455 if (atom.
size < 0 || str_size >= INT_MAX/2)
460 num = (data_type >= 21 && data_type <= 23);
461 str_size_alloc = (num ? 512 : (raw ? str_size : str_size * 2)) + 1;
469 if (!raw && (data_type == 3 || (data_type == 0 && (langcode < 0x400 || langcode == 0x7fff)))) {
471 }
else if (data_type == 21) {
475 else if (str_size == 2)
477 else if (str_size == 3)
479 else if (str_size == 4)
483 "Failed to store the number (%d) in string.\n",
val);
487 }
else if (data_type == 22) {
488 unsigned int val = 0;
491 else if (str_size == 2)
493 else if (str_size == 3)
495 else if (str_size == 4)
499 "Failed to store the number (%u) in string.\n",
val);
503 }
else if (data_type == 23 && str_size >= 4) {
507 "Failed to store the float32 number (%f) in string.\n",
val);
511 }
else if (data_type > 1 && data_type != 4) {
533 if (!strcmp(
key,
"encoder")) {
535 if (sscanf(
str,
"HandBrake %d.%d.%d", &
major, &
minor, µ) == 3) {
536 c->handbrake_version = 1000000*
major + 1000*
minor + micro;
548 int i, nb_chapters, str_len,
version;
552 if (
c->ignore_chapters)
555 if ((atom.
size -= 5) < 0)
564 for (
i = 0;
i < nb_chapters;
i++) {
571 if ((atom.
size -= 9+str_len) < 0)
583 #define MIN_DATA_ENTRY_BOX_SIZE 12
590 if (
c->fc->nb_streams < 1)
592 st =
c->fc->streams[
c->fc->nb_streams-1];
599 entries >= UINT_MAX /
sizeof(*sc->
drefs))
614 for (
i = 0;
i < entries;
i++) {
619 if (
size < 12 || next < 0 || next > INT64_MAX -
size)
629 uint16_t volume_len,
len;
636 volume_len =
FFMIN(volume_len, 27);
640 dref->
volume[volume_len] = 0;
682 if (
len > volume_len && !strncmp(dref->
path, dref->
volume, volume_len)) {
688 for (j =
len - 1; j >= 0; j--) {
689 if (dref->
path[j] == 0)
694 for (j = 0; j <
len; j++)
695 if (dref->
path[j] ==
':' || dref->
path[j] == 0)
698 }
else if (
type == 0) {
710 for (j = 0; j <
len; j++)
711 if (dref->
dir[j] ==
':')
747 if (
c->trak_index < 0) {
749 c->found_hdlr_mdta = 1;
754 st =
c->fc->streams[
c->fc->nb_streams-1];
769 title_size = atom.
size - 24;
770 if (title_size > 0) {
771 if (title_size >
FFMIN(INT_MAX, SIZE_MAX-1))
782 title_str[title_size] = 0;
784 int off = (!
c->isom && title_str[0] == title_size - 1);
803 int ac3info, acmod, lfeon, bsmod;
806 if (
c->fc->nb_streams < 1)
808 st =
c->fc->streams[
c->fc->nb_streams-1];
816 bsmod = (ac3info >> 14) & 0x7;
817 acmod = (ac3info >> 11) & 0x7;
818 lfeon = (ac3info >> 10) & 0x1;
837 int eac3info, acmod, lfeon, bsmod;
840 if (
c->fc->nb_streams < 1)
842 st =
c->fc->streams[
c->fc->nb_streams-1];
854 bsmod = (eac3info >> 12) & 0x1f;
855 acmod = (eac3info >> 9) & 0x7;
856 lfeon = (eac3info >> 8) & 0x1;
876 uint32_t frame_duration_code = 0;
877 uint32_t channel_layout_code = 0;
886 if (
c->fc->nb_streams < 1) {
889 st =
c->fc->streams[
c->fc->nb_streams-1];
899 frame_duration_code =
get_bits(&gb, 2);
901 channel_layout_code =
get_bits(&gb, 16);
904 (frame_duration_code == 0) ? 512 :
905 (frame_duration_code == 1) ? 1024 :
906 (frame_duration_code == 2) ? 2048 :
907 (frame_duration_code == 3) ? 4096 : 0;
909 if (channel_layout_code > 0xff) {
928 if (
c->fc->nb_streams < 1)
930 st =
c->fc->streams[
c->fc->nb_streams-1];
948 if (
c->fc->nb_streams < 1)
950 st =
c->fc->streams[
c->fc->nb_streams-1];
965 if (
c->fc->nb_streams < 1)
967 st =
c->fc->streams[
c->fc->nb_streams-1];
985 #define DRM_BLOB_SIZE 56
989 uint8_t intermediate_key[20];
990 uint8_t intermediate_iv[20];
993 uint8_t file_checksum[20];
994 uint8_t calculated_checksum[20];
995 char checksum_string[2 *
sizeof(file_checksum) + 1];
999 uint8_t *activation_bytes =
c->activation_bytes;
1000 uint8_t *fixed_key =
c->audible_fixed_key;
1009 if (!
c->aes_decrypt) {
1021 ff_data_to_hex(checksum_string, file_checksum,
sizeof(file_checksum), 1);
1025 if (!activation_bytes) {
1030 if (
c->activation_bytes_size != 4) {
1037 if (
c->audible_fixed_key_size != 16) {
1057 if (memcmp(calculated_checksum, file_checksum, 20)) {
1064 for (
i = 0;
i < 4;
i++) {
1066 if (activation_bytes[
i] !=
output[3 -
i]) {
1072 memcpy(
c->file_key,
output + 8, 16);
1088 if (
c->audible_key_size != 16) {
1093 if (
c->audible_iv_size != 16) {
1099 if (!
c->aes_decrypt) {
1103 memcpy(
c->file_key,
c->audible_key, 16);
1104 memcpy(
c->file_iv,
c->audible_iv, 16);
1114 unsigned char iv[16];
1116 memcpy(iv,
c->file_iv, 16);
1128 int comp_brand_size;
1129 char* comp_brands_str;
1130 uint8_t
type[5] = {0};
1135 if (strcmp(
type,
"qt "))
1139 c->is_still_picture_avif = !strncmp(
type,
"avif", 4);
1143 comp_brand_size = atom.
size - 8;
1144 if (comp_brand_size < 0 || comp_brand_size == INT_MAX)
1146 comp_brands_str =
av_malloc(comp_brand_size + 1);
1147 if (!comp_brands_str)
1155 comp_brands_str[comp_brand_size] = 0;
1160 if (!strcmp(
type,
"aaxc")) {
1172 if (
c->found_moov) {
1194 if (index < 0 || index >= frag_index->
nb_items)
1210 if (frag_index->
current < 0 ||
1229 if (frag_index->
current < 0 ||
1244 int64_t moof_offset;
1257 if (moof_offset >=
offset)
1259 if (moof_offset <=
offset)
1297 for (j = 0; j <
s->nb_streams; j++)
1298 if (
s->streams[j]->id == frag_stream_info->
id)
1299 frag_stream =
s->streams[j];
1321 m0 = m = (
a +
b) >> 1;
1327 if (m <
b && frag_time <= timestamp)
1344 if (index < c->frag_index.nb_items &&
1351 &
c->frag_index.allocated_size,
1352 (
c->frag_index.nb_items + 1) *
1353 sizeof(*
c->frag_index.item));
1356 c->frag_index.item = item;
1360 if (!frag_stream_info)
1363 for (
i = 0;
i <
c->fc->nb_streams;
i++) {
1365 if (
c->fc->streams[
i]->id < 0) {
1370 frag_stream_info[
i].
id =
c->fc->streams[
i]->id;
1380 if (index < c->frag_index.nb_items)
1381 memmove(
c->frag_index.item +
index + 1,
c->frag_index.item +
index,
1382 (
c->frag_index.nb_items -
index) *
sizeof(*
c->frag_index.item));
1384 item = &
c->frag_index.item[
index];
1390 c->frag_index.nb_items++;
1396 int id,
int entries)
1405 if (frag_stream_info && frag_stream_info->
index_entry >= 0)
1413 c->fragment.found_tfhd = 0;
1415 if (!
c->has_looked_for_mfra &&
c->use_mfra_for > 0) {
1416 c->has_looked_for_mfra = 1;
1423 "read the mfra (may be a live ismv)\n");
1427 "seekable, can not look for mfra\n");
1430 c->fragment.moof_offset =
c->fragment.implicit_offset =
avio_tell(pb) - 8;
1439 if (time >= 2082844800)
1442 if ((int64_t)(time * 1000000ULL) / 1000000 != time) {
1458 int64_t creation_time;
1460 if (
c->fc->nb_streams < 1)
1462 st =
c->fc->streams[
c->fc->nb_streams-1];
1508 int64_t creation_time;
1521 if (
c->time_scale <= 0) {
1535 for (
i = 0;
i < 3;
i++) {
1556 if (
fc->nb_streams < 1)
1558 st =
fc->streams[
fc->nb_streams-1];
1583 int little_endian =
avio_rb16(pb) & 0xFF;
1585 if (little_endian == 1)
1594 if (atom.
size < 6) {
1602 if (format_flags == 1)
1611 uint8_t *icc_profile;
1612 char color_parameter_type[5] = { 0 };
1616 if (
c->fc->nb_streams < 1)
1618 st =
c->fc->streams[
c->fc->nb_streams - 1];
1623 if (strncmp(color_parameter_type,
"nclx", 4) &&
1624 strncmp(color_parameter_type,
"nclc", 4) &&
1625 strncmp(color_parameter_type,
"prof", 4)) {
1627 color_parameter_type);
1631 if (!strncmp(color_parameter_type,
"prof", 4)) {
1644 "%s: pri %d trc %d matrix %d",
1647 if (!strncmp(color_parameter_type,
"nclx", 4)) {
1674 unsigned mov_field_order;
1677 if (
c->fc->nb_streams < 1)
1679 st =
c->fc->streams[
c->fc->nb_streams-1];
1683 if ((mov_field_order & 0xFF00) == 0x0100)
1685 else if ((mov_field_order & 0xFF00) == 0x0200) {
1686 switch (mov_field_order & 0xFF) {
1709 if (
size > INT_MAX || (uint64_t)atom.
size > INT_MAX)
1732 }
else if (err < atom.
size) {
1746 uint64_t original_size;
1749 if (
c->fc->nb_streams < 1)
1751 st =
c->fc->streams[
c->fc->nb_streams-1];
1800 if (!
ret &&
c->fc->nb_streams >= 1) {
1812 if (
c->fc->nb_streams >= 1) {
1813 AVStream *
const st =
c->fc->streams[
c->fc->nb_streams - 1];
1824 if (
cid == 0xd4d ||
cid == 0xd4e)
1835 if (num <= 0 || den <= 0)
1839 if (den >= INT_MAX / 2)
1857 uint64_t original_size;
1858 if (
c->fc->nb_streams >= 1) {
1862 if (atom.
size == 16) {
1867 if (length == atom.
size) {
1868 const uint8_t range_value = par->
extradata[original_size + 19];
1869 switch (range_value) {
1906 if (
c->fc->nb_streams < 1)
1908 st =
c->fc->streams[
c->fc->nb_streams-1];
1910 if ((uint64_t)atom.
size > (1<<30))
1920 }
else if (atom.
size > 8) {
1934 #define ALAC_EXTRADATA_SIZE 36
1963 if (
c->fc->nb_streams < 1)
1965 st =
c->fc->streams[
c->fc->nb_streams-1];
1967 if ((uint64_t)atom.
size > (1<<30))
1970 if (atom.
size >= 10) {
2002 uint8_t profile_level;
2005 if (
c->fc->nb_streams < 1)
2007 st =
c->fc->streams[
c->fc->nb_streams-1];
2009 if (atom.
size >= (1<<28) || atom.
size < 7)
2013 if ((profile_level & 0xf0) != 0xc0)
2034 if (
c->fc->nb_streams < 1)
2036 if (atom.
size <= 40)
2038 st =
c->fc->streams[
c->fc->nb_streams-1];
2040 if ((uint64_t)atom.
size > (1<<30))
2055 unsigned int i, entries;
2057 if (
c->trak_index < 0) {
2061 if (
c->fc->nb_streams < 1)
2063 st =
c->fc->streams[
c->fc->nb_streams-1];
2085 if (atom.
type ==
MKTAG(
's',
't',
'c',
'o'))
2088 else if (atom.
type ==
MKTAG(
'c',
'o',
'6',
'4'))
2109 ((
format & 0xFFFF) ==
'm' + (
's' << 8) ||
2110 (
format & 0xFFFF) ==
'T' + (
'S' << 8)))
2142 uint8_t codec_name[32] = { 0 };
2177 if (!strncmp(codec_name,
"Planar Y'CbCr 8-bit 4:2:0", 25)) {
2184 !strncmp(codec_name,
"Sorenson H263", 13))
2200 int bits_per_sample,
flags;
2225 (compatible_brands && strstr(compatible_brands->
value,
"qt ")) ||
2333 y = (ycbcr >> 16) & 0xFF;
2334 cr = (ycbcr >> 8) & 0xFF;
2341 return (
r << 16) | (
g << 8) |
b;
2346 char buf[256] = {0};
2354 snprintf(buf,
sizeof(buf),
"size: %dx%d\n",
2358 for (
i = 0;
i < 16;
i++) {
2362 av_strlcatf(buf,
sizeof(buf),
"%06"PRIx32
"%s", rgba,
i != 15 ?
", " :
"");
2365 if (
av_strlcat(buf,
"\n",
sizeof(buf)) >=
sizeof(buf))
2402 if (str_size > 0 &&
size >= (
int)str_size + 30 &&
2404 char *reel_name =
av_malloc(str_size + 1);
2408 reel_name[str_size] = 0;
2433 #if CONFIG_DV_DEMUXER
2522 int codec_tag,
int format,
2534 : codec_tag !=
MKTAG(
'j',
'p',
'e',
'g')))) {
2551 int pseudo_stream_id;
2554 st =
c->fc->streams[
c->fc->nb_streams-1];
2557 for (pseudo_stream_id = 0;
2559 pseudo_stream_id++) {
2562 int ret, dref_id = 1;
2572 }
else if (
size <= 7) {
2574 "invalid size %"PRId64
" in stsd\n",
size);
2591 "size=%"PRId64
" 4CC=%s codec_type=%d\n",
size,
2621 }
else if (
a.size > 0)
2650 if (
c->fc->nb_streams < 1)
2652 st =
c->fc->streams[
c->fc->nb_streams - 1];
2660 if (entries <= 0 || entries > atom.
size / 8 || entries > 1024) {
2667 "Duplicate stsd found in this track.\n");
2713 unsigned int i, entries;
2715 if (
c->fc->nb_streams < 1)
2717 st =
c->fc->streams[
c->fc->nb_streams-1];
2724 if ((uint64_t)entries * 12 + 4 > atom.
size)
2749 int64_t first_min =
i + 1;
2809 unsigned i, entries;
2811 if (
c->fc->nb_streams < 1)
2813 st =
c->fc->streams[
c->fc->nb_streams-1];
2846 unsigned int i, entries;
2848 if (
c->fc->nb_streams < 1)
2850 st =
c->fc->streams[
c->fc->nb_streams-1];
2869 if (entries >= UINT_MAX /
sizeof(
int))
2895 unsigned int i, entries, sample_size, field_size, num_bytes;
2900 if (
c->fc->nb_streams < 1)
2902 st =
c->fc->streams[
c->fc->nb_streams-1];
2908 if (atom.
type ==
MKTAG(
's',
't',
's',
'z')) {
2927 if (field_size != 4 && field_size != 8 && field_size != 16 && field_size != 32) {
2944 num_bytes = (entries*field_size+4)>>3;
2962 for (
i = 0;
i < entries;
i++) {
2983 unsigned int i, entries, alloc_size = 0;
2985 int64_t total_sample_count = 0;
2986 int64_t current_dts = 0;
2987 int64_t corrected_dts = 0;
2989 if (
c->fc->nb_streams < 1)
2991 st =
c->fc->streams[
c->fc->nb_streams-1];
2999 c->fc->nb_streams-1, entries);
3005 if (entries >= INT_MAX /
sizeof(*sc->
stts_data))
3009 unsigned int sample_duration;
3010 unsigned int sample_count;
3011 unsigned int min_entries =
FFMIN(
FFMAX(
i + 1, 1024 * 1024), entries);
3029 sample_count, sample_duration);
3034 if (sample_duration >
c->max_stts_delta) {
3037 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",
3038 sample_duration,
i, sample_count, st->
index);
3040 corrected_dts += (delta_magnitude < 0 ? (int64_t)delta_magnitude : 1) * sample_count;
3042 corrected_dts += sample_duration * sample_count;
3047 if (current_dts > corrected_dts) {
3048 int64_t drift = (current_dts - corrected_dts)/
FFMAX(sample_count, 1);
3050 current_dts -= correction * sample_count;
3061 duration <= INT64_MAX - sc->duration_for_fps &&
3062 total_sample_count <= INT_MAX - sc->nb_frames_for_fps) {
3084 "All samples in data stream index:id [%d:%d] have zero "
3085 "duration, stream set to be discarded by default. Override "
3086 "using AVStream->discard or -discard for ffmpeg command.\n",
3100 if (
c->fc->nb_streams < 1)
3102 st =
c->fc->streams[
c->fc->nb_streams - 1];
3107 entries = atom.
size - 4;
3110 c->fc->nb_streams - 1, entries);
3143 unsigned int i, entries, ctts_count = 0;
3145 if (
c->fc->nb_streams < 1)
3147 st =
c->fc->streams[
c->fc->nb_streams-1];
3158 if (entries >= UINT_MAX /
sizeof(*sc->
ctts_data))
3171 "ignoring CTTS entry with count=%d duration=%d\n",
3210 uint32_t grouping_type;
3211 uint32_t default_length;
3212 av_unused uint32_t default_group_description_index;
3213 uint32_t entry_count;
3215 if (
c->fc->nb_streams < 1)
3217 st =
c->fc->streams[
c->fc->nb_streams - 1];
3228 if (grouping_type !=
MKTAG(
's',
'y',
'n',
'c'))
3242 uint32_t description_length = default_length;
3243 if (
version >= 1 && default_length == 0)
3245 if (grouping_type ==
MKTAG(
's',
'y',
'n',
'c')) {
3246 const uint8_t nal_unit_type =
avio_r8(pb) & 0x3f;
3248 description_length -= 1;
3265 unsigned int i, entries;
3267 uint32_t grouping_type;
3271 if (
c->fc->nb_streams < 1)
3273 st =
c->fc->streams[
c->fc->nb_streams-1];
3280 if (grouping_type ==
MKTAG(
'r',
'a',
'p',
' ')) {
3283 }
else if (grouping_type ==
MKTAG(
's',
'y',
'n',
'c')) {
3324 unsigned int edit_list_index,
3325 int64_t *edit_list_media_time,
3326 int64_t *edit_list_duration,
3327 int64_t global_timescale)
3332 *edit_list_media_time = msc->
elst_data[edit_list_index].
time;
3336 if (global_timescale == 0) {
3369 int64_t timestamp_pts,
3372 int64_t* ctts_index,
3373 int64_t* ctts_sample)
3380 int64_t index_ctts_count;
3408 if (ctts_data && *
index >= 0) {
3414 for (index_ctts_count = 0; index_ctts_count < *
index; index_ctts_count++) {
3415 if (*ctts_index < ctts_count) {
3417 if (ctts_data[*ctts_index].
count == *ctts_sample) {
3424 while (*
index >= 0 && (*ctts_index) >= 0 && (*ctts_index) < ctts_count) {
3428 if ((e_old[*
index].timestamp + ctts_data[*ctts_index].
duration) <= timestamp_pts &&
3434 if (*ctts_sample == 0) {
3436 if (*ctts_index >= 0)
3437 *ctts_sample = ctts_data[*ctts_index].
count - 1;
3447 return *
index >= 0 ? 0 : -1;
3471 const size_t requested_size =
3488 ie= &entries[
index];
3503 int64_t* frame_duration_buffer,
3504 int frame_duration_buffer_size) {
3507 av_assert0(end_index >= 0 && end_index <= sti->nb_index_entries);
3508 for (
i = 0;
i < frame_duration_buffer_size;
i++) {
3509 end_ts -= frame_duration_buffer[frame_duration_buffer_size - 1 -
i];
3522 const size_t min_size_needed = (*ctts_count + 1) *
sizeof(
MOVCtts);
3523 const size_t requested_size =
3524 min_size_needed > *allocated_size ?
3525 FFMAX(min_size_needed, 2 * (*allocated_size)) :
3528 if ((
unsigned)(*ctts_count) >= UINT_MAX /
sizeof(
MOVCtts) - 1)
3531 ctts_buf_new =
av_fast_realloc(*ctts_data, allocated_size, requested_size);
3536 *ctts_data = ctts_buf_new;
3541 *ctts_count = (*ctts_count) + 1;
3545 #define MAX_REORDER_DELAY 16
3551 int ctts_sample = 0;
3554 int j,
r, num_swaps;
3557 pts_buf[j] = INT64_MIN;
3565 buf_start = (buf_start + 1);
3578 while (j != buf_start) {
3581 if (pts_buf[j] < pts_buf[
r]) {
3582 FFSWAP(int64_t, pts_buf[j], pts_buf[
r]);
3640 if (range_size > current_sample) {
3644 current_sample -= range_size;
3663 int64_t ctts_index_old = 0;
3664 int64_t ctts_sample_old = 0;
3666 int64_t edit_list_media_time = 0;
3667 int64_t edit_list_duration = 0;
3668 int64_t frame_duration = 0;
3669 int64_t edit_list_dts_counter = 0;
3670 int64_t edit_list_dts_entry_end = 0;
3671 int64_t edit_list_start_ctts_sample = 0;
3673 int64_t curr_ctts = 0;
3674 int64_t empty_edits_sum_duration = 0;
3675 int64_t edit_list_index = 0;
3678 int64_t start_dts = 0;
3679 int64_t edit_list_start_encountered = 0;
3680 int64_t search_timestamp = 0;
3681 int64_t* frame_duration_buffer =
NULL;
3682 int num_discarded_begin = 0;
3683 int first_non_zero_audio_edit = -1;
3684 int packet_skip_samples = 0;
3686 int found_keyframe_after_edit = 0;
3687 int found_non_empty_edit = 0;
3720 edit_list_dts_entry_end -= msc->
dts_shift;
3724 start_dts = edit_list_dts_entry_end;
3728 av_log(mov->
fc,
AV_LOG_DEBUG,
"Processing st: %d, edit list %"PRId64
" - media time: %"PRId64
", duration: %"PRId64
"\n",
3729 st->
index, edit_list_index, edit_list_media_time, edit_list_duration);
3731 edit_list_dts_counter = edit_list_dts_entry_end;
3732 edit_list_dts_entry_end += edit_list_duration;
3733 num_discarded_begin = 0;
3734 if (!found_non_empty_edit && edit_list_media_time == -1) {
3735 empty_edits_sum_duration += edit_list_duration;
3738 found_non_empty_edit = 1;
3743 if (first_non_zero_audio_edit < 0) {
3744 first_non_zero_audio_edit = 1;
3746 first_non_zero_audio_edit = 0;
3749 if (first_non_zero_audio_edit > 0)
3757 search_timestamp = edit_list_media_time;
3766 &
index, &ctts_index_old, &ctts_sample_old) < 0) {
3768 "st: %d edit list: %"PRId64
" Missing key frame while searching for timestamp: %"PRId64
"\n",
3769 st->
index, edit_list_index, search_timestamp);
3771 &
index, &ctts_index_old, &ctts_sample_old) < 0) {
3773 "st: %d edit list %"PRId64
" Cannot find an index entry before timestamp: %"PRId64
".\n",
3774 st->
index, edit_list_index, search_timestamp);
3777 ctts_sample_old = 0;
3780 current = e_old +
index;
3781 edit_list_start_ctts_sample = ctts_sample_old;
3784 edit_list_start_encountered = 0;
3785 found_keyframe_after_edit = 0;
3786 for (; current < e_old_end; current++,
index++) {
3788 frame_duration = (current + 1 < e_old_end) ?
3789 ((current + 1)->timestamp - current->
timestamp) : edit_list_duration;
3797 if (ctts_data_old && ctts_index_old < ctts_count_old) {
3798 curr_ctts = ctts_data_old[ctts_index_old].
duration;
3799 av_log(mov->
fc,
AV_LOG_TRACE,
"stts: %"PRId64
" ctts: %"PRId64
", ctts_index: %"PRId64
", ctts_count: %"PRId64
"\n",
3800 curr_cts, curr_ctts, ctts_index_old, ctts_count_old);
3801 curr_cts += curr_ctts;
3803 if (ctts_sample_old == ctts_data_old[ctts_index_old].
count) {
3806 ctts_data_old[ctts_index_old].
count - edit_list_start_ctts_sample,
3807 ctts_data_old[ctts_index_old].
duration) == -1) {
3810 ctts_data_old[ctts_index_old].
count - edit_list_start_ctts_sample,
3811 ctts_data_old[ctts_index_old].
duration);
3815 ctts_sample_old = 0;
3816 edit_list_start_ctts_sample = 0;
3820 if (curr_cts < edit_list_media_time || curr_cts >= (edit_list_duration + edit_list_media_time)) {
3822 curr_cts < edit_list_media_time && curr_cts + frame_duration > edit_list_media_time &&
3823 first_non_zero_audio_edit > 0) {
3824 packet_skip_samples = edit_list_media_time - curr_cts;
3828 edit_list_dts_counter -= packet_skip_samples;
3829 if (edit_list_start_encountered == 0) {
3830 edit_list_start_encountered = 1;
3833 if (frame_duration_buffer) {
3835 frame_duration_buffer, num_discarded_begin);
3840 av_log(mov->
fc,
AV_LOG_DEBUG,
"skip %d audio samples from curr_cts: %"PRId64
"\n", packet_skip_samples, curr_cts);
3845 if (edit_list_start_encountered == 0) {
3846 num_discarded_begin++;
3847 frame_duration_buffer =
av_realloc(frame_duration_buffer,
3848 num_discarded_begin *
sizeof(int64_t));
3849 if (!frame_duration_buffer) {
3853 frame_duration_buffer[num_discarded_begin - 1] = frame_duration;
3868 if (edit_list_start_encountered == 0) {
3869 edit_list_start_encountered = 1;
3872 if (frame_duration_buffer) {
3874 frame_duration_buffer, num_discarded_begin);
3887 if (current_index_range < msc->index_ranges ||
index != current_index_range->
end) {
3888 current_index_range++;
3891 current_index_range->
end =
index + 1;
3894 if (edit_list_start_encountered > 0) {
3895 edit_list_dts_counter = edit_list_dts_counter + frame_duration;
3899 if ((curr_cts + frame_duration >= (edit_list_duration + edit_list_media_time)) &&
3901 if (ctts_data_old) {
3906 found_keyframe_after_edit = 1;
3909 if (ctts_sample_old != 0) {
3912 ctts_sample_old - edit_list_start_ctts_sample,
3913 ctts_data_old[ctts_index_old].
duration) == -1) {
3915 ctts_index_old, ctts_sample_old - edit_list_start_ctts_sample,
3916 ctts_data_old[ctts_index_old].
duration);
3951 current_index_range++;
3952 current_index_range->
start = 0;
3953 current_index_range->
end = 0;
4012 if (sg->
index == cra_index)
4013 for (uint32_t j = 0; j < sg->
count; j++)
4015 if (sg->
count > INT_MAX - sample_id)
4017 sample_id += sg->
count;
4032 int64_t current_offset;
4033 int64_t current_dts = 0;
4034 unsigned int stts_index = 0;
4035 unsigned int stsc_index = 0;
4036 unsigned int stss_index = 0;
4037 unsigned int stps_index = 0;
4039 uint64_t stream_size = 0;
4041 unsigned int ctts_count_old = sc->
ctts_count;
4048 int i, edit_start_index = 0, multiple_edits = 0;
4049 int64_t empty_duration = 0;
4054 if (
i == 0 && e->
time == -1) {
4058 edit_start_index = 1;
4059 }
else if (
i == edit_start_index && e->
time >= 0) {
4069 "not supported in fragmented MP4 files\n");
4072 "Use -advanced_editlist to correctly decode otherwise "
4073 "a/v desync might occur\n");
4098 unsigned int current_sample = 0;
4099 unsigned int stts_sample = 0;
4100 unsigned int sample_size;
4102 unsigned int rap_group_index = 0;
4103 unsigned int rap_group_sample = 0;
4121 if (ctts_data_old) {
4136 for (
i = 0;
i < ctts_count_old &&
4138 for (j = 0; j < ctts_data_old[
i].
count &&
4179 if (rap_group_present && rap_group_index < sc->rap_group_count) {
4182 if (++rap_group_sample == sc->
rap_group[rap_group_index].
count) {
4183 rap_group_sample = 0;
4189 && !rap_group_present
4195 if (current_offset > INT64_MAX - sample_size) {
4205 if (sample_size > 0x3FFFFFFF) {
4210 e->
pos = current_offset;
4212 e->
size = sample_size;
4215 av_log(mov->
fc,
AV_LOG_TRACE,
"AVIndex stream %d, sample %u, offset %"PRIx64
", dts %"PRId64
", "
4216 "size %u, distance %u, keyframe %d\n", st->
index, current_sample,
4217 current_offset, current_dts, sample_size,
distance, keyframe);
4222 current_offset += sample_size;
4223 stream_size += sample_size;
4239 unsigned chunk_samples, total = 0;
4246 unsigned count, chunk_count;
4261 count = (chunk_samples+1023) / 1024;
4268 total += chunk_count *
count;
4290 while (chunk_samples > 0) {
4296 "Zero bytes per frame, but %d samples per frame",
4319 if (
size > 0x3FFFFFFF) {
4324 e->
pos = current_offset;
4330 "size %u, duration %u\n", st->
index,
i, current_offset, current_dts,
4333 current_offset +=
size;
4366 av_url_split(src_proto,
sizeof(src_proto), src_auth,
sizeof(src_auth), src_host,
sizeof(src_host), &src_port,
NULL, 0,
src);
4367 av_url_split(ref_proto,
sizeof(ref_proto), ref_auth,
sizeof(ref_auth), ref_host,
sizeof(ref_host), &ref_port,
NULL, 0,
ref);
4369 if (strlen(
src) == 0) {
4371 }
else if (strlen(src_auth) + 1 >=
sizeof(src_auth) ||
4372 strlen(ref_auth) + 1 >=
sizeof(ref_auth) ||
4373 strlen(src_host) + 1 >=
sizeof(src_host) ||
4374 strlen(ref_host) + 1 >=
sizeof(ref_host)) {
4376 }
else if (strcmp(src_proto, ref_proto) ||
4377 strcmp(src_auth, ref_auth) ||
4378 strcmp(src_host, ref_host) ||
4379 src_port != ref_port) {
4389 if (
ref->nlvl_to > 0 &&
ref->nlvl_from > 0) {
4390 char filename[1025];
4391 const char *src_path;
4395 src_path = strrchr(
src,
'/');
4402 for (
i = 0, l = strlen(
ref->path) - 1; l >= 0; l--)
4403 if (
ref->path[l] ==
'/') {
4404 if (
i ==
ref->nlvl_to - 1)
4411 if (
i ==
ref->nlvl_to - 1 && src_path -
src <
sizeof(filename)) {
4412 memcpy(filename,
src, src_path -
src);
4413 filename[src_path -
src] = 0;
4415 for (
i = 1;
i <
ref->nlvl_from;
i++)
4416 av_strlcat(filename,
"../",
sizeof(filename));
4419 if (!
c->use_absolute_path) {
4424 "Reference with mismatching origin, %s not tried for security reasons, "
4425 "set demuxer option use_absolute_path to allow it anyway\n",
4430 if (strstr(
ref->path + l + 1,
"..") ||
4431 strstr(
ref->path + l + 1,
":") ||
4432 (
ref->nlvl_from > 1 && same_origin < 0) ||
4433 (filename[0] ==
'/' && src_path ==
src))
4437 if (strlen(filename) + 1 ==
sizeof(filename))
4442 }
else if (
c->use_absolute_path) {
4444 "this is a possible security issue\n");
4449 "Absolute path %s not tried for security reasons, "
4450 "set demuxer option use_absolute_path to allow absolute paths\n",
4474 if (!st)
return AVERROR(ENOMEM);
4477 if (!sc)
return AVERROR(ENOMEM);
4482 c->trak_index = st->
index;
4523 c->advanced_editlist) {
4526 "MP4. disabling.\n");
4527 c->advanced_editlist = 0;
4528 c->advanced_editlist_autodisabled = 1;
4535 if (
c->enable_drefs) {
4538 "stream %d, error opening alias: path='%s', dir='%s', "
4539 "filename='%s', volume='%s', nlvl_from=%d, nlvl_to=%d\n",
4544 "Skipped opening external track: "
4545 "stream %d, alias: path='%s', dir='%s', "
4546 "filename='%s', volume='%s', nlvl_from=%d, nlvl_to=%d."
4547 "Set enable_drefs to allow this.\n",
4564 #if FF_API_R_FRAME_RATE
4580 #if CONFIG_H261_DECODER
4583 #if CONFIG_H263_DECODER
4586 #if CONFIG_MPEG4_DECODER
4618 c->itunes_metadata = 1;
4620 c->itunes_metadata = 0;
4634 if (
count > UINT_MAX /
sizeof(*
c->meta_keys) - 1) {
4636 "The 'keys' atom with the invalid key count: %"PRIu32
"\n",
count);
4640 c->meta_keys_count =
count + 1;
4641 c->meta_keys =
av_mallocz(
c->meta_keys_count *
sizeof(*
c->meta_keys));
4650 "The key# %"PRIu32
" in meta has invalid size:"
4651 "%"PRIu32
"\n",
i, key_size);
4659 if (!
c->meta_keys[
i])
4676 if (
c->fc->nb_streams < 1)
4678 st =
c->fc->streams[
c->fc->nb_streams-1];
4681 for (
i = 0;
i < 3;
i++) {
4692 if (len < 12 || len - 12 > end -
avio_tell(pb))
4696 if (
tag ==
MKTAG(
'm',
'e',
'a',
'n'))
4698 else if (
tag ==
MKTAG(
'n',
'a',
'm',
'e'))
4700 else if (
tag ==
MKTAG(
'd',
'a',
't',
'a') &&
len > 4) {
4724 if (strcmp(
key,
"iTunSMPB") == 0) {
4725 int priming, remainder,
samples;
4726 if(sscanf(
val,
"%*X %X %X %X", &priming, &remainder, &
samples) == 3){
4727 if(priming>0 && priming<16384)
4731 if (strcmp(
key,
"cdec") != 0) {
4738 "Unhandled or malformed custom metadata of size %"PRId64
"\n", atom.
size);
4752 int item_index = -1;
4753 for (
int i = 0;
i <
c->avif_info_size;
i++)
4754 if (
c->avif_info[
i].item_id == item_id) {
4763 st->
id =
c->fc->nb_streams;
4772 c->trak_index = st->
index;
4804 sc->
sample_sizes[0] =
c->avif_info[item_index].extent_length;
4813 while (atom.
size > 8) {
4819 if (
tag ==
MKTAG(
'h',
'd',
'l',
'r')) {
4825 if (
c->is_still_picture_avif) {
4843 #define IS_MATRIX_IDENT(matrix) \
4844 ( (matrix)[0][0] == (1 << 16) && \
4845 (matrix)[1][1] == (1 << 16) && \
4846 (matrix)[2][2] == (1 << 30) && \
4847 !(matrix)[0][1] && !(matrix)[0][2] && \
4848 !(matrix)[1][0] && !(matrix)[1][2] && \
4849 !(matrix)[2][0] && !(matrix)[2][1])
4856 int display_matrix[3][3];
4857 int res_display_matrix[3][3] = { { 0 } };
4863 if (
c->fc->nb_streams < 1)
4865 st =
c->fc->streams[
c->fc->nb_streams-1];
4901 for (
i = 0;
i < 3;
i++) {
4913 for (
i = 0;
i < 3;
i++) {
4914 const int sh[3] = { 16, 16, 30 };
4915 for (j = 0; j < 3; j++) {
4916 for (e = 0; e < 3; e++) {
4917 res_display_matrix[
i][j] +=
4918 ((int64_t) display_matrix[
i][e] *
4919 c->movie_display_matrix[e][j]) >> sh[e];
4931 for (
i = 0;
i < 3;
i++)
4932 for (j = 0; j < 3; j++)
4939 double disp_transform[2];
4941 for (
i = 0;
i < 2;
i++)
4945 if (disp_transform[0] > 1 && disp_transform[1] > 1 &&
4946 disp_transform[0] < (1<<24) && disp_transform[1] < (1<<24) &&
4947 fabs((disp_transform[0] / disp_transform[1]) - 1.0) > 0.01)
4949 disp_transform[0] / disp_transform[1],
4968 for (
i = 0;
i <
c->trex_count;
i++)
4969 if (
c->trex_data[
i].track_id == track_id) {
4970 trex = &
c->trex_data[
i];
4977 c->fragment.found_tfhd = 1;
4995 if (frag_stream_info) {
5007 num = atom.
size / 4;
5012 c->chapter_tracks = new_tracks;
5013 c->nb_chapter_tracks = num;
5018 c->nb_chapter_tracks =
i;
5028 if ((uint64_t)
c->trex_count+1 >= UINT_MAX /
sizeof(*
c->trex_data))
5031 sizeof(*
c->trex_data))) < 0) {
5038 trex = &
c->trex_data[
c->trex_count++];
5056 int64_t base_media_decode_time;
5058 for (
i = 0;
i <
c->fc->nb_streams;
i++) {
5059 if (
c->fc->streams[
i]->id == frag->
track_id) {
5060 st =
c->fc->streams[
i];
5080 if (frag_stream_info)
5081 frag_stream_info->
tfdt_dts = base_media_decode_time;
5096 int data_offset = 0;
5097 unsigned entries, first_sample_flags = frag->
flags;
5100 int next_frag_index = -1, index_entry_pos;
5101 size_t requested_size;
5102 size_t old_ctts_allocated_size;
5111 for (
i = 0;
i <
c->fc->nb_streams;
i++) {
5112 if (
c->fc->streams[
i]->id == frag->
track_id) {
5113 st =
c->fc->streams[
i];
5133 for (
i =
c->frag_index.current + 1; i < c->frag_index.nb_items;
i++) {
5135 if (frag_stream_info && frag_stream_info->
index_entry >= 0) {
5136 next_frag_index =
i;
5141 av_assert0(index_entry_pos <= sti->nb_index_entries);
5154 if (frag_stream_info) {
5161 ", using it for pts\n",
pts);
5166 ", using it for dts\n",
pts);
5170 int fallback_tfdt = !
c->use_tfdt && !has_sidx && has_tfdt;
5171 int fallback_sidx =
c->use_tfdt && !has_tfdt && has_sidx;
5173 if (fallback_sidx) {
5176 if (fallback_tfdt) {
5180 if (has_tfdt &&
c->use_tfdt || fallback_tfdt) {
5183 ", using it for dts\n", dts);
5184 }
else if (has_sidx && !
c->use_tfdt || fallback_sidx) {
5189 ", using it for dts\n", frag_stream_info->
sidx_pts);
5193 ", using it for dts\n", dts);
5199 ", using it for dts\n", dts);
5232 memset((uint8_t*)(sc->
ctts_data) + old_ctts_allocated_size, 0,
5235 if (index_entry_pos < sti->nb_index_entries) {
5241 memmove(sc->
ctts_data + index_entry_pos + entries,
5244 if (index_entry_pos < sc->current_sample) {
5253 if (frag_stream_info) {
5256 frag_stream_info->
index_base = index_entry_pos;
5259 if (index_entry_pos > 0)
5263 unsigned sample_size = frag->
size;
5264 int sample_flags =
i ? frag->
flags : first_sample_flags;
5265 unsigned sample_duration = frag->
duration;
5266 unsigned ctts_duration = 0;
5268 int index_entry_flags = 0;
5279 dts -= ctts_duration;
5284 "pts %"PRId64
" calculated dts %"PRId64
5285 " sc->dts_shift %d ctts.duration %d"
5286 " sc->time_offset %"PRId64
5287 " flags & MOV_TRUN_SAMPLE_CTS %d\n",
5306 if (prev_dts >= dts)
5319 av_log(
c->fc,
AV_LOG_TRACE,
"AVIndex stream %d, sample %d, offset %"PRIx64
", dts %"PRId64
", "
5320 "size %u, distance %d, keyframe %d\n", st->
index,
5323 if (
av_sat_add64(dts, sample_duration) != dts + (uint64_t)sample_duration)
5327 dts += sample_duration;
5331 if (sample_duration <= INT64_MAX - sc->duration_for_fps &&
5338 if (frag_stream_info)
5343 int gap = entries -
i;
5348 memmove(sc->
ctts_data + index_entry_pos,
5355 if (index_entry_pos < sc->current_sample) {
5365 if (index_entry_pos > 0)
5368 if (prev_dts < sti->index_entries[
i].timestamp)
5399 unsigned i, j, track_id, item_count;
5414 for (
i = 0;
i <
c->fc->nb_streams;
i++) {
5415 if (
c->fc->streams[
i]->id == track_id) {
5416 st =
c->fc->streams[
i];
5429 if (timescale.
den <= 0) {
5444 offset += (uint64_t)offadd;
5449 if (item_count == 0)
5452 for (
i = 0;
i < item_count;
i++) {
5457 if (
size & 0x80000000) {
5466 if (frag_stream_info)
5467 frag_stream_info->
sidx_pts = timestamp;
5482 is_complete =
offset == stream_size;
5486 if (!
c->have_read_mfra_size) {
5487 if ((
ret =
avio_seek(pb, stream_size - 4, SEEK_SET)) < 0)
5490 c->have_read_mfra_size = 1;
5494 if (
offset == stream_size -
c->mfra_size)
5501 for (
i = 0;
i <
c->frag_index.nb_items;
i++) {
5507 ref_st =
c->fc->streams[j];
5513 if (ref_st)
for (
i = 0;
i <
c->fc->nb_streams;
i++) {
5514 st =
c->fc->streams[
i];
5521 c->frag_index.complete = 1;
5542 if (atom.
type !=
MKTAG(
'm',
'd',
'a',
't')) {
5556 long cmov_len, moov_len;
5570 cmov_len = atom.
size - 6 * 4;
5582 goto free_and_return;
5585 if (uncompress (moov_data, (uLongf *) &moov_len, (
const Bytef *)cmov_data, cmov_len) != Z_OK)
5586 goto free_and_return;
5590 atom.
size = moov_len;
5607 int64_t elst_entry_size;
5609 if (
c->fc->nb_streams < 1 ||
c->ignore_editlist)
5611 sc =
c->fc->streams[
c->fc->nb_streams-1]->priv_data;
5618 elst_entry_size =
version == 1 ? 20 : 12;
5619 if (atom.
size != edit_count * elst_entry_size) {
5621 av_log(
c->fc,
AV_LOG_ERROR,
"Invalid edit list entry_count: %d for elst atom of size: %"PRId64
" bytes.\n",
5622 edit_count, atom.
size + 8);
5625 edit_count = atom.
size / elst_entry_size;
5626 if (edit_count * elst_entry_size != atom.
size) {
5660 if (e->
time < 0 && e->
time != -1 &&
5662 av_log(
c->fc,
AV_LOG_ERROR,
"Track %d, edit %d: Invalid edit list media time=%"PRId64
"\n",
5663 c->fc->nb_streams-1,
i, e->
time);
5676 if (
c->fc->nb_streams < 1)
5678 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
5688 if (
c->fc->nb_streams < 1)
5690 st =
c->fc->streams[
c->fc->nb_streams - 1];
5692 if (atom.
size < 5) {
5732 if (
c->fc->nb_streams < 1)
5735 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
5737 if (atom.
size < 5) {
5756 for (
i = 0;
i < 3;
i++) {
5775 const int mapping[3] = {1, 2, 0};
5776 const int chroma_den = 50000;
5777 const int luma_den = 10000;
5780 if (
c->fc->nb_streams < 1)
5783 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
5794 for (
i = 0;
i < 3;
i++) {
5795 const int j = mapping[
i];
5816 if (
c->fc->nb_streams < 1)
5819 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
5821 if (atom.
size < 5) {
5852 if (
c->fc->nb_streams < 1)
5855 sc =
c->fc->streams[
c->fc->nb_streams - 1]->priv_data;
5857 if (atom.
size < 4) {
5884 if (
c->fc->nb_streams < 1)
5887 st =
c->fc->streams[
c->fc->nb_streams - 1];
5890 if (atom.
size < 5) {
5930 uint32_t l = 0, t = 0,
r = 0,
b = 0;
5931 uint32_t
tag, padding = 0;
5934 if (
c->fc->nb_streams < 1)
5937 st =
c->fc->streams[
c->fc->nb_streams - 1];
5940 if (atom.
size < 8) {
5946 if (size <= 12 || size > atom.
size)
5950 if (
tag !=
MKTAG(
's',
'v',
'h',
'd')) {
5968 if (
tag !=
MKTAG(
'p',
'r',
'o',
'j')) {
5978 if (
tag !=
MKTAG(
'p',
'r',
'h',
'd')) {
6008 case MKTAG(
'c',
'b',
'm',
'p'):
6012 "Unsupported cubemap layout %d\n",
layout);
6018 case MKTAG(
'e',
'q',
'u',
'i'):
6024 if (
b >= UINT_MAX - t ||
r >= UINT_MAX - l) {
6026 "Invalid bounding rectangle coordinates "
6027 "%"PRIu32
",%"PRIu32
",%"PRIu32
",%"PRIu32
"\n", l, t,
r,
b);
6031 if (l || t ||
r ||
b)
6130 static const AVUUID uuid_isml_manifest = {
6131 0xa5, 0xd4, 0x0b, 0x30, 0xe8, 0x14, 0x11, 0xdd,
6132 0xba, 0x2f, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66
6134 static const AVUUID uuid_xmp = {
6135 0xbe, 0x7a, 0xcf, 0xcb, 0x97, 0xa9, 0x42, 0xe8,
6136 0x9c, 0x71, 0x99, 0x94, 0x91, 0xe3, 0xaf, 0xac
6138 static const AVUUID uuid_spherical = {
6139 0xff, 0xcc, 0x82, 0x63, 0xf8, 0x55, 0x4a, 0x93,
6140 0x88, 0x14, 0x58, 0x7a, 0x02, 0x52, 0x1f, 0xdd,
6146 if (
c->fc->nb_streams < 1)
6148 st =
c->fc->streams[
c->fc->nb_streams - 1];
6176 while ((ptr =
av_stristr(ptr,
"systemBitrate=\""))) {
6177 ptr +=
sizeof(
"systemBitrate=\"") - 1;
6178 c->bitrates_count++;
6179 c->bitrates =
av_realloc_f(
c->bitrates,
c->bitrates_count,
sizeof(*
c->bitrates));
6181 c->bitrates_count = 0;
6186 ret = strtol(ptr, &endptr, 10);
6187 if (
ret < 0 || errno || *endptr !=
'"') {
6188 c->bitrates[
c->bitrates_count - 1] = 0;
6190 c->bitrates[
c->bitrates_count - 1] =
ret;
6198 if (
c->export_xmp) {
6232 uint8_t content[16];
6243 && !memcmp(content,
"Anevia\x1A\x1A", 8)
6258 if (
c->fc->nb_streams < 1)
6260 st =
c->fc->streams[
c->fc->nb_streams - 1];
6265 case MKTAG(
'e',
'n',
'c',
'v'):
6266 case MKTAG(
'e',
'n',
'c',
'a'):
6271 "ignoring 'frma' atom of '%.4s', stream has codec id %d\n",
6283 "ignoring 'frma' atom of '%.4s', stream format is '%.4s'\n",
6305 if (frag_stream_info) {
6306 for (
i = 0;
i <
c->fc->nb_streams;
i++) {
6307 if (
c->fc->streams[
i]->id == frag_stream_info->
id) {
6308 st =
c->fc->streams[
i];
6312 if (
i ==
c->fc->nb_streams)
6318 if (!(*sc)->cenc.default_encrypted_sample)
6329 if (
c->fc->nb_streams < 1)
6331 st =
c->fc->streams[
c->fc->nb_streams - 1];
6334 if (!(*sc)->cenc.encryption_index) {
6336 if (!(*sc)->cenc.default_encrypted_sample)
6339 if (!(*sc)->cenc.encryption_index)
6343 *encryption_index = (*sc)->cenc.encryption_index;
6351 unsigned int subsample_count;
6372 if (use_subsamples) {
6374 av_free((*sample)->subsamples);
6375 (*sample)->subsamples =
av_calloc(subsample_count,
sizeof(*subsamples));
6376 if (!(*sample)->subsamples) {
6383 (*sample)->subsamples[
i].bytes_of_clear_data =
avio_rb16(pb);
6384 (*sample)->subsamples[
i].bytes_of_protected_data =
avio_rb32(pb);
6393 (*sample)->subsample_count = subsample_count;
6404 int use_subsamples,
ret;
6405 unsigned int sample_count,
i, alloc_size = 0;
6421 if (sample_count >= INT_MAX /
sizeof(*encrypted_samples))
6424 for (
i = 0;
i < sample_count;
i++) {
6425 unsigned int min_samples =
FFMIN(
FFMAX(
i + 1, 1024 * 1024), sample_count);
6427 min_samples *
sizeof(*encrypted_samples));
6428 if (encrypted_samples) {
6459 size_t sample_count, sample_info_size,
i;
6461 unsigned int alloc_size = 0;
6470 if (sample_count >= INT_MAX /
sizeof(*encrypted_samples))
6476 av_log(
c->fc,
AV_LOG_INFO,
"Failed to seek for auxiliary info, will only parse senc atoms for encryption info\n");
6481 unsigned int min_samples =
FFMIN(
FFMAX(
i + 1, 1024 * 1024), sample_count);
6483 min_samples *
sizeof(*encrypted_samples));
6484 if (!encrypted_samples) {
6509 for (;
i > 0;
i--) {
6524 const unsigned int block_size = 1024 * 1024;
6526 unsigned int alloc_size = 0,
offset = 0;
6528 unsigned int new_size =
6529 alloc_size >= INT_MAX - block_size ? INT_MAX : alloc_size + block_size;
6554 unsigned int sample_count, aux_info_type, aux_info_param;
6580 if (aux_info_param != 0) {
6586 if ((aux_info_type ==
MKBETAG(
'c',
'e',
'n',
'c') ||
6587 aux_info_type ==
MKBETAG(
'c',
'e',
'n',
's') ||
6588 aux_info_type ==
MKBETAG(
'c',
'b',
'c',
'1') ||
6589 aux_info_type ==
MKBETAG(
'c',
'b',
'c',
's')) &&
6590 aux_info_param == 0) {
6623 uint64_t *auxiliary_offsets;
6627 unsigned int version, entry_count, aux_info_type, aux_info_param;
6628 unsigned int alloc_size = 0;
6654 if (aux_info_param != 0) {
6660 if ((aux_info_type ==
MKBETAG(
'c',
'e',
'n',
'c') ||
6661 aux_info_type ==
MKBETAG(
'c',
'e',
'n',
's') ||
6662 aux_info_type ==
MKBETAG(
'c',
'b',
'c',
'1') ||
6663 aux_info_type ==
MKBETAG(
'c',
'b',
'c',
's')) &&
6664 aux_info_param == 0) {
6677 if (entry_count >= INT_MAX /
sizeof(*auxiliary_offsets))
6681 unsigned int min_offsets =
FFMIN(
FFMAX(
i + 1, 1024), entry_count);
6684 min_offsets *
sizeof(*auxiliary_offsets));
6685 if (!auxiliary_offsets) {
6696 if (
c->frag_index.current >= 0) {
6721 uint8_t *side_data, *extra_data, *old_side_data;
6722 size_t side_data_size, old_side_data_size;
6724 unsigned int version, kid_count, extra_data_size, alloc_size = 0;
6726 if (
c->fc->nb_streams < 1)
6728 st =
c->fc->streams[
c->fc->nb_streams-1];
6745 if (kid_count >= INT_MAX /
sizeof(*key_ids)) {
6750 for (
unsigned int i = 0;
i < kid_count && !pb->
eof_reached;
i++) {
6751 unsigned int min_kid_count =
FFMIN(
FFMAX(
i + 1, 1024), kid_count);
6753 min_kid_count *
sizeof(*key_ids));
6758 info->key_ids = key_ids;
6761 if (!
info->key_ids[
i]) {
6765 info->num_key_ids =
i + 1;
6786 info->data = extra_data;
6787 info->data_size = extra_data_size;
6791 if (old_side_data) {
6793 if (old_init_info) {
6801 info = old_init_info;
6815 side_data, side_data_size);
6829 if (
c->fc->nb_streams < 1)
6831 st =
c->fc->streams[
c->fc->nb_streams-1];
6835 av_log(
c->fc,
AV_LOG_ERROR,
"schm boxes are only supported in first sample descriptor\n");
6859 unsigned int version, pattern, is_protected, iv_size;
6861 if (
c->fc->nb_streams < 1)
6863 st =
c->fc->streams[
c->fc->nb_streams-1];
6912 if (iv_size != 8 && iv_size != 16) {
6932 if (
c->fc->nb_streams < 1)
6934 st =
c->fc->streams[
c->fc->nb_streams-1];
6936 if ((uint64_t)atom.
size > (1<<30) || atom.
size < 42)
6945 if (
avio_read(pb, buf,
sizeof(buf)) !=
sizeof(buf)) {
6969 int bytes_of_protected_data;
6986 if (!
sample->subsample_count) {
6992 for (
i = 0;
i <
sample->subsample_count;
i++) {
6993 if (
sample->subsamples[
i].bytes_of_clear_data +
sample->subsamples[
i].bytes_of_protected_data >
size) {
7000 size -=
sample->subsamples[
i].bytes_of_clear_data;
7004 bytes_of_protected_data =
sample->subsamples[
i].bytes_of_protected_data;
7007 input += bytes_of_protected_data;
7008 size -= bytes_of_protected_data;
7022 int num_of_encrypted_blocks;
7038 memcpy(iv,
sample->iv, 16);
7041 if (!
sample->subsample_count) {
7047 for (
i = 0;
i <
sample->subsample_count;
i++) {
7048 if (
sample->subsamples[
i].bytes_of_clear_data +
sample->subsamples[
i].bytes_of_protected_data >
size) {
7053 if (
sample->subsamples[
i].bytes_of_protected_data % 16) {
7060 size -=
sample->subsamples[
i].bytes_of_clear_data;
7063 num_of_encrypted_blocks =
sample->subsamples[
i].bytes_of_protected_data/16;
7064 if (num_of_encrypted_blocks > 0) {
7067 input +=
sample->subsamples[
i].bytes_of_protected_data;
7068 size -=
sample->subsamples[
i].bytes_of_protected_data;
7081 int i,
ret, rem_bytes;
7100 if (!
sample->subsample_count) {
7104 }
else if (!
sample->crypt_byte_block && !
sample->skip_byte_block) {
7109 for (
i = 0;
i <
sample->subsample_count;
i++) {
7110 if (
sample->subsamples[
i].bytes_of_clear_data +
sample->subsamples[
i].bytes_of_protected_data >
size) {
7117 size -=
sample->subsamples[
i].bytes_of_clear_data;
7121 rem_bytes =
sample->subsamples[
i].bytes_of_protected_data;
7122 while (rem_bytes > 0) {
7123 if (rem_bytes < 16*sample->crypt_byte_block) {
7128 rem_bytes -= 16*
sample->crypt_byte_block;
7130 rem_bytes -=
FFMIN(16*
sample->skip_byte_block, rem_bytes);
7132 input +=
sample->subsamples[
i].bytes_of_protected_data;
7133 size -=
sample->subsamples[
i].bytes_of_protected_data;
7146 int i,
ret, rem_bytes;
7164 if (!
sample->subsample_count) {
7166 memcpy(iv,
sample->iv, 16);
7169 }
else if (!
sample->crypt_byte_block && !
sample->skip_byte_block) {
7174 for (
i = 0;
i <
sample->subsample_count;
i++) {
7175 if (
sample->subsamples[
i].bytes_of_clear_data +
sample->subsamples[
i].bytes_of_protected_data >
size) {
7182 size -=
sample->subsamples[
i].bytes_of_clear_data;
7185 memcpy(iv,
sample->iv, 16);
7187 rem_bytes =
sample->subsamples[
i].bytes_of_protected_data;
7188 while (rem_bytes > 0) {
7189 if (rem_bytes < 16*sample->crypt_byte_block) {
7194 rem_bytes -= 16*
sample->crypt_byte_block;
7196 rem_bytes -=
FFMIN(16*
sample->skip_byte_block, rem_bytes);
7198 input +=
sample->subsamples[
i].bytes_of_protected_data;
7199 size -=
sample->subsamples[
i].bytes_of_protected_data;
7228 int current = frag_index->
current;
7234 if (current >= 0 && current < frag_index->nb_items) {
7236 (current + 1 == frag_index->
nb_items ||
7247 frag_index->
current = current;
7256 int encrypted_index,
ret;
7259 encrypted_index = current_index;
7260 encryption_index =
NULL;
7261 if (frag_stream_info) {
7263 if (frag_stream_info->
stsd_id == 1) {
7265 encrypted_index = current_index - frag_stream_info->
index_base;
7275 if (encryption_index) {
7290 }
else if (encrypted_index >= 0 && encrypted_index < encryption_index->nb_encrypted_samples) {
7323 if (
c->fc->nb_streams < 1)
7325 st =
c->fc->streams[
c->fc->nb_streams-1];
7327 if ((uint64_t)atom.
size > (1<<30) || atom.
size < 11)
7367 unsigned format_info;
7368 int channel_assignment, channel_assignment1, channel_assignment2;
7372 if (
c->fc->nb_streams < 1)
7374 st =
c->fc->streams[
c->fc->nb_streams-1];
7381 ratebits = (format_info >> 28) & 0xF;
7382 channel_assignment1 = (format_info >> 15) & 0x1F;
7383 channel_assignment2 = format_info & 0x1FFF;
7384 if (channel_assignment2)
7385 channel_assignment = channel_assignment2;
7387 channel_assignment = channel_assignment1;
7404 int64_t read_size = atom.
size;
7406 if (
c->fc->nb_streams < 1)
7408 st =
c->fc->streams[
c->fc->nb_streams-1];
7423 AVBPrint scheme_buf, value_buf;
7424 int64_t scheme_str_len = 0, value_str_len = 0;
7432 if (
c->fc->nb_streams < 1)
7434 st =
c->fc->streams[
c->fc->nb_streams-1];
7442 "Unsupported 'kind' box with version %d, flags: %x",
7452 ret = scheme_str_len;
7456 if (scheme_str_len + 1 >=
size) {
7464 size -= scheme_str_len + 1;
7468 ret = value_str_len;
7472 if (value_str_len ==
size) {
7479 "%s stream %d KindBox(scheme: %s, value: %s)\n",
7482 scheme_buf.str, value_buf.str);
7489 for (
int j = 0;
map.value_maps[j].disposition; j++) {
7514 if (
c->fc->nb_streams < 1)
7517 st =
c->fc->streams[
c->fc->nb_streams - 1];
7519 if (atom.
size < 16) {
7533 "Unsupported ambisonic type %d\n",
type);
7540 if (channel_order) {
7542 "Unsupported channel_order %d\n", channel_order);
7547 if (normalization) {
7549 "Unsupported normalization %d\n", normalization);
7556 "Invalid number of channels (%d / %d)\n",
7561 for (
i = 0;
i < channel_count;
i++) {
7564 "Ambisonic channel reordering is not supported\n");
7581 if (
c->fc->nb_streams < 1)
7584 st =
c->fc->streams[
c->fc->nb_streams - 1];
7586 if (atom.
size < 5) {
7628 int version, offset_size, length_size, base_offset_size, index_size;
7629 int item_count, extent_count;
7630 uint64_t base_offset, extent_offset, extent_length;
7633 if (!
c->is_still_picture_avif) {
7640 if (
c->fc->nb_streams) {
7649 offset_size = (
value >> 4) & 0xF;
7650 length_size =
value & 0xF;
7652 base_offset_size = (
value >> 4) & 0xF;
7663 c->avif_info_size = item_count;
7665 for (
int i = 0;
i < item_count;
i++) {
7669 c->avif_info[
i].item_id = item_id;
7674 if (
rb_size(pb, &base_offset, base_offset_size) < 0)
7677 if (extent_count > 1) {
7682 for (
int j = 0; j < extent_count; j++) {
7683 if (
rb_size(pb, &extent_offset, offset_size) < 0 ||
7684 rb_size(pb, &extent_length, length_size) < 0)
7686 c->avif_info[
i].extent_length = extent_length;
7687 c->avif_info[
i].extent_offset = base_offset + extent_offset;
7804 int64_t total_size = 0;
7808 if (
c->atom_depth > 10) {
7815 atom.
size = INT64_MAX;
7816 while (total_size <= atom.
size - 8) {
7822 if (((
a.type ==
MKTAG(
'f',
'r',
'e',
'e') &&
c->moov_retry) ||
7823 a.type ==
MKTAG(
'h',
'o',
'o',
'v')) &&
7835 a.type =
MKTAG(
'm',
'o',
'o',
'v');
7838 if (atom.
type !=
MKTAG(
'r',
'o',
'o',
't') &&
7840 if (
a.type ==
MKTAG(
't',
'r',
'a',
'k') ||
7841 a.type ==
MKTAG(
'm',
'd',
'a',
't')) {
7849 if (
a.size == 1 && total_size + 8 <= atom.
size) {
7856 a.size = atom.
size - total_size + 8;
7878 if (!
parse &&
c->found_hdlr_mdta &&
7880 a.type ==
MKTAG(
'k',
'e',
'y',
's') &&
7881 c->meta_keys_count == 0) {
7895 if (
c->found_moov &&
c->found_mdat &&
a.size <= INT64_MAX - start_pos &&
7899 c->next_root_atom = start_pos +
a.size;
7906 else if (
left < 0) {
7908 "overread end of atom '%s' by %"PRId64
" bytes\n",
7914 total_size +=
a.size;
7917 if (total_size < atom.
size && atom.
size < 0x7ffff)
7929 int moov_offset = -1;
7943 }
else if (
size == 0) {
7946 if (
size < minsize) {
7953 case MKTAG(
'm',
'o',
'o',
'v'):
7954 moov_offset =
offset + 4;
7955 case MKTAG(
'm',
'd',
'a',
't'):
7956 case MKTAG(
'p',
'n',
'o',
't'):
7957 case MKTAG(
'u',
'd',
't',
'a'):
7958 case MKTAG(
'f',
't',
'y',
'p'):
7959 if (
tag ==
MKTAG(
'f',
't',
'y',
'p') &&
7964 score =
FFMAX(score, 5);
7970 case MKTAG(
'e',
'd',
'i',
'w'):
7971 case MKTAG(
'w',
'i',
'd',
'e'):
7972 case MKTAG(
'f',
'r',
'e',
'e'):
7973 case MKTAG(
'j',
'u',
'n',
'k'):
7974 case MKTAG(
'p',
'i',
'c',
't'):
7977 case MKTAG(0x82,0x82,0x7f,0x7d):
7978 case MKTAG(
's',
'k',
'i',
'p'):
7979 case MKTAG(
'u',
'u',
'i',
'd'):
7980 case MKTAG(
'p',
'r',
'f',
'l'):
8028 for (
i = 0;
i <
s->nb_streams;
i++)
8029 if (
s->streams[
i]->id == chapter_track) {
8066 if (end < sample->timestamp) {
8080 title_len = 2*
len + 1;
8093 else if (ch == 0xfffe)
8097 if (
len == 1 ||
len == 2)
8133 int hh, mm,
ss, ff, drop;
8146 hh, mm,
ss, drop ?
';' :
':', ff);
8162 int rounded_tc_rate;
8167 if (!tc_rate.
num || !tc_rate.
den || !tmcd_nb_frames)
8186 rounded_tc_rate = (tc_rate.
num + tc_rate.
den / 2) / tc_rate.
den;
8189 if (tmcd_nb_frames == tc_rate.
num / tc_rate.
den &&
8191 tmcd_nb_frames = rounded_tc_rate;
8203 for (
i = 0;
i < (*index)->nb_encrypted_samples;
i++) {
8206 av_freep(&(*index)->encrypted_samples);
8207 av_freep(&(*index)->auxiliary_info_sizes);
8208 av_freep(&(*index)->auxiliary_offsets);
8217 for (
i = 0;
i <
s->nb_streams;
i++) {
8303 for (
i = 0;
i <
s->nb_streams;
i++) {
8319 for (
i = 0;
i <
s->nb_streams;
i++) {
8338 unsigned track_id, item_count;
8350 for (
i = 0;
i < item_count;
i++) {
8372 if (frag_stream_info &&
8376 for (j = 0; j < ((fieldlength >> 4) & 3) + 1; j++)
8378 for (j = 0; j < ((fieldlength >> 2) & 3) + 1; j++)
8380 for (j = 0; j < ((fieldlength >> 0) & 3) + 1; j++)
8394 if ((seek_ret =
avio_seek(
f, stream_size - 4, SEEK_SET)) < 0) {
8399 c->have_read_mfra_size = 1;
8400 if (!
c->mfra_size ||
c->mfra_size > stream_size) {
8404 if ((seek_ret =
avio_seek(
f, -((int64_t)
c->mfra_size), SEEK_CUR)) < 0) {
8423 c->frag_index.complete = 1;
8425 seek_ret =
avio_seek(
f, original_pos, SEEK_SET);
8428 "failed to seek back after looking for mfra\n");
8454 atom.
size = INT64_MAX;
8474 for (
i = 0;
i <
s->nb_streams;
i++)
8475 if (
s->streams[
i]->codecpar->codec_tag ==
AV_RL32(
"tmcd")) {
8477 }
else if (
s->streams[
i]->codecpar->codec_tag ==
AV_RL32(
"rtmd")) {
8483 for (
i = 0;
i <
s->nb_streams;
i++) {
8488 int tmcd_st_id = -1;
8490 for (j = 0; j <
s->nb_streams; j++)
8494 if (tmcd_st_id < 0 || tmcd_st_id ==
i)
8503 for (
i = 0;
i <
s->nb_streams;
i++) {
8534 for (
i = 0;
i <
s->nb_streams;
i++) {
8552 for (
i = 0;
i <
s->nb_streams;
i++) {
8571 s->streams[
i]->codecpar->bit_rate = mov->
bitrates[
i];
8577 for (
i = 0;
i <
s->nb_streams;
i++) {
8625 (uint8_t *)sc->
coll,
8647 int64_t best_dts = INT64_MAX;
8649 for (
i = 0;
i <
s->nb_streams;
i++) {
8683 if (
index >= 0 && index < mov->frag_index.nb_items)
8685 if (
avio_seek(
s->pb, target, SEEK_SET) != target) {
8693 if (index < mov->frag_index.nb_items &&
8716 uint8_t *side, *extradata;
8725 if (extradata_size > 0 && extradata) {
8731 memcpy(side, extradata, extradata_size);
8743 new_size = ((
size - 8) / 2) * 3;
8749 for (
int j = 0; j < new_size; j += 3) {
8764 int64_t current_index;
8788 if (ret64 !=
sample->pos) {
8793 }
else if (ret64 < 0) {
8814 #if CONFIG_DV_DEMUXER
8860 if (next_dts >=
pkt->
dts)
8868 uint8_t sample_is_depended_on = (sample_flags >> 2) & 0x3;
8944 int64_t key_sample_dts, key_sample_pts;
8984 if (sample < 0 && sti->nb_index_entries && timestamp < sti->index_entries[0].timestamp)
9053 if (stream_index >=
s->nb_streams)
9056 st =
s->streams[stream_index];
9062 if (
mc->seek_individually) {
9067 for (
i = 0;
i <
s->nb_streams;
i++) {
9072 if (stream_index ==
i)
9081 for (
i = 0;
i <
s->nb_streams;
i++) {
9101 #define OFFSET(x) offsetof(MOVContext, x)
9102 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
9104 {
"use_absolute_path",
9105 "allow using absolute path when opening alias, this is a possible security issue",
9108 {
"seek_streams_individually",
9109 "Seek each stream individually to the closest point",
9114 {
"advanced_editlist",
9115 "Modify the AVIndex according to the editlists. Use this option to decode in the order specified by the edits.",
9121 "use mfra for fragment timestamps",
9126 FLAGS,
"use_mfra_for" },
9128 FLAGS,
"use_mfra_for" },
9130 FLAGS,
"use_mfra_for" },
9133 {
"export_all",
"Export unrecognized metadata entries",
OFFSET(export_all),
9135 {
"export_xmp",
"Export full XMP metadata",
OFFSET(export_xmp),
9137 {
"activation_bytes",
"Secret bytes for Audible AAX files",
OFFSET(activation_bytes),
9139 {
"audible_key",
"AES-128 Key for Audible AAXC files",
OFFSET(audible_key),
9141 {
"audible_iv",
"AES-128 IV for Audible AAXC files",
OFFSET(audible_iv),
9143 {
"audible_fixed_key",
9144 "Fixed key used for handling Audible AAX files",
OFFSET(audible_fixed_key),
9149 {.i64 = 0}, 0, 1,
FLAGS },
9163 .
name =
"mov,mp4,m4a,3gp,3g2,mj2",
9167 .extensions =
"mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v,avif",
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_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)
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
add frame for rfps calculation.
struct MOVContext::@285 * avif_info
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
#define MOV_TRUN_SAMPLE_FLAGS
unsigned int nb_chapter_tracks
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
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
#define MOV_TKHD_FLAG_ENABLED
enum AVMediaType codec_type
General type of the encoded data.
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_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
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)
#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)
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...
#define IS_MATRIX_IDENT(matrix)
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)
@ AV_PKT_DATA_ENCRYPTION_INFO
This side data contains encryption info for how to decrypt the packet.
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)
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)
int found_mdat
'mdat' atom has been found
uint32_t crypt_byte_block
Only used for pattern encryption.
static void mov_metadata_creation_time(AVDictionary **metadata, int64_t time, void *logctx)
static int mov_read_avid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int seek_preroll
Audio only.
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
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
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 avif_add_stream(MOVContext *c, int item_id)
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.
@ AV_PKT_DATA_ENCRYPTION_INIT_INFO
This side data is encryption initialization data.
int error
contains the error code or 0 if no error happened
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)
#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).
#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)
#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.
static int mov_read_moov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
#define FFNABS(a)
Negative Absolute value.
@ AV_PKT_DATA_SPHERICAL
This side data should be associated with a video stream and corresponds to the AVSphericalMapping str...
const AVInputFormat ff_mov_demuxer
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
static int mov_read_wide(MOVContext *c, AVIOContext *pb, MOVAtom atom)
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.
uint32_t skip_byte_block
Only used for pattern encryption.
static int aax_filter(uint8_t *input, int size, MOVContext *c)
struct MOVStreamContext::@284 cenc
@ 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
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.
@ 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)
unsigned int index_entries_allocated_size
static av_cold int read_close(AVFormatContext *ctx)
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
uint8_t * iv
The initialization vector.
@ AV_PKT_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
@ 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.
#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.
static int update_frag_index(MOVContext *c, int64_t offset)
size_t auxiliary_info_sample_count
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.
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
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
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
@ AV_PKT_DATA_AUDIO_SERVICE_TYPE
This side data should be associated with an audio stream and corresponds to enum AVAudioServiceType.
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)
#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.
@ AV_PKT_DATA_STEREO3D
This side data should be associated with a video stream and contains Stereoscopic 3D information in f...
#define MOV_TFHD_DEFAULT_DURATION
#define ALAC_EXTRADATA_SIZE
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
@ AV_PKT_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata (based on SMPTE-2086:2014).
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
FF_ENABLE_DEPRECATION_WARNINGS 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.
@ AV_PKT_DATA_ICC_PROFILE
ICC profile data consisting of an opaque octet buffer following the format described by ISO 15076-1.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static int mov_read_sidx(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
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)
static int mov_try_read_block(AVIOContext *pb, size_t size, uint8_t **data)
Tries to read the given number of bytes from the stream and puts it in a newly allocated buffer.
@ 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)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
Compute codec id for 'lpcm' tag.
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)
@ 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)
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)
int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as stream side data.
@ 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
#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)
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.
static int should_retry(AVIOContext *pb, int error_code)
int extradata_size
Size of the extradata content in bytes.
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)
#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
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.
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 av_aes_ctr_set_full_iv(struct AVAESCTR *a, const uint8_t *iv)
Forcefully change the "full" 16-byte iv, including the counter.
int ff_isom_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const uint8_t *buf_ptr, uint64_t size)
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)
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.
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.
@ AV_FIELD_TT
Top coded_first, top displayed first.
static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
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
@ AV_PKT_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
size_t auxiliary_offsets_count
int flags
A combination of AV_PKT_FLAG 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.
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)
MOVFragmentIndexItem * item
#define AV_LOG_INFO
Standard information.
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_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_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
static const uint32_t mac_to_unicode[128]
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...
@ FLAC_METADATA_TYPE_STREAMINFO
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...
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.
void ffio_init_context(FFIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
#define av_malloc_array(a, b)
int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
@ AV_STEREO3D_TOPBOTTOM
Views are on top of each other.
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
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
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
int ff_get_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int size, int big_endian)
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)
static int mov_read_svq3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
void * av_calloc(size_t nmemb, size_t size)
enum AVFieldOrder field_order
Video only.
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...
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
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].
unsigned int avio_rb16(AVIOContext *s)
enum AVStereo3DType type
How views are packed within the video.
uint8_t * av_stream_get_side_data(const AVStream *st, enum AVPacketSideDataType type, size_t *size)
Get side information from stream.
@ 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 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
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_change_extradata(MOVStreamContext *sc, AVPacket *pkt)
@ 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...
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)
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)
#define AVIO_FLAG_READ
read-only
AVSphericalMapping * av_spherical_alloc(size_t *size)
Allocate a AVSphericalVideo structure and initialize its fields to default values.
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_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)
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
#define AV_CHANNEL_LAYOUT_MONO
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.
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
@ AV_FIELD_TB
Top coded first, bottom displayed first.
static int mov_metadata_loci(MOVContext *c, AVIOContext *pb, unsigned len)
uint8_t * av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, size_t size)
Allocate new information from stream.
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
#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
#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.
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 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_mfra(MOVContext *c, AVIOContext *f)
static int mov_metadata_int8_no_padding(MOVContext *c, AVIOContext *pb, unsigned len, const char *key)
static MOVFragmentStreamInfo * get_frag_stream_info(MOVFragmentIndex *frag_index, int index, int id)
static int mov_read_kind(MOVContext *c, AVIOContext *pb, MOVAtom atom)
@ AV_FIELD_BT
Bottom coded first, top displayed first.
#define MOV_TRUN_SAMPLE_CTS
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
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)
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)