70 #define MXF_MAX_CHUNK_SIZE (32 << 20)
71 #define RUN_IN_MAX (65535+1) // S377m-2004 section 5.5 and S377-1-2009 section 6.5, the +1 is to be slightly more tolerant
183 uint8_t track_number[4];
205 #define MXF_FIELD_DOMINANCE_DEFAULT 0
206 #define MXF_FIELD_DOMINANCE_FF 1
207 #define MXF_FIELD_DOMINANCE_FL 2
338 static const uint8_t
mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 };
339 static const uint8_t
mxf_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 };
340 static const uint8_t
mxf_avid_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0e,0x04,0x03,0x01 };
341 static const uint8_t
mxf_canopus_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x0a,0x0e,0x0f,0x03,0x01 };
342 static const uint8_t
mxf_system_item_key_cp[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x03,0x01,0x04 };
343 static const uint8_t
mxf_system_item_key_gc[] = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x03,0x01,0x14 };
345 static const uint8_t
mxf_apple_coll_prefix[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x0e,0x20,0x04,0x01,0x05,0x03,0x01 };
348 static const uint8_t
mxf_crypto_source_container_ul[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x09,0x06,0x01,0x01,0x02,0x02,0x00,0x00,0x00 };
349 static const uint8_t
mxf_encrypted_triplet_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x04,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x7e,0x01,0x00 };
350 static const uint8_t
mxf_encrypted_essence_container[] = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0b,0x01,0x00 };
351 static const uint8_t
mxf_sony_mpeg4_extradata[] = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0e,0x06,0x06,0x02,0x02,0x01,0x00,0x00 };
352 static const uint8_t
mxf_ffv1_extradata[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x04,0x01,0x06,0x0c,0x01,0x00,0x00,0x00 };
353 static const uint8_t
mxf_avid_project_name[] = { 0xa5,0xfb,0x7b,0x25,0xf6,0x15,0x94,0xb9,0x62,0xfc,0x37,0x17,0x49,0x2d,0x42,0xbf };
354 static const uint8_t
mxf_jp2k_rsiz[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x01,0x00,0x00,0x00 };
355 static const uint8_t
mxf_indirect_value_utf16le[] = { 0x4c,0x00,0x02,0x10,0x01,0x00,0x00,0x00,0x00,0x06,0x0e,0x2b,0x34,0x01,0x04,0x01,0x01 };
356 static const uint8_t
mxf_indirect_value_utf16be[] = { 0x42,0x01,0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x06,0x0e,0x2b,0x34,0x01,0x04,0x01,0x01 };
357 static const uint8_t
mxf_apple_coll_max_cll[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x0e,0x20,0x04,0x01,0x05,0x03,0x01,0x01 };
358 static const uint8_t
mxf_apple_coll_max_fall[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x0e,0x20,0x04,0x01,0x05,0x03,0x01,0x02 };
360 static const uint8_t
mxf_mca_label_dictionary_id[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x01,0x03,0x07,0x01,0x01,0x00,0x00,0x00 };
361 static const uint8_t
mxf_mca_tag_symbol[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x01,0x03,0x07,0x01,0x02,0x00,0x00,0x00 };
362 static const uint8_t
mxf_mca_tag_name[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x01,0x03,0x07,0x01,0x03,0x00,0x00,0x00 };
363 static const uint8_t
mxf_group_of_soundfield_groups_link_id[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x01,0x03,0x07,0x01,0x04,0x00,0x00,0x00 };
364 static const uint8_t
mxf_mca_link_id[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x01,0x03,0x07,0x01,0x05,0x00,0x00,0x00 };
365 static const uint8_t
mxf_mca_channel_id[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x01,0x03,0x04,0x0a,0x00,0x00,0x00,0x00 };
366 static const uint8_t
mxf_soundfield_group_link_id[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0e,0x01,0x03,0x07,0x01,0x06,0x00,0x00,0x00 };
367 static const uint8_t
mxf_mca_rfc5646_spoken_language[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0d,0x03,0x01,0x01,0x02,0x03,0x15,0x00,0x00 };
369 static const uint8_t
mxf_sub_descriptor[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x09,0x06,0x01,0x01,0x04,0x06,0x10,0x00,0x00 };
379 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y)))
436 int bytes_num =
size & 0x7f;
441 *llen = bytes_num + 1;
448 if (
size > INT64_MAX)
460 else if (
b !=
key[
i])
499 if (klv->
offset > INT64_MAX - 16 - llen)
503 if (
pos > INT64_MAX - length)
511 for (
int i = 0;
i <
s->nb_streams;
i++) {
518 return s->nb_streams == 1 &&
s->streams[0]->priv_data ? 0 : -1;
547 int cdp_identifier, cdp_length, cdp_footer_id, ccdata_id, cc_count;
548 int line_num, sample_coding, sample_count;
549 int did, sdid, data_length;
555 for (
int i = 0;
i < count;
i++) {
564 length -= 6 + 8 + sample_count;
565 if (line_num != 9 && line_num != 11)
567 if (sample_coding == 7 || sample_coding == 8 || sample_coding == 9) {
579 if (did != 0x61 || sdid != 1) {
584 if (cdp_identifier != 0x9669) {
593 if (ccdata_id != 0x72) {
601 if (cdp_length - 9 - 4 < cc_count * 3) {
605 avio_skip(
s->pb, data_length - 9 - 4 - cc_count * 3);
607 if (cdp_footer_id != 0x74) {
622 const uint8_t *buf_ptr, *end_ptr;
639 uint32_t
sample = bytestream_get_le32(&buf_ptr);
641 bytestream_put_le24(&data_ptr, (
sample >> 4) & 0xffffff);
643 bytestream_put_le16(&data_ptr, (
sample >> 12) & 0xffff);
654 static const uint8_t checkv[16] = {0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b};
660 uint64_t plaintext_size;
666 if (!mxf->
aesc &&
s->key &&
s->keylen == 16) {
693 if (orig_size < plaintext_size)
697 if (
size < 32 ||
size - 32 < orig_size || (
int)orig_size != orig_size)
703 if (memcmp(tmpbuf, checkv, 16))
709 else if (
size < plaintext_size)
711 size -= plaintext_size;
727 if (item_len != 18) {
731 if (item_num > 65536 || item_num < 0) {
753 uint64_t footer_partition;
754 uint32_t nb_essence_containers;
755 uint64_t this_partition;
779 memset(partition, 0,
sizeof(*partition));
805 if (this_partition != klv_offset - mxf->
run_in) {
807 "this_partition %"PRId64
" mismatches %"PRId64
"\n",
808 this_partition, klv_offset - mxf->
run_in);
830 av_dict_set(&
s->metadata,
"operational_pattern_ul", str, 0);
833 if (this_partition &&
836 "PreviousPartition equal to ThisPartition %"PRIx64
"\n",
849 "Overriding PreviousPartition with %"PRIx64
"\n",
854 if (footer_partition) {
857 "inconsistent FooterPartition value: %"PRIu64
" != %"PRIu64
"\n",
865 "PartitionPack: ThisPartition = 0x%"PRIX64
866 ", PreviousPartition = 0x%"PRIX64
", "
867 "FooterPartition = 0x%"PRIX64
", IndexSID = %i, BodySID = %i\n",
877 "PreviousPartition points to this partition or forward\n");
881 if (
op[12] == 1 &&
op[13] == 1) mxf->
op =
OP1a;
882 else if (
op[12] == 1 &&
op[13] == 2) mxf->
op =
OP1b;
883 else if (
op[12] == 1 &&
op[13] == 3) mxf->
op =
OP1c;
884 else if (
op[12] == 2 &&
op[13] == 1) mxf->
op =
OP2a;
885 else if (
op[12] == 2 &&
op[13] == 2) mxf->
op =
OP2b;
886 else if (
op[12] == 2 &&
op[13] == 3) mxf->
op =
OP2c;
887 else if (
op[12] == 3 &&
op[13] == 1) mxf->
op =
OP3a;
888 else if (
op[12] == 3 &&
op[13] == 2) mxf->
op =
OP3b;
889 else if (
op[12] == 3 &&
op[13] == 3) mxf->
op =
OP3c;
891 else if (
op[12] == 0x10) {
896 if (nb_essence_containers != 1) {
902 "\"OPAtom\" with %"PRIu32
" ECs - assuming %s\n",
903 nb_essence_containers,
904 mxfop ==
OP1a ?
"OP1a" :
"OPAtom");
942 return (score << 60) | ((uint64_t)p->
pack_ofs >> 4);
954 for (
int i = 0;
i <
mg->metadata_sets_count;
i++) {
955 if (!memcmp((*metadata_set)->uid,
mg->metadata_sets[
i]->uid, 16)) {
956 uint64_t old_s =
mg->metadata_sets[
i]->partition_score;
957 uint64_t new_s = (*metadata_set)->partition_score;
990 if (
c > INT_MAX /
sizeof(
UID))
1002 if (
ret != *count *
sizeof(
UID)) {
1003 *count =
ret < 0 ? 0 :
ret /
sizeof(
UID);
1015 if (size < 0 || size > INT_MAX - 1)
1018 buf_size =
size + 1;
1039 if (size < 0 || size > INT_MAX/2)
1061 #define READ_STR16(type, big_endian) \
1062 static int mxf_read_utf16 ## type ##_string(AVIOContext *pb, int size, char** str) \
1064 return mxf_read_utf16_string(pb, size, str, big_endian); \
1145 mxf_read_utf16be_string(pb,
size, &track->
name);
1198 &package->tracks_count);
1202 avio_read(pb, package->package_uid, 16);
1205 avio_read(pb, package->descriptor_ref, 16);
1208 return mxf_read_utf16be_string(pb,
size, &package->name);
1211 &package->comment_count);
1238 uint32_t nb_index_entries;
1240 if (
segment->temporal_offset_entries)
1244 if (nb_index_entries > INT_MAX)
1246 segment->nb_index_entries = nb_index_entries;
1249 if(
segment->nb_index_entries && length < 11)
1260 for (
i = 0;
i <
segment->nb_index_entries;
i++) {
1294 if (
segment->index_edit_rate.num <= 0 ||
1295 segment->index_edit_rate.den <= 0)
1298 segment->index_edit_rate.den);
1327 }
while (
code != 0);
1335 int entry_count, entry_size;
1368 if (entry_size == 4) {
1369 if (entry_count > 0)
1373 if (entry_count > 1)
1456 for (
int i = 0;
i < 3;
i++) {
1486 if (!descriptor->
coll) {
1488 if (!descriptor->
coll)
1563 return mxf_read_utf16le_string(pb,
size - 17, &tagged_value->
value);
1565 return mxf_read_utf16be_string(pb,
size - 17, &tagged_value->
value);
1575 return mxf_read_utf16be_string(pb,
size, &tagged_value->
name);
1589 for (
i = 0;
i <
len;
i++) {
1590 if (
i != 7 &&
key[
i] != uid_prefix[
i])
1598 while (uls->
uid[0]) {
1612 for (
int i =
mg->metadata_sets_count - 1;
i >= 0;
i--)
1613 if (!memcmp(*strong_ref,
mg->metadata_sets[
i]->uid, 16))
1614 return mg->metadata_sets[
i];
1621 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0c,0x01,0x00 }, 14,
AV_CODEC_ID_JPEG2000,
NULL, 14,
J2KWrap },
1622 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x10,0x60,0x01 }, 14,
AV_CODEC_ID_H264,
NULL, 15 },
1623 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 }, 14,
AV_CODEC_ID_DNXHD,
NULL, 14 },
1624 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x0d,0x01,0x03,0x01,0x02,0x1e,0x01,0x00 }, 14,
AV_CODEC_ID_DNXUC,
NULL, 14 },
1625 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x12,0x01,0x00 }, 14,
AV_CODEC_ID_VC1,
NULL, 14 },
1626 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x14,0x01,0x00 }, 14,
AV_CODEC_ID_TIFF,
NULL, 14 },
1627 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x15,0x01,0x00 }, 14,
AV_CODEC_ID_DIRAC,
NULL, 14 },
1628 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x1b,0x01,0x00 }, 14,
AV_CODEC_ID_CFHD,
NULL, 14 },
1629 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x1c,0x01,0x00 }, 14,
AV_CODEC_ID_PRORES,
NULL, 14 },
1630 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, 14,
AV_CODEC_ID_MPEG2VIDEO,
NULL, 15 },
1631 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x01,0x04,0x01 }, 14,
AV_CODEC_ID_MPEG2VIDEO,
NULL, 15,
D10D11Wrap },
1632 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x0d,0x01,0x03,0x01,0x02,0x23,0x01,0x00 }, 14,
AV_CODEC_ID_FFV1,
NULL, 14 },
1633 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x02,0x41,0x01 }, 14,
AV_CODEC_ID_DVVIDEO,
NULL, 15 },
1634 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x05,0x00,0x00 }, 14,
AV_CODEC_ID_RAWVIDEO,
NULL, 15,
RawVWrap },
1635 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x0f,0x03,0x01,0x02,0x20,0x01,0x01 }, 15,
AV_CODEC_ID_HQ_HQA },
1636 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x0f,0x03,0x01,0x02,0x20,0x02,0x01 }, 15,
AV_CODEC_ID_HQX },
1637 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x15,0x00,0x04,0x02,0x10,0x00,0x01 }, 16,
AV_CODEC_ID_HEVC,
NULL, 15 },
1638 { { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0xff,0x4b,0x46,0x41,0x41,0x00,0x0d,0x4d,0x4f }, 14,
AV_CODEC_ID_RAWVIDEO },
1639 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0,
AV_CODEC_ID_NONE },
1644 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x01,0x00,0x00 }, 14,
AV_CODEC_ID_MPEG2VIDEO },
1645 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0,
AV_CODEC_ID_NONE },
1650 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x00,0x00 }, 14,
AV_CODEC_ID_H264 },
1651 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 }, 14,
AV_CODEC_ID_JPEG2000 },
1652 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0,
AV_CODEC_ID_NONE },
1657 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x01 }, 16, 1440 },
1658 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x02 }, 16, 1440 },
1659 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x03 }, 16, 1440 },
1660 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x04 }, 16, 1440 },
1661 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, 0 },
1666 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x06,0x01,0x00 }, 14,
AV_CODEC_ID_PCM_S16LE,
NULL, 14,
RawAWrap },
1667 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x04,0x40,0x01 }, 14,
AV_CODEC_ID_MP2,
NULL, 15 },
1668 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, 14,
AV_CODEC_ID_PCM_S16LE,
NULL, 13 },
1669 { { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0xff,0x4b,0x46,0x41,0x41,0x00,0x0d,0x4d,0x4F }, 14,
AV_CODEC_ID_PCM_S16LE },
1670 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x03,0x04,0x02,0x02,0x02,0x03,0x03,0x01,0x00 }, 14,
AV_CODEC_ID_AAC },
1671 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x0d,0x01,0x03,0x01,0x02,0x16,0x00,0x00 }, 14,
AV_CODEC_ID_AAC,
NULL, 14 },
1672 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x0d,0x01,0x03,0x01,0x02,0x17,0x00,0x00 }, 14,
AV_CODEC_ID_AAC,
NULL, 14 },
1673 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x0d,0x01,0x03,0x01,0x02,0x18,0x00,0x00 }, 14,
AV_CODEC_ID_AAC,
NULL, 14 },
1674 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0,
AV_CODEC_ID_NONE },
1678 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x09,0x0d,0x01,0x03,0x01,0x02,0x0d,0x00,0x00 }, 16,
AV_CODEC_ID_NONE,
"vbi_smpte_436M", 11 },
1679 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x09,0x0d,0x01,0x03,0x01,0x02,0x0e,0x00,0x00 }, 16,
AV_CODEC_ID_NONE,
"vbi_vanc_smpte_436M", 11 },
1680 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x09,0x0d,0x01,0x03,0x01,0x02,0x13,0x01,0x01 }, 16,
AV_CODEC_ID_TTML },
1681 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0,
AV_CODEC_ID_NONE },
1691 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00 },
AV_CHAN_FRONT_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1692 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x02,0x00,0x00,0x00,0x00 },
AV_CHAN_FRONT_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1693 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x03,0x00,0x00,0x00,0x00 },
AV_CHAN_FRONT_CENTER,
AV_AUDIO_SERVICE_TYPE_MAIN },
1694 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x04,0x00,0x00,0x00,0x00 },
AV_CHAN_LOW_FREQUENCY,
AV_AUDIO_SERVICE_TYPE_MAIN },
1695 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x05,0x00,0x00,0x00,0x00 },
AV_CHAN_SIDE_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1696 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x06,0x00,0x00,0x00,0x00 },
AV_CHAN_SIDE_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1697 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x07,0x00,0x00,0x00,0x00 },
AV_CHAN_SIDE_SURROUND_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1698 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x08,0x00,0x00,0x00,0x00 },
AV_CHAN_SIDE_SURROUND_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1699 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x09,0x00,0x00,0x00,0x00 },
AV_CHAN_BACK_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1700 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x0a,0x00,0x00,0x00,0x00 },
AV_CHAN_BACK_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1701 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x0b,0x00,0x00,0x00,0x00 },
AV_CHAN_FRONT_LEFT_OF_CENTER,
AV_AUDIO_SERVICE_TYPE_MAIN },
1702 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x0c,0x00,0x00,0x00,0x00 },
AV_CHAN_FRONT_RIGHT_OF_CENTER,
AV_AUDIO_SERVICE_TYPE_MAIN },
1703 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x0d,0x00,0x00,0x00,0x00 },
AV_CHAN_BACK_CENTER,
AV_AUDIO_SERVICE_TYPE_MAIN },
1704 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x0e,0x00,0x00,0x00,0x00 },
AV_CHAN_FRONT_CENTER,
AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED },
1705 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x0f,0x00,0x00,0x00,0x00 },
AV_CHAN_FRONT_CENTER,
AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED },
1706 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x20,0x03,0x00,0x00,0x00 },
AV_CHAN_STEREO_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1707 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x20,0x04,0x00,0x00,0x00 },
AV_CHAN_STEREO_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1708 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x01,0x00,0x00 },
AV_CHAN_TOP_FRONT_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1709 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x02,0x00,0x00 },
AV_CHAN_TOP_FRONT_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1710 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x03,0x00,0x00 },
AV_CHAN_TOP_FRONT_CENTER,
AV_AUDIO_SERVICE_TYPE_MAIN },
1711 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x04,0x00,0x00 },
AV_CHAN_TOP_SURROUND_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1712 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x05,0x00,0x00 },
AV_CHAN_TOP_SURROUND_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1713 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x06,0x00,0x00 },
AV_CHAN_TOP_SIDE_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1714 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x07,0x00,0x00 },
AV_CHAN_TOP_SIDE_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1715 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x08,0x00,0x00 },
AV_CHAN_TOP_BACK_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1716 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x09,0x00,0x00 },
AV_CHAN_TOP_BACK_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1717 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x0a,0x00,0x00 },
AV_CHAN_TOP_SIDE_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1718 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x0b,0x00,0x00 },
AV_CHAN_TOP_SIDE_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1719 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x0c,0x00,0x00 },
AV_CHAN_TOP_CENTER,
AV_AUDIO_SERVICE_TYPE_MAIN },
1720 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x0d,0x00,0x00 },
AV_CHAN_LOW_FREQUENCY,
AV_AUDIO_SERVICE_TYPE_MAIN },
1721 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x0e,0x00,0x00 },
AV_CHAN_LOW_FREQUENCY_2,
AV_AUDIO_SERVICE_TYPE_MAIN },
1722 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x0f,0x00,0x00 },
AV_CHAN_TOP_BACK_CENTER,
AV_AUDIO_SERVICE_TYPE_MAIN },
1723 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x10,0x00,0x00 },
AV_CHAN_BACK_CENTER,
AV_AUDIO_SERVICE_TYPE_MAIN },
1724 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x11,0x00,0x00 },
AV_CHAN_BOTTOM_FRONT_LEFT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1725 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x12,0x00,0x00 },
AV_CHAN_BOTTOM_FRONT_RIGHT,
AV_AUDIO_SERVICE_TYPE_MAIN },
1726 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0d,0x03,0x02,0x01,0x30,0x01,0x13,0x00,0x00 },
AV_CHAN_BOTTOM_FRONT_CENTER,
AV_AUDIO_SERVICE_TYPE_MAIN },
1727 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0,
AV_AUDIO_SERVICE_TYPE_NB },
1743 val = (*essence_container_ul)[
codec_ul->wrapping_indicator_pos];
1744 switch (
codec_ul->wrapping_indicator_type) {
1749 if (
val == 0x03 ||
val == 0x04)
1770 int i, j, nb_segments = 0;
1772 int last_body_sid = -1, last_index_sid = -1, last_index_start = -1;
1776 nb_segments =
mg->metadata_sets_count;
1780 if (!(unsorted_segments =
av_calloc(nb_segments,
sizeof(*unsorted_segments))) ||
1781 !(*sorted_segments =
av_calloc(nb_segments,
sizeof(**sorted_segments)))) {
1787 for (
i = nb_segments = 0;
i <
mg->metadata_sets_count;
i++) {
1789 if (
s->edit_unit_byte_count ||
s->nb_index_entries)
1790 unsorted_segments[nb_segments++] =
s;
1792 av_log(mxf->
fc,
AV_LOG_WARNING,
"IndexSID %i segment at %"PRId64
" missing EditUnitByteCount and IndexEntryArray\n",
1793 s->index_sid,
s->index_start_position);
1802 *nb_sorted_segments = 0;
1805 for (
i = 0;
i < nb_segments;
i++) {
1806 int best = -1, best_body_sid = -1, best_index_sid = -1, best_index_start = -1;
1807 uint64_t best_index_duration = 0;
1809 for (j = 0; j < nb_segments; j++) {
1817 s->body_sid > last_body_sid ||
1818 s->body_sid == last_body_sid &&
s->index_sid > last_index_sid ||
1819 s->body_sid == last_body_sid &&
s->index_sid == last_index_sid &&
s->index_start_position > last_index_start) &&
1821 s->body_sid < best_body_sid ||
1822 s->body_sid == best_body_sid &&
s->index_sid < best_index_sid ||
1823 s->body_sid == best_body_sid &&
s->index_sid == best_index_sid &&
s->index_start_position < best_index_start ||
1824 s->body_sid == best_body_sid &&
s->index_sid == best_index_sid &&
s->index_start_position == best_index_start &&
s->index_duration > best_index_duration)) {
1826 best_body_sid =
s->body_sid;
1827 best_index_sid =
s->index_sid;
1828 best_index_start =
s->index_start_position;
1829 best_index_duration =
s->index_duration;
1837 (*sorted_segments)[(*nb_sorted_segments)++] = unsorted_segments[best];
1838 last_body_sid = best_body_sid;
1839 last_index_sid = best_index_sid;
1840 last_index_start = best_index_start;
1863 m0 = m = (
a +
b) >> 1;
1865 while (m < b && mxf->partitions[m].body_sid != body_sid)
1868 if (m < b && mxf->partitions[m].body_offset <=
offset)
1880 *partition_out = last_p;
1885 "failed to find absolute offset of %"PRIX64
" in BodySID %i - partial file?\n",
1915 int64_t index_duration, index_end;
1938 if (index_duration > 0 && edit_unit <= INT64_MAX / index_table->nb_segments) {
1949 if (
s->index_start_position <= edit_unit && edit_unit < s->index_start_position +
s->index_duration) {
1953 if (
s->edit_unit_byte_count) {
1954 if (
index > INT64_MAX /
s->edit_unit_byte_count ||
1955 s->edit_unit_byte_count *
index > INT64_MAX - offset_temp)
1958 offset_temp +=
s->edit_unit_byte_count *
index;
1960 if (
s->nb_index_entries == 2 *
s->index_duration + 1)
1963 if (index < 0 || index >=
s->nb_index_entries) {
1969 offset_temp =
s->stream_offset_entries[
index];
1973 *edit_unit_out =
av_rescale_q(edit_unit, edit_rate,
s->index_edit_rate);
1976 }
else if (dir == 0) {
1979 if (edit_unit < s->index_start_position) {
1996 int8_t max_temporal_offset = -128;
2003 if (!
s->nb_index_entries) {
2008 if (
s->index_duration > INT_MAX -
index_table->nb_ptses) {
2014 if (
s->nb_index_entries !=
s->index_duration &&
2015 s->nb_index_entries !=
s->index_duration + 1 &&
2016 s->nb_index_entries !=
s->index_duration * 2 + 1) {
2018 av_log(mxf->
fc,
AV_LOG_ERROR,
"ignoring IndexSID %d, duration does not match nb_index_entries\n",
s->index_sid);
2073 int index_delta = 1;
2074 int n =
s->nb_index_entries;
2076 if (
s->nb_index_entries == 2 *
s->index_duration + 1)
2078 if (
s->nb_index_entries == index_delta *
s->index_duration + 1)
2082 for (j = 0; j < n; j += index_delta, x++) {
2083 int offset =
s->temporal_offset_entries[j] / index_delta;
2088 "x >= nb_ptses - IndexEntryCount %i < IndexDuration %"PRId64
"?\n",
2089 s->nb_index_entries,
s->index_duration);
2095 if (index < 0 || index >=
index_table->nb_ptses) {
2097 "index entry %i + TemporalOffset %i = %i, which is out of bounds\n",
2104 max_temporal_offset =
FFMAX(max_temporal_offset,
offset);
2127 int ret, nb_sorted_segments;
2131 nb_sorted_segments <= 0) {
2137 for (
int i = 0;
i < nb_sorted_segments;
i++) {
2138 if (
i == 0 || sorted_segments[
i-1]->index_sid != sorted_segments[
i]->index_sid)
2140 else if (sorted_segments[
i-1]->body_sid != sorted_segments[
i]->body_sid) {
2143 goto finish_decoding_index;
2152 goto finish_decoding_index;
2156 for (
int i = 0, j = 0;
i < nb_sorted_segments;
i++) {
2157 if (
i != 0 && sorted_segments[
i-1]->index_sid != sorted_segments[
i]->index_sid) {
2173 " pointer array\n");
2175 goto finish_decoding_index;
2178 if (sorted_segments[
i]->index_start_position)
2179 av_log(mxf->
fc,
AV_LOG_WARNING,
"IndexSID %i starts at EditUnit %"PRId64
" - seeking may not work as expected\n",
2187 goto finish_decoding_index;
2208 s->offset = offset_temp;
2211 if (
s->edit_unit_byte_count && (
s->index_duration > INT64_MAX /
s->edit_unit_byte_count ||
2212 s->edit_unit_byte_count *
s->index_duration > INT64_MAX - offset_temp)) {
2214 goto finish_decoding_index;
2223 av_log(mxf->
fc,
AV_LOG_WARNING,
"IndexSID %i segment %i has zero IndexDuration and there's more than one segment\n",
2240 finish_decoding_index:
2246 static const uint8_t st_422_essence_container_ul[] = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0c };
2248 return essence_container_ul &&
mxf_match_uid(*essence_container_ul, st_422_essence_container_ul,
2249 sizeof(st_422_essence_container_ul));
2261 char str[2 +
sizeof(
UID) * 4 + 1])
2269 uint16_t patch, uint16_t release,
char **str)
2271 *str =
av_asprintf(
"%d.%d.%d.%d.%d", major, minor, tertiary, patch, release);
2279 char str[2 + 4 *
sizeof(
UID) + 1];
2317 package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], SourcePackage);
2321 if (!memcmp(package->package_ul, package_ul, 16) && !memcmp(package->package_uid, package_uid, 16))
2338 if (!file_descriptor) {
2343 return file_descriptor;
2427 if (physical_package->
name && physical_package->
name[0])
2447 "Invalid edit rate (%d/%d) found on structural"
2448 " component #%d, defaulting to 25/1\n",
2549 if (rfc5646 && strlen(rfc5646) > 1) {
2550 char primary_tag[4] =
2551 {rfc5646[0], rfc5646[1], rfc5646[2] !=
'-' ? rfc5646[2] :
'\0',
'\0'};
2564 for (
int k = 0; k <
mg->metadata_sets_count; k++) {
2576 if (ffv1_sub_descriptor ==
NULL)
2591 int ambigous_language = 0;
2593 int ambigous_service_type = 0;
2597 char *channel_language;
2613 if (target_channel == 0 && descriptor->
channels == 1)
2615 if (target_channel <= 0 || target_channel > descriptor->
channels) {
2616 av_log(mxf->
fc,
AV_LOG_ERROR,
"AudioChannelLabelSubDescriptor has invalid MCA channel ID %d\n", target_channel);
2619 ch_layout->
u.
map[target_channel - 1].
id = channel_ordering->channel;
2621 service_type = channel_ordering->service_type;
2622 else if (service_type != channel_ordering->service_type)
2623 ambigous_service_type = 1;
2628 channel_language = label->
language;
2629 if (!channel_language) {
2632 channel_language = group->
language;
2637 channel_language = supergroup->
language;
2641 if (channel_language) {
2643 ambigous_language = 1;
2649 if (
language && !ambigous_language) {
2664 *ast = service_type;
2682 if (material_package)
break;
2684 if (!material_package) {
2690 if (material_package->
name && material_package->
name[0])
2702 UID *essence_container_ul =
NULL;
2753 if (!source_package) {
2764 source_track = temp_track;
2768 if (!source_track) {
2787 if(source_track && component)
2790 if (!source_track || !component || !source_package) {
2834 "Invalid edit rate (%d/%d) found on stream #%d, "
2835 "defaulting to 25/1\n",
2865 if (
mg->metadata_sets_count) {
2867 essence_container_ul = &((
MXFCryptoContext *)metadata)->source_container_ul;
2881 for (k = 0; k < 16; k++) {
2884 if (!(k+1 & 19) || k == 5)
2890 if (source_package->
name && source_package->
name[0])
2892 if (material_track->
name && material_track->
name[0])
2940 "Field dominance %d support",
2954 "Field dominance %d support",
2967 switch ((*essence_container_ul)[14]) {
3038 if (descriptor->
coll) {
3059 "found for stream #%d, time base forced to 1/48000\n",
3147 "with different wrapping\n",
i, j, track1->
body_sid);
3160 struct tm time = { 0 };
3162 time.tm_year = (timestamp >> 48) - 1900;
3163 time.tm_mon = (timestamp >> 40 & 0xFF) - 1;
3164 time.tm_mday = (timestamp >> 32 & 0xFF);
3165 time.tm_hour = (timestamp >> 24 & 0xFF);
3166 time.tm_min = (timestamp >> 16 & 0xFF);
3167 time.tm_sec = (timestamp >> 8 & 0xFF);
3168 msecs = (timestamp & 0xFF) * 4;
3171 time.tm_mon =
av_clip(time.tm_mon, 0, 11);
3172 time.tm_mday =
av_clip(time.tm_mday, 1, 31);
3173 time.tm_hour =
av_clip(time.tm_hour, 0, 23);
3174 time.tm_min =
av_clip(time.tm_min, 0, 59);
3175 time.tm_sec =
av_clip(time.tm_sec, 0, 59);
3176 msecs =
av_clip(msecs, 0, 999);
3181 #define SET_STR_METADATA(pb, name, str) do { \
3182 if ((ret = mxf_read_utf16be_string(pb, size, &str)) < 0) \
3184 av_dict_set(&s->metadata, name, str, AV_DICT_DONT_STRDUP_VAL); \
3187 #define SET_VERSION_METADATA(pb, name, major, minor, tertiary, patch, release, str) do { \
3188 major = avio_rb16(pb); \
3189 minor = avio_rb16(pb); \
3190 tertiary = avio_rb16(pb); \
3191 patch = avio_rb16(pb); \
3192 release = avio_rb16(pb); \
3193 if ((ret = mxf_version_to_str(major, minor, tertiary, patch, release, &str)) < 0) \
3195 av_dict_set(&s->metadata, name, str, AV_DICT_DONT_STRDUP_VAL); \
3198 #define SET_UID_METADATA(pb, name, var, str) do { \
3199 char uuid_str[2 * AV_UUID_LEN + 4 + 1]; \
3200 avio_read(pb, var, 16); \
3201 av_uuid_unparse(uid, uuid_str); \
3202 av_dict_set(&s->metadata, name, uuid_str, 0); \
3205 #define SET_TS_METADATA(pb, name, var, str) do { \
3206 var = avio_rb64(pb); \
3207 if (var && (ret = avpriv_dict_set_timestamp(&s->metadata, name, mxf_timestamp_to_int64(var))) < 0) \
3219 uint16_t major, minor, tertiary, patch, release;
3269 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x05,0x01,0x00 },
mxf_read_primer_pack },
3270 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x01,0x00 },
mxf_read_partition_pack },
3271 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x02,0x00 },
mxf_read_partition_pack },
3272 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x03,0x00 },
mxf_read_partition_pack },
3273 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x04,0x00 },
mxf_read_partition_pack },
3274 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x01,0x00 },
mxf_read_partition_pack },
3275 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x02,0x00 },
mxf_read_partition_pack },
3276 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x03,0x00 },
mxf_read_partition_pack },
3277 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x04,0x00 },
mxf_read_partition_pack },
3278 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x02,0x00 },
mxf_read_partition_pack },
3279 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x04,0x00 },
mxf_read_partition_pack },
3280 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x2f,0x00 },
mxf_read_preface_metadata },
3281 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x30,0x00 },
mxf_read_identification_metadata },
3282 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 },
mxf_read_content_storage },
3283 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 },
mxf_read_package,
sizeof(
MXFPackage),
SourcePackage },
3284 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 },
mxf_read_package,
sizeof(
MXFPackage),
MaterialPackage },
3285 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0f,0x00 },
mxf_read_sequence,
sizeof(
MXFSequence),
Sequence },
3286 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x05,0x00 },
mxf_read_essence_group,
sizeof(
MXFEssenceGroup),
EssenceGroup},
3287 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 },
mxf_read_source_clip,
sizeof(
MXFStructuralComponent),
SourceClip },
3288 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3f,0x00 },
mxf_read_tagged_value,
sizeof(
MXFTaggedValue),
TaggedValue },
3289 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
MultipleDescriptor },
3290 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x42,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
Descriptor },
3291 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
Descriptor },
3292 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
Descriptor },
3293 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
Descriptor },
3294 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
Descriptor },
3295 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
Descriptor },
3296 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x5b,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
Descriptor },
3297 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x5c,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
Descriptor },
3298 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x5e,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
Descriptor },
3299 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x64,0x00 },
mxf_read_generic_descriptor,
sizeof(
MXFDescriptor),
Descriptor },
3300 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x6b,0x00 },
mxf_read_mca_sub_descriptor,
sizeof(
MXFMCASubDescriptor),
AudioChannelLabelSubDescriptor },
3301 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x6c,0x00 },
mxf_read_mca_sub_descriptor,
sizeof(
MXFMCASubDescriptor),
SoundfieldGroupLabelSubDescriptor },
3302 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x6d,0x00 },
mxf_read_mca_sub_descriptor,
sizeof(
MXFMCASubDescriptor),
GroupOfSoundfieldGroupsLabelSubDescriptor },
3303 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x81,0x03 },
mxf_read_ffv1_sub_descriptor,
sizeof(
MXFFFV1SubDescriptor),
FFV1SubDescriptor },
3304 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 },
mxf_read_track,
sizeof(
MXFTrack),
Track },
3305 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 },
mxf_read_track,
sizeof(
MXFTrack),
Track },
3306 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x14,0x00 },
mxf_read_timecode_component,
sizeof(
MXFTimecodeComponent),
TimecodeComponent },
3307 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0c,0x00 },
mxf_read_pulldown_component,
sizeof(
MXFPulldownComponent),
PulldownComponent },
3308 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 },
mxf_read_cryptographic_context,
sizeof(
MXFCryptoContext),
CryptoContext },
3309 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 },
mxf_read_index_table_segment,
sizeof(
MXFIndexTableSegment),
IndexTableSegment },
3310 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x23,0x00 },
mxf_read_essence_container_data,
sizeof(
MXFEssenceContainerData),
EssenceContainerData },
3311 { { 0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x01,0x02,0x10,0x01,0x00,0x00,0x00 } },
3352 if (next < 0 || next > INT64_MAX -
size) {
3369 if (local_tag ==
tag) {
3376 if (meta &&
tag == 0x3C0A) {
3393 "local tag %#04x extends past end of local set @ %#"PRIx64
"\n",
3413 key[13] >= 2 &&
key[13] <= 4;
3425 if (klv.
key[5] == 0x53) {
3455 int64_t current_partition_ofs;
3486 if (klv.
offset >= current_partition_ofs) {
3488 PRIx64
" indirectly points to itself\n", current_partition_ofs);
3528 "failed to seek to FooterPartition @ 0x%" PRIx64
3529 " (%"PRId64
") - partial file?\n",
3552 for (
int i = 0;
i <
s->nb_streams;
i++) {
3588 if (x < mxf->partitions_count - 1)
3595 "partition %i: bad ThisPartition = %"PRIX64
"\n",
3652 int essence_partition_count = 0;
3653 int edit_unit_byte_count = 0;
3661 for (
i = 0;
i <
mg->metadata_sets_count;
i++) {
3674 essence_partition_count++;
3678 if (essence_partition_count != 1)
3688 if (edit_unit_byte_count <= 0)
3705 segment->edit_unit_byte_count = edit_unit_byte_count;
3706 segment->index_start_position = 0;
3718 int64_t file_size, max_rip_length, min_rip_length;
3734 max_rip_length = ((file_size - mxf->
run_in) / 105) * 12 + 28;
3735 max_rip_length =
FFMIN(max_rip_length, INT_MAX);
3738 min_rip_length = 16+1+24+4;
3744 if (length < min_rip_length || length > max_rip_length)
3746 avio_seek(
s->pb, file_size - length, SEEK_SET);
3822 if (!essence_offset)
3823 essence_offset = klv.
offset;
3841 if (metadata->
read) {
3857 if (!essence_offset) {
3868 for (
int i = 0;
i <
s->nb_streams;
i++)
3876 av_log(mxf->
fc,
AV_LOG_INFO,
"got %i index tables - only the first one (IndexSID %i) will be used\n",
3885 for (
int i = 0;
i <
s->nb_streams;
i++)
3903 m = (
a + (uint64_t)
b) >> 1;
3906 if (
offset < current_offset)
3928 if ((sample_rate.
num / sample_rate.
den) == 48000) {
3935 "seeking detected on stream #%d with time base (%d/%d) and "
3936 "sample rate (%d/%d), audio pts won't be accurate.\n",
3938 sample_rate.
num, sample_rate.
den);
3966 if (next_ofs > current_offset)
3981 av_log(mxf->
fc,
AV_LOG_WARNING,
"edit unit sync lost on stream %d, jumping from %"PRId64
" to %"PRId64
"\n", st->
index, edit_unit, new_edit_unit);
3993 if (!bits_per_sample)
3999 bits_per_sample <= 0 ||
4054 max_data_size = klv.
length;
4081 "error getting stream index %"PRIu32
"\n",
4097 if (next_ofs <= 0) {
4105 if ((
size = next_ofs -
pos) <= 0) {
4111 if (
size > max_data_size)
4112 size = max_data_size;
4122 if (klv.
key[12] == 0x06 && klv.
key[13] == 0x01 && klv.
key[14] == 0x10) {
4173 for (
int i = 0;
i <
s->nb_streams;
i++)
4174 s->streams[
i]->priv_data =
NULL;
4178 for (
int i = 0;
i <
mg->metadata_sets_count;
i++)
4180 mg->metadata_sets_count = 0;
4201 const uint8_t *bufp = p->
buf;
4210 for (; bufp < end;) {
4211 if (!((bufp[13] - 1) & 0xF2)){
4229 AVStream *st =
s->streams[stream_index];
4248 if (sample_time < 0)
4252 seekpos =
avio_seek(
s->pb, (
s->bit_rate * seconds) >> 3, SEEK_SET);
4265 for (
i = 0;
i <
s->nb_streams;
i++) {
4266 MXFTrack *new_source_track =
s->streams[
i]->priv_data;
4269 source_track = new_source_track;
4274 if (
i ==
s->nb_streams)
4280 sample_time =
FFMAX(sample_time, 0);
4289 sample_time < t->ptses[0] &&
4291 sample_time = t->
ptses[0];
4297 sample_time += t->
offsets[sample_time];
4313 if (seekpos < klv.next_klv - klv.length || seekpos >= klv.
next_klv) {
4325 for (
int i = 0;
i <
s->nb_streams;
i++) {
4329 int64_t track_edit_unit = sample_time;
4339 {
"eia608_extract",
"extract eia 608 captions from s436m track",