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