⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mxf.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 3 页
字号:
                if (mxf_get_d10_aes3_packet(s->pb, s->streams[index], pkt, klv.length) < 0) {                    av_log(s, AV_LOG_ERROR, "error reading D-10 aes3 frame\n");                    return -1;                }            } else                av_get_packet(s->pb, pkt, klv.length);            pkt->stream_index = index;            pkt->pos = klv.offset;            return 0;        } else            url_fskip(s->pb, klv.length);    }    return AVERROR(EIO);}static int mxf_read_primer_pack(MXFContext *mxf){    ByteIOContext *pb = mxf->fc->pb;    int item_num = get_be32(pb);    int item_len = get_be32(pb);    if (item_len != 18) {        av_log(mxf->fc, AV_LOG_ERROR, "unsupported primer pack item length\n");        return -1;    }    if (item_num > UINT_MAX / item_len)        return -1;    mxf->local_tags_count = item_num;    mxf->local_tags = av_malloc(item_num*item_len);    if (!mxf->local_tags)        return -1;    get_buffer(pb, mxf->local_tags, item_num*item_len);    return 0;}static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set){    mxf->metadata_sets = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets));    if (!mxf->metadata_sets)        return -1;    mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;    mxf->metadata_sets_count++;    return 0;}static int mxf_read_cryptographic_context(MXFCryptoContext *cryptocontext, ByteIOContext *pb, int tag, int size, UID uid){    if (size != 16)        return -1;    if (IS_KLV_KEY(uid, mxf_crypto_source_container_ul))        get_buffer(pb, cryptocontext->source_container_ul, 16);    return 0;}static int mxf_read_content_storage(MXFContext *mxf, ByteIOContext *pb, int tag){    switch (tag) {    case 0x1901:        mxf->packages_count = get_be32(pb);        if (mxf->packages_count >= UINT_MAX / sizeof(UID))            return -1;        mxf->packages_refs = av_malloc(mxf->packages_count * sizeof(UID));        if (!mxf->packages_refs)            return -1;        url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */        get_buffer(pb, (uint8_t *)mxf->packages_refs, mxf->packages_count * sizeof(UID));        break;    }    return 0;}static int mxf_read_source_clip(MXFStructuralComponent *source_clip, ByteIOContext *pb, int tag){    switch(tag) {    case 0x0202:        source_clip->duration = get_be64(pb);        break;    case 0x1201:        source_clip->start_position = get_be64(pb);        break;    case 0x1101:        /* UMID, only get last 16 bytes */        url_fskip(pb, 16);        get_buffer(pb, source_clip->source_package_uid, 16);        break;    case 0x1102:        source_clip->source_track_id = get_be32(pb);        break;    }    return 0;}static int mxf_read_material_package(MXFPackage *package, ByteIOContext *pb, int tag){    switch(tag) {    case 0x4403:        package->tracks_count = get_be32(pb);        if (package->tracks_count >= UINT_MAX / sizeof(UID))            return -1;        package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID));        if (!package->tracks_refs)            return -1;        url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */        get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID));        break;    }    return 0;}static int mxf_read_track(MXFTrack *track, ByteIOContext *pb, int tag){    switch(tag) {    case 0x4801:        track->track_id = get_be32(pb);        break;    case 0x4804:        get_buffer(pb, track->track_number, 4);        break;    case 0x4B01:        track->edit_rate.den = get_be32(pb);        track->edit_rate.num = get_be32(pb);        break;    case 0x4803:        get_buffer(pb, track->sequence_ref, 16);        break;    }    return 0;}static int mxf_read_sequence(MXFSequence *sequence, ByteIOContext *pb, int tag){    switch(tag) {    case 0x0202:        sequence->duration = get_be64(pb);        break;    case 0x0201:        get_buffer(pb, sequence->data_definition_ul, 16);        break;    case 0x1001:        sequence->structural_components_count = get_be32(pb);        if (sequence->structural_components_count >= UINT_MAX / sizeof(UID))            return -1;        sequence->structural_components_refs = av_malloc(sequence->structural_components_count * sizeof(UID));        if (!sequence->structural_components_refs)            return -1;        url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */        get_buffer(pb, (uint8_t *)sequence->structural_components_refs, sequence->structural_components_count * sizeof(UID));        break;    }    return 0;}static int mxf_read_source_package(MXFPackage *package, ByteIOContext *pb, int tag){    switch(tag) {    case 0x4403:        package->tracks_count = get_be32(pb);        if (package->tracks_count >= UINT_MAX / sizeof(UID))            return -1;        package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID));        if (!package->tracks_refs)            return -1;        url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */        get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID));        break;    case 0x4401:        /* UMID, only get last 16 bytes */        url_fskip(pb, 16);        get_buffer(pb, package->package_uid, 16);        break;    case 0x4701:        get_buffer(pb, package->descriptor_ref, 16);        break;    }    return 0;}static void mxf_read_pixel_layout(ByteIOContext *pb, MXFDescriptor *descriptor){    int code;    do {        code = get_byte(pb);        dprintf(NULL, "pixel layout: code 0x%x\n", code);        switch (code) {        case 0x52: /* R */            descriptor->bits_per_sample += get_byte(pb);            break;        case 0x47: /* G */            descriptor->bits_per_sample += get_byte(pb);            break;        case 0x42: /* B */            descriptor->bits_per_sample += get_byte(pb);            break;        default:            get_byte(pb);        }    } while (code != 0); /* SMPTE 377M E.2.46 */}static int mxf_read_generic_descriptor(MXFDescriptor *descriptor, ByteIOContext *pb, int tag, int size, UID uid){    switch(tag) {    case 0x3F01:        descriptor->sub_descriptors_count = get_be32(pb);        if (descriptor->sub_descriptors_count >= UINT_MAX / sizeof(UID))            return -1;        descriptor->sub_descriptors_refs = av_malloc(descriptor->sub_descriptors_count * sizeof(UID));        if (!descriptor->sub_descriptors_refs)            return -1;        url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */        get_buffer(pb, (uint8_t *)descriptor->sub_descriptors_refs, descriptor->sub_descriptors_count * sizeof(UID));        break;    case 0x3004:        get_buffer(pb, descriptor->essence_container_ul, 16);        break;    case 0x3006:        descriptor->linked_track_id = get_be32(pb);        break;    case 0x3201: /* PictureEssenceCoding */        get_buffer(pb, descriptor->essence_codec_ul, 16);        break;    case 0x3203:        descriptor->width = get_be32(pb);        break;    case 0x3202:        descriptor->height = get_be32(pb);        break;    case 0x320E:        descriptor->aspect_ratio.num = get_be32(pb);        descriptor->aspect_ratio.den = get_be32(pb);        break;    case 0x3D03:        descriptor->sample_rate.num = get_be32(pb);        descriptor->sample_rate.den = get_be32(pb);        break;    case 0x3D06: /* SoundEssenceCompression */        get_buffer(pb, descriptor->essence_codec_ul, 16);        break;    case 0x3D07:        descriptor->channels = get_be32(pb);        break;    case 0x3D01:        descriptor->bits_per_sample = get_be32(pb);        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)) {            descriptor->extradata = av_malloc(size);            if (!descriptor->extradata)                return -1;            descriptor->extradata_size = size;            get_buffer(pb, descriptor->extradata, size);        }        break;    }    return 0;}/* SMPTE RP224 http://www.smpte-ra.org/mdd/index.html */static const MXFDataDefinitionUL mxf_data_definition_uls[] = {    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x01,0x00,0x00,0x00 }, CODEC_TYPE_VIDEO },    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x02,0x00,0x00,0x00 }, CODEC_TYPE_AUDIO },    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x05,0x01,0x03,0x02,0x02,0x02,0x02,0x00,0x00 }, CODEC_TYPE_AUDIO },    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  CODEC_TYPE_DATA },};static const MXFCodecUL mxf_codec_uls[] = {    /* PictureEssenceCoding */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, 14, CODEC_ID_MPEG2VIDEO }, /* MP@ML Long GoP */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 }, 14, CODEC_ID_MPEG2VIDEO }, /* D-10 50Mbps PAL */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x03,0x00 }, 14, CODEC_ID_MPEG2VIDEO }, /* MP@HL Long GoP */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x02,0x00 }, 14, CODEC_ID_MPEG2VIDEO }, /* 422P@HL I-Frame */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x20,0x02,0x03 }, 14,      CODEC_ID_MPEG4 }, /* XDCAM proxy_pal030926.mxf */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x02,0x00 }, 13,    CODEC_ID_DVVIDEO }, /* DV25 IEC PAL */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 }, 14,   CODEC_ID_JPEG2000 }, /* JPEG2000 Codestream */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x01,0x7F,0x00,0x00,0x00 }, 13,   CODEC_ID_RAWVIDEO }, /* Uncompressed */    /* SoundEssenceCompression */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, 13,  CODEC_ID_PCM_S16LE }, /* Uncompressed */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x7F,0x00,0x00,0x00 }, 13,  CODEC_ID_PCM_S16LE },    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x02,0x02,0x01,0x7E,0x00,0x00,0x00 }, 13,  CODEC_ID_PCM_S16BE }, /* From Omneon MXF file */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x04,0x04,0x02,0x02,0x02,0x03,0x01,0x01,0x00 }, 15,   CODEC_ID_PCM_ALAW }, /* XDCAM Proxy C0023S01.mxf */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x01,0x00 }, 15,        CODEC_ID_AC3 },    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x05,0x00 }, 15,        CODEC_ID_MP2 }, /* MP2 or MP3 */  //{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x1C,0x00 }, 15,    CODEC_ID_DOLBY_E }, /* Dolby-E */    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,       CODEC_ID_NONE },};static const MXFCodecUL mxf_picture_essence_container_uls[] = {    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, 14, CODEC_ID_MPEG2VIDEO }, /* MPEG-ES Frame wrapped */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x41,0x01 }, 14,    CODEC_ID_DVVIDEO }, /* DV 625 25mbps */    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,       CODEC_ID_NONE },};static const MXFCodecUL mxf_sound_essence_container_uls[] = {    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 }, 14, CODEC_ID_PCM_S16LE }, /* BWF Frame wrapped */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x40,0x01 }, 14,       CODEC_ID_MP2 }, /* MPEG-ES Frame wrapped, 0x40 ??? stream id */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, 14, CODEC_ID_PCM_S16LE }, /* D-10 Mapping 50Mbps PAL Extended Template */    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,      CODEC_ID_NONE },};/* * 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){    while (uls->id != CODEC_ID_NONE) {        if(mxf_match_uid(uls->uid, *uid, uls->matching_len))            break;        uls++;    }    return uls;}static enum CodecType mxf_get_codec_type(const MXFDataDefinitionUL *uls, UID *uid){    while (uls->type != CODEC_TYPE_DATA) {        if(mxf_match_uid(uls->uid, *uid, 16))            break;        uls++;    }    return uls->type;}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;}static int mxf_parse_structural_metadata(MXFContext *mxf){    MXFPackage *material_package = NULL;    MXFPackage *temp_package = NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -