mxfdec.c 122 KB
Newer Older
1 2
/*
 * MXF demuxer.
3
 * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/*
 * References
 * SMPTE 336M KLV Data Encoding Protocol Using Key-Length-Value
 * SMPTE 377M MXF File Format Specifications
 * SMPTE 378M Operational Pattern 1a
 * SMPTE 379M MXF Generic Container
 * SMPTE 381M Mapping MPEG Streams into the MXF Generic Container
 * SMPTE 382M Mapping AES3 and Broadcast Wave Audio into the MXF Generic Container
 * SMPTE 383M Mapping DV-DIF Data to the MXF Generic Container
 *
 * Principle
 * Search for Track numbers which will identify essence element KLV packets.
 * Search for SourcePackage which define tracks which contains Track numbers.
 * Material Package contains tracks with reference to SourcePackage tracks.
 * Search for Descriptors (Picture, Sound) which contains codec info and parameters.
 * Assign Descriptors to correct Tracks.
 *
 * Metadata reading functions read Local Tags, get InstanceUID(0x3C0A) then add MetaDataSet to MXFContext.
 * Metadata parsing resolves Strong References to objects.
 *
 * Simple demuxer, only OP1A supported and some files might not work at all.
 * Only tracks with associated descriptors will be decoded. "Highly Desirable" SMPTE 377M D.1
 */

46
#include <inttypes.h>
47

48
#include "libavutil/aes.h"
49
#include "libavutil/avassert.h"
50
#include "libavutil/mathematics.h"
51
#include "libavcodec/bytestream.h"
52
#include "libavutil/intreadwrite.h"
53
#include "libavutil/timecode.h"
54
#include "avformat.h"
55
#include "internal.h"
56
#include "mxf.h"
57

Tomas Härdin's avatar
Tomas Härdin committed
58 59 60 61 62 63 64
typedef enum {
    Header,
    BodyPartition,
    Footer
} MXFPartitionType;

typedef enum {
65
    OP1a = 1,
Tomas Härdin's avatar
Tomas Härdin committed
66 67 68 69 70 71 72 73 74
    OP1b,
    OP1c,
    OP2a,
    OP2b,
    OP2c,
    OP3a,
    OP3b,
    OP3c,
    OPAtom,
75
    OPSONYOpt,  /* FATE sample, violates the spec in places */
Tomas Härdin's avatar
Tomas Härdin committed
76 77
} MXFOP;

78
typedef struct MXFPartition {
Tomas Härdin's avatar
Tomas Härdin committed
79 80 81 82 83 84
    int closed;
    int complete;
    MXFPartitionType type;
    uint64_t previous_partition;
    int index_sid;
    int body_sid;
85
    int64_t this_partition;
86
    int64_t essence_offset;         ///< absolute offset of essence
87
    int64_t essence_length;
88 89 90 91
    int32_t kag_size;
    int64_t header_byte_count;
    int64_t index_byte_count;
    int pack_length;
92
    int64_t pack_ofs;               ///< absolute offset of pack in file, including run-in
Tomas Härdin's avatar
Tomas Härdin committed
93 94
} MXFPartition;

95
typedef struct MXFCryptoContext {
96 97 98 99 100
    UID uid;
    enum MXFMetadataSetType type;
    UID source_container_ul;
} MXFCryptoContext;

101
typedef struct MXFStructuralComponent {
102 103 104 105 106 107 108 109 110
    UID uid;
    enum MXFMetadataSetType type;
    UID source_package_uid;
    UID data_definition_ul;
    int64_t duration;
    int64_t start_position;
    int source_track_id;
} MXFStructuralComponent;

111
typedef struct MXFSequence {
112 113 114 115 116 117
    UID uid;
    enum MXFMetadataSetType type;
    UID data_definition_ul;
    UID *structural_components_refs;
    int structural_components_count;
    int64_t duration;
118
    uint8_t origin;
119 120
} MXFSequence;

121
typedef struct MXFTrack {
122 123 124 125 126 127 128 129
    UID uid;
    enum MXFMetadataSetType type;
    int drop_frame;
    int start_frame;
    struct AVRational rate;
    AVTimecode tc;
} MXFTimecodeComponent;

130 131 132 133 134 135
typedef struct {
    UID uid;
    enum MXFMetadataSetType type;
    UID input_segment_ref;
} MXFPulldownComponent;

136 137 138 139 140 141 142 143
typedef struct {
    UID uid;
    enum MXFMetadataSetType type;
    UID *structural_components_refs;
    int structural_components_count;
    int64_t duration;
} MXFEssenceGroup;

144 145 146 147 148 149 150
typedef struct {
    UID uid;
    enum MXFMetadataSetType type;
    char *name;
    char *value;
} MXFTaggedValue;

151 152 153 154 155 156 157 158
typedef struct {
    UID uid;
    enum MXFMetadataSetType type;
    MXFSequence *sequence; /* mandatory, and only one */
    UID sequence_ref;
    int track_id;
    uint8_t track_number[4];
    AVRational edit_rate;
159
    int intra_only;
160
    uint64_t sample_count;
161
    int64_t original_duration; /* st->duration in SampleRate/EditRate units */
162 163
} MXFTrack;

164
typedef struct MXFDescriptor {
165 166 167 168
    UID uid;
    enum MXFMetadataSetType type;
    UID essence_container_ul;
    UID essence_codec_ul;
169
    UID codec_ul;
170 171 172
    AVRational sample_rate;
    AVRational aspect_ratio;
    int width;
173 174
    int height; /* Field height, not frame height */
    int frame_layout; /* See MXFFrameLayout enum */
175 176 177
#define MXF_TFF 1
#define MXF_BFF 2
    int field_dominance;
178 179
    int channels;
    int bits_per_sample;
180
    int64_t duration; /* ContainerDuration optional property */
181 182 183
    unsigned int component_depth;
    unsigned int horiz_subsampling;
    unsigned int vert_subsampling;
184 185 186 187 188
    UID *sub_descriptors_refs;
    int sub_descriptors_count;
    int linked_track_id;
    uint8_t *extradata;
    int extradata_size;
189
    enum AVPixelFormat pix_fmt;
190 191
} MXFDescriptor;

192
typedef struct MXFIndexTableSegment {
193 194
    UID uid;
    enum MXFMetadataSetType type;
195 196 197 198 199 200
    int edit_unit_byte_count;
    int index_sid;
    int body_sid;
    AVRational index_edit_rate;
    uint64_t index_start_position;
    uint64_t index_duration;
201
    int8_t *temporal_offset_entries;
202 203 204
    int *flag_entries;
    uint64_t *stream_offset_entries;
    int nb_index_entries;
205 206
} MXFIndexTableSegment;

207
typedef struct MXFPackage {
208 209 210
    UID uid;
    enum MXFMetadataSetType type;
    UID package_uid;
211
    UID package_ul;
212 213 214 215
    UID *tracks_refs;
    int tracks_count;
    MXFDescriptor *descriptor; /* only one */
    UID descriptor_ref;
216
    char *name;
217 218
    UID *comment_refs;
    int comment_count;
219 220
} MXFPackage;

221
typedef struct MXFMetadataSet {
222 223 224 225
    UID uid;
    enum MXFMetadataSetType type;
} MXFMetadataSet;

226
/* decoded index table */
227
typedef struct MXFIndexTable {
228 229 230 231 232 233 234
    int index_sid;
    int body_sid;
    int nb_ptses;               /* number of PTSes or total duration of index */
    int64_t first_dts;          /* DTS = EditUnit + first_dts */
    int64_t *ptses;             /* maps EditUnit -> PTS */
    int nb_segments;
    MXFIndexTableSegment **segments;    /* sorted by IndexStartPosition */
235
    AVIndexEntry *fake_index;   /* used for calling ff_index_search_timestamp() */
236
    int8_t *offsets;            /* temporal offsets for display order to stored order conversion */
237 238
} MXFIndexTable;

239
typedef struct MXFContext {
Tomas Härdin's avatar
Tomas Härdin committed
240 241 242
    MXFPartition *partitions;
    unsigned partitions_count;
    MXFOP op;
243 244 245 246 247 248 249 250
    UID *packages_refs;
    int packages_count;
    MXFMetadataSet **metadata_sets;
    int metadata_sets_count;
    AVFormatContext *fc;
    struct AVAES *aesc;
    uint8_t *local_tags;
    int local_tags_count;
251
    uint64_t footer_partition;
252 253
    KLVPacket current_klv_data;
    int current_klv_index;
254 255 256 257
    int run_in;
    MXFPartition *current_partition;
    int parsing_backward;
    int64_t last_forward_tell;
258
    int last_forward_partition;
259
    int current_edit_unit;
260 261
    int nb_index_tables;
    MXFIndexTable *index_tables;
262
    int edit_units_per_packet;      ///< how many edit units to read at a time (PCM, OPAtom)
263 264 265 266 267 268 269
} MXFContext;

enum MXFWrappingScheme {
    Frame,
    Clip,
};

270 271
/* NOTE: klv_offset is not set (-1) for local keys */
typedef int MXFMetadataReadFunc(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset);
272

273
typedef struct MXFMetadataReadTableEntry {
274
    const UID key;
275
    MXFMetadataReadFunc *read;
276 277 278 279
    int ctx_size;
    enum MXFMetadataSetType type;
} MXFMetadataReadTableEntry;

280 281
static int mxf_read_close(AVFormatContext *s);

282 283 284
/* partial keys to match */
static const uint8_t mxf_header_partition_pack_key[]       = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 };
static const uint8_t mxf_essence_element_key[]             = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 };
285
static const uint8_t mxf_avid_essence_element_key[]        = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0e,0x04,0x03,0x01 };
286
static const uint8_t mxf_canopus_essence_element_key[]     = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x0a,0x0e,0x0f,0x03,0x01 };
Luca Barbato's avatar
Luca Barbato committed
287
static const uint8_t mxf_system_item_key[]                 = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x03,0x01,0x04 };
288 289 290 291 292
static const uint8_t mxf_klv_key[]                         = { 0x06,0x0e,0x2b,0x34 };
/* complete keys to match */
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 };
static const uint8_t mxf_encrypted_triplet_key[]           = { 0x06,0x0e,0x2b,0x34,0x02,0x04,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x7e,0x01,0x00 };
static const uint8_t mxf_encrypted_essence_container[]     = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0b,0x01,0x00 };
Luca Barbato's avatar
Luca Barbato committed
293
static const uint8_t mxf_random_index_pack_key[]           = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x11,0x01,0x00 };
294
static const uint8_t mxf_sony_mpeg4_extradata[]            = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0e,0x06,0x06,0x02,0x02,0x01,0x00,0x00 };
295
static const uint8_t mxf_avid_project_name[]               = { 0xa5,0xfb,0x7b,0x25,0xf6,0x15,0x94,0xb9,0x62,0xfc,0x37,0x17,0x49,0x2d,0x42,0xbf };
296
static const uint8_t mxf_jp2k_rsiz[]                       = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x01,0x00 };
297 298
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 };
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 };
299 300 301

#define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y)))

302
static void mxf_free_metadataset(MXFMetadataSet **ctx, int freectx)
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
{
    MXFIndexTableSegment *seg;
    switch ((*ctx)->type) {
    case Descriptor:
        av_freep(&((MXFDescriptor *)*ctx)->extradata);
        break;
    case MultipleDescriptor:
        av_freep(&((MXFDescriptor *)*ctx)->sub_descriptors_refs);
        break;
    case Sequence:
        av_freep(&((MXFSequence *)*ctx)->structural_components_refs);
        break;
    case EssenceGroup:
        av_freep(&((MXFEssenceGroup *)*ctx)->structural_components_refs);
        break;
    case SourcePackage:
    case MaterialPackage:
        av_freep(&((MXFPackage *)*ctx)->tracks_refs);
        av_freep(&((MXFPackage *)*ctx)->name);
322
        av_freep(&((MXFPackage *)*ctx)->comment_refs);
323
        break;
324 325 326 327
    case TaggedValue:
        av_freep(&((MXFTaggedValue *)*ctx)->name);
        av_freep(&((MXFTaggedValue *)*ctx)->value);
        break;
328 329 330 331 332 333 334 335
    case IndexTableSegment:
        seg = (MXFIndexTableSegment *)*ctx;
        av_freep(&seg->temporal_offset_entries);
        av_freep(&seg->flag_entries);
        av_freep(&seg->stream_offset_entries);
    default:
        break;
    }
336
    if (freectx)
337 338 339
    av_freep(ctx);
}

340
static int64_t klv_decode_ber_length(AVIOContext *pb)
341
{
342
    uint64_t size = avio_r8(pb);
343 344 345 346
    if (size & 0x80) { /* long form */
        int bytes_num = size & 0x7f;
        /* SMPTE 379M 5.3.4 guarantee that bytes_num must not exceed 8 bytes */
        if (bytes_num > 8)
347
            return AVERROR_INVALIDDATA;
348 349
        size = 0;
        while (bytes_num--)
350
            size = size << 8 | avio_r8(pb);
351 352 353 354
    }
    return size;
}

355
static int mxf_read_sync(AVIOContext *pb, const uint8_t *key, unsigned size)
356 357
{
    int i, b;
358
    for (i = 0; i < size && !avio_feof(pb); i++) {
359
        b = avio_r8(pb);
360 361 362 363 364 365 366 367
        if (b == key[0])
            i = 0;
        else if (b != key[i])
            i = -1;
    }
    return i == size;
}

368
static int klv_read_packet(KLVPacket *klv, AVIOContext *pb)
369 370
{
    if (!mxf_read_sync(pb, mxf_klv_key, 4))
371
        return AVERROR_INVALIDDATA;
372
    klv->offset = avio_tell(pb) - 4;
373
    memcpy(klv->key, mxf_klv_key, 4);
374
    avio_read(pb, klv->key + 4, 12);
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
    klv->length = klv_decode_ber_length(pb);
    return klv->length == -1 ? -1 : 0;
}

static int mxf_get_stream_index(AVFormatContext *s, KLVPacket *klv)
{
    int i;

    for (i = 0; i < s->nb_streams; i++) {
        MXFTrack *track = s->streams[i]->priv_data;
        /* SMPTE 379M 7.3 */
        if (!memcmp(klv->key + sizeof(mxf_essence_element_key), track->track_number, sizeof(track->track_number)))
            return i;
    }
    /* return 0 if only one stream, for OP Atom files with 0 as track number */
    return s->nb_streams == 1 ? 0 : -1;
}

/* XXX: use AVBitStreamFilter */
394
static int mxf_get_d10_aes3_packet(AVIOContext *pb, AVStream *st, AVPacket *pkt, int64_t length)
395 396 397 398 399 400
{
    const uint8_t *buf_ptr, *end_ptr;
    uint8_t *data_ptr;
    int i;

    if (length > 61444) /* worst case PAL 1920 samples 8 channels */
401
        return AVERROR_INVALIDDATA;
402 403 404
    length = av_get_packet(pb, pkt, length);
    if (length < 0)
        return length;
405
    data_ptr = pkt->data;
406 407
    end_ptr = pkt->data + length;
    buf_ptr = pkt->data + 4; /* skip SMPTE 331M header */
408 409
    for (; end_ptr - buf_ptr >= st->codecpar->channels * 4; ) {
        for (i = 0; i < st->codecpar->channels; i++) {
410
            uint32_t sample = bytestream_get_le32(&buf_ptr);
411
            if (st->codecpar->bits_per_coded_sample == 24)
412 413 414 415
                bytestream_put_le24(&data_ptr, (sample >> 4) & 0xffffff);
            else
                bytestream_put_le16(&data_ptr, (sample >> 12) & 0xffff);
        }
416
        buf_ptr += 32 - st->codecpar->channels*4; // always 8 channels stored SMPTE 331M
417
    }
418
    av_shrink_packet(pkt, data_ptr - pkt->data);
419 420 421 422 423 424 425
    return 0;
}

static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv)
{
    static const uint8_t checkv[16] = {0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b};
    MXFContext *mxf = s->priv_data;
426
    AVIOContext *pb = s->pb;
427
    int64_t end = avio_tell(pb) + klv->length;
428
    int64_t size;
429 430 431 432 433 434 435
    uint64_t orig_size;
    uint64_t plaintext_size;
    uint8_t ivec[16];
    uint8_t tmpbuf[16];
    int index;

    if (!mxf->aesc && s->key && s->keylen == 16) {
436
        mxf->aesc = av_aes_alloc();
437
        if (!mxf->aesc)
438
            return AVERROR(ENOMEM);
439 440 441
        av_aes_init(mxf->aesc, s->key, 128, 1);
    }
    // crypto context
442
    avio_skip(pb, klv_decode_ber_length(pb));
443 444
    // plaintext offset
    klv_decode_ber_length(pb);
445
    plaintext_size = avio_rb64(pb);
446 447
    // source klv key
    klv_decode_ber_length(pb);
448
    avio_read(pb, klv->key, 16);
449
    if (!IS_KLV_KEY(klv, mxf_essence_element_key))
450
        return AVERROR_INVALIDDATA;
451 452
    index = mxf_get_stream_index(s, klv);
    if (index < 0)
453
        return AVERROR_INVALIDDATA;
454 455
    // source size
    klv_decode_ber_length(pb);
456
    orig_size = avio_rb64(pb);
457
    if (orig_size < plaintext_size)
458
        return AVERROR_INVALIDDATA;
459 460 461
    // enc. code
    size = klv_decode_ber_length(pb);
    if (size < 32 || size - 32 < orig_size)
462
        return AVERROR_INVALIDDATA;
463 464
    avio_read(pb, ivec, 16);
    avio_read(pb, tmpbuf, 16);
465 466 467 468 469
    if (mxf->aesc)
        av_aes_crypt(mxf->aesc, tmpbuf, tmpbuf, 1, ivec, 1);
    if (memcmp(tmpbuf, checkv, 16))
        av_log(s, AV_LOG_ERROR, "probably incorrect decryption key\n");
    size -= 32;
470 471 472 473 474
    size = av_get_packet(pb, pkt, size);
    if (size < 0)
        return size;
    else if (size < plaintext_size)
        return AVERROR_INVALIDDATA;
475 476 477 478
    size -= plaintext_size;
    if (mxf->aesc)
        av_aes_crypt(mxf->aesc, &pkt->data[plaintext_size],
                     &pkt->data[plaintext_size], size >> 4, ivec, 1);
479
    av_shrink_packet(pkt, orig_size);
480
    pkt->stream_index = index;
481
    avio_skip(pb, end - avio_tell(pb));
482 483 484
    return 0;
}

485
static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
486
{
487
    MXFContext *mxf = arg;
488 489
    int item_num = avio_rb32(pb);
    int item_len = avio_rb32(pb);
490 491

    if (item_len != 18) {
492
        avpriv_request_sample(pb, "Primer pack item length %d", item_len);
493
        return AVERROR_PATCHWELCOME;
494
    }
495 496
    if (item_num > 65536) {
        av_log(mxf->fc, AV_LOG_ERROR, "item_num %d is too large\n", item_num);
497
        return AVERROR_INVALIDDATA;
498
    }
499 500 501 502
    if (mxf->local_tags)
        av_log(mxf->fc, AV_LOG_VERBOSE, "Multiple primer packs\n");
    av_free(mxf->local_tags);
    mxf->local_tags_count = 0;
503
    mxf->local_tags = av_calloc(item_num, item_len);
504
    if (!mxf->local_tags)
505
        return AVERROR(ENOMEM);
506
    mxf->local_tags_count = item_num;
507
    avio_read(pb, mxf->local_tags, item_num*item_len);
508 509 510
    return 0;
}

511
static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
Tomas Härdin's avatar
Tomas Härdin committed
512 513
{
    MXFContext *mxf = arg;
514
    MXFPartition *partition, *tmp_part;
Tomas Härdin's avatar
Tomas Härdin committed
515
    UID op;
516
    uint64_t footer_partition;
517
    uint32_t nb_essence_containers;
Tomas Härdin's avatar
Tomas Härdin committed
518

519
    tmp_part = av_realloc_array(mxf->partitions, mxf->partitions_count + 1, sizeof(*mxf->partitions));
520 521 522
    if (!tmp_part)
        return AVERROR(ENOMEM);
    mxf->partitions = tmp_part;
Tomas Härdin's avatar
Tomas Härdin committed
523

524 525 526 527 528 529 530 531 532 533 534 535 536 537
    if (mxf->parsing_backward) {
        /* insert the new partition pack in the middle
         * this makes the entries in mxf->partitions sorted by offset */
        memmove(&mxf->partitions[mxf->last_forward_partition+1],
                &mxf->partitions[mxf->last_forward_partition],
                (mxf->partitions_count - mxf->last_forward_partition)*sizeof(*mxf->partitions));
        partition = mxf->current_partition = &mxf->partitions[mxf->last_forward_partition];
    } else {
        mxf->last_forward_partition++;
        partition = mxf->current_partition = &mxf->partitions[mxf->partitions_count];
    }

    memset(partition, 0, sizeof(*partition));
    mxf->partitions_count++;
538
    partition->pack_length = avio_tell(pb) - klv_offset + size;
539
    partition->pack_ofs    = klv_offset;
Tomas Härdin's avatar
Tomas Härdin committed
540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558

    switch(uid[13]) {
    case 2:
        partition->type = Header;
        break;
    case 3:
        partition->type = BodyPartition;
        break;
    case 4:
        partition->type = Footer;
        break;
    default:
        av_log(mxf->fc, AV_LOG_ERROR, "unknown partition type %i\n", uid[13]);
        return AVERROR_INVALIDDATA;
    }

    /* consider both footers to be closed (there is only Footer and CompleteFooter) */
    partition->closed = partition->type == Footer || !(uid[14] & 1);
    partition->complete = uid[14] > 2;
559 560
    avio_skip(pb, 4);
    partition->kag_size = avio_rb32(pb);
561
    partition->this_partition = avio_rb64(pb);
Tomas Härdin's avatar
Tomas Härdin committed
562
    partition->previous_partition = avio_rb64(pb);
563
    footer_partition = avio_rb64(pb);
564 565
    partition->header_byte_count = avio_rb64(pb);
    partition->index_byte_count = avio_rb64(pb);
Tomas Härdin's avatar
Tomas Härdin committed
566 567 568
    partition->index_sid = avio_rb32(pb);
    avio_skip(pb, 8);
    partition->body_sid = avio_rb32(pb);
569 570 571 572
    if (avio_read(pb, op, sizeof(UID)) != sizeof(UID)) {
        av_log(mxf->fc, AV_LOG_ERROR, "Failed reading UID\n");
        return AVERROR_INVALIDDATA;
    }
573
    nb_essence_containers = avio_rb32(pb);
Tomas Härdin's avatar
Tomas Härdin committed
574

575 576 577 578 579 580 581 582 583 584 585 586 587
    if (partition->this_partition &&
        partition->previous_partition == partition->this_partition) {
        av_log(mxf->fc, AV_LOG_ERROR,
               "PreviousPartition equal to ThisPartition %"PRIx64"\n",
               partition->previous_partition);
        /* override with the actual previous partition offset */
        if (!mxf->parsing_backward && mxf->last_forward_partition > 1) {
            MXFPartition *prev =
                mxf->partitions + mxf->last_forward_partition - 2;
            partition->previous_partition = prev->this_partition;
        }
        /* if no previous body partition are found point to the header
         * partition */
Luca Barbato's avatar
Luca Barbato committed
588
        if (partition->previous_partition == partition->this_partition)
589 590 591 592 593 594
            partition->previous_partition = 0;
        av_log(mxf->fc, AV_LOG_ERROR,
               "Overriding PreviousPartition with %"PRIx64"\n",
               partition->previous_partition);
    }

595 596 597
    /* some files don'thave FooterPartition set in every partition */
    if (footer_partition) {
        if (mxf->footer_partition && mxf->footer_partition != footer_partition) {
598 599
            av_log(mxf->fc, AV_LOG_ERROR,
                   "inconsistent FooterPartition value: %"PRIu64" != %"PRIu64"\n",
600 601 602 603 604 605
                   mxf->footer_partition, footer_partition);
        } else {
            mxf->footer_partition = footer_partition;
        }
    }

606
    av_log(mxf->fc, AV_LOG_TRACE,
607 608 609
            "PartitionPack: ThisPartition = 0x%"PRIX64
            ", PreviousPartition = 0x%"PRIX64", "
            "FooterPartition = 0x%"PRIX64", IndexSID = %i, BodySID = %i\n",
610
            partition->this_partition,
611
            partition->previous_partition, footer_partition,
Tomas Härdin's avatar
Tomas Härdin committed
612 613
            partition->index_sid, partition->body_sid);

614
    /* sanity check PreviousPartition if set */
615
    //NOTE: this isn't actually enough, see mxf_seek_to_previous_partition()
616 617
    if (partition->previous_partition &&
        mxf->run_in + partition->previous_partition >= klv_offset) {
618 619
        av_log(mxf->fc, AV_LOG_ERROR,
               "PreviousPartition points to this partition or forward\n");
620 621 622
        return AVERROR_INVALIDDATA;
    }

Tomas Härdin's avatar
Tomas Härdin committed
623 624 625 626 627 628 629 630 631
    if      (op[12] == 1 && op[13] == 1) mxf->op = OP1a;
    else if (op[12] == 1 && op[13] == 2) mxf->op = OP1b;
    else if (op[12] == 1 && op[13] == 3) mxf->op = OP1c;
    else if (op[12] == 2 && op[13] == 1) mxf->op = OP2a;
    else if (op[12] == 2 && op[13] == 2) mxf->op = OP2b;
    else if (op[12] == 2 && op[13] == 3) mxf->op = OP2c;
    else if (op[12] == 3 && op[13] == 1) mxf->op = OP3a;
    else if (op[12] == 3 && op[13] == 2) mxf->op = OP3b;
    else if (op[12] == 3 && op[13] == 3) mxf->op = OP3c;
632
    else if (op[12] == 64&& op[13] == 1) mxf->op = OPSONYOpt;
633 634
    else if (op[12] == 0x10) {
        /* SMPTE 390m: "There shall be exactly one essence container"
635 636 637
         * The following block deals with files that violate this, namely:
         * 2011_DCPTEST_24FPS.V.mxf - two ECs, OP1a
         * abcdefghiv016f56415e.mxf - zero ECs, OPAtom, output by Avid AirSpeed */
638
        if (nb_essence_containers != 1) {
639 640
            MXFOP op = nb_essence_containers ? OP1a : OPAtom;

641 642
            /* only nag once */
            if (!mxf->op)
643
                av_log(mxf->fc, AV_LOG_WARNING,
644
                       "\"OPAtom\" with %"PRIu32" ECs - assuming %s\n",
645 646
                       nb_essence_containers,
                       op == OP1a ? "OP1a" : "OPAtom");
647

648
            mxf->op = op;
649 650 651
        } else
            mxf->op = OPAtom;
    } else {
652 653 654 655 656
        av_log(mxf->fc, AV_LOG_ERROR, "unknown operational pattern: %02xh %02xh - guessing OP1a\n", op[12], op[13]);
        mxf->op = OP1a;
    }

    if (partition->kag_size <= 0 || partition->kag_size > (1 << 20)) {
657 658
        av_log(mxf->fc, AV_LOG_WARNING, "invalid KAGSize %"PRId32" - guessing ",
               partition->kag_size);
659 660 661 662 663 664

        if (mxf->op == OPSONYOpt)
            partition->kag_size = 512;
        else
            partition->kag_size = 1;

665
        av_log(mxf->fc, AV_LOG_WARNING, "%"PRId32"\n", partition->kag_size);
666
    }
Tomas Härdin's avatar
Tomas Härdin committed
667 668 669 670

    return 0;
}

671 672
static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
{
673
    MXFMetadataSet **tmp;
674 675

    tmp = av_realloc_array(mxf->metadata_sets, mxf->metadata_sets_count + 1, sizeof(*mxf->metadata_sets));
676 677 678
    if (!tmp)
        return AVERROR(ENOMEM);
    mxf->metadata_sets = tmp;
679 680 681 682 683
    mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;
    mxf->metadata_sets_count++;
    return 0;
}

684
static int mxf_read_cryptographic_context(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
685
{
686
    MXFCryptoContext *cryptocontext = arg;
687
    if (size != 16)
688
        return AVERROR_INVALIDDATA;
689
    if (IS_KLV_KEY(uid, mxf_crypto_source_container_ul))
690
        avio_read(pb, cryptocontext->source_container_ul, 16);
691 692 693
    return 0;
}

694 695 696 697 698 699 700 701 702 703 704 705 706
static int mxf_read_strong_ref_array(AVIOContext *pb, UID **refs, int *count)
{
    *count = avio_rb32(pb);
    *refs = av_calloc(*count, sizeof(UID));
    if (!*refs) {
        *count = 0;
        return AVERROR(ENOMEM);
    }
    avio_skip(pb, 4); /* useless size of objects, always 16 according to specs */
    avio_read(pb, (uint8_t *)*refs, *count * sizeof(UID));
    return 0;
}

707
static int mxf_read_content_storage(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
708
{
709
    MXFContext *mxf = arg;
710 711
    switch (tag) {
    case 0x1901:
712 713 714
        if (mxf->packages_refs)
            av_log(mxf->fc, AV_LOG_VERBOSE, "Multiple packages_refs\n");
        av_free(mxf->packages_refs);
715
        return mxf_read_strong_ref_array(pb, &mxf->packages_refs, &mxf->packages_count);
716 717 718 719
    }
    return 0;
}

720
static int mxf_read_source_clip(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
721
{
722
    MXFStructuralComponent *source_clip = arg;
723 724
    switch(tag) {
    case 0x0202:
725
        source_clip->duration = avio_rb64(pb);
726 727
        break;
    case 0x1201:
728
        source_clip->start_position = avio_rb64(pb);
729 730 731
        break;
    case 0x1101:
        /* UMID, only get last 16 bytes */
732
        avio_skip(pb, 16);
733
        avio_read(pb, source_clip->source_package_uid, 16);
734 735
        break;
    case 0x1102:
736
        source_clip->source_track_id = avio_rb32(pb);
737 738 739 740 741
        break;
    }
    return 0;
}

742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758
static int mxf_read_timecode_component(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
{
    MXFTimecodeComponent *mxf_timecode = arg;
    switch(tag) {
    case 0x1501:
        mxf_timecode->start_frame = avio_rb64(pb);
        break;
    case 0x1502:
        mxf_timecode->rate = (AVRational){avio_rb16(pb), 1};
        break;
    case 0x1503:
        mxf_timecode->drop_frame = avio_r8(pb);
        break;
    }
    return 0;
}

759 760 761 762 763 764 765 766 767 768 769
static int mxf_read_pulldown_component(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
{
    MXFPulldownComponent *mxf_pulldown = arg;
    switch(tag) {
    case 0x0d01:
        avio_read(pb, mxf_pulldown->input_segment_ref, 16);
        break;
    }
    return 0;
}

770
static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
771
{
772
    MXFTrack *track = arg;
773 774
    switch(tag) {
    case 0x4801:
775
        track->track_id = avio_rb32(pb);
776 777
        break;
    case 0x4804:
778
        avio_read(pb, track->track_number, 4);
779
        break;
Luca Barbato's avatar
Luca Barbato committed
780
    case 0x4b01:
781
        track->edit_rate.num = avio_rb32(pb);
782
        track->edit_rate.den = avio_rb32(pb);
783 784
        break;
    case 0x4803:
785
        avio_read(pb, track->sequence_ref, 16);
786 787 788 789 790
        break;
    }
    return 0;
}

791
static int mxf_read_sequence(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
792
{
793
    MXFSequence *sequence = arg;
794 795
    switch(tag) {
    case 0x0202:
796
        sequence->duration = avio_rb64(pb);
797 798
        break;
    case 0x0201:
799
        avio_read(pb, sequence->data_definition_ul, 16);
800
        break;
801 802 803
        case 0x4b02:
        sequence->origin = avio_r8(pb);
        break;
804
    case 0x1001:
805 806
        return mxf_read_strong_ref_array(pb, &sequence->structural_components_refs,
                                             &sequence->structural_components_count);
807 808 809 810
    }
    return 0;
}

811 812 813 814 815 816 817 818
static int mxf_read_essence_group(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
{
    MXFEssenceGroup *essence_group = arg;
    switch (tag) {
    case 0x0202:
        essence_group->duration = avio_rb64(pb);
        break;
    case 0x0501:
819 820
        return mxf_read_strong_ref_array(pb, &essence_group->structural_components_refs,
                                             &essence_group->structural_components_count);
821 822 823 824
    }
    return 0;
}

825
static inline int mxf_read_utf16_string(AVIOContext *pb, int size, char** str, int be)
826 827 828 829 830 831 832 833 834 835 836 837
{
    int ret;
    size_t buf_size;

    if (size < 0)
        return AVERROR(EINVAL);

    buf_size = size + size / 2 + 1;
    *str = av_malloc(buf_size);
    if (!*str)
        return AVERROR(ENOMEM);

838 839 840 841 842 843
    if (be)
        ret = avio_get_str16be(pb, size, *str, buf_size);
    else
        ret = avio_get_str16le(pb, size, *str, buf_size);

    if (ret < 0) {
844 845 846 847 848 849 850
        av_freep(str);
        return ret;
    }

    return ret;
}

851 852 853 854 855 856 857 858 859
#define READ_STR16(type, big_endian)                                               \
static int mxf_read_utf16 ## type ##_string(AVIOContext *pb, int size, char** str) \
{                                                                                  \
return mxf_read_utf16_string(pb, size, str, big_endian);                           \
}
READ_STR16(be, 1)
READ_STR16(le, 0)
#undef READ_STR16

860
static int mxf_read_package(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
861
{
862
    MXFPackage *package = arg;
863 864
    switch(tag) {
    case 0x4403:
865 866
        return mxf_read_strong_ref_array(pb, &package->tracks_refs,
                                             &package->tracks_count);
867
    case 0x4401:
868 869
        /* UMID */
        avio_read(pb, package->package_ul, 16);
870
        avio_read(pb, package->package_uid, 16);
871 872
        break;
    case 0x4701:
873
        avio_read(pb, package->descriptor_ref, 16);
874
        break;
875
    case 0x4402:
876 877 878 879
        return mxf_read_utf16be_string(pb, size, &package->name);
    case 0x4406:
        return mxf_read_strong_ref_array(pb, &package->comment_refs,
                                             &package->comment_count);
880 881 882 883
    }
    return 0;
}

884 885
static int mxf_read_index_entry_array(AVIOContext *pb, MXFIndexTableSegment *segment)
{
886
    int i, length;
887 888

    segment->nb_index_entries = avio_rb32(pb);
889

890 891
    length = avio_rb32(pb);

892 893
    if (!(segment->temporal_offset_entries=av_calloc(segment->nb_index_entries, sizeof(*segment->temporal_offset_entries))) ||
        !(segment->flag_entries          = av_calloc(segment->nb_index_entries, sizeof(*segment->flag_entries))) ||
894 895 896
        !(segment->stream_offset_entries = av_calloc(segment->nb_index_entries, sizeof(*segment->stream_offset_entries)))) {
        av_freep(&segment->temporal_offset_entries);
        av_freep(&segment->flag_entries);
897
        return AVERROR(ENOMEM);
898
    }
899 900

    for (i = 0; i < segment->nb_index_entries; i++) {
901 902
        segment->temporal_offset_entries[i] = avio_r8(pb);
        avio_r8(pb);                                        /* KeyFrameOffset */
903 904
        segment->flag_entries[i] = avio_r8(pb);
        segment->stream_offset_entries[i] = avio_rb64(pb);
905
        avio_skip(pb, length - 11);
906 907 908 909
    }
    return 0;
}

910
static int mxf_read_index_table_segment(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
911
{
912
    MXFIndexTableSegment *segment = arg;
913
    switch(tag) {
914 915
    case 0x3F05:
        segment->edit_unit_byte_count = avio_rb32(pb);
916
        av_log(NULL, AV_LOG_TRACE, "EditUnitByteCount %d\n", segment->edit_unit_byte_count);
917 918 919
        break;
    case 0x3F06:
        segment->index_sid = avio_rb32(pb);
920
        av_log(NULL, AV_LOG_TRACE, "IndexSID %d\n", segment->index_sid);
921 922 923
        break;
    case 0x3F07:
        segment->body_sid = avio_rb32(pb);
924
        av_log(NULL, AV_LOG_TRACE, "BodySID %d\n", segment->body_sid);
925 926
        break;
    case 0x3F0A:
927
        av_log(NULL, AV_LOG_TRACE, "IndexEntryArray found\n");
928 929 930 931
        return mxf_read_index_entry_array(pb, segment);
    case 0x3F0B:
        segment->index_edit_rate.num = avio_rb32(pb);
        segment->index_edit_rate.den = avio_rb32(pb);
932
        av_log(NULL, AV_LOG_TRACE, "IndexEditRate %d/%d\n", segment->index_edit_rate.num,
933 934 935 936
                segment->index_edit_rate.den);
        break;
    case 0x3F0C:
        segment->index_start_position = avio_rb64(pb);
937
        av_log(NULL, AV_LOG_TRACE, "IndexStartPosition %"PRId64"\n", segment->index_start_position);
938 939 940
        break;
    case 0x3F0D:
        segment->index_duration = avio_rb64(pb);
941
        av_log(NULL, AV_LOG_TRACE, "IndexDuration %"PRId64"\n", segment->index_duration);
942
        break;
943 944 945 946
    }
    return 0;
}

947
static void mxf_read_pixel_layout(AVIOContext *pb, MXFDescriptor *descriptor)
948
{
949
    int code, value, ofs = 0;
Tomas Härdin's avatar
Tomas Härdin committed
950
    char layout[16] = {0}; /* not for printing, may end up not terminated on purpose */
951 952

    do {
953 954
        code = avio_r8(pb);
        value = avio_r8(pb);
955
        av_log(NULL, AV_LOG_TRACE, "pixel layout: code %#x\n", code);
956

Tomas Härdin's avatar
Tomas Härdin committed
957
        if (ofs <= 14) {
958 959
            layout[ofs++] = code;
            layout[ofs++] = value;
960 961
        } else
            break;  /* don't read byte by byte on sneaky files filled with lots of non-zeroes */
962
    } while (code != 0); /* SMPTE 377M E.2.46 */
963 964

    ff_mxf_decode_pixel_layout(layout, &descriptor->pix_fmt);
965 966
}

967
static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
968
{
969
    MXFDescriptor *descriptor = arg;
970 971
    switch(tag) {
    case 0x3F01:
972 973
        return mxf_read_strong_ref_array(pb, &descriptor->sub_descriptors_refs,
                                             &descriptor->sub_descriptors_count);
974 975 976
    case 0x3002: /* ContainerDuration */
        descriptor->duration = avio_rb64(pb);
        break;
977
    case 0x3004:
978
        avio_read(pb, descriptor->essence_container_ul, 16);
979
        break;
980 981 982
    case 0x3005:
        avio_read(pb, descriptor->codec_ul, 16);
        break;
983
    case 0x3006:
984
        descriptor->linked_track_id = avio_rb32(pb);
985 986
        break;
    case 0x3201: /* PictureEssenceCoding */
987
        avio_read(pb, descriptor->essence_codec_ul, 16);
988 989
        break;
    case 0x3203:
990
        descriptor->width = avio_rb32(pb);
991 992
        break;
    case 0x3202:
993
        descriptor->height = avio_rb32(pb);
994
        break;
995 996 997
    case 0x320C:
        descriptor->frame_layout = avio_r8(pb);
        break;
998
    case 0x320E:
999 1000
        descriptor->aspect_ratio.num = avio_rb32(pb);
        descriptor->aspect_ratio.den = avio_rb32(pb);
1001
        break;
1002 1003 1004
    case 0x3212:
        descriptor->field_dominance = avio_r8(pb);
        break;
1005 1006 1007 1008 1009 1010 1011 1012 1013
    case 0x3301:
        descriptor->component_depth = avio_rb32(pb);
        break;
    case 0x3302:
        descriptor->horiz_subsampling = avio_rb32(pb);
        break;
    case 0x3308:
        descriptor->vert_subsampling = avio_rb32(pb);
        break;
1014
    case 0x3D03:
1015 1016
        descriptor->sample_rate.num = avio_rb32(pb);
        descriptor->sample_rate.den = avio_rb32(pb);
1017 1018
        break;
    case 0x3D06: /* SoundEssenceCompression */
1019
        avio_read(pb, descriptor->essence_codec_ul, 16);
1020 1021
        break;
    case 0x3D07:
1022
        descriptor->channels = avio_rb32(pb);
1023 1024
        break;
    case 0x3D01:
1025
        descriptor->bits_per_sample = avio_rb32(pb);
1026 1027 1028 1029 1030 1031 1032
        break;
    case 0x3401:
        mxf_read_pixel_layout(pb, descriptor);
        break;
    default:
        /* Private uid used by SONY C0023S01.mxf */
        if (IS_KLV_KEY(uid, mxf_sony_mpeg4_extradata)) {
1033 1034 1035 1036
            if (descriptor->extradata)
                av_log(NULL, AV_LOG_WARNING, "Duplicate sony_mpeg4_extradata\n");
            av_free(descriptor->extradata);
            descriptor->extradata_size = 0;
1037
            descriptor->extradata = av_malloc(size);
1038
            if (!descriptor->extradata)
1039
                return AVERROR(ENOMEM);
1040
            descriptor->extradata_size = size;
1041
            avio_read(pb, descriptor->extradata, size);
1042
        }
1043 1044 1045 1046 1047 1048
        if (IS_KLV_KEY(uid, mxf_jp2k_rsiz)) {
            uint32_t rsiz = avio_rb16(pb);
            if (rsiz == FF_PROFILE_JPEG2000_DCINEMA_2K ||
                rsiz == FF_PROFILE_JPEG2000_DCINEMA_4K)
                descriptor->pix_fmt = AV_PIX_FMT_XYZ12;
        }
1049 1050 1051 1052 1053
        break;
    }
    return 0;
}

1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
static int mxf_read_indirect_value(void *arg, AVIOContext *pb, int size)
{
    MXFTaggedValue *tagged_value = arg;
    uint8_t key[17];

    if (size <= 17)
        return 0;

    avio_read(pb, key, 17);
    /* TODO: handle other types of of indirect values */
    if (memcmp(key, mxf_indirect_value_utf16le, 17) == 0) {
        return mxf_read_utf16le_string(pb, size - 17, &tagged_value->value);
    } else if (memcmp(key, mxf_indirect_value_utf16be, 17) == 0) {
        return mxf_read_utf16be_string(pb, size - 17, &tagged_value->value);
    }
    return 0;
}

static int mxf_read_tagged_value(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
{
    MXFTaggedValue *tagged_value = arg;
    switch (tag){
    case 0x5001:
        return mxf_read_utf16be_string(pb, size, &tagged_value->name);
    case 0x5003:
        return mxf_read_indirect_value(tagged_value, pb, size);
    }
    return 0;
}

1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
/*
 * Match an uid independently of the version byte and up to len common bytes
 * Returns: boolean
 */
static int mxf_match_uid(const UID key, const UID uid, int len)
{
    int i;
    for (i = 0; i < len; i++) {
        if (i != 7 && key[i] != uid[i])
            return 0;
    }
    return 1;
}

static const MXFCodecUL *mxf_get_codec_ul(const MXFCodecUL *uls, UID *uid)
{
1100
    while (uls->uid[0]) {
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122
        if(mxf_match_uid(uls->uid, *uid, uls->matching_len))
            break;
        uls++;
    }
    return uls;
}

static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum MXFMetadataSetType type)
{
    int i;

    if (!strong_ref)
        return NULL;
    for (i = 0; i < mxf->metadata_sets_count; i++) {
        if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16) &&
            (type == AnyType || mxf->metadata_sets[i]->type == type)) {
            return mxf->metadata_sets[i];
        }
    }
    return NULL;
}

1123
static const MXFCodecUL mxf_picture_essence_container_uls[] = {
1124
    // video essence container uls
1125 1126 1127
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0c,0x01,0x00 }, 14,   AV_CODEC_ID_JPEG2000 },
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x10,0x60,0x01 }, 14,       AV_CODEC_ID_H264 }, /* H264 Frame wrapped */
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x12,0x01,0x00 }, 14,        AV_CODEC_ID_VC1 }, /* VC-1 Frame wrapped */
Luca Barbato's avatar
Luca Barbato committed
1128
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, 14, AV_CODEC_ID_MPEG2VIDEO }, /* MPEG-ES Frame wrapped */
1129
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x01,0x04,0x01 }, 14, AV_CODEC_ID_MPEG2VIDEO }, /* Type D-10 mapping of 40Mbps 525/60-I */
Luca Barbato's avatar
Luca Barbato committed
1130 1131
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x02,0x41,0x01 }, 14,    AV_CODEC_ID_DVVIDEO }, /* DV 625 25mbps */
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x05,0x00,0x00 }, 14,   AV_CODEC_ID_RAWVIDEO }, /* Uncompressed Picture */
1132 1133
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x0f,0x03,0x01,0x02,0x20,0x01,0x01 }, 15,     AV_CODEC_ID_HQ_HQA },
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x0f,0x03,0x01,0x02,0x20,0x02,0x01 }, 15,        AV_CODEC_ID_HQX },
1134
    { { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0xff,0x4b,0x46,0x41,0x41,0x00,0x0d,0x4d,0x4f }, 14,   AV_CODEC_ID_RAWVIDEO }, /* Legacy ?? Uncompressed Picture */
1135
    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,      AV_CODEC_ID_NONE },
1136
};
1137 1138 1139

/* EC ULs for intra-only formats */
static const MXFCodecUL mxf_intra_only_essence_container_uls[] = {
Luca Barbato's avatar
Luca Barbato committed
1140
    { { 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 */
1141
    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,       AV_CODEC_ID_NONE },
1142 1143 1144 1145
};

/* intra-only PictureEssenceCoding ULs, where no corresponding EC UL exists */
static const MXFCodecUL mxf_intra_only_picture_essence_coding_uls[] = {
Luca Barbato's avatar
Luca Barbato committed
1146 1147
    { { 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 */
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 }, 14,   AV_CODEC_ID_JPEG2000 }, /* JPEG2000 Codestream */
1148
    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,       AV_CODEC_ID_NONE },
1149 1150
};

1151 1152 1153 1154 1155 1156 1157 1158 1159
/* actual coded width for AVC-Intra to allow selecting correct SPS/PPS */
static const MXFCodecUL mxf_intra_only_picture_coded_width[] = {
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x01 }, 16, 1440 },
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x02 }, 16, 1440 },
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x03 }, 16, 1440 },
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x04 }, 16, 1440 },
    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,    0 },
};

1160
static const MXFCodecUL mxf_sound_essence_container_uls[] = {
1161
    // sound essence container uls
Luca Barbato's avatar
Luca Barbato committed
1162 1163 1164 1165
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x06,0x01,0x00 }, 14, AV_CODEC_ID_PCM_S16LE }, /* BWF Frame wrapped */
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x04,0x40,0x01 }, 14,       AV_CODEC_ID_MP2 }, /* MPEG-ES Frame wrapped, 0x40 ??? stream id */
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, 14, AV_CODEC_ID_PCM_S16LE }, /* D-10 Mapping 50Mbps PAL Extended Template */
    { { 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 */
Luca Barbato's avatar
Luca Barbato committed
1166
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x03,0x04,0x02,0x02,0x02,0x03,0x03,0x01,0x00 }, 14,       AV_CODEC_ID_AAC }, /* MPEG2 AAC ADTS (legacy) */
1167
    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,      AV_CODEC_ID_NONE },
1168 1169
};

1170 1171
static const MXFCodecUL mxf_data_essence_container_uls[] = {
    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x09,0x0d,0x01,0x03,0x01,0x02,0x0e,0x00,0x00 }, 16, 0 },
1172
    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0, AV_CODEC_ID_NONE },
1173 1174
};

1175
static const char* const mxf_data_essence_descriptor[] = {
1176 1177 1178
    "vbi_vanc_smpte_436M",
};

1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189
static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segments, MXFIndexTableSegment ***sorted_segments)
{
    int i, j, nb_segments = 0;
    MXFIndexTableSegment **unsorted_segments;
    int last_body_sid = -1, last_index_sid = -1, last_index_start = -1;

    /* count number of segments, allocate arrays and copy unsorted segments */
    for (i = 0; i < mxf->metadata_sets_count; i++)
        if (mxf->metadata_sets[i]->type == IndexTableSegment)
            nb_segments++;

1190 1191 1192
    if (!nb_segments)
        return AVERROR_INVALIDDATA;

1193 1194
    if (!(unsorted_segments = av_calloc(nb_segments, sizeof(*unsorted_segments))) ||
        !(*sorted_segments  = av_calloc(nb_segments, sizeof(**sorted_segments)))) {
1195
        av_freep(sorted_segments);
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
        av_free(unsorted_segments);
        return AVERROR(ENOMEM);
    }

    for (i = j = 0; i < mxf->metadata_sets_count; i++)
        if (mxf->metadata_sets[i]->type == IndexTableSegment)
            unsorted_segments[j++] = (MXFIndexTableSegment*)mxf->metadata_sets[i];

    *nb_sorted_segments = 0;

    /* sort segments by {BodySID, IndexSID, IndexStartPosition}, remove duplicates while we're at it */
    for (i = 0; i < nb_segments; i++) {
        int best = -1, best_body_sid = -1, best_index_sid = -1, best_index_start = -1;
1209
        uint64_t best_index_duration = 0;
1210 1211 1212 1213 1214 1215

        for (j = 0; j < nb_segments; j++) {
            MXFIndexTableSegment *s = unsorted_segments[j];

            /* Require larger BosySID, IndexSID or IndexStartPosition then the previous entry. This removes duplicates.
             * We want the smallest values for the keys than what we currently have, unless this is the first such entry this time around.
1216
             * If we come across an entry with the same IndexStartPosition but larger IndexDuration, then we'll prefer it over the one we currently have.
1217 1218
             */
            if ((i == 0     || s->body_sid > last_body_sid || s->index_sid > last_index_sid || s->index_start_position > last_index_start) &&
1219 1220
                (best == -1 || s->body_sid < best_body_sid || s->index_sid < best_index_sid || s->index_start_position < best_index_start ||
                (s->index_start_position == best_index_start && s->index_duration > best_index_duration))) {
1221 1222 1223 1224
                best             = j;
                best_body_sid    = s->body_sid;
                best_index_sid   = s->index_sid;
                best_index_start = s->index_start_position;
1225
                best_index_duration = s->index_duration;
1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243
            }
        }

        /* no suitable entry found -> we're done */
        if (best == -1)
            break;

        (*sorted_segments)[(*nb_sorted_segments)++] = unsorted_segments[best];
        last_body_sid    = best_body_sid;
        last_index_sid   = best_index_sid;
        last_index_start = best_index_start;
    }

    av_free(unsorted_segments);

    return 0;
}

1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265
/**
 * Computes the absolute file offset of the given essence container offset
 */
static int mxf_absolute_bodysid_offset(MXFContext *mxf, int body_sid, int64_t offset, int64_t *offset_out)
{
    int x;
    int64_t offset_in = offset;     /* for logging */

    for (x = 0; x < mxf->partitions_count; x++) {
        MXFPartition *p = &mxf->partitions[x];

        if (p->body_sid != body_sid)
            continue;

        if (offset < p->essence_length || !p->essence_length) {
            *offset_out = p->essence_offset + offset;
            return 0;
        }

        offset -= p->essence_length;
    }

1266 1267
    av_log(mxf->fc, AV_LOG_ERROR,
           "failed to find absolute offset of %"PRIX64" in BodySID %i - partial file?\n",
1268 1269 1270 1271 1272
           offset_in, body_sid);

    return AVERROR_INVALIDDATA;
}

1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295
/**
 * Returns the end position of the essence container with given BodySID, or zero if unknown
 */
static int64_t mxf_essence_container_end(MXFContext *mxf, int body_sid)
{
    int x;
    int64_t ret = 0;

    for (x = 0; x < mxf->partitions_count; x++) {
        MXFPartition *p = &mxf->partitions[x];

        if (p->body_sid != body_sid)
            continue;

        if (!p->essence_length)
            return 0;

        ret = p->essence_offset + p->essence_length;
    }

    return ret;
}

1296 1297 1298 1299
/* EditUnit -> absolute offset */
static int mxf_edit_unit_absolute_offset(MXFContext *mxf, MXFIndexTable *index_table, int64_t edit_unit, int64_t *edit_unit_out, int64_t *offset_out, int nag)
{
    int i;
1300
    int64_t offset_temp = 0;
1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315

    for (i = 0; i < index_table->nb_segments; i++) {
        MXFIndexTableSegment *s = index_table->segments[i];

        edit_unit = FFMAX(edit_unit, s->index_start_position);  /* clamp if trying to seek before start */

        if (edit_unit < s->index_start_position + s->index_duration) {
            int64_t index = edit_unit - s->index_start_position;

            if (s->edit_unit_byte_count)
                offset_temp += s->edit_unit_byte_count * index;
            else if (s->nb_index_entries) {
                if (s->nb_index_entries == 2 * s->index_duration + 1)
                    index *= 2;     /* Avid index */

1316
                if (index < 0 || index >= s->nb_index_entries) {
1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344
                    av_log(mxf->fc, AV_LOG_ERROR, "IndexSID %i segment at %"PRId64" IndexEntryArray too small\n",
                           index_table->index_sid, s->index_start_position);
                    return AVERROR_INVALIDDATA;
                }

                offset_temp = s->stream_offset_entries[index];
            } else {
                av_log(mxf->fc, AV_LOG_ERROR, "IndexSID %i segment at %"PRId64" missing EditUnitByteCount and IndexEntryArray\n",
                       index_table->index_sid, s->index_start_position);
                return AVERROR_INVALIDDATA;
            }

            if (edit_unit_out)
                *edit_unit_out = edit_unit;

            return mxf_absolute_bodysid_offset(mxf, index_table->body_sid, offset_temp, offset_out);
        } else {
            /* EditUnitByteCount == 0 for VBR indexes, which is fine since they use explicit StreamOffsets */
            offset_temp += s->edit_unit_byte_count * s->index_duration;
        }
    }

    if (nag)
        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);

    return AVERROR_INVALIDDATA;
}

1345
static int mxf_compute_ptses_fake_index(MXFContext *mxf, MXFIndexTable *index_table)
1346
{
1347
    int i, j, x;
1348
    int8_t max_temporal_offset = -128;
1349
    uint8_t *flags;
1350 1351

    /* first compute how many entries we have */
1352 1353
    for (i = 0; i < index_table->nb_segments; i++) {
        MXFIndexTableSegment *s = index_table->segments[i];
1354

1355 1356
        if (!s->nb_index_entries) {
            index_table->nb_ptses = 0;
1357
            return 0;                               /* no TemporalOffsets */
1358
        }
1359

1360
        index_table->nb_ptses += s->index_duration;
1361 1362 1363
    }

    /* paranoid check */
1364
    if (index_table->nb_ptses <= 0)
1365 1366
        return 0;

1367
    if (!(index_table->ptses      = av_calloc(index_table->nb_ptses, sizeof(int64_t))) ||
1368 1369 1370
        !(index_table->fake_index = av_calloc(index_table->nb_ptses, sizeof(AVIndexEntry))) ||
        !(index_table->offsets    = av_calloc(index_table->nb_ptses, sizeof(int8_t))) ||
        !(flags                   = av_calloc(index_table->nb_ptses, sizeof(uint8_t)))) {
1371
        av_freep(&index_table->ptses);
1372 1373
        av_freep(&index_table->fake_index);
        av_freep(&index_table->offsets);
1374
        return AVERROR(ENOMEM);
1375
    }
1376 1377 1378

    /* we may have a few bad TemporalOffsets
     * make sure the corresponding PTSes don't have the bogus value 0 */
1379 1380
    for (x = 0; x < index_table->nb_ptses; x++)
        index_table->ptses[x] = AV_NOPTS_VALUE;
1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408

    /**
     * We have this:
     *
     * x  TemporalOffset
     * 0:  0
     * 1:  1
     * 2:  1
     * 3: -2
     * 4:  1
     * 5:  1
     * 6: -2
     *
     * We want to transform it into this:
     *
     * x  DTS PTS
     * 0: -1   0
     * 1:  0   3
     * 2:  1   1
     * 3:  2   2
     * 4:  3   6
     * 5:  4   4
     * 6:  5   5
     *
     * We do this by bucket sorting x by x+TemporalOffset[x] into mxf->ptses,
     * then settings mxf->first_dts = -max(TemporalOffset[x]).
     * The latter makes DTS <= PTS.
     */
1409 1410
    for (i = x = 0; i < index_table->nb_segments; i++) {
        MXFIndexTableSegment *s = index_table->segments[i];
1411
        int index_delta = 1;
1412
        int n = s->nb_index_entries;
1413

1414
        if (s->nb_index_entries == 2 * s->index_duration + 1) {
1415
            index_delta = 2;    /* Avid index */
1416 1417 1418 1419 1420
            /* ignore the last entry - it's the size of the essence container */
            n--;
        }

        for (j = 0; j < n; j += index_delta, x++) {
1421 1422 1423
            int offset = s->temporal_offset_entries[j] / index_delta;
            int index  = x + offset;

1424
            if (x >= index_table->nb_ptses) {
1425 1426
                av_log(mxf->fc, AV_LOG_ERROR,
                       "x >= nb_ptses - IndexEntryCount %i < IndexDuration %"PRId64"?\n",
1427 1428 1429 1430
                       s->nb_index_entries, s->index_duration);
                break;
            }

1431
            flags[x] = !(s->flag_entries[j] & 0x30) ? AVINDEX_KEYFRAME : 0;
1432 1433

            if (index < 0 || index >= index_table->nb_ptses) {
1434 1435 1436 1437 1438 1439
                av_log(mxf->fc, AV_LOG_ERROR,
                       "index entry %i + TemporalOffset %i = %i, which is out of bounds\n",
                       x, offset, index);
                continue;
            }

1440
            index_table->offsets[x] = offset;
1441
            index_table->ptses[index] = x;
1442 1443 1444 1445
            max_temporal_offset = FFMAX(max_temporal_offset, offset);
        }
    }

1446 1447 1448 1449 1450 1451 1452 1453
    /* calculate the fake index table in display order */
    for (x = 0; x < index_table->nb_ptses; x++) {
        index_table->fake_index[x].timestamp = x;
        if (index_table->ptses[x] != AV_NOPTS_VALUE)
            index_table->fake_index[index_table->ptses[x]].flags = flags[x];
    }
    av_freep(&flags);

1454
    index_table->first_dts = -max_temporal_offset;
1455 1456 1457 1458

    return 0;
}

1459 1460 1461 1462 1463 1464
/**
 * Sorts and collects index table segments into index tables.
 * Also computes PTSes if possible.
 */
static int mxf_compute_index_tables(MXFContext *mxf)
{
1465
    int i, j, k, ret, nb_sorted_segments;
1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484
    MXFIndexTableSegment **sorted_segments = NULL;

    if ((ret = mxf_get_sorted_table_segments(mxf, &nb_sorted_segments, &sorted_segments)) ||
        nb_sorted_segments <= 0) {
        av_log(mxf->fc, AV_LOG_WARNING, "broken or empty index\n");
        return 0;
    }

    /* sanity check and count unique BodySIDs/IndexSIDs */
    for (i = 0; i < nb_sorted_segments; i++) {
        if (i == 0 || sorted_segments[i-1]->index_sid != sorted_segments[i]->index_sid)
            mxf->nb_index_tables++;
        else if (sorted_segments[i-1]->body_sid != sorted_segments[i]->body_sid) {
            av_log(mxf->fc, AV_LOG_ERROR, "found inconsistent BodySID\n");
            ret = AVERROR_INVALIDDATA;
            goto finish_decoding_index;
        }
    }

Luca Barbato's avatar
Luca Barbato committed
1485 1486 1487
    mxf->index_tables = av_mallocz_array(mxf->nb_index_tables,
                                         sizeof(*mxf->index_tables));
    if (!mxf->index_tables) {
1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505
        av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate index tables\n");
        ret = AVERROR(ENOMEM);
        goto finish_decoding_index;
    }

    /* distribute sorted segments to index tables */
    for (i = j = 0; i < nb_sorted_segments; i++) {
        if (i != 0 && sorted_segments[i-1]->index_sid != sorted_segments[i]->index_sid) {
            /* next IndexSID */
            j++;
        }

        mxf->index_tables[j].nb_segments++;
    }

    for (i = j = 0; j < mxf->nb_index_tables; i += mxf->index_tables[j++].nb_segments) {
        MXFIndexTable *t = &mxf->index_tables[j];

Luca Barbato's avatar
Luca Barbato committed
1506 1507 1508 1509
        t->segments = av_mallocz_array(t->nb_segments,
                                       sizeof(*t->segments));

        if (!t->segments) {
1510 1511
            av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate IndexTableSegment"
                   " pointer array\n");
1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522
            ret = AVERROR(ENOMEM);
            goto finish_decoding_index;
        }

        if (sorted_segments[i]->index_start_position)
            av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i starts at EditUnit %"PRId64" - seeking may not work as expected\n",
                   sorted_segments[i]->index_sid, sorted_segments[i]->index_start_position);

        memcpy(t->segments, &sorted_segments[i], t->nb_segments * sizeof(MXFIndexTableSegment*));
        t->index_sid = sorted_segments[i]->index_sid;
        t->body_sid = sorted_segments[i]->body_sid;
1523 1524 1525

        if ((ret = mxf_compute_ptses_fake_index(mxf, t)) < 0)
            goto finish_decoding_index;
1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546

        /* fix zero IndexDurations */
        for (k = 0; k < t->nb_segments; k++) {
            if (t->segments[k]->index_duration)
                continue;

            if (t->nb_segments > 1)
                av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment %i has zero IndexDuration and there's more than one segment\n",
                       t->index_sid, k);

            if (mxf->fc->nb_streams <= 0) {
                av_log(mxf->fc, AV_LOG_WARNING, "no streams?\n");
                break;
            }

            /* assume the first stream's duration is reasonable
             * leave index_duration = 0 on further segments in case we have any (unlikely)
             */
            t->segments[k]->index_duration = mxf->fc->streams[0]->duration;
            break;
        }
1547 1548 1549 1550 1551 1552 1553 1554
    }

    ret = 0;
finish_decoding_index:
    av_free(sorted_segments);
    return ret;
}

1555 1556 1557
static int mxf_is_intra_only(MXFDescriptor *descriptor)
{
    return mxf_get_codec_ul(mxf_intra_only_essence_container_uls,
1558
                            &descriptor->essence_container_ul)->id != AV_CODEC_ID_NONE ||
1559
           mxf_get_codec_ul(mxf_intra_only_picture_essence_coding_uls,
1560
                            &descriptor->essence_codec_ul)->id     != AV_CODEC_ID_NONE;
1561 1562
}

1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580
static int mxf_uid_to_str(UID uid, char **str)
{
    int i;
    char *p;
    p = *str = av_mallocz(sizeof(UID) * 2 + 4 + 1);
    if (!p)
        return AVERROR(ENOMEM);
    for (i = 0; i < sizeof(UID); i++) {
        snprintf(p, 2 + 1, "%.2x", uid[i]);
        p += 2;
        if (i == 3 || i == 5 || i == 7 || i == 9) {
            snprintf(p, 1 + 1, "-");
            p++;
        }
    }
    return 0;
}

1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602
static int mxf_umid_to_str(UID ul, UID uid, char **str)
{
    int i;
    char *p;
    p = *str = av_mallocz(sizeof(UID) * 4 + 2 + 1);
    if (!p)
        return AVERROR(ENOMEM);
    snprintf(p, 2 + 1, "0x");
    p += 2;
    for (i = 0; i < sizeof(UID); i++) {
        snprintf(p, 2 + 1, "%.2X", ul[i]);
        p += 2;

    }
    for (i = 0; i < sizeof(UID); i++) {
        snprintf(p, 2 + 1, "%.2X", uid[i]);
        p += 2;
    }
    return 0;
}

static int mxf_add_umid_metadata(AVDictionary **pm, const char *key, MXFPackage* package)
1603 1604 1605
{
    char *str;
    int ret;
1606 1607 1608
    if (!package)
        return 0;
    if ((ret = mxf_umid_to_str(package->package_ul, package->package_uid, &str)) < 0)
1609 1610 1611 1612 1613
        return ret;
    av_dict_set(pm, key, str, AV_DICT_DONT_STRDUP_VAL);
    return 0;
}

1614 1615 1616 1617 1618 1619 1620 1621
static int mxf_add_timecode_metadata(AVDictionary **pm, const char *key, AVTimecode *tc)
{
    char buf[AV_TIMECODE_STR_SIZE];
    av_dict_set(pm, key, av_timecode_make_string(tc, buf, 0), 0);

    return 0;
}

1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642
static MXFTimecodeComponent* mxf_resolve_timecode_component(MXFContext *mxf, UID *strong_ref)
{
    MXFStructuralComponent *component = NULL;
    MXFPulldownComponent *pulldown = NULL;

    component = mxf_resolve_strong_ref(mxf, strong_ref, AnyType);
    if (!component)
        return NULL;

    switch (component->type) {
    case TimecodeComponent:
        return (MXFTimecodeComponent*)component;
    case PulldownComponent: /* timcode component may be located on a pulldown component */
        pulldown = (MXFPulldownComponent*)component;
        return mxf_resolve_strong_ref(mxf, &pulldown->input_segment_ref, TimecodeComponent);
    default:
        break;
    }
    return NULL;
}

1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658
static MXFPackage* mxf_resolve_source_package(MXFContext *mxf, UID package_uid)
{
    MXFPackage *package = NULL;
    int i;

    for (i = 0; i < mxf->packages_count; i++) {
        package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], SourcePackage);
        if (!package)
            continue;

        if (!memcmp(package->package_uid, package_uid, 16))
            return package;
    }
    return NULL;
}

1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684
static MXFDescriptor* mxf_resolve_multidescriptor(MXFContext *mxf, MXFDescriptor *descriptor, int track_id)
{
    MXFDescriptor *sub_descriptor = NULL;
    int i;

    if (!descriptor)
        return NULL;

    if (descriptor->type == MultipleDescriptor) {
        for (i = 0; i < descriptor->sub_descriptors_count; i++) {
            sub_descriptor = mxf_resolve_strong_ref(mxf, &descriptor->sub_descriptors_refs[i], Descriptor);

            if (!sub_descriptor) {
                av_log(mxf->fc, AV_LOG_ERROR, "could not resolve sub descriptor strong ref\n");
                continue;
            }
            if (sub_descriptor->linked_track_id == track_id) {
                return sub_descriptor;
            }
        }
    } else if (descriptor->type == Descriptor)
        return descriptor;

    return NULL;
}

1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705
static MXFStructuralComponent* mxf_resolve_essence_group_choice(MXFContext *mxf, MXFEssenceGroup *essence_group)
{
    MXFStructuralComponent *component = NULL;
    MXFPackage *package = NULL;
    MXFDescriptor *descriptor = NULL;
    int i;

    if (!essence_group || !essence_group->structural_components_count)
        return NULL;

    /* essence groups contains multiple representations of the same media,
       this return the first components with a valid Descriptor typically index 0 */
    for (i =0; i < essence_group->structural_components_count; i++){
        component = mxf_resolve_strong_ref(mxf, &essence_group->structural_components_refs[i], SourceClip);
        if (!component)
            continue;

        if (!(package = mxf_resolve_source_package(mxf, component->source_package_uid)))
            continue;

        descriptor = mxf_resolve_strong_ref(mxf, &package->descriptor_ref, Descriptor);
1706
        if (descriptor)
1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729
            return component;
    }
    return NULL;
}

static MXFStructuralComponent* mxf_resolve_sourceclip(MXFContext *mxf, UID *strong_ref)
{
    MXFStructuralComponent *component = NULL;

    component = mxf_resolve_strong_ref(mxf, strong_ref, AnyType);
    if (!component)
        return NULL;
    switch (component->type) {
        case SourceClip:
            return component;
        case EssenceGroup:
            return mxf_resolve_essence_group_choice(mxf, (MXFEssenceGroup*) component);
        default:
            break;
    }
    return NULL;
}

1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751
static int mxf_parse_package_comments(MXFContext *mxf, AVDictionary **pm, MXFPackage *package)
{
    MXFTaggedValue *tag;
    int size, i;
    char *key = NULL;

    for (i = 0; i < package->comment_count; i++) {
        tag = mxf_resolve_strong_ref(mxf, &package->comment_refs[i], TaggedValue);
        if (!tag || !tag->name || !tag->value)
            continue;

        size = strlen(tag->name) + 8 + 1;
        key = av_mallocz(size);
        if (!key)
            return AVERROR(ENOMEM);

        snprintf(key, size, "comment_%s", tag->name);
        av_dict_set(pm, key, tag->value, AV_DICT_DONT_STRDUP_KEY);
    }
    return 0;
}

1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763
static int mxf_parse_physical_source_package(MXFContext *mxf, MXFTrack *source_track, AVStream *st)
{
    MXFPackage *physical_package = NULL;
    MXFTrack *physical_track = NULL;
    MXFStructuralComponent *sourceclip = NULL;
    MXFTimecodeComponent *mxf_tc = NULL;
    int i, j, k;
    AVTimecode tc;
    int flags;
    int64_t start_position;

    for (i = 0; i < source_track->sequence->structural_components_count; i++) {
1764 1765
        sourceclip = mxf_resolve_strong_ref(mxf, &source_track->sequence->structural_components_refs[i], SourceClip);
        if (!sourceclip)
1766 1767
            continue;

1768
        if (!(physical_package = mxf_resolve_source_package(mxf, sourceclip->source_package_uid)))
1769 1770
            break;

1771
        mxf_add_umid_metadata(&st->metadata, "reel_umid", physical_package);
1772

1773
        /* the name of physical source package is name of the reel or tape */
1774
        if (physical_package->name && physical_package->name[0])
1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790
            av_dict_set(&st->metadata, "reel_name", physical_package->name, 0);

        /* the source timecode is calculated by adding the start_position of the sourceclip from the file source package track
         * to the start_frame of the timecode component located on one of the tracks of the physical source package.
         */
        for (j = 0; j < physical_package->tracks_count; j++) {
            if (!(physical_track = mxf_resolve_strong_ref(mxf, &physical_package->tracks_refs[j], Track))) {
                av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n");
                continue;
            }

            if (!(physical_track->sequence = mxf_resolve_strong_ref(mxf, &physical_track->sequence_ref, Sequence))) {
                av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
                continue;
            }

1791 1792 1793 1794 1795 1796 1797 1798 1799 1800
        if (physical_track->edit_rate.num <= 0 ||
            physical_track->edit_rate.den <= 0) {
            av_log(mxf->fc, AV_LOG_WARNING,
                   "Invalid edit rate (%d/%d) found on structural"
                   " component #%d, defaulting to 25/1\n",
                   physical_track->edit_rate.num,
                   physical_track->edit_rate.den, i);
            physical_track->edit_rate = (AVRational){25, 1};
        }

1801
            for (k = 0; k < physical_track->sequence->structural_components_count; k++) {
1802 1803
                if (!(mxf_tc = mxf_resolve_timecode_component(mxf, &physical_track->sequence->structural_components_refs[k])))
                    continue;
1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821

                flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
                /* scale sourceclip start_position to match physical track edit rate */
                start_position = av_rescale_q(sourceclip->start_position,
                                              physical_track->edit_rate,
                                              source_track->edit_rate);

                if (av_timecode_init(&tc, mxf_tc->rate, flags, start_position + mxf_tc->start_frame, mxf->fc) == 0) {
                    mxf_add_timecode_metadata(&st->metadata, "timecode", &tc);
                    return 0;
                }
            }
        }
    }

    return 0;
}

1822 1823 1824
static int mxf_parse_structural_metadata(MXFContext *mxf)
{
    MXFPackage *material_package = NULL;
1825
    int i, j, k, ret;
1826

1827
    av_log(mxf->fc, AV_LOG_TRACE, "metadata sets count %d\n", mxf->metadata_sets_count);
1828 1829 1830 1831 1832 1833 1834
    /* TODO: handle multiple material packages (OP3x) */
    for (i = 0; i < mxf->packages_count; i++) {
        material_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], MaterialPackage);
        if (material_package) break;
    }
    if (!material_package) {
        av_log(mxf->fc, AV_LOG_ERROR, "no material package found\n");
1835
        return AVERROR_INVALIDDATA;
1836 1837
    }

1838
    mxf_add_umid_metadata(&mxf->fc->metadata, "material_package_umid", material_package);
1839 1840
    if (material_package->name && material_package->name[0])
        av_dict_set(&mxf->fc->metadata, "material_package_name", material_package->name, 0);
1841
    mxf_parse_package_comments(mxf, &mxf->fc->metadata, material_package);
1842

1843 1844 1845 1846 1847 1848 1849
    for (i = 0; i < material_package->tracks_count; i++) {
        MXFPackage *source_package = NULL;
        MXFTrack *material_track = NULL;
        MXFTrack *source_track = NULL;
        MXFTrack *temp_track = NULL;
        MXFDescriptor *descriptor = NULL;
        MXFStructuralComponent *component = NULL;
1850
        MXFTimecodeComponent *mxf_tc = NULL;
1851 1852 1853
        UID *essence_container_ul = NULL;
        const MXFCodecUL *codec_ul = NULL;
        const MXFCodecUL *container_ul = NULL;
1854
        const MXFCodecUL *pix_fmt_ul = NULL;
1855
        AVStream *st;
1856 1857
        AVTimecode tc;
        int flags;
1858 1859 1860 1861 1862 1863

        if (!(material_track = mxf_resolve_strong_ref(mxf, &material_package->tracks_refs[i], Track))) {
            av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track strong ref\n");
            continue;
        }

1864 1865 1866
        if ((component = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, TimecodeComponent))) {
            mxf_tc = (MXFTimecodeComponent*)component;
            flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
1867
            if (av_timecode_init(&tc, mxf_tc->rate, flags, mxf_tc->start_frame, mxf->fc) == 0) {
1868 1869 1870 1871
                mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
            }
        }

1872 1873
        if (!(material_track->sequence = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, Sequence))) {
            av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track sequence strong ref\n");
1874
            continue;
1875 1876
        }

1877 1878 1879 1880 1881 1882 1883
        for (j = 0; j < material_track->sequence->structural_components_count; j++) {
            component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j], TimecodeComponent);
            if (!component)
                continue;

            mxf_tc = (MXFTimecodeComponent*)component;
            flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
1884
            if (av_timecode_init(&tc, mxf_tc->rate, flags, mxf_tc->start_frame, mxf->fc) == 0) {
1885 1886 1887 1888 1889
                mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
                break;
            }
        }

1890 1891
        /* TODO: handle multiple source clips */
        for (j = 0; j < material_track->sequence->structural_components_count; j++) {
1892
            component = mxf_resolve_sourceclip(mxf, &material_track->sequence->structural_components_refs[j]);
1893 1894 1895
            if (!component)
                continue;

1896
            source_package = mxf_resolve_source_package(mxf, component->source_package_uid);
1897
            if (!source_package) {
1898
                av_log(mxf->fc, AV_LOG_TRACE, "material track %d: no corresponding source package found\n", material_track->track_id);
1899 1900 1901 1902 1903
                break;
            }
            for (k = 0; k < source_package->tracks_count; k++) {
                if (!(temp_track = mxf_resolve_strong_ref(mxf, &source_package->tracks_refs[k], Track))) {
                    av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n");
1904
                    ret = AVERROR_INVALIDDATA;
1905
                    goto fail_and_free;
1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916
                }
                if (temp_track->track_id == component->source_track_id) {
                    source_track = temp_track;
                    break;
                }
            }
            if (!source_track) {
                av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source track found\n", material_track->track_id);
                break;
            }
        }
1917
        if (!source_track || !component || !source_package)
1918 1919
            continue;

1920 1921
        if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) {
            av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
1922
            ret = AVERROR_INVALIDDATA;
1923
            goto fail_and_free;
1924 1925 1926 1927 1928 1929 1930 1931 1932
        }

        /* 0001GL00.MXF.A1.mxf_opatom.mxf has the same SourcePackageID as 0001GL.MXF.V1.mxf_opatom.mxf
         * This would result in both files appearing to have two streams. Work around this by sanity checking DataDefinition */
        if (memcmp(material_track->sequence->data_definition_ul, source_track->sequence->data_definition_ul, 16)) {
            av_log(mxf->fc, AV_LOG_ERROR, "material track %d: DataDefinition mismatch\n", material_track->track_id);
            continue;
        }

1933
        st = avformat_new_stream(mxf->fc, NULL);
1934 1935
        if (!st) {
            av_log(mxf->fc, AV_LOG_ERROR, "could not allocate stream\n");
1936 1937
            ret = AVERROR(ENOMEM);
            goto fail_and_free;
1938
        }
1939
        st->id = source_track->track_id;
1940
        st->priv_data = source_track;
1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951

        source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref, AnyType);
        descriptor = mxf_resolve_multidescriptor(mxf, source_package->descriptor, source_track->track_id);

        /* A SourceClip from a EssenceGroup may only be a single frame of essence data. The clips duration is then how many
         * frames its suppose to repeat for. Descriptor->duration, if present, contains the real duration of the essence data */
        if (descriptor && descriptor->duration != AV_NOPTS_VALUE)
            source_track->original_duration = st->duration = FFMIN(descriptor->duration, component->duration);
        else
            source_track->original_duration = st->duration = component->duration;

1952 1953 1954
        if (st->duration == -1)
            st->duration = AV_NOPTS_VALUE;
        st->start_time = component->start_position;
1955 1956
        if (material_track->edit_rate.num <= 0 ||
            material_track->edit_rate.den <= 0) {
1957
            av_log(mxf->fc, AV_LOG_WARNING,
1958 1959 1960 1961
                   "Invalid edit rate (%d/%d) found on stream #%d, "
                   "defaulting to 25/1\n",
                   material_track->edit_rate.num,
                   material_track->edit_rate.den, st->index);
1962 1963
            material_track->edit_rate = (AVRational){25, 1};
        }
1964
        avpriv_set_pts_info(st, 64, material_track->edit_rate.den, material_track->edit_rate.num);
1965

1966 1967
        /* ensure SourceTrack EditRate == MaterialTrack EditRate since only
         * the former is accessible via st->priv_data */
1968 1969
        source_track->edit_rate = material_track->edit_rate;

1970
        PRINT_KEY(mxf->fc, "data definition   ul", source_track->sequence->data_definition_ul);
1971
        codec_ul = mxf_get_codec_ul(ff_mxf_data_definition_uls, &source_track->sequence->data_definition_ul);
1972
        st->codecpar->codec_type = codec_ul->id;
1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992

        if (!descriptor) {
            av_log(mxf->fc, AV_LOG_INFO, "source track %d: stream %d, no descriptor found\n", source_track->track_id, st->index);
            continue;
        }
        PRINT_KEY(mxf->fc, "essence codec     ul", descriptor->essence_codec_ul);
        PRINT_KEY(mxf->fc, "essence container ul", descriptor->essence_container_ul);
        essence_container_ul = &descriptor->essence_container_ul;
        /* HACK: replacing the original key with mxf_encrypted_essence_container
         * is not allowed according to s429-6, try to find correct information anyway */
        if (IS_KLV_KEY(essence_container_ul, mxf_encrypted_essence_container)) {
            av_log(mxf->fc, AV_LOG_INFO, "broken encrypted mxf file\n");
            for (k = 0; k < mxf->metadata_sets_count; k++) {
                MXFMetadataSet *metadata = mxf->metadata_sets[k];
                if (metadata->type == CryptoContext) {
                    essence_container_ul = &((MXFCryptoContext *)metadata)->source_container_ul;
                    break;
                }
            }
        }
1993

1994
        /* TODO: drop PictureEssenceCoding and SoundEssenceCompression, only check EssenceContainer */
1995
        codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->essence_codec_ul);
1996 1997
        st->codecpar->codec_id = (enum AVCodecID)codec_ul->id;
        if (st->codecpar->codec_id == AV_CODEC_ID_NONE) {
1998
            codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->codec_ul);
1999
            st->codecpar->codec_id = (enum AVCodecID)codec_ul->id;
2000 2001
        }

2002
        av_log(mxf->fc, AV_LOG_VERBOSE, "%s: Universal Label: ",
2003
               avcodec_get_name(st->codecpar->codec_id));
2004
        for (k = 0; k < 16; k++) {
2005 2006
            av_log(mxf->fc, AV_LOG_VERBOSE, "%.2x",
                   descriptor->essence_codec_ul[k]);
2007 2008 2009
            if (!(k+1 & 19) || k == 5)
                av_log(mxf->fc, AV_LOG_VERBOSE, ".");
        }
2010
        av_log(mxf->fc, AV_LOG_VERBOSE, "\n");
2011

2012
        mxf_add_umid_metadata(&st->metadata, "file_package_umid", source_package);
2013 2014 2015
        if (source_package->name && source_package->name[0])
            av_dict_set(&st->metadata, "file_package_name", source_package->name, 0);

2016 2017
        mxf_parse_physical_source_package(mxf, source_track, st);

2018
        if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
2019
            source_track->intra_only = mxf_is_intra_only(descriptor);
2020
            container_ul = mxf_get_codec_ul(mxf_picture_essence_container_uls, essence_container_ul);
2021 2022 2023
            if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
                st->codecpar->codec_id = container_ul->id;
            st->codecpar->width = descriptor->width;
2024
            st->codecpar->height = descriptor->height; /* Field height, not frame height */
2025 2026
            switch (descriptor->frame_layout) {
                case FullFrame:
2027
                    st->codecpar->field_order = AV_FIELD_PROGRESSIVE;
2028 2029 2030 2031 2032 2033 2034 2035
                    break;
                case OneField:
                    /* Every other line is stored and needs to be duplicated. */
                    av_log(mxf->fc, AV_LOG_INFO, "OneField frame layout isn't currently supported\n");
                    break; /* The correct thing to do here is fall through, but by breaking we might be
                              able to decode some streams at half the vertical resolution, rather than not al all.
                              It's also for compatibility with the old behavior. */
                case MixedFields:
2036
                    break;
2037
                case SegmentedFrame:
2038
                    st->codecpar->field_order = AV_FIELD_PROGRESSIVE;
2039
                case SeparateFields:
2040 2041
                    switch (descriptor->field_dominance) {
                    case MXF_TFF:
2042
                        st->codecpar->field_order = AV_FIELD_TT;
2043 2044
                        break;
                    case MXF_BFF:
2045
                        st->codecpar->field_order = AV_FIELD_BB;
2046 2047 2048 2049 2050
                        break;
                    default:
                        avpriv_request_sample(mxf->fc,
                                              "Field dominance %d support",
                                              descriptor->field_dominance);
2051
                    case 0: // we already have many samples with field_dominance == unknown
2052 2053
                        break;
                    }
2054
                    /* Turn field height into frame height. */
2055
                    st->codecpar->height *= 2;
2056
                    break;
2057 2058 2059
                default:
                    av_log(mxf->fc, AV_LOG_INFO, "Unknown frame layout type: %d\n", descriptor->frame_layout);
            }
2060 2061 2062
            if (st->codecpar->codec_id == AV_CODEC_ID_RAWVIDEO) {
                st->codecpar->format = descriptor->pix_fmt;
                if (st->codecpar->format == AV_PIX_FMT_NONE) {
2063 2064
                    pix_fmt_ul = mxf_get_codec_ul(ff_mxf_pixel_format_uls,
                                                  &descriptor->essence_codec_ul);
2065 2066 2067 2068 2069
                    st->codecpar->format = (enum AVPixelFormat)pix_fmt_ul->id;
                    if (st->codecpar->format== AV_PIX_FMT_NONE) {
                        st->codecpar->codec_tag = mxf_get_codec_ul(ff_mxf_codec_tag_uls,
                                                                   &descriptor->essence_codec_ul)->id;
                        if (!st->codecpar->codec_tag) {
2070 2071 2072 2073 2074
                            /* support files created before RP224v10 by defaulting to UYVY422
                               if subsampling is 4:2:2 and component depth is 8-bit */
                            if (descriptor->horiz_subsampling == 2 &&
                                descriptor->vert_subsampling == 1 &&
                                descriptor->component_depth == 8) {
2075
                                st->codecpar->format = AV_PIX_FMT_UYVY422;
2076
                            }
2077
                        }
2078 2079 2080
                    }
                }
            }
2081
            st->need_parsing = AVSTREAM_PARSE_HEADERS;
2082
            if (material_track->sequence->origin) {
2083
                av_dict_set_int(&st->metadata, "material_track_origin", material_track->sequence->origin, 0);
2084 2085
            }
            if (source_track->sequence->origin) {
2086
                av_dict_set_int(&st->metadata, "source_track_origin", source_track->sequence->origin, 0);
2087
            }
2088 2089
            if (descriptor->aspect_ratio.num && descriptor->aspect_ratio.den)
                st->display_aspect_ratio = descriptor->aspect_ratio;
2090
        } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2091
            container_ul = mxf_get_codec_ul(mxf_sound_essence_container_uls, essence_container_ul);
2092
            /* Only overwrite existing codec ID if it is unset or A-law, which is the default according to SMPTE RP 224. */
2093 2094
            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))
                st->codecpar->codec_id = (enum AVCodecID)container_ul->id;
2095 2096
            st->codecpar->channels = descriptor->channels;
            st->codecpar->bits_per_coded_sample = descriptor->bits_per_sample;
2097

2098
            if (descriptor->sample_rate.den > 0) {
2099
                st->codecpar->sample_rate = descriptor->sample_rate.num / descriptor->sample_rate.den;
2100
                avpriv_set_pts_info(st, 64, descriptor->sample_rate.den, descriptor->sample_rate.num);
2101
            } else {
2102
                av_log(mxf->fc, AV_LOG_WARNING, "invalid sample rate (%d/%d) "
Luca Barbato's avatar
Luca Barbato committed
2103
                       "found for stream #%d, time base forced to 1/48000\n",
2104 2105
                       descriptor->sample_rate.num, descriptor->sample_rate.den,
                       st->index);
2106 2107
                avpriv_set_pts_info(st, 64, 1, 48000);
            }
2108

2109 2110
            /* if duration is set, rescale it from EditRate to SampleRate */
            if (st->duration != AV_NOPTS_VALUE)
2111 2112 2113
                st->duration = av_rescale_q(st->duration,
                                            av_inv_q(material_track->edit_rate),
                                            st->time_base);
2114

2115
            /* TODO: implement AV_CODEC_ID_RAWAUDIO */
2116
            if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16LE) {
2117
                if (descriptor->bits_per_sample > 16 && descriptor->bits_per_sample <= 24)
2118
                    st->codecpar->codec_id = AV_CODEC_ID_PCM_S24LE;
2119
                else if (descriptor->bits_per_sample == 32)
2120 2121
                    st->codecpar->codec_id = AV_CODEC_ID_PCM_S32LE;
            } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE) {
2122
                if (descriptor->bits_per_sample > 16 && descriptor->bits_per_sample <= 24)
2123
                    st->codecpar->codec_id = AV_CODEC_ID_PCM_S24BE;
2124
                else if (descriptor->bits_per_sample == 32)
2125 2126
                    st->codecpar->codec_id = AV_CODEC_ID_PCM_S32BE;
            } else if (st->codecpar->codec_id == AV_CODEC_ID_MP2) {
2127 2128
                st->need_parsing = AVSTREAM_PARSE_FULL;
            }
2129
        } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
2130 2131 2132 2133 2134 2135 2136
            int codec_id = mxf_get_codec_ul(mxf_data_essence_container_uls,
                                            essence_container_ul)->id;
            if (codec_id >= 0 &&
                codec_id < FF_ARRAY_ELEMS(mxf_data_essence_descriptor)) {
                av_dict_set(&st->metadata, "data_type",
                            mxf_data_essence_descriptor[codec_id], 0);
            }
2137
        }
2138
        if (descriptor->extradata) {
2139
            if (!ff_alloc_extradata(st->codecpar, descriptor->extradata_size)) {
2140
                memcpy(st->codecpar->extradata, descriptor->extradata, descriptor->extradata_size);
2141
            }
2142
        } else if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
2143 2144 2145
            int coded_width = mxf_get_codec_ul(mxf_intra_only_picture_coded_width,
                                               &descriptor->essence_codec_ul)->id;
            if (coded_width)
2146
                st->codecpar->width = coded_width;
2147 2148 2149
            ret = ff_generate_avci_extradata(st);
            if (ret < 0)
                return ret;
2150
        }
2151
        if (st->codecpar->codec_type != AVMEDIA_TYPE_DATA && (*essence_container_ul)[15] > 0x01) {
2152 2153
            /* TODO: decode timestamps */
            st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS;
2154 2155
        }
    }
2156

2157
    ret = 0;
2158 2159
fail_and_free:
    return ret;
2160 2161
}

2162 2163
static int mxf_timestamp_to_str(uint64_t timestamp, char **str)
{
2164
    struct tm time = { 0 };
2165
    time.tm_year = (timestamp >> 48) - 1900;
2166 2167 2168 2169 2170
    time.tm_mon  = (timestamp >> 40 & 0xFF) - 1;
    time.tm_mday = (timestamp >> 32 & 0xFF);
    time.tm_hour = (timestamp >> 24 & 0xFF);
    time.tm_min  = (timestamp >> 16 & 0xFF);
    time.tm_sec  = (timestamp >> 8  & 0xFF);
2171

2172 2173 2174 2175 2176 2177 2178 2179
    /* msvcrt versions of strftime calls the invalid parameter handler
     * (aborting the process if one isn't set) if the parameters are out
     * of range. */
    time.tm_mon  = av_clip(time.tm_mon,  0, 11);
    time.tm_mday = av_clip(time.tm_mday, 1, 31);
    time.tm_hour = av_clip(time.tm_hour, 0, 23);
    time.tm_min  = av_clip(time.tm_min,  0, 59);
    time.tm_sec  = av_clip(time.tm_sec,  0, 59);
2180

2181 2182 2183
    *str = av_mallocz(32);
    if (!*str)
        return AVERROR(ENOMEM);
2184
    if (!strftime(*str, 32, "%Y-%m-%d %H:%M:%S", &time))
2185
        (*str)[0] = '\0';
2186 2187 2188 2189 2190

    return 0;
}

#define SET_STR_METADATA(pb, name, str) do { \
2191
    if ((ret = mxf_read_utf16be_string(pb, size, &str)) < 0) \
2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246
        return ret; \
    av_dict_set(&s->metadata, name, str, AV_DICT_DONT_STRDUP_VAL); \
} while (0)

#define SET_UID_METADATA(pb, name, var, str) do { \
    avio_read(pb, var, 16); \
    if ((ret = mxf_uid_to_str(var, &str)) < 0) \
        return ret; \
    av_dict_set(&s->metadata, name, str, AV_DICT_DONT_STRDUP_VAL); \
} while (0)

#define SET_TS_METADATA(pb, name, var, str) do { \
    var = avio_rb64(pb); \
    if ((ret = mxf_timestamp_to_str(var, &str)) < 0) \
        return ret; \
    av_dict_set(&s->metadata, name, str, AV_DICT_DONT_STRDUP_VAL); \
} while (0)

static int mxf_read_identification_metadata(void *arg, AVIOContext *pb, int tag, int size, UID _uid, int64_t klv_offset)
{
    MXFContext *mxf = arg;
    AVFormatContext *s = mxf->fc;
    int ret;
    UID uid = { 0 };
    char *str = NULL;
    uint64_t ts;
    switch (tag) {
    case 0x3C01:
        SET_STR_METADATA(pb, "company_name", str);
        break;
    case 0x3C02:
        SET_STR_METADATA(pb, "product_name", str);
        break;
    case 0x3C04:
        SET_STR_METADATA(pb, "product_version", str);
        break;
    case 0x3C05:
        SET_UID_METADATA(pb, "product_uid", uid, str);
        break;
    case 0x3C06:
        SET_TS_METADATA(pb, "modification_date", ts, str);
        break;
    case 0x3C08:
        SET_STR_METADATA(pb, "application_platform", str);
        break;
    case 0x3C09:
        SET_UID_METADATA(pb, "generation_uid", uid, str);
        break;
    case 0x3C0A:
        SET_UID_METADATA(pb, "uid", uid, str);
        break;
    }
    return 0;
}

2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259
static int mxf_read_preface_metadata(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
{
    MXFContext *mxf = arg;
    AVFormatContext *s = mxf->fc;
    int ret;
    char *str = NULL;

    if (tag >= 0x8000 && (IS_KLV_KEY(uid, mxf_avid_project_name))) {
        SET_STR_METADATA(pb, "project_name", str);
    }
    return 0;
}

2260
static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = {
Luca Barbato's avatar
Luca Barbato committed
2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x05,0x01,0x00 }, mxf_read_primer_pack },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x01,0x00 }, mxf_read_partition_pack },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x02,0x00 }, mxf_read_partition_pack },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x03,0x00 }, mxf_read_partition_pack },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x04,0x00 }, mxf_read_partition_pack },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x01,0x00 }, mxf_read_partition_pack },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x02,0x00 }, mxf_read_partition_pack },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x03,0x00 }, mxf_read_partition_pack },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x03,0x04,0x00 }, mxf_read_partition_pack },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x02,0x00 }, mxf_read_partition_pack },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }, mxf_read_partition_pack },
2272
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x2f,0x00 }, mxf_read_preface_metadata },
Luca Barbato's avatar
Luca Barbato committed
2273 2274
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x30,0x00 }, mxf_read_identification_metadata },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_content_storage, 0, AnyType },
2275 2276
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_package, sizeof(MXFPackage), SourcePackage },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_package, sizeof(MXFPackage), MaterialPackage },
2277
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0f,0x00 }, mxf_read_sequence, sizeof(MXFSequence), Sequence },
2278
    { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x05,0x00 }, mxf_read_essence_group, sizeof(MXFEssenceGroup), EssenceGroup},
Luca Barbato's avatar
Luca Barbato committed
2279
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_source_clip, sizeof(MXFStructuralComponent), SourceClip },
2280
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3f,0x00 }, mxf_read_tagged_value, sizeof(MXFTaggedValue), TaggedValue },
Luca Barbato's avatar
Luca Barbato committed
2281 2282 2283 2284 2285 2286
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), MultipleDescriptor },
    { { 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 */
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* CDCI */
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* RGBA */
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* Wave */
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* AES3 */
2287
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* MPEG2VideoDescriptor */
2288
    { { 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 */
Luca Barbato's avatar
Luca Barbato committed
2289
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x5e,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* MPEG2AudioDescriptor */
Luca Barbato's avatar
Luca Barbato committed
2290 2291
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Static Track */
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Generic Track */
2292
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x14,0x00 }, mxf_read_timecode_component, sizeof(MXFTimecodeComponent), TimecodeComponent },
2293
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0c,0x00 }, mxf_read_pulldown_component, sizeof(MXFPulldownComponent), PulldownComponent },
Luca Barbato's avatar
Luca Barbato committed
2294 2295
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 }, mxf_read_cryptographic_context, sizeof(MXFCryptoContext), CryptoContext },
    { { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 }, mxf_read_index_table_segment, sizeof(MXFIndexTableSegment), IndexTableSegment },
2296 2297 2298
    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType },
};

2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312
static int mxf_metadataset_init(MXFMetadataSet *ctx, enum MXFMetadataSetType type)
{
    switch (type){
    case MultipleDescriptor:
    case Descriptor:
        ((MXFDescriptor*)ctx)->pix_fmt = AV_PIX_FMT_NONE;
        ((MXFDescriptor*)ctx)->duration = AV_NOPTS_VALUE;
        break;
    default:
        break;
    }
    return 0;
}

2313
static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadFunc *read_child, int ctx_size, enum MXFMetadataSetType type)
2314
{
2315
    AVIOContext *pb = mxf->fc->pb;
2316
    MXFMetadataSet *ctx = ctx_size ? av_mallocz(ctx_size) : mxf;
2317
    uint64_t klv_end = avio_tell(pb) + klv->length;
2318 2319

    if (!ctx)
2320
        return AVERROR(ENOMEM);
2321
    mxf_metadataset_init(ctx, type);
2322
    while (avio_tell(pb) + 4 < klv_end && !avio_feof(pb)) {
2323
        int ret;
2324 2325
        int tag = avio_rb16(pb);
        int size = avio_rb16(pb); /* KLV specified by 0x53 */
2326
        uint64_t next = avio_tell(pb) + size;
2327 2328
        UID uid = {0};

2329
        av_log(mxf->fc, AV_LOG_TRACE, "local tag %#04x size %d\n", tag, size);
2330
        if (!size) { /* ignore empty tag, needed for some files with empty UMID tag */
2331
            av_log(mxf->fc, AV_LOG_ERROR, "local tag %#04x with 0 size\n", tag);
2332 2333 2334 2335 2336 2337 2338 2339
            continue;
        }
        if (tag > 0x7FFF) { /* dynamic tag */
            int i;
            for (i = 0; i < mxf->local_tags_count; i++) {
                int local_tag = AV_RB16(mxf->local_tags+i*18);
                if (local_tag == tag) {
                    memcpy(uid, mxf->local_tags+i*18+2, 16);
2340
                    av_log(mxf->fc, AV_LOG_TRACE, "local tag %#04x\n", local_tag);
2341 2342 2343 2344
                    PRINT_KEY(mxf->fc, "uid", uid);
                }
            }
        }
2345
        if (ctx_size && tag == 0x3C0A) {
2346
            avio_read(pb, ctx->uid, 16);
2347
        } else if ((ret = read_child(ctx, pb, tag, size, uid, -1)) < 0) {
2348
            mxf_free_metadataset(&ctx, !!ctx_size);
2349
            return ret;
2350
        }
2351

2352 2353
        /* Accept the 64k local set limit being exceeded (Avid). Don't accept
         * it extending past the end of the KLV though (zzuf5.mxf). */
2354
        if (avio_tell(pb) > klv_end) {
2355 2356
            if (ctx_size) {
                ctx->type = type;
2357
                mxf_free_metadataset(&ctx, !!ctx_size);
2358
            }
2359

2360 2361
            av_log(mxf->fc, AV_LOG_ERROR,
                   "local tag %#04x extends past end of local set @ %#"PRIx64"\n",
2362 2363 2364
                   tag, klv->offset);
            return AVERROR_INVALIDDATA;
        } else if (avio_tell(pb) <= next)   /* only seek forward, else this can loop for a long time */
2365
            avio_seek(pb, next, SEEK_SET);
2366 2367 2368 2369 2370
    }
    if (ctx_size) ctx->type = type;
    return ctx_size ? mxf_add_metadata_set(mxf, ctx) : 0;
}

2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415
/**
 * Matches any partition pack key, in other words:
 * - HeaderPartition
 * - BodyPartition
 * - FooterPartition
 * @return non-zero if the key is a partition pack key, zero otherwise
 */
static int mxf_is_partition_pack_key(UID key)
{
    //NOTE: this is a little lax since it doesn't constraint key[14]
    return !memcmp(key, mxf_header_partition_pack_key, 13) &&
            key[13] >= 2 && key[13] <= 4;
}

/**
 * Parses a metadata KLV
 * @return <0 on error, 0 otherwise
 */
static int mxf_parse_klv(MXFContext *mxf, KLVPacket klv, MXFMetadataReadFunc *read,
                                     int ctx_size, enum MXFMetadataSetType type)
{
    AVFormatContext *s = mxf->fc;
    int res;
    if (klv.key[5] == 0x53) {
        res = mxf_read_local_tags(mxf, &klv, read, ctx_size, type);
    } else {
        uint64_t next = avio_tell(s->pb) + klv.length;
        res = read(mxf, s->pb, 0, klv.length, klv.key, klv.offset);

        /* only seek forward, else this can loop for a long time */
        if (avio_tell(s->pb) > next) {
            av_log(s, AV_LOG_ERROR, "read past end of KLV @ %#"PRIx64"\n",
                   klv.offset);
            return AVERROR_INVALIDDATA;
        }

        avio_seek(s->pb, next, SEEK_SET);
    }
    if (res < 0) {
        av_log(s, AV_LOG_ERROR, "error reading header metadata\n");
        return res;
    }
    return 0;
}

2416
/**
2417
 * Seeks to the previous partition and parses it, if possible
2418 2419 2420 2421 2422
 * @return <= 0 if we should stop parsing, > 0 if we should keep going
 */
static int mxf_seek_to_previous_partition(MXFContext *mxf)
{
    AVIOContext *pb = mxf->fc->pb;
2423 2424 2425
    KLVPacket klv;
    int64_t current_partition_ofs;
    int ret;
2426 2427 2428 2429 2430 2431

    if (!mxf->current_partition ||
        mxf->run_in + mxf->current_partition->previous_partition <= mxf->last_forward_tell)
        return 0;   /* we've parsed all partitions */

    /* seek to previous partition */
2432
    current_partition_ofs = mxf->current_partition->pack_ofs;   //includes run-in
2433 2434 2435
    avio_seek(pb, mxf->run_in + mxf->current_partition->previous_partition, SEEK_SET);
    mxf->current_partition = NULL;

2436
    av_log(mxf->fc, AV_LOG_TRACE, "seeking to previous partition\n");
2437

2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463
    /* Make sure this is actually a PartitionPack, and if so parse it.
     * See deadlock2.mxf
     */
    if ((ret = klv_read_packet(&klv, pb)) < 0) {
        av_log(mxf->fc, AV_LOG_ERROR, "failed to read PartitionPack KLV\n");
        return ret;
    }

    if (!mxf_is_partition_pack_key(klv.key)) {
        av_log(mxf->fc, AV_LOG_ERROR, "PreviousPartition @ %" PRIx64 " isn't a PartitionPack\n", klv.offset);
        return AVERROR_INVALIDDATA;
    }

    /* We can't just check ofs >= current_partition_ofs because PreviousPartition
     * can point to just before the current partition, causing klv_read_packet()
     * to sync back up to it. See deadlock3.mxf
     */
    if (klv.offset >= current_partition_ofs) {
        av_log(mxf->fc, AV_LOG_ERROR, "PreviousPartition for PartitionPack @ %"
               PRIx64 " indirectly points to itself\n", current_partition_ofs);
        return AVERROR_INVALIDDATA;
    }

    if ((ret = mxf_parse_klv(mxf, klv, mxf_read_partition_pack, 0, 0)) < 0)
        return ret;

2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477
    return 1;
}

/**
 * Called when essence is encountered
 * @return <= 0 if we should stop parsing, > 0 if we should keep going
 */
static int mxf_parse_handle_essence(MXFContext *mxf)
{
    AVIOContext *pb = mxf->fc->pb;
    int64_t ret;

    if (mxf->parsing_backward) {
        return mxf_seek_to_previous_partition(mxf);
2478
    } else {
2479
        if (!mxf->footer_partition) {
2480
            av_log(mxf->fc, AV_LOG_TRACE, "no FooterPartition\n");
2481 2482
            return 0;
        }
2483

2484
        av_log(mxf->fc, AV_LOG_TRACE, "seeking to FooterPartition\n");
2485 2486 2487 2488 2489

        /* remember where we were so we don't end up seeking further back than this */
        mxf->last_forward_tell = avio_tell(pb);

        if (!pb->seekable) {
2490
            av_log(mxf->fc, AV_LOG_INFO, "file is not seekable - not parsing FooterPartition\n");
2491 2492 2493
            return -1;
        }

2494 2495
        /* seek to FooterPartition and parse backward */
        if ((ret = avio_seek(pb, mxf->run_in + mxf->footer_partition, SEEK_SET)) < 0) {
2496
            av_log(mxf->fc, AV_LOG_ERROR,
2497
                   "failed to seek to FooterPartition @ 0x%" PRIx64
2498
                   " (%"PRId64") - partial file?\n",
2499
                   mxf->run_in + mxf->footer_partition, ret);
2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518
            return ret;
        }

        mxf->current_partition = NULL;
        mxf->parsing_backward = 1;
    }

    return 1;
}

/**
 * Called when the next partition or EOF is encountered
 * @return <= 0 if we should stop parsing, > 0 if we should keep going
 */
static int mxf_parse_handle_partition_or_eof(MXFContext *mxf)
{
    return mxf->parsing_backward ? mxf_seek_to_previous_partition(mxf) : 1;
}

2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536
/**
 * Figures out the proper offset and length of the essence container in each partition
 */
static void mxf_compute_essence_containers(MXFContext *mxf)
{
    int x;

    /* everything is already correct */
    if (mxf->op == OPAtom)
        return;

    for (x = 0; x < mxf->partitions_count; x++) {
        MXFPartition *p = &mxf->partitions[x];

        if (!p->body_sid)
            continue;       /* BodySID == 0 -> no essence */

        if (x >= mxf->partitions_count - 1)
2537
            break;          /* FooterPartition - can't compute length (and we don't need to) */
2538 2539 2540 2541 2542 2543 2544

        /* essence container spans to the next partition */
        p->essence_length = mxf->partitions[x+1].this_partition - p->essence_offset;

        if (p->essence_length < 0) {
            /* next ThisPartition < essence_offset */
            p->essence_length = 0;
2545 2546
            av_log(mxf->fc, AV_LOG_ERROR,
                   "partition %i: bad ThisPartition = %"PRIX64"\n",
2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559
                   x+1, mxf->partitions[x+1].this_partition);
        }
    }
}

static int64_t round_to_kag(int64_t position, int kag_size)
{
    /* TODO: account for run-in? the spec isn't clear whether KAG should account for it */
    /* NOTE: kag_size may be any integer between 1 - 2^10 */
    int64_t ret = (position / kag_size) * kag_size;
    return ret == position ? ret : ret + kag_size;
}

2560
static int is_pcm(enum AVCodecID codec_id)
2561 2562
{
    /* we only care about "normal" PCM codecs until we get samples */
2563
    return codec_id >= AV_CODEC_ID_PCM_S16LE && codec_id < AV_CODEC_ID_PCM_S24DAUD;
2564 2565 2566
}

/**
2567 2568 2569
 * Deal with the case where for some audio atoms EditUnitByteCount is
 * very small (2, 4..). In those cases we should read more than one
 * sample per call to mxf_read_packet().
2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580
 */
static void mxf_handle_small_eubc(AVFormatContext *s)
{
    MXFContext *mxf = s->priv_data;

    /* assuming non-OPAtom == frame wrapped
     * no sane writer would wrap 2 byte PCM packets with 20 byte headers.. */
    if (mxf->op != OPAtom)
        return;

    /* expect PCM with exactly one index table segment and a small (< 32) EUBC */
2581
    if (s->nb_streams != 1                                     ||
2582 2583
        s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_AUDIO ||
        !is_pcm(s->streams[0]->codecpar->codec_id)                ||
2584 2585
        mxf->nb_index_tables != 1                              ||
        mxf->index_tables[0].nb_segments != 1                  ||
2586 2587 2588 2589
        mxf->index_tables[0].segments[0]->edit_unit_byte_count >= 32)
        return;

    /* arbitrarily default to 48 kHz PAL audio frame size */
2590 2591 2592
    /* TODO: We could compute this from the ratio between the audio
     *       and video edit rates for 48 kHz NTSC we could use the
     *       1802-1802-1802-1802-1801 pattern. */
2593 2594 2595
    mxf->edit_units_per_packet = 1920;
}

2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610
/**
 * Deal with the case where OPAtom files does not have any IndexTableSegments.
 */
static int mxf_handle_missing_index_segment(MXFContext *mxf)
{
    AVFormatContext *s = mxf->fc;
    AVStream *st = NULL;
    MXFIndexTableSegment *segment = NULL;
    MXFPartition *p = NULL;
    int essence_partition_count = 0;
    int i, ret;

    if (mxf->op != OPAtom)
        return 0;

Lou Logan's avatar
Lou Logan committed
2611
    /* TODO: support raw video without an index if they exist */
2612
    if (s->nb_streams != 1 || s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_AUDIO || !is_pcm(s->streams[0]->codecpar->codec_id))
2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638
        return 0;

    /* check if file already has a IndexTableSegment */
    for (i = 0; i < mxf->metadata_sets_count; i++) {
        if (mxf->metadata_sets[i]->type == IndexTableSegment)
            return 0;
    }

    /* find the essence partition */
    for (i = 0; i < mxf->partitions_count; i++) {
        /* BodySID == 0 -> no essence */
        if (!mxf->partitions[i].body_sid)
            continue;

        p = &mxf->partitions[i];
        essence_partition_count++;
    }

    /* only handle files with a single essence partition */
    if (essence_partition_count != 1)
        return 0;

    if (!(segment = av_mallocz(sizeof(*segment))))
        return AVERROR(ENOMEM);

    if ((ret = mxf_add_metadata_set(mxf, segment))) {
2639
        mxf_free_metadataset((MXFMetadataSet**)&segment, 1);
2640 2641 2642 2643 2644 2645
        return ret;
    }

    st = s->streams[0];
    segment->type = IndexTableSegment;
    /* stream will be treated as small EditUnitByteCount */
2646
    segment->edit_unit_byte_count = (av_get_bits_per_sample(st->codecpar->codec_id) * st->codecpar->channels) >> 3;
2647 2648 2649 2650 2651 2652 2653
    segment->index_start_position = 0;
    segment->index_duration = s->streams[0]->duration;
    segment->index_sid = p->index_sid;
    segment->body_sid = p->body_sid;
    return 0;
}

2654 2655 2656 2657
static void mxf_read_random_index_pack(AVFormatContext *s)
{
    MXFContext *mxf = s->priv_data;
    uint32_t length;
2658
    int64_t file_size, max_rip_length, min_rip_length;
2659 2660 2661 2662 2663 2664
    KLVPacket klv;

    if (!s->pb->seekable)
        return;

    file_size = avio_size(s->pb);
2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680

    /* S377m says to check the RIP length for "silly" values, without defining "silly".
     * The limit below assumes a file with nothing but partition packs and a RIP.
     * Before changing this, consider that a muxer may place each sample in its own partition.
     *
     * 105 is the size of the smallest possible PartitionPack
     * 12 is the size of each RIP entry
     * 28 is the size of the RIP header and footer, assuming an 8-byte BER
     */
    max_rip_length = ((file_size - mxf->run_in) / 105) * 12 + 28;
    max_rip_length = FFMIN(max_rip_length, INT_MAX); //2 GiB and up is also silly

    /* We're only interested in RIPs with at least two entries.. */
    min_rip_length = 16+1+24+4;

    /* See S377m section 11 */
2681 2682
    avio_seek(s->pb, file_size - 4, SEEK_SET);
    length = avio_rb32(s->pb);
2683 2684

    if (length < min_rip_length || length > max_rip_length)
2685 2686 2687 2688 2689 2690 2691 2692
        goto end;
    avio_seek(s->pb, file_size - length, SEEK_SET);
    if (klv_read_packet(&klv, s->pb) < 0 ||
        !IS_KLV_KEY(klv.key, mxf_random_index_pack_key) ||
        klv.length != length - 20)
        goto end;

    avio_skip(s->pb, klv.length - 12);
2693
    mxf->footer_partition = avio_rb64(s->pb);
2694

2695 2696 2697 2698 2699 2700
    /* sanity check */
    if (mxf->run_in + mxf->footer_partition >= file_size) {
        av_log(s, AV_LOG_WARNING, "bad FooterPartition in RIP - ignoring\n");
        mxf->footer_partition = 0;
    }

2701 2702 2703 2704
end:
    avio_seek(s->pb, mxf->run_in, SEEK_SET);
}

2705
static int mxf_read_header(AVFormatContext *s)
2706 2707 2708
{
    MXFContext *mxf = s->priv_data;
    KLVPacket klv;
2709
    int64_t essence_offset = 0;
2710
    int ret;
2711

2712
    mxf->last_forward_tell = INT64_MAX;
2713
    mxf->edit_units_per_packet = 1;
2714

2715 2716
    if (!mxf_read_sync(s->pb, mxf_header_partition_pack_key, 14)) {
        av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n");
2717
        return AVERROR_INVALIDDATA;
2718
    }
2719
    avio_seek(s->pb, -14, SEEK_CUR);
2720
    mxf->fc = s;
2721 2722
    mxf->run_in = avio_tell(s->pb);

2723 2724
    mxf_read_random_index_pack(s);

2725
    while (!avio_feof(s->pb)) {
2726
        const MXFMetadataReadTableEntry *metadata;
2727

2728 2729 2730 2731 2732 2733 2734 2735
        if (klv_read_packet(&klv, s->pb) < 0) {
            /* EOF - seek to previous partition or stop */
            if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
                break;
            else
                continue;
        }

2736
        PRINT_KEY(s, "read header", klv.key);
2737
        av_log(s, AV_LOG_TRACE, "size %"PRIu64" offset %#"PRIx64"\n", klv.length, klv.offset);
2738
        if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key) ||
2739
            IS_KLV_KEY(klv.key, mxf_essence_element_key) ||
2740
            IS_KLV_KEY(klv.key, mxf_avid_essence_element_key) ||
2741
            IS_KLV_KEY(klv.key, mxf_system_item_key)) {
2742 2743 2744 2745 2746 2747

            if (!mxf->current_partition) {
                av_log(mxf->fc, AV_LOG_ERROR, "found essence prior to first PartitionPack\n");
                return AVERROR_INVALIDDATA;
            }

2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771
            if (!mxf->current_partition->essence_offset) {
                /* for OP1a we compute essence_offset
                 * for OPAtom we point essence_offset after the KL (usually op1a_essence_offset + 20 or 25)
                 * TODO: for OP1a we could eliminate this entire if statement, always stopping parsing at op1a_essence_offset
                 *       for OPAtom we still need the actual essence_offset though (the KL's length can vary)
                 */
                int64_t op1a_essence_offset =
                    round_to_kag(mxf->current_partition->this_partition +
                                 mxf->current_partition->pack_length,       mxf->current_partition->kag_size) +
                    round_to_kag(mxf->current_partition->header_byte_count, mxf->current_partition->kag_size) +
                    round_to_kag(mxf->current_partition->index_byte_count,  mxf->current_partition->kag_size);

                if (mxf->op == OPAtom) {
                    /* point essence_offset to the actual data
                    * OPAtom has all the essence in one big KLV
                    */
                    mxf->current_partition->essence_offset = avio_tell(s->pb);
                    mxf->current_partition->essence_length = klv.length;
                } else {
                    /* NOTE: op1a_essence_offset may be less than to klv.offset (C0023S01.mxf)  */
                    mxf->current_partition->essence_offset = op1a_essence_offset;
                }
            }

2772 2773
            if (!essence_offset)
                essence_offset = klv.offset;
2774 2775 2776 2777

            /* seek to footer, previous partition or stop */
            if (mxf_parse_handle_essence(mxf) <= 0)
                break;
2778
            continue;
2779
        } else if (mxf_is_partition_pack_key(klv.key) && mxf->current_partition) {
2780 2781 2782
            /* next partition pack - keep going, seek to previous partition or stop */
            if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
                break;
2783 2784 2785
            else if (mxf->parsing_backward)
                continue;
            /* we're still parsing forward. proceed to parsing this partition pack */
2786
        }
2787 2788 2789

        for (metadata = mxf_metadata_read_table; metadata->read; metadata++) {
            if (IS_KLV_KEY(klv.key, metadata->key)) {
2790
                if ((ret = mxf_parse_klv(mxf, klv, metadata->read, metadata->ctx_size, metadata->type)) < 0)
2791
                    goto fail;
2792 2793 2794
                break;
            }
        }
2795 2796 2797
        if (!metadata->read) {
            av_log(s, AV_LOG_VERBOSE, "Dark key " PRIxUID "\n",
                            UID_ARG(klv.key));
2798
            avio_skip(s->pb, klv.length);
2799
        }
2800
    }
2801
    /* FIXME avoid seek */
2802
    if (!essence_offset)  {
2803
        av_log(s, AV_LOG_ERROR, "no essence\n");
2804 2805
        ret = AVERROR_INVALIDDATA;
        goto fail;
2806
    }
2807
    avio_seek(s->pb, essence_offset, SEEK_SET);
2808 2809 2810

    mxf_compute_essence_containers(mxf);

2811 2812 2813
    /* we need to do this before computing the index tables
     * to be able to fill in zero IndexDurations with st->duration */
    if ((ret = mxf_parse_structural_metadata(mxf)) < 0)
2814
        goto fail;
2815

2816
    mxf_handle_missing_index_segment(mxf);
2817
    if ((ret = mxf_compute_index_tables(mxf)) < 0)
2818
        goto fail;
2819 2820 2821 2822 2823 2824 2825

    if (mxf->nb_index_tables > 1) {
        /* TODO: look up which IndexSID to use via EssenceContainerData */
        av_log(mxf->fc, AV_LOG_INFO, "got %i index tables - only the first one (IndexSID %i) will be used\n",
               mxf->nb_index_tables, mxf->index_tables[0].index_sid);
    } else if (mxf->nb_index_tables == 0 && mxf->op == OPAtom) {
        av_log(mxf->fc, AV_LOG_ERROR, "cannot demux OPAtom without an index\n");
2826 2827
        ret = AVERROR_INVALIDDATA;
        goto fail;
2828 2829
    }

2830 2831
    mxf_handle_small_eubc(s);

2832
    return 0;
2833 2834 2835 2836
fail:
    mxf_read_close(s);

    return ret;
2837 2838
}

2839
/**
2840 2841
 * Sets mxf->current_edit_unit based on what offset we're currently at.
 * @return next_ofs if OK, <0 on error
2842
 */
2843
static int64_t mxf_set_current_edit_unit(MXFContext *mxf, int64_t current_offset)
2844
{
2845
    int64_t last_ofs = -1, next_ofs = -1;
2846 2847
    MXFIndexTable *t = &mxf->index_tables[0];

2848 2849
    /* this is called from the OP1a demuxing logic, which means there
     * may be no index tables */
2850
    if (mxf->nb_index_tables <= 0)
2851
        return -1;
2852

2853
    /* find mxf->current_edit_unit so that the next edit unit starts ahead of current_offset */
2854
    while (mxf->current_edit_unit >= 0) {
2855
        if (mxf_edit_unit_absolute_offset(mxf, t, mxf->current_edit_unit + 1, NULL, &next_ofs, 0) < 0)
2856
            return -1;
2857

2858
        if (next_ofs <= last_ofs) {
2859 2860 2861 2862
            /* large next_ofs didn't change or current_edit_unit wrapped
             * around this fixes the infinite loop on zzuf3.mxf */
            av_log(mxf->fc, AV_LOG_ERROR,
                   "next_ofs didn't change. not deriving packet timestamps\n");
2863
            return -1;
2864 2865
        }

2866
        if (next_ofs > current_offset)
2867 2868
            break;

2869
        last_ofs = next_ofs;
2870 2871 2872
        mxf->current_edit_unit++;
    }

2873 2874 2875
    /* not checking mxf->current_edit_unit >= t->nb_ptses here since CBR files may lack IndexEntryArrays */
    if (mxf->current_edit_unit < 0)
        return -1;
2876

2877
    return next_ofs;
2878 2879
}

2880 2881
static int mxf_compute_sample_count(MXFContext *mxf, int stream_index,
                                    uint64_t *sample_count)
2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892
{
    int i, total = 0, size = 0;
    AVStream *st = mxf->fc->streams[stream_index];
    MXFTrack *track = st->priv_data;
    AVRational time_base = av_inv_q(track->edit_rate);
    AVRational sample_rate = av_inv_q(st->time_base);
    const MXFSamplesPerFrame *spf = NULL;

    if ((sample_rate.num / sample_rate.den) == 48000)
        spf = ff_mxf_get_samples_per_frame(mxf->fc, time_base);
    if (!spf) {
2893 2894
        int remainder = (sample_rate.num * time_base.num) %
                        (time_base.den * sample_rate.den);
2895 2896 2897 2898
        *sample_count = av_q2d(av_mul_q((AVRational){mxf->current_edit_unit, 1},
                                        av_mul_q(sample_rate, time_base)));
        if (remainder)
            av_log(mxf->fc, AV_LOG_WARNING,
2899 2900 2901 2902
                   "seeking detected on stream #%d with time base (%d/%d) and "
                   "sample rate (%d/%d), audio pts won't be accurate.\n",
                   stream_index, time_base.num, time_base.den,
                   sample_rate.num, sample_rate.den);
2903 2904 2905 2906 2907 2908 2909 2910 2911 2912
        return 0;
    }

    while (spf->samples_per_frame[size]) {
        total += spf->samples_per_frame[size];
        size++;
    }

    av_assert2(size);

2913
    *sample_count = (mxf->current_edit_unit / size) * (uint64_t)total;
2914 2915 2916 2917 2918 2919 2920
    for (i = 0; i < mxf->current_edit_unit % size; i++) {
        *sample_count += spf->samples_per_frame[i];
    }

    return 0;
}

2921
static int mxf_set_audio_pts(MXFContext *mxf, AVCodecParameters *par,
2922
                             AVPacket *pkt)
2923 2924
{
    MXFTrack *track = mxf->fc->streams[pkt->stream_index]->priv_data;
2925
    int64_t bits_per_sample = par->bits_per_coded_sample;
Luca Barbato's avatar
Luca Barbato committed
2926 2927

    if (!bits_per_sample)
2928
        bits_per_sample = av_get_bits_per_sample(par->codec_id);
2929

2930
    pkt->pts = track->sample_count;
2931

2932
    if (   par->channels <= 0
2933
        || bits_per_sample <= 0
2934
        || par->channels * (int64_t)bits_per_sample < 8)
2935
        return AVERROR(EINVAL);
2936
    track->sample_count += pkt->size / (par->channels * (int64_t)bits_per_sample / 8);
2937 2938 2939
    return 0;
}

2940 2941 2942
static int mxf_read_packet_old(AVFormatContext *s, AVPacket *pkt)
{
    KLVPacket klv;
2943
    MXFContext *mxf = s->priv_data;
2944
    int ret;
2945

2946
    while ((ret = klv_read_packet(&klv, s->pb)) == 0) {
2947
        PRINT_KEY(s, "read packet", klv.key);
2948
        av_log(s, AV_LOG_TRACE, "size %"PRIu64" offset %#"PRIx64"\n", klv.length, klv.offset);
2949
        if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key)) {
2950 2951
            ret = mxf_decrypt_triplet(s, pkt, &klv);
            if (ret < 0) {
2952
                av_log(s, AV_LOG_ERROR, "invalid encoded triplet\n");
2953
                return ret;
2954 2955 2956 2957
            }
            return 0;
        }
        if (IS_KLV_KEY(klv.key, mxf_essence_element_key) ||
2958
            IS_KLV_KEY(klv.key, mxf_canopus_essence_element_key) ||
2959 2960
            IS_KLV_KEY(klv.key, mxf_avid_essence_element_key)) {
            int index = mxf_get_stream_index(s, &klv);
2961
            int64_t next_ofs, next_klv;
2962 2963
            AVStream *st;
            MXFTrack *track;
2964
            AVCodecParameters *par;
2965

2966
            if (index < 0) {
2967 2968 2969
                av_log(s, AV_LOG_ERROR,
                       "error getting stream index %"PRIu32"\n",
                       AV_RB32(klv.key + 12));
2970 2971
                goto skip;
            }
2972 2973 2974 2975

            st = s->streams[index];
            track = st->priv_data;

2976 2977
            if (s->streams[index]->discard == AVDISCARD_ALL)
                goto skip;
2978 2979 2980 2981 2982 2983 2984

            next_klv = avio_tell(s->pb) + klv.length;
            next_ofs = mxf_set_current_edit_unit(mxf, klv.offset);

            if (next_ofs >= 0 && next_klv > next_ofs) {
                /* if this check is hit then it's possible OPAtom was treated as OP1a
                 * truncate the packet since it's probably very large (>2 GiB is common) */
2985
                avpriv_request_sample(s,
2986
                                      "OPAtom misinterpreted as OP1a? "
2987 2988
                                      "KLV for edit unit %i extending into "
                                      "next edit unit",
2989
                                      mxf->current_edit_unit);
2990 2991 2992
                klv.length = next_ofs - avio_tell(s->pb);
            }

2993 2994
            /* check for 8 channels AES3 element */
            if (klv.key[12] == 0x06 && klv.key[13] == 0x01 && klv.key[14] == 0x10) {
2995 2996 2997
                ret = mxf_get_d10_aes3_packet(s->pb, s->streams[index],
                                              pkt, klv.length);
                if (ret < 0) {
2998
                    av_log(s, AV_LOG_ERROR, "error reading D-10 aes3 frame\n");
2999
                    return ret;
3000 3001
                }
            } else {
3002
                ret = av_get_packet(s->pb, pkt, klv.length);
3003 3004 3005 3006 3007
                if (ret < 0)
                    return ret;
            }
            pkt->stream_index = index;
            pkt->pos = klv.offset;
3008

3009
            par = st->codecpar;
3010

3011
            if (par->codec_type == AVMEDIA_TYPE_VIDEO && next_ofs >= 0) {
3012 3013
                /* mxf->current_edit_unit good - see if we have an
                 * index table to derive timestamps from */
3014 3015 3016 3017 3018
                MXFIndexTable *t = &mxf->index_tables[0];

                if (mxf->nb_index_tables >= 1 && mxf->current_edit_unit < t->nb_ptses) {
                    pkt->dts = mxf->current_edit_unit + t->first_dts;
                    pkt->pts = t->ptses[mxf->current_edit_unit];
3019 3020 3021 3022
                } else if (track->intra_only) {
                    /* intra-only -> PTS = EditUnit.
                     * let utils.c figure out DTS since it can be < PTS if low_delay = 0 (Sony IMX30) */
                    pkt->pts = mxf->current_edit_unit;
3023
                }
3024 3025
            } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
                ret = mxf_set_audio_pts(mxf, par, pkt);
3026 3027
                if (ret < 0)
                    return ret;
3028 3029 3030 3031
            }

            /* seek for truncated packets */
            avio_seek(s->pb, next_klv, SEEK_SET);
3032

3033 3034 3035 3036 3037
            return 0;
        } else
        skip:
            avio_skip(s->pb, klv.length);
    }
3038
    return avio_feof(s->pb) ? AVERROR_EOF : ret;
3039 3040 3041 3042 3043
}

static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
{
    MXFContext *mxf = s->priv_data;
3044 3045
    int ret, size;
    int64_t ret64, pos, next_pos;
3046
    AVStream *st;
3047
    MXFIndexTable *t;
3048
    int edit_units;
3049

3050
    if (mxf->op != OPAtom)
3051 3052
        return mxf_read_packet_old(s, pkt);

3053 3054 3055 3056
    // If we have no streams then we basically are at EOF
    if (s->nb_streams < 1)
        return AVERROR_EOF;

3057
    /* OPAtom - clip wrapped demuxing */
3058
    /* NOTE: mxf_read_header() makes sure nb_index_tables > 0 for OPAtom */
3059 3060
    st = s->streams[0];
    t = &mxf->index_tables[0];
3061

3062
    if (mxf->current_edit_unit >= st->duration)
3063 3064
        return AVERROR_EOF;

3065 3066
    edit_units = FFMIN(mxf->edit_units_per_packet, st->duration - mxf->current_edit_unit);

3067 3068
    if ((ret = mxf_edit_unit_absolute_offset(mxf, t, mxf->current_edit_unit, NULL, &pos, 1)) < 0)
        return ret;
3069

3070 3071
    /* compute size by finding the next edit unit or the end of the essence container
     * not pretty, but it works */
3072
    if ((ret = mxf_edit_unit_absolute_offset(mxf, t, mxf->current_edit_unit + edit_units, NULL, &next_pos, 0)) < 0 &&
3073 3074 3075 3076
        (next_pos = mxf_essence_container_end(mxf, t->body_sid)) <= 0) {
        av_log(s, AV_LOG_ERROR, "unable to compute the size of the last packet\n");
        return AVERROR_INVALIDDATA;
    }
3077

3078 3079 3080 3081
    if ((size = next_pos - pos) <= 0) {
        av_log(s, AV_LOG_ERROR, "bad size: %i\n", size);
        return AVERROR_INVALIDDATA;
    }
3082

3083 3084
    if ((ret64 = avio_seek(s->pb, pos, SEEK_SET)) < 0)
        return ret64;
3085

3086 3087
    if ((size = av_get_packet(s->pb, pkt, size)) < 0)
        return size;
3088

3089 3090
    pkt->stream_index = 0;

3091
    if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && t->ptses &&
3092 3093 3094
        mxf->current_edit_unit >= 0 && mxf->current_edit_unit < t->nb_ptses) {
        pkt->dts = mxf->current_edit_unit + t->first_dts;
        pkt->pts = t->ptses[mxf->current_edit_unit];
3095 3096
    } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
        int ret = mxf_set_audio_pts(mxf, st->codecpar, pkt);
3097 3098
        if (ret < 0)
            return ret;
3099 3100
    }

3101
    mxf->current_edit_unit += edit_units;
3102 3103 3104 3105

    return 0;
}

3106 3107 3108
static int mxf_read_close(AVFormatContext *s)
{
    MXFContext *mxf = s->priv_data;
3109
    int i;
3110 3111

    av_freep(&mxf->packages_refs);
3112 3113 3114 3115

    for (i = 0; i < s->nb_streams; i++)
        s->streams[i]->priv_data = NULL;

3116
    for (i = 0; i < mxf->metadata_sets_count; i++) {
3117
        mxf_free_metadataset(mxf->metadata_sets + i, 1);
3118
    }
Tomas Härdin's avatar
Tomas Härdin committed
3119
    av_freep(&mxf->partitions);
3120 3121 3122
    av_freep(&mxf->metadata_sets);
    av_freep(&mxf->aesc);
    av_freep(&mxf->local_tags);
3123

3124 3125 3126 3127 3128
    if (mxf->index_tables) {
        for (i = 0; i < mxf->nb_index_tables; i++) {
            av_freep(&mxf->index_tables[i].segments);
            av_freep(&mxf->index_tables[i].ptses);
            av_freep(&mxf->index_tables[i].fake_index);
3129
            av_freep(&mxf->index_tables[i].offsets);
3130
        }
3131
    }
3132 3133
    av_freep(&mxf->index_tables);

3134 3135 3136 3137
    return 0;
}

static int mxf_probe(AVProbeData *p) {
3138 3139
    const uint8_t *bufp = p->buf;
    const uint8_t *end = p->buf + p->buf_size;
3140 3141 3142 3143 3144 3145

    if (p->buf_size < sizeof(mxf_header_partition_pack_key))
        return 0;

    /* Must skip Run-In Sequence and search for MXF header partition pack key SMPTE 377M 5.5 */
    end -= sizeof(mxf_header_partition_pack_key);
3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156

    for (; bufp < end;) {
        if (!((bufp[13] - 1) & 0xF2)){
            if (AV_RN32(bufp   ) == AV_RN32(mxf_header_partition_pack_key   ) &&
                AV_RN32(bufp+ 4) == AV_RN32(mxf_header_partition_pack_key+ 4) &&
                AV_RN32(bufp+ 8) == AV_RN32(mxf_header_partition_pack_key+ 8) &&
                AV_RN16(bufp+12) == AV_RN16(mxf_header_partition_pack_key+12))
                return AVPROBE_SCORE_MAX;
            bufp ++;
        } else
            bufp += 10;
3157
    }
3158

3159 3160 3161 3162 3163 3164 3165 3166 3167
    return 0;
}

/* rudimentary byte seek */
/* XXX: use MXF Index */
static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
{
    AVStream *st = s->streams[stream_index];
    int64_t seconds;
3168 3169
    MXFContext* mxf = s->priv_data;
    int64_t seekpos;
3170
    int i, ret;
3171
    MXFIndexTable *t;
3172 3173 3174
    MXFTrack *source_track = st->priv_data;

    /* if audio then truncate sample_time to EditRate */
3175
    if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
3176 3177
        sample_time = av_rescale_q(sample_time, st->time_base,
                                   av_inv_q(source_track->edit_rate));
3178

3179
    if (mxf->nb_index_tables <= 0) {
3180
    if (!s->bit_rate)
3181
        return AVERROR_INVALIDDATA;
3182 3183 3184
    if (sample_time < 0)
        sample_time = 0;
    seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den);
3185

3186 3187 3188 3189
    seekpos = avio_seek(s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET);
    if (seekpos < 0)
        return seekpos;

3190
    ff_update_cur_dts(s, st, sample_time);
3191
    mxf->current_edit_unit = sample_time;
3192
    } else {
3193
        t = &mxf->index_tables[0];
3194

3195 3196 3197
        /* clamp above zero, else ff_index_search_timestamp() returns negative
         * this also means we allow seeking before the start */
        sample_time = FFMAX(sample_time, 0);
3198

3199
        if (t->fake_index) {
3200 3201 3202 3203 3204 3205 3206 3207 3208 3209
            /* The first frames may not be keyframes in presentation order, so
             * we have to advance the target to be able to find the first
             * keyframe backwards... */
            if (!(flags & AVSEEK_FLAG_ANY) &&
                (flags & AVSEEK_FLAG_BACKWARD) &&
                t->ptses[0] != AV_NOPTS_VALUE &&
                sample_time < t->ptses[0] &&
                (t->fake_index[t->ptses[0]].flags & AVINDEX_KEYFRAME))
                sample_time = t->ptses[0];

3210 3211 3212
            /* behave as if we have a proper index */
            if ((sample_time = ff_index_search_timestamp(t->fake_index, t->nb_ptses, sample_time, flags)) < 0)
                return sample_time;
3213 3214
            /* get the stored order index from the display order index */
            sample_time += t->offsets[sample_time];
3215 3216 3217
        } else {
            /* no IndexEntryArray (one or more CBR segments)
             * make sure we don't seek past the end */
3218
            sample_time = FFMIN(sample_time, source_track->original_duration - 1);
3219 3220
        }

3221
        if ((ret = mxf_edit_unit_absolute_offset(mxf, t, sample_time, &sample_time, &seekpos, 1)) < 0)
3222 3223
            return ret;

3224
        ff_update_cur_dts(s, st, sample_time);
3225
        mxf->current_edit_unit = sample_time;
3226 3227
        avio_seek(s->pb, seekpos, SEEK_SET);
    }
3228 3229 3230 3231 3232 3233

    // Update all tracks sample count
    for (i = 0; i < s->nb_streams; i++) {
        AVStream *cur_st = s->streams[i];
        MXFTrack *cur_track = cur_st->priv_data;
        uint64_t current_sample_count = 0;
3234
        if (cur_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
3235 3236 3237 3238 3239 3240 3241
            ret = mxf_compute_sample_count(mxf, i, &current_sample_count);
            if (ret < 0)
                return ret;

            cur_track->sample_count = current_sample_count;
        }
    }
3242 3243 3244
    return 0;
}

3245
AVInputFormat ff_mxf_demuxer = {
3246
    .name           = "mxf",
3247
    .long_name      = NULL_IF_CONFIG_SMALL("MXF (Material eXchange Format)"),
3248
    .flags          = AVFMT_SEEK_TO_PTS,
3249 3250 3251 3252 3253 3254
    .priv_data_size = sizeof(MXFContext),
    .read_probe     = mxf_probe,
    .read_header    = mxf_read_header,
    .read_packet    = mxf_read_packet,
    .read_close     = mxf_read_close,
    .read_seek      = mxf_read_seek,
3255
};