Coverage Report

Created: 2025-11-16 07:20

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