3 * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * SMPTE 336M KLV Data Encoding Protocol Using Key-Length-Value
25 * SMPTE 377M MXF File Format Specifications
26 * SMPTE 378M Operational Pattern 1a
27 * SMPTE 379M MXF Generic Container
28 * SMPTE 381M Mapping MPEG Streams into the MXF Generic Container
29 * SMPTE 382M Mapping AES3 and Broadcast Wave Audio into the MXF Generic Container
30 * SMPTE 383M Mapping DV-DIF Data to the MXF Generic Container
33 * Search for Track numbers which will identify essence element KLV packets.
34 * Search for SourcePackage which define tracks which contains Track numbers.
35 * Material Package contains tracks with reference to SourcePackage tracks.
36 * Search for Descriptors (Picture, Sound) which contains codec info and parameters.
37 * Assign Descriptors to correct Tracks.
39 * Metadata reading functions read Local Tags, get InstanceUID(0x3C0A) then add MetaDataSet to MXFContext.
40 * Metadata parsing resolves Strong References to objects.
42 * Simple demuxer, only OP1A supported and some files might not work at all.
43 * Only tracks with associated descriptors will be decoded. "Highly Desirable" SMPTE 377M D.1
48 #include "libavutil/aes.h"
49 #include "libavutil/avassert.h"
50 #include "libavutil/mathematics.h"
51 #include "libavcodec/bytestream.h"
52 #include "libavutil/intreadwrite.h"
53 #include "libavutil/parseutils.h"
54 #include "libavutil/timecode.h"
55 #include "libavutil/opt.h"
60 #define MXF_MAX_CHUNK_SIZE (32 << 20)
79 OPSONYOpt, /* FATE sample, violates the spec in places */
88 typedef struct MXFPartition {
91 MXFPartitionType type;
92 uint64_t previous_partition;
95 int64_t this_partition;
96 int64_t essence_offset; ///< absolute offset of essence
97 int64_t essence_length;
99 int64_t header_byte_count;
100 int64_t index_byte_count;
102 int64_t pack_ofs; ///< absolute offset of pack in file, including run-in
104 KLVPacket first_essence_klv;
107 typedef struct MXFCryptoContext {
109 enum MXFMetadataSetType type;
110 UID source_container_ul;
113 typedef struct MXFStructuralComponent {
115 enum MXFMetadataSetType type;
116 UID source_package_ul;
117 UID source_package_uid;
118 UID data_definition_ul;
120 int64_t start_position;
122 } MXFStructuralComponent;
124 typedef struct MXFSequence {
126 enum MXFMetadataSetType type;
127 UID data_definition_ul;
128 UID *structural_components_refs;
129 int structural_components_count;
134 typedef struct MXFTrack {
136 enum MXFMetadataSetType type;
139 struct AVRational rate;
141 } MXFTimecodeComponent;
145 enum MXFMetadataSetType type;
146 UID input_segment_ref;
147 } MXFPulldownComponent;
151 enum MXFMetadataSetType type;
152 UID *structural_components_refs;
153 int structural_components_count;
159 enum MXFMetadataSetType type;
166 enum MXFMetadataSetType type;
167 MXFSequence *sequence; /* mandatory, and only one */
171 uint8_t track_number[4];
172 AVRational edit_rate;
174 uint64_t sample_count;
175 int64_t original_duration; /* st->duration in SampleRate/EditRate units */
178 MXFWrappingScheme wrapping;
179 int edit_units_per_packet; /* how many edit units to read at a time (PCM, ClipWrapped) */
182 typedef struct MXFDescriptor {
184 enum MXFMetadataSetType type;
185 UID essence_container_ul;
186 UID essence_codec_ul;
188 AVRational sample_rate;
189 AVRational aspect_ratio;
191 int height; /* Field height, not frame height */
192 int frame_layout; /* See MXFFrameLayout enum */
193 int video_line_map[2];
194 #define MXF_FIELD_DOMINANCE_DEFAULT 0
195 #define MXF_FIELD_DOMINANCE_FF 1 /* coded first, displayed first */
196 #define MXF_FIELD_DOMINANCE_FL 2 /* coded first, displayed last */
200 int64_t duration; /* ContainerDuration optional property */
201 unsigned int component_depth;
202 unsigned int horiz_subsampling;
203 unsigned int vert_subsampling;
204 UID *sub_descriptors_refs;
205 int sub_descriptors_count;
209 enum AVPixelFormat pix_fmt;
212 typedef struct MXFIndexTableSegment {
214 enum MXFMetadataSetType type;
215 int edit_unit_byte_count;
218 AVRational index_edit_rate;
219 uint64_t index_start_position;
220 uint64_t index_duration;
221 int8_t *temporal_offset_entries;
223 uint64_t *stream_offset_entries;
224 int nb_index_entries;
225 } MXFIndexTableSegment;
227 typedef struct MXFPackage {
229 enum MXFMetadataSetType type;
234 MXFDescriptor *descriptor; /* only one */
241 typedef struct MXFEssenceContainerData {
243 enum MXFMetadataSetType type;
248 } MXFEssenceContainerData;
250 typedef struct MXFMetadataSet {
252 enum MXFMetadataSetType type;
255 /* decoded index table */
256 typedef struct MXFIndexTable {
259 int nb_ptses; /* number of PTSes or total duration of index */
260 int64_t first_dts; /* DTS = EditUnit + first_dts */
261 int64_t *ptses; /* maps EditUnit -> PTS */
263 MXFIndexTableSegment **segments; /* sorted by IndexStartPosition */
264 AVIndexEntry *fake_index; /* used for calling ff_index_search_timestamp() */
265 int8_t *offsets; /* temporal offsets for display order to stored order conversion */
268 typedef struct MXFContext {
269 const AVClass *class; /**< Class for private options. */
270 MXFPartition *partitions;
271 unsigned partitions_count;
275 UID *essence_container_data_refs;
276 int essence_container_data_count;
277 MXFMetadataSet **metadata_sets;
278 int metadata_sets_count;
282 int local_tags_count;
283 uint64_t footer_partition;
284 KLVPacket current_klv_data;
286 MXFPartition *current_partition;
287 int parsing_backward;
288 int64_t last_forward_tell;
289 int last_forward_partition;
291 MXFIndexTable *index_tables;
295 /* NOTE: klv_offset is not set (-1) for local keys */
296 typedef int MXFMetadataReadFunc(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset);
298 typedef struct MXFMetadataReadTableEntry {
300 MXFMetadataReadFunc *read;
302 enum MXFMetadataSetType type;
303 } MXFMetadataReadTableEntry;
305 static int mxf_read_close(AVFormatContext *s);
307 /* partial keys to match */
308 static const uint8_t mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 };
309 static const uint8_t mxf_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 };
310 static const uint8_t mxf_avid_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0e,0x04,0x03,0x01 };
311 static const uint8_t mxf_canopus_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x0a,0x0e,0x0f,0x03,0x01 };
312 static const uint8_t mxf_system_item_key_cp[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x03,0x01,0x04 };
313 static const uint8_t mxf_system_item_key_gc[] = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x03,0x01,0x14 };
314 static const uint8_t mxf_klv_key[] = { 0x06,0x0e,0x2b,0x34 };
315 /* complete keys to match */
316 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 };
317 static const uint8_t mxf_encrypted_triplet_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x04,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x7e,0x01,0x00 };
318 static const uint8_t mxf_encrypted_essence_container[] = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0b,0x01,0x00 };
319 static const uint8_t mxf_random_index_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x11,0x01,0x00 };
320 static const uint8_t mxf_sony_mpeg4_extradata[] = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0e,0x06,0x06,0x02,0x02,0x01,0x00,0x00 };
321 static const uint8_t mxf_avid_project_name[] = { 0xa5,0xfb,0x7b,0x25,0xf6,0x15,0x94,0xb9,0x62,0xfc,0x37,0x17,0x49,0x2d,0x42,0xbf };
322 static const uint8_t mxf_jp2k_rsiz[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x01,0x00 };
323 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 };
324 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 };
326 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y)))
328 static void mxf_free_metadataset(MXFMetadataSet **ctx, int freectx)
330 MXFIndexTableSegment *seg;
331 switch ((*ctx)->type) {
333 av_freep(&((MXFDescriptor *)*ctx)->extradata);
335 case MultipleDescriptor:
336 av_freep(&((MXFDescriptor *)*ctx)->sub_descriptors_refs);
339 av_freep(&((MXFSequence *)*ctx)->structural_components_refs);
342 av_freep(&((MXFEssenceGroup *)*ctx)->structural_components_refs);
345 case MaterialPackage:
346 av_freep(&((MXFPackage *)*ctx)->tracks_refs);
347 av_freep(&((MXFPackage *)*ctx)->name);
348 av_freep(&((MXFPackage *)*ctx)->comment_refs);
351 av_freep(&((MXFTaggedValue *)*ctx)->name);
352 av_freep(&((MXFTaggedValue *)*ctx)->value);
355 av_freep(&((MXFTrack *)*ctx)->name);
357 case IndexTableSegment:
358 seg = (MXFIndexTableSegment *)*ctx;
359 av_freep(&seg->temporal_offset_entries);
360 av_freep(&seg->flag_entries);
361 av_freep(&seg->stream_offset_entries);
369 static int64_t klv_decode_ber_length(AVIOContext *pb)
371 uint64_t size = avio_r8(pb);
372 if (size & 0x80) { /* long form */
373 int bytes_num = size & 0x7f;
374 /* SMPTE 379M 5.3.4 guarantee that bytes_num must not exceed 8 bytes */
376 return AVERROR_INVALIDDATA;
379 size = size << 8 | avio_r8(pb);
381 if (size > INT64_MAX)
382 return AVERROR_INVALIDDATA;
386 static int mxf_read_sync(AVIOContext *pb, const uint8_t *key, unsigned size)
389 for (i = 0; i < size && !avio_feof(pb); i++) {
393 else if (b != key[i])
399 static int klv_read_packet(KLVPacket *klv, AVIOContext *pb)
402 if (!mxf_read_sync(pb, mxf_klv_key, 4))
403 return AVERROR_INVALIDDATA;
404 klv->offset = avio_tell(pb) - 4;
405 memcpy(klv->key, mxf_klv_key, 4);
406 avio_read(pb, klv->key + 4, 12);
407 length = klv_decode_ber_length(pb);
410 klv->length = length;
412 if (pos > INT64_MAX - length)
413 return AVERROR_INVALIDDATA;
414 klv->next_klv = pos + length;
418 static int mxf_get_stream_index(AVFormatContext *s, KLVPacket *klv, int body_sid)
422 for (i = 0; i < s->nb_streams; i++) {
423 MXFTrack *track = s->streams[i]->priv_data;
425 if (track && (!body_sid || !track->body_sid || track->body_sid == body_sid) && !memcmp(klv->key + sizeof(mxf_essence_element_key), track->track_number, sizeof(track->track_number)))
428 /* return 0 if only one stream, for OP Atom files with 0 as track number */
429 return s->nb_streams == 1 && s->streams[0]->priv_data ? 0 : -1;
432 static int find_body_sid_by_offset(MXFContext *mxf, int64_t offset)
434 // we look for partition where the offset is placed
436 int64_t this_partition;
439 b = mxf->partitions_count;
443 this_partition = mxf->partitions[m].this_partition;
444 if (this_partition <= offset)
452 return mxf->partitions[a].body_sid;
455 static int mxf_get_eia608_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt, int64_t length)
457 int count = avio_rb16(s->pb);
458 int cdp_identifier, cdp_length, cdp_footer_id, ccdata_id, cc_count;
459 int line_num, sample_coding, sample_count;
460 int did, sdid, data_length;
464 av_log(s, AV_LOG_WARNING, "unsupported multiple ANC packets (%d) per KLV packet\n", count);
466 for (i = 0; i < count; i++) {
468 av_log(s, AV_LOG_ERROR, "error reading s436m packet %"PRId64"\n", length);
469 return AVERROR_INVALIDDATA;
471 line_num = avio_rb16(s->pb);
472 avio_r8(s->pb); // wrapping type
473 sample_coding = avio_r8(s->pb);
474 sample_count = avio_rb16(s->pb);
475 length -= 6 + 8 + sample_count;
476 if (line_num != 9 && line_num != 11)
478 if (sample_coding == 7 || sample_coding == 8 || sample_coding == 9) {
479 av_log(s, AV_LOG_WARNING, "unsupported s436m 10 bit sample coding\n");
483 return AVERROR_INVALIDDATA;
485 avio_rb32(s->pb); // array count
486 avio_rb32(s->pb); // array elem size
487 did = avio_r8(s->pb);
488 sdid = avio_r8(s->pb);
489 data_length = avio_r8(s->pb);
490 if (did != 0x61 || sdid != 1) {
491 av_log(s, AV_LOG_WARNING, "unsupported did or sdid: %x %x\n", did, sdid);
494 cdp_identifier = avio_rb16(s->pb); // cdp id
495 if (cdp_identifier != 0x9669) {
496 av_log(s, AV_LOG_ERROR, "wrong cdp identifier %x\n", cdp_identifier);
497 return AVERROR_INVALIDDATA;
499 cdp_length = avio_r8(s->pb);
500 avio_r8(s->pb); // cdp_frame_rate
501 avio_r8(s->pb); // cdp_flags
502 avio_rb16(s->pb); // cdp_hdr_sequence_cntr
503 ccdata_id = avio_r8(s->pb); // ccdata_id
504 if (ccdata_id != 0x72) {
505 av_log(s, AV_LOG_ERROR, "wrong cdp data section %x\n", ccdata_id);
506 return AVERROR_INVALIDDATA;
508 cc_count = avio_r8(s->pb) & 0x1f;
509 ret = av_get_packet(s->pb, pkt, cc_count * 3);
512 if (cdp_length - 9 - 4 < cc_count * 3) {
513 av_log(s, AV_LOG_ERROR, "wrong cdp size %d cc count %d\n", cdp_length, cc_count);
514 return AVERROR_INVALIDDATA;
516 avio_skip(s->pb, data_length - 9 - 4 - cc_count * 3);
517 cdp_footer_id = avio_r8(s->pb);
518 if (cdp_footer_id != 0x74) {
519 av_log(s, AV_LOG_ERROR, "wrong cdp footer section %x\n", cdp_footer_id);
520 return AVERROR_INVALIDDATA;
522 avio_rb16(s->pb); // cdp_ftr_sequence_cntr
523 avio_r8(s->pb); // packet_checksum
530 /* XXX: use AVBitStreamFilter */
531 static int mxf_get_d10_aes3_packet(AVIOContext *pb, AVStream *st, AVPacket *pkt, int64_t length)
533 const uint8_t *buf_ptr, *end_ptr;
537 if (length > 61444) /* worst case PAL 1920 samples 8 channels */
538 return AVERROR_INVALIDDATA;
539 length = av_get_packet(pb, pkt, length);
542 data_ptr = pkt->data;
543 end_ptr = pkt->data + length;
544 buf_ptr = pkt->data + 4; /* skip SMPTE 331M header */
545 for (; end_ptr - buf_ptr >= st->codecpar->channels * 4; ) {
546 for (i = 0; i < st->codecpar->channels; i++) {
547 uint32_t sample = bytestream_get_le32(&buf_ptr);
548 if (st->codecpar->bits_per_coded_sample == 24)
549 bytestream_put_le24(&data_ptr, (sample >> 4) & 0xffffff);
551 bytestream_put_le16(&data_ptr, (sample >> 12) & 0xffff);
553 buf_ptr += 32 - st->codecpar->channels*4; // always 8 channels stored SMPTE 331M
555 av_shrink_packet(pkt, data_ptr - pkt->data);
559 static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv)
561 static const uint8_t checkv[16] = {0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b};
562 MXFContext *mxf = s->priv_data;
563 AVIOContext *pb = s->pb;
564 int64_t end = avio_tell(pb) + klv->length;
567 uint64_t plaintext_size;
573 if (!mxf->aesc && s->key && s->keylen == 16) {
574 mxf->aesc = av_aes_alloc();
576 return AVERROR(ENOMEM);
577 av_aes_init(mxf->aesc, s->key, 128, 1);
580 size = klv_decode_ber_length(pb);
585 klv_decode_ber_length(pb);
586 plaintext_size = avio_rb64(pb);
588 klv_decode_ber_length(pb);
589 avio_read(pb, klv->key, 16);
590 if (!IS_KLV_KEY(klv, mxf_essence_element_key))
591 return AVERROR_INVALIDDATA;
593 body_sid = find_body_sid_by_offset(mxf, klv->offset);
594 index = mxf_get_stream_index(s, klv, body_sid);
596 return AVERROR_INVALIDDATA;
598 klv_decode_ber_length(pb);
599 orig_size = avio_rb64(pb);
600 if (orig_size < plaintext_size)
601 return AVERROR_INVALIDDATA;
603 size = klv_decode_ber_length(pb);
604 if (size < 32 || size - 32 < orig_size)
605 return AVERROR_INVALIDDATA;
606 avio_read(pb, ivec, 16);
607 avio_read(pb, tmpbuf, 16);
609 av_aes_crypt(mxf->aesc, tmpbuf, tmpbuf, 1, ivec, 1);
610 if (memcmp(tmpbuf, checkv, 16))
611 av_log(s, AV_LOG_ERROR, "probably incorrect decryption key\n");
613 size = av_get_packet(pb, pkt, size);
616 else if (size < plaintext_size)
617 return AVERROR_INVALIDDATA;
618 size -= plaintext_size;
620 av_aes_crypt(mxf->aesc, &pkt->data[plaintext_size],
621 &pkt->data[plaintext_size], size >> 4, ivec, 1);
622 av_shrink_packet(pkt, orig_size);
623 pkt->stream_index = index;
624 avio_skip(pb, end - avio_tell(pb));
628 static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
630 MXFContext *mxf = arg;
631 int item_num = avio_rb32(pb);
632 int item_len = avio_rb32(pb);
634 if (item_len != 18) {
635 avpriv_request_sample(pb, "Primer pack item length %d", item_len);
636 return AVERROR_PATCHWELCOME;
638 if (item_num > 65536 || item_num < 0) {
639 av_log(mxf->fc, AV_LOG_ERROR, "item_num %d is too large\n", item_num);
640 return AVERROR_INVALIDDATA;
643 av_log(mxf->fc, AV_LOG_VERBOSE, "Multiple primer packs\n");
644 av_free(mxf->local_tags);
645 mxf->local_tags_count = 0;
646 mxf->local_tags = av_calloc(item_num, item_len);
647 if (!mxf->local_tags)
648 return AVERROR(ENOMEM);
649 mxf->local_tags_count = item_num;
650 avio_read(pb, mxf->local_tags, item_num*item_len);
654 static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
656 MXFContext *mxf = arg;
657 AVFormatContext *s = mxf->fc;
658 MXFPartition *partition, *tmp_part;
660 uint64_t footer_partition;
661 uint32_t nb_essence_containers;
663 if (mxf->partitions_count >= INT_MAX / 2)
664 return AVERROR_INVALIDDATA;
666 tmp_part = av_realloc_array(mxf->partitions, mxf->partitions_count + 1, sizeof(*mxf->partitions));
668 return AVERROR(ENOMEM);
669 mxf->partitions = tmp_part;
671 if (mxf->parsing_backward) {
672 /* insert the new partition pack in the middle
673 * this makes the entries in mxf->partitions sorted by offset */
674 memmove(&mxf->partitions[mxf->last_forward_partition+1],
675 &mxf->partitions[mxf->last_forward_partition],
676 (mxf->partitions_count - mxf->last_forward_partition)*sizeof(*mxf->partitions));
677 partition = mxf->current_partition = &mxf->partitions[mxf->last_forward_partition];
679 mxf->last_forward_partition++;
680 partition = mxf->current_partition = &mxf->partitions[mxf->partitions_count];
683 memset(partition, 0, sizeof(*partition));
684 mxf->partitions_count++;
685 partition->pack_length = avio_tell(pb) - klv_offset + size;
686 partition->pack_ofs = klv_offset;
690 partition->type = Header;
693 partition->type = BodyPartition;
696 partition->type = Footer;
699 av_log(mxf->fc, AV_LOG_ERROR, "unknown partition type %i\n", uid[13]);
700 return AVERROR_INVALIDDATA;
703 /* consider both footers to be closed (there is only Footer and CompleteFooter) */
704 partition->closed = partition->type == Footer || !(uid[14] & 1);
705 partition->complete = uid[14] > 2;
707 partition->kag_size = avio_rb32(pb);
708 partition->this_partition = avio_rb64(pb);
709 partition->previous_partition = avio_rb64(pb);
710 footer_partition = avio_rb64(pb);
711 partition->header_byte_count = avio_rb64(pb);
712 partition->index_byte_count = avio_rb64(pb);
713 partition->index_sid = avio_rb32(pb);
714 partition->body_offset = avio_rb64(pb);
715 partition->body_sid = avio_rb32(pb);
716 if (avio_read(pb, op, sizeof(UID)) != sizeof(UID)) {
717 av_log(mxf->fc, AV_LOG_ERROR, "Failed reading UID\n");
718 return AVERROR_INVALIDDATA;
720 nb_essence_containers = avio_rb32(pb);
722 if (partition->type == Header) {
724 snprintf(str, sizeof(str), "%08x.%08x.%08x.%08x", AV_RB32(&op[0]), AV_RB32(&op[4]), AV_RB32(&op[8]), AV_RB32(&op[12]));
725 av_dict_set(&s->metadata, "operational_pattern", str, 0);
728 if (partition->this_partition &&
729 partition->previous_partition == partition->this_partition) {
730 av_log(mxf->fc, AV_LOG_ERROR,
731 "PreviousPartition equal to ThisPartition %"PRIx64"\n",
732 partition->previous_partition);
733 /* override with the actual previous partition offset */
734 if (!mxf->parsing_backward && mxf->last_forward_partition > 1) {
736 mxf->partitions + mxf->last_forward_partition - 2;
737 partition->previous_partition = prev->this_partition;
739 /* if no previous body partition are found point to the header
741 if (partition->previous_partition == partition->this_partition)
742 partition->previous_partition = 0;
743 av_log(mxf->fc, AV_LOG_ERROR,
744 "Overriding PreviousPartition with %"PRIx64"\n",
745 partition->previous_partition);
748 /* some files don't have FooterPartition set in every partition */
749 if (footer_partition) {
750 if (mxf->footer_partition && mxf->footer_partition != footer_partition) {
751 av_log(mxf->fc, AV_LOG_ERROR,
752 "inconsistent FooterPartition value: %"PRIu64" != %"PRIu64"\n",
753 mxf->footer_partition, footer_partition);
755 mxf->footer_partition = footer_partition;
759 av_log(mxf->fc, AV_LOG_TRACE,
760 "PartitionPack: ThisPartition = 0x%"PRIX64
761 ", PreviousPartition = 0x%"PRIX64", "
762 "FooterPartition = 0x%"PRIX64", IndexSID = %i, BodySID = %i\n",
763 partition->this_partition,
764 partition->previous_partition, footer_partition,
765 partition->index_sid, partition->body_sid);
767 /* sanity check PreviousPartition if set */
768 //NOTE: this isn't actually enough, see mxf_seek_to_previous_partition()
769 if (partition->previous_partition &&
770 mxf->run_in + partition->previous_partition >= klv_offset) {
771 av_log(mxf->fc, AV_LOG_ERROR,
772 "PreviousPartition points to this partition or forward\n");
773 return AVERROR_INVALIDDATA;
776 if (op[12] == 1 && op[13] == 1) mxf->op = OP1a;
777 else if (op[12] == 1 && op[13] == 2) mxf->op = OP1b;
778 else if (op[12] == 1 && op[13] == 3) mxf->op = OP1c;
779 else if (op[12] == 2 && op[13] == 1) mxf->op = OP2a;
780 else if (op[12] == 2 && op[13] == 2) mxf->op = OP2b;
781 else if (op[12] == 2 && op[13] == 3) mxf->op = OP2c;
782 else if (op[12] == 3 && op[13] == 1) mxf->op = OP3a;
783 else if (op[12] == 3 && op[13] == 2) mxf->op = OP3b;
784 else if (op[12] == 3 && op[13] == 3) mxf->op = OP3c;
785 else if (op[12] == 64&& op[13] == 1) mxf->op = OPSONYOpt;
786 else if (op[12] == 0x10) {
787 /* SMPTE 390m: "There shall be exactly one essence container"
788 * The following block deals with files that violate this, namely:
789 * 2011_DCPTEST_24FPS.V.mxf - two ECs, OP1a
790 * abcdefghiv016f56415e.mxf - zero ECs, OPAtom, output by Avid AirSpeed */
791 if (nb_essence_containers != 1) {
792 MXFOP op = nb_essence_containers ? OP1a : OPAtom;
796 av_log(mxf->fc, AV_LOG_WARNING,
797 "\"OPAtom\" with %"PRIu32" ECs - assuming %s\n",
798 nb_essence_containers,
799 op == OP1a ? "OP1a" : "OPAtom");
805 av_log(mxf->fc, AV_LOG_ERROR, "unknown operational pattern: %02xh %02xh - guessing OP1a\n", op[12], op[13]);
809 if (partition->kag_size <= 0 || partition->kag_size > (1 << 20)) {
810 av_log(mxf->fc, AV_LOG_WARNING, "invalid KAGSize %"PRId32" - guessing ",
811 partition->kag_size);
813 if (mxf->op == OPSONYOpt)
814 partition->kag_size = 512;
816 partition->kag_size = 1;
818 av_log(mxf->fc, AV_LOG_WARNING, "%"PRId32"\n", partition->kag_size);
824 static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
826 MXFMetadataSet **tmp;
828 tmp = av_realloc_array(mxf->metadata_sets, mxf->metadata_sets_count + 1, sizeof(*mxf->metadata_sets));
830 return AVERROR(ENOMEM);
831 mxf->metadata_sets = tmp;
832 mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;
833 mxf->metadata_sets_count++;
837 static int mxf_read_cryptographic_context(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
839 MXFCryptoContext *cryptocontext = arg;
841 return AVERROR_INVALIDDATA;
842 if (IS_KLV_KEY(uid, mxf_crypto_source_container_ul))
843 avio_read(pb, cryptocontext->source_container_ul, 16);
847 static int mxf_read_strong_ref_array(AVIOContext *pb, UID **refs, int *count)
849 *count = avio_rb32(pb);
850 *refs = av_calloc(*count, sizeof(UID));
853 return AVERROR(ENOMEM);
855 avio_skip(pb, 4); /* useless size of objects, always 16 according to specs */
856 avio_read(pb, (uint8_t *)*refs, *count * sizeof(UID));
860 static inline int mxf_read_utf16_string(AVIOContext *pb, int size, char** str, int be)
865 if (size < 0 || size > INT_MAX/2)
866 return AVERROR(EINVAL);
868 buf_size = size + size / 2 + 1;
869 *str = av_malloc(buf_size);
871 return AVERROR(ENOMEM);
874 ret = avio_get_str16be(pb, size, *str, buf_size);
876 ret = avio_get_str16le(pb, size, *str, buf_size);
886 #define READ_STR16(type, big_endian) \
887 static int mxf_read_utf16 ## type ##_string(AVIOContext *pb, int size, char** str) \
889 return mxf_read_utf16_string(pb, size, str, big_endian); \
895 static int mxf_read_content_storage(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
897 MXFContext *mxf = arg;
900 if (mxf->packages_refs)
901 av_log(mxf->fc, AV_LOG_VERBOSE, "Multiple packages_refs\n");
902 av_free(mxf->packages_refs);
903 return mxf_read_strong_ref_array(pb, &mxf->packages_refs, &mxf->packages_count);
905 av_free(mxf->essence_container_data_refs);
906 return mxf_read_strong_ref_array(pb, &mxf->essence_container_data_refs, &mxf->essence_container_data_count);
911 static int mxf_read_source_clip(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
913 MXFStructuralComponent *source_clip = arg;
916 source_clip->duration = avio_rb64(pb);
919 source_clip->start_position = avio_rb64(pb);
922 /* UMID, only get last 16 bytes */
923 avio_read(pb, source_clip->source_package_ul, 16);
924 avio_read(pb, source_clip->source_package_uid, 16);
927 source_clip->source_track_id = avio_rb32(pb);
933 static int mxf_read_timecode_component(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
935 MXFTimecodeComponent *mxf_timecode = arg;
938 mxf_timecode->start_frame = avio_rb64(pb);
941 mxf_timecode->rate = (AVRational){avio_rb16(pb), 1};
944 mxf_timecode->drop_frame = avio_r8(pb);
950 static int mxf_read_pulldown_component(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
952 MXFPulldownComponent *mxf_pulldown = arg;
955 avio_read(pb, mxf_pulldown->input_segment_ref, 16);
961 static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
963 MXFTrack *track = arg;
966 track->track_id = avio_rb32(pb);
969 avio_read(pb, track->track_number, 4);
972 mxf_read_utf16be_string(pb, size, &track->name);
975 track->edit_rate.num = avio_rb32(pb);
976 track->edit_rate.den = avio_rb32(pb);
979 avio_read(pb, track->sequence_ref, 16);
985 static int mxf_read_sequence(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
987 MXFSequence *sequence = arg;
990 sequence->duration = avio_rb64(pb);
993 avio_read(pb, sequence->data_definition_ul, 16);
996 sequence->origin = avio_r8(pb);
999 return mxf_read_strong_ref_array(pb, &sequence->structural_components_refs,
1000 &sequence->structural_components_count);
1005 static int mxf_read_essence_group(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1007 MXFEssenceGroup *essence_group = arg;
1010 essence_group->duration = avio_rb64(pb);
1013 return mxf_read_strong_ref_array(pb, &essence_group->structural_components_refs,
1014 &essence_group->structural_components_count);
1019 static int mxf_read_package(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1021 MXFPackage *package = arg;
1024 return mxf_read_strong_ref_array(pb, &package->tracks_refs,
1025 &package->tracks_count);
1028 avio_read(pb, package->package_ul, 16);
1029 avio_read(pb, package->package_uid, 16);
1032 avio_read(pb, package->descriptor_ref, 16);
1035 return mxf_read_utf16be_string(pb, size, &package->name);
1037 return mxf_read_strong_ref_array(pb, &package->comment_refs,
1038 &package->comment_count);
1043 static int mxf_read_essence_container_data(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1045 MXFEssenceContainerData *essence_data = arg;
1048 /* linked package umid UMID */
1049 avio_read(pb, essence_data->package_ul, 16);
1050 avio_read(pb, essence_data->package_uid, 16);
1053 essence_data->index_sid = avio_rb32(pb);
1056 essence_data->body_sid = avio_rb32(pb);
1062 static int mxf_read_index_entry_array(AVIOContext *pb, MXFIndexTableSegment *segment)
1066 segment->nb_index_entries = avio_rb32(pb);
1068 length = avio_rb32(pb);
1069 if(segment->nb_index_entries && length < 11)
1070 return AVERROR_INVALIDDATA;
1072 if (!(segment->temporal_offset_entries=av_calloc(segment->nb_index_entries, sizeof(*segment->temporal_offset_entries))) ||
1073 !(segment->flag_entries = av_calloc(segment->nb_index_entries, sizeof(*segment->flag_entries))) ||
1074 !(segment->stream_offset_entries = av_calloc(segment->nb_index_entries, sizeof(*segment->stream_offset_entries)))) {
1075 av_freep(&segment->temporal_offset_entries);
1076 av_freep(&segment->flag_entries);
1077 return AVERROR(ENOMEM);
1080 for (i = 0; i < segment->nb_index_entries; i++) {
1082 return AVERROR_INVALIDDATA;
1083 segment->temporal_offset_entries[i] = avio_r8(pb);
1084 avio_r8(pb); /* KeyFrameOffset */
1085 segment->flag_entries[i] = avio_r8(pb);
1086 segment->stream_offset_entries[i] = avio_rb64(pb);
1087 avio_skip(pb, length - 11);
1092 static int mxf_read_index_table_segment(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1094 MXFIndexTableSegment *segment = arg;
1097 segment->edit_unit_byte_count = avio_rb32(pb);
1098 av_log(NULL, AV_LOG_TRACE, "EditUnitByteCount %d\n", segment->edit_unit_byte_count);
1101 segment->index_sid = avio_rb32(pb);
1102 av_log(NULL, AV_LOG_TRACE, "IndexSID %d\n", segment->index_sid);
1105 segment->body_sid = avio_rb32(pb);
1106 av_log(NULL, AV_LOG_TRACE, "BodySID %d\n", segment->body_sid);
1109 av_log(NULL, AV_LOG_TRACE, "IndexEntryArray found\n");
1110 return mxf_read_index_entry_array(pb, segment);
1112 segment->index_edit_rate.num = avio_rb32(pb);
1113 segment->index_edit_rate.den = avio_rb32(pb);
1114 av_log(NULL, AV_LOG_TRACE, "IndexEditRate %d/%d\n", segment->index_edit_rate.num,
1115 segment->index_edit_rate.den);
1118 segment->index_start_position = avio_rb64(pb);
1119 av_log(NULL, AV_LOG_TRACE, "IndexStartPosition %"PRId64"\n", segment->index_start_position);
1122 segment->index_duration = avio_rb64(pb);
1123 av_log(NULL, AV_LOG_TRACE, "IndexDuration %"PRId64"\n", segment->index_duration);
1129 static void mxf_read_pixel_layout(AVIOContext *pb, MXFDescriptor *descriptor)
1131 int code, value, ofs = 0;
1132 char layout[16] = {0}; /* not for printing, may end up not terminated on purpose */
1136 value = avio_r8(pb);
1137 av_log(NULL, AV_LOG_TRACE, "pixel layout: code %#x\n", code);
1140 layout[ofs++] = code;
1141 layout[ofs++] = value;
1143 break; /* don't read byte by byte on sneaky files filled with lots of non-zeroes */
1144 } while (code != 0); /* SMPTE 377M E.2.46 */
1146 ff_mxf_decode_pixel_layout(layout, &descriptor->pix_fmt);
1149 static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1151 MXFDescriptor *descriptor = arg;
1152 int entry_count, entry_size;
1156 return mxf_read_strong_ref_array(pb, &descriptor->sub_descriptors_refs,
1157 &descriptor->sub_descriptors_count);
1158 case 0x3002: /* ContainerDuration */
1159 descriptor->duration = avio_rb64(pb);
1162 avio_read(pb, descriptor->essence_container_ul, 16);
1165 avio_read(pb, descriptor->codec_ul, 16);
1168 descriptor->linked_track_id = avio_rb32(pb);
1170 case 0x3201: /* PictureEssenceCoding */
1171 avio_read(pb, descriptor->essence_codec_ul, 16);
1174 descriptor->width = avio_rb32(pb);
1177 descriptor->height = avio_rb32(pb);
1180 descriptor->frame_layout = avio_r8(pb);
1183 entry_count = avio_rb32(pb);
1184 entry_size = avio_rb32(pb);
1185 if (entry_size == 4) {
1186 if (entry_count > 0)
1187 descriptor->video_line_map[0] = avio_rb32(pb);
1189 descriptor->video_line_map[0] = 0;
1190 if (entry_count > 1)
1191 descriptor->video_line_map[1] = avio_rb32(pb);
1193 descriptor->video_line_map[1] = 0;
1195 av_log(NULL, AV_LOG_WARNING, "VideoLineMap element size %d currently not supported\n", entry_size);
1198 descriptor->aspect_ratio.num = avio_rb32(pb);
1199 descriptor->aspect_ratio.den = avio_rb32(pb);
1202 descriptor->field_dominance = avio_r8(pb);
1205 descriptor->component_depth = avio_rb32(pb);
1208 descriptor->horiz_subsampling = avio_rb32(pb);
1211 descriptor->vert_subsampling = avio_rb32(pb);
1214 descriptor->sample_rate.num = avio_rb32(pb);
1215 descriptor->sample_rate.den = avio_rb32(pb);
1217 case 0x3D06: /* SoundEssenceCompression */
1218 avio_read(pb, descriptor->essence_codec_ul, 16);
1221 descriptor->channels = avio_rb32(pb);
1224 descriptor->bits_per_sample = avio_rb32(pb);
1227 mxf_read_pixel_layout(pb, descriptor);
1230 /* Private uid used by SONY C0023S01.mxf */
1231 if (IS_KLV_KEY(uid, mxf_sony_mpeg4_extradata)) {
1232 if (descriptor->extradata)
1233 av_log(NULL, AV_LOG_WARNING, "Duplicate sony_mpeg4_extradata\n");
1234 av_free(descriptor->extradata);
1235 descriptor->extradata_size = 0;
1236 descriptor->extradata = av_malloc(size);
1237 if (!descriptor->extradata)
1238 return AVERROR(ENOMEM);
1239 descriptor->extradata_size = size;
1240 avio_read(pb, descriptor->extradata, size);
1242 if (IS_KLV_KEY(uid, mxf_jp2k_rsiz)) {
1243 uint32_t rsiz = avio_rb16(pb);
1244 if (rsiz == FF_PROFILE_JPEG2000_DCINEMA_2K ||
1245 rsiz == FF_PROFILE_JPEG2000_DCINEMA_4K)
1246 descriptor->pix_fmt = AV_PIX_FMT_XYZ12;
1253 static int mxf_read_indirect_value(void *arg, AVIOContext *pb, int size)
1255 MXFTaggedValue *tagged_value = arg;
1261 avio_read(pb, key, 17);
1262 /* TODO: handle other types of of indirect values */
1263 if (memcmp(key, mxf_indirect_value_utf16le, 17) == 0) {
1264 return mxf_read_utf16le_string(pb, size - 17, &tagged_value->value);
1265 } else if (memcmp(key, mxf_indirect_value_utf16be, 17) == 0) {
1266 return mxf_read_utf16be_string(pb, size - 17, &tagged_value->value);
1271 static int mxf_read_tagged_value(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1273 MXFTaggedValue *tagged_value = arg;
1276 return mxf_read_utf16be_string(pb, size, &tagged_value->name);
1278 return mxf_read_indirect_value(tagged_value, pb, size);
1284 * Match an uid independently of the version byte and up to len common bytes
1287 static int mxf_match_uid(const UID key, const UID uid, int len)
1290 for (i = 0; i < len; i++) {
1291 if (i != 7 && key[i] != uid[i])
1297 static const MXFCodecUL *mxf_get_codec_ul(const MXFCodecUL *uls, UID *uid)
1299 while (uls->uid[0]) {
1300 if(mxf_match_uid(uls->uid, *uid, uls->matching_len))
1307 static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum MXFMetadataSetType type)
1313 for (i = 0; i < mxf->metadata_sets_count; i++) {
1314 if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16) &&
1315 (type == AnyType || mxf->metadata_sets[i]->type == type)) {
1316 return mxf->metadata_sets[i];
1322 static const MXFCodecUL mxf_picture_essence_container_uls[] = {
1323 // video essence container uls
1324 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0c,0x01,0x00 }, 14, AV_CODEC_ID_JPEG2000, NULL, 14 },
1325 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x10,0x60,0x01 }, 14, AV_CODEC_ID_H264, NULL, 15 }, /* H.264 */
1326 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 }, 14, AV_CODEC_ID_DNXHD, NULL, 14 }, /* VC-3 */
1327 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x12,0x01,0x00 }, 14, AV_CODEC_ID_VC1, NULL, 14 }, /* VC-1 */
1328 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x14,0x01,0x00 }, 14, AV_CODEC_ID_TIFF, NULL, 14 }, /* TIFF */
1329 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x15,0x01,0x00 }, 14, AV_CODEC_ID_DIRAC, NULL, 14 }, /* VC-2 */
1330 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x1b,0x01,0x00 }, 14, AV_CODEC_ID_CFHD, NULL, 14 }, /* VC-5 */
1331 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x1c,0x01,0x00 }, 14, AV_CODEC_ID_PRORES, NULL, 14 }, /* ProRes */
1332 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, 14, AV_CODEC_ID_MPEG2VIDEO, NULL, 15 }, /* MPEG-ES */
1333 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x01,0x04,0x01 }, 14, AV_CODEC_ID_MPEG2VIDEO, NULL, 15, D10D11Wrap }, /* SMPTE D-10 mapping */
1334 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x02,0x41,0x01 }, 14, AV_CODEC_ID_DVVIDEO, NULL, 15 }, /* DV 625 25mbps */
1335 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x05,0x00,0x00 }, 14, AV_CODEC_ID_RAWVIDEO, NULL, 15, RawVWrap }, /* uncompressed picture */
1336 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x0f,0x03,0x01,0x02,0x20,0x01,0x01 }, 15, AV_CODEC_ID_HQ_HQA },
1337 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x0f,0x03,0x01,0x02,0x20,0x02,0x01 }, 15, AV_CODEC_ID_HQX },
1338 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x15,0x00,0x04,0x02,0x10,0x00,0x01 }, 16, AV_CODEC_ID_HEVC, NULL, 15 }, /* Canon XF-HEVC */
1339 { { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0xff,0x4b,0x46,0x41,0x41,0x00,0x0d,0x4d,0x4f }, 14, AV_CODEC_ID_RAWVIDEO }, /* Legacy ?? Uncompressed Picture */
1340 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AV_CODEC_ID_NONE },
1343 /* EC ULs for intra-only formats */
1344 static const MXFCodecUL mxf_intra_only_essence_container_uls[] = {
1345 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x01,0x00,0x00 }, 14, AV_CODEC_ID_MPEG2VIDEO }, /* MXF-GC SMPTE D-10 mappings */
1346 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AV_CODEC_ID_NONE },
1349 /* intra-only PictureEssenceCoding ULs, where no corresponding EC UL exists */
1350 static const MXFCodecUL mxf_intra_only_picture_essence_coding_uls[] = {
1351 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x00,0x00 }, 14, AV_CODEC_ID_H264 }, /* H.264/MPEG-4 AVC Intra Profiles */
1352 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 }, 14, AV_CODEC_ID_JPEG2000 }, /* JPEG 2000 code stream */
1353 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AV_CODEC_ID_NONE },
1356 /* actual coded width for AVC-Intra to allow selecting correct SPS/PPS */
1357 static const MXFCodecUL mxf_intra_only_picture_coded_width[] = {
1358 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x01 }, 16, 1440 },
1359 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x02 }, 16, 1440 },
1360 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x03 }, 16, 1440 },
1361 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x04 }, 16, 1440 },
1362 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, 0 },
1365 static const MXFCodecUL mxf_sound_essence_container_uls[] = {
1366 // sound essence container uls
1367 { { 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 }, /* BWF */
1368 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x04,0x40,0x01 }, 14, AV_CODEC_ID_MP2, NULL, 15 }, /* MPEG-ES */
1369 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, 14, AV_CODEC_ID_PCM_S16LE, NULL, 13 }, /* D-10 Mapping 50Mbps PAL Extended Template */
1370 { { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0xff,0x4b,0x46,0x41,0x41,0x00,0x0d,0x4d,0x4F }, 14, AV_CODEC_ID_PCM_S16LE }, /* 0001GL00.MXF.A1.mxf_opatom.mxf */
1371 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x03,0x04,0x02,0x02,0x02,0x03,0x03,0x01,0x00 }, 14, AV_CODEC_ID_AAC }, /* MPEG-2 AAC ADTS (legacy) */
1372 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AV_CODEC_ID_NONE },
1375 static const MXFCodecUL mxf_data_essence_container_uls[] = {
1376 { { 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 },
1377 { { 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 },
1378 { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x09,0x0d,0x01,0x03,0x01,0x02,0x13,0x01,0x01 }, 16, AV_CODEC_ID_TTML },
1379 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AV_CODEC_ID_NONE },
1382 static MXFWrappingScheme mxf_get_wrapping_kind(UID *essence_container_ul)
1385 const MXFCodecUL *codec_ul;
1387 codec_ul = mxf_get_codec_ul(mxf_picture_essence_container_uls, essence_container_ul);
1388 if (!codec_ul->uid[0])
1389 codec_ul = mxf_get_codec_ul(mxf_sound_essence_container_uls, essence_container_ul);
1390 if (!codec_ul->uid[0])
1391 codec_ul = mxf_get_codec_ul(mxf_data_essence_container_uls, essence_container_ul);
1392 if (!codec_ul->uid[0] || !codec_ul->wrapping_indicator_pos)
1393 return UnknownWrapped;
1395 val = (*essence_container_ul)[codec_ul->wrapping_indicator_pos];
1396 switch (codec_ul->wrapping_indicator_type) {
1401 if (val == 0x03 || val == 0x04)
1410 return FrameWrapped;
1413 return UnknownWrapped;
1416 static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segments, MXFIndexTableSegment ***sorted_segments)
1418 int i, j, nb_segments = 0;
1419 MXFIndexTableSegment **unsorted_segments;
1420 int last_body_sid = -1, last_index_sid = -1, last_index_start = -1;
1422 /* count number of segments, allocate arrays and copy unsorted segments */
1423 for (i = 0; i < mxf->metadata_sets_count; i++)
1424 if (mxf->metadata_sets[i]->type == IndexTableSegment)
1428 return AVERROR_INVALIDDATA;
1430 if (!(unsorted_segments = av_calloc(nb_segments, sizeof(*unsorted_segments))) ||
1431 !(*sorted_segments = av_calloc(nb_segments, sizeof(**sorted_segments)))) {
1432 av_freep(sorted_segments);
1433 av_free(unsorted_segments);
1434 return AVERROR(ENOMEM);
1437 for (i = nb_segments = 0; i < mxf->metadata_sets_count; i++) {
1438 if (mxf->metadata_sets[i]->type == IndexTableSegment) {
1439 MXFIndexTableSegment *s = (MXFIndexTableSegment*)mxf->metadata_sets[i];
1440 if (s->edit_unit_byte_count || s->nb_index_entries)
1441 unsorted_segments[nb_segments++] = s;
1443 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment at %"PRId64" missing EditUnitByteCount and IndexEntryArray\n",
1444 s->index_sid, s->index_start_position);
1449 av_freep(sorted_segments);
1450 av_free(unsorted_segments);
1451 return AVERROR_INVALIDDATA;
1454 *nb_sorted_segments = 0;
1456 /* sort segments by {BodySID, IndexSID, IndexStartPosition}, remove duplicates while we're at it */
1457 for (i = 0; i < nb_segments; i++) {
1458 int best = -1, best_body_sid = -1, best_index_sid = -1, best_index_start = -1;
1459 uint64_t best_index_duration = 0;
1461 for (j = 0; j < nb_segments; j++) {
1462 MXFIndexTableSegment *s = unsorted_segments[j];
1464 /* Require larger BosySID, IndexSID or IndexStartPosition then the previous entry. This removes duplicates.
1465 * We want the smallest values for the keys than what we currently have, unless this is the first such entry this time around.
1466 * If we come across an entry with the same IndexStartPosition but larger IndexDuration, then we'll prefer it over the one we currently have.
1469 s->body_sid > last_body_sid ||
1470 s->body_sid == last_body_sid && s->index_sid > last_index_sid ||
1471 s->body_sid == last_body_sid && s->index_sid == last_index_sid && s->index_start_position > last_index_start) &&
1473 s->body_sid < best_body_sid ||
1474 s->body_sid == best_body_sid && s->index_sid < best_index_sid ||
1475 s->body_sid == best_body_sid && s->index_sid == best_index_sid && s->index_start_position < best_index_start ||
1476 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)) {
1478 best_body_sid = s->body_sid;
1479 best_index_sid = s->index_sid;
1480 best_index_start = s->index_start_position;
1481 best_index_duration = s->index_duration;
1485 /* no suitable entry found -> we're done */
1489 (*sorted_segments)[(*nb_sorted_segments)++] = unsorted_segments[best];
1490 last_body_sid = best_body_sid;
1491 last_index_sid = best_index_sid;
1492 last_index_start = best_index_start;
1495 av_free(unsorted_segments);
1501 * Computes the absolute file offset of the given essence container offset
1503 static int mxf_absolute_bodysid_offset(MXFContext *mxf, int body_sid, int64_t offset, int64_t *offset_out, MXFPartition **partition_out)
1505 MXFPartition *last_p = NULL;
1509 return AVERROR(EINVAL);
1512 b = mxf->partitions_count;
1515 m0 = m = (a + b) >> 1;
1517 while (m < b && mxf->partitions[m].body_sid != body_sid)
1520 if (m < b && mxf->partitions[m].body_offset <= offset)
1527 last_p = &mxf->partitions[a];
1529 if (last_p && (!last_p->essence_length || last_p->essence_length > (offset - last_p->body_offset))) {
1530 *offset_out = last_p->essence_offset + (offset - last_p->body_offset);
1532 *partition_out = last_p;
1536 av_log(mxf->fc, AV_LOG_ERROR,
1537 "failed to find absolute offset of %"PRIX64" in BodySID %i - partial file?\n",
1540 return AVERROR_INVALIDDATA;
1544 * Returns the end position of the essence container with given BodySID, or zero if unknown
1546 static int64_t mxf_essence_container_end(MXFContext *mxf, int body_sid)
1551 for (x = 0; x < mxf->partitions_count; x++) {
1552 MXFPartition *p = &mxf->partitions[x];
1554 if (p->body_sid != body_sid)
1557 if (!p->essence_length)
1560 ret = p->essence_offset + p->essence_length;
1566 /* EditUnit -> absolute offset */
1567 static int mxf_edit_unit_absolute_offset(MXFContext *mxf, MXFIndexTable *index_table, int64_t edit_unit, AVRational edit_rate, int64_t *edit_unit_out, int64_t *offset_out, MXFPartition **partition_out, int nag)
1570 int64_t offset_temp = 0;
1572 edit_unit = av_rescale_q(edit_unit, index_table->segments[0]->index_edit_rate, edit_rate);
1574 for (i = 0; i < index_table->nb_segments; i++) {
1575 MXFIndexTableSegment *s = index_table->segments[i];
1577 edit_unit = FFMAX(edit_unit, s->index_start_position); /* clamp if trying to seek before start */
1579 if (edit_unit < s->index_start_position + s->index_duration) {
1580 int64_t index = edit_unit - s->index_start_position;
1582 if (s->edit_unit_byte_count)
1583 offset_temp += s->edit_unit_byte_count * index;
1585 if (s->nb_index_entries == 2 * s->index_duration + 1)
1586 index *= 2; /* Avid index */
1588 if (index < 0 || index >= s->nb_index_entries) {
1589 av_log(mxf->fc, AV_LOG_ERROR, "IndexSID %i segment at %"PRId64" IndexEntryArray too small\n",
1590 index_table->index_sid, s->index_start_position);
1591 return AVERROR_INVALIDDATA;
1594 offset_temp = s->stream_offset_entries[index];
1598 *edit_unit_out = av_rescale_q(edit_unit, edit_rate, s->index_edit_rate);
1600 return mxf_absolute_bodysid_offset(mxf, index_table->body_sid, offset_temp, offset_out, partition_out);
1602 /* EditUnitByteCount == 0 for VBR indexes, which is fine since they use explicit StreamOffsets */
1603 offset_temp += s->edit_unit_byte_count * s->index_duration;
1608 av_log(mxf->fc, AV_LOG_ERROR, "failed to map EditUnit %"PRId64" in IndexSID %i to an offset\n", edit_unit, index_table->index_sid);
1610 return AVERROR_INVALIDDATA;
1613 static int mxf_compute_ptses_fake_index(MXFContext *mxf, MXFIndexTable *index_table)
1616 int8_t max_temporal_offset = -128;
1619 /* first compute how many entries we have */
1620 for (i = 0; i < index_table->nb_segments; i++) {
1621 MXFIndexTableSegment *s = index_table->segments[i];
1623 if (!s->nb_index_entries) {
1624 index_table->nb_ptses = 0;
1625 return 0; /* no TemporalOffsets */
1628 if (s->index_duration > INT_MAX - index_table->nb_ptses) {
1629 index_table->nb_ptses = 0;
1630 av_log(mxf->fc, AV_LOG_ERROR, "ignoring IndexSID %d, duration is too large\n", s->index_sid);
1634 index_table->nb_ptses += s->index_duration;
1637 /* paranoid check */
1638 if (index_table->nb_ptses <= 0)
1641 if (!(index_table->ptses = av_calloc(index_table->nb_ptses, sizeof(int64_t))) ||
1642 !(index_table->fake_index = av_calloc(index_table->nb_ptses, sizeof(AVIndexEntry))) ||
1643 !(index_table->offsets = av_calloc(index_table->nb_ptses, sizeof(int8_t))) ||
1644 !(flags = av_calloc(index_table->nb_ptses, sizeof(uint8_t)))) {
1645 av_freep(&index_table->ptses);
1646 av_freep(&index_table->fake_index);
1647 av_freep(&index_table->offsets);
1648 return AVERROR(ENOMEM);
1651 /* we may have a few bad TemporalOffsets
1652 * make sure the corresponding PTSes don't have the bogus value 0 */
1653 for (x = 0; x < index_table->nb_ptses; x++)
1654 index_table->ptses[x] = AV_NOPTS_VALUE;
1668 * We want to transform it into this:
1679 * We do this by bucket sorting x by x+TemporalOffset[x] into mxf->ptses,
1680 * then settings mxf->first_dts = -max(TemporalOffset[x]).
1681 * The latter makes DTS <= PTS.
1683 for (i = x = 0; i < index_table->nb_segments; i++) {
1684 MXFIndexTableSegment *s = index_table->segments[i];
1685 int index_delta = 1;
1686 int n = s->nb_index_entries;
1688 if (s->nb_index_entries == 2 * s->index_duration + 1) {
1689 index_delta = 2; /* Avid index */
1690 /* ignore the last entry - it's the size of the essence container */
1694 for (j = 0; j < n; j += index_delta, x++) {
1695 int offset = s->temporal_offset_entries[j] / index_delta;
1696 int index = x + offset;
1698 if (x >= index_table->nb_ptses) {
1699 av_log(mxf->fc, AV_LOG_ERROR,
1700 "x >= nb_ptses - IndexEntryCount %i < IndexDuration %"PRId64"?\n",
1701 s->nb_index_entries, s->index_duration);
1705 flags[x] = !(s->flag_entries[j] & 0x30) ? AVINDEX_KEYFRAME : 0;
1707 if (index < 0 || index >= index_table->nb_ptses) {
1708 av_log(mxf->fc, AV_LOG_ERROR,
1709 "index entry %i + TemporalOffset %i = %i, which is out of bounds\n",
1714 index_table->offsets[x] = offset;
1715 index_table->ptses[index] = x;
1716 max_temporal_offset = FFMAX(max_temporal_offset, offset);
1720 /* calculate the fake index table in display order */
1721 for (x = 0; x < index_table->nb_ptses; x++) {
1722 index_table->fake_index[x].timestamp = x;
1723 if (index_table->ptses[x] != AV_NOPTS_VALUE)
1724 index_table->fake_index[index_table->ptses[x]].flags = flags[x];
1728 index_table->first_dts = -max_temporal_offset;
1734 * Sorts and collects index table segments into index tables.
1735 * Also computes PTSes if possible.
1737 static int mxf_compute_index_tables(MXFContext *mxf)
1739 int i, j, k, ret, nb_sorted_segments;
1740 MXFIndexTableSegment **sorted_segments = NULL;
1742 if ((ret = mxf_get_sorted_table_segments(mxf, &nb_sorted_segments, &sorted_segments)) ||
1743 nb_sorted_segments <= 0) {
1744 av_log(mxf->fc, AV_LOG_WARNING, "broken or empty index\n");
1748 /* sanity check and count unique BodySIDs/IndexSIDs */
1749 for (i = 0; i < nb_sorted_segments; i++) {
1750 if (i == 0 || sorted_segments[i-1]->index_sid != sorted_segments[i]->index_sid)
1751 mxf->nb_index_tables++;
1752 else if (sorted_segments[i-1]->body_sid != sorted_segments[i]->body_sid) {
1753 av_log(mxf->fc, AV_LOG_ERROR, "found inconsistent BodySID\n");
1754 ret = AVERROR_INVALIDDATA;
1755 goto finish_decoding_index;
1759 mxf->index_tables = av_mallocz_array(mxf->nb_index_tables,
1760 sizeof(*mxf->index_tables));
1761 if (!mxf->index_tables) {
1762 av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate index tables\n");
1763 ret = AVERROR(ENOMEM);
1764 goto finish_decoding_index;
1767 /* distribute sorted segments to index tables */
1768 for (i = j = 0; i < nb_sorted_segments; i++) {
1769 if (i != 0 && sorted_segments[i-1]->index_sid != sorted_segments[i]->index_sid) {
1774 mxf->index_tables[j].nb_segments++;
1777 for (i = j = 0; j < mxf->nb_index_tables; i += mxf->index_tables[j++].nb_segments) {
1778 MXFIndexTable *t = &mxf->index_tables[j];
1779 MXFTrack *mxf_track = NULL;
1781 t->segments = av_mallocz_array(t->nb_segments,
1782 sizeof(*t->segments));
1785 av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate IndexTableSegment"
1786 " pointer array\n");
1787 ret = AVERROR(ENOMEM);
1788 goto finish_decoding_index;
1791 if (sorted_segments[i]->index_start_position)
1792 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i starts at EditUnit %"PRId64" - seeking may not work as expected\n",
1793 sorted_segments[i]->index_sid, sorted_segments[i]->index_start_position);
1795 memcpy(t->segments, &sorted_segments[i], t->nb_segments * sizeof(MXFIndexTableSegment*));
1796 t->index_sid = sorted_segments[i]->index_sid;
1797 t->body_sid = sorted_segments[i]->body_sid;
1799 if ((ret = mxf_compute_ptses_fake_index(mxf, t)) < 0)
1800 goto finish_decoding_index;
1802 for (k = 0; k < mxf->fc->nb_streams; k++) {
1803 MXFTrack *track = mxf->fc->streams[k]->priv_data;
1804 if (track && track->index_sid == t->index_sid) {
1810 /* fix zero IndexDurations */
1811 for (k = 0; k < t->nb_segments; k++) {
1812 if (!t->segments[k]->index_edit_rate.num || !t->segments[k]->index_edit_rate.den) {
1813 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment %i has invalid IndexEditRate\n",
1816 t->segments[k]->index_edit_rate = mxf_track->edit_rate;
1819 if (t->segments[k]->index_duration)
1822 if (t->nb_segments > 1)
1823 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment %i has zero IndexDuration and there's more than one segment\n",
1827 av_log(mxf->fc, AV_LOG_WARNING, "no streams?\n");
1831 /* assume the first stream's duration is reasonable
1832 * leave index_duration = 0 on further segments in case we have any (unlikely)
1834 t->segments[k]->index_duration = mxf_track->original_duration;
1840 finish_decoding_index:
1841 av_free(sorted_segments);
1845 static int mxf_is_intra_only(MXFDescriptor *descriptor)
1847 return mxf_get_codec_ul(mxf_intra_only_essence_container_uls,
1848 &descriptor->essence_container_ul)->id != AV_CODEC_ID_NONE ||
1849 mxf_get_codec_ul(mxf_intra_only_picture_essence_coding_uls,
1850 &descriptor->essence_codec_ul)->id != AV_CODEC_ID_NONE;
1853 static int mxf_uid_to_str(UID uid, char **str)
1857 p = *str = av_mallocz(sizeof(UID) * 2 + 4 + 1);
1859 return AVERROR(ENOMEM);
1860 for (i = 0; i < sizeof(UID); i++) {
1861 snprintf(p, 2 + 1, "%.2x", uid[i]);
1863 if (i == 3 || i == 5 || i == 7 || i == 9) {
1864 snprintf(p, 1 + 1, "-");
1871 static int mxf_umid_to_str(UID ul, UID uid, char **str)
1875 p = *str = av_mallocz(sizeof(UID) * 4 + 2 + 1);
1877 return AVERROR(ENOMEM);
1878 snprintf(p, 2 + 1, "0x");
1880 for (i = 0; i < sizeof(UID); i++) {
1881 snprintf(p, 2 + 1, "%.2X", ul[i]);
1885 for (i = 0; i < sizeof(UID); i++) {
1886 snprintf(p, 2 + 1, "%.2X", uid[i]);
1892 static int mxf_add_umid_metadata(AVDictionary **pm, const char *key, MXFPackage* package)
1898 if ((ret = mxf_umid_to_str(package->package_ul, package->package_uid, &str)) < 0)
1900 av_dict_set(pm, key, str, AV_DICT_DONT_STRDUP_VAL);
1904 static int mxf_add_timecode_metadata(AVDictionary **pm, const char *key, AVTimecode *tc)
1906 char buf[AV_TIMECODE_STR_SIZE];
1907 av_dict_set(pm, key, av_timecode_make_string(tc, buf, 0), 0);
1912 static MXFTimecodeComponent* mxf_resolve_timecode_component(MXFContext *mxf, UID *strong_ref)
1914 MXFStructuralComponent *component = NULL;
1915 MXFPulldownComponent *pulldown = NULL;
1917 component = mxf_resolve_strong_ref(mxf, strong_ref, AnyType);
1921 switch (component->type) {
1922 case TimecodeComponent:
1923 return (MXFTimecodeComponent*)component;
1924 case PulldownComponent: /* timcode component may be located on a pulldown component */
1925 pulldown = (MXFPulldownComponent*)component;
1926 return mxf_resolve_strong_ref(mxf, &pulldown->input_segment_ref, TimecodeComponent);
1933 static MXFPackage* mxf_resolve_source_package(MXFContext *mxf, UID package_ul, UID package_uid)
1935 MXFPackage *package = NULL;
1938 for (i = 0; i < mxf->packages_count; i++) {
1939 package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], SourcePackage);
1943 if (!memcmp(package->package_ul, package_ul, 16) && !memcmp(package->package_uid, package_uid, 16))
1949 static MXFDescriptor* mxf_resolve_multidescriptor(MXFContext *mxf, MXFDescriptor *descriptor, int track_id)
1951 MXFDescriptor *sub_descriptor = NULL;
1957 if (descriptor->type == MultipleDescriptor) {
1958 for (i = 0; i < descriptor->sub_descriptors_count; i++) {
1959 sub_descriptor = mxf_resolve_strong_ref(mxf, &descriptor->sub_descriptors_refs[i], Descriptor);
1961 if (!sub_descriptor) {
1962 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve sub descriptor strong ref\n");
1965 if (sub_descriptor->linked_track_id == track_id) {
1966 return sub_descriptor;
1969 } else if (descriptor->type == Descriptor)
1975 static MXFStructuralComponent* mxf_resolve_essence_group_choice(MXFContext *mxf, MXFEssenceGroup *essence_group)
1977 MXFStructuralComponent *component = NULL;
1978 MXFPackage *package = NULL;
1979 MXFDescriptor *descriptor = NULL;
1982 if (!essence_group || !essence_group->structural_components_count)
1985 /* essence groups contains multiple representations of the same media,
1986 this return the first components with a valid Descriptor typically index 0 */
1987 for (i =0; i < essence_group->structural_components_count; i++){
1988 component = mxf_resolve_strong_ref(mxf, &essence_group->structural_components_refs[i], SourceClip);
1992 if (!(package = mxf_resolve_source_package(mxf, component->source_package_ul, component->source_package_uid)))
1995 descriptor = mxf_resolve_strong_ref(mxf, &package->descriptor_ref, Descriptor);
2002 static MXFStructuralComponent* mxf_resolve_sourceclip(MXFContext *mxf, UID *strong_ref)
2004 MXFStructuralComponent *component = NULL;
2006 component = mxf_resolve_strong_ref(mxf, strong_ref, AnyType);
2009 switch (component->type) {
2013 return mxf_resolve_essence_group_choice(mxf, (MXFEssenceGroup*) component);
2020 static int mxf_parse_package_comments(MXFContext *mxf, AVDictionary **pm, MXFPackage *package)
2022 MXFTaggedValue *tag;
2026 for (i = 0; i < package->comment_count; i++) {
2027 tag = mxf_resolve_strong_ref(mxf, &package->comment_refs[i], TaggedValue);
2028 if (!tag || !tag->name || !tag->value)
2031 size = strlen(tag->name) + 8 + 1;
2032 key = av_mallocz(size);
2034 return AVERROR(ENOMEM);
2036 snprintf(key, size, "comment_%s", tag->name);
2037 av_dict_set(pm, key, tag->value, AV_DICT_DONT_STRDUP_KEY);
2042 static int mxf_parse_physical_source_package(MXFContext *mxf, MXFTrack *source_track, AVStream *st)
2044 MXFPackage *physical_package = NULL;
2045 MXFTrack *physical_track = NULL;
2046 MXFStructuralComponent *sourceclip = NULL;
2047 MXFTimecodeComponent *mxf_tc = NULL;
2051 int64_t start_position;
2053 for (i = 0; i < source_track->sequence->structural_components_count; i++) {
2054 sourceclip = mxf_resolve_strong_ref(mxf, &source_track->sequence->structural_components_refs[i], SourceClip);
2058 if (!(physical_package = mxf_resolve_source_package(mxf, sourceclip->source_package_ul, sourceclip->source_package_uid)))
2061 mxf_add_umid_metadata(&st->metadata, "reel_umid", physical_package);
2063 /* the name of physical source package is name of the reel or tape */
2064 if (physical_package->name && physical_package->name[0])
2065 av_dict_set(&st->metadata, "reel_name", physical_package->name, 0);
2067 /* the source timecode is calculated by adding the start_position of the sourceclip from the file source package track
2068 * to the start_frame of the timecode component located on one of the tracks of the physical source package.
2070 for (j = 0; j < physical_package->tracks_count; j++) {
2071 if (!(physical_track = mxf_resolve_strong_ref(mxf, &physical_package->tracks_refs[j], Track))) {
2072 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n");
2076 if (!(physical_track->sequence = mxf_resolve_strong_ref(mxf, &physical_track->sequence_ref, Sequence))) {
2077 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
2081 if (physical_track->edit_rate.num <= 0 ||
2082 physical_track->edit_rate.den <= 0) {
2083 av_log(mxf->fc, AV_LOG_WARNING,
2084 "Invalid edit rate (%d/%d) found on structural"
2085 " component #%d, defaulting to 25/1\n",
2086 physical_track->edit_rate.num,
2087 physical_track->edit_rate.den, i);
2088 physical_track->edit_rate = (AVRational){25, 1};
2091 for (k = 0; k < physical_track->sequence->structural_components_count; k++) {
2092 if (!(mxf_tc = mxf_resolve_timecode_component(mxf, &physical_track->sequence->structural_components_refs[k])))
2095 flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
2096 /* scale sourceclip start_position to match physical track edit rate */
2097 start_position = av_rescale_q(sourceclip->start_position,
2098 physical_track->edit_rate,
2099 source_track->edit_rate);
2101 if (av_timecode_init(&tc, mxf_tc->rate, flags, start_position + mxf_tc->start_frame, mxf->fc) == 0) {
2102 mxf_add_timecode_metadata(&st->metadata, "timecode", &tc);
2112 static int mxf_add_metadata_stream(MXFContext *mxf, MXFTrack *track)
2114 MXFStructuralComponent *component = NULL;
2115 const MXFCodecUL *codec_ul = NULL;
2116 MXFPackage tmp_package;
2120 for (j = 0; j < track->sequence->structural_components_count; j++) {
2121 component = mxf_resolve_sourceclip(mxf, &track->sequence->structural_components_refs[j]);
2129 st = avformat_new_stream(mxf->fc, NULL);
2131 av_log(mxf->fc, AV_LOG_ERROR, "could not allocate metadata stream\n");
2132 return AVERROR(ENOMEM);
2135 st->codecpar->codec_type = AVMEDIA_TYPE_DATA;
2136 st->codecpar->codec_id = AV_CODEC_ID_NONE;
2137 st->id = track->track_id;
2139 memcpy(&tmp_package.package_ul, component->source_package_ul, 16);
2140 memcpy(&tmp_package.package_uid, component->source_package_uid, 16);
2141 mxf_add_umid_metadata(&st->metadata, "file_package_umid", &tmp_package);
2142 if (track->name && track->name[0])
2143 av_dict_set(&st->metadata, "track_name", track->name, 0);
2145 codec_ul = mxf_get_codec_ul(ff_mxf_data_definition_uls, &track->sequence->data_definition_ul);
2146 av_dict_set(&st->metadata, "data_type", av_get_media_type_string(codec_ul->id), 0);
2150 static int mxf_parse_structural_metadata(MXFContext *mxf)
2152 MXFPackage *material_package = NULL;
2155 av_log(mxf->fc, AV_LOG_TRACE, "metadata sets count %d\n", mxf->metadata_sets_count);
2156 /* TODO: handle multiple material packages (OP3x) */
2157 for (i = 0; i < mxf->packages_count; i++) {
2158 material_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], MaterialPackage);
2159 if (material_package) break;
2161 if (!material_package) {
2162 av_log(mxf->fc, AV_LOG_ERROR, "no material package found\n");
2163 return AVERROR_INVALIDDATA;
2166 mxf_add_umid_metadata(&mxf->fc->metadata, "material_package_umid", material_package);
2167 if (material_package->name && material_package->name[0])
2168 av_dict_set(&mxf->fc->metadata, "material_package_name", material_package->name, 0);
2169 mxf_parse_package_comments(mxf, &mxf->fc->metadata, material_package);
2171 for (i = 0; i < material_package->tracks_count; i++) {
2172 MXFPackage *source_package = NULL;
2173 MXFTrack *material_track = NULL;
2174 MXFTrack *source_track = NULL;
2175 MXFTrack *temp_track = NULL;
2176 MXFDescriptor *descriptor = NULL;
2177 MXFStructuralComponent *component = NULL;
2178 MXFTimecodeComponent *mxf_tc = NULL;
2179 UID *essence_container_ul = NULL;
2180 const MXFCodecUL *codec_ul = NULL;
2181 const MXFCodecUL *container_ul = NULL;
2182 const MXFCodecUL *pix_fmt_ul = NULL;
2187 if (!(material_track = mxf_resolve_strong_ref(mxf, &material_package->tracks_refs[i], Track))) {
2188 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track strong ref\n");
2192 if ((component = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, TimecodeComponent))) {
2193 mxf_tc = (MXFTimecodeComponent*)component;
2194 flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
2195 if (av_timecode_init(&tc, mxf_tc->rate, flags, mxf_tc->start_frame, mxf->fc) == 0) {
2196 mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
2200 if (!(material_track->sequence = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, Sequence))) {
2201 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track sequence strong ref\n");
2205 for (j = 0; j < material_track->sequence->structural_components_count; j++) {
2206 component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j], TimecodeComponent);
2210 mxf_tc = (MXFTimecodeComponent*)component;
2211 flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
2212 if (av_timecode_init(&tc, mxf_tc->rate, flags, mxf_tc->start_frame, mxf->fc) == 0) {
2213 mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
2218 /* TODO: handle multiple source clips, only finds first valid source clip */
2219 if(material_track->sequence->structural_components_count > 1)
2220 av_log(mxf->fc, AV_LOG_WARNING, "material track %d: has %d components\n",
2221 material_track->track_id, material_track->sequence->structural_components_count);
2223 for (j = 0; j < material_track->sequence->structural_components_count; j++) {
2224 component = mxf_resolve_sourceclip(mxf, &material_track->sequence->structural_components_refs[j]);
2228 source_package = mxf_resolve_source_package(mxf, component->source_package_ul, component->source_package_uid);
2229 if (!source_package) {
2230 av_log(mxf->fc, AV_LOG_TRACE, "material track %d: no corresponding source package found\n", material_track->track_id);
2233 for (k = 0; k < source_package->tracks_count; k++) {
2234 if (!(temp_track = mxf_resolve_strong_ref(mxf, &source_package->tracks_refs[k], Track))) {
2235 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n");
2236 ret = AVERROR_INVALIDDATA;
2239 if (temp_track->track_id == component->source_track_id) {
2240 source_track = temp_track;
2244 if (!source_track) {
2245 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source track found\n", material_track->track_id);
2249 for (k = 0; k < mxf->essence_container_data_count; k++) {
2250 MXFEssenceContainerData *essence_data;
2252 if (!(essence_data = mxf_resolve_strong_ref(mxf, &mxf->essence_container_data_refs[k], EssenceContainerData))) {
2253 av_log(mxf->fc, AV_LOG_TRACE, "could not resolve essence container data strong ref\n");
2256 if (!memcmp(component->source_package_ul, essence_data->package_ul, sizeof(UID)) && !memcmp(component->source_package_uid, essence_data->package_uid, sizeof(UID))) {
2257 source_track->body_sid = essence_data->body_sid;
2258 source_track->index_sid = essence_data->index_sid;
2263 if(source_track && component)
2266 if (!source_track || !component || !source_package) {
2267 if((ret = mxf_add_metadata_stream(mxf, material_track)))
2272 if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) {
2273 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
2274 ret = AVERROR_INVALIDDATA;
2278 /* 0001GL00.MXF.A1.mxf_opatom.mxf has the same SourcePackageID as 0001GL.MXF.V1.mxf_opatom.mxf
2279 * This would result in both files appearing to have two streams. Work around this by sanity checking DataDefinition */
2280 if (memcmp(material_track->sequence->data_definition_ul, source_track->sequence->data_definition_ul, 16)) {
2281 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: DataDefinition mismatch\n", material_track->track_id);
2285 st = avformat_new_stream(mxf->fc, NULL);
2287 av_log(mxf->fc, AV_LOG_ERROR, "could not allocate stream\n");
2288 ret = AVERROR(ENOMEM);
2291 st->id = material_track->track_id;
2292 st->priv_data = source_track;
2294 source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref, AnyType);
2295 descriptor = mxf_resolve_multidescriptor(mxf, source_package->descriptor, source_track->track_id);
2297 /* A SourceClip from a EssenceGroup may only be a single frame of essence data. The clips duration is then how many
2298 * frames its suppose to repeat for. Descriptor->duration, if present, contains the real duration of the essence data */
2299 if (descriptor && descriptor->duration != AV_NOPTS_VALUE)
2300 source_track->original_duration = st->duration = FFMIN(descriptor->duration, component->duration);
2302 source_track->original_duration = st->duration = component->duration;
2304 if (st->duration == -1)
2305 st->duration = AV_NOPTS_VALUE;
2306 st->start_time = component->start_position;
2307 if (material_track->edit_rate.num <= 0 ||
2308 material_track->edit_rate.den <= 0) {
2309 av_log(mxf->fc, AV_LOG_WARNING,
2310 "Invalid edit rate (%d/%d) found on stream #%d, "
2311 "defaulting to 25/1\n",
2312 material_track->edit_rate.num,
2313 material_track->edit_rate.den, st->index);
2314 material_track->edit_rate = (AVRational){25, 1};
2316 avpriv_set_pts_info(st, 64, material_track->edit_rate.den, material_track->edit_rate.num);
2318 /* ensure SourceTrack EditRate == MaterialTrack EditRate since only
2319 * the former is accessible via st->priv_data */
2320 source_track->edit_rate = material_track->edit_rate;
2322 PRINT_KEY(mxf->fc, "data definition ul", source_track->sequence->data_definition_ul);
2323 codec_ul = mxf_get_codec_ul(ff_mxf_data_definition_uls, &source_track->sequence->data_definition_ul);
2324 st->codecpar->codec_type = codec_ul->id;
2327 av_log(mxf->fc, AV_LOG_INFO, "source track %d: stream %d, no descriptor found\n", source_track->track_id, st->index);
2330 PRINT_KEY(mxf->fc, "essence codec ul", descriptor->essence_codec_ul);
2331 PRINT_KEY(mxf->fc, "essence container ul", descriptor->essence_container_ul);
2332 essence_container_ul = &descriptor->essence_container_ul;
2333 source_track->wrapping = (mxf->op == OPAtom) ? ClipWrapped : mxf_get_wrapping_kind(essence_container_ul);
2334 if (source_track->wrapping == UnknownWrapped)
2335 av_log(mxf->fc, AV_LOG_INFO, "wrapping of stream %d is unknown\n", st->index);
2336 /* HACK: replacing the original key with mxf_encrypted_essence_container
2337 * is not allowed according to s429-6, try to find correct information anyway */
2338 if (IS_KLV_KEY(essence_container_ul, mxf_encrypted_essence_container)) {
2339 av_log(mxf->fc, AV_LOG_INFO, "broken encrypted mxf file\n");
2340 for (k = 0; k < mxf->metadata_sets_count; k++) {
2341 MXFMetadataSet *metadata = mxf->metadata_sets[k];
2342 if (metadata->type == CryptoContext) {
2343 essence_container_ul = &((MXFCryptoContext *)metadata)->source_container_ul;
2349 /* TODO: drop PictureEssenceCoding and SoundEssenceCompression, only check EssenceContainer */
2350 codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->essence_codec_ul);
2351 st->codecpar->codec_id = (enum AVCodecID)codec_ul->id;
2352 if (st->codecpar->codec_id == AV_CODEC_ID_NONE) {
2353 codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->codec_ul);
2354 st->codecpar->codec_id = (enum AVCodecID)codec_ul->id;
2357 av_log(mxf->fc, AV_LOG_VERBOSE, "%s: Universal Label: ",
2358 avcodec_get_name(st->codecpar->codec_id));
2359 for (k = 0; k < 16; k++) {
2360 av_log(mxf->fc, AV_LOG_VERBOSE, "%.2x",
2361 descriptor->essence_codec_ul[k]);
2362 if (!(k+1 & 19) || k == 5)
2363 av_log(mxf->fc, AV_LOG_VERBOSE, ".");
2365 av_log(mxf->fc, AV_LOG_VERBOSE, "\n");
2367 mxf_add_umid_metadata(&st->metadata, "file_package_umid", source_package);
2368 if (source_package->name && source_package->name[0])
2369 av_dict_set(&st->metadata, "file_package_name", source_package->name, 0);
2370 if (material_track->name && material_track->name[0])
2371 av_dict_set(&st->metadata, "track_name", material_track->name, 0);
2373 mxf_parse_physical_source_package(mxf, source_track, st);
2375 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
2376 source_track->intra_only = mxf_is_intra_only(descriptor);
2377 container_ul = mxf_get_codec_ul(mxf_picture_essence_container_uls, essence_container_ul);
2378 if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
2379 st->codecpar->codec_id = container_ul->id;
2380 st->codecpar->width = descriptor->width;
2381 st->codecpar->height = descriptor->height; /* Field height, not frame height */
2382 switch (descriptor->frame_layout) {
2384 st->codecpar->field_order = AV_FIELD_PROGRESSIVE;
2387 /* Every other line is stored and needs to be duplicated. */
2388 av_log(mxf->fc, AV_LOG_INFO, "OneField frame layout isn't currently supported\n");
2389 break; /* The correct thing to do here is fall through, but by breaking we might be
2390 able to decode some streams at half the vertical resolution, rather than not al all.
2391 It's also for compatibility with the old behavior. */
2394 case SegmentedFrame:
2395 st->codecpar->field_order = AV_FIELD_PROGRESSIVE;
2396 case SeparateFields:
2397 av_log(mxf->fc, AV_LOG_DEBUG, "video_line_map: (%d, %d), field_dominance: %d\n",
2398 descriptor->video_line_map[0], descriptor->video_line_map[1],
2399 descriptor->field_dominance);
2400 if ((descriptor->video_line_map[0] > 0) && (descriptor->video_line_map[1] > 0)) {
2401 /* Detect coded field order from VideoLineMap:
2402 * (even, even) => bottom field coded first
2403 * (even, odd) => top field coded first
2404 * (odd, even) => top field coded first
2405 * (odd, odd) => bottom field coded first
2407 if ((descriptor->video_line_map[0] + descriptor->video_line_map[1]) % 2) {
2408 switch (descriptor->field_dominance) {
2409 case MXF_FIELD_DOMINANCE_DEFAULT:
2410 case MXF_FIELD_DOMINANCE_FF:
2411 st->codecpar->field_order = AV_FIELD_TT;
2413 case MXF_FIELD_DOMINANCE_FL:
2414 st->codecpar->field_order = AV_FIELD_TB;
2417 avpriv_request_sample(mxf->fc,
2418 "Field dominance %d support",
2419 descriptor->field_dominance);
2422 switch (descriptor->field_dominance) {
2423 case MXF_FIELD_DOMINANCE_DEFAULT:
2424 case MXF_FIELD_DOMINANCE_FF:
2425 st->codecpar->field_order = AV_FIELD_BB;
2427 case MXF_FIELD_DOMINANCE_FL:
2428 st->codecpar->field_order = AV_FIELD_BT;
2431 avpriv_request_sample(mxf->fc,
2432 "Field dominance %d support",
2433 descriptor->field_dominance);
2437 /* Turn field height into frame height. */
2438 st->codecpar->height *= 2;
2441 av_log(mxf->fc, AV_LOG_INFO, "Unknown frame layout type: %d\n", descriptor->frame_layout);
2444 if (st->codecpar->codec_id == AV_CODEC_ID_PRORES) {
2445 switch (descriptor->essence_codec_ul[14]) {
2446 case 1: st->codecpar->codec_tag = MKTAG('a','p','c','o'); break;
2447 case 2: st->codecpar->codec_tag = MKTAG('a','p','c','s'); break;
2448 case 3: st->codecpar->codec_tag = MKTAG('a','p','c','n'); break;
2449 case 4: st->codecpar->codec_tag = MKTAG('a','p','c','h'); break;
2450 case 5: st->codecpar->codec_tag = MKTAG('a','p','4','h'); break;
2451 case 6: st->codecpar->codec_tag = MKTAG('a','p','4','x'); break;
2455 if (st->codecpar->codec_id == AV_CODEC_ID_RAWVIDEO) {
2456 st->codecpar->format = descriptor->pix_fmt;
2457 if (st->codecpar->format == AV_PIX_FMT_NONE) {
2458 pix_fmt_ul = mxf_get_codec_ul(ff_mxf_pixel_format_uls,
2459 &descriptor->essence_codec_ul);
2460 st->codecpar->format = (enum AVPixelFormat)pix_fmt_ul->id;
2461 if (st->codecpar->format== AV_PIX_FMT_NONE) {
2462 st->codecpar->codec_tag = mxf_get_codec_ul(ff_mxf_codec_tag_uls,
2463 &descriptor->essence_codec_ul)->id;
2464 if (!st->codecpar->codec_tag) {
2465 /* support files created before RP224v10 by defaulting to UYVY422
2466 if subsampling is 4:2:2 and component depth is 8-bit */
2467 if (descriptor->horiz_subsampling == 2 &&
2468 descriptor->vert_subsampling == 1 &&
2469 descriptor->component_depth == 8) {
2470 st->codecpar->format = AV_PIX_FMT_UYVY422;
2476 st->need_parsing = AVSTREAM_PARSE_HEADERS;
2477 if (material_track->sequence->origin) {
2478 av_dict_set_int(&st->metadata, "material_track_origin", material_track->sequence->origin, 0);
2480 if (source_track->sequence->origin) {
2481 av_dict_set_int(&st->metadata, "source_track_origin", source_track->sequence->origin, 0);
2483 if (descriptor->aspect_ratio.num && descriptor->aspect_ratio.den)
2484 st->display_aspect_ratio = descriptor->aspect_ratio;
2485 } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2486 container_ul = mxf_get_codec_ul(mxf_sound_essence_container_uls, essence_container_ul);
2487 /* Only overwrite existing codec ID if it is unset or A-law, which is the default according to SMPTE RP 224. */
2488 if (st->codecpar->codec_id == AV_CODEC_ID_NONE || (st->codecpar->codec_id == AV_CODEC_ID_PCM_ALAW && (enum AVCodecID)container_ul->id != AV_CODEC_ID_NONE))
2489 st->codecpar->codec_id = (enum AVCodecID)container_ul->id;
2490 st->codecpar->channels = descriptor->channels;
2492 if (descriptor->sample_rate.den > 0) {
2493 st->codecpar->sample_rate = descriptor->sample_rate.num / descriptor->sample_rate.den;
2494 avpriv_set_pts_info(st, 64, descriptor->sample_rate.den, descriptor->sample_rate.num);
2496 av_log(mxf->fc, AV_LOG_WARNING, "invalid sample rate (%d/%d) "
2497 "found for stream #%d, time base forced to 1/48000\n",
2498 descriptor->sample_rate.num, descriptor->sample_rate.den,
2500 avpriv_set_pts_info(st, 64, 1, 48000);
2503 /* if duration is set, rescale it from EditRate to SampleRate */
2504 if (st->duration != AV_NOPTS_VALUE)
2505 st->duration = av_rescale_q(st->duration,
2506 av_inv_q(material_track->edit_rate),
2509 /* TODO: implement AV_CODEC_ID_RAWAUDIO */
2510 if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16LE) {
2511 if (descriptor->bits_per_sample > 16 && descriptor->bits_per_sample <= 24)
2512 st->codecpar->codec_id = AV_CODEC_ID_PCM_S24LE;
2513 else if (descriptor->bits_per_sample == 32)
2514 st->codecpar->codec_id = AV_CODEC_ID_PCM_S32LE;
2515 } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE) {
2516 if (descriptor->bits_per_sample > 16 && descriptor->bits_per_sample <= 24)
2517 st->codecpar->codec_id = AV_CODEC_ID_PCM_S24BE;
2518 else if (descriptor->bits_per_sample == 32)
2519 st->codecpar->codec_id = AV_CODEC_ID_PCM_S32BE;
2520 } else if (st->codecpar->codec_id == AV_CODEC_ID_MP2) {
2521 st->need_parsing = AVSTREAM_PARSE_FULL;
2523 st->codecpar->bits_per_coded_sample = av_get_bits_per_sample(st->codecpar->codec_id);
2524 } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
2525 enum AVMediaType type;
2526 container_ul = mxf_get_codec_ul(mxf_data_essence_container_uls, essence_container_ul);
2527 if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
2528 st->codecpar->codec_id = container_ul->id;
2529 type = avcodec_get_type(st->codecpar->codec_id);
2530 if (type == AVMEDIA_TYPE_SUBTITLE)
2531 st->codecpar->codec_type = type;
2532 if (container_ul->desc)
2533 av_dict_set(&st->metadata, "data_type", container_ul->desc, 0);
2534 if (mxf->eia608_extract &&
2535 !strcmp(container_ul->desc, "vbi_vanc_smpte_436M")) {
2536 st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
2537 st->codecpar->codec_id = AV_CODEC_ID_EIA_608;
2540 if (descriptor->extradata) {
2541 if (!ff_alloc_extradata(st->codecpar, descriptor->extradata_size)) {
2542 memcpy(st->codecpar->extradata, descriptor->extradata, descriptor->extradata_size);
2544 } else if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
2545 int coded_width = mxf_get_codec_ul(mxf_intra_only_picture_coded_width,
2546 &descriptor->essence_codec_ul)->id;
2548 st->codecpar->width = coded_width;
2549 ret = ff_generate_avci_extradata(st);
2553 if (st->codecpar->codec_type != AVMEDIA_TYPE_DATA && source_track->wrapping != FrameWrapped) {
2554 /* TODO: decode timestamps */
2555 st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS;
2564 static int64_t mxf_timestamp_to_int64(uint64_t timestamp)
2566 struct tm time = { 0 };
2568 time.tm_year = (timestamp >> 48) - 1900;
2569 time.tm_mon = (timestamp >> 40 & 0xFF) - 1;
2570 time.tm_mday = (timestamp >> 32 & 0xFF);
2571 time.tm_hour = (timestamp >> 24 & 0xFF);
2572 time.tm_min = (timestamp >> 16 & 0xFF);
2573 time.tm_sec = (timestamp >> 8 & 0xFF);
2574 msecs = (timestamp & 0xFF) * 4;
2576 /* Clip values for legacy reasons. Maybe we should return error instead? */
2577 time.tm_mon = av_clip(time.tm_mon, 0, 11);
2578 time.tm_mday = av_clip(time.tm_mday, 1, 31);
2579 time.tm_hour = av_clip(time.tm_hour, 0, 23);
2580 time.tm_min = av_clip(time.tm_min, 0, 59);
2581 time.tm_sec = av_clip(time.tm_sec, 0, 59);
2582 msecs = av_clip(msecs, 0, 999);
2584 return (int64_t)av_timegm(&time) * 1000000 + msecs * 1000;
2587 #define SET_STR_METADATA(pb, name, str) do { \
2588 if ((ret = mxf_read_utf16be_string(pb, size, &str)) < 0) \
2590 av_dict_set(&s->metadata, name, str, AV_DICT_DONT_STRDUP_VAL); \
2593 #define SET_UID_METADATA(pb, name, var, str) do { \
2594 avio_read(pb, var, 16); \
2595 if ((ret = mxf_uid_to_str(var, &str)) < 0) \
2597 av_dict_set(&s->metadata, name, str, AV_DICT_DONT_STRDUP_VAL); \
2600 #define SET_TS_METADATA(pb, name, var, str) do { \
2601 var = avio_rb64(pb); \
2602 if (var && (ret = avpriv_dict_set_timestamp(&s->metadata, name, mxf_timestamp_to_int64(var))) < 0) \
2606 static int mxf_read_identification_metadata(void *arg, AVIOContext *pb, int tag, int size, UID _uid, int64_t klv_offset)
2608 MXFContext *mxf = arg;
2609 AVFormatContext *s = mxf->fc;
2616 SET_STR_METADATA(pb, "company_name", str);
2619 SET_STR_METADATA(pb, "product_name", str);
2622 SET_STR_METADATA(pb, "product_version", str);
2625 SET_UID_METADATA(pb, "product_uid", uid, str);
2628 SET_TS_METADATA(pb, "modification_date", ts, str);
2631 SET_STR_METADATA(pb, "application_platform", str);
2634 SET_UID_METADATA(pb, "generation_uid", uid, str);
2637 SET_UID_METADATA(pb, "uid", uid, str);
2643 static int mxf_read_preface_metadata(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
2645 MXFContext *mxf = arg;
2646 AVFormatContext *s = mxf->fc;
2650 if (tag >= 0x8000 && (IS_KLV_KEY(uid, mxf_avid_project_name))) {
2651 SET_STR_METADATA(pb, "project_name", str);
2656 static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = {
2657 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x05,0x01,0x00 }, mxf_read_primer_pack },
2658 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x01,0x00 }, mxf_read_partition_pack },
2659 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x02,0x00 }, mxf_read_partition_pack },
2660 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x03,0x00 }, mxf_read_partition_pack },
2661 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x04,0x00 }, mxf_read_partition_pack },
2662 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x01,0x00 }, mxf_read_partition_pack },
2663 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x02,0x00 }, mxf_read_partition_pack },
2664 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x03,0x00 }, mxf_read_partition_pack },
2665 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x04,0x00 }, mxf_read_partition_pack },
2666 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x02,0x00 }, mxf_read_partition_pack },
2667 { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }, mxf_read_partition_pack },
2668 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x2f,0x00 }, mxf_read_preface_metadata },
2669 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x30,0x00 }, mxf_read_identification_metadata },
2670 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_content_storage, 0, AnyType },
2671 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_package, sizeof(MXFPackage), SourcePackage },
2672 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_package, sizeof(MXFPackage), MaterialPackage },
2673 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0f,0x00 }, mxf_read_sequence, sizeof(MXFSequence), Sequence },
2674 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x05,0x00 }, mxf_read_essence_group, sizeof(MXFEssenceGroup), EssenceGroup},
2675 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_source_clip, sizeof(MXFStructuralComponent), SourceClip },
2676 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3f,0x00 }, mxf_read_tagged_value, sizeof(MXFTaggedValue), TaggedValue },
2677 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), MultipleDescriptor },
2678 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x42,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* Generic Sound */
2679 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* CDCI */
2680 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* RGBA */
2681 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* Wave */
2682 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* AES3 */
2683 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* MPEG2VideoDescriptor */
2684 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x5b,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* VBI - SMPTE 436M */
2685 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x5c,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* VANC/VBI - SMPTE 436M */
2686 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x5e,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* MPEG2AudioDescriptor */
2687 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x64,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* DC Timed Text Descriptor */
2688 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Static Track */
2689 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Generic Track */
2690 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x14,0x00 }, mxf_read_timecode_component, sizeof(MXFTimecodeComponent), TimecodeComponent },
2691 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0c,0x00 }, mxf_read_pulldown_component, sizeof(MXFPulldownComponent), PulldownComponent },
2692 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 }, mxf_read_cryptographic_context, sizeof(MXFCryptoContext), CryptoContext },
2693 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 }, mxf_read_index_table_segment, sizeof(MXFIndexTableSegment), IndexTableSegment },
2694 { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x23,0x00 }, mxf_read_essence_container_data, sizeof(MXFEssenceContainerData), EssenceContainerData },
2695 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType },
2698 static int mxf_metadataset_init(MXFMetadataSet *ctx, enum MXFMetadataSetType type)
2701 case MultipleDescriptor:
2703 ((MXFDescriptor*)ctx)->pix_fmt = AV_PIX_FMT_NONE;
2704 ((MXFDescriptor*)ctx)->duration = AV_NOPTS_VALUE;
2712 static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadFunc *read_child, int ctx_size, enum MXFMetadataSetType type)
2714 AVIOContext *pb = mxf->fc->pb;
2715 MXFMetadataSet *ctx = ctx_size ? av_mallocz(ctx_size) : mxf;
2716 uint64_t klv_end = avio_tell(pb) + klv->length;
2719 return AVERROR(ENOMEM);
2720 mxf_metadataset_init(ctx, type);
2721 while (avio_tell(pb) + 4 < klv_end && !avio_feof(pb)) {
2723 int tag = avio_rb16(pb);
2724 int size = avio_rb16(pb); /* KLV specified by 0x53 */
2725 uint64_t next = avio_tell(pb) + size;
2728 av_log(mxf->fc, AV_LOG_TRACE, "local tag %#04x size %d\n", tag, size);
2729 if (!size) { /* ignore empty tag, needed for some files with empty UMID tag */
2730 av_log(mxf->fc, AV_LOG_ERROR, "local tag %#04x with 0 size\n", tag);
2733 if (tag > 0x7FFF) { /* dynamic tag */
2735 for (i = 0; i < mxf->local_tags_count; i++) {
2736 int local_tag = AV_RB16(mxf->local_tags+i*18);
2737 if (local_tag == tag) {
2738 memcpy(uid, mxf->local_tags+i*18+2, 16);
2739 av_log(mxf->fc, AV_LOG_TRACE, "local tag %#04x\n", local_tag);
2740 PRINT_KEY(mxf->fc, "uid", uid);
2744 if (ctx_size && tag == 0x3C0A) {
2745 avio_read(pb, ctx->uid, 16);
2746 } else if ((ret = read_child(ctx, pb, tag, size, uid, -1)) < 0) {
2748 mxf_free_metadataset(&ctx, 1);
2752 /* Accept the 64k local set limit being exceeded (Avid). Don't accept
2753 * it extending past the end of the KLV though (zzuf5.mxf). */
2754 if (avio_tell(pb) > klv_end) {
2757 mxf_free_metadataset(&ctx, 1);
2760 av_log(mxf->fc, AV_LOG_ERROR,
2761 "local tag %#04x extends past end of local set @ %#"PRIx64"\n",
2763 return AVERROR_INVALIDDATA;
2764 } else if (avio_tell(pb) <= next) /* only seek forward, else this can loop for a long time */
2765 avio_seek(pb, next, SEEK_SET);
2767 if (ctx_size) ctx->type = type;
2768 return ctx_size ? mxf_add_metadata_set(mxf, ctx) : 0;
2772 * Matches any partition pack key, in other words:
2776 * @return non-zero if the key is a partition pack key, zero otherwise
2778 static int mxf_is_partition_pack_key(UID key)
2780 //NOTE: this is a little lax since it doesn't constraint key[14]
2781 return !memcmp(key, mxf_header_partition_pack_key, 13) &&
2782 key[13] >= 2 && key[13] <= 4;
2786 * Parses a metadata KLV
2787 * @return <0 on error, 0 otherwise
2789 static int mxf_parse_klv(MXFContext *mxf, KLVPacket klv, MXFMetadataReadFunc *read,
2790 int ctx_size, enum MXFMetadataSetType type)
2792 AVFormatContext *s = mxf->fc;
2794 if (klv.key[5] == 0x53) {
2795 res = mxf_read_local_tags(mxf, &klv, read, ctx_size, type);
2797 uint64_t next = avio_tell(s->pb) + klv.length;
2798 res = read(mxf, s->pb, 0, klv.length, klv.key, klv.offset);
2800 /* only seek forward, else this can loop for a long time */
2801 if (avio_tell(s->pb) > next) {
2802 av_log(s, AV_LOG_ERROR, "read past end of KLV @ %#"PRIx64"\n",
2804 return AVERROR_INVALIDDATA;
2807 avio_seek(s->pb, next, SEEK_SET);
2810 av_log(s, AV_LOG_ERROR, "error reading header metadata\n");
2817 * Seeks to the previous partition and parses it, if possible
2818 * @return <= 0 if we should stop parsing, > 0 if we should keep going
2820 static int mxf_seek_to_previous_partition(MXFContext *mxf)
2822 AVIOContext *pb = mxf->fc->pb;
2824 int64_t current_partition_ofs;
2827 if (!mxf->current_partition ||
2828 mxf->run_in + mxf->current_partition->previous_partition <= mxf->last_forward_tell)
2829 return 0; /* we've parsed all partitions */
2831 /* seek to previous partition */
2832 current_partition_ofs = mxf->current_partition->pack_ofs; //includes run-in
2833 avio_seek(pb, mxf->run_in + mxf->current_partition->previous_partition, SEEK_SET);
2834 mxf->current_partition = NULL;
2836 av_log(mxf->fc, AV_LOG_TRACE, "seeking to previous partition\n");
2838 /* Make sure this is actually a PartitionPack, and if so parse it.
2841 if ((ret = klv_read_packet(&klv, pb)) < 0) {
2842 av_log(mxf->fc, AV_LOG_ERROR, "failed to read PartitionPack KLV\n");
2846 if (!mxf_is_partition_pack_key(klv.key)) {
2847 av_log(mxf->fc, AV_LOG_ERROR, "PreviousPartition @ %" PRIx64 " isn't a PartitionPack\n", klv.offset);
2848 return AVERROR_INVALIDDATA;
2851 /* We can't just check ofs >= current_partition_ofs because PreviousPartition
2852 * can point to just before the current partition, causing klv_read_packet()
2853 * to sync back up to it. See deadlock3.mxf
2855 if (klv.offset >= current_partition_ofs) {
2856 av_log(mxf->fc, AV_LOG_ERROR, "PreviousPartition for PartitionPack @ %"
2857 PRIx64 " indirectly points to itself\n", current_partition_ofs);
2858 return AVERROR_INVALIDDATA;
2861 if ((ret = mxf_parse_klv(mxf, klv, mxf_read_partition_pack, 0, 0)) < 0)
2868 * Called when essence is encountered
2869 * @return <= 0 if we should stop parsing, > 0 if we should keep going
2871 static int mxf_parse_handle_essence(MXFContext *mxf)
2873 AVIOContext *pb = mxf->fc->pb;
2876 if (mxf->parsing_backward) {
2877 return mxf_seek_to_previous_partition(mxf);
2879 if (!mxf->footer_partition) {
2880 av_log(mxf->fc, AV_LOG_TRACE, "no FooterPartition\n");
2884 av_log(mxf->fc, AV_LOG_TRACE, "seeking to FooterPartition\n");
2886 /* remember where we were so we don't end up seeking further back than this */
2887 mxf->last_forward_tell = avio_tell(pb);
2889 if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) {
2890 av_log(mxf->fc, AV_LOG_INFO, "file is not seekable - not parsing FooterPartition\n");
2894 /* seek to FooterPartition and parse backward */
2895 if ((ret = avio_seek(pb, mxf->run_in + mxf->footer_partition, SEEK_SET)) < 0) {
2896 av_log(mxf->fc, AV_LOG_ERROR,
2897 "failed to seek to FooterPartition @ 0x%" PRIx64
2898 " (%"PRId64") - partial file?\n",
2899 mxf->run_in + mxf->footer_partition, ret);
2903 mxf->current_partition = NULL;
2904 mxf->parsing_backward = 1;
2911 * Called when the next partition or EOF is encountered
2912 * @return <= 0 if we should stop parsing, > 0 if we should keep going
2914 static int mxf_parse_handle_partition_or_eof(MXFContext *mxf)
2916 return mxf->parsing_backward ? mxf_seek_to_previous_partition(mxf) : 1;
2919 static MXFWrappingScheme mxf_get_wrapping_by_body_sid(AVFormatContext *s, int body_sid)
2921 for (int i = 0; i < s->nb_streams; i++) {
2922 MXFTrack *track = s->streams[i]->priv_data;
2923 if (track && track->body_sid == body_sid && track->wrapping != UnknownWrapped)
2924 return track->wrapping;
2926 return UnknownWrapped;
2930 * Figures out the proper offset and length of the essence container in each partition
2932 static void mxf_compute_essence_containers(AVFormatContext *s)
2934 MXFContext *mxf = s->priv_data;
2937 for (x = 0; x < mxf->partitions_count; x++) {
2938 MXFPartition *p = &mxf->partitions[x];
2939 MXFWrappingScheme wrapping;
2942 continue; /* BodySID == 0 -> no essence */
2944 /* for clip wrapped essences we point essence_offset after the KL (usually klv.offset + 20 or 25)
2945 * otherwise we point essence_offset at the key of the first essence KLV.
2948 wrapping = (mxf->op == OPAtom) ? ClipWrapped : mxf_get_wrapping_by_body_sid(s, p->body_sid);
2950 if (wrapping == ClipWrapped) {
2951 p->essence_offset = p->first_essence_klv.next_klv - p->first_essence_klv.length;
2952 p->essence_length = p->first_essence_klv.length;
2954 p->essence_offset = p->first_essence_klv.offset;
2956 /* essence container spans to the next partition */
2957 if (x < mxf->partitions_count - 1)
2958 p->essence_length = mxf->partitions[x+1].this_partition - p->essence_offset;
2960 if (p->essence_length < 0) {
2961 /* next ThisPartition < essence_offset */
2962 p->essence_length = 0;
2963 av_log(mxf->fc, AV_LOG_ERROR,
2964 "partition %i: bad ThisPartition = %"PRIX64"\n",
2965 x+1, mxf->partitions[x+1].this_partition);
2971 static int is_pcm(enum AVCodecID codec_id)
2973 /* we only care about "normal" PCM codecs until we get samples */
2974 return codec_id >= AV_CODEC_ID_PCM_S16LE && codec_id < AV_CODEC_ID_PCM_S24DAUD;
2977 static MXFIndexTable *mxf_find_index_table(MXFContext *mxf, int index_sid)
2980 for (i = 0; i < mxf->nb_index_tables; i++)
2981 if (mxf->index_tables[i].index_sid == index_sid)
2982 return &mxf->index_tables[i];
2987 * Deal with the case where for some audio atoms EditUnitByteCount is
2988 * very small (2, 4..). In those cases we should read more than one
2989 * sample per call to mxf_read_packet().
2991 static void mxf_compute_edit_units_per_packet(MXFContext *mxf, AVStream *st)
2993 MXFTrack *track = st->priv_data;
2998 track->edit_units_per_packet = 1;
2999 if (track->wrapping != ClipWrapped)
3002 t = mxf_find_index_table(mxf, track->index_sid);
3004 /* expect PCM with exactly one index table segment and a small (< 32) EUBC */
3005 if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO ||
3006 !is_pcm(st->codecpar->codec_id) ||
3008 t->nb_segments != 1 ||
3009 t->segments[0]->edit_unit_byte_count >= 32)
3012 /* arbitrarily default to 48 kHz PAL audio frame size */
3013 /* TODO: We could compute this from the ratio between the audio
3014 * and video edit rates for 48 kHz NTSC we could use the
3015 * 1802-1802-1802-1802-1801 pattern. */
3016 track->edit_units_per_packet = FFMAX(1, track->edit_rate.num / track->edit_rate.den / 25);
3020 * Deal with the case where ClipWrapped essences does not have any IndexTableSegments.
3022 static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st)
3024 MXFTrack *track = st->priv_data;
3025 MXFIndexTableSegment *segment = NULL;
3026 MXFPartition *p = NULL;
3027 int essence_partition_count = 0;
3028 int edit_unit_byte_count = 0;
3031 if (!track || track->wrapping != ClipWrapped)
3034 /* check if track already has an IndexTableSegment */
3035 for (i = 0; i < mxf->metadata_sets_count; i++) {
3036 if (mxf->metadata_sets[i]->type == IndexTableSegment) {
3037 MXFIndexTableSegment *s = (MXFIndexTableSegment*)mxf->metadata_sets[i];
3038 if (s->body_sid == track->body_sid)
3043 /* find the essence partition */
3044 for (i = 0; i < mxf->partitions_count; i++) {
3045 /* BodySID == 0 -> no essence */
3046 if (mxf->partitions[i].body_sid != track->body_sid)
3049 p = &mxf->partitions[i];
3050 essence_partition_count++;
3053 /* only handle files with a single essence partition */
3054 if (essence_partition_count != 1)
3057 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && is_pcm(st->codecpar->codec_id)) {
3058 edit_unit_byte_count = (av_get_bits_per_sample(st->codecpar->codec_id) * st->codecpar->channels) >> 3;
3059 } else if (st->duration > 0 && p->first_essence_klv.length > 0 && p->first_essence_klv.length % st->duration == 0) {
3060 edit_unit_byte_count = p->first_essence_klv.length / st->duration;
3063 if (edit_unit_byte_count <= 0)
3066 av_log(mxf->fc, AV_LOG_WARNING, "guessing index for stream %d using edit unit byte count %d\n", st->index, edit_unit_byte_count);
3068 if (!(segment = av_mallocz(sizeof(*segment))))
3069 return AVERROR(ENOMEM);
3071 if ((ret = mxf_add_metadata_set(mxf, segment))) {
3072 mxf_free_metadataset((MXFMetadataSet**)&segment, 1);
3076 /* Make sure we have nonzero unique index_sid, body_sid will be ok, because
3077 * using the same SID for index is forbidden in MXF. */
3078 if (!track->index_sid)
3079 track->index_sid = track->body_sid;
3081 segment->type = IndexTableSegment;
3082 /* stream will be treated as small EditUnitByteCount */
3083 segment->edit_unit_byte_count = edit_unit_byte_count;
3084 segment->index_start_position = 0;
3085 segment->index_duration = st->duration;
3086 segment->index_edit_rate = av_inv_q(st->time_base);
3087 segment->index_sid = track->index_sid;
3088 segment->body_sid = p->body_sid;
3092 static void mxf_read_random_index_pack(AVFormatContext *s)
3094 MXFContext *mxf = s->priv_data;
3096 int64_t file_size, max_rip_length, min_rip_length;
3099 if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL))
3102 file_size = avio_size(s->pb);
3104 /* S377m says to check the RIP length for "silly" values, without defining "silly".
3105 * The limit below assumes a file with nothing but partition packs and a RIP.
3106 * Before changing this, consider that a muxer may place each sample in its own partition.
3108 * 105 is the size of the smallest possible PartitionPack
3109 * 12 is the size of each RIP entry
3110 * 28 is the size of the RIP header and footer, assuming an 8-byte BER
3112 max_rip_length = ((file_size - mxf->run_in) / 105) * 12 + 28;
3113 max_rip_length = FFMIN(max_rip_length, INT_MAX); //2 GiB and up is also silly
3115 /* We're only interested in RIPs with at least two entries.. */
3116 min_rip_length = 16+1+24+4;
3118 /* See S377m section 11 */
3119 avio_seek(s->pb, file_size - 4, SEEK_SET);
3120 length = avio_rb32(s->pb);
3122 if (length < min_rip_length || length > max_rip_length)
3124 avio_seek(s->pb, file_size - length, SEEK_SET);
3125 if (klv_read_packet(&klv, s->pb) < 0 ||
3126 !IS_KLV_KEY(klv.key, mxf_random_index_pack_key) ||
3127 klv.length != length - 20)
3130 avio_skip(s->pb, klv.length - 12);
3131 mxf->footer_partition = avio_rb64(s->pb);
3134 if (mxf->run_in + mxf->footer_partition >= file_size) {
3135 av_log(s, AV_LOG_WARNING, "bad FooterPartition in RIP - ignoring\n");
3136 mxf->footer_partition = 0;
3140 avio_seek(s->pb, mxf->run_in, SEEK_SET);
3143 static int mxf_read_header(AVFormatContext *s)
3145 MXFContext *mxf = s->priv_data;
3147 int64_t essence_offset = 0;
3150 mxf->last_forward_tell = INT64_MAX;
3152 if (!mxf_read_sync(s->pb, mxf_header_partition_pack_key, 14)) {
3153 av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n");
3154 return AVERROR_INVALIDDATA;
3156 avio_seek(s->pb, -14, SEEK_CUR);
3158 mxf->run_in = avio_tell(s->pb);
3160 mxf_read_random_index_pack(s);
3162 while (!avio_feof(s->pb)) {
3163 const MXFMetadataReadTableEntry *metadata;
3165 if (klv_read_packet(&klv, s->pb) < 0) {
3166 /* EOF - seek to previous partition or stop */
3167 if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
3173 PRINT_KEY(s, "read header", klv.key);
3174 av_log(s, AV_LOG_TRACE, "size %"PRIu64" offset %#"PRIx64"\n", klv.length, klv.offset);
3175 if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key) ||
3176 IS_KLV_KEY(klv.key, mxf_essence_element_key) ||
3177 IS_KLV_KEY(klv.key, mxf_canopus_essence_element_key) ||
3178 IS_KLV_KEY(klv.key, mxf_avid_essence_element_key) ||
3179 IS_KLV_KEY(klv.key, mxf_system_item_key_cp) ||
3180 IS_KLV_KEY(klv.key, mxf_system_item_key_gc)) {
3182 if (!mxf->current_partition) {
3183 av_log(mxf->fc, AV_LOG_ERROR, "found essence prior to first PartitionPack\n");
3184 return AVERROR_INVALIDDATA;
3187 if (!mxf->current_partition->first_essence_klv.offset)
3188 mxf->current_partition->first_essence_klv = klv;
3190 if (!essence_offset)
3191 essence_offset = klv.offset;
3193 /* seek to footer, previous partition or stop */
3194 if (mxf_parse_handle_essence(mxf) <= 0)
3197 } else if (mxf_is_partition_pack_key(klv.key) && mxf->current_partition) {
3198 /* next partition pack - keep going, seek to previous partition or stop */
3199 if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
3201 else if (mxf->parsing_backward)
3203 /* we're still parsing forward. proceed to parsing this partition pack */
3206 for (metadata = mxf_metadata_read_table; metadata->read; metadata++) {
3207 if (IS_KLV_KEY(klv.key, metadata->key)) {
3208 if ((ret = mxf_parse_klv(mxf, klv, metadata->read, metadata->ctx_size, metadata->type)) < 0)
3213 if (!metadata->read) {
3214 av_log(s, AV_LOG_VERBOSE, "Dark key " PRIxUID "\n",
3216 avio_skip(s->pb, klv.length);
3219 /* FIXME avoid seek */
3220 if (!essence_offset) {
3221 av_log(s, AV_LOG_ERROR, "no essence\n");
3222 ret = AVERROR_INVALIDDATA;
3225 avio_seek(s->pb, essence_offset, SEEK_SET);
3227 /* we need to do this before computing the index tables
3228 * to be able to fill in zero IndexDurations with st->duration */
3229 if ((ret = mxf_parse_structural_metadata(mxf)) < 0)
3232 for (int i = 0; i < s->nb_streams; i++)
3233 mxf_handle_missing_index_segment(mxf, s->streams[i]);
3235 if ((ret = mxf_compute_index_tables(mxf)) < 0)
3238 if (mxf->nb_index_tables > 1) {
3239 /* TODO: look up which IndexSID to use via EssenceContainerData */
3240 av_log(mxf->fc, AV_LOG_INFO, "got %i index tables - only the first one (IndexSID %i) will be used\n",
3241 mxf->nb_index_tables, mxf->index_tables[0].index_sid);
3242 } else if (mxf->nb_index_tables == 0 && mxf->op == OPAtom && (s->error_recognition & AV_EF_EXPLODE)) {
3243 av_log(mxf->fc, AV_LOG_ERROR, "cannot demux OPAtom without an index\n");
3244 ret = AVERROR_INVALIDDATA;
3248 mxf_compute_essence_containers(s);
3250 for (int i = 0; i < s->nb_streams; i++)
3251 mxf_compute_edit_units_per_packet(mxf, s->streams[i]);
3260 /* Get the edit unit of the next packet from current_offset in a track. The returned edit unit can be original_duration as well! */
3261 static int mxf_get_next_track_edit_unit(MXFContext *mxf, MXFTrack *track, int64_t current_offset, int64_t *edit_unit_out)
3263 int64_t a, b, m, offset;
3264 MXFIndexTable *t = mxf_find_index_table(mxf, track->index_sid);
3266 if (!t || track->original_duration <= 0)
3270 b = track->original_duration;
3274 if (mxf_edit_unit_absolute_offset(mxf, t, m, track->edit_rate, NULL, &offset, NULL, 0) < 0)
3276 if (offset < current_offset)
3287 static int64_t mxf_compute_sample_count(MXFContext *mxf, AVStream *st,
3290 int i, total = 0, size = 0;
3291 MXFTrack *track = st->priv_data;
3292 AVRational time_base = av_inv_q(track->edit_rate);
3293 AVRational sample_rate = av_inv_q(st->time_base);
3294 const MXFSamplesPerFrame *spf = NULL;
3295 int64_t sample_count;
3297 // For non-audio sample_count equals current edit unit
3298 if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
3301 if ((sample_rate.num / sample_rate.den) == 48000)
3302 spf = ff_mxf_get_samples_per_frame(mxf->fc, time_base);
3304 int remainder = (sample_rate.num * time_base.num) %
3305 (time_base.den * sample_rate.den);
3307 av_log(mxf->fc, AV_LOG_WARNING,
3308 "seeking detected on stream #%d with time base (%d/%d) and "
3309 "sample rate (%d/%d), audio pts won't be accurate.\n",
3310 st->index, time_base.num, time_base.den,
3311 sample_rate.num, sample_rate.den);
3312 return av_rescale_q(edit_unit, sample_rate, track->edit_rate);
3315 while (spf->samples_per_frame[size]) {
3316 total += spf->samples_per_frame[size];
3322 sample_count = (edit_unit / size) * (uint64_t)total;
3323 for (i = 0; i < edit_unit % size; i++) {
3324 sample_count += spf->samples_per_frame[i];
3327 return sample_count;
3331 * Make sure track->sample_count is correct based on what offset we're currently at.
3332 * Also determine the next edit unit (or packet) offset.
3333 * @return next_ofs if OK, <0 on error
3335 static int64_t mxf_set_current_edit_unit(MXFContext *mxf, AVStream *st, int64_t current_offset, int resync)
3337 int64_t next_ofs = -1;
3338 MXFTrack *track = st->priv_data;
3339 int64_t edit_unit = av_rescale_q(track->sample_count, st->time_base, av_inv_q(track->edit_rate));
3340 int64_t new_edit_unit;
3341 MXFIndexTable *t = mxf_find_index_table(mxf, track->index_sid);
3343 if (!t || track->wrapping == UnknownWrapped)
3346 if (mxf_edit_unit_absolute_offset(mxf, t, edit_unit + track->edit_units_per_packet, track->edit_rate, NULL, &next_ofs, NULL, 0) < 0 &&
3347 (next_ofs = mxf_essence_container_end(mxf, t->body_sid)) <= 0) {
3348 av_log(mxf->fc, AV_LOG_ERROR, "unable to compute the size of the last packet\n");
3352 /* check if the next edit unit offset (next_ofs) starts ahead of current_offset */
3353 if (next_ofs > current_offset)
3357 av_log(mxf->fc, AV_LOG_ERROR, "cannot find current edit unit for stream %d, invalid index?\n", st->index);
3361 if (mxf_get_next_track_edit_unit(mxf, track, current_offset + 1, &new_edit_unit) < 0 || new_edit_unit <= 0) {
3362 av_log(mxf->fc, AV_LOG_ERROR, "failed to find next track edit unit in stream %d\n", st->index);
3367 track->sample_count = mxf_compute_sample_count(mxf, st, new_edit_unit);
3368 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);
3370 return mxf_set_current_edit_unit(mxf, st, current_offset, 0);
3373 static int mxf_set_audio_pts(MXFContext *mxf, AVCodecParameters *par,
3376 AVStream *st = mxf->fc->streams[pkt->stream_index];
3377 MXFTrack *track = st->priv_data;
3378 int64_t bits_per_sample = par->bits_per_coded_sample;
3380 if (!bits_per_sample)
3381 bits_per_sample = av_get_bits_per_sample(par->codec_id);
3383 pkt->pts = track->sample_count;
3385 if ( par->channels <= 0
3386 || bits_per_sample <= 0
3387 || par->channels * (int64_t)bits_per_sample < 8)
3388 track->sample_count = mxf_compute_sample_count(mxf, st, av_rescale_q(track->sample_count, st->time_base, av_inv_q(track->edit_rate)) + 1);
3390 track->sample_count += pkt->size / (par->channels * (int64_t)bits_per_sample / 8);
3395 static int mxf_set_pts(MXFContext *mxf, AVStream *st, AVPacket *pkt)
3397 AVCodecParameters *par = st->codecpar;
3398 MXFTrack *track = st->priv_data;
3400 if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
3401 /* see if we have an index table to derive timestamps from */
3402 MXFIndexTable *t = mxf_find_index_table(mxf, track->index_sid);
3404 if (t && track->sample_count < t->nb_ptses) {
3405 pkt->dts = track->sample_count + t->first_dts;
3406 pkt->pts = t->ptses[track->sample_count];
3407 } else if (track->intra_only) {
3408 /* intra-only -> PTS = EditUnit.
3409 * let utils.c figure out DTS since it can be < PTS if low_delay = 0 (Sony IMX30) */
3410 pkt->pts = track->sample_count;
3412 track->sample_count++;
3413 } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
3414 int ret = mxf_set_audio_pts(mxf, par, pkt);
3418 pkt->dts = pkt->pts = track->sample_count;
3420 track->sample_count++;
3425 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
3428 MXFContext *mxf = s->priv_data;
3432 int64_t max_data_size;
3433 int64_t pos = avio_tell(s->pb);
3435 if (pos < mxf->current_klv_data.next_klv - mxf->current_klv_data.length || pos >= mxf->current_klv_data.next_klv) {
3436 mxf->current_klv_data = (KLVPacket){{0}};
3437 ret = klv_read_packet(&klv, s->pb);
3440 max_data_size = klv.length;
3441 pos = klv.next_klv - klv.length;
3442 PRINT_KEY(s, "read packet", klv.key);
3443 av_log(s, AV_LOG_TRACE, "size %"PRIu64" offset %#"PRIx64"\n", klv.length, klv.offset);
3444 if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key)) {
3445 ret = mxf_decrypt_triplet(s, pkt, &klv);
3447 av_log(s, AV_LOG_ERROR, "invalid encoded triplet\n");
3453 klv = mxf->current_klv_data;
3454 max_data_size = klv.next_klv - pos;
3456 if (IS_KLV_KEY(klv.key, mxf_essence_element_key) ||
3457 IS_KLV_KEY(klv.key, mxf_canopus_essence_element_key) ||
3458 IS_KLV_KEY(klv.key, mxf_avid_essence_element_key)) {
3459 int body_sid = find_body_sid_by_offset(mxf, klv.offset);
3460 int index = mxf_get_stream_index(s, &klv, body_sid);
3466 av_log(s, AV_LOG_ERROR,
3467 "error getting stream index %"PRIu32"\n",
3468 AV_RB32(klv.key + 12));
3472 st = s->streams[index];
3473 track = st->priv_data;
3475 if (s->streams[index]->discard == AVDISCARD_ALL)
3478 next_ofs = mxf_set_current_edit_unit(mxf, st, pos, 1);
3480 if (track->wrapping != FrameWrapped) {
3483 if (next_ofs <= 0) {
3484 // If we have no way to packetize the data, then return it in chunks...
3485 if (klv.next_klv - klv.length == pos && max_data_size > MXF_MAX_CHUNK_SIZE) {
3486 st->need_parsing = AVSTREAM_PARSE_FULL;
3487 avpriv_request_sample(s, "Huge KLV without proper index in non-frame wrapped essence");
3489 size = FFMIN(max_data_size, MXF_MAX_CHUNK_SIZE);
3491 if ((size = next_ofs - pos) <= 0) {
3492 av_log(s, AV_LOG_ERROR, "bad size: %"PRId64"\n", size);
3493 ret = AVERROR_INVALIDDATA;
3496 // We must not overread, because the next edit unit might be in another KLV
3497 if (size > max_data_size)
3498 size = max_data_size;
3501 mxf->current_klv_data = klv;
3504 klv.next_klv = klv.offset + klv.length;
3507 /* check for 8 channels AES3 element */
3508 if (klv.key[12] == 0x06 && klv.key[13] == 0x01 && klv.key[14] == 0x10) {
3509 ret = mxf_get_d10_aes3_packet(s->pb, s->streams[index],
3512 av_log(s, AV_LOG_ERROR, "error reading D-10 aes3 frame\n");
3513 mxf->current_klv_data = (KLVPacket){{0}};
3516 } else if (mxf->eia608_extract &&
3517 s->streams[index]->codecpar->codec_id == AV_CODEC_ID_EIA_608) {
3518 ret = mxf_get_eia608_packet(s, s->streams[index], pkt, klv.length);
3520 mxf->current_klv_data = (KLVPacket){{0}};
3524 ret = av_get_packet(s->pb, pkt, klv.length);
3526 mxf->current_klv_data = (KLVPacket){{0}};
3530 pkt->stream_index = index;
3531 pkt->pos = klv.offset;
3533 ret = mxf_set_pts(mxf, st, pkt);
3535 mxf->current_klv_data = (KLVPacket){{0}};
3539 /* seek for truncated packets */
3540 avio_seek(s->pb, klv.next_klv, SEEK_SET);
3545 avio_skip(s->pb, max_data_size);
3546 mxf->current_klv_data = (KLVPacket){{0}};
3549 return avio_feof(s->pb) ? AVERROR_EOF : ret;
3552 static int mxf_read_close(AVFormatContext *s)
3554 MXFContext *mxf = s->priv_data;
3557 av_freep(&mxf->packages_refs);
3558 av_freep(&mxf->essence_container_data_refs);
3560 for (i = 0; i < s->nb_streams; i++)
3561 s->streams[i]->priv_data = NULL;
3563 for (i = 0; i < mxf->metadata_sets_count; i++) {
3564 mxf_free_metadataset(mxf->metadata_sets + i, 1);
3566 av_freep(&mxf->partitions);
3567 av_freep(&mxf->metadata_sets);
3568 av_freep(&mxf->aesc);
3569 av_freep(&mxf->local_tags);
3571 if (mxf->index_tables) {
3572 for (i = 0; i < mxf->nb_index_tables; i++) {
3573 av_freep(&mxf->index_tables[i].segments);
3574 av_freep(&mxf->index_tables[i].ptses);
3575 av_freep(&mxf->index_tables[i].fake_index);
3576 av_freep(&mxf->index_tables[i].offsets);
3579 av_freep(&mxf->index_tables);
3584 static int mxf_probe(const AVProbeData *p) {
3585 const uint8_t *bufp = p->buf;
3586 const uint8_t *end = p->buf + p->buf_size;
3588 if (p->buf_size < sizeof(mxf_header_partition_pack_key))
3591 /* Must skip Run-In Sequence and search for MXF header partition pack key SMPTE 377M 5.5 */
3592 end -= sizeof(mxf_header_partition_pack_key);
3594 for (; bufp < end;) {
3595 if (!((bufp[13] - 1) & 0xF2)){
3596 if (AV_RN32(bufp ) == AV_RN32(mxf_header_partition_pack_key ) &&
3597 AV_RN32(bufp+ 4) == AV_RN32(mxf_header_partition_pack_key+ 4) &&
3598 AV_RN32(bufp+ 8) == AV_RN32(mxf_header_partition_pack_key+ 8) &&
3599 AV_RN16(bufp+12) == AV_RN16(mxf_header_partition_pack_key+12))
3600 return AVPROBE_SCORE_MAX;
3609 /* rudimentary byte seek */
3610 /* XXX: use MXF Index */
3611 static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
3613 AVStream *st = s->streams[stream_index];
3615 MXFContext* mxf = s->priv_data;
3619 MXFTrack *source_track = st->priv_data;
3624 /* if audio then truncate sample_time to EditRate */
3625 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
3626 sample_time = av_rescale_q(sample_time, st->time_base,
3627 av_inv_q(source_track->edit_rate));
3629 if (mxf->nb_index_tables <= 0) {
3631 return AVERROR_INVALIDDATA;
3632 if (sample_time < 0)
3634 seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den);
3636 seekpos = avio_seek(s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET);
3640 ff_update_cur_dts(s, st, sample_time);
3641 mxf->current_klv_data = (KLVPacket){{0}};
3643 MXFPartition *partition;
3645 t = &mxf->index_tables[0];
3646 if (t->index_sid != source_track->index_sid) {
3647 /* If the first index table does not belong to the stream, then find a stream which does belong to the index table */
3648 for (i = 0; i < s->nb_streams; i++) {
3649 MXFTrack *new_source_track = s->streams[i]->priv_data;
3650 if (new_source_track && new_source_track->index_sid == t->index_sid) {
3651 sample_time = av_rescale_q(sample_time, new_source_track->edit_rate, source_track->edit_rate);
3652 source_track = new_source_track;
3657 if (i == s->nb_streams)
3658 return AVERROR_INVALIDDATA;
3661 /* clamp above zero, else ff_index_search_timestamp() returns negative
3662 * this also means we allow seeking before the start */
3663 sample_time = FFMAX(sample_time, 0);
3665 if (t->fake_index) {
3666 /* The first frames may not be keyframes in presentation order, so
3667 * we have to advance the target to be able to find the first
3668 * keyframe backwards... */
3669 if (!(flags & AVSEEK_FLAG_ANY) &&
3670 (flags & AVSEEK_FLAG_BACKWARD) &&
3671 t->ptses[0] != AV_NOPTS_VALUE &&
3672 sample_time < t->ptses[0] &&
3673 (t->fake_index[t->ptses[0]].flags & AVINDEX_KEYFRAME))
3674 sample_time = t->ptses[0];
3676 /* behave as if we have a proper index */
3677 if ((sample_time = ff_index_search_timestamp(t->fake_index, t->nb_ptses, sample_time, flags)) < 0)
3679 /* get the stored order index from the display order index */
3680 sample_time += t->offsets[sample_time];
3682 /* no IndexEntryArray (one or more CBR segments)
3683 * make sure we don't seek past the end */
3684 sample_time = FFMIN(sample_time, source_track->original_duration - 1);
3687 if (source_track->wrapping == UnknownWrapped)
3688 av_log(mxf->fc, AV_LOG_WARNING, "attempted seek in an UnknownWrapped essence\n");
3690 if ((ret = mxf_edit_unit_absolute_offset(mxf, t, sample_time, source_track->edit_rate, &sample_time, &seekpos, &partition, 1)) < 0)
3693 ff_update_cur_dts(s, st, sample_time);
3694 if (source_track->wrapping == ClipWrapped) {
3695 KLVPacket klv = partition->first_essence_klv;
3696 if (seekpos < klv.next_klv - klv.length || seekpos >= klv.next_klv) {
3697 av_log(mxf->fc, AV_LOG_ERROR, "attempted seek out of clip wrapped KLV\n");
3698 return AVERROR_INVALIDDATA;
3700 mxf->current_klv_data = klv;
3702 mxf->current_klv_data = (KLVPacket){{0}};
3704 avio_seek(s->pb, seekpos, SEEK_SET);
3707 // Update all tracks sample count
3708 for (i = 0; i < s->nb_streams; i++) {
3709 AVStream *cur_st = s->streams[i];
3710 MXFTrack *cur_track = cur_st->priv_data;
3712 int64_t track_edit_unit = sample_time;
3714 mxf_get_next_track_edit_unit(mxf, cur_track, seekpos, &track_edit_unit);
3715 cur_track->sample_count = mxf_compute_sample_count(mxf, cur_st, track_edit_unit);
3721 static const AVOption options[] = {
3722 { "eia608_extract", "extract eia 608 captions from s436m track",
3723 offsetof(MXFContext, eia608_extract), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
3724 AV_OPT_FLAG_DECODING_PARAM },
3728 static const AVClass demuxer_class = {
3729 .class_name = "mxf",
3730 .item_name = av_default_item_name,
3732 .version = LIBAVUTIL_VERSION_INT,
3733 .category = AV_CLASS_CATEGORY_DEMUXER,
3736 AVInputFormat ff_mxf_demuxer = {
3738 .long_name = NULL_IF_CONFIG_SMALL("MXF (Material eXchange Format)"),
3739 .flags = AVFMT_SEEK_TO_PTS,
3740 .priv_data_size = sizeof(MXFContext),
3741 .read_probe = mxf_probe,
3742 .read_header = mxf_read_header,
3743 .read_packet = mxf_read_packet,
3744 .read_close = mxf_read_close,
3745 .read_seek = mxf_read_seek,
3746 .priv_class = &demuxer_class,