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