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