• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * MXF demuxer.
3  * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21 
22 /*
23  * References
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
31  *
32  * Principle
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.
38  *
39  * Metadata reading functions read Local Tags, get InstanceUID(0x3C0A) then add MetaDataSet to MXFContext.
40  * Metadata parsing resolves Strong References to objects.
41  *
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
44  */
45 
46 #include <inttypes.h>
47 
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"
56 #include "avformat.h"
57 #include "internal.h"
58 #include "mxf.h"
59 
60 #define MXF_MAX_CHUNK_SIZE (32 << 20)
61 
62 typedef enum {
63     Header,
64     BodyPartition,
65     Footer
66 } MXFPartitionType;
67 
68 typedef enum {
69     OP1a = 1,
70     OP1b,
71     OP1c,
72     OP2a,
73     OP2b,
74     OP2c,
75     OP3a,
76     OP3b,
77     OP3c,
78     OPAtom,
79     OPSONYOpt,  /* FATE sample, violates the spec in places */
80 } MXFOP;
81 
82 typedef enum {
83     UnknownWrapped = 0,
84     FrameWrapped,
85     ClipWrapped,
86 } MXFWrappingScheme;
87 
88 typedef struct MXFPartition {
89     int closed;
90     int complete;
91     MXFPartitionType type;
92     uint64_t previous_partition;
93     int index_sid;
94     int body_sid;
95     int64_t this_partition;
96     int64_t essence_offset;         ///< absolute offset of essence
97     int64_t essence_length;
98     int32_t kag_size;
99     int64_t header_byte_count;
100     int64_t index_byte_count;
101     int pack_length;
102     int64_t pack_ofs;               ///< absolute offset of pack in file, including run-in
103     int64_t body_offset;
104     KLVPacket first_essence_klv;
105 } MXFPartition;
106 
107 typedef struct MXFCryptoContext {
108     UID uid;
109     enum MXFMetadataSetType type;
110     UID source_container_ul;
111 } MXFCryptoContext;
112 
113 typedef struct MXFStructuralComponent {
114     UID uid;
115     enum MXFMetadataSetType type;
116     UID source_package_ul;
117     UID source_package_uid;
118     UID data_definition_ul;
119     int64_t duration;
120     int64_t start_position;
121     int source_track_id;
122 } MXFStructuralComponent;
123 
124 typedef struct MXFSequence {
125     UID uid;
126     enum MXFMetadataSetType type;
127     UID data_definition_ul;
128     UID *structural_components_refs;
129     int structural_components_count;
130     int64_t duration;
131     uint8_t origin;
132 } MXFSequence;
133 
134 typedef struct MXFTimecodeComponent {
135     UID uid;
136     enum MXFMetadataSetType type;
137     int drop_frame;
138     int start_frame;
139     struct AVRational rate;
140     AVTimecode tc;
141 } MXFTimecodeComponent;
142 
143 typedef struct {
144     UID uid;
145     enum MXFMetadataSetType type;
146     UID input_segment_ref;
147 } MXFPulldownComponent;
148 
149 typedef struct {
150     UID uid;
151     enum MXFMetadataSetType type;
152     UID *structural_components_refs;
153     int structural_components_count;
154     int64_t duration;
155 } MXFEssenceGroup;
156 
157 typedef struct {
158     UID uid;
159     enum MXFMetadataSetType type;
160     char *name;
161     char *value;
162 } MXFTaggedValue;
163 
164 typedef struct {
165     UID uid;
166     enum MXFMetadataSetType type;
167     MXFSequence *sequence; /* mandatory, and only one */
168     UID sequence_ref;
169     int track_id;
170     char *name;
171     uint8_t track_number[4];
172     AVRational edit_rate;
173     int intra_only;
174     uint64_t sample_count;
175     int64_t original_duration; /* st->duration in SampleRate/EditRate units */
176     int index_sid;
177     int body_sid;
178     MXFWrappingScheme wrapping;
179     int edit_units_per_packet; /* how many edit units to read at a time (PCM, ClipWrapped) */
180 } MXFTrack;
181 
182 typedef struct MXFDescriptor {
183     UID uid;
184     enum MXFMetadataSetType type;
185     UID essence_container_ul;
186     UID essence_codec_ul;
187     UID codec_ul;
188     AVRational sample_rate;
189     AVRational aspect_ratio;
190     int width;
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 */
197     int field_dominance;
198     int channels;
199     int bits_per_sample;
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;
206     int linked_track_id;
207     uint8_t *extradata;
208     int extradata_size;
209     enum AVPixelFormat pix_fmt;
210 } MXFDescriptor;
211 
212 typedef struct MXFIndexTableSegment {
213     UID uid;
214     enum MXFMetadataSetType type;
215     int edit_unit_byte_count;
216     int index_sid;
217     int body_sid;
218     AVRational index_edit_rate;
219     uint64_t index_start_position;
220     uint64_t index_duration;
221     int8_t *temporal_offset_entries;
222     int *flag_entries;
223     uint64_t *stream_offset_entries;
224     int nb_index_entries;
225 } MXFIndexTableSegment;
226 
227 typedef struct MXFPackage {
228     UID uid;
229     enum MXFMetadataSetType type;
230     UID package_uid;
231     UID package_ul;
232     UID *tracks_refs;
233     int tracks_count;
234     MXFDescriptor *descriptor; /* only one */
235     UID descriptor_ref;
236     char *name;
237     UID *comment_refs;
238     int comment_count;
239 } MXFPackage;
240 
241 typedef struct MXFEssenceContainerData {
242     UID uid;
243     enum MXFMetadataSetType type;
244     UID package_uid;
245     UID package_ul;
246     int index_sid;
247     int body_sid;
248 } MXFEssenceContainerData;
249 
250 typedef struct MXFMetadataSet {
251     UID uid;
252     enum MXFMetadataSetType type;
253 } MXFMetadataSet;
254 
255 /* decoded index table */
256 typedef struct MXFIndexTable {
257     int index_sid;
258     int body_sid;
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 */
262     int nb_segments;
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 */
266 } MXFIndexTable;
267 
268 typedef struct MXFContext {
269     const AVClass *class;     /**< Class for private options. */
270     MXFPartition *partitions;
271     unsigned partitions_count;
272     MXFOP op;
273     UID *packages_refs;
274     int packages_count;
275     UID *essence_container_data_refs;
276     int essence_container_data_count;
277     MXFMetadataSet **metadata_sets;
278     int metadata_sets_count;
279     AVFormatContext *fc;
280     struct AVAES *aesc;
281     uint8_t *local_tags;
282     int local_tags_count;
283     uint64_t footer_partition;
284     KLVPacket current_klv_data;
285     int run_in;
286     MXFPartition *current_partition;
287     int parsing_backward;
288     int64_t last_forward_tell;
289     int last_forward_partition;
290     int nb_index_tables;
291     MXFIndexTable *index_tables;
292     int eia608_extract;
293 } MXFContext;
294 
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);
297 
298 typedef struct MXFMetadataReadTableEntry {
299     const UID key;
300     MXFMetadataReadFunc *read;
301     int ctx_size;
302     enum MXFMetadataSetType type;
303 } MXFMetadataReadTableEntry;
304 
305 static int mxf_read_close(AVFormatContext *s);
306 
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 };
325 
326 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y)))
327 
mxf_free_metadataset(MXFMetadataSet ** ctx,int freectx)328 static void mxf_free_metadataset(MXFMetadataSet **ctx, int freectx)
329 {
330     MXFIndexTableSegment *seg;
331     switch ((*ctx)->type) {
332     case Descriptor:
333     case MultipleDescriptor:
334         av_freep(&((MXFDescriptor *)*ctx)->extradata);
335         av_freep(&((MXFDescriptor *)*ctx)->sub_descriptors_refs);
336         break;
337     case Sequence:
338         av_freep(&((MXFSequence *)*ctx)->structural_components_refs);
339         break;
340     case EssenceGroup:
341         av_freep(&((MXFEssenceGroup *)*ctx)->structural_components_refs);
342         break;
343     case SourcePackage:
344     case MaterialPackage:
345         av_freep(&((MXFPackage *)*ctx)->tracks_refs);
346         av_freep(&((MXFPackage *)*ctx)->name);
347         av_freep(&((MXFPackage *)*ctx)->comment_refs);
348         break;
349     case TaggedValue:
350         av_freep(&((MXFTaggedValue *)*ctx)->name);
351         av_freep(&((MXFTaggedValue *)*ctx)->value);
352         break;
353     case Track:
354         av_freep(&((MXFTrack *)*ctx)->name);
355         break;
356     case IndexTableSegment:
357         seg = (MXFIndexTableSegment *)*ctx;
358         av_freep(&seg->temporal_offset_entries);
359         av_freep(&seg->flag_entries);
360         av_freep(&seg->stream_offset_entries);
361     default:
362         break;
363     }
364     if (freectx) {
365         av_freep(ctx);
366     }
367 }
368 
klv_decode_ber_length(AVIOContext * pb)369 static int64_t klv_decode_ber_length(AVIOContext *pb)
370 {
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 */
375         if (bytes_num > 8)
376             return AVERROR_INVALIDDATA;
377         size = 0;
378         while (bytes_num--)
379             size = size << 8 | avio_r8(pb);
380     }
381     if (size > INT64_MAX)
382         return AVERROR_INVALIDDATA;
383     return size;
384 }
385 
mxf_read_sync(AVIOContext * pb,const uint8_t * key,unsigned size)386 static int mxf_read_sync(AVIOContext *pb, const uint8_t *key, unsigned size)
387 {
388     int i, b;
389     for (i = 0; i < size && !avio_feof(pb); i++) {
390         b = avio_r8(pb);
391         if (b == key[0])
392             i = 0;
393         else if (b != key[i])
394             i = -1;
395     }
396     return i == size;
397 }
398 
klv_read_packet(KLVPacket * klv,AVIOContext * pb)399 static int klv_read_packet(KLVPacket *klv, AVIOContext *pb)
400 {
401     int64_t length, pos;
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);
408     if (length < 0)
409         return length;
410     klv->length = length;
411     pos = avio_tell(pb);
412     if (pos > INT64_MAX - length)
413         return AVERROR_INVALIDDATA;
414     klv->next_klv = pos + length;
415     return 0;
416 }
417 
mxf_get_stream_index(AVFormatContext * s,KLVPacket * klv,int body_sid)418 static int mxf_get_stream_index(AVFormatContext *s, KLVPacket *klv, int body_sid)
419 {
420     int i;
421 
422     for (i = 0; i < s->nb_streams; i++) {
423         MXFTrack *track = s->streams[i]->priv_data;
424         /* SMPTE 379M 7.3 */
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)))
426             return i;
427     }
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;
430 }
431 
find_body_sid_by_absolute_offset(MXFContext * mxf,int64_t offset)432 static int find_body_sid_by_absolute_offset(MXFContext *mxf, int64_t offset)
433 {
434     // we look for partition where the offset is placed
435     int a, b, m;
436     int64_t pack_ofs;
437 
438     a = -1;
439     b = mxf->partitions_count;
440 
441     while (b - a > 1) {
442         m = (a + b) >> 1;
443         pack_ofs = mxf->partitions[m].pack_ofs;
444         if (pack_ofs <= offset)
445             a = m;
446         else
447             b = m;
448     }
449 
450     if (a == -1)
451         return 0;
452     return mxf->partitions[a].body_sid;
453 }
454 
mxf_get_eia608_packet(AVFormatContext * s,AVStream * st,AVPacket * pkt,int64_t length)455 static int mxf_get_eia608_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt, int64_t length)
456 {
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;
461     int i, ret;
462 
463     if (count != 1)
464         av_log(s, AV_LOG_WARNING, "unsupported multiple ANC packets (%d) per KLV packet\n", count);
465 
466     for (i = 0; i < count; i++) {
467         if (length < 6) {
468             av_log(s, AV_LOG_ERROR, "error reading s436m packet %"PRId64"\n", length);
469             return AVERROR_INVALIDDATA;
470         }
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)
477             continue;
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");
480             continue;
481         }
482         if (length < 0)
483             return AVERROR_INVALIDDATA;
484 
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);
492             continue;
493         }
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;
498         }
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;
507         }
508         cc_count = avio_r8(s->pb) & 0x1f;
509         ret = av_get_packet(s->pb, pkt, cc_count * 3);
510         if (ret < 0)
511             return ret;
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;
515         }
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;
521         }
522         avio_rb16(s->pb); // cdp_ftr_sequence_cntr
523         avio_r8(s->pb); // packet_checksum
524         break;
525     }
526 
527     return 0;
528 }
529 
530 /* XXX: use AVBitStreamFilter */
mxf_get_d10_aes3_packet(AVIOContext * pb,AVStream * st,AVPacket * pkt,int64_t length)531 static int mxf_get_d10_aes3_packet(AVIOContext *pb, AVStream *st, AVPacket *pkt, int64_t length)
532 {
533     const uint8_t *buf_ptr, *end_ptr;
534     uint8_t *data_ptr;
535     int i;
536 
537     if (length > 61444) /* worst case PAL 1920 samples 8 channels */
538         return AVERROR_INVALIDDATA;
539     length = av_get_packet(pb, pkt, length);
540     if (length < 0)
541         return 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);
550             else
551                 bytestream_put_le16(&data_ptr, (sample >> 12) & 0xffff);
552         }
553         buf_ptr += 32 - st->codecpar->channels*4; // always 8 channels stored SMPTE 331M
554     }
555     av_shrink_packet(pkt, data_ptr - pkt->data);
556     return 0;
557 }
558 
mxf_decrypt_triplet(AVFormatContext * s,AVPacket * pkt,KLVPacket * klv)559 static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv)
560 {
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;
565     int64_t size;
566     uint64_t orig_size;
567     uint64_t plaintext_size;
568     uint8_t ivec[16];
569     uint8_t tmpbuf[16];
570     int index;
571     int body_sid;
572 
573     if (!mxf->aesc && s->key && s->keylen == 16) {
574         mxf->aesc = av_aes_alloc();
575         if (!mxf->aesc)
576             return AVERROR(ENOMEM);
577         av_aes_init(mxf->aesc, s->key, 128, 1);
578     }
579     // crypto context
580     size = klv_decode_ber_length(pb);
581     if (size < 0)
582         return size;
583     avio_skip(pb, size);
584     // plaintext offset
585     klv_decode_ber_length(pb);
586     plaintext_size = avio_rb64(pb);
587     // source klv key
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;
592 
593     body_sid = find_body_sid_by_absolute_offset(mxf, klv->offset);
594     index = mxf_get_stream_index(s, klv, body_sid);
595     if (index < 0)
596         return AVERROR_INVALIDDATA;
597     // source size
598     klv_decode_ber_length(pb);
599     orig_size = avio_rb64(pb);
600     if (orig_size < plaintext_size)
601         return AVERROR_INVALIDDATA;
602     // enc. code
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);
608     if (mxf->aesc)
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");
612     size -= 32;
613     size = av_get_packet(pb, pkt, size);
614     if (size < 0)
615         return size;
616     else if (size < plaintext_size)
617         return AVERROR_INVALIDDATA;
618     size -= plaintext_size;
619     if (mxf->aesc)
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));
625     return 0;
626 }
627 
mxf_read_primer_pack(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)628 static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
629 {
630     MXFContext *mxf = arg;
631     int item_num = avio_rb32(pb);
632     int item_len = avio_rb32(pb);
633 
634     if (item_len != 18) {
635         avpriv_request_sample(pb, "Primer pack item length %d", item_len);
636         return AVERROR_PATCHWELCOME;
637     }
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;
641     }
642     if (mxf->local_tags)
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);
651     return 0;
652 }
653 
mxf_read_partition_pack(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)654 static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
655 {
656     MXFContext *mxf = arg;
657     AVFormatContext *s = mxf->fc;
658     MXFPartition *partition, *tmp_part;
659     UID op;
660     uint64_t footer_partition;
661     uint32_t nb_essence_containers;
662 
663     if (mxf->partitions_count >= INT_MAX / 2)
664         return AVERROR_INVALIDDATA;
665 
666     tmp_part = av_realloc_array(mxf->partitions, mxf->partitions_count + 1, sizeof(*mxf->partitions));
667     if (!tmp_part)
668         return AVERROR(ENOMEM);
669     mxf->partitions = tmp_part;
670 
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];
678     } else {
679         mxf->last_forward_partition++;
680         partition = mxf->current_partition = &mxf->partitions[mxf->partitions_count];
681     }
682 
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;
687 
688     switch(uid[13]) {
689     case 2:
690         partition->type = Header;
691         break;
692     case 3:
693         partition->type = BodyPartition;
694         break;
695     case 4:
696         partition->type = Footer;
697         break;
698     default:
699         av_log(mxf->fc, AV_LOG_ERROR, "unknown partition type %i\n", uid[13]);
700         return AVERROR_INVALIDDATA;
701     }
702 
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;
706     avio_skip(pb, 4);
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;
719     }
720     nb_essence_containers = avio_rb32(pb);
721 
722     if (partition->type == Header) {
723         char str[36];
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_ul", str, 0);
726     }
727 
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) {
735             MXFPartition *prev =
736                 mxf->partitions + mxf->last_forward_partition - 2;
737             partition->previous_partition = prev->this_partition;
738         }
739         /* if no previous body partition are found point to the header
740          * partition */
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);
746     }
747 
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);
754         } else {
755             mxf->footer_partition = footer_partition;
756         }
757     }
758 
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);
766 
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;
774     }
775 
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;
793 
794             /* only nag once */
795             if (!mxf->op)
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");
800 
801             mxf->op = op;
802         } else
803             mxf->op = OPAtom;
804     } else {
805         av_log(mxf->fc, AV_LOG_ERROR, "unknown operational pattern: %02xh %02xh - guessing OP1a\n", op[12], op[13]);
806         mxf->op = OP1a;
807     }
808 
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);
812 
813         if (mxf->op == OPSONYOpt)
814             partition->kag_size = 512;
815         else
816             partition->kag_size = 1;
817 
818         av_log(mxf->fc, AV_LOG_WARNING, "%"PRId32"\n", partition->kag_size);
819     }
820 
821     return 0;
822 }
823 
mxf_add_metadata_set(MXFContext * mxf,void * metadata_set)824 static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
825 {
826     MXFMetadataSet **tmp;
827 
828     tmp = av_realloc_array(mxf->metadata_sets, mxf->metadata_sets_count + 1, sizeof(*mxf->metadata_sets));
829     if (!tmp)
830         return AVERROR(ENOMEM);
831     mxf->metadata_sets = tmp;
832     mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;
833     mxf->metadata_sets_count++;
834     return 0;
835 }
836 
mxf_read_cryptographic_context(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)837 static int mxf_read_cryptographic_context(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
838 {
839     MXFCryptoContext *cryptocontext = arg;
840     if (size != 16)
841         return AVERROR_INVALIDDATA;
842     if (IS_KLV_KEY(uid, mxf_crypto_source_container_ul))
843         avio_read(pb, cryptocontext->source_container_ul, 16);
844     return 0;
845 }
846 
mxf_read_strong_ref_array(AVIOContext * pb,UID ** refs,int * count)847 static int mxf_read_strong_ref_array(AVIOContext *pb, UID **refs, int *count)
848 {
849     *count = avio_rb32(pb);
850     *refs = av_calloc(*count, sizeof(UID));
851     if (!*refs) {
852         *count = 0;
853         return AVERROR(ENOMEM);
854     }
855     avio_skip(pb, 4); /* useless size of objects, always 16 according to specs */
856     avio_read(pb, (uint8_t *)*refs, *count * sizeof(UID));
857     return 0;
858 }
859 
mxf_read_utf16_string(AVIOContext * pb,int size,char ** str,int be)860 static inline int mxf_read_utf16_string(AVIOContext *pb, int size, char** str, int be)
861 {
862     int ret;
863     size_t buf_size;
864 
865     if (size < 0 || size > INT_MAX/2)
866         return AVERROR(EINVAL);
867 
868     buf_size = size + size / 2 + 1;
869     av_free(*str);
870     *str = av_malloc(buf_size);
871     if (!*str)
872         return AVERROR(ENOMEM);
873 
874     if (be)
875         ret = avio_get_str16be(pb, size, *str, buf_size);
876     else
877         ret = avio_get_str16le(pb, size, *str, buf_size);
878 
879     if (ret < 0) {
880         av_freep(str);
881         return ret;
882     }
883 
884     return ret;
885 }
886 
887 #define READ_STR16(type, big_endian)                                               \
888 static int mxf_read_utf16 ## type ##_string(AVIOContext *pb, int size, char** str) \
889 {                                                                                  \
890 return mxf_read_utf16_string(pb, size, str, big_endian);                           \
891 }
892 READ_STR16(be, 1)
893 READ_STR16(le, 0)
894 #undef READ_STR16
895 
mxf_read_content_storage(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)896 static int mxf_read_content_storage(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
897 {
898     MXFContext *mxf = arg;
899     switch (tag) {
900     case 0x1901:
901         if (mxf->packages_refs)
902             av_log(mxf->fc, AV_LOG_VERBOSE, "Multiple packages_refs\n");
903         av_free(mxf->packages_refs);
904         return mxf_read_strong_ref_array(pb, &mxf->packages_refs, &mxf->packages_count);
905     case 0x1902:
906         av_free(mxf->essence_container_data_refs);
907         return mxf_read_strong_ref_array(pb, &mxf->essence_container_data_refs, &mxf->essence_container_data_count);
908     }
909     return 0;
910 }
911 
mxf_read_source_clip(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)912 static int mxf_read_source_clip(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
913 {
914     MXFStructuralComponent *source_clip = arg;
915     switch(tag) {
916     case 0x0202:
917         source_clip->duration = avio_rb64(pb);
918         break;
919     case 0x1201:
920         source_clip->start_position = avio_rb64(pb);
921         break;
922     case 0x1101:
923         /* UMID, only get last 16 bytes */
924         avio_read(pb, source_clip->source_package_ul, 16);
925         avio_read(pb, source_clip->source_package_uid, 16);
926         break;
927     case 0x1102:
928         source_clip->source_track_id = avio_rb32(pb);
929         break;
930     }
931     return 0;
932 }
933 
mxf_read_timecode_component(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)934 static int mxf_read_timecode_component(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
935 {
936     MXFTimecodeComponent *mxf_timecode = arg;
937     switch(tag) {
938     case 0x1501:
939         mxf_timecode->start_frame = avio_rb64(pb);
940         break;
941     case 0x1502:
942         mxf_timecode->rate = (AVRational){avio_rb16(pb), 1};
943         break;
944     case 0x1503:
945         mxf_timecode->drop_frame = avio_r8(pb);
946         break;
947     }
948     return 0;
949 }
950 
mxf_read_pulldown_component(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)951 static int mxf_read_pulldown_component(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
952 {
953     MXFPulldownComponent *mxf_pulldown = arg;
954     switch(tag) {
955     case 0x0d01:
956         avio_read(pb, mxf_pulldown->input_segment_ref, 16);
957         break;
958     }
959     return 0;
960 }
961 
mxf_read_track(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)962 static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
963 {
964     MXFTrack *track = arg;
965     switch(tag) {
966     case 0x4801:
967         track->track_id = avio_rb32(pb);
968         break;
969     case 0x4804:
970         avio_read(pb, track->track_number, 4);
971         break;
972     case 0x4802:
973         mxf_read_utf16be_string(pb, size, &track->name);
974         break;
975     case 0x4b01:
976         track->edit_rate.num = avio_rb32(pb);
977         track->edit_rate.den = avio_rb32(pb);
978         break;
979     case 0x4803:
980         avio_read(pb, track->sequence_ref, 16);
981         break;
982     }
983     return 0;
984 }
985 
mxf_read_sequence(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)986 static int mxf_read_sequence(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
987 {
988     MXFSequence *sequence = arg;
989     switch(tag) {
990     case 0x0202:
991         sequence->duration = avio_rb64(pb);
992         break;
993     case 0x0201:
994         avio_read(pb, sequence->data_definition_ul, 16);
995         break;
996         case 0x4b02:
997         sequence->origin = avio_r8(pb);
998         break;
999     case 0x1001:
1000         return mxf_read_strong_ref_array(pb, &sequence->structural_components_refs,
1001                                              &sequence->structural_components_count);
1002     }
1003     return 0;
1004 }
1005 
mxf_read_essence_group(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)1006 static int mxf_read_essence_group(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1007 {
1008     MXFEssenceGroup *essence_group = arg;
1009     switch (tag) {
1010     case 0x0202:
1011         essence_group->duration = avio_rb64(pb);
1012         break;
1013     case 0x0501:
1014         return mxf_read_strong_ref_array(pb, &essence_group->structural_components_refs,
1015                                              &essence_group->structural_components_count);
1016     }
1017     return 0;
1018 }
1019 
mxf_read_package(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)1020 static int mxf_read_package(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1021 {
1022     MXFPackage *package = arg;
1023     switch(tag) {
1024     case 0x4403:
1025         return mxf_read_strong_ref_array(pb, &package->tracks_refs,
1026                                              &package->tracks_count);
1027     case 0x4401:
1028         /* UMID */
1029         avio_read(pb, package->package_ul, 16);
1030         avio_read(pb, package->package_uid, 16);
1031         break;
1032     case 0x4701:
1033         avio_read(pb, package->descriptor_ref, 16);
1034         break;
1035     case 0x4402:
1036         return mxf_read_utf16be_string(pb, size, &package->name);
1037     case 0x4406:
1038         return mxf_read_strong_ref_array(pb, &package->comment_refs,
1039                                              &package->comment_count);
1040     }
1041     return 0;
1042 }
1043 
mxf_read_essence_container_data(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)1044 static int mxf_read_essence_container_data(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1045 {
1046     MXFEssenceContainerData *essence_data = arg;
1047     switch(tag) {
1048         case 0x2701:
1049             /* linked package umid UMID */
1050             avio_read(pb, essence_data->package_ul, 16);
1051             avio_read(pb, essence_data->package_uid, 16);
1052             break;
1053         case 0x3f06:
1054             essence_data->index_sid = avio_rb32(pb);
1055             break;
1056         case 0x3f07:
1057             essence_data->body_sid = avio_rb32(pb);
1058             break;
1059     }
1060     return 0;
1061 }
1062 
mxf_read_index_entry_array(AVIOContext * pb,MXFIndexTableSegment * segment)1063 static int mxf_read_index_entry_array(AVIOContext *pb, MXFIndexTableSegment *segment)
1064 {
1065     int i, length;
1066 
1067     segment->nb_index_entries = avio_rb32(pb);
1068 
1069     length = avio_rb32(pb);
1070     if(segment->nb_index_entries && length < 11)
1071         return AVERROR_INVALIDDATA;
1072 
1073     if (!(segment->temporal_offset_entries=av_calloc(segment->nb_index_entries, sizeof(*segment->temporal_offset_entries))) ||
1074         !(segment->flag_entries          = av_calloc(segment->nb_index_entries, sizeof(*segment->flag_entries))) ||
1075         !(segment->stream_offset_entries = av_calloc(segment->nb_index_entries, sizeof(*segment->stream_offset_entries)))) {
1076         av_freep(&segment->temporal_offset_entries);
1077         av_freep(&segment->flag_entries);
1078         return AVERROR(ENOMEM);
1079     }
1080 
1081     for (i = 0; i < segment->nb_index_entries; i++) {
1082         if(avio_feof(pb))
1083             return AVERROR_INVALIDDATA;
1084         segment->temporal_offset_entries[i] = avio_r8(pb);
1085         avio_r8(pb);                                        /* KeyFrameOffset */
1086         segment->flag_entries[i] = avio_r8(pb);
1087         segment->stream_offset_entries[i] = avio_rb64(pb);
1088         avio_skip(pb, length - 11);
1089     }
1090     return 0;
1091 }
1092 
mxf_read_index_table_segment(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)1093 static int mxf_read_index_table_segment(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1094 {
1095     MXFIndexTableSegment *segment = arg;
1096     switch(tag) {
1097     case 0x3F05:
1098         segment->edit_unit_byte_count = avio_rb32(pb);
1099         av_log(NULL, AV_LOG_TRACE, "EditUnitByteCount %d\n", segment->edit_unit_byte_count);
1100         break;
1101     case 0x3F06:
1102         segment->index_sid = avio_rb32(pb);
1103         av_log(NULL, AV_LOG_TRACE, "IndexSID %d\n", segment->index_sid);
1104         break;
1105     case 0x3F07:
1106         segment->body_sid = avio_rb32(pb);
1107         av_log(NULL, AV_LOG_TRACE, "BodySID %d\n", segment->body_sid);
1108         break;
1109     case 0x3F0A:
1110         av_log(NULL, AV_LOG_TRACE, "IndexEntryArray found\n");
1111         return mxf_read_index_entry_array(pb, segment);
1112     case 0x3F0B:
1113         segment->index_edit_rate.num = avio_rb32(pb);
1114         segment->index_edit_rate.den = avio_rb32(pb);
1115         av_log(NULL, AV_LOG_TRACE, "IndexEditRate %d/%d\n", segment->index_edit_rate.num,
1116                 segment->index_edit_rate.den);
1117         break;
1118     case 0x3F0C:
1119         segment->index_start_position = avio_rb64(pb);
1120         av_log(NULL, AV_LOG_TRACE, "IndexStartPosition %"PRId64"\n", segment->index_start_position);
1121         break;
1122     case 0x3F0D:
1123         segment->index_duration = avio_rb64(pb);
1124         av_log(NULL, AV_LOG_TRACE, "IndexDuration %"PRId64"\n", segment->index_duration);
1125         break;
1126     }
1127     return 0;
1128 }
1129 
mxf_read_pixel_layout(AVIOContext * pb,MXFDescriptor * descriptor)1130 static void mxf_read_pixel_layout(AVIOContext *pb, MXFDescriptor *descriptor)
1131 {
1132     int code, value, ofs = 0;
1133     char layout[16] = {0}; /* not for printing, may end up not terminated on purpose */
1134 
1135     do {
1136         code = avio_r8(pb);
1137         value = avio_r8(pb);
1138         av_log(NULL, AV_LOG_TRACE, "pixel layout: code %#x\n", code);
1139 
1140         if (ofs <= 14) {
1141             layout[ofs++] = code;
1142             layout[ofs++] = value;
1143         } else
1144             break;  /* don't read byte by byte on sneaky files filled with lots of non-zeroes */
1145     } while (code != 0); /* SMPTE 377M E.2.46 */
1146 
1147     ff_mxf_decode_pixel_layout(layout, &descriptor->pix_fmt);
1148 }
1149 
mxf_read_generic_descriptor(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)1150 static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1151 {
1152     MXFDescriptor *descriptor = arg;
1153     int entry_count, entry_size;
1154 
1155     switch(tag) {
1156     case 0x3F01:
1157         return mxf_read_strong_ref_array(pb, &descriptor->sub_descriptors_refs,
1158                                              &descriptor->sub_descriptors_count);
1159     case 0x3002: /* ContainerDuration */
1160         descriptor->duration = avio_rb64(pb);
1161         break;
1162     case 0x3004:
1163         avio_read(pb, descriptor->essence_container_ul, 16);
1164         break;
1165     case 0x3005:
1166         avio_read(pb, descriptor->codec_ul, 16);
1167         break;
1168     case 0x3006:
1169         descriptor->linked_track_id = avio_rb32(pb);
1170         break;
1171     case 0x3201: /* PictureEssenceCoding */
1172         avio_read(pb, descriptor->essence_codec_ul, 16);
1173         break;
1174     case 0x3203:
1175         descriptor->width = avio_rb32(pb);
1176         break;
1177     case 0x3202:
1178         descriptor->height = avio_rb32(pb);
1179         break;
1180     case 0x320C:
1181         descriptor->frame_layout = avio_r8(pb);
1182         break;
1183     case 0x320D:
1184         entry_count = avio_rb32(pb);
1185         entry_size = avio_rb32(pb);
1186         if (entry_size == 4) {
1187             if (entry_count > 0)
1188                 descriptor->video_line_map[0] = avio_rb32(pb);
1189             else
1190                 descriptor->video_line_map[0] = 0;
1191             if (entry_count > 1)
1192                 descriptor->video_line_map[1] = avio_rb32(pb);
1193             else
1194                 descriptor->video_line_map[1] = 0;
1195         } else
1196             av_log(NULL, AV_LOG_WARNING, "VideoLineMap element size %d currently not supported\n", entry_size);
1197         break;
1198     case 0x320E:
1199         descriptor->aspect_ratio.num = avio_rb32(pb);
1200         descriptor->aspect_ratio.den = avio_rb32(pb);
1201         break;
1202     case 0x3212:
1203         descriptor->field_dominance = avio_r8(pb);
1204         break;
1205     case 0x3301:
1206         descriptor->component_depth = avio_rb32(pb);
1207         break;
1208     case 0x3302:
1209         descriptor->horiz_subsampling = avio_rb32(pb);
1210         break;
1211     case 0x3308:
1212         descriptor->vert_subsampling = avio_rb32(pb);
1213         break;
1214     case 0x3D03:
1215         descriptor->sample_rate.num = avio_rb32(pb);
1216         descriptor->sample_rate.den = avio_rb32(pb);
1217         break;
1218     case 0x3D06: /* SoundEssenceCompression */
1219         avio_read(pb, descriptor->essence_codec_ul, 16);
1220         break;
1221     case 0x3D07:
1222         descriptor->channels = avio_rb32(pb);
1223         break;
1224     case 0x3D01:
1225         descriptor->bits_per_sample = avio_rb32(pb);
1226         break;
1227     case 0x3401:
1228         mxf_read_pixel_layout(pb, descriptor);
1229         break;
1230     default:
1231         /* Private uid used by SONY C0023S01.mxf */
1232         if (IS_KLV_KEY(uid, mxf_sony_mpeg4_extradata)) {
1233             if (descriptor->extradata)
1234                 av_log(NULL, AV_LOG_WARNING, "Duplicate sony_mpeg4_extradata\n");
1235             av_free(descriptor->extradata);
1236             descriptor->extradata_size = 0;
1237             descriptor->extradata = av_malloc(size);
1238             if (!descriptor->extradata)
1239                 return AVERROR(ENOMEM);
1240             descriptor->extradata_size = size;
1241             avio_read(pb, descriptor->extradata, size);
1242         }
1243         if (IS_KLV_KEY(uid, mxf_jp2k_rsiz)) {
1244             uint32_t rsiz = avio_rb16(pb);
1245             if (rsiz == FF_PROFILE_JPEG2000_DCINEMA_2K ||
1246                 rsiz == FF_PROFILE_JPEG2000_DCINEMA_4K)
1247                 descriptor->pix_fmt = AV_PIX_FMT_XYZ12;
1248         }
1249         break;
1250     }
1251     return 0;
1252 }
1253 
mxf_read_indirect_value(void * arg,AVIOContext * pb,int size)1254 static int mxf_read_indirect_value(void *arg, AVIOContext *pb, int size)
1255 {
1256     MXFTaggedValue *tagged_value = arg;
1257     uint8_t key[17];
1258 
1259     if (size <= 17)
1260         return 0;
1261 
1262     avio_read(pb, key, 17);
1263     /* TODO: handle other types of of indirect values */
1264     if (memcmp(key, mxf_indirect_value_utf16le, 17) == 0) {
1265         return mxf_read_utf16le_string(pb, size - 17, &tagged_value->value);
1266     } else if (memcmp(key, mxf_indirect_value_utf16be, 17) == 0) {
1267         return mxf_read_utf16be_string(pb, size - 17, &tagged_value->value);
1268     }
1269     return 0;
1270 }
1271 
mxf_read_tagged_value(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)1272 static int mxf_read_tagged_value(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
1273 {
1274     MXFTaggedValue *tagged_value = arg;
1275     switch (tag){
1276     case 0x5001:
1277         return mxf_read_utf16be_string(pb, size, &tagged_value->name);
1278     case 0x5003:
1279         return mxf_read_indirect_value(tagged_value, pb, size);
1280     }
1281     return 0;
1282 }
1283 
1284 /*
1285  * Match an uid independently of the version byte and up to len common bytes
1286  * Returns: boolean
1287  */
mxf_match_uid(const UID key,const UID uid,int len)1288 static int mxf_match_uid(const UID key, const UID uid, int len)
1289 {
1290     int i;
1291     for (i = 0; i < len; i++) {
1292         if (i != 7 && key[i] != uid[i])
1293             return 0;
1294     }
1295     return 1;
1296 }
1297 
mxf_get_codec_ul(const MXFCodecUL * uls,UID * uid)1298 static const MXFCodecUL *mxf_get_codec_ul(const MXFCodecUL *uls, UID *uid)
1299 {
1300     while (uls->uid[0]) {
1301         if(mxf_match_uid(uls->uid, *uid, uls->matching_len))
1302             break;
1303         uls++;
1304     }
1305     return uls;
1306 }
1307 
mxf_resolve_strong_ref(MXFContext * mxf,UID * strong_ref,enum MXFMetadataSetType type)1308 static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum MXFMetadataSetType type)
1309 {
1310     int i;
1311 
1312     if (!strong_ref)
1313         return NULL;
1314     for (i = 0; i < mxf->metadata_sets_count; i++) {
1315         if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16) &&
1316             (type == AnyType || mxf->metadata_sets[i]->type == type)) {
1317             return mxf->metadata_sets[i];
1318         }
1319     }
1320     return NULL;
1321 }
1322 
1323 static const MXFCodecUL mxf_picture_essence_container_uls[] = {
1324     // video essence container uls
1325     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0c,0x01,0x00 }, 14,   AV_CODEC_ID_JPEG2000, NULL, 14 },
1326     { { 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 */
1327     { { 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 */
1328     { { 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 */
1329     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x14,0x01,0x00 }, 14,       AV_CODEC_ID_TIFF, NULL, 14 }, /* TIFF */
1330     { { 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 */
1331     { { 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 */
1332     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x1c,0x01,0x00 }, 14,     AV_CODEC_ID_PRORES, NULL, 14 }, /* ProRes */
1333     { { 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 */
1334     { { 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 */
1335     { { 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 */
1336     { { 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 */
1337     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x0f,0x03,0x01,0x02,0x20,0x01,0x01 }, 15,     AV_CODEC_ID_HQ_HQA },
1338     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x0f,0x03,0x01,0x02,0x20,0x02,0x01 }, 15,        AV_CODEC_ID_HQX },
1339     { { 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 */
1340     { { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0xff,0x4b,0x46,0x41,0x41,0x00,0x0d,0x4d,0x4f }, 14,   AV_CODEC_ID_RAWVIDEO }, /* Legacy ?? Uncompressed Picture */
1341     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,      AV_CODEC_ID_NONE },
1342 };
1343 
1344 /* EC ULs for intra-only formats */
1345 static const MXFCodecUL mxf_intra_only_essence_container_uls[] = {
1346     { { 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 */
1347     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,       AV_CODEC_ID_NONE },
1348 };
1349 
1350 /* intra-only PictureEssenceCoding ULs, where no corresponding EC UL exists */
1351 static const MXFCodecUL mxf_intra_only_picture_essence_coding_uls[] = {
1352     { { 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 */
1353     { { 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 */
1354     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,       AV_CODEC_ID_NONE },
1355 };
1356 
1357 /* actual coded width for AVC-Intra to allow selecting correct SPS/PPS */
1358 static const MXFCodecUL mxf_intra_only_picture_coded_width[] = {
1359     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x01 }, 16, 1440 },
1360     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x02 }, 16, 1440 },
1361     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x03 }, 16, 1440 },
1362     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x04 }, 16, 1440 },
1363     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,    0 },
1364 };
1365 
1366 static const MXFCodecUL mxf_sound_essence_container_uls[] = {
1367     // sound essence container uls
1368     { { 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 */
1369     { { 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 */
1370     { { 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 */
1371     { { 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 */
1372     { { 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) */
1373     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,      AV_CODEC_ID_NONE },
1374 };
1375 
1376 static const MXFCodecUL mxf_data_essence_container_uls[] = {
1377     { { 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 },
1378     { { 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 },
1379     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x09,0x0d,0x01,0x03,0x01,0x02,0x13,0x01,0x01 }, 16, AV_CODEC_ID_TTML },
1380     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0, AV_CODEC_ID_NONE },
1381 };
1382 
mxf_get_wrapping_kind(UID * essence_container_ul)1383 static MXFWrappingScheme mxf_get_wrapping_kind(UID *essence_container_ul)
1384 {
1385     int val;
1386     const MXFCodecUL *codec_ul;
1387 
1388     codec_ul = mxf_get_codec_ul(mxf_picture_essence_container_uls, essence_container_ul);
1389     if (!codec_ul->uid[0])
1390         codec_ul = mxf_get_codec_ul(mxf_sound_essence_container_uls, essence_container_ul);
1391     if (!codec_ul->uid[0])
1392         codec_ul = mxf_get_codec_ul(mxf_data_essence_container_uls, essence_container_ul);
1393     if (!codec_ul->uid[0] || !codec_ul->wrapping_indicator_pos)
1394         return UnknownWrapped;
1395 
1396     val = (*essence_container_ul)[codec_ul->wrapping_indicator_pos];
1397     switch (codec_ul->wrapping_indicator_type) {
1398         case RawVWrap:
1399             val = val % 4;
1400             break;
1401         case RawAWrap:
1402             if (val == 0x03 || val == 0x04)
1403                 val -= 0x02;
1404             break;
1405         case D10D11Wrap:
1406             if (val == 0x02)
1407                 val = 0x01;
1408             break;
1409     }
1410     if (val == 0x01)
1411         return FrameWrapped;
1412     if (val == 0x02)
1413         return ClipWrapped;
1414     return UnknownWrapped;
1415 }
1416 
mxf_get_sorted_table_segments(MXFContext * mxf,int * nb_sorted_segments,MXFIndexTableSegment *** sorted_segments)1417 static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segments, MXFIndexTableSegment ***sorted_segments)
1418 {
1419     int i, j, nb_segments = 0;
1420     MXFIndexTableSegment **unsorted_segments;
1421     int last_body_sid = -1, last_index_sid = -1, last_index_start = -1;
1422 
1423     /* count number of segments, allocate arrays and copy unsorted segments */
1424     for (i = 0; i < mxf->metadata_sets_count; i++)
1425         if (mxf->metadata_sets[i]->type == IndexTableSegment)
1426             nb_segments++;
1427 
1428     if (!nb_segments)
1429         return AVERROR_INVALIDDATA;
1430 
1431     if (!(unsorted_segments = av_calloc(nb_segments, sizeof(*unsorted_segments))) ||
1432         !(*sorted_segments  = av_calloc(nb_segments, sizeof(**sorted_segments)))) {
1433         av_freep(sorted_segments);
1434         av_free(unsorted_segments);
1435         return AVERROR(ENOMEM);
1436     }
1437 
1438     for (i = nb_segments = 0; i < mxf->metadata_sets_count; i++) {
1439         if (mxf->metadata_sets[i]->type == IndexTableSegment) {
1440             MXFIndexTableSegment *s = (MXFIndexTableSegment*)mxf->metadata_sets[i];
1441             if (s->edit_unit_byte_count || s->nb_index_entries)
1442                 unsorted_segments[nb_segments++] = s;
1443             else
1444                 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment at %"PRId64" missing EditUnitByteCount and IndexEntryArray\n",
1445                        s->index_sid, s->index_start_position);
1446         }
1447     }
1448 
1449     if (!nb_segments) {
1450         av_freep(sorted_segments);
1451         av_free(unsorted_segments);
1452         return AVERROR_INVALIDDATA;
1453     }
1454 
1455     *nb_sorted_segments = 0;
1456 
1457     /* sort segments by {BodySID, IndexSID, IndexStartPosition}, remove duplicates while we're at it */
1458     for (i = 0; i < nb_segments; i++) {
1459         int best = -1, best_body_sid = -1, best_index_sid = -1, best_index_start = -1;
1460         uint64_t best_index_duration = 0;
1461 
1462         for (j = 0; j < nb_segments; j++) {
1463             MXFIndexTableSegment *s = unsorted_segments[j];
1464 
1465             /* Require larger BosySID, IndexSID or IndexStartPosition then the previous entry. This removes duplicates.
1466              * We want the smallest values for the keys than what we currently have, unless this is the first such entry this time around.
1467              * If we come across an entry with the same IndexStartPosition but larger IndexDuration, then we'll prefer it over the one we currently have.
1468              */
1469             if ((i == 0 ||
1470                  s->body_sid >  last_body_sid ||
1471                  s->body_sid == last_body_sid && s->index_sid >  last_index_sid ||
1472                  s->body_sid == last_body_sid && s->index_sid == last_index_sid && s->index_start_position > last_index_start) &&
1473                 (best == -1 ||
1474                  s->body_sid <  best_body_sid ||
1475                  s->body_sid == best_body_sid && s->index_sid <  best_index_sid ||
1476                  s->body_sid == best_body_sid && s->index_sid == best_index_sid && s->index_start_position <  best_index_start ||
1477                  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             = j;
1479                 best_body_sid    = s->body_sid;
1480                 best_index_sid   = s->index_sid;
1481                 best_index_start = s->index_start_position;
1482                 best_index_duration = s->index_duration;
1483             }
1484         }
1485 
1486         /* no suitable entry found -> we're done */
1487         if (best == -1)
1488             break;
1489 
1490         (*sorted_segments)[(*nb_sorted_segments)++] = unsorted_segments[best];
1491         last_body_sid    = best_body_sid;
1492         last_index_sid   = best_index_sid;
1493         last_index_start = best_index_start;
1494     }
1495 
1496     av_free(unsorted_segments);
1497 
1498     return 0;
1499 }
1500 
1501 /**
1502  * Computes the absolute file offset of the given essence container offset
1503  */
mxf_absolute_bodysid_offset(MXFContext * mxf,int body_sid,int64_t offset,int64_t * offset_out,MXFPartition ** partition_out)1504 static int mxf_absolute_bodysid_offset(MXFContext *mxf, int body_sid, int64_t offset, int64_t *offset_out, MXFPartition **partition_out)
1505 {
1506     MXFPartition *last_p = NULL;
1507     int a, b, m, m0;
1508 
1509     if (offset < 0)
1510         return AVERROR(EINVAL);
1511 
1512     a = -1;
1513     b = mxf->partitions_count;
1514 
1515     while (b - a > 1) {
1516         m0 = m = (a + b) >> 1;
1517 
1518         while (m < b && mxf->partitions[m].body_sid != body_sid)
1519             m++;
1520 
1521         if (m < b && mxf->partitions[m].body_offset <= offset)
1522             a = m;
1523         else
1524             b = m0;
1525     }
1526 
1527     if (a >= 0)
1528         last_p = &mxf->partitions[a];
1529 
1530     if (last_p && (!last_p->essence_length || last_p->essence_length > (offset - last_p->body_offset))) {
1531         *offset_out = last_p->essence_offset + (offset - last_p->body_offset);
1532         if (partition_out)
1533             *partition_out = last_p;
1534         return 0;
1535     }
1536 
1537     av_log(mxf->fc, AV_LOG_ERROR,
1538            "failed to find absolute offset of %"PRIX64" in BodySID %i - partial file?\n",
1539            offset, body_sid);
1540 
1541     return AVERROR_INVALIDDATA;
1542 }
1543 
1544 /**
1545  * Returns the end position of the essence container with given BodySID, or zero if unknown
1546  */
mxf_essence_container_end(MXFContext * mxf,int body_sid)1547 static int64_t mxf_essence_container_end(MXFContext *mxf, int body_sid)
1548 {
1549     for (int x = mxf->partitions_count - 1; x >= 0; x--) {
1550         MXFPartition *p = &mxf->partitions[x];
1551 
1552         if (p->body_sid != body_sid)
1553             continue;
1554 
1555         if (!p->essence_length)
1556             return 0;
1557 
1558         return p->essence_offset + p->essence_length;
1559     }
1560 
1561     return 0;
1562 }
1563 
1564 /* EditUnit -> absolute offset */
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)1565 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)
1566 {
1567     int i;
1568     int64_t offset_temp = 0;
1569 
1570     edit_unit = av_rescale_q(edit_unit, index_table->segments[0]->index_edit_rate, edit_rate);
1571 
1572     for (i = 0; i < index_table->nb_segments; i++) {
1573         MXFIndexTableSegment *s = index_table->segments[i];
1574 
1575         edit_unit = FFMAX(edit_unit, s->index_start_position);  /* clamp if trying to seek before start */
1576 
1577         if (edit_unit < s->index_start_position + s->index_duration) {
1578             int64_t index = edit_unit - s->index_start_position;
1579 
1580             if (s->edit_unit_byte_count)
1581                 offset_temp += s->edit_unit_byte_count * index;
1582             else {
1583                 if (s->nb_index_entries == 2 * s->index_duration + 1)
1584                     index *= 2;     /* Avid index */
1585 
1586                 if (index < 0 || index >= s->nb_index_entries) {
1587                     av_log(mxf->fc, AV_LOG_ERROR, "IndexSID %i segment at %"PRId64" IndexEntryArray too small\n",
1588                            index_table->index_sid, s->index_start_position);
1589                     return AVERROR_INVALIDDATA;
1590                 }
1591 
1592                 offset_temp = s->stream_offset_entries[index];
1593             }
1594 
1595             if (edit_unit_out)
1596                 *edit_unit_out = av_rescale_q(edit_unit, edit_rate, s->index_edit_rate);
1597 
1598             return mxf_absolute_bodysid_offset(mxf, index_table->body_sid, offset_temp, offset_out, partition_out);
1599         } else {
1600             /* EditUnitByteCount == 0 for VBR indexes, which is fine since they use explicit StreamOffsets */
1601             offset_temp += s->edit_unit_byte_count * s->index_duration;
1602         }
1603     }
1604 
1605     if (nag)
1606         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);
1607 
1608     return AVERROR_INVALIDDATA;
1609 }
1610 
mxf_compute_ptses_fake_index(MXFContext * mxf,MXFIndexTable * index_table)1611 static int mxf_compute_ptses_fake_index(MXFContext *mxf, MXFIndexTable *index_table)
1612 {
1613     int i, j, x;
1614     int8_t max_temporal_offset = -128;
1615     uint8_t *flags;
1616 
1617     /* first compute how many entries we have */
1618     for (i = 0; i < index_table->nb_segments; i++) {
1619         MXFIndexTableSegment *s = index_table->segments[i];
1620 
1621         if (!s->nb_index_entries) {
1622             index_table->nb_ptses = 0;
1623             return 0;                               /* no TemporalOffsets */
1624         }
1625 
1626         if (s->index_duration > INT_MAX - index_table->nb_ptses) {
1627             index_table->nb_ptses = 0;
1628             av_log(mxf->fc, AV_LOG_ERROR, "ignoring IndexSID %d, duration is too large\n", s->index_sid);
1629             return 0;
1630         }
1631 
1632         index_table->nb_ptses += s->index_duration;
1633     }
1634 
1635     /* paranoid check */
1636     if (index_table->nb_ptses <= 0)
1637         return 0;
1638 
1639     if (!(index_table->ptses      = av_calloc(index_table->nb_ptses, sizeof(int64_t))) ||
1640         !(index_table->fake_index = av_calloc(index_table->nb_ptses, sizeof(AVIndexEntry))) ||
1641         !(index_table->offsets    = av_calloc(index_table->nb_ptses, sizeof(int8_t))) ||
1642         !(flags                   = av_calloc(index_table->nb_ptses, sizeof(uint8_t)))) {
1643         av_freep(&index_table->ptses);
1644         av_freep(&index_table->fake_index);
1645         av_freep(&index_table->offsets);
1646         return AVERROR(ENOMEM);
1647     }
1648 
1649     /* we may have a few bad TemporalOffsets
1650      * make sure the corresponding PTSes don't have the bogus value 0 */
1651     for (x = 0; x < index_table->nb_ptses; x++)
1652         index_table->ptses[x] = AV_NOPTS_VALUE;
1653 
1654     /**
1655      * We have this:
1656      *
1657      * x  TemporalOffset
1658      * 0:  0
1659      * 1:  1
1660      * 2:  1
1661      * 3: -2
1662      * 4:  1
1663      * 5:  1
1664      * 6: -2
1665      *
1666      * We want to transform it into this:
1667      *
1668      * x  DTS PTS
1669      * 0: -1   0
1670      * 1:  0   3
1671      * 2:  1   1
1672      * 3:  2   2
1673      * 4:  3   6
1674      * 5:  4   4
1675      * 6:  5   5
1676      *
1677      * We do this by bucket sorting x by x+TemporalOffset[x] into mxf->ptses,
1678      * then settings mxf->first_dts = -max(TemporalOffset[x]).
1679      * The latter makes DTS <= PTS.
1680      */
1681     for (i = x = 0; i < index_table->nb_segments; i++) {
1682         MXFIndexTableSegment *s = index_table->segments[i];
1683         int index_delta = 1;
1684         int n = s->nb_index_entries;
1685 
1686         if (s->nb_index_entries == 2 * s->index_duration + 1) {
1687             index_delta = 2;    /* Avid index */
1688             /* ignore the last entry - it's the size of the essence container */
1689             n--;
1690         }
1691 
1692         for (j = 0; j < n; j += index_delta, x++) {
1693             int offset = s->temporal_offset_entries[j] / index_delta;
1694             int index  = x + offset;
1695 
1696             if (x >= index_table->nb_ptses) {
1697                 av_log(mxf->fc, AV_LOG_ERROR,
1698                        "x >= nb_ptses - IndexEntryCount %i < IndexDuration %"PRId64"?\n",
1699                        s->nb_index_entries, s->index_duration);
1700                 break;
1701             }
1702 
1703             flags[x] = !(s->flag_entries[j] & 0x30) ? AVINDEX_KEYFRAME : 0;
1704 
1705             if (index < 0 || index >= index_table->nb_ptses) {
1706                 av_log(mxf->fc, AV_LOG_ERROR,
1707                        "index entry %i + TemporalOffset %i = %i, which is out of bounds\n",
1708                        x, offset, index);
1709                 continue;
1710             }
1711 
1712             index_table->offsets[x] = offset;
1713             index_table->ptses[index] = x;
1714             max_temporal_offset = FFMAX(max_temporal_offset, offset);
1715         }
1716     }
1717 
1718     /* calculate the fake index table in display order */
1719     for (x = 0; x < index_table->nb_ptses; x++) {
1720         index_table->fake_index[x].timestamp = x;
1721         if (index_table->ptses[x] != AV_NOPTS_VALUE)
1722             index_table->fake_index[index_table->ptses[x]].flags = flags[x];
1723     }
1724     av_freep(&flags);
1725 
1726     index_table->first_dts = -max_temporal_offset;
1727 
1728     return 0;
1729 }
1730 
1731 /**
1732  * Sorts and collects index table segments into index tables.
1733  * Also computes PTSes if possible.
1734  */
mxf_compute_index_tables(MXFContext * mxf)1735 static int mxf_compute_index_tables(MXFContext *mxf)
1736 {
1737     int i, j, k, ret, nb_sorted_segments;
1738     MXFIndexTableSegment **sorted_segments = NULL;
1739 
1740     if ((ret = mxf_get_sorted_table_segments(mxf, &nb_sorted_segments, &sorted_segments)) ||
1741         nb_sorted_segments <= 0) {
1742         av_log(mxf->fc, AV_LOG_WARNING, "broken or empty index\n");
1743         return 0;
1744     }
1745 
1746     /* sanity check and count unique BodySIDs/IndexSIDs */
1747     for (i = 0; i < nb_sorted_segments; i++) {
1748         if (i == 0 || sorted_segments[i-1]->index_sid != sorted_segments[i]->index_sid)
1749             mxf->nb_index_tables++;
1750         else if (sorted_segments[i-1]->body_sid != sorted_segments[i]->body_sid) {
1751             av_log(mxf->fc, AV_LOG_ERROR, "found inconsistent BodySID\n");
1752             ret = AVERROR_INVALIDDATA;
1753             goto finish_decoding_index;
1754         }
1755     }
1756 
1757     mxf->index_tables = av_mallocz_array(mxf->nb_index_tables,
1758                                          sizeof(*mxf->index_tables));
1759     if (!mxf->index_tables) {
1760         av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate index tables\n");
1761         ret = AVERROR(ENOMEM);
1762         goto finish_decoding_index;
1763     }
1764 
1765     /* distribute sorted segments to index tables */
1766     for (i = j = 0; i < nb_sorted_segments; i++) {
1767         if (i != 0 && sorted_segments[i-1]->index_sid != sorted_segments[i]->index_sid) {
1768             /* next IndexSID */
1769             j++;
1770         }
1771 
1772         mxf->index_tables[j].nb_segments++;
1773     }
1774 
1775     for (i = j = 0; j < mxf->nb_index_tables; i += mxf->index_tables[j++].nb_segments) {
1776         MXFIndexTable *t = &mxf->index_tables[j];
1777         MXFTrack *mxf_track = NULL;
1778 
1779         t->segments = av_mallocz_array(t->nb_segments,
1780                                        sizeof(*t->segments));
1781 
1782         if (!t->segments) {
1783             av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate IndexTableSegment"
1784                    " pointer array\n");
1785             ret = AVERROR(ENOMEM);
1786             goto finish_decoding_index;
1787         }
1788 
1789         if (sorted_segments[i]->index_start_position)
1790             av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i starts at EditUnit %"PRId64" - seeking may not work as expected\n",
1791                    sorted_segments[i]->index_sid, sorted_segments[i]->index_start_position);
1792 
1793         memcpy(t->segments, &sorted_segments[i], t->nb_segments * sizeof(MXFIndexTableSegment*));
1794         t->index_sid = sorted_segments[i]->index_sid;
1795         t->body_sid = sorted_segments[i]->body_sid;
1796 
1797         if ((ret = mxf_compute_ptses_fake_index(mxf, t)) < 0)
1798             goto finish_decoding_index;
1799 
1800         for (k = 0; k < mxf->fc->nb_streams; k++) {
1801             MXFTrack *track = mxf->fc->streams[k]->priv_data;
1802             if (track && track->index_sid == t->index_sid) {
1803                 mxf_track = track;
1804                 break;
1805             }
1806         }
1807 
1808         /* fix zero IndexDurations */
1809         for (k = 0; k < t->nb_segments; k++) {
1810             if (!t->segments[k]->index_edit_rate.num || !t->segments[k]->index_edit_rate.den) {
1811                 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment %i has invalid IndexEditRate\n",
1812                        t->index_sid, k);
1813                 if (mxf_track)
1814                     t->segments[k]->index_edit_rate = mxf_track->edit_rate;
1815             }
1816 
1817             if (t->segments[k]->index_duration)
1818                 continue;
1819 
1820             if (t->nb_segments > 1)
1821                 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment %i has zero IndexDuration and there's more than one segment\n",
1822                        t->index_sid, k);
1823 
1824             if (!mxf_track) {
1825                 av_log(mxf->fc, AV_LOG_WARNING, "no streams?\n");
1826                 break;
1827             }
1828 
1829             /* assume the first stream's duration is reasonable
1830              * leave index_duration = 0 on further segments in case we have any (unlikely)
1831              */
1832             t->segments[k]->index_duration = mxf_track->original_duration;
1833             break;
1834         }
1835     }
1836 
1837     ret = 0;
1838 finish_decoding_index:
1839     av_free(sorted_segments);
1840     return ret;
1841 }
1842 
mxf_is_intra_only(MXFDescriptor * descriptor)1843 static int mxf_is_intra_only(MXFDescriptor *descriptor)
1844 {
1845     return mxf_get_codec_ul(mxf_intra_only_essence_container_uls,
1846                             &descriptor->essence_container_ul)->id != AV_CODEC_ID_NONE ||
1847            mxf_get_codec_ul(mxf_intra_only_picture_essence_coding_uls,
1848                             &descriptor->essence_codec_ul)->id     != AV_CODEC_ID_NONE;
1849 }
1850 
mxf_uid_to_str(UID uid,char ** str)1851 static int mxf_uid_to_str(UID uid, char **str)
1852 {
1853     int i;
1854     char *p;
1855     p = *str = av_mallocz(sizeof(UID) * 2 + 4 + 1);
1856     if (!p)
1857         return AVERROR(ENOMEM);
1858     for (i = 0; i < sizeof(UID); i++) {
1859         snprintf(p, 2 + 1, "%.2x", uid[i]);
1860         p += 2;
1861         if (i == 3 || i == 5 || i == 7 || i == 9) {
1862             snprintf(p, 1 + 1, "-");
1863             p++;
1864         }
1865     }
1866     return 0;
1867 }
1868 
mxf_umid_to_str(UID ul,UID uid,char ** str)1869 static int mxf_umid_to_str(UID ul, UID uid, char **str)
1870 {
1871     int i;
1872     char *p;
1873     p = *str = av_mallocz(sizeof(UID) * 4 + 2 + 1);
1874     if (!p)
1875         return AVERROR(ENOMEM);
1876     snprintf(p, 2 + 1, "0x");
1877     p += 2;
1878     for (i = 0; i < sizeof(UID); i++) {
1879         snprintf(p, 2 + 1, "%.2X", ul[i]);
1880         p += 2;
1881 
1882     }
1883     for (i = 0; i < sizeof(UID); i++) {
1884         snprintf(p, 2 + 1, "%.2X", uid[i]);
1885         p += 2;
1886     }
1887     return 0;
1888 }
1889 
mxf_add_umid_metadata(AVDictionary ** pm,const char * key,MXFPackage * package)1890 static int mxf_add_umid_metadata(AVDictionary **pm, const char *key, MXFPackage* package)
1891 {
1892     char *str;
1893     int ret;
1894     if (!package)
1895         return 0;
1896     if ((ret = mxf_umid_to_str(package->package_ul, package->package_uid, &str)) < 0)
1897         return ret;
1898     av_dict_set(pm, key, str, AV_DICT_DONT_STRDUP_VAL);
1899     return 0;
1900 }
1901 
mxf_add_timecode_metadata(AVDictionary ** pm,const char * key,AVTimecode * tc)1902 static int mxf_add_timecode_metadata(AVDictionary **pm, const char *key, AVTimecode *tc)
1903 {
1904     char buf[AV_TIMECODE_STR_SIZE];
1905     av_dict_set(pm, key, av_timecode_make_string(tc, buf, 0), 0);
1906 
1907     return 0;
1908 }
1909 
mxf_resolve_timecode_component(MXFContext * mxf,UID * strong_ref)1910 static MXFTimecodeComponent* mxf_resolve_timecode_component(MXFContext *mxf, UID *strong_ref)
1911 {
1912     MXFStructuralComponent *component = NULL;
1913     MXFPulldownComponent *pulldown = NULL;
1914 
1915     component = mxf_resolve_strong_ref(mxf, strong_ref, AnyType);
1916     if (!component)
1917         return NULL;
1918 
1919     switch (component->type) {
1920     case TimecodeComponent:
1921         return (MXFTimecodeComponent*)component;
1922     case PulldownComponent: /* timcode component may be located on a pulldown component */
1923         pulldown = (MXFPulldownComponent*)component;
1924         return mxf_resolve_strong_ref(mxf, &pulldown->input_segment_ref, TimecodeComponent);
1925     default:
1926         break;
1927     }
1928     return NULL;
1929 }
1930 
mxf_resolve_source_package(MXFContext * mxf,UID package_ul,UID package_uid)1931 static MXFPackage* mxf_resolve_source_package(MXFContext *mxf, UID package_ul, UID package_uid)
1932 {
1933     MXFPackage *package = NULL;
1934     int i;
1935 
1936     for (i = 0; i < mxf->packages_count; i++) {
1937         package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], SourcePackage);
1938         if (!package)
1939             continue;
1940 
1941         if (!memcmp(package->package_ul, package_ul, 16) && !memcmp(package->package_uid, package_uid, 16))
1942             return package;
1943     }
1944     return NULL;
1945 }
1946 
mxf_resolve_multidescriptor(MXFContext * mxf,MXFDescriptor * descriptor,int track_id)1947 static MXFDescriptor* mxf_resolve_multidescriptor(MXFContext *mxf, MXFDescriptor *descriptor, int track_id)
1948 {
1949     MXFDescriptor *sub_descriptor = NULL;
1950     int i;
1951 
1952     if (!descriptor)
1953         return NULL;
1954 
1955     if (descriptor->type == MultipleDescriptor) {
1956         for (i = 0; i < descriptor->sub_descriptors_count; i++) {
1957             sub_descriptor = mxf_resolve_strong_ref(mxf, &descriptor->sub_descriptors_refs[i], Descriptor);
1958 
1959             if (!sub_descriptor) {
1960                 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve sub descriptor strong ref\n");
1961                 continue;
1962             }
1963             if (sub_descriptor->linked_track_id == track_id) {
1964                 return sub_descriptor;
1965             }
1966         }
1967     } else if (descriptor->type == Descriptor)
1968         return descriptor;
1969 
1970     return NULL;
1971 }
1972 
mxf_resolve_essence_group_choice(MXFContext * mxf,MXFEssenceGroup * essence_group)1973 static MXFStructuralComponent* mxf_resolve_essence_group_choice(MXFContext *mxf, MXFEssenceGroup *essence_group)
1974 {
1975     MXFStructuralComponent *component = NULL;
1976     MXFPackage *package = NULL;
1977     MXFDescriptor *descriptor = NULL;
1978     int i;
1979 
1980     if (!essence_group || !essence_group->structural_components_count)
1981         return NULL;
1982 
1983     /* essence groups contains multiple representations of the same media,
1984        this return the first components with a valid Descriptor typically index 0 */
1985     for (i =0; i < essence_group->structural_components_count; i++){
1986         component = mxf_resolve_strong_ref(mxf, &essence_group->structural_components_refs[i], SourceClip);
1987         if (!component)
1988             continue;
1989 
1990         if (!(package = mxf_resolve_source_package(mxf, component->source_package_ul, component->source_package_uid)))
1991             continue;
1992 
1993         descriptor = mxf_resolve_strong_ref(mxf, &package->descriptor_ref, Descriptor);
1994         if (descriptor)
1995             return component;
1996     }
1997     return NULL;
1998 }
1999 
mxf_resolve_sourceclip(MXFContext * mxf,UID * strong_ref)2000 static MXFStructuralComponent* mxf_resolve_sourceclip(MXFContext *mxf, UID *strong_ref)
2001 {
2002     MXFStructuralComponent *component = NULL;
2003 
2004     component = mxf_resolve_strong_ref(mxf, strong_ref, AnyType);
2005     if (!component)
2006         return NULL;
2007     switch (component->type) {
2008         case SourceClip:
2009             return component;
2010         case EssenceGroup:
2011             return mxf_resolve_essence_group_choice(mxf, (MXFEssenceGroup*) component);
2012         default:
2013             break;
2014     }
2015     return NULL;
2016 }
2017 
mxf_parse_package_comments(MXFContext * mxf,AVDictionary ** pm,MXFPackage * package)2018 static int mxf_parse_package_comments(MXFContext *mxf, AVDictionary **pm, MXFPackage *package)
2019 {
2020     MXFTaggedValue *tag;
2021     int i;
2022     char *key = NULL;
2023 
2024     for (i = 0; i < package->comment_count; i++) {
2025         tag = mxf_resolve_strong_ref(mxf, &package->comment_refs[i], TaggedValue);
2026         if (!tag || !tag->name || !tag->value)
2027             continue;
2028 
2029         key = av_asprintf("comment_%s", tag->name);
2030         if (!key)
2031             return AVERROR(ENOMEM);
2032 
2033         av_dict_set(pm, key, tag->value, AV_DICT_DONT_STRDUP_KEY);
2034     }
2035     return 0;
2036 }
2037 
mxf_parse_physical_source_package(MXFContext * mxf,MXFTrack * source_track,AVStream * st)2038 static int mxf_parse_physical_source_package(MXFContext *mxf, MXFTrack *source_track, AVStream *st)
2039 {
2040     MXFPackage *physical_package = NULL;
2041     MXFTrack *physical_track = NULL;
2042     MXFStructuralComponent *sourceclip = NULL;
2043     MXFTimecodeComponent *mxf_tc = NULL;
2044     int i, j, k;
2045     AVTimecode tc;
2046     int flags;
2047     int64_t start_position;
2048 
2049     for (i = 0; i < source_track->sequence->structural_components_count; i++) {
2050         sourceclip = mxf_resolve_strong_ref(mxf, &source_track->sequence->structural_components_refs[i], SourceClip);
2051         if (!sourceclip)
2052             continue;
2053 
2054         if (!(physical_package = mxf_resolve_source_package(mxf, sourceclip->source_package_ul, sourceclip->source_package_uid)))
2055             break;
2056 
2057         mxf_add_umid_metadata(&st->metadata, "reel_umid", physical_package);
2058 
2059         /* the name of physical source package is name of the reel or tape */
2060         if (physical_package->name && physical_package->name[0])
2061             av_dict_set(&st->metadata, "reel_name", physical_package->name, 0);
2062 
2063         /* the source timecode is calculated by adding the start_position of the sourceclip from the file source package track
2064          * to the start_frame of the timecode component located on one of the tracks of the physical source package.
2065          */
2066         for (j = 0; j < physical_package->tracks_count; j++) {
2067             if (!(physical_track = mxf_resolve_strong_ref(mxf, &physical_package->tracks_refs[j], Track))) {
2068                 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n");
2069                 continue;
2070             }
2071 
2072             if (!(physical_track->sequence = mxf_resolve_strong_ref(mxf, &physical_track->sequence_ref, Sequence))) {
2073                 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
2074                 continue;
2075             }
2076 
2077             if (physical_track->edit_rate.num <= 0 ||
2078                 physical_track->edit_rate.den <= 0) {
2079                 av_log(mxf->fc, AV_LOG_WARNING,
2080                        "Invalid edit rate (%d/%d) found on structural"
2081                        " component #%d, defaulting to 25/1\n",
2082                        physical_track->edit_rate.num,
2083                        physical_track->edit_rate.den, i);
2084                 physical_track->edit_rate = (AVRational){25, 1};
2085             }
2086 
2087             for (k = 0; k < physical_track->sequence->structural_components_count; k++) {
2088                 if (!(mxf_tc = mxf_resolve_timecode_component(mxf, &physical_track->sequence->structural_components_refs[k])))
2089                     continue;
2090 
2091                 flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
2092                 /* scale sourceclip start_position to match physical track edit rate */
2093                 start_position = av_rescale_q(sourceclip->start_position,
2094                                               physical_track->edit_rate,
2095                                               source_track->edit_rate);
2096 
2097                 if (av_timecode_init(&tc, mxf_tc->rate, flags, start_position + mxf_tc->start_frame, mxf->fc) == 0) {
2098                     mxf_add_timecode_metadata(&st->metadata, "timecode", &tc);
2099                     return 0;
2100                 }
2101             }
2102         }
2103     }
2104 
2105     return 0;
2106 }
2107 
mxf_add_metadata_stream(MXFContext * mxf,MXFTrack * track)2108 static int mxf_add_metadata_stream(MXFContext *mxf, MXFTrack *track)
2109 {
2110     MXFStructuralComponent *component = NULL;
2111     const MXFCodecUL *codec_ul = NULL;
2112     MXFPackage tmp_package;
2113     AVStream *st;
2114     int j;
2115 
2116     for (j = 0; j < track->sequence->structural_components_count; j++) {
2117         component = mxf_resolve_sourceclip(mxf, &track->sequence->structural_components_refs[j]);
2118         if (!component)
2119             continue;
2120         break;
2121     }
2122     if (!component)
2123         return 0;
2124 
2125     st = avformat_new_stream(mxf->fc, NULL);
2126     if (!st) {
2127         av_log(mxf->fc, AV_LOG_ERROR, "could not allocate metadata stream\n");
2128         return AVERROR(ENOMEM);
2129     }
2130 
2131     st->codecpar->codec_type = AVMEDIA_TYPE_DATA;
2132     st->codecpar->codec_id = AV_CODEC_ID_NONE;
2133     st->id = track->track_id;
2134 
2135     memcpy(&tmp_package.package_ul, component->source_package_ul, 16);
2136     memcpy(&tmp_package.package_uid, component->source_package_uid, 16);
2137     mxf_add_umid_metadata(&st->metadata, "file_package_umid", &tmp_package);
2138     if (track->name && track->name[0])
2139         av_dict_set(&st->metadata, "track_name", track->name, 0);
2140 
2141     codec_ul = mxf_get_codec_ul(ff_mxf_data_definition_uls, &track->sequence->data_definition_ul);
2142     av_dict_set(&st->metadata, "data_type", av_get_media_type_string(codec_ul->id), 0);
2143     return 0;
2144 }
2145 
mxf_parse_structural_metadata(MXFContext * mxf)2146 static int mxf_parse_structural_metadata(MXFContext *mxf)
2147 {
2148     MXFPackage *material_package = NULL;
2149     int i, j, k, ret;
2150 
2151     av_log(mxf->fc, AV_LOG_TRACE, "metadata sets count %d\n", mxf->metadata_sets_count);
2152     /* TODO: handle multiple material packages (OP3x) */
2153     for (i = 0; i < mxf->packages_count; i++) {
2154         material_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], MaterialPackage);
2155         if (material_package) break;
2156     }
2157     if (!material_package) {
2158         av_log(mxf->fc, AV_LOG_ERROR, "no material package found\n");
2159         return AVERROR_INVALIDDATA;
2160     }
2161 
2162     mxf_add_umid_metadata(&mxf->fc->metadata, "material_package_umid", material_package);
2163     if (material_package->name && material_package->name[0])
2164         av_dict_set(&mxf->fc->metadata, "material_package_name", material_package->name, 0);
2165     mxf_parse_package_comments(mxf, &mxf->fc->metadata, material_package);
2166 
2167     for (i = 0; i < material_package->tracks_count; i++) {
2168         MXFPackage *source_package = NULL;
2169         MXFTrack *material_track = NULL;
2170         MXFTrack *source_track = NULL;
2171         MXFTrack *temp_track = NULL;
2172         MXFDescriptor *descriptor = NULL;
2173         MXFStructuralComponent *component = NULL;
2174         MXFTimecodeComponent *mxf_tc = NULL;
2175         UID *essence_container_ul = NULL;
2176         const MXFCodecUL *codec_ul = NULL;
2177         const MXFCodecUL *container_ul = NULL;
2178         const MXFCodecUL *pix_fmt_ul = NULL;
2179         AVStream *st;
2180         AVTimecode tc;
2181         int flags;
2182 
2183         if (!(material_track = mxf_resolve_strong_ref(mxf, &material_package->tracks_refs[i], Track))) {
2184             av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track strong ref\n");
2185             continue;
2186         }
2187 
2188         if ((component = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, TimecodeComponent))) {
2189             mxf_tc = (MXFTimecodeComponent*)component;
2190             flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
2191             if (av_timecode_init(&tc, mxf_tc->rate, flags, mxf_tc->start_frame, mxf->fc) == 0) {
2192                 mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
2193             }
2194         }
2195 
2196         if (!(material_track->sequence = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, Sequence))) {
2197             av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track sequence strong ref\n");
2198             continue;
2199         }
2200 
2201         for (j = 0; j < material_track->sequence->structural_components_count; j++) {
2202             component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j], TimecodeComponent);
2203             if (!component)
2204                 continue;
2205 
2206             mxf_tc = (MXFTimecodeComponent*)component;
2207             flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
2208             if (av_timecode_init(&tc, mxf_tc->rate, flags, mxf_tc->start_frame, mxf->fc) == 0) {
2209                 mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
2210                 break;
2211             }
2212         }
2213 
2214         /* TODO: handle multiple source clips, only finds first valid source clip */
2215         if(material_track->sequence->structural_components_count > 1)
2216             av_log(mxf->fc, AV_LOG_WARNING, "material track %d: has %d components\n",
2217                        material_track->track_id, material_track->sequence->structural_components_count);
2218 
2219         for (j = 0; j < material_track->sequence->structural_components_count; j++) {
2220             component = mxf_resolve_sourceclip(mxf, &material_track->sequence->structural_components_refs[j]);
2221             if (!component)
2222                 continue;
2223 
2224             source_package = mxf_resolve_source_package(mxf, component->source_package_ul, component->source_package_uid);
2225             if (!source_package) {
2226                 av_log(mxf->fc, AV_LOG_TRACE, "material track %d: no corresponding source package found\n", material_track->track_id);
2227                 continue;
2228             }
2229             for (k = 0; k < source_package->tracks_count; k++) {
2230                 if (!(temp_track = mxf_resolve_strong_ref(mxf, &source_package->tracks_refs[k], Track))) {
2231                     av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n");
2232                     ret = AVERROR_INVALIDDATA;
2233                     goto fail_and_free;
2234                 }
2235                 if (temp_track->track_id == component->source_track_id) {
2236                     source_track = temp_track;
2237                     break;
2238                 }
2239             }
2240             if (!source_track) {
2241                 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source track found\n", material_track->track_id);
2242                 break;
2243             }
2244 
2245             for (k = 0; k < mxf->essence_container_data_count; k++) {
2246                 MXFEssenceContainerData *essence_data;
2247 
2248                 if (!(essence_data = mxf_resolve_strong_ref(mxf, &mxf->essence_container_data_refs[k], EssenceContainerData))) {
2249                     av_log(mxf->fc, AV_LOG_TRACE, "could not resolve essence container data strong ref\n");
2250                     continue;
2251                 }
2252                 if (!memcmp(component->source_package_ul, essence_data->package_ul, sizeof(UID)) && !memcmp(component->source_package_uid, essence_data->package_uid, sizeof(UID))) {
2253                     source_track->body_sid = essence_data->body_sid;
2254                     source_track->index_sid = essence_data->index_sid;
2255                     break;
2256                 }
2257             }
2258 
2259             if(source_track && component)
2260                 break;
2261         }
2262         if (!source_track || !component || !source_package) {
2263             if((ret = mxf_add_metadata_stream(mxf, material_track)))
2264                 goto fail_and_free;
2265             continue;
2266         }
2267 
2268         if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) {
2269             av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
2270             ret = AVERROR_INVALIDDATA;
2271             goto fail_and_free;
2272         }
2273 
2274         /* 0001GL00.MXF.A1.mxf_opatom.mxf has the same SourcePackageID as 0001GL.MXF.V1.mxf_opatom.mxf
2275          * This would result in both files appearing to have two streams. Work around this by sanity checking DataDefinition */
2276         if (memcmp(material_track->sequence->data_definition_ul, source_track->sequence->data_definition_ul, 16)) {
2277             av_log(mxf->fc, AV_LOG_ERROR, "material track %d: DataDefinition mismatch\n", material_track->track_id);
2278             continue;
2279         }
2280 
2281         st = avformat_new_stream(mxf->fc, NULL);
2282         if (!st) {
2283             av_log(mxf->fc, AV_LOG_ERROR, "could not allocate stream\n");
2284             ret = AVERROR(ENOMEM);
2285             goto fail_and_free;
2286         }
2287         st->id = material_track->track_id;
2288         st->priv_data = source_track;
2289 
2290         source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref, AnyType);
2291         descriptor = mxf_resolve_multidescriptor(mxf, source_package->descriptor, source_track->track_id);
2292 
2293         /* A SourceClip from a EssenceGroup may only be a single frame of essence data. The clips duration is then how many
2294          * frames its suppose to repeat for. Descriptor->duration, if present, contains the real duration of the essence data */
2295         if (descriptor && descriptor->duration != AV_NOPTS_VALUE)
2296             source_track->original_duration = st->duration = FFMIN(descriptor->duration, component->duration);
2297         else
2298             source_track->original_duration = st->duration = component->duration;
2299 
2300         if (st->duration == -1)
2301             st->duration = AV_NOPTS_VALUE;
2302         st->start_time = component->start_position;
2303         if (material_track->edit_rate.num <= 0 ||
2304             material_track->edit_rate.den <= 0) {
2305             av_log(mxf->fc, AV_LOG_WARNING,
2306                    "Invalid edit rate (%d/%d) found on stream #%d, "
2307                    "defaulting to 25/1\n",
2308                    material_track->edit_rate.num,
2309                    material_track->edit_rate.den, st->index);
2310             material_track->edit_rate = (AVRational){25, 1};
2311         }
2312         avpriv_set_pts_info(st, 64, material_track->edit_rate.den, material_track->edit_rate.num);
2313 
2314         /* ensure SourceTrack EditRate == MaterialTrack EditRate since only
2315          * the former is accessible via st->priv_data */
2316         source_track->edit_rate = material_track->edit_rate;
2317 
2318         PRINT_KEY(mxf->fc, "data definition   ul", source_track->sequence->data_definition_ul);
2319         codec_ul = mxf_get_codec_ul(ff_mxf_data_definition_uls, &source_track->sequence->data_definition_ul);
2320         st->codecpar->codec_type = codec_ul->id;
2321 
2322         if (!descriptor) {
2323             av_log(mxf->fc, AV_LOG_INFO, "source track %d: stream %d, no descriptor found\n", source_track->track_id, st->index);
2324             continue;
2325         }
2326         PRINT_KEY(mxf->fc, "essence codec     ul", descriptor->essence_codec_ul);
2327         PRINT_KEY(mxf->fc, "essence container ul", descriptor->essence_container_ul);
2328         essence_container_ul = &descriptor->essence_container_ul;
2329         source_track->wrapping = (mxf->op == OPAtom) ? ClipWrapped : mxf_get_wrapping_kind(essence_container_ul);
2330         if (source_track->wrapping == UnknownWrapped)
2331             av_log(mxf->fc, AV_LOG_INFO, "wrapping of stream %d is unknown\n", st->index);
2332         /* HACK: replacing the original key with mxf_encrypted_essence_container
2333          * is not allowed according to s429-6, try to find correct information anyway */
2334         if (IS_KLV_KEY(essence_container_ul, mxf_encrypted_essence_container)) {
2335             av_log(mxf->fc, AV_LOG_INFO, "broken encrypted mxf file\n");
2336             for (k = 0; k < mxf->metadata_sets_count; k++) {
2337                 MXFMetadataSet *metadata = mxf->metadata_sets[k];
2338                 if (metadata->type == CryptoContext) {
2339                     essence_container_ul = &((MXFCryptoContext *)metadata)->source_container_ul;
2340                     break;
2341                 }
2342             }
2343         }
2344 
2345         /* TODO: drop PictureEssenceCoding and SoundEssenceCompression, only check EssenceContainer */
2346         codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->essence_codec_ul);
2347         st->codecpar->codec_id = (enum AVCodecID)codec_ul->id;
2348         if (st->codecpar->codec_id == AV_CODEC_ID_NONE) {
2349             codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->codec_ul);
2350             st->codecpar->codec_id = (enum AVCodecID)codec_ul->id;
2351         }
2352 
2353         av_log(mxf->fc, AV_LOG_VERBOSE, "%s: Universal Label: ",
2354                avcodec_get_name(st->codecpar->codec_id));
2355         for (k = 0; k < 16; k++) {
2356             av_log(mxf->fc, AV_LOG_VERBOSE, "%.2x",
2357                    descriptor->essence_codec_ul[k]);
2358             if (!(k+1 & 19) || k == 5)
2359                 av_log(mxf->fc, AV_LOG_VERBOSE, ".");
2360         }
2361         av_log(mxf->fc, AV_LOG_VERBOSE, "\n");
2362 
2363         mxf_add_umid_metadata(&st->metadata, "file_package_umid", source_package);
2364         if (source_package->name && source_package->name[0])
2365             av_dict_set(&st->metadata, "file_package_name", source_package->name, 0);
2366         if (material_track->name && material_track->name[0])
2367             av_dict_set(&st->metadata, "track_name", material_track->name, 0);
2368 
2369         mxf_parse_physical_source_package(mxf, source_track, st);
2370 
2371         if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
2372             source_track->intra_only = mxf_is_intra_only(descriptor);
2373             container_ul = mxf_get_codec_ul(mxf_picture_essence_container_uls, essence_container_ul);
2374             if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
2375                 st->codecpar->codec_id = container_ul->id;
2376             st->codecpar->width = descriptor->width;
2377             st->codecpar->height = descriptor->height; /* Field height, not frame height */
2378             switch (descriptor->frame_layout) {
2379                 case FullFrame:
2380                     st->codecpar->field_order = AV_FIELD_PROGRESSIVE;
2381                     break;
2382                 case OneField:
2383                     /* Every other line is stored and needs to be duplicated. */
2384                     av_log(mxf->fc, AV_LOG_INFO, "OneField frame layout isn't currently supported\n");
2385                     break; /* The correct thing to do here is fall through, but by breaking we might be
2386                               able to decode some streams at half the vertical resolution, rather than not al all.
2387                               It's also for compatibility with the old behavior. */
2388                 case MixedFields:
2389                     break;
2390                 case SegmentedFrame:
2391                     st->codecpar->field_order = AV_FIELD_PROGRESSIVE;
2392                 case SeparateFields:
2393                     av_log(mxf->fc, AV_LOG_DEBUG, "video_line_map: (%d, %d), field_dominance: %d\n",
2394                            descriptor->video_line_map[0], descriptor->video_line_map[1],
2395                            descriptor->field_dominance);
2396                     if ((descriptor->video_line_map[0] > 0) && (descriptor->video_line_map[1] > 0)) {
2397                         /* Detect coded field order from VideoLineMap:
2398                          *  (even, even) => bottom field coded first
2399                          *  (even, odd)  => top field coded first
2400                          *  (odd, even)  => top field coded first
2401                          *  (odd, odd)   => bottom field coded first
2402                          */
2403                         if ((descriptor->video_line_map[0] + descriptor->video_line_map[1]) % 2) {
2404                             switch (descriptor->field_dominance) {
2405                                 case MXF_FIELD_DOMINANCE_DEFAULT:
2406                                 case MXF_FIELD_DOMINANCE_FF:
2407                                     st->codecpar->field_order = AV_FIELD_TT;
2408                                     break;
2409                                 case MXF_FIELD_DOMINANCE_FL:
2410                                     st->codecpar->field_order = AV_FIELD_TB;
2411                                     break;
2412                                 default:
2413                                     avpriv_request_sample(mxf->fc,
2414                                                           "Field dominance %d support",
2415                                                           descriptor->field_dominance);
2416                             }
2417                         } else {
2418                             switch (descriptor->field_dominance) {
2419                                 case MXF_FIELD_DOMINANCE_DEFAULT:
2420                                 case MXF_FIELD_DOMINANCE_FF:
2421                                     st->codecpar->field_order = AV_FIELD_BB;
2422                                     break;
2423                                 case MXF_FIELD_DOMINANCE_FL:
2424                                     st->codecpar->field_order = AV_FIELD_BT;
2425                                     break;
2426                                 default:
2427                                     avpriv_request_sample(mxf->fc,
2428                                                           "Field dominance %d support",
2429                                                           descriptor->field_dominance);
2430                             }
2431                         }
2432                     }
2433                     /* Turn field height into frame height. */
2434                     st->codecpar->height *= 2;
2435                     break;
2436                 default:
2437                     av_log(mxf->fc, AV_LOG_INFO, "Unknown frame layout type: %d\n", descriptor->frame_layout);
2438             }
2439 
2440             if (st->codecpar->codec_id == AV_CODEC_ID_PRORES) {
2441                 switch (descriptor->essence_codec_ul[14]) {
2442                 case 1: st->codecpar->codec_tag = MKTAG('a','p','c','o'); break;
2443                 case 2: st->codecpar->codec_tag = MKTAG('a','p','c','s'); break;
2444                 case 3: st->codecpar->codec_tag = MKTAG('a','p','c','n'); break;
2445                 case 4: st->codecpar->codec_tag = MKTAG('a','p','c','h'); break;
2446                 case 5: st->codecpar->codec_tag = MKTAG('a','p','4','h'); break;
2447                 case 6: st->codecpar->codec_tag = MKTAG('a','p','4','x'); break;
2448                 }
2449             }
2450 
2451             if (st->codecpar->codec_id == AV_CODEC_ID_RAWVIDEO) {
2452                 st->codecpar->format = descriptor->pix_fmt;
2453                 if (st->codecpar->format == AV_PIX_FMT_NONE) {
2454                     pix_fmt_ul = mxf_get_codec_ul(ff_mxf_pixel_format_uls,
2455                                                   &descriptor->essence_codec_ul);
2456                     st->codecpar->format = (enum AVPixelFormat)pix_fmt_ul->id;
2457                     if (st->codecpar->format== AV_PIX_FMT_NONE) {
2458                         st->codecpar->codec_tag = mxf_get_codec_ul(ff_mxf_codec_tag_uls,
2459                                                                    &descriptor->essence_codec_ul)->id;
2460                         if (!st->codecpar->codec_tag) {
2461                             /* support files created before RP224v10 by defaulting to UYVY422
2462                                if subsampling is 4:2:2 and component depth is 8-bit */
2463                             if (descriptor->horiz_subsampling == 2 &&
2464                                 descriptor->vert_subsampling == 1 &&
2465                                 descriptor->component_depth == 8) {
2466                                 st->codecpar->format = AV_PIX_FMT_UYVY422;
2467                             }
2468                         }
2469                     }
2470                 }
2471             }
2472             st->need_parsing = AVSTREAM_PARSE_HEADERS;
2473             if (material_track->sequence->origin) {
2474                 av_dict_set_int(&st->metadata, "material_track_origin", material_track->sequence->origin, 0);
2475             }
2476             if (source_track->sequence->origin) {
2477                 av_dict_set_int(&st->metadata, "source_track_origin", source_track->sequence->origin, 0);
2478             }
2479             if (descriptor->aspect_ratio.num && descriptor->aspect_ratio.den)
2480                 st->display_aspect_ratio = descriptor->aspect_ratio;
2481         } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2482             container_ul = mxf_get_codec_ul(mxf_sound_essence_container_uls, essence_container_ul);
2483             /* Only overwrite existing codec ID if it is unset or A-law, which is the default according to SMPTE RP 224. */
2484             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))
2485                 st->codecpar->codec_id = (enum AVCodecID)container_ul->id;
2486             st->codecpar->channels = descriptor->channels;
2487 
2488             if (descriptor->sample_rate.den > 0) {
2489                 st->codecpar->sample_rate = descriptor->sample_rate.num / descriptor->sample_rate.den;
2490                 avpriv_set_pts_info(st, 64, descriptor->sample_rate.den, descriptor->sample_rate.num);
2491             } else {
2492                 av_log(mxf->fc, AV_LOG_WARNING, "invalid sample rate (%d/%d) "
2493                        "found for stream #%d, time base forced to 1/48000\n",
2494                        descriptor->sample_rate.num, descriptor->sample_rate.den,
2495                        st->index);
2496                 avpriv_set_pts_info(st, 64, 1, 48000);
2497             }
2498 
2499             /* if duration is set, rescale it from EditRate to SampleRate */
2500             if (st->duration != AV_NOPTS_VALUE)
2501                 st->duration = av_rescale_q(st->duration,
2502                                             av_inv_q(material_track->edit_rate),
2503                                             st->time_base);
2504 
2505             /* TODO: implement AV_CODEC_ID_RAWAUDIO */
2506             if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16LE) {
2507                 if (descriptor->bits_per_sample > 16 && descriptor->bits_per_sample <= 24)
2508                     st->codecpar->codec_id = AV_CODEC_ID_PCM_S24LE;
2509                 else if (descriptor->bits_per_sample == 32)
2510                     st->codecpar->codec_id = AV_CODEC_ID_PCM_S32LE;
2511             } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE) {
2512                 if (descriptor->bits_per_sample > 16 && descriptor->bits_per_sample <= 24)
2513                     st->codecpar->codec_id = AV_CODEC_ID_PCM_S24BE;
2514                 else if (descriptor->bits_per_sample == 32)
2515                     st->codecpar->codec_id = AV_CODEC_ID_PCM_S32BE;
2516             } else if (st->codecpar->codec_id == AV_CODEC_ID_MP2) {
2517                 st->need_parsing = AVSTREAM_PARSE_FULL;
2518             }
2519             st->codecpar->bits_per_coded_sample = av_get_bits_per_sample(st->codecpar->codec_id);
2520         } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
2521             enum AVMediaType type;
2522             container_ul = mxf_get_codec_ul(mxf_data_essence_container_uls, essence_container_ul);
2523             if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
2524                 st->codecpar->codec_id = container_ul->id;
2525             type = avcodec_get_type(st->codecpar->codec_id);
2526             if (type == AVMEDIA_TYPE_SUBTITLE)
2527                 st->codecpar->codec_type = type;
2528             if (container_ul->desc)
2529                 av_dict_set(&st->metadata, "data_type", container_ul->desc, 0);
2530             if (mxf->eia608_extract &&
2531                 !strcmp(container_ul->desc, "vbi_vanc_smpte_436M")) {
2532                 st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
2533                 st->codecpar->codec_id = AV_CODEC_ID_EIA_608;
2534             }
2535         }
2536         if (descriptor->extradata) {
2537             if (!ff_alloc_extradata(st->codecpar, descriptor->extradata_size)) {
2538                 memcpy(st->codecpar->extradata, descriptor->extradata, descriptor->extradata_size);
2539             }
2540         } else if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
2541             int coded_width = mxf_get_codec_ul(mxf_intra_only_picture_coded_width,
2542                                                &descriptor->essence_codec_ul)->id;
2543             if (coded_width)
2544                 st->codecpar->width = coded_width;
2545             ret = ff_generate_avci_extradata(st);
2546             if (ret < 0)
2547                 return ret;
2548         }
2549         if (st->codecpar->codec_type != AVMEDIA_TYPE_DATA && source_track->wrapping != FrameWrapped) {
2550             /* TODO: decode timestamps */
2551             st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS;
2552         }
2553     }
2554 
2555     for (int i = 0; i < mxf->fc->nb_streams; i++) {
2556         MXFTrack *track1 = mxf->fc->streams[i]->priv_data;
2557         if (track1 && track1->body_sid) {
2558             for (int j = i + 1; j < mxf->fc->nb_streams; j++) {
2559                 MXFTrack *track2 = mxf->fc->streams[j]->priv_data;
2560                 if (track2 && track1->body_sid == track2->body_sid && track1->wrapping != track2->wrapping) {
2561                     if (track1->wrapping == UnknownWrapped)
2562                         track1->wrapping = track2->wrapping;
2563                     else if (track2->wrapping == UnknownWrapped)
2564                         track2->wrapping = track1->wrapping;
2565                     else
2566                         av_log(mxf->fc, AV_LOG_ERROR, "stream %d and stream %d have the same BodySID (%d) "
2567                                                       "with different wrapping\n", i, j, track1->body_sid);
2568                 }
2569             }
2570         }
2571     }
2572 
2573     ret = 0;
2574 fail_and_free:
2575     return ret;
2576 }
2577 
mxf_timestamp_to_int64(uint64_t timestamp)2578 static int64_t mxf_timestamp_to_int64(uint64_t timestamp)
2579 {
2580     struct tm time = { 0 };
2581     int msecs;
2582     time.tm_year = (timestamp >> 48) - 1900;
2583     time.tm_mon  = (timestamp >> 40 & 0xFF) - 1;
2584     time.tm_mday = (timestamp >> 32 & 0xFF);
2585     time.tm_hour = (timestamp >> 24 & 0xFF);
2586     time.tm_min  = (timestamp >> 16 & 0xFF);
2587     time.tm_sec  = (timestamp >> 8  & 0xFF);
2588     msecs        = (timestamp & 0xFF) * 4;
2589 
2590     /* Clip values for legacy reasons. Maybe we should return error instead? */
2591     time.tm_mon  = av_clip(time.tm_mon,  0, 11);
2592     time.tm_mday = av_clip(time.tm_mday, 1, 31);
2593     time.tm_hour = av_clip(time.tm_hour, 0, 23);
2594     time.tm_min  = av_clip(time.tm_min,  0, 59);
2595     time.tm_sec  = av_clip(time.tm_sec,  0, 59);
2596     msecs        = av_clip(msecs, 0, 999);
2597 
2598     return (int64_t)av_timegm(&time) * 1000000 + msecs * 1000;
2599 }
2600 
2601 #define SET_STR_METADATA(pb, name, str) do { \
2602     if ((ret = mxf_read_utf16be_string(pb, size, &str)) < 0) \
2603         return ret; \
2604     av_dict_set(&s->metadata, name, str, AV_DICT_DONT_STRDUP_VAL); \
2605 } while (0)
2606 
2607 #define SET_UID_METADATA(pb, name, var, str) do { \
2608     avio_read(pb, var, 16); \
2609     if ((ret = mxf_uid_to_str(var, &str)) < 0) \
2610         return ret; \
2611     av_dict_set(&s->metadata, name, str, AV_DICT_DONT_STRDUP_VAL); \
2612 } while (0)
2613 
2614 #define SET_TS_METADATA(pb, name, var, str) do { \
2615     var = avio_rb64(pb); \
2616     if (var && (ret = avpriv_dict_set_timestamp(&s->metadata, name, mxf_timestamp_to_int64(var))) < 0) \
2617         return ret; \
2618 } while (0)
2619 
mxf_read_identification_metadata(void * arg,AVIOContext * pb,int tag,int size,UID _uid,int64_t klv_offset)2620 static int mxf_read_identification_metadata(void *arg, AVIOContext *pb, int tag, int size, UID _uid, int64_t klv_offset)
2621 {
2622     MXFContext *mxf = arg;
2623     AVFormatContext *s = mxf->fc;
2624     int ret;
2625     UID uid = { 0 };
2626     char *str = NULL;
2627     uint64_t ts;
2628     switch (tag) {
2629     case 0x3C01:
2630         SET_STR_METADATA(pb, "company_name", str);
2631         break;
2632     case 0x3C02:
2633         SET_STR_METADATA(pb, "product_name", str);
2634         break;
2635     case 0x3C04:
2636         SET_STR_METADATA(pb, "product_version", str);
2637         break;
2638     case 0x3C05:
2639         SET_UID_METADATA(pb, "product_uid", uid, str);
2640         break;
2641     case 0x3C06:
2642         SET_TS_METADATA(pb, "modification_date", ts, str);
2643         break;
2644     case 0x3C08:
2645         SET_STR_METADATA(pb, "application_platform", str);
2646         break;
2647     case 0x3C09:
2648         SET_UID_METADATA(pb, "generation_uid", uid, str);
2649         break;
2650     case 0x3C0A:
2651         SET_UID_METADATA(pb, "uid", uid, str);
2652         break;
2653     }
2654     return 0;
2655 }
2656 
mxf_read_preface_metadata(void * arg,AVIOContext * pb,int tag,int size,UID uid,int64_t klv_offset)2657 static int mxf_read_preface_metadata(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
2658 {
2659     MXFContext *mxf = arg;
2660     AVFormatContext *s = mxf->fc;
2661     int ret;
2662     char *str = NULL;
2663 
2664     if (tag >= 0x8000 && (IS_KLV_KEY(uid, mxf_avid_project_name))) {
2665         SET_STR_METADATA(pb, "project_name", str);
2666     }
2667     return 0;
2668 }
2669 
2670 static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = {
2671     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x05,0x01,0x00 }, mxf_read_primer_pack },
2672     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x01,0x00 }, mxf_read_partition_pack },
2673     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x02,0x00 }, mxf_read_partition_pack },
2674     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x03,0x00 }, mxf_read_partition_pack },
2675     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x04,0x00 }, mxf_read_partition_pack },
2676     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x01,0x00 }, mxf_read_partition_pack },
2677     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x02,0x00 }, mxf_read_partition_pack },
2678     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x03,0x00 }, mxf_read_partition_pack },
2679     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x04,0x00 }, mxf_read_partition_pack },
2680     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x02,0x00 }, mxf_read_partition_pack },
2681     { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }, mxf_read_partition_pack },
2682     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x2f,0x00 }, mxf_read_preface_metadata },
2683     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x30,0x00 }, mxf_read_identification_metadata },
2684     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_content_storage, 0, AnyType },
2685     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_package, sizeof(MXFPackage), SourcePackage },
2686     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_package, sizeof(MXFPackage), MaterialPackage },
2687     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0f,0x00 }, mxf_read_sequence, sizeof(MXFSequence), Sequence },
2688     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x05,0x00 }, mxf_read_essence_group, sizeof(MXFEssenceGroup), EssenceGroup},
2689     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_source_clip, sizeof(MXFStructuralComponent), SourceClip },
2690     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3f,0x00 }, mxf_read_tagged_value, sizeof(MXFTaggedValue), TaggedValue },
2691     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), MultipleDescriptor },
2692     { { 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 */
2693     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* CDCI */
2694     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* RGBA */
2695     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* Wave */
2696     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* AES3 */
2697     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* MPEG2VideoDescriptor */
2698     { { 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 */
2699     { { 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 */
2700     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x5e,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* MPEG2AudioDescriptor */
2701     { { 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 */
2702     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Static Track */
2703     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Generic Track */
2704     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x14,0x00 }, mxf_read_timecode_component, sizeof(MXFTimecodeComponent), TimecodeComponent },
2705     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0c,0x00 }, mxf_read_pulldown_component, sizeof(MXFPulldownComponent), PulldownComponent },
2706     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 }, mxf_read_cryptographic_context, sizeof(MXFCryptoContext), CryptoContext },
2707     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 }, mxf_read_index_table_segment, sizeof(MXFIndexTableSegment), IndexTableSegment },
2708     { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x23,0x00 }, mxf_read_essence_container_data, sizeof(MXFEssenceContainerData), EssenceContainerData },
2709     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType },
2710 };
2711 
mxf_metadataset_init(MXFMetadataSet * ctx,enum MXFMetadataSetType type)2712 static int mxf_metadataset_init(MXFMetadataSet *ctx, enum MXFMetadataSetType type)
2713 {
2714     switch (type){
2715     case MultipleDescriptor:
2716     case Descriptor:
2717         ((MXFDescriptor*)ctx)->pix_fmt = AV_PIX_FMT_NONE;
2718         ((MXFDescriptor*)ctx)->duration = AV_NOPTS_VALUE;
2719         break;
2720     default:
2721         break;
2722     }
2723     return 0;
2724 }
2725 
mxf_read_local_tags(MXFContext * mxf,KLVPacket * klv,MXFMetadataReadFunc * read_child,int ctx_size,enum MXFMetadataSetType type)2726 static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadFunc *read_child, int ctx_size, enum MXFMetadataSetType type)
2727 {
2728     AVIOContext *pb = mxf->fc->pb;
2729     MXFMetadataSet *ctx = ctx_size ? av_mallocz(ctx_size) : mxf;
2730     uint64_t klv_end = avio_tell(pb) + klv->length;
2731 
2732     if (!ctx)
2733         return AVERROR(ENOMEM);
2734     mxf_metadataset_init(ctx, type);
2735     while (avio_tell(pb) + 4 < klv_end && !avio_feof(pb)) {
2736         int ret;
2737         int tag = avio_rb16(pb);
2738         int size = avio_rb16(pb); /* KLV specified by 0x53 */
2739         int64_t next = avio_tell(pb);
2740         UID uid = {0};
2741         if (next < 0 || next > INT64_MAX - size)
2742             return next < 0 ? next : AVERROR_INVALIDDATA;
2743         next += size;
2744 
2745         av_log(mxf->fc, AV_LOG_TRACE, "local tag %#04x size %d\n", tag, size);
2746         if (!size) { /* ignore empty tag, needed for some files with empty UMID tag */
2747             av_log(mxf->fc, AV_LOG_ERROR, "local tag %#04x with 0 size\n", tag);
2748             continue;
2749         }
2750         if (tag > 0x7FFF) { /* dynamic tag */
2751             int i;
2752             for (i = 0; i < mxf->local_tags_count; i++) {
2753                 int local_tag = AV_RB16(mxf->local_tags+i*18);
2754                 if (local_tag == tag) {
2755                     memcpy(uid, mxf->local_tags+i*18+2, 16);
2756                     av_log(mxf->fc, AV_LOG_TRACE, "local tag %#04x\n", local_tag);
2757                     PRINT_KEY(mxf->fc, "uid", uid);
2758                 }
2759             }
2760         }
2761         if (ctx_size && tag == 0x3C0A) {
2762             avio_read(pb, ctx->uid, 16);
2763         } else if ((ret = read_child(ctx, pb, tag, size, uid, -1)) < 0) {
2764             if (ctx_size)
2765                 mxf_free_metadataset(&ctx, 1);
2766             return ret;
2767         }
2768 
2769         /* Accept the 64k local set limit being exceeded (Avid). Don't accept
2770          * it extending past the end of the KLV though (zzuf5.mxf). */
2771         if (avio_tell(pb) > klv_end) {
2772             if (ctx_size) {
2773                 ctx->type = type;
2774                 mxf_free_metadataset(&ctx, 1);
2775             }
2776 
2777             av_log(mxf->fc, AV_LOG_ERROR,
2778                    "local tag %#04x extends past end of local set @ %#"PRIx64"\n",
2779                    tag, klv->offset);
2780             return AVERROR_INVALIDDATA;
2781         } else if (avio_tell(pb) <= next)   /* only seek forward, else this can loop for a long time */
2782             avio_seek(pb, next, SEEK_SET);
2783     }
2784     if (ctx_size) ctx->type = type;
2785     return ctx_size ? mxf_add_metadata_set(mxf, ctx) : 0;
2786 }
2787 
2788 /**
2789  * Matches any partition pack key, in other words:
2790  * - HeaderPartition
2791  * - BodyPartition
2792  * - FooterPartition
2793  * @return non-zero if the key is a partition pack key, zero otherwise
2794  */
mxf_is_partition_pack_key(UID key)2795 static int mxf_is_partition_pack_key(UID key)
2796 {
2797     //NOTE: this is a little lax since it doesn't constraint key[14]
2798     return !memcmp(key, mxf_header_partition_pack_key, 13) &&
2799             key[13] >= 2 && key[13] <= 4;
2800 }
2801 
2802 /**
2803  * Parses a metadata KLV
2804  * @return <0 on error, 0 otherwise
2805  */
mxf_parse_klv(MXFContext * mxf,KLVPacket klv,MXFMetadataReadFunc * read,int ctx_size,enum MXFMetadataSetType type)2806 static int mxf_parse_klv(MXFContext *mxf, KLVPacket klv, MXFMetadataReadFunc *read,
2807                                      int ctx_size, enum MXFMetadataSetType type)
2808 {
2809     AVFormatContext *s = mxf->fc;
2810     int res;
2811     if (klv.key[5] == 0x53) {
2812         res = mxf_read_local_tags(mxf, &klv, read, ctx_size, type);
2813     } else {
2814         uint64_t next = avio_tell(s->pb) + klv.length;
2815         res = read(mxf, s->pb, 0, klv.length, klv.key, klv.offset);
2816 
2817         /* only seek forward, else this can loop for a long time */
2818         if (avio_tell(s->pb) > next) {
2819             av_log(s, AV_LOG_ERROR, "read past end of KLV @ %#"PRIx64"\n",
2820                    klv.offset);
2821             return AVERROR_INVALIDDATA;
2822         }
2823 
2824         avio_seek(s->pb, next, SEEK_SET);
2825     }
2826     if (res < 0) {
2827         av_log(s, AV_LOG_ERROR, "error reading header metadata\n");
2828         return res;
2829     }
2830     return 0;
2831 }
2832 
2833 /**
2834  * Seeks to the previous partition and parses it, if possible
2835  * @return <= 0 if we should stop parsing, > 0 if we should keep going
2836  */
mxf_seek_to_previous_partition(MXFContext * mxf)2837 static int mxf_seek_to_previous_partition(MXFContext *mxf)
2838 {
2839     AVIOContext *pb = mxf->fc->pb;
2840     KLVPacket klv;
2841     int64_t current_partition_ofs;
2842     int ret;
2843 
2844     if (!mxf->current_partition ||
2845         mxf->run_in + mxf->current_partition->previous_partition <= mxf->last_forward_tell)
2846         return 0;   /* we've parsed all partitions */
2847 
2848     /* seek to previous partition */
2849     current_partition_ofs = mxf->current_partition->pack_ofs;   //includes run-in
2850     avio_seek(pb, mxf->run_in + mxf->current_partition->previous_partition, SEEK_SET);
2851     mxf->current_partition = NULL;
2852 
2853     av_log(mxf->fc, AV_LOG_TRACE, "seeking to previous partition\n");
2854 
2855     /* Make sure this is actually a PartitionPack, and if so parse it.
2856      * See deadlock2.mxf
2857      */
2858     if ((ret = klv_read_packet(&klv, pb)) < 0) {
2859         av_log(mxf->fc, AV_LOG_ERROR, "failed to read PartitionPack KLV\n");
2860         return ret;
2861     }
2862 
2863     if (!mxf_is_partition_pack_key(klv.key)) {
2864         av_log(mxf->fc, AV_LOG_ERROR, "PreviousPartition @ %" PRIx64 " isn't a PartitionPack\n", klv.offset);
2865         return AVERROR_INVALIDDATA;
2866     }
2867 
2868     /* We can't just check ofs >= current_partition_ofs because PreviousPartition
2869      * can point to just before the current partition, causing klv_read_packet()
2870      * to sync back up to it. See deadlock3.mxf
2871      */
2872     if (klv.offset >= current_partition_ofs) {
2873         av_log(mxf->fc, AV_LOG_ERROR, "PreviousPartition for PartitionPack @ %"
2874                PRIx64 " indirectly points to itself\n", current_partition_ofs);
2875         return AVERROR_INVALIDDATA;
2876     }
2877 
2878     if ((ret = mxf_parse_klv(mxf, klv, mxf_read_partition_pack, 0, 0)) < 0)
2879         return ret;
2880 
2881     return 1;
2882 }
2883 
2884 /**
2885  * Called when essence is encountered
2886  * @return <= 0 if we should stop parsing, > 0 if we should keep going
2887  */
mxf_parse_handle_essence(MXFContext * mxf)2888 static int mxf_parse_handle_essence(MXFContext *mxf)
2889 {
2890     AVIOContext *pb = mxf->fc->pb;
2891     int64_t ret;
2892 
2893     if (mxf->parsing_backward) {
2894         return mxf_seek_to_previous_partition(mxf);
2895     } else {
2896         if (!mxf->footer_partition) {
2897             av_log(mxf->fc, AV_LOG_TRACE, "no FooterPartition\n");
2898             return 0;
2899         }
2900 
2901         av_log(mxf->fc, AV_LOG_TRACE, "seeking to FooterPartition\n");
2902 
2903         /* remember where we were so we don't end up seeking further back than this */
2904         mxf->last_forward_tell = avio_tell(pb);
2905 
2906         if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) {
2907             av_log(mxf->fc, AV_LOG_INFO, "file is not seekable - not parsing FooterPartition\n");
2908             return -1;
2909         }
2910 
2911         /* seek to FooterPartition and parse backward */
2912         if ((ret = avio_seek(pb, mxf->run_in + mxf->footer_partition, SEEK_SET)) < 0) {
2913             av_log(mxf->fc, AV_LOG_ERROR,
2914                    "failed to seek to FooterPartition @ 0x%" PRIx64
2915                    " (%"PRId64") - partial file?\n",
2916                    mxf->run_in + mxf->footer_partition, ret);
2917             return ret;
2918         }
2919 
2920         mxf->current_partition = NULL;
2921         mxf->parsing_backward = 1;
2922     }
2923 
2924     return 1;
2925 }
2926 
2927 /**
2928  * Called when the next partition or EOF is encountered
2929  * @return <= 0 if we should stop parsing, > 0 if we should keep going
2930  */
mxf_parse_handle_partition_or_eof(MXFContext * mxf)2931 static int mxf_parse_handle_partition_or_eof(MXFContext *mxf)
2932 {
2933     return mxf->parsing_backward ? mxf_seek_to_previous_partition(mxf) : 1;
2934 }
2935 
mxf_get_wrapping_by_body_sid(AVFormatContext * s,int body_sid)2936 static MXFWrappingScheme mxf_get_wrapping_by_body_sid(AVFormatContext *s, int body_sid)
2937 {
2938     for (int i = 0; i < s->nb_streams; i++) {
2939         MXFTrack *track = s->streams[i]->priv_data;
2940         if (track && track->body_sid == body_sid && track->wrapping != UnknownWrapped)
2941             return track->wrapping;
2942     }
2943     return UnknownWrapped;
2944 }
2945 
2946 /**
2947  * Figures out the proper offset and length of the essence container in each partition
2948  */
mxf_compute_essence_containers(AVFormatContext * s)2949 static void mxf_compute_essence_containers(AVFormatContext *s)
2950 {
2951     MXFContext *mxf = s->priv_data;
2952     int x;
2953 
2954     for (x = 0; x < mxf->partitions_count; x++) {
2955         MXFPartition *p = &mxf->partitions[x];
2956         MXFWrappingScheme wrapping;
2957 
2958         if (!p->body_sid)
2959             continue;       /* BodySID == 0 -> no essence */
2960 
2961         /* for clip wrapped essences we point essence_offset after the KL (usually klv.offset + 20 or 25)
2962          * otherwise we point essence_offset at the key of the first essence KLV.
2963          */
2964 
2965         wrapping = (mxf->op == OPAtom) ? ClipWrapped : mxf_get_wrapping_by_body_sid(s, p->body_sid);
2966 
2967         if (wrapping == ClipWrapped) {
2968             p->essence_offset = p->first_essence_klv.next_klv - p->first_essence_klv.length;
2969             p->essence_length = p->first_essence_klv.length;
2970         } else {
2971             p->essence_offset = p->first_essence_klv.offset;
2972 
2973             /* essence container spans to the next partition */
2974             if (x < mxf->partitions_count - 1)
2975                 p->essence_length = mxf->partitions[x+1].this_partition - p->essence_offset;
2976 
2977             if (p->essence_length < 0) {
2978                 /* next ThisPartition < essence_offset */
2979                 p->essence_length = 0;
2980                 av_log(mxf->fc, AV_LOG_ERROR,
2981                        "partition %i: bad ThisPartition = %"PRIX64"\n",
2982                        x+1, mxf->partitions[x+1].this_partition);
2983             }
2984         }
2985     }
2986 }
2987 
is_pcm(enum AVCodecID codec_id)2988 static int is_pcm(enum AVCodecID codec_id)
2989 {
2990     /* we only care about "normal" PCM codecs until we get samples */
2991     return codec_id >= AV_CODEC_ID_PCM_S16LE && codec_id < AV_CODEC_ID_PCM_S24DAUD;
2992 }
2993 
mxf_find_index_table(MXFContext * mxf,int index_sid)2994 static MXFIndexTable *mxf_find_index_table(MXFContext *mxf, int index_sid)
2995 {
2996     int i;
2997     for (i = 0; i < mxf->nb_index_tables; i++)
2998         if (mxf->index_tables[i].index_sid == index_sid)
2999             return &mxf->index_tables[i];
3000     return NULL;
3001 }
3002 
3003 /**
3004  * Deal with the case where for some audio atoms EditUnitByteCount is
3005  * very small (2, 4..). In those cases we should read more than one
3006  * sample per call to mxf_read_packet().
3007  */
mxf_compute_edit_units_per_packet(MXFContext * mxf,AVStream * st)3008 static void mxf_compute_edit_units_per_packet(MXFContext *mxf, AVStream *st)
3009 {
3010     MXFTrack *track = st->priv_data;
3011     MXFIndexTable *t;
3012 
3013     if (!track)
3014         return;
3015     track->edit_units_per_packet = 1;
3016     if (track->wrapping != ClipWrapped)
3017         return;
3018 
3019     t = mxf_find_index_table(mxf, track->index_sid);
3020 
3021     /* expect PCM with exactly one index table segment and a small (< 32) EUBC */
3022     if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO         ||
3023         !is_pcm(st->codecpar->codec_id)                        ||
3024         !t                                                     ||
3025         t->nb_segments != 1                                    ||
3026         t->segments[0]->edit_unit_byte_count >= 32)
3027         return;
3028 
3029     /* arbitrarily default to 48 kHz PAL audio frame size */
3030     /* TODO: We could compute this from the ratio between the audio
3031      *       and video edit rates for 48 kHz NTSC we could use the
3032      *       1802-1802-1802-1802-1801 pattern. */
3033     track->edit_units_per_packet = FFMAX(1, track->edit_rate.num / track->edit_rate.den / 25);
3034 }
3035 
3036 /**
3037  * Deal with the case where ClipWrapped essences does not have any IndexTableSegments.
3038  */
mxf_handle_missing_index_segment(MXFContext * mxf,AVStream * st)3039 static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st)
3040 {
3041     MXFTrack *track = st->priv_data;
3042     MXFIndexTableSegment *segment = NULL;
3043     MXFPartition *p = NULL;
3044     int essence_partition_count = 0;
3045     int edit_unit_byte_count = 0;
3046     int i, ret;
3047 
3048     if (!track || track->wrapping != ClipWrapped)
3049         return 0;
3050 
3051     /* check if track already has an IndexTableSegment */
3052     for (i = 0; i < mxf->metadata_sets_count; i++) {
3053         if (mxf->metadata_sets[i]->type == IndexTableSegment) {
3054             MXFIndexTableSegment *s = (MXFIndexTableSegment*)mxf->metadata_sets[i];
3055             if (s->body_sid == track->body_sid)
3056                 return 0;
3057         }
3058     }
3059 
3060     /* find the essence partition */
3061     for (i = 0; i < mxf->partitions_count; i++) {
3062         /* BodySID == 0 -> no essence */
3063         if (mxf->partitions[i].body_sid != track->body_sid)
3064             continue;
3065 
3066         p = &mxf->partitions[i];
3067         essence_partition_count++;
3068     }
3069 
3070     /* only handle files with a single essence partition */
3071     if (essence_partition_count != 1)
3072         return 0;
3073 
3074     if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && is_pcm(st->codecpar->codec_id)) {
3075         edit_unit_byte_count = (av_get_bits_per_sample(st->codecpar->codec_id) * st->codecpar->channels) >> 3;
3076     } else if (st->duration > 0 && p->first_essence_klv.length > 0 && p->first_essence_klv.length % st->duration == 0) {
3077         edit_unit_byte_count = p->first_essence_klv.length / st->duration;
3078     }
3079 
3080     if (edit_unit_byte_count <= 0)
3081         return 0;
3082 
3083     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);
3084 
3085     if (!(segment = av_mallocz(sizeof(*segment))))
3086         return AVERROR(ENOMEM);
3087 
3088     if ((ret = mxf_add_metadata_set(mxf, segment))) {
3089         mxf_free_metadataset((MXFMetadataSet**)&segment, 1);
3090         return ret;
3091     }
3092 
3093     /* Make sure we have nonzero unique index_sid, body_sid will be ok, because
3094      * using the same SID for index is forbidden in MXF. */
3095     if (!track->index_sid)
3096         track->index_sid = track->body_sid;
3097 
3098     segment->type = IndexTableSegment;
3099     /* stream will be treated as small EditUnitByteCount */
3100     segment->edit_unit_byte_count = edit_unit_byte_count;
3101     segment->index_start_position = 0;
3102     segment->index_duration = st->duration;
3103     segment->index_edit_rate = av_inv_q(st->time_base);
3104     segment->index_sid = track->index_sid;
3105     segment->body_sid = p->body_sid;
3106     return 0;
3107 }
3108 
mxf_read_random_index_pack(AVFormatContext * s)3109 static void mxf_read_random_index_pack(AVFormatContext *s)
3110 {
3111     MXFContext *mxf = s->priv_data;
3112     uint32_t length;
3113     int64_t file_size, max_rip_length, min_rip_length;
3114     KLVPacket klv;
3115 
3116     if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL))
3117         return;
3118 
3119     file_size = avio_size(s->pb);
3120 
3121     /* S377m says to check the RIP length for "silly" values, without defining "silly".
3122      * The limit below assumes a file with nothing but partition packs and a RIP.
3123      * Before changing this, consider that a muxer may place each sample in its own partition.
3124      *
3125      * 105 is the size of the smallest possible PartitionPack
3126      * 12 is the size of each RIP entry
3127      * 28 is the size of the RIP header and footer, assuming an 8-byte BER
3128      */
3129     max_rip_length = ((file_size - mxf->run_in) / 105) * 12 + 28;
3130     max_rip_length = FFMIN(max_rip_length, INT_MAX); //2 GiB and up is also silly
3131 
3132     /* We're only interested in RIPs with at least two entries.. */
3133     min_rip_length = 16+1+24+4;
3134 
3135     /* See S377m section 11 */
3136     avio_seek(s->pb, file_size - 4, SEEK_SET);
3137     length = avio_rb32(s->pb);
3138 
3139     if (length < min_rip_length || length > max_rip_length)
3140         goto end;
3141     avio_seek(s->pb, file_size - length, SEEK_SET);
3142     if (klv_read_packet(&klv, s->pb) < 0 ||
3143         !IS_KLV_KEY(klv.key, mxf_random_index_pack_key))
3144         goto end;
3145     if (klv.next_klv != file_size || klv.length <= 4 || (klv.length - 4) % 12) {
3146         av_log(s, AV_LOG_WARNING, "Invalid RIP KLV length\n");
3147         goto end;
3148     }
3149 
3150     avio_skip(s->pb, klv.length - 12);
3151     mxf->footer_partition = avio_rb64(s->pb);
3152 
3153     /* sanity check */
3154     if (mxf->run_in + mxf->footer_partition >= file_size) {
3155         av_log(s, AV_LOG_WARNING, "bad FooterPartition in RIP - ignoring\n");
3156         mxf->footer_partition = 0;
3157     }
3158 
3159 end:
3160     avio_seek(s->pb, mxf->run_in, SEEK_SET);
3161 }
3162 
mxf_read_header(AVFormatContext * s)3163 static int mxf_read_header(AVFormatContext *s)
3164 {
3165     MXFContext *mxf = s->priv_data;
3166     KLVPacket klv;
3167     int64_t essence_offset = 0;
3168     int ret;
3169 
3170     mxf->last_forward_tell = INT64_MAX;
3171 
3172     if (!mxf_read_sync(s->pb, mxf_header_partition_pack_key, 14)) {
3173         av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n");
3174         //goto fail should not be needed as no metadata sets will have been parsed yet
3175         return AVERROR_INVALIDDATA;
3176     }
3177     avio_seek(s->pb, -14, SEEK_CUR);
3178     mxf->fc = s;
3179     mxf->run_in = avio_tell(s->pb);
3180 
3181     mxf_read_random_index_pack(s);
3182 
3183     while (!avio_feof(s->pb)) {
3184         const MXFMetadataReadTableEntry *metadata;
3185 
3186         if (klv_read_packet(&klv, s->pb) < 0) {
3187             /* EOF - seek to previous partition or stop */
3188             if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
3189                 break;
3190             else
3191                 continue;
3192         }
3193 
3194         PRINT_KEY(s, "read header", klv.key);
3195         av_log(s, AV_LOG_TRACE, "size %"PRIu64" offset %#"PRIx64"\n", klv.length, klv.offset);
3196         if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key) ||
3197             IS_KLV_KEY(klv.key, mxf_essence_element_key) ||
3198             IS_KLV_KEY(klv.key, mxf_canopus_essence_element_key) ||
3199             IS_KLV_KEY(klv.key, mxf_avid_essence_element_key) ||
3200             IS_KLV_KEY(klv.key, mxf_system_item_key_cp) ||
3201             IS_KLV_KEY(klv.key, mxf_system_item_key_gc)) {
3202 
3203             if (!mxf->current_partition) {
3204                 av_log(mxf->fc, AV_LOG_ERROR, "found essence prior to first PartitionPack\n");
3205                 ret = AVERROR_INVALIDDATA;
3206                 goto fail;
3207             }
3208 
3209             if (!mxf->current_partition->first_essence_klv.offset)
3210                 mxf->current_partition->first_essence_klv = klv;
3211 
3212             if (!essence_offset)
3213                 essence_offset = klv.offset;
3214 
3215             /* seek to footer, previous partition or stop */
3216             if (mxf_parse_handle_essence(mxf) <= 0)
3217                 break;
3218             continue;
3219         } else if (mxf_is_partition_pack_key(klv.key) && mxf->current_partition) {
3220             /* next partition pack - keep going, seek to previous partition or stop */
3221             if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
3222                 break;
3223             else if (mxf->parsing_backward)
3224                 continue;
3225             /* we're still parsing forward. proceed to parsing this partition pack */
3226         }
3227 
3228         for (metadata = mxf_metadata_read_table; metadata->read; metadata++) {
3229             if (IS_KLV_KEY(klv.key, metadata->key)) {
3230                 if ((ret = mxf_parse_klv(mxf, klv, metadata->read, metadata->ctx_size, metadata->type)) < 0)
3231                     goto fail;
3232                 break;
3233             }
3234         }
3235         if (!metadata->read) {
3236             av_log(s, AV_LOG_VERBOSE, "Dark key " PRIxUID "\n",
3237                             UID_ARG(klv.key));
3238             avio_skip(s->pb, klv.length);
3239         }
3240     }
3241     /* FIXME avoid seek */
3242     if (!essence_offset)  {
3243         av_log(s, AV_LOG_ERROR, "no essence\n");
3244         ret = AVERROR_INVALIDDATA;
3245         goto fail;
3246     }
3247     avio_seek(s->pb, essence_offset, SEEK_SET);
3248 
3249     /* we need to do this before computing the index tables
3250      * to be able to fill in zero IndexDurations with st->duration */
3251     if ((ret = mxf_parse_structural_metadata(mxf)) < 0)
3252         goto fail;
3253 
3254     for (int i = 0; i < s->nb_streams; i++)
3255         mxf_handle_missing_index_segment(mxf, s->streams[i]);
3256 
3257     if ((ret = mxf_compute_index_tables(mxf)) < 0)
3258         goto fail;
3259 
3260     if (mxf->nb_index_tables > 1) {
3261         /* TODO: look up which IndexSID to use via EssenceContainerData */
3262         av_log(mxf->fc, AV_LOG_INFO, "got %i index tables - only the first one (IndexSID %i) will be used\n",
3263                mxf->nb_index_tables, mxf->index_tables[0].index_sid);
3264     } else if (mxf->nb_index_tables == 0 && mxf->op == OPAtom && (s->error_recognition & AV_EF_EXPLODE)) {
3265         av_log(mxf->fc, AV_LOG_ERROR, "cannot demux OPAtom without an index\n");
3266         ret = AVERROR_INVALIDDATA;
3267         goto fail;
3268     }
3269 
3270     mxf_compute_essence_containers(s);
3271 
3272     for (int i = 0; i < s->nb_streams; i++)
3273         mxf_compute_edit_units_per_packet(mxf, s->streams[i]);
3274 
3275     return 0;
3276 fail:
3277     mxf_read_close(s);
3278 
3279     return ret;
3280 }
3281 
3282 /* Get the edit unit of the next packet from current_offset in a track. The returned edit unit can be original_duration as well! */
mxf_get_next_track_edit_unit(MXFContext * mxf,MXFTrack * track,int64_t current_offset,int64_t * edit_unit_out)3283 static int mxf_get_next_track_edit_unit(MXFContext *mxf, MXFTrack *track, int64_t current_offset, int64_t *edit_unit_out)
3284 {
3285     int64_t a, b, m, offset;
3286     MXFIndexTable *t = mxf_find_index_table(mxf, track->index_sid);
3287 
3288     if (!t || track->original_duration <= 0)
3289         return -1;
3290 
3291     a = -1;
3292     b = track->original_duration;
3293 
3294     while (b - a > 1) {
3295         m = (a + b) >> 1;
3296         if (mxf_edit_unit_absolute_offset(mxf, t, m, track->edit_rate, NULL, &offset, NULL, 0) < 0)
3297             return -1;
3298         if (offset < current_offset)
3299             a = m;
3300         else
3301             b = m;
3302     }
3303 
3304     *edit_unit_out = b;
3305 
3306     return 0;
3307 }
3308 
mxf_compute_sample_count(MXFContext * mxf,AVStream * st,int64_t edit_unit)3309 static int64_t mxf_compute_sample_count(MXFContext *mxf, AVStream *st,
3310                                         int64_t edit_unit)
3311 {
3312     MXFTrack *track = st->priv_data;
3313     AVRational time_base = av_inv_q(track->edit_rate);
3314     AVRational sample_rate = av_inv_q(st->time_base);
3315 
3316     // For non-audio sample_count equals current edit unit
3317     if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
3318         return edit_unit;
3319 
3320     if ((sample_rate.num / sample_rate.den) == 48000) {
3321         return av_rescale_q(edit_unit, sample_rate, track->edit_rate);
3322     } else {
3323         int remainder = (sample_rate.num * time_base.num) %
3324                         (time_base.den * sample_rate.den);
3325         if (remainder)
3326             av_log(mxf->fc, AV_LOG_WARNING,
3327                    "seeking detected on stream #%d with time base (%d/%d) and "
3328                    "sample rate (%d/%d), audio pts won't be accurate.\n",
3329                    st->index, time_base.num, time_base.den,
3330                    sample_rate.num, sample_rate.den);
3331         return av_rescale_q(edit_unit, sample_rate, track->edit_rate);
3332     }
3333 }
3334 
3335 /**
3336  * Make sure track->sample_count is correct based on what offset we're currently at.
3337  * Also determine the next edit unit (or packet) offset.
3338  * @return next_ofs if OK, <0 on error
3339  */
mxf_set_current_edit_unit(MXFContext * mxf,AVStream * st,int64_t current_offset,int resync)3340 static int64_t mxf_set_current_edit_unit(MXFContext *mxf, AVStream *st, int64_t current_offset, int resync)
3341 {
3342     int64_t next_ofs = -1;
3343     MXFTrack *track = st->priv_data;
3344     int64_t edit_unit = av_rescale_q(track->sample_count, st->time_base, av_inv_q(track->edit_rate));
3345     int64_t new_edit_unit;
3346     MXFIndexTable *t = mxf_find_index_table(mxf, track->index_sid);
3347 
3348     if (!t || track->wrapping == UnknownWrapped)
3349         return -1;
3350 
3351     if (mxf_edit_unit_absolute_offset(mxf, t, edit_unit + track->edit_units_per_packet, track->edit_rate, NULL, &next_ofs, NULL, 0) < 0 &&
3352         (next_ofs = mxf_essence_container_end(mxf, t->body_sid)) <= 0) {
3353         av_log(mxf->fc, AV_LOG_ERROR, "unable to compute the size of the last packet\n");
3354         return -1;
3355     }
3356 
3357     /* check if the next edit unit offset (next_ofs) starts ahead of current_offset */
3358     if (next_ofs > current_offset)
3359         return next_ofs;
3360 
3361     if (!resync) {
3362         av_log(mxf->fc, AV_LOG_ERROR, "cannot find current edit unit for stream %d, invalid index?\n", st->index);
3363         return -1;
3364     }
3365 
3366     if (mxf_get_next_track_edit_unit(mxf, track, current_offset + 1, &new_edit_unit) < 0 || new_edit_unit <= 0) {
3367         av_log(mxf->fc, AV_LOG_ERROR, "failed to find next track edit unit in stream %d\n", st->index);
3368         return -1;
3369     }
3370 
3371     new_edit_unit--;
3372     track->sample_count = mxf_compute_sample_count(mxf, st, new_edit_unit);
3373     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);
3374 
3375     return mxf_set_current_edit_unit(mxf, st, current_offset, 0);
3376 }
3377 
mxf_set_audio_pts(MXFContext * mxf,AVCodecParameters * par,AVPacket * pkt)3378 static int mxf_set_audio_pts(MXFContext *mxf, AVCodecParameters *par,
3379                              AVPacket *pkt)
3380 {
3381     AVStream *st = mxf->fc->streams[pkt->stream_index];
3382     MXFTrack *track = st->priv_data;
3383     int64_t bits_per_sample = par->bits_per_coded_sample;
3384 
3385     if (!bits_per_sample)
3386         bits_per_sample = av_get_bits_per_sample(par->codec_id);
3387 
3388     pkt->pts = track->sample_count;
3389 
3390     if (   par->channels <= 0
3391         || bits_per_sample <= 0
3392         || par->channels * (int64_t)bits_per_sample < 8)
3393         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);
3394     else
3395         track->sample_count += pkt->size / (par->channels * (int64_t)bits_per_sample / 8);
3396 
3397     return 0;
3398 }
3399 
mxf_set_pts(MXFContext * mxf,AVStream * st,AVPacket * pkt)3400 static int mxf_set_pts(MXFContext *mxf, AVStream *st, AVPacket *pkt)
3401 {
3402     AVCodecParameters *par = st->codecpar;
3403     MXFTrack *track = st->priv_data;
3404 
3405     if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
3406         /* see if we have an index table to derive timestamps from */
3407         MXFIndexTable *t = mxf_find_index_table(mxf, track->index_sid);
3408 
3409         if (t && track->sample_count < t->nb_ptses) {
3410             pkt->dts = track->sample_count + t->first_dts;
3411             pkt->pts = t->ptses[track->sample_count];
3412         } else if (track->intra_only) {
3413             /* intra-only -> PTS = EditUnit.
3414              * let utils.c figure out DTS since it can be < PTS if low_delay = 0 (Sony IMX30) */
3415             pkt->pts = track->sample_count;
3416         }
3417         track->sample_count++;
3418     } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
3419         int ret = mxf_set_audio_pts(mxf, par, pkt);
3420         if (ret < 0)
3421             return ret;
3422     } else if (track) {
3423         pkt->dts = pkt->pts = track->sample_count;
3424         pkt->duration = 1;
3425         track->sample_count++;
3426     }
3427     return 0;
3428 }
3429 
mxf_read_packet(AVFormatContext * s,AVPacket * pkt)3430 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
3431 {
3432     KLVPacket klv;
3433     MXFContext *mxf = s->priv_data;
3434     int ret;
3435 
3436     while (1) {
3437         int64_t max_data_size;
3438         int64_t pos = avio_tell(s->pb);
3439 
3440         if (pos < mxf->current_klv_data.next_klv - mxf->current_klv_data.length || pos >= mxf->current_klv_data.next_klv) {
3441             mxf->current_klv_data = (KLVPacket){{0}};
3442             ret = klv_read_packet(&klv, s->pb);
3443             if (ret < 0)
3444                 break;
3445             max_data_size = klv.length;
3446             pos = klv.next_klv - klv.length;
3447             PRINT_KEY(s, "read packet", klv.key);
3448             av_log(s, AV_LOG_TRACE, "size %"PRIu64" offset %#"PRIx64"\n", klv.length, klv.offset);
3449             if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key)) {
3450                 ret = mxf_decrypt_triplet(s, pkt, &klv);
3451                 if (ret < 0) {
3452                     av_log(s, AV_LOG_ERROR, "invalid encoded triplet\n");
3453                     return ret;
3454                 }
3455                 return 0;
3456             }
3457         } else {
3458             klv = mxf->current_klv_data;
3459             max_data_size = klv.next_klv - pos;
3460         }
3461         if (IS_KLV_KEY(klv.key, mxf_essence_element_key) ||
3462             IS_KLV_KEY(klv.key, mxf_canopus_essence_element_key) ||
3463             IS_KLV_KEY(klv.key, mxf_avid_essence_element_key)) {
3464             int body_sid = find_body_sid_by_absolute_offset(mxf, klv.offset);
3465             int index = mxf_get_stream_index(s, &klv, body_sid);
3466             int64_t next_ofs;
3467             AVStream *st;
3468             MXFTrack *track;
3469 
3470             if (index < 0) {
3471                 av_log(s, AV_LOG_ERROR,
3472                        "error getting stream index %"PRIu32"\n",
3473                        AV_RB32(klv.key + 12));
3474                 goto skip;
3475             }
3476 
3477             st = s->streams[index];
3478             track = st->priv_data;
3479 
3480             if (s->streams[index]->discard == AVDISCARD_ALL)
3481                 goto skip;
3482 
3483             next_ofs = mxf_set_current_edit_unit(mxf, st, pos, 1);
3484 
3485             if (track->wrapping != FrameWrapped) {
3486                 int64_t size;
3487 
3488                 if (next_ofs <= 0) {
3489                     // If we have no way to packetize the data, then return it in chunks...
3490                     if (klv.next_klv - klv.length == pos && max_data_size > MXF_MAX_CHUNK_SIZE) {
3491                         st->need_parsing = AVSTREAM_PARSE_FULL;
3492                         avpriv_request_sample(s, "Huge KLV without proper index in non-frame wrapped essence");
3493                     }
3494                     size = FFMIN(max_data_size, MXF_MAX_CHUNK_SIZE);
3495                 } else {
3496                     if ((size = next_ofs - pos) <= 0) {
3497                         av_log(s, AV_LOG_ERROR, "bad size: %"PRId64"\n", size);
3498                         mxf->current_klv_data = (KLVPacket){{0}};
3499                         return AVERROR_INVALIDDATA;
3500                     }
3501                     // We must not overread, because the next edit unit might be in another KLV
3502                     if (size > max_data_size)
3503                         size = max_data_size;
3504                 }
3505 
3506                 mxf->current_klv_data = klv;
3507                 klv.offset = pos;
3508                 klv.length = size;
3509                 klv.next_klv = klv.offset + klv.length;
3510             }
3511 
3512             /* check for 8 channels AES3 element */
3513             if (klv.key[12] == 0x06 && klv.key[13] == 0x01 && klv.key[14] == 0x10) {
3514                 ret = mxf_get_d10_aes3_packet(s->pb, s->streams[index],
3515                                               pkt, klv.length);
3516                 if (ret < 0) {
3517                     av_log(s, AV_LOG_ERROR, "error reading D-10 aes3 frame\n");
3518                     mxf->current_klv_data = (KLVPacket){{0}};
3519                     return ret;
3520                 }
3521             } else if (mxf->eia608_extract &&
3522                        s->streams[index]->codecpar->codec_id == AV_CODEC_ID_EIA_608) {
3523                 ret = mxf_get_eia608_packet(s, s->streams[index], pkt, klv.length);
3524                 if (ret < 0) {
3525                     mxf->current_klv_data = (KLVPacket){{0}};
3526                     return ret;
3527                 }
3528             } else {
3529                 ret = av_get_packet(s->pb, pkt, klv.length);
3530                 if (ret < 0) {
3531                     mxf->current_klv_data = (KLVPacket){{0}};
3532                     return ret;
3533                 }
3534             }
3535             pkt->stream_index = index;
3536             pkt->pos = klv.offset;
3537 
3538             ret = mxf_set_pts(mxf, st, pkt);
3539             if (ret < 0) {
3540                 mxf->current_klv_data = (KLVPacket){{0}};
3541                 return ret;
3542             }
3543 
3544             /* seek for truncated packets */
3545             avio_seek(s->pb, klv.next_klv, SEEK_SET);
3546 
3547             return 0;
3548         } else {
3549         skip:
3550             avio_skip(s->pb, max_data_size);
3551             mxf->current_klv_data = (KLVPacket){{0}};
3552         }
3553     }
3554     return avio_feof(s->pb) ? AVERROR_EOF : ret;
3555 }
3556 
mxf_read_close(AVFormatContext * s)3557 static int mxf_read_close(AVFormatContext *s)
3558 {
3559     MXFContext *mxf = s->priv_data;
3560     int i;
3561 
3562     av_freep(&mxf->packages_refs);
3563     av_freep(&mxf->essence_container_data_refs);
3564 
3565     for (i = 0; i < s->nb_streams; i++)
3566         s->streams[i]->priv_data = NULL;
3567 
3568     for (i = 0; i < mxf->metadata_sets_count; i++) {
3569         mxf_free_metadataset(mxf->metadata_sets + i, 1);
3570     }
3571     mxf->metadata_sets_count = 0;
3572     av_freep(&mxf->partitions);
3573     av_freep(&mxf->metadata_sets);
3574     av_freep(&mxf->aesc);
3575     av_freep(&mxf->local_tags);
3576 
3577     if (mxf->index_tables) {
3578         for (i = 0; i < mxf->nb_index_tables; i++) {
3579             av_freep(&mxf->index_tables[i].segments);
3580             av_freep(&mxf->index_tables[i].ptses);
3581             av_freep(&mxf->index_tables[i].fake_index);
3582             av_freep(&mxf->index_tables[i].offsets);
3583         }
3584     }
3585     av_freep(&mxf->index_tables);
3586 
3587     return 0;
3588 }
3589 
mxf_probe(const AVProbeData * p)3590 static int mxf_probe(const AVProbeData *p) {
3591     const uint8_t *bufp = p->buf;
3592     const uint8_t *end = p->buf + p->buf_size;
3593 
3594     if (p->buf_size < sizeof(mxf_header_partition_pack_key))
3595         return 0;
3596 
3597     /* Must skip Run-In Sequence and search for MXF header partition pack key SMPTE 377M 5.5 */
3598     end -= sizeof(mxf_header_partition_pack_key);
3599 
3600     for (; bufp < end;) {
3601         if (!((bufp[13] - 1) & 0xF2)){
3602             if (AV_RN32(bufp   ) == AV_RN32(mxf_header_partition_pack_key   ) &&
3603                 AV_RN32(bufp+ 4) == AV_RN32(mxf_header_partition_pack_key+ 4) &&
3604                 AV_RN32(bufp+ 8) == AV_RN32(mxf_header_partition_pack_key+ 8) &&
3605                 AV_RN16(bufp+12) == AV_RN16(mxf_header_partition_pack_key+12))
3606                 return AVPROBE_SCORE_MAX;
3607             bufp ++;
3608         } else
3609             bufp += 10;
3610     }
3611 
3612     return 0;
3613 }
3614 
3615 /* rudimentary byte seek */
3616 /* XXX: use MXF Index */
mxf_read_seek(AVFormatContext * s,int stream_index,int64_t sample_time,int flags)3617 static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
3618 {
3619     AVStream *st = s->streams[stream_index];
3620     int64_t seconds;
3621     MXFContext* mxf = s->priv_data;
3622     int64_t seekpos;
3623     int i, ret;
3624     MXFIndexTable *t;
3625     MXFTrack *source_track = st->priv_data;
3626 
3627     if (!source_track)
3628         return 0;
3629 
3630     /* if audio then truncate sample_time to EditRate */
3631     if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
3632         sample_time = av_rescale_q(sample_time, st->time_base,
3633                                    av_inv_q(source_track->edit_rate));
3634 
3635     if (mxf->nb_index_tables <= 0) {
3636         if (!s->bit_rate)
3637             return AVERROR_INVALIDDATA;
3638         if (sample_time < 0)
3639             sample_time = 0;
3640         seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den);
3641 
3642         seekpos = avio_seek(s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET);
3643         if (seekpos < 0)
3644             return seekpos;
3645 
3646         ff_update_cur_dts(s, st, sample_time);
3647         mxf->current_klv_data = (KLVPacket){{0}};
3648     } else {
3649         MXFPartition *partition;
3650 
3651         t = &mxf->index_tables[0];
3652         if (t->index_sid != source_track->index_sid) {
3653             /* If the first index table does not belong to the stream, then find a stream which does belong to the index table */
3654             for (i = 0; i < s->nb_streams; i++) {
3655                 MXFTrack *new_source_track = s->streams[i]->priv_data;
3656                 if (new_source_track && new_source_track->index_sid == t->index_sid) {
3657                     sample_time = av_rescale_q(sample_time, new_source_track->edit_rate, source_track->edit_rate);
3658                     source_track = new_source_track;
3659                     st = s->streams[i];
3660                     break;
3661                 }
3662             }
3663             if (i == s->nb_streams)
3664                 return AVERROR_INVALIDDATA;
3665         }
3666 
3667         /* clamp above zero, else ff_index_search_timestamp() returns negative
3668          * this also means we allow seeking before the start */
3669         sample_time = FFMAX(sample_time, 0);
3670 
3671         if (t->fake_index) {
3672             /* The first frames may not be keyframes in presentation order, so
3673              * we have to advance the target to be able to find the first
3674              * keyframe backwards... */
3675             if (!(flags & AVSEEK_FLAG_ANY) &&
3676                 (flags & AVSEEK_FLAG_BACKWARD) &&
3677                 t->ptses[0] != AV_NOPTS_VALUE &&
3678                 sample_time < t->ptses[0] &&
3679                 (t->fake_index[t->ptses[0]].flags & AVINDEX_KEYFRAME))
3680                 sample_time = t->ptses[0];
3681 
3682             /* behave as if we have a proper index */
3683             if ((sample_time = ff_index_search_timestamp(t->fake_index, t->nb_ptses, sample_time, flags)) < 0)
3684                 return sample_time;
3685             /* get the stored order index from the display order index */
3686             sample_time += t->offsets[sample_time];
3687         } else {
3688             /* no IndexEntryArray (one or more CBR segments)
3689              * make sure we don't seek past the end */
3690             sample_time = FFMIN(sample_time, source_track->original_duration - 1);
3691         }
3692 
3693         if (source_track->wrapping == UnknownWrapped)
3694             av_log(mxf->fc, AV_LOG_WARNING, "attempted seek in an UnknownWrapped essence\n");
3695 
3696         if ((ret = mxf_edit_unit_absolute_offset(mxf, t, sample_time, source_track->edit_rate, &sample_time, &seekpos, &partition, 1)) < 0)
3697             return ret;
3698 
3699         ff_update_cur_dts(s, st, sample_time);
3700         if (source_track->wrapping == ClipWrapped) {
3701             KLVPacket klv = partition->first_essence_klv;
3702             if (seekpos < klv.next_klv - klv.length || seekpos >= klv.next_klv) {
3703                 av_log(mxf->fc, AV_LOG_ERROR, "attempted seek out of clip wrapped KLV\n");
3704                 return AVERROR_INVALIDDATA;
3705             }
3706             mxf->current_klv_data = klv;
3707         } else {
3708             mxf->current_klv_data = (KLVPacket){{0}};
3709         }
3710         avio_seek(s->pb, seekpos, SEEK_SET);
3711     }
3712 
3713     // Update all tracks sample count
3714     for (i = 0; i < s->nb_streams; i++) {
3715         AVStream *cur_st = s->streams[i];
3716         MXFTrack *cur_track = cur_st->priv_data;
3717         if (cur_track) {
3718             int64_t track_edit_unit = sample_time;
3719             if (st != cur_st)
3720                 mxf_get_next_track_edit_unit(mxf, cur_track, seekpos, &track_edit_unit);
3721             cur_track->sample_count = mxf_compute_sample_count(mxf, cur_st, track_edit_unit);
3722         }
3723     }
3724     return 0;
3725 }
3726 
3727 static const AVOption options[] = {
3728     { "eia608_extract", "extract eia 608 captions from s436m track",
3729       offsetof(MXFContext, eia608_extract), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
3730       AV_OPT_FLAG_DECODING_PARAM },
3731     { NULL },
3732 };
3733 
3734 static const AVClass demuxer_class = {
3735     .class_name = "mxf",
3736     .item_name  = av_default_item_name,
3737     .option     = options,
3738     .version    = LIBAVUTIL_VERSION_INT,
3739     .category   = AV_CLASS_CATEGORY_DEMUXER,
3740 };
3741 
3742 AVInputFormat ff_mxf_demuxer = {
3743     .name           = "mxf",
3744     .long_name      = NULL_IF_CONFIG_SMALL("MXF (Material eXchange Format)"),
3745     .flags          = AVFMT_SEEK_TO_PTS,
3746     .priv_data_size = sizeof(MXFContext),
3747     .read_probe     = mxf_probe,
3748     .read_header    = mxf_read_header,
3749     .read_packet    = mxf_read_packet,
3750     .read_close     = mxf_read_close,
3751     .read_seek      = mxf_read_seek,
3752     .priv_class     = &demuxer_class,
3753 };
3754