]> git.sesse.net Git - ffmpeg/blob - libavformat/mxfdec.c
Merge remote-tracking branch 'qatar/master'
[ffmpeg] / libavformat / mxfdec.c
1 /*
2  * MXF demuxer.
3  * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /*
23  * References
24  * SMPTE 336M KLV Data Encoding Protocol Using Key-Length-Value
25  * SMPTE 377M MXF File Format Specifications
26  * SMPTE 378M Operational Pattern 1a
27  * SMPTE 379M MXF Generic Container
28  * SMPTE 381M Mapping MPEG Streams into the MXF Generic Container
29  * SMPTE 382M Mapping AES3 and Broadcast Wave Audio into the MXF Generic Container
30  * SMPTE 383M Mapping DV-DIF Data to the MXF Generic Container
31  *
32  * Principle
33  * Search for Track numbers which will identify essence element KLV packets.
34  * Search for SourcePackage which define tracks which contains Track numbers.
35  * Material Package contains tracks with reference to SourcePackage tracks.
36  * Search for Descriptors (Picture, Sound) which contains codec info and parameters.
37  * Assign Descriptors to correct Tracks.
38  *
39  * Metadata reading functions read Local Tags, get InstanceUID(0x3C0A) then add MetaDataSet to MXFContext.
40  * Metadata parsing resolves Strong References to objects.
41  *
42  * Simple demuxer, only OP1A supported and some files might not work at all.
43  * Only tracks with associated descriptors will be decoded. "Highly Desirable" SMPTE 377M D.1
44  */
45
46 //#define DEBUG
47
48 #include "libavutil/aes.h"
49 #include "libavutil/mathematics.h"
50 #include "libavcodec/bytestream.h"
51 #include "libavutil/timecode.h"
52 #include "avformat.h"
53 #include "internal.h"
54 #include "mxf.h"
55
56 typedef enum {
57     Header,
58     BodyPartition,
59     Footer
60 } MXFPartitionType;
61
62 typedef enum {
63     OP1a = 1,
64     OP1b,
65     OP1c,
66     OP2a,
67     OP2b,
68     OP2c,
69     OP3a,
70     OP3b,
71     OP3c,
72     OPAtom,
73     OPSONYOpt,  /* FATE sample, violates the spec in places */
74 } MXFOP;
75
76 typedef struct {
77     int closed;
78     int complete;
79     MXFPartitionType type;
80     uint64_t previous_partition;
81     int index_sid;
82     int body_sid;
83     int64_t this_partition;
84     int64_t essence_offset;         ///< absolute offset of essence
85     int64_t essence_length;
86     int32_t kag_size;
87     int64_t header_byte_count;
88     int64_t index_byte_count;
89     int pack_length;
90 } MXFPartition;
91
92 typedef struct {
93     UID uid;
94     enum MXFMetadataSetType type;
95     UID source_container_ul;
96 } MXFCryptoContext;
97
98 typedef struct {
99     UID uid;
100     enum MXFMetadataSetType type;
101     UID source_package_uid;
102     UID data_definition_ul;
103     int64_t duration;
104     int64_t start_position;
105     int source_track_id;
106 } MXFStructuralComponent;
107
108 typedef struct {
109     UID uid;
110     enum MXFMetadataSetType type;
111     UID data_definition_ul;
112     UID *structural_components_refs;
113     int structural_components_count;
114     int64_t duration;
115 } MXFSequence;
116
117 typedef struct {
118     UID uid;
119     enum MXFMetadataSetType type;
120     int drop_frame;
121     int start_frame;
122     struct AVRational rate;
123     AVTimecode tc;
124 } MXFTimecodeComponent;
125
126 typedef struct {
127     UID uid;
128     enum MXFMetadataSetType type;
129     MXFSequence *sequence; /* mandatory, and only one */
130     UID sequence_ref;
131     int track_id;
132     uint8_t track_number[4];
133     AVRational edit_rate;
134     int intra_only;
135 } MXFTrack;
136
137 typedef struct {
138     UID uid;
139     enum MXFMetadataSetType type;
140     UID essence_container_ul;
141     UID essence_codec_ul;
142     AVRational sample_rate;
143     AVRational aspect_ratio;
144     int width;
145     int height; /* Field height, not frame height */
146     int frame_layout; /* See MXFFrameLayout enum */
147     int channels;
148     int bits_per_sample;
149     unsigned int component_depth;
150     unsigned int horiz_subsampling;
151     unsigned int vert_subsampling;
152     UID *sub_descriptors_refs;
153     int sub_descriptors_count;
154     int linked_track_id;
155     uint8_t *extradata;
156     int extradata_size;
157     enum PixelFormat pix_fmt;
158 } MXFDescriptor;
159
160 typedef struct {
161     UID uid;
162     enum MXFMetadataSetType type;
163     int edit_unit_byte_count;
164     int index_sid;
165     int body_sid;
166     AVRational index_edit_rate;
167     uint64_t index_start_position;
168     uint64_t index_duration;
169     int8_t *temporal_offset_entries;
170     int *flag_entries;
171     uint64_t *stream_offset_entries;
172     int nb_index_entries;
173 } MXFIndexTableSegment;
174
175 typedef struct {
176     UID uid;
177     enum MXFMetadataSetType type;
178     UID package_uid;
179     UID *tracks_refs;
180     int tracks_count;
181     MXFDescriptor *descriptor; /* only one */
182     UID descriptor_ref;
183 } MXFPackage;
184
185 typedef struct {
186     UID uid;
187     enum MXFMetadataSetType type;
188 } MXFMetadataSet;
189
190 /* decoded index table */
191 typedef struct {
192     int index_sid;
193     int body_sid;
194     int nb_ptses;               /* number of PTSes or total duration of index */
195     int64_t first_dts;          /* DTS = EditUnit + first_dts */
196     int64_t *ptses;             /* maps EditUnit -> PTS */
197     int nb_segments;
198     MXFIndexTableSegment **segments;    /* sorted by IndexStartPosition */
199     AVIndexEntry *fake_index;   /* used for calling ff_index_search_timestamp() */
200 } MXFIndexTable;
201
202 typedef struct {
203     MXFPartition *partitions;
204     unsigned partitions_count;
205     MXFOP op;
206     UID *packages_refs;
207     int packages_count;
208     MXFMetadataSet **metadata_sets;
209     int metadata_sets_count;
210     AVFormatContext *fc;
211     struct AVAES *aesc;
212     uint8_t *local_tags;
213     int local_tags_count;
214     uint64_t footer_partition;
215     KLVPacket current_klv_data;
216     int current_klv_index;
217     int run_in;
218     MXFPartition *current_partition;
219     int parsing_backward;
220     int64_t last_forward_tell;
221     int last_forward_partition;
222     int current_edit_unit;
223     int nb_index_tables;
224     MXFIndexTable *index_tables;
225     int edit_units_per_packet;      ///< how many edit units to read at a time (PCM, OPAtom)
226 } MXFContext;
227
228 enum MXFWrappingScheme {
229     Frame,
230     Clip,
231 };
232
233 /* NOTE: klv_offset is not set (-1) for local keys */
234 typedef int MXFMetadataReadFunc(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset);
235
236 typedef struct {
237     const UID key;
238     MXFMetadataReadFunc *read;
239     int ctx_size;
240     enum MXFMetadataSetType type;
241 } MXFMetadataReadTableEntry;
242
243 /* partial keys to match */
244 static const uint8_t mxf_header_partition_pack_key[]       = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 };
245 static const uint8_t mxf_essence_element_key[]             = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 };
246 static const uint8_t mxf_avid_essence_element_key[]        = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0e,0x04,0x03,0x01 };
247 static const uint8_t mxf_system_item_key[]                 = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x03,0x01,0x04 };
248 static const uint8_t mxf_klv_key[]                         = { 0x06,0x0e,0x2b,0x34 };
249 /* complete keys to match */
250 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 };
251 static const uint8_t mxf_encrypted_triplet_key[]           = { 0x06,0x0e,0x2b,0x34,0x02,0x04,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x7e,0x01,0x00 };
252 static const uint8_t mxf_encrypted_essence_container[]     = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0b,0x01,0x00 };
253 static const uint8_t mxf_sony_mpeg4_extradata[]            = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0e,0x06,0x06,0x02,0x02,0x01,0x00,0x00 };
254
255 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y)))
256
257 static int64_t klv_decode_ber_length(AVIOContext *pb)
258 {
259     uint64_t size = avio_r8(pb);
260     if (size & 0x80) { /* long form */
261         int bytes_num = size & 0x7f;
262         /* SMPTE 379M 5.3.4 guarantee that bytes_num must not exceed 8 bytes */
263         if (bytes_num > 8)
264             return AVERROR_INVALIDDATA;
265         size = 0;
266         while (bytes_num--)
267             size = size << 8 | avio_r8(pb);
268     }
269     return size;
270 }
271
272 static int mxf_read_sync(AVIOContext *pb, const uint8_t *key, unsigned size)
273 {
274     int i, b;
275     for (i = 0; i < size && !url_feof(pb); i++) {
276         b = avio_r8(pb);
277         if (b == key[0])
278             i = 0;
279         else if (b != key[i])
280             i = -1;
281     }
282     return i == size;
283 }
284
285 static int klv_read_packet(KLVPacket *klv, AVIOContext *pb)
286 {
287     if (!mxf_read_sync(pb, mxf_klv_key, 4))
288         return AVERROR_INVALIDDATA;
289     klv->offset = avio_tell(pb) - 4;
290     memcpy(klv->key, mxf_klv_key, 4);
291     avio_read(pb, klv->key + 4, 12);
292     klv->length = klv_decode_ber_length(pb);
293     return klv->length == -1 ? -1 : 0;
294 }
295
296 static int mxf_get_stream_index(AVFormatContext *s, KLVPacket *klv)
297 {
298     int i;
299
300     for (i = 0; i < s->nb_streams; i++) {
301         MXFTrack *track = s->streams[i]->priv_data;
302         /* SMPTE 379M 7.3 */
303         if (!memcmp(klv->key + sizeof(mxf_essence_element_key), track->track_number, sizeof(track->track_number)))
304             return i;
305     }
306     /* return 0 if only one stream, for OP Atom files with 0 as track number */
307     return s->nb_streams == 1 ? 0 : -1;
308 }
309
310 /* XXX: use AVBitStreamFilter */
311 static int mxf_get_d10_aes3_packet(AVIOContext *pb, AVStream *st, AVPacket *pkt, int64_t length)
312 {
313     const uint8_t *buf_ptr, *end_ptr;
314     uint8_t *data_ptr;
315     int i;
316
317     if (length > 61444) /* worst case PAL 1920 samples 8 channels */
318         return AVERROR_INVALIDDATA;
319     length = av_get_packet(pb, pkt, length);
320     if (length < 0)
321         return length;
322     data_ptr = pkt->data;
323     end_ptr = pkt->data + length;
324     buf_ptr = pkt->data + 4; /* skip SMPTE 331M header */
325     for (; buf_ptr + st->codec->channels*4 < end_ptr; ) {
326         for (i = 0; i < st->codec->channels; i++) {
327             uint32_t sample = bytestream_get_le32(&buf_ptr);
328             if (st->codec->bits_per_coded_sample == 24)
329                 bytestream_put_le24(&data_ptr, (sample >> 4) & 0xffffff);
330             else
331                 bytestream_put_le16(&data_ptr, (sample >> 12) & 0xffff);
332         }
333         buf_ptr += 32 - st->codec->channels*4; // always 8 channels stored SMPTE 331M
334     }
335     av_shrink_packet(pkt, data_ptr - pkt->data);
336     return 0;
337 }
338
339 static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv)
340 {
341     static const uint8_t checkv[16] = {0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b};
342     MXFContext *mxf = s->priv_data;
343     AVIOContext *pb = s->pb;
344     int64_t end = avio_tell(pb) + klv->length;
345     int64_t size;
346     uint64_t orig_size;
347     uint64_t plaintext_size;
348     uint8_t ivec[16];
349     uint8_t tmpbuf[16];
350     int index;
351
352     if (!mxf->aesc && s->key && s->keylen == 16) {
353         mxf->aesc = av_malloc(av_aes_size);
354         if (!mxf->aesc)
355             return AVERROR(ENOMEM);
356         av_aes_init(mxf->aesc, s->key, 128, 1);
357     }
358     // crypto context
359     avio_skip(pb, klv_decode_ber_length(pb));
360     // plaintext offset
361     klv_decode_ber_length(pb);
362     plaintext_size = avio_rb64(pb);
363     // source klv key
364     klv_decode_ber_length(pb);
365     avio_read(pb, klv->key, 16);
366     if (!IS_KLV_KEY(klv, mxf_essence_element_key))
367         return AVERROR_INVALIDDATA;
368     index = mxf_get_stream_index(s, klv);
369     if (index < 0)
370         return AVERROR_INVALIDDATA;
371     // source size
372     klv_decode_ber_length(pb);
373     orig_size = avio_rb64(pb);
374     if (orig_size < plaintext_size)
375         return AVERROR_INVALIDDATA;
376     // enc. code
377     size = klv_decode_ber_length(pb);
378     if (size < 32 || size - 32 < orig_size)
379         return AVERROR_INVALIDDATA;
380     avio_read(pb, ivec, 16);
381     avio_read(pb, tmpbuf, 16);
382     if (mxf->aesc)
383         av_aes_crypt(mxf->aesc, tmpbuf, tmpbuf, 1, ivec, 1);
384     if (memcmp(tmpbuf, checkv, 16))
385         av_log(s, AV_LOG_ERROR, "probably incorrect decryption key\n");
386     size -= 32;
387     size = av_get_packet(pb, pkt, size);
388     if (size < 0)
389         return size;
390     else if (size < plaintext_size)
391         return AVERROR_INVALIDDATA;
392     size -= plaintext_size;
393     if (mxf->aesc)
394         av_aes_crypt(mxf->aesc, &pkt->data[plaintext_size],
395                      &pkt->data[plaintext_size], size >> 4, ivec, 1);
396     av_shrink_packet(pkt, orig_size);
397     pkt->stream_index = index;
398     avio_skip(pb, end - avio_tell(pb));
399     return 0;
400 }
401
402 static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
403 {
404     MXFContext *mxf = arg;
405     int item_num = avio_rb32(pb);
406     int item_len = avio_rb32(pb);
407
408     if (item_len != 18) {
409         av_log_ask_for_sample(pb, "unsupported primer pack item length %d\n",
410                               item_len);
411         return AVERROR_PATCHWELCOME;
412     }
413     if (item_num > UINT_MAX / item_len)
414         return AVERROR_INVALIDDATA;
415     mxf->local_tags_count = item_num;
416     mxf->local_tags = av_malloc(item_num*item_len);
417     if (!mxf->local_tags)
418         return AVERROR(ENOMEM);
419     avio_read(pb, mxf->local_tags, item_num*item_len);
420     return 0;
421 }
422
423 static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
424 {
425     MXFContext *mxf = arg;
426     MXFPartition *partition, *tmp_part;
427     UID op;
428     uint64_t footer_partition;
429     uint32_t nb_essence_containers;
430
431     if (mxf->partitions_count+1 >= UINT_MAX / sizeof(*mxf->partitions))
432         return AVERROR(ENOMEM);
433
434     tmp_part = av_realloc(mxf->partitions, (mxf->partitions_count + 1) * sizeof(*mxf->partitions));
435     if (!tmp_part)
436         return AVERROR(ENOMEM);
437     mxf->partitions = tmp_part;
438
439     if (mxf->parsing_backward) {
440         /* insert the new partition pack in the middle
441          * this makes the entries in mxf->partitions sorted by offset */
442         memmove(&mxf->partitions[mxf->last_forward_partition+1],
443                 &mxf->partitions[mxf->last_forward_partition],
444                 (mxf->partitions_count - mxf->last_forward_partition)*sizeof(*mxf->partitions));
445         partition = mxf->current_partition = &mxf->partitions[mxf->last_forward_partition];
446     } else {
447         mxf->last_forward_partition++;
448         partition = mxf->current_partition = &mxf->partitions[mxf->partitions_count];
449     }
450
451     memset(partition, 0, sizeof(*partition));
452     mxf->partitions_count++;
453     partition->pack_length = avio_tell(pb) - klv_offset + size;
454
455     switch(uid[13]) {
456     case 2:
457         partition->type = Header;
458         break;
459     case 3:
460         partition->type = BodyPartition;
461         break;
462     case 4:
463         partition->type = Footer;
464         break;
465     default:
466         av_log(mxf->fc, AV_LOG_ERROR, "unknown partition type %i\n", uid[13]);
467         return AVERROR_INVALIDDATA;
468     }
469
470     /* consider both footers to be closed (there is only Footer and CompleteFooter) */
471     partition->closed = partition->type == Footer || !(uid[14] & 1);
472     partition->complete = uid[14] > 2;
473     avio_skip(pb, 4);
474     partition->kag_size = avio_rb32(pb);
475     partition->this_partition = avio_rb64(pb);
476     partition->previous_partition = avio_rb64(pb);
477     footer_partition = avio_rb64(pb);
478     partition->header_byte_count = avio_rb64(pb);
479     partition->index_byte_count = avio_rb64(pb);
480     partition->index_sid = avio_rb32(pb);
481     avio_skip(pb, 8);
482     partition->body_sid = avio_rb32(pb);
483     avio_read(pb, op, sizeof(UID));
484     nb_essence_containers = avio_rb32(pb);
485
486     /* some files don'thave FooterPartition set in every partition */
487     if (footer_partition) {
488         if (mxf->footer_partition && mxf->footer_partition != footer_partition) {
489             av_log(mxf->fc, AV_LOG_ERROR,
490                    "inconsistent FooterPartition value: %"PRIu64" != %"PRIu64"\n",
491                    mxf->footer_partition, footer_partition);
492         } else {
493             mxf->footer_partition = footer_partition;
494         }
495     }
496
497     av_dlog(mxf->fc,
498             "PartitionPack: ThisPartition = 0x%"PRIX64
499             ", PreviousPartition = 0x%"PRIX64", "
500             "FooterPartition = 0x%"PRIX64", IndexSID = %i, BodySID = %i\n",
501             partition->this_partition,
502             partition->previous_partition, footer_partition,
503             partition->index_sid, partition->body_sid);
504
505     /* sanity check PreviousPartition if set */
506     if (partition->previous_partition &&
507         mxf->run_in + partition->previous_partition >= klv_offset) {
508         av_log(mxf->fc, AV_LOG_ERROR,
509                "PreviousPartition points to this partition or forward\n");
510         return AVERROR_INVALIDDATA;
511     }
512
513     if      (op[12] == 1 && op[13] == 1) mxf->op = OP1a;
514     else if (op[12] == 1 && op[13] == 2) mxf->op = OP1b;
515     else if (op[12] == 1 && op[13] == 3) mxf->op = OP1c;
516     else if (op[12] == 2 && op[13] == 1) mxf->op = OP2a;
517     else if (op[12] == 2 && op[13] == 2) mxf->op = OP2b;
518     else if (op[12] == 2 && op[13] == 3) mxf->op = OP2c;
519     else if (op[12] == 3 && op[13] == 1) mxf->op = OP3a;
520     else if (op[12] == 3 && op[13] == 2) mxf->op = OP3b;
521     else if (op[12] == 3 && op[13] == 3) mxf->op = OP3c;
522     else if (op[12] == 64&& op[13] == 1) mxf->op = OPSONYOpt;
523     else if (op[12] == 0x10) {
524         /* SMPTE 390m: "There shall be exactly one essence container"
525          * The following block deals with files that violate this, namely:
526          * 2011_DCPTEST_24FPS.V.mxf - two ECs, OP1a
527          * abcdefghiv016f56415e.mxf - zero ECs, OPAtom, output by Avid AirSpeed */
528         if (nb_essence_containers != 1) {
529             MXFOP op = nb_essence_containers ? OP1a : OPAtom;
530
531             /* only nag once */
532             if (!mxf->op)
533                 av_log(mxf->fc, AV_LOG_WARNING, "\"OPAtom\" with %u ECs - assuming %s\n",
534                        nb_essence_containers, op == OP1a ? "OP1a" : "OPAtom");
535
536             mxf->op = op;
537         } else
538             mxf->op = OPAtom;
539     } else {
540         av_log(mxf->fc, AV_LOG_ERROR, "unknown operational pattern: %02xh %02xh - guessing OP1a\n", op[12], op[13]);
541         mxf->op = OP1a;
542     }
543
544     if (partition->kag_size <= 0 || partition->kag_size > (1 << 20)) {
545         av_log(mxf->fc, AV_LOG_WARNING, "invalid KAGSize %i - guessing ", partition->kag_size);
546
547         if (mxf->op == OPSONYOpt)
548             partition->kag_size = 512;
549         else
550             partition->kag_size = 1;
551
552         av_log(mxf->fc, AV_LOG_WARNING, "%i\n", partition->kag_size);
553     }
554
555     return 0;
556 }
557
558 static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
559 {
560     MXFMetadataSet **tmp;
561     if (mxf->metadata_sets_count+1 >= UINT_MAX / sizeof(*mxf->metadata_sets))
562         return AVERROR(ENOMEM);
563     tmp = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets));
564     if (!tmp)
565         return AVERROR(ENOMEM);
566     mxf->metadata_sets = tmp;
567     mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;
568     mxf->metadata_sets_count++;
569     return 0;
570 }
571
572 static int mxf_read_cryptographic_context(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
573 {
574     MXFCryptoContext *cryptocontext = arg;
575     if (size != 16)
576         return AVERROR_INVALIDDATA;
577     if (IS_KLV_KEY(uid, mxf_crypto_source_container_ul))
578         avio_read(pb, cryptocontext->source_container_ul, 16);
579     return 0;
580 }
581
582 static int mxf_read_content_storage(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
583 {
584     MXFContext *mxf = arg;
585     switch (tag) {
586     case 0x1901:
587         mxf->packages_count = avio_rb32(pb);
588         if (mxf->packages_count >= UINT_MAX / sizeof(UID))
589             return AVERROR_INVALIDDATA;
590         mxf->packages_refs = av_malloc(mxf->packages_count * sizeof(UID));
591         if (!mxf->packages_refs)
592             return AVERROR(ENOMEM);
593         avio_skip(pb, 4); /* useless size of objects, always 16 according to specs */
594         avio_read(pb, (uint8_t *)mxf->packages_refs, mxf->packages_count * sizeof(UID));
595         break;
596     }
597     return 0;
598 }
599
600 static int mxf_read_source_clip(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
601 {
602     MXFStructuralComponent *source_clip = arg;
603     switch(tag) {
604     case 0x0202:
605         source_clip->duration = avio_rb64(pb);
606         break;
607     case 0x1201:
608         source_clip->start_position = avio_rb64(pb);
609         break;
610     case 0x1101:
611         /* UMID, only get last 16 bytes */
612         avio_skip(pb, 16);
613         avio_read(pb, source_clip->source_package_uid, 16);
614         break;
615     case 0x1102:
616         source_clip->source_track_id = avio_rb32(pb);
617         break;
618     }
619     return 0;
620 }
621
622 static int mxf_read_material_package(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
623 {
624     MXFPackage *package = arg;
625     switch(tag) {
626     case 0x4403:
627         package->tracks_count = avio_rb32(pb);
628         if (package->tracks_count >= UINT_MAX / sizeof(UID))
629             return AVERROR_INVALIDDATA;
630         package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID));
631         if (!package->tracks_refs)
632             return AVERROR(ENOMEM);
633         avio_skip(pb, 4); /* useless size of objects, always 16 according to specs */
634         avio_read(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID));
635         break;
636     }
637     return 0;
638 }
639
640 static int mxf_read_timecode_component(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
641 {
642     MXFTimecodeComponent *mxf_timecode = arg;
643     switch(tag) {
644     case 0x1501:
645         mxf_timecode->start_frame = avio_rb64(pb);
646         break;
647     case 0x1502:
648         mxf_timecode->rate = (AVRational){avio_rb16(pb), 1};
649         break;
650     case 0x1503:
651         mxf_timecode->drop_frame = avio_r8(pb);
652         break;
653     }
654     return 0;
655 }
656
657 static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
658 {
659     MXFTrack *track = arg;
660     switch(tag) {
661     case 0x4801:
662         track->track_id = avio_rb32(pb);
663         break;
664     case 0x4804:
665         avio_read(pb, track->track_number, 4);
666         break;
667     case 0x4B01:
668         track->edit_rate.num = avio_rb32(pb);
669         track->edit_rate.den = avio_rb32(pb);
670         break;
671     case 0x4803:
672         avio_read(pb, track->sequence_ref, 16);
673         break;
674     }
675     return 0;
676 }
677
678 static int mxf_read_sequence(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
679 {
680     MXFSequence *sequence = arg;
681     switch(tag) {
682     case 0x0202:
683         sequence->duration = avio_rb64(pb);
684         break;
685     case 0x0201:
686         avio_read(pb, sequence->data_definition_ul, 16);
687         break;
688     case 0x1001:
689         sequence->structural_components_count = avio_rb32(pb);
690         if (sequence->structural_components_count >= UINT_MAX / sizeof(UID))
691             return AVERROR_INVALIDDATA;
692         sequence->structural_components_refs = av_malloc(sequence->structural_components_count * sizeof(UID));
693         if (!sequence->structural_components_refs)
694             return AVERROR(ENOMEM);
695         avio_skip(pb, 4); /* useless size of objects, always 16 according to specs */
696         avio_read(pb, (uint8_t *)sequence->structural_components_refs, sequence->structural_components_count * sizeof(UID));
697         break;
698     }
699     return 0;
700 }
701
702 static int mxf_read_source_package(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
703 {
704     MXFPackage *package = arg;
705     switch(tag) {
706     case 0x4403:
707         package->tracks_count = avio_rb32(pb);
708         if (package->tracks_count >= UINT_MAX / sizeof(UID))
709             return AVERROR_INVALIDDATA;
710         package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID));
711         if (!package->tracks_refs)
712             return AVERROR(ENOMEM);
713         avio_skip(pb, 4); /* useless size of objects, always 16 according to specs */
714         avio_read(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID));
715         break;
716     case 0x4401:
717         /* UMID, only get last 16 bytes */
718         avio_skip(pb, 16);
719         avio_read(pb, package->package_uid, 16);
720         break;
721     case 0x4701:
722         avio_read(pb, package->descriptor_ref, 16);
723         break;
724     }
725     return 0;
726 }
727
728 static int mxf_read_index_entry_array(AVIOContext *pb, MXFIndexTableSegment *segment)
729 {
730     int i, length;
731
732     segment->nb_index_entries = avio_rb32(pb);
733     length = avio_rb32(pb);
734
735     if (!(segment->temporal_offset_entries=av_calloc(segment->nb_index_entries, sizeof(*segment->temporal_offset_entries))) ||
736         !(segment->flag_entries          = av_calloc(segment->nb_index_entries, sizeof(*segment->flag_entries))) ||
737         !(segment->stream_offset_entries = av_calloc(segment->nb_index_entries, sizeof(*segment->stream_offset_entries))))
738         return AVERROR(ENOMEM);
739
740     for (i = 0; i < segment->nb_index_entries; i++) {
741         segment->temporal_offset_entries[i] = avio_r8(pb);
742         avio_r8(pb);                                        /* KeyFrameOffset */
743         segment->flag_entries[i] = avio_r8(pb);
744         segment->stream_offset_entries[i] = avio_rb64(pb);
745         avio_skip(pb, length - 11);
746     }
747     return 0;
748 }
749
750 static int mxf_read_index_table_segment(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
751 {
752     MXFIndexTableSegment *segment = arg;
753     switch(tag) {
754     case 0x3F05:
755         segment->edit_unit_byte_count = avio_rb32(pb);
756         av_dlog(NULL, "EditUnitByteCount %d\n", segment->edit_unit_byte_count);
757         break;
758     case 0x3F06:
759         segment->index_sid = avio_rb32(pb);
760         av_dlog(NULL, "IndexSID %d\n", segment->index_sid);
761         break;
762     case 0x3F07:
763         segment->body_sid = avio_rb32(pb);
764         av_dlog(NULL, "BodySID %d\n", segment->body_sid);
765         break;
766     case 0x3F0A:
767         av_dlog(NULL, "IndexEntryArray found\n");
768         return mxf_read_index_entry_array(pb, segment);
769     case 0x3F0B:
770         segment->index_edit_rate.num = avio_rb32(pb);
771         segment->index_edit_rate.den = avio_rb32(pb);
772         av_dlog(NULL, "IndexEditRate %d/%d\n", segment->index_edit_rate.num,
773                 segment->index_edit_rate.den);
774         break;
775     case 0x3F0C:
776         segment->index_start_position = avio_rb64(pb);
777         av_dlog(NULL, "IndexStartPosition %"PRId64"\n", segment->index_start_position);
778         break;
779     case 0x3F0D:
780         segment->index_duration = avio_rb64(pb);
781         av_dlog(NULL, "IndexDuration %"PRId64"\n", segment->index_duration);
782         break;
783     }
784     return 0;
785 }
786
787 static void mxf_read_pixel_layout(AVIOContext *pb, MXFDescriptor *descriptor)
788 {
789     int code, value, ofs = 0;
790     char layout[16] = {0};
791
792     do {
793         code = avio_r8(pb);
794         value = avio_r8(pb);
795         av_dlog(NULL, "pixel layout: code %#x\n", code);
796
797         if (ofs < 16) {
798             layout[ofs++] = code;
799             layout[ofs++] = value;
800         }
801     } while (code != 0); /* SMPTE 377M E.2.46 */
802
803     ff_mxf_decode_pixel_layout(layout, &descriptor->pix_fmt);
804 }
805
806 static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
807 {
808     MXFDescriptor *descriptor = arg;
809     descriptor->pix_fmt = PIX_FMT_NONE;
810     switch(tag) {
811     case 0x3F01:
812         descriptor->sub_descriptors_count = avio_rb32(pb);
813         if (descriptor->sub_descriptors_count >= UINT_MAX / sizeof(UID))
814             return AVERROR_INVALIDDATA;
815         descriptor->sub_descriptors_refs = av_malloc(descriptor->sub_descriptors_count * sizeof(UID));
816         if (!descriptor->sub_descriptors_refs)
817             return AVERROR(ENOMEM);
818         avio_skip(pb, 4); /* useless size of objects, always 16 according to specs */
819         avio_read(pb, (uint8_t *)descriptor->sub_descriptors_refs, descriptor->sub_descriptors_count * sizeof(UID));
820         break;
821     case 0x3004:
822         avio_read(pb, descriptor->essence_container_ul, 16);
823         break;
824     case 0x3006:
825         descriptor->linked_track_id = avio_rb32(pb);
826         break;
827     case 0x3201: /* PictureEssenceCoding */
828         avio_read(pb, descriptor->essence_codec_ul, 16);
829         break;
830     case 0x3203:
831         descriptor->width = avio_rb32(pb);
832         break;
833     case 0x3202:
834         descriptor->height = avio_rb32(pb);
835         break;
836     case 0x320C:
837         descriptor->frame_layout = avio_r8(pb);
838         break;
839     case 0x320E:
840         descriptor->aspect_ratio.num = avio_rb32(pb);
841         descriptor->aspect_ratio.den = avio_rb32(pb);
842         break;
843     case 0x3301:
844         descriptor->component_depth = avio_rb32(pb);
845         break;
846     case 0x3302:
847         descriptor->horiz_subsampling = avio_rb32(pb);
848         break;
849     case 0x3308:
850         descriptor->vert_subsampling = avio_rb32(pb);
851         break;
852     case 0x3D03:
853         descriptor->sample_rate.num = avio_rb32(pb);
854         descriptor->sample_rate.den = avio_rb32(pb);
855         break;
856     case 0x3D06: /* SoundEssenceCompression */
857         avio_read(pb, descriptor->essence_codec_ul, 16);
858         break;
859     case 0x3D07:
860         descriptor->channels = avio_rb32(pb);
861         break;
862     case 0x3D01:
863         descriptor->bits_per_sample = avio_rb32(pb);
864         break;
865     case 0x3401:
866         mxf_read_pixel_layout(pb, descriptor);
867         break;
868     default:
869         /* Private uid used by SONY C0023S01.mxf */
870         if (IS_KLV_KEY(uid, mxf_sony_mpeg4_extradata)) {
871             descriptor->extradata = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
872             if (!descriptor->extradata)
873                 return AVERROR(ENOMEM);
874             descriptor->extradata_size = size;
875             avio_read(pb, descriptor->extradata, size);
876         }
877         break;
878     }
879     return 0;
880 }
881
882 /*
883  * Match an uid independently of the version byte and up to len common bytes
884  * Returns: boolean
885  */
886 static int mxf_match_uid(const UID key, const UID uid, int len)
887 {
888     int i;
889     for (i = 0; i < len; i++) {
890         if (i != 7 && key[i] != uid[i])
891             return 0;
892     }
893     return 1;
894 }
895
896 static const MXFCodecUL *mxf_get_codec_ul(const MXFCodecUL *uls, UID *uid)
897 {
898     while (uls->uid[0]) {
899         if(mxf_match_uid(uls->uid, *uid, uls->matching_len))
900             break;
901         uls++;
902     }
903     return uls;
904 }
905
906 static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum MXFMetadataSetType type)
907 {
908     int i;
909
910     if (!strong_ref)
911         return NULL;
912     for (i = 0; i < mxf->metadata_sets_count; i++) {
913         if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16) &&
914             (type == AnyType || mxf->metadata_sets[i]->type == type)) {
915             return mxf->metadata_sets[i];
916         }
917     }
918     return NULL;
919 }
920
921 static const MXFCodecUL mxf_picture_essence_container_uls[] = {
922     // video essence container uls
923     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, 14, CODEC_ID_MPEG2VIDEO }, /* MPEG-ES Frame wrapped */
924     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x41,0x01 }, 14,    CODEC_ID_DVVIDEO }, /* DV 625 25mbps */
925     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x05,0x00,0x00 }, 14,   CODEC_ID_RAWVIDEO }, /* Uncompressed Picture */
926     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,      CODEC_ID_NONE },
927 };
928
929 /* EC ULs for intra-only formats */
930 static const MXFCodecUL mxf_intra_only_essence_container_uls[] = {
931     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x00,0x00 }, 14, CODEC_ID_MPEG2VIDEO }, /* MXF-GC SMPTE D-10 Mappings */
932     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,       CODEC_ID_NONE },
933 };
934
935 /* intra-only PictureEssenceCoding ULs, where no corresponding EC UL exists */
936 static const MXFCodecUL mxf_intra_only_picture_essence_coding_uls[] = {
937     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x00,0x00 }, 14,       CODEC_ID_H264 }, /* H.264/MPEG-4 AVC Intra Profiles */
938     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,       CODEC_ID_NONE },
939 };
940
941 static const MXFCodecUL mxf_sound_essence_container_uls[] = {
942     // sound essence container uls
943     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 }, 14, CODEC_ID_PCM_S16LE }, /* BWF Frame wrapped */
944     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x40,0x01 }, 14,       CODEC_ID_MP2 }, /* MPEG-ES Frame wrapped, 0x40 ??? stream id */
945     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, 14, CODEC_ID_PCM_S16LE }, /* D-10 Mapping 50Mbps PAL Extended Template */
946     { { 0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0xFF,0x4B,0x46,0x41,0x41,0x00,0x0D,0x4D,0x4F }, 14, CODEC_ID_PCM_S16LE }, /* 0001GL00.MXF.A1.mxf_opatom.mxf */
947     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,      CODEC_ID_NONE },
948 };
949
950 static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segments, MXFIndexTableSegment ***sorted_segments)
951 {
952     int i, j, nb_segments = 0;
953     MXFIndexTableSegment **unsorted_segments;
954     int last_body_sid = -1, last_index_sid = -1, last_index_start = -1;
955
956     /* count number of segments, allocate arrays and copy unsorted segments */
957     for (i = 0; i < mxf->metadata_sets_count; i++)
958         if (mxf->metadata_sets[i]->type == IndexTableSegment)
959             nb_segments++;
960
961     if (!(unsorted_segments = av_calloc(nb_segments, sizeof(*unsorted_segments))) ||
962         !(*sorted_segments  = av_calloc(nb_segments, sizeof(**sorted_segments)))) {
963         av_freep(sorted_segments);
964         av_free(unsorted_segments);
965         return AVERROR(ENOMEM);
966     }
967
968     for (i = j = 0; i < mxf->metadata_sets_count; i++)
969         if (mxf->metadata_sets[i]->type == IndexTableSegment)
970             unsorted_segments[j++] = (MXFIndexTableSegment*)mxf->metadata_sets[i];
971
972     *nb_sorted_segments = 0;
973
974     /* sort segments by {BodySID, IndexSID, IndexStartPosition}, remove duplicates while we're at it */
975     for (i = 0; i < nb_segments; i++) {
976         int best = -1, best_body_sid = -1, best_index_sid = -1, best_index_start = -1;
977         uint64_t best_index_duration = 0;
978
979         for (j = 0; j < nb_segments; j++) {
980             MXFIndexTableSegment *s = unsorted_segments[j];
981
982             /* Require larger BosySID, IndexSID or IndexStartPosition then the previous entry. This removes duplicates.
983              * We want the smallest values for the keys than what we currently have, unless this is the first such entry this time around.
984              * If we come across an entry with the same IndexStartPosition but larger IndexDuration, then we'll prefer it over the one we currently have.
985              */
986             if ((i == 0     || s->body_sid > last_body_sid || s->index_sid > last_index_sid || s->index_start_position > last_index_start) &&
987                 (best == -1 || s->body_sid < best_body_sid || s->index_sid < best_index_sid || s->index_start_position < best_index_start ||
988                 (s->index_start_position == best_index_start && s->index_duration > best_index_duration))) {
989                 best             = j;
990                 best_body_sid    = s->body_sid;
991                 best_index_sid   = s->index_sid;
992                 best_index_start = s->index_start_position;
993                 best_index_duration = s->index_duration;
994             }
995         }
996
997         /* no suitable entry found -> we're done */
998         if (best == -1)
999             break;
1000
1001         (*sorted_segments)[(*nb_sorted_segments)++] = unsorted_segments[best];
1002         last_body_sid    = best_body_sid;
1003         last_index_sid   = best_index_sid;
1004         last_index_start = best_index_start;
1005     }
1006
1007     av_free(unsorted_segments);
1008
1009     return 0;
1010 }
1011
1012 /**
1013  * Computes the absolute file offset of the given essence container offset
1014  */
1015 static int mxf_absolute_bodysid_offset(MXFContext *mxf, int body_sid, int64_t offset, int64_t *offset_out)
1016 {
1017     int x;
1018     int64_t offset_in = offset;     /* for logging */
1019
1020     for (x = 0; x < mxf->partitions_count; x++) {
1021         MXFPartition *p = &mxf->partitions[x];
1022
1023         if (p->body_sid != body_sid)
1024             continue;
1025
1026         if (offset < p->essence_length || !p->essence_length) {
1027             *offset_out = p->essence_offset + offset;
1028             return 0;
1029         }
1030
1031         offset -= p->essence_length;
1032     }
1033
1034     av_log(mxf->fc, AV_LOG_ERROR,
1035            "failed to find absolute offset of %"PRIX64" in BodySID %i - partial file?\n",
1036            offset_in, body_sid);
1037
1038     return AVERROR_INVALIDDATA;
1039 }
1040
1041 /**
1042  * Returns the end position of the essence container with given BodySID, or zero if unknown
1043  */
1044 static int64_t mxf_essence_container_end(MXFContext *mxf, int body_sid)
1045 {
1046     int x;
1047     int64_t ret = 0;
1048
1049     for (x = 0; x < mxf->partitions_count; x++) {
1050         MXFPartition *p = &mxf->partitions[x];
1051
1052         if (p->body_sid != body_sid)
1053             continue;
1054
1055         if (!p->essence_length)
1056             return 0;
1057
1058         ret = p->essence_offset + p->essence_length;
1059     }
1060
1061     return ret;
1062 }
1063
1064 /* EditUnit -> absolute offset */
1065 static int mxf_edit_unit_absolute_offset(MXFContext *mxf, MXFIndexTable *index_table, int64_t edit_unit, int64_t *edit_unit_out, int64_t *offset_out, int nag)
1066 {
1067     int i;
1068     int64_t offset_temp = 0;
1069
1070     for (i = 0; i < index_table->nb_segments; i++) {
1071         MXFIndexTableSegment *s = index_table->segments[i];
1072
1073         edit_unit = FFMAX(edit_unit, s->index_start_position);  /* clamp if trying to seek before start */
1074
1075         if (edit_unit < s->index_start_position + s->index_duration) {
1076             int64_t index = edit_unit - s->index_start_position;
1077
1078             if (s->edit_unit_byte_count)
1079                 offset_temp += s->edit_unit_byte_count * index;
1080             else if (s->nb_index_entries) {
1081                 if (s->nb_index_entries == 2 * s->index_duration + 1)
1082                     index *= 2;     /* Avid index */
1083
1084                 if (index < 0 || index >= s->nb_index_entries) {
1085                     av_log(mxf->fc, AV_LOG_ERROR, "IndexSID %i segment at %"PRId64" IndexEntryArray too small\n",
1086                            index_table->index_sid, s->index_start_position);
1087                     return AVERROR_INVALIDDATA;
1088                 }
1089
1090                 offset_temp = s->stream_offset_entries[index];
1091             } else {
1092                 av_log(mxf->fc, AV_LOG_ERROR, "IndexSID %i segment at %"PRId64" missing EditUnitByteCount and IndexEntryArray\n",
1093                        index_table->index_sid, s->index_start_position);
1094                 return AVERROR_INVALIDDATA;
1095             }
1096
1097             if (edit_unit_out)
1098                 *edit_unit_out = edit_unit;
1099
1100             return mxf_absolute_bodysid_offset(mxf, index_table->body_sid, offset_temp, offset_out);
1101         } else {
1102             /* EditUnitByteCount == 0 for VBR indexes, which is fine since they use explicit StreamOffsets */
1103             offset_temp += s->edit_unit_byte_count * s->index_duration;
1104         }
1105     }
1106
1107     if (nag)
1108         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);
1109
1110     return AVERROR_INVALIDDATA;
1111 }
1112
1113 static int mxf_compute_ptses_fake_index(MXFContext *mxf, MXFIndexTable *index_table)
1114 {
1115     int i, j, x;
1116     int8_t max_temporal_offset = -128;
1117
1118     /* first compute how many entries we have */
1119     for (i = 0; i < index_table->nb_segments; i++) {
1120         MXFIndexTableSegment *s = index_table->segments[i];
1121
1122         if (!s->nb_index_entries) {
1123             index_table->nb_ptses = 0;
1124             return 0;                               /* no TemporalOffsets */
1125         }
1126
1127         index_table->nb_ptses += s->index_duration;
1128     }
1129
1130     /* paranoid check */
1131     if (index_table->nb_ptses <= 0)
1132         return 0;
1133
1134     if (!(index_table->ptses      = av_calloc(index_table->nb_ptses, sizeof(int64_t))) ||
1135         !(index_table->fake_index = av_calloc(index_table->nb_ptses, sizeof(AVIndexEntry)))) {
1136         av_freep(&index_table->ptses);
1137         return AVERROR(ENOMEM);
1138     }
1139
1140     /* we may have a few bad TemporalOffsets
1141      * make sure the corresponding PTSes don't have the bogus value 0 */
1142     for (x = 0; x < index_table->nb_ptses; x++)
1143         index_table->ptses[x] = AV_NOPTS_VALUE;
1144
1145     /**
1146      * We have this:
1147      *
1148      * x  TemporalOffset
1149      * 0:  0
1150      * 1:  1
1151      * 2:  1
1152      * 3: -2
1153      * 4:  1
1154      * 5:  1
1155      * 6: -2
1156      *
1157      * We want to transform it into this:
1158      *
1159      * x  DTS PTS
1160      * 0: -1   0
1161      * 1:  0   3
1162      * 2:  1   1
1163      * 3:  2   2
1164      * 4:  3   6
1165      * 5:  4   4
1166      * 6:  5   5
1167      *
1168      * We do this by bucket sorting x by x+TemporalOffset[x] into mxf->ptses,
1169      * then settings mxf->first_dts = -max(TemporalOffset[x]).
1170      * The latter makes DTS <= PTS.
1171      */
1172     for (i = x = 0; i < index_table->nb_segments; i++) {
1173         MXFIndexTableSegment *s = index_table->segments[i];
1174         int index_delta = 1;
1175         int n = s->nb_index_entries;
1176
1177         if (s->nb_index_entries == 2 * s->index_duration + 1) {
1178             index_delta = 2;    /* Avid index */
1179             /* ignore the last entry - it's the size of the essence container */
1180             n--;
1181         }
1182
1183         for (j = 0; j < n; j += index_delta, x++) {
1184             int offset = s->temporal_offset_entries[j] / index_delta;
1185             int index  = x + offset;
1186
1187             if (x >= index_table->nb_ptses) {
1188                 av_log(mxf->fc, AV_LOG_ERROR,
1189                        "x >= nb_ptses - IndexEntryCount %i < IndexDuration %"PRId64"?\n",
1190                        s->nb_index_entries, s->index_duration);
1191                 break;
1192             }
1193
1194             index_table->fake_index[x].timestamp = x;
1195             index_table->fake_index[x].flags = !(s->flag_entries[j] & 0x30) ? AVINDEX_KEYFRAME : 0;
1196
1197             if (index < 0 || index >= index_table->nb_ptses) {
1198                 av_log(mxf->fc, AV_LOG_ERROR,
1199                        "index entry %i + TemporalOffset %i = %i, which is out of bounds\n",
1200                        x, offset, index);
1201                 continue;
1202             }
1203
1204             index_table->ptses[index] = x;
1205             max_temporal_offset = FFMAX(max_temporal_offset, offset);
1206         }
1207     }
1208
1209     index_table->first_dts = -max_temporal_offset;
1210
1211     return 0;
1212 }
1213
1214 /**
1215  * Sorts and collects index table segments into index tables.
1216  * Also computes PTSes if possible.
1217  */
1218 static int mxf_compute_index_tables(MXFContext *mxf)
1219 {
1220     int i, j, k, ret, nb_sorted_segments;
1221     MXFIndexTableSegment **sorted_segments = NULL;
1222
1223     if ((ret = mxf_get_sorted_table_segments(mxf, &nb_sorted_segments, &sorted_segments)) ||
1224         nb_sorted_segments <= 0) {
1225         av_log(mxf->fc, AV_LOG_WARNING, "broken or empty index\n");
1226         return 0;
1227     }
1228
1229     /* sanity check and count unique BodySIDs/IndexSIDs */
1230     for (i = 0; i < nb_sorted_segments; i++) {
1231         if (i == 0 || sorted_segments[i-1]->index_sid != sorted_segments[i]->index_sid)
1232             mxf->nb_index_tables++;
1233         else if (sorted_segments[i-1]->body_sid != sorted_segments[i]->body_sid) {
1234             av_log(mxf->fc, AV_LOG_ERROR, "found inconsistent BodySID\n");
1235             ret = AVERROR_INVALIDDATA;
1236             goto finish_decoding_index;
1237         }
1238     }
1239
1240     if (!(mxf->index_tables = av_calloc(mxf->nb_index_tables, sizeof(MXFIndexTable)))) {
1241         av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate index tables\n");
1242         ret = AVERROR(ENOMEM);
1243         goto finish_decoding_index;
1244     }
1245
1246     /* distribute sorted segments to index tables */
1247     for (i = j = 0; i < nb_sorted_segments; i++) {
1248         if (i != 0 && sorted_segments[i-1]->index_sid != sorted_segments[i]->index_sid) {
1249             /* next IndexSID */
1250             j++;
1251         }
1252
1253         mxf->index_tables[j].nb_segments++;
1254     }
1255
1256     for (i = j = 0; j < mxf->nb_index_tables; i += mxf->index_tables[j++].nb_segments) {
1257         MXFIndexTable *t = &mxf->index_tables[j];
1258
1259         if (!(t->segments = av_calloc(t->nb_segments, sizeof(MXFIndexTableSegment*)))) {
1260             av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate IndexTableSegment pointer array\n");
1261             ret = AVERROR(ENOMEM);
1262             goto finish_decoding_index;
1263         }
1264
1265         if (sorted_segments[i]->index_start_position)
1266             av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i starts at EditUnit %"PRId64" - seeking may not work as expected\n",
1267                    sorted_segments[i]->index_sid, sorted_segments[i]->index_start_position);
1268
1269         memcpy(t->segments, &sorted_segments[i], t->nb_segments * sizeof(MXFIndexTableSegment*));
1270         t->index_sid = sorted_segments[i]->index_sid;
1271         t->body_sid = sorted_segments[i]->body_sid;
1272
1273         if ((ret = mxf_compute_ptses_fake_index(mxf, t)) < 0)
1274             goto finish_decoding_index;
1275
1276         /* fix zero IndexDurations */
1277         for (k = 0; k < t->nb_segments; k++) {
1278             if (t->segments[k]->index_duration)
1279                 continue;
1280
1281             if (t->nb_segments > 1)
1282                 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment %i has zero IndexDuration and there's more than one segment\n",
1283                        t->index_sid, k);
1284
1285             if (mxf->fc->nb_streams <= 0) {
1286                 av_log(mxf->fc, AV_LOG_WARNING, "no streams?\n");
1287                 break;
1288             }
1289
1290             /* assume the first stream's duration is reasonable
1291              * leave index_duration = 0 on further segments in case we have any (unlikely)
1292              */
1293             t->segments[k]->index_duration = mxf->fc->streams[0]->duration;
1294             break;
1295         }
1296     }
1297
1298     ret = 0;
1299 finish_decoding_index:
1300     av_free(sorted_segments);
1301     return ret;
1302 }
1303
1304 static int mxf_is_intra_only(MXFDescriptor *descriptor)
1305 {
1306     return mxf_get_codec_ul(mxf_intra_only_essence_container_uls,
1307                             &descriptor->essence_container_ul)->id != CODEC_ID_NONE ||
1308            mxf_get_codec_ul(mxf_intra_only_picture_essence_coding_uls,
1309                             &descriptor->essence_codec_ul)->id     != CODEC_ID_NONE;
1310 }
1311
1312 static int mxf_add_timecode_metadata(AVDictionary **pm, const char *key, AVTimecode *tc)
1313 {
1314     char buf[AV_TIMECODE_STR_SIZE];
1315     av_dict_set(pm, key, av_timecode_make_string(tc, buf, 0), 0);
1316
1317     return 0;
1318 }
1319
1320 static int mxf_parse_structural_metadata(MXFContext *mxf)
1321 {
1322     MXFPackage *material_package = NULL;
1323     MXFPackage *temp_package = NULL;
1324     int i, j, k, ret;
1325
1326     av_dlog(mxf->fc, "metadata sets count %d\n", mxf->metadata_sets_count);
1327     /* TODO: handle multiple material packages (OP3x) */
1328     for (i = 0; i < mxf->packages_count; i++) {
1329         material_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], MaterialPackage);
1330         if (material_package) break;
1331     }
1332     if (!material_package) {
1333         av_log(mxf->fc, AV_LOG_ERROR, "no material package found\n");
1334         return AVERROR_INVALIDDATA;
1335     }
1336
1337     for (i = 0; i < material_package->tracks_count; i++) {
1338         MXFPackage *source_package = NULL;
1339         MXFTrack *material_track = NULL;
1340         MXFTrack *source_track = NULL;
1341         MXFTrack *temp_track = NULL;
1342         MXFDescriptor *descriptor = NULL;
1343         MXFStructuralComponent *component = NULL;
1344         MXFTimecodeComponent *mxf_tc = NULL;
1345         UID *essence_container_ul = NULL;
1346         const MXFCodecUL *codec_ul = NULL;
1347         const MXFCodecUL *container_ul = NULL;
1348         const MXFCodecUL *pix_fmt_ul = NULL;
1349         AVStream *st;
1350         AVTimecode tc;
1351         int flags;
1352
1353         if (!(material_track = mxf_resolve_strong_ref(mxf, &material_package->tracks_refs[i], Track))) {
1354             av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track strong ref\n");
1355             continue;
1356         }
1357
1358         if ((component = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, TimecodeComponent))) {
1359             mxf_tc = (MXFTimecodeComponent*)component;
1360             flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
1361             if (av_timecode_init(&tc, mxf_tc->rate, flags, mxf_tc->start_frame, mxf->fc) == 0) {
1362                 mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
1363             }
1364         }
1365
1366         if (!(material_track->sequence = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, Sequence))) {
1367             av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track sequence strong ref\n");
1368             continue;
1369         }
1370
1371         for (j = 0; j < material_track->sequence->structural_components_count; j++) {
1372             component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j], TimecodeComponent);
1373             if (!component)
1374                 continue;
1375
1376             mxf_tc = (MXFTimecodeComponent*)component;
1377             flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
1378             if (av_timecode_init(&tc, mxf_tc->rate, flags, mxf_tc->start_frame, mxf->fc) == 0) {
1379                 mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
1380                 break;
1381             }
1382         }
1383
1384         /* TODO: handle multiple source clips */
1385         for (j = 0; j < material_track->sequence->structural_components_count; j++) {
1386             component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j], SourceClip);
1387             if (!component)
1388                 continue;
1389
1390             for (k = 0; k < mxf->packages_count; k++) {
1391                 temp_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[k], SourcePackage);
1392                 if (!temp_package)
1393                     continue;
1394                 if (!memcmp(temp_package->package_uid, component->source_package_uid, 16)) {
1395                     source_package = temp_package;
1396                     break;
1397                 }
1398             }
1399             if (!source_package) {
1400                 av_dlog(mxf->fc, "material track %d: no corresponding source package found\n", material_track->track_id);
1401                 break;
1402             }
1403             for (k = 0; k < source_package->tracks_count; k++) {
1404                 if (!(temp_track = mxf_resolve_strong_ref(mxf, &source_package->tracks_refs[k], Track))) {
1405                     av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n");
1406                     ret = AVERROR_INVALIDDATA;
1407                     goto fail_and_free;
1408                 }
1409                 if (temp_track->track_id == component->source_track_id) {
1410                     source_track = temp_track;
1411                     break;
1412                 }
1413             }
1414             if (!source_track) {
1415                 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source track found\n", material_track->track_id);
1416                 break;
1417             }
1418         }
1419         if (!source_track || !component)
1420             continue;
1421
1422         if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) {
1423             av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
1424             ret = AVERROR_INVALIDDATA;
1425             goto fail_and_free;
1426         }
1427
1428         /* 0001GL00.MXF.A1.mxf_opatom.mxf has the same SourcePackageID as 0001GL.MXF.V1.mxf_opatom.mxf
1429          * This would result in both files appearing to have two streams. Work around this by sanity checking DataDefinition */
1430         if (memcmp(material_track->sequence->data_definition_ul, source_track->sequence->data_definition_ul, 16)) {
1431             av_log(mxf->fc, AV_LOG_ERROR, "material track %d: DataDefinition mismatch\n", material_track->track_id);
1432             continue;
1433         }
1434
1435         st = avformat_new_stream(mxf->fc, NULL);
1436         if (!st) {
1437             av_log(mxf->fc, AV_LOG_ERROR, "could not allocate stream\n");
1438             ret = AVERROR(ENOMEM);
1439             goto fail_and_free;
1440         }
1441         st->id = source_track->track_id;
1442         st->priv_data = source_track;
1443         st->duration = component->duration;
1444         if (st->duration == -1)
1445             st->duration = AV_NOPTS_VALUE;
1446         st->start_time = component->start_position;
1447         avpriv_set_pts_info(st, 64, material_track->edit_rate.den, material_track->edit_rate.num);
1448
1449         PRINT_KEY(mxf->fc, "data definition   ul", source_track->sequence->data_definition_ul);
1450         codec_ul = mxf_get_codec_ul(ff_mxf_data_definition_uls, &source_track->sequence->data_definition_ul);
1451         st->codec->codec_type = codec_ul->id;
1452
1453         source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref, AnyType);
1454         if (source_package->descriptor) {
1455             if (source_package->descriptor->type == MultipleDescriptor) {
1456                 for (j = 0; j < source_package->descriptor->sub_descriptors_count; j++) {
1457                     MXFDescriptor *sub_descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor->sub_descriptors_refs[j], Descriptor);
1458
1459                     if (!sub_descriptor) {
1460                         av_log(mxf->fc, AV_LOG_ERROR, "could not resolve sub descriptor strong ref\n");
1461                         continue;
1462                     }
1463                     if (sub_descriptor->linked_track_id == source_track->track_id) {
1464                         descriptor = sub_descriptor;
1465                         break;
1466                     }
1467                 }
1468             } else if (source_package->descriptor->type == Descriptor)
1469                 descriptor = source_package->descriptor;
1470         }
1471         if (!descriptor) {
1472             av_log(mxf->fc, AV_LOG_INFO, "source track %d: stream %d, no descriptor found\n", source_track->track_id, st->index);
1473             continue;
1474         }
1475         PRINT_KEY(mxf->fc, "essence codec     ul", descriptor->essence_codec_ul);
1476         PRINT_KEY(mxf->fc, "essence container ul", descriptor->essence_container_ul);
1477         essence_container_ul = &descriptor->essence_container_ul;
1478         /* HACK: replacing the original key with mxf_encrypted_essence_container
1479          * is not allowed according to s429-6, try to find correct information anyway */
1480         if (IS_KLV_KEY(essence_container_ul, mxf_encrypted_essence_container)) {
1481             av_log(mxf->fc, AV_LOG_INFO, "broken encrypted mxf file\n");
1482             for (k = 0; k < mxf->metadata_sets_count; k++) {
1483                 MXFMetadataSet *metadata = mxf->metadata_sets[k];
1484                 if (metadata->type == CryptoContext) {
1485                     essence_container_ul = &((MXFCryptoContext *)metadata)->source_container_ul;
1486                     break;
1487                 }
1488             }
1489         }
1490
1491         /* TODO: drop PictureEssenceCoding and SoundEssenceCompression, only check EssenceContainer */
1492         codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->essence_codec_ul);
1493         st->codec->codec_id = codec_ul->id;
1494         if (descriptor->extradata) {
1495             st->codec->extradata = descriptor->extradata;
1496             st->codec->extradata_size = descriptor->extradata_size;
1497         }
1498         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1499             source_track->intra_only = mxf_is_intra_only(descriptor);
1500             container_ul = mxf_get_codec_ul(mxf_picture_essence_container_uls, essence_container_ul);
1501             if (st->codec->codec_id == CODEC_ID_NONE)
1502                 st->codec->codec_id = container_ul->id;
1503             st->codec->width = descriptor->width;
1504             st->codec->height = descriptor->height; /* Field height, not frame height */
1505             switch (descriptor->frame_layout) {
1506                 case SegmentedFrame:
1507                     /* This one is a weird layout I don't fully understand. */
1508                     av_log(mxf->fc, AV_LOG_INFO, "SegmentedFrame layout isn't currently supported\n");
1509                     break;
1510                 case FullFrame:
1511                     break;
1512                 case OneField:
1513                     /* Every other line is stored and needs to be duplicated. */
1514                     av_log(mxf->fc, AV_LOG_INFO, "OneField frame layout isn't currently supported\n");
1515                     break; /* The correct thing to do here is fall through, but by breaking we might be
1516                               able to decode some streams at half the vertical resolution, rather than not al all.
1517                               It's also for compatibility with the old behavior. */
1518                 case MixedFields:
1519                     break;
1520                 case SeparateFields:
1521                     st->codec->height *= 2; /* Turn field height into frame height. */
1522                     break;
1523                 default:
1524                     av_log(mxf->fc, AV_LOG_INFO, "Unknown frame layout type: %d\n", descriptor->frame_layout);
1525             }
1526             if (st->codec->codec_id == CODEC_ID_RAWVIDEO) {
1527                 st->codec->pix_fmt = descriptor->pix_fmt;
1528                 if (st->codec->pix_fmt == PIX_FMT_NONE) {
1529                     pix_fmt_ul = mxf_get_codec_ul(ff_mxf_pixel_format_uls, &descriptor->essence_codec_ul);
1530                     st->codec->pix_fmt = pix_fmt_ul->id;
1531                     if (st->codec->pix_fmt == PIX_FMT_NONE) {
1532                         /* support files created before RP224v10 by defaulting to UYVY422
1533                            if subsampling is 4:2:2 and component depth is 8-bit */
1534                         if (descriptor->horiz_subsampling == 2 &&
1535                             descriptor->vert_subsampling == 1 &&
1536                             descriptor->component_depth == 8) {
1537                             st->codec->pix_fmt = PIX_FMT_UYVY422;
1538                         }
1539                     }
1540                 }
1541             }
1542             st->need_parsing = AVSTREAM_PARSE_HEADERS;
1543         } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1544             container_ul = mxf_get_codec_ul(mxf_sound_essence_container_uls, essence_container_ul);
1545             if (st->codec->codec_id == CODEC_ID_NONE)
1546                 st->codec->codec_id = container_ul->id;
1547             st->codec->channels = descriptor->channels;
1548             st->codec->bits_per_coded_sample = descriptor->bits_per_sample;
1549
1550             if (descriptor->sample_rate.den > 0)
1551                 st->codec->sample_rate = descriptor->sample_rate.num / descriptor->sample_rate.den;
1552
1553             /* TODO: implement CODEC_ID_RAWAUDIO */
1554             if (st->codec->codec_id == CODEC_ID_PCM_S16LE) {
1555                 if (descriptor->bits_per_sample > 16 && descriptor->bits_per_sample <= 24)
1556                     st->codec->codec_id = CODEC_ID_PCM_S24LE;
1557                 else if (descriptor->bits_per_sample == 32)
1558                     st->codec->codec_id = CODEC_ID_PCM_S32LE;
1559             } else if (st->codec->codec_id == CODEC_ID_PCM_S16BE) {
1560                 if (descriptor->bits_per_sample > 16 && descriptor->bits_per_sample <= 24)
1561                     st->codec->codec_id = CODEC_ID_PCM_S24BE;
1562                 else if (descriptor->bits_per_sample == 32)
1563                     st->codec->codec_id = CODEC_ID_PCM_S32BE;
1564             } else if (st->codec->codec_id == CODEC_ID_MP2) {
1565                 st->need_parsing = AVSTREAM_PARSE_FULL;
1566             }
1567         }
1568         if (st->codec->codec_type != AVMEDIA_TYPE_DATA && (*essence_container_ul)[15] > 0x01) {
1569             /* TODO: decode timestamps */
1570             st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS;
1571         }
1572     }
1573
1574     ret = 0;
1575 fail_and_free:
1576     return ret;
1577 }
1578
1579 static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = {
1580     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x05,0x01,0x00 }, mxf_read_primer_pack },
1581     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x01,0x00 }, mxf_read_partition_pack },
1582     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x02,0x00 }, mxf_read_partition_pack },
1583     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x03,0x00 }, mxf_read_partition_pack },
1584     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x04,0x00 }, mxf_read_partition_pack },
1585     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x01,0x00 }, mxf_read_partition_pack },
1586     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x02,0x00 }, mxf_read_partition_pack },
1587     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x03,0x00 }, mxf_read_partition_pack },
1588     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x04,0x00 }, mxf_read_partition_pack },
1589     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x02,0x00 }, mxf_read_partition_pack },
1590     { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }, mxf_read_partition_pack },
1591     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_content_storage, 0, AnyType },
1592     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_source_package, sizeof(MXFPackage), SourcePackage },
1593     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_material_package, sizeof(MXFPackage), MaterialPackage },
1594     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0F,0x00 }, mxf_read_sequence, sizeof(MXFSequence), Sequence },
1595     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_source_clip, sizeof(MXFStructuralComponent), SourceClip },
1596     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), MultipleDescriptor },
1597     { { 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 */
1598     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* CDCI */
1599     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* RGBA */
1600     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* MPEG 2 Video */
1601     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* Wave */
1602     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* AES3 */
1603     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Static Track */
1604     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Generic Track */
1605     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x14,0x00 }, mxf_read_timecode_component, sizeof(MXFTimecodeComponent), TimecodeComponent },
1606     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 }, mxf_read_cryptographic_context, sizeof(MXFCryptoContext), CryptoContext },
1607     { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 }, mxf_read_index_table_segment, sizeof(MXFIndexTableSegment), IndexTableSegment },
1608     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType },
1609 };
1610
1611 static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadFunc *read_child, int ctx_size, enum MXFMetadataSetType type)
1612 {
1613     AVIOContext *pb = mxf->fc->pb;
1614     MXFMetadataSet *ctx = ctx_size ? av_mallocz(ctx_size) : mxf;
1615     uint64_t klv_end = avio_tell(pb) + klv->length;
1616
1617     if (!ctx)
1618         return AVERROR(ENOMEM);
1619     while (avio_tell(pb) + 4 < klv_end && !url_feof(pb)) {
1620         int ret;
1621         int tag = avio_rb16(pb);
1622         int size = avio_rb16(pb); /* KLV specified by 0x53 */
1623         uint64_t next = avio_tell(pb) + size;
1624         UID uid = {0};
1625
1626         av_dlog(mxf->fc, "local tag %#04x size %d\n", tag, size);
1627         if (!size) { /* ignore empty tag, needed for some files with empty UMID tag */
1628             av_log(mxf->fc, AV_LOG_ERROR, "local tag %#04x with 0 size\n", tag);
1629             continue;
1630         }
1631         if (tag > 0x7FFF) { /* dynamic tag */
1632             int i;
1633             for (i = 0; i < mxf->local_tags_count; i++) {
1634                 int local_tag = AV_RB16(mxf->local_tags+i*18);
1635                 if (local_tag == tag) {
1636                     memcpy(uid, mxf->local_tags+i*18+2, 16);
1637                     av_dlog(mxf->fc, "local tag %#04x\n", local_tag);
1638                     PRINT_KEY(mxf->fc, "uid", uid);
1639                 }
1640             }
1641         }
1642         if (ctx_size && tag == 0x3C0A)
1643             avio_read(pb, ctx->uid, 16);
1644         else if ((ret = read_child(ctx, pb, tag, size, uid, -1)) < 0)
1645             return ret;
1646
1647         /* Accept the 64k local set limit being exceeded (Avid). Don't accept
1648          * it extending past the end of the KLV though (zzuf5.mxf). */
1649         if (avio_tell(pb) > klv_end) {
1650             av_log(mxf->fc, AV_LOG_ERROR,
1651                    "local tag %#04x extends past end of local set @ %#"PRIx64"\n",
1652                    tag, klv->offset);
1653             return AVERROR_INVALIDDATA;
1654         } else if (avio_tell(pb) <= next)   /* only seek forward, else this can loop for a long time */
1655             avio_seek(pb, next, SEEK_SET);
1656     }
1657     if (ctx_size) ctx->type = type;
1658     return ctx_size ? mxf_add_metadata_set(mxf, ctx) : 0;
1659 }
1660
1661 /**
1662  * Seeks to the previous partition, if possible
1663  * @return <= 0 if we should stop parsing, > 0 if we should keep going
1664  */
1665 static int mxf_seek_to_previous_partition(MXFContext *mxf)
1666 {
1667     AVIOContext *pb = mxf->fc->pb;
1668
1669     if (!mxf->current_partition ||
1670         mxf->run_in + mxf->current_partition->previous_partition <= mxf->last_forward_tell)
1671         return 0;   /* we've parsed all partitions */
1672
1673     /* seek to previous partition */
1674     avio_seek(pb, mxf->run_in + mxf->current_partition->previous_partition, SEEK_SET);
1675     mxf->current_partition = NULL;
1676
1677     av_dlog(mxf->fc, "seeking to previous partition\n");
1678
1679     return 1;
1680 }
1681
1682 /**
1683  * Called when essence is encountered
1684  * @return <= 0 if we should stop parsing, > 0 if we should keep going
1685  */
1686 static int mxf_parse_handle_essence(MXFContext *mxf)
1687 {
1688     AVIOContext *pb = mxf->fc->pb;
1689     int64_t ret;
1690
1691     if (mxf->parsing_backward) {
1692         return mxf_seek_to_previous_partition(mxf);
1693     } else {
1694         if (!mxf->footer_partition) {
1695             av_dlog(mxf->fc, "no footer\n");
1696             return 0;
1697         }
1698
1699         av_dlog(mxf->fc, "seeking to footer\n");
1700
1701         /* remember where we were so we don't end up seeking further back than this */
1702         mxf->last_forward_tell = avio_tell(pb);
1703
1704         if (!pb->seekable) {
1705             av_log(mxf->fc, AV_LOG_INFO, "file is not seekable - not parsing footer\n");
1706             return -1;
1707         }
1708
1709         /* seek to footer partition and parse backward */
1710         if ((ret = avio_seek(pb, mxf->run_in + mxf->footer_partition, SEEK_SET)) < 0) {
1711             av_log(mxf->fc, AV_LOG_ERROR, "failed to seek to footer @ 0x%"PRIx64" (%"PRId64") - partial file?\n",
1712                    mxf->run_in + mxf->footer_partition, ret);
1713             return ret;
1714         }
1715
1716         mxf->current_partition = NULL;
1717         mxf->parsing_backward = 1;
1718     }
1719
1720     return 1;
1721 }
1722
1723 /**
1724  * Called when the next partition or EOF is encountered
1725  * @return <= 0 if we should stop parsing, > 0 if we should keep going
1726  */
1727 static int mxf_parse_handle_partition_or_eof(MXFContext *mxf)
1728 {
1729     return mxf->parsing_backward ? mxf_seek_to_previous_partition(mxf) : 1;
1730 }
1731
1732 /**
1733  * Figures out the proper offset and length of the essence container in each partition
1734  */
1735 static void mxf_compute_essence_containers(MXFContext *mxf)
1736 {
1737     int x;
1738
1739     /* everything is already correct */
1740     if (mxf->op == OPAtom)
1741         return;
1742
1743     for (x = 0; x < mxf->partitions_count; x++) {
1744         MXFPartition *p = &mxf->partitions[x];
1745
1746         if (!p->body_sid)
1747             continue;       /* BodySID == 0 -> no essence */
1748
1749         if (x >= mxf->partitions_count - 1)
1750             break;          /* last partition - can't compute length (and we don't need to) */
1751
1752         /* essence container spans to the next partition */
1753         p->essence_length = mxf->partitions[x+1].this_partition - p->essence_offset;
1754
1755         if (p->essence_length < 0) {
1756             /* next ThisPartition < essence_offset */
1757             p->essence_length = 0;
1758             av_log(mxf->fc, AV_LOG_ERROR,
1759                    "partition %i: bad ThisPartition = %"PRIX64"\n",
1760                    x+1, mxf->partitions[x+1].this_partition);
1761         }
1762     }
1763 }
1764
1765 static int64_t round_to_kag(int64_t position, int kag_size)
1766 {
1767     /* TODO: account for run-in? the spec isn't clear whether KAG should account for it */
1768     /* NOTE: kag_size may be any integer between 1 - 2^10 */
1769     int64_t ret = (position / kag_size) * kag_size;
1770     return ret == position ? ret : ret + kag_size;
1771 }
1772
1773 static int is_pcm(enum CodecID codec_id)
1774 {
1775     /* we only care about "normal" PCM codecs until we get samples */
1776     return codec_id >= CODEC_ID_PCM_S16LE && codec_id < CODEC_ID_PCM_S24DAUD;
1777 }
1778
1779 /**
1780  * Deal with the case where for some audio atoms EditUnitByteCount is
1781  * very small (2, 4..). In those cases we should read more than one
1782  * sample per call to mxf_read_packet().
1783  */
1784 static void mxf_handle_small_eubc(AVFormatContext *s)
1785 {
1786     MXFContext *mxf = s->priv_data;
1787
1788     /* assuming non-OPAtom == frame wrapped
1789      * no sane writer would wrap 2 byte PCM packets with 20 byte headers.. */
1790     if (mxf->op != OPAtom)
1791         return;
1792
1793     /* expect PCM with exactly one index table segment and a small (< 32) EUBC */
1794     if (s->nb_streams != 1                                     ||
1795         s->streams[0]->codec->codec_type != AVMEDIA_TYPE_AUDIO ||
1796         !is_pcm(s->streams[0]->codec->codec_id)                ||
1797         mxf->nb_index_tables != 1                              ||
1798         mxf->index_tables[0].nb_segments != 1                  ||
1799         mxf->index_tables[0].segments[0]->edit_unit_byte_count >= 32)
1800         return;
1801
1802     /* arbitrarily default to 48 kHz PAL audio frame size */
1803     /* TODO: We could compute this from the ratio between the audio
1804      *       and video edit rates for 48 kHz NTSC we could use the
1805      *       1802-1802-1802-1802-1801 pattern. */
1806     mxf->edit_units_per_packet = 1920;
1807 }
1808
1809 static int mxf_read_header(AVFormatContext *s)
1810 {
1811     MXFContext *mxf = s->priv_data;
1812     KLVPacket klv;
1813     int64_t essence_offset = 0;
1814     int ret;
1815
1816     mxf->last_forward_tell = INT64_MAX;
1817     mxf->edit_units_per_packet = 1;
1818
1819     if (!mxf_read_sync(s->pb, mxf_header_partition_pack_key, 14)) {
1820         av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n");
1821         return AVERROR_INVALIDDATA;
1822     }
1823     avio_seek(s->pb, -14, SEEK_CUR);
1824     mxf->fc = s;
1825     mxf->run_in = avio_tell(s->pb);
1826
1827     while (!url_feof(s->pb)) {
1828         const MXFMetadataReadTableEntry *metadata;
1829
1830         if (klv_read_packet(&klv, s->pb) < 0) {
1831             /* EOF - seek to previous partition or stop */
1832             if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
1833                 break;
1834             else
1835                 continue;
1836         }
1837
1838         PRINT_KEY(s, "read header", klv.key);
1839         av_dlog(s, "size %"PRIu64" offset %#"PRIx64"\n", klv.length, klv.offset);
1840         if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key) ||
1841             IS_KLV_KEY(klv.key, mxf_essence_element_key) ||
1842             IS_KLV_KEY(klv.key, mxf_avid_essence_element_key) ||
1843             IS_KLV_KEY(klv.key, mxf_system_item_key)) {
1844
1845             if (!mxf->current_partition) {
1846                 av_log(mxf->fc, AV_LOG_ERROR, "found essence prior to first PartitionPack\n");
1847                 return AVERROR_INVALIDDATA;
1848             }
1849
1850             if (!mxf->current_partition->essence_offset) {
1851                 /* for OP1a we compute essence_offset
1852                  * for OPAtom we point essence_offset after the KL (usually op1a_essence_offset + 20 or 25)
1853                  * TODO: for OP1a we could eliminate this entire if statement, always stopping parsing at op1a_essence_offset
1854                  *       for OPAtom we still need the actual essence_offset though (the KL's length can vary)
1855                  */
1856                 int64_t op1a_essence_offset =
1857                     round_to_kag(mxf->current_partition->this_partition +
1858                                  mxf->current_partition->pack_length,       mxf->current_partition->kag_size) +
1859                     round_to_kag(mxf->current_partition->header_byte_count, mxf->current_partition->kag_size) +
1860                     round_to_kag(mxf->current_partition->index_byte_count,  mxf->current_partition->kag_size);
1861
1862                 if (mxf->op == OPAtom) {
1863                     /* point essence_offset to the actual data
1864                     * OPAtom has all the essence in one big KLV
1865                     */
1866                     mxf->current_partition->essence_offset = avio_tell(s->pb);
1867                     mxf->current_partition->essence_length = klv.length;
1868                 } else {
1869                     /* NOTE: op1a_essence_offset may be less than to klv.offset (C0023S01.mxf)  */
1870                     mxf->current_partition->essence_offset = op1a_essence_offset;
1871                 }
1872             }
1873
1874             if (!essence_offset)
1875                 essence_offset = klv.offset;
1876
1877             /* seek to footer, previous partition or stop */
1878             if (mxf_parse_handle_essence(mxf) <= 0)
1879                 break;
1880             continue;
1881         } else if (!memcmp(klv.key, mxf_header_partition_pack_key, 13) &&
1882                    klv.key[13] >= 2 && klv.key[13] <= 4 && mxf->current_partition) {
1883             /* next partition pack - keep going, seek to previous partition or stop */
1884             if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
1885                 break;
1886             else if (mxf->parsing_backward)
1887                 continue;
1888             /* we're still parsing forward. proceed to parsing this partition pack */
1889         }
1890
1891         for (metadata = mxf_metadata_read_table; metadata->read; metadata++) {
1892             if (IS_KLV_KEY(klv.key, metadata->key)) {
1893                 int res;
1894                 if (klv.key[5] == 0x53) {
1895                     res = mxf_read_local_tags(mxf, &klv, metadata->read, metadata->ctx_size, metadata->type);
1896                 } else {
1897                     uint64_t next = avio_tell(s->pb) + klv.length;
1898                     res = metadata->read(mxf, s->pb, 0, klv.length, klv.key, klv.offset);
1899
1900                     /* only seek forward, else this can loop for a long time */
1901                     if (avio_tell(s->pb) > next) {
1902                         av_log(s, AV_LOG_ERROR, "read past end of KLV @ %#"PRIx64"\n",
1903                                klv.offset);
1904                         return AVERROR_INVALIDDATA;
1905                     }
1906
1907                     avio_seek(s->pb, next, SEEK_SET);
1908                 }
1909                 if (res < 0) {
1910                     av_log(s, AV_LOG_ERROR, "error reading header metadata\n");
1911                     return res;
1912                 }
1913                 break;
1914             }
1915         }
1916         if (!metadata->read)
1917             avio_skip(s->pb, klv.length);
1918     }
1919     /* FIXME avoid seek */
1920     if (!essence_offset)  {
1921         av_log(s, AV_LOG_ERROR, "no essence\n");
1922         return AVERROR_INVALIDDATA;
1923     }
1924     avio_seek(s->pb, essence_offset, SEEK_SET);
1925
1926     mxf_compute_essence_containers(mxf);
1927
1928     /* we need to do this before computing the index tables
1929      * to be able to fill in zero IndexDurations with st->duration */
1930     if ((ret = mxf_parse_structural_metadata(mxf)) < 0)
1931         return ret;
1932
1933     if ((ret = mxf_compute_index_tables(mxf)) < 0)
1934         return ret;
1935
1936     if (mxf->nb_index_tables > 1) {
1937         /* TODO: look up which IndexSID to use via EssenceContainerData */
1938         av_log(mxf->fc, AV_LOG_INFO, "got %i index tables - only the first one (IndexSID %i) will be used\n",
1939                mxf->nb_index_tables, mxf->index_tables[0].index_sid);
1940     } else if (mxf->nb_index_tables == 0 && mxf->op == OPAtom) {
1941         av_log(mxf->fc, AV_LOG_ERROR, "cannot demux OPAtom without an index\n");
1942         return AVERROR_INVALIDDATA;
1943     }
1944
1945     mxf_handle_small_eubc(s);
1946
1947     return 0;
1948 }
1949
1950 /**
1951  * Sets mxf->current_edit_unit based on what offset we're currently at.
1952  * @return next_ofs if OK, <0 on error
1953  */
1954 static int64_t mxf_set_current_edit_unit(MXFContext *mxf, int64_t current_offset)
1955 {
1956     int64_t last_ofs = -1, next_ofs = -1;
1957     MXFIndexTable *t = &mxf->index_tables[0];
1958
1959     /* this is called from the OP1a demuxing logic, which means there
1960      * may be no index tables */
1961     if (mxf->nb_index_tables <= 0)
1962         return -1;
1963
1964     /* find mxf->current_edit_unit so that the next edit unit starts ahead of current_offset */
1965     while (mxf->current_edit_unit >= 0) {
1966         if (mxf_edit_unit_absolute_offset(mxf, t, mxf->current_edit_unit + 1, NULL, &next_ofs, 0) < 0)
1967             return -1;
1968
1969         if (next_ofs <= last_ofs) {
1970             /* large next_ofs didn't change or current_edit_unit wrapped
1971              * around this fixes the infinite loop on zzuf3.mxf */
1972             av_log(mxf->fc, AV_LOG_ERROR,
1973                    "next_ofs didn't change. not deriving packet timestamps\n");
1974             return - 1;
1975         }
1976
1977         if (next_ofs > current_offset)
1978             break;
1979
1980         last_ofs = next_ofs;
1981         mxf->current_edit_unit++;
1982     }
1983
1984     /* not checking mxf->current_edit_unit >= t->nb_ptses here since CBR files may lack IndexEntryArrays */
1985     if (mxf->current_edit_unit < 0)
1986         return -1;
1987
1988     return next_ofs;
1989 }
1990
1991 static int mxf_read_packet_old(AVFormatContext *s, AVPacket *pkt)
1992 {
1993     KLVPacket klv;
1994     MXFContext *mxf = s->priv_data;
1995
1996     while (!url_feof(s->pb)) {
1997         int ret;
1998         if (klv_read_packet(&klv, s->pb) < 0)
1999             return -1;
2000         PRINT_KEY(s, "read packet", klv.key);
2001         av_dlog(s, "size %"PRIu64" offset %#"PRIx64"\n", klv.length, klv.offset);
2002         if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key)) {
2003             ret = mxf_decrypt_triplet(s, pkt, &klv);
2004             if (ret < 0) {
2005                 av_log(s, AV_LOG_ERROR, "invalid encoded triplet\n");
2006                 return AVERROR_INVALIDDATA;
2007             }
2008             return 0;
2009         }
2010         if (IS_KLV_KEY(klv.key, mxf_essence_element_key) ||
2011             IS_KLV_KEY(klv.key, mxf_avid_essence_element_key)) {
2012             int index = mxf_get_stream_index(s, &klv);
2013             int64_t next_ofs, next_klv;
2014             AVStream *st;
2015             MXFTrack *track;
2016
2017             if (index < 0) {
2018                 av_log(s, AV_LOG_ERROR, "error getting stream index %d\n", AV_RB32(klv.key+12));
2019                 goto skip;
2020             }
2021
2022             st = s->streams[index];
2023             track = st->priv_data;
2024
2025             if (s->streams[index]->discard == AVDISCARD_ALL)
2026                 goto skip;
2027
2028             next_klv = avio_tell(s->pb) + klv.length;
2029             next_ofs = mxf_set_current_edit_unit(mxf, klv.offset);
2030
2031             if (next_ofs >= 0 && next_klv > next_ofs) {
2032                 /* if this check is hit then it's possible OPAtom was treated as OP1a
2033                  * truncate the packet since it's probably very large (>2 GiB is common) */
2034                 av_log_ask_for_sample(s,
2035                     "KLV for edit unit %i extends into next edit unit - OPAtom misinterpreted as OP1a?\n",
2036                     mxf->current_edit_unit);
2037                 klv.length = next_ofs - avio_tell(s->pb);
2038             }
2039
2040             /* check for 8 channels AES3 element */
2041             if (klv.key[12] == 0x06 && klv.key[13] == 0x01 && klv.key[14] == 0x10) {
2042                 if (mxf_get_d10_aes3_packet(s->pb, s->streams[index], pkt, klv.length) < 0) {
2043                     av_log(s, AV_LOG_ERROR, "error reading D-10 aes3 frame\n");
2044                     return AVERROR_INVALIDDATA;
2045                 }
2046             } else {
2047                 ret = av_get_packet(s->pb, pkt, klv.length);
2048                 if (ret < 0)
2049                     return ret;
2050             }
2051             pkt->stream_index = index;
2052             pkt->pos = klv.offset;
2053
2054             if (s->streams[index]->codec->codec_type == AVMEDIA_TYPE_VIDEO && next_ofs >= 0) {
2055                 /* mxf->current_edit_unit good - see if we have an index table to derive timestamps from */
2056                 MXFIndexTable *t = &mxf->index_tables[0];
2057
2058                 if (mxf->nb_index_tables >= 1 && mxf->current_edit_unit < t->nb_ptses) {
2059                     pkt->dts = mxf->current_edit_unit + t->first_dts;
2060                     pkt->pts = t->ptses[mxf->current_edit_unit];
2061                 } else if (track->intra_only) {
2062                     /* intra-only -> PTS = EditUnit.
2063                      * let utils.c figure out DTS since it can be < PTS if low_delay = 0 (Sony IMX30) */
2064                     pkt->pts = mxf->current_edit_unit;
2065                 }
2066             }
2067
2068             /* seek for truncated packets */
2069             avio_seek(s->pb, next_klv, SEEK_SET);
2070
2071             return 0;
2072         } else
2073         skip:
2074             avio_skip(s->pb, klv.length);
2075     }
2076     return AVERROR_EOF;
2077 }
2078
2079 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
2080 {
2081     MXFContext *mxf = s->priv_data;
2082     int ret, size;
2083     int64_t ret64, pos, next_pos;
2084     AVStream *st;
2085     MXFIndexTable *t;
2086     int edit_units;
2087
2088     if (mxf->op != OPAtom)
2089         return mxf_read_packet_old(s, pkt);
2090
2091     /* OPAtom - clip wrapped demuxing */
2092     /* NOTE: mxf_read_header() makes sure nb_index_tables > 0 for OPAtom */
2093     st = s->streams[0];
2094     t = &mxf->index_tables[0];
2095
2096     if (mxf->current_edit_unit >= st->duration)
2097         return AVERROR_EOF;
2098
2099     edit_units = FFMIN(mxf->edit_units_per_packet, st->duration - mxf->current_edit_unit);
2100
2101     if ((ret = mxf_edit_unit_absolute_offset(mxf, t, mxf->current_edit_unit, NULL, &pos, 1)) < 0)
2102         return ret;
2103
2104     /* compute size by finding the next edit unit or the end of the essence container
2105      * not pretty, but it works */
2106     if ((ret = mxf_edit_unit_absolute_offset(mxf, t, mxf->current_edit_unit + edit_units, NULL, &next_pos, 0)) < 0 &&
2107         (next_pos = mxf_essence_container_end(mxf, t->body_sid)) <= 0) {
2108         av_log(s, AV_LOG_ERROR, "unable to compute the size of the last packet\n");
2109         return AVERROR_INVALIDDATA;
2110     }
2111
2112     if ((size = next_pos - pos) <= 0) {
2113         av_log(s, AV_LOG_ERROR, "bad size: %i\n", size);
2114         return AVERROR_INVALIDDATA;
2115     }
2116
2117     if ((ret64 = avio_seek(s->pb, pos, SEEK_SET)) < 0)
2118         return ret64;
2119
2120     if ((size = av_get_packet(s->pb, pkt, size)) < 0)
2121         return size;
2122
2123     if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && t->ptses &&
2124         mxf->current_edit_unit >= 0 && mxf->current_edit_unit < t->nb_ptses) {
2125         pkt->dts = mxf->current_edit_unit + t->first_dts;
2126         pkt->pts = t->ptses[mxf->current_edit_unit];
2127     }
2128
2129     pkt->stream_index = 0;
2130     mxf->current_edit_unit += edit_units;
2131
2132     return 0;
2133 }
2134
2135 static int mxf_read_close(AVFormatContext *s)
2136 {
2137     MXFContext *mxf = s->priv_data;
2138     MXFIndexTableSegment *seg;
2139     int i;
2140
2141     av_freep(&mxf->packages_refs);
2142
2143     for (i = 0; i < s->nb_streams; i++)
2144         s->streams[i]->priv_data = NULL;
2145
2146     for (i = 0; i < mxf->metadata_sets_count; i++) {
2147         switch (mxf->metadata_sets[i]->type) {
2148         case MultipleDescriptor:
2149             av_freep(&((MXFDescriptor *)mxf->metadata_sets[i])->sub_descriptors_refs);
2150             break;
2151         case Sequence:
2152             av_freep(&((MXFSequence *)mxf->metadata_sets[i])->structural_components_refs);
2153             break;
2154         case SourcePackage:
2155         case MaterialPackage:
2156             av_freep(&((MXFPackage *)mxf->metadata_sets[i])->tracks_refs);
2157             break;
2158         case IndexTableSegment:
2159             seg = (MXFIndexTableSegment *)mxf->metadata_sets[i];
2160             av_freep(&seg->temporal_offset_entries);
2161             av_freep(&seg->flag_entries);
2162             av_freep(&seg->stream_offset_entries);
2163             break;
2164         default:
2165             break;
2166         }
2167         av_freep(&mxf->metadata_sets[i]);
2168     }
2169     av_freep(&mxf->partitions);
2170     av_freep(&mxf->metadata_sets);
2171     av_freep(&mxf->aesc);
2172     av_freep(&mxf->local_tags);
2173
2174     for (i = 0; i < mxf->nb_index_tables; i++) {
2175         av_freep(&mxf->index_tables[i].segments);
2176         av_freep(&mxf->index_tables[i].ptses);
2177         av_freep(&mxf->index_tables[i].fake_index);
2178     }
2179     av_freep(&mxf->index_tables);
2180
2181     return 0;
2182 }
2183
2184 static int mxf_probe(AVProbeData *p) {
2185     uint8_t *bufp = p->buf;
2186     uint8_t *end = p->buf + p->buf_size;
2187
2188     if (p->buf_size < sizeof(mxf_header_partition_pack_key))
2189         return 0;
2190
2191     /* Must skip Run-In Sequence and search for MXF header partition pack key SMPTE 377M 5.5 */
2192     end -= sizeof(mxf_header_partition_pack_key);
2193     for (; bufp < end; bufp++) {
2194         if (IS_KLV_KEY(bufp, mxf_header_partition_pack_key))
2195             return AVPROBE_SCORE_MAX;
2196     }
2197     return 0;
2198 }
2199
2200 /* rudimentary byte seek */
2201 /* XXX: use MXF Index */
2202 static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
2203 {
2204     AVStream *st = s->streams[stream_index];
2205     int64_t seconds;
2206     MXFContext* mxf = s->priv_data;
2207     int64_t seekpos;
2208     int ret;
2209     MXFIndexTable *t;
2210
2211     if (mxf->index_tables <= 0) {
2212     if (!s->bit_rate)
2213         return AVERROR_INVALIDDATA;
2214     if (sample_time < 0)
2215         sample_time = 0;
2216     seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den);
2217
2218     if ((ret = avio_seek(s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET)) < 0)
2219         return ret;
2220     ff_update_cur_dts(s, st, sample_time);
2221     } else {
2222         t = &mxf->index_tables[0];
2223
2224         /* clamp above zero, else ff_index_search_timestamp() returns negative
2225          * this also means we allow seeking before the start */
2226         sample_time = FFMAX(sample_time, 0);
2227
2228         if (t->fake_index) {
2229             /* behave as if we have a proper index */
2230             if ((sample_time = ff_index_search_timestamp(t->fake_index, t->nb_ptses, sample_time, flags)) < 0)
2231                 return sample_time;
2232         } else {
2233             /* no IndexEntryArray (one or more CBR segments)
2234              * make sure we don't seek past the end */
2235             sample_time = FFMIN(sample_time, st->duration - 1);
2236         }
2237
2238         if ((ret = mxf_edit_unit_absolute_offset(mxf, t, sample_time, &sample_time, &seekpos, 1)) << 0)
2239             return ret;
2240
2241         ff_update_cur_dts(s, st, sample_time);
2242         mxf->current_edit_unit = sample_time;
2243         avio_seek(s->pb, seekpos, SEEK_SET);
2244     }
2245     return 0;
2246 }
2247
2248 AVInputFormat ff_mxf_demuxer = {
2249     .name           = "mxf",
2250     .long_name      = NULL_IF_CONFIG_SMALL("Material eXchange Format"),
2251     .priv_data_size = sizeof(MXFContext),
2252     .read_probe     = mxf_probe,
2253     .read_header    = mxf_read_header,
2254     .read_packet    = mxf_read_packet,
2255     .read_close     = mxf_read_close,
2256     .read_seek      = mxf_read_seek,
2257 };