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