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

📄 mxf.c

📁 ffmpeg的完整源代码和作者自己写的文档。不但有在Linux的工程哦
💻 C
📖 第 1 页 / 共 3 页
字号:
                url_fskip(&s->pb, klv.length);                return -1;            }            /* check for 8 channels AES3 element */            if (klv.key[12] == 0x06 && klv.key[13] == 0x01 && klv.key[14] == 0x10) {                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_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));    mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;    mxf->metadata_sets_count++;    return 0;}static int mxf_read_metadata_cryptographic_context(MXFCryptoContext *cryptocontext, ByteIOContext *pb, int tag){    switch(tag) {    case 0xFFFE:        get_buffer(pb, cryptocontext->context_uid, 16);        break;    case 0xFFFD:        get_buffer(pb, cryptocontext->source_container_ul, 16);        break;    }    return 0;}static int mxf_read_metadata_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));        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_metadata_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_metadata_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));        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_metadata_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_metadata_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));        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_metadata_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));        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_metadata_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_metadata_generic_descriptor(MXFDescriptor *descriptor, ByteIOContext *pb, int tag, int size){    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));        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_metadata_pixel_layout(pb, descriptor);        break;    case 0x8201: /* Private tag used by SONY C0023S01.mxf */        descriptor->extradata = av_malloc(size);        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 }, CODEC_ID_MPEG2VIDEO, Frame }, /* MP@ML Long GoP */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 30Mbps PAL */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x03 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 40Mbps PAL */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 50Mbps PAL */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x06 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 30Mbps NTSC */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x04 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 40Mbps NTSC */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x02 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 50Mbps NTSC */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@ML I-Frame */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@ML Long GoP */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* MP@HL Long GoP */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x02,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@HL I-Frame */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@HL Long GoP */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x20,0x02,0x03 },      CODEC_ID_MPEG4, Frame }, /* XDCAM proxy_pal030926.mxf */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x20,0x02,0x04 },      CODEC_ID_MPEG4, Frame }, /* XDCAM Proxy C0023S01.mxf */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x02,0x00 },    CODEC_ID_DVVIDEO, Frame }, /* DV25 IEC PAL */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x00 },    CODEC_ID_DVVIDEO, Frame }, /* DVCPRO25 PAL */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x04,0x00 },    CODEC_ID_DVVIDEO, Frame }, /* DVCPRO50 PAL */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 },   CODEC_ID_JPEG2000, Frame }, /* JPEG2000 Codestream */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x01,0x7F,0x00,0x00,0x00 },   CODEC_ID_RAWVIDEO, Frame }, /* Uncompressed */    /* SoundEssenceCompression */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },  CODEC_ID_PCM_S16LE, Frame }, /* Uncompressed */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x7F,0x00,0x00,0x00 },  CODEC_ID_PCM_S16LE, Frame },    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x02,0x02,0x01,0x7E,0x00,0x00,0x00 },  CODEC_ID_PCM_S16BE, Frame }, /* From Omneon MXF file */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x04,0x04,0x02,0x02,0x02,0x03,0x01,0x01,0x00 },   CODEC_ID_PCM_ALAW, Frame }, /* XDCAM Proxy C0023S01.mxf */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x01,0x00 },        CODEC_ID_AC3, Frame },    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x05,0x00 },        CODEC_ID_MP2, Frame }, /* MP2 or MP3 */  //{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x1C,0x00 },    CODEC_ID_DOLBY_E, Frame }, /* Dolby-E */    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },       CODEC_ID_NONE, Frame },};static const MXFCodecUL mxf_picture_essence_container_uls[] = {    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, CODEC_ID_MPEG2VIDEO, Frame }, /* MPEG-ES Frame wrapped */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xe0,0x02 }, CODEC_ID_MPEG2VIDEO,  Clip }, /* MPEG-ES Clip wrapped, 0xe0 MPV stream id */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x04,0x61,0x07 }, CODEC_ID_MPEG2VIDEO,  Clip }, /* MPEG-ES Custom wrapped, 0x61 ??? stream id */    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },       CODEC_ID_NONE, Frame },};static const MXFCodecUL mxf_sound_essence_container_uls[] = {    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 },  CODEC_ID_PCM_S16LE, Frame }, /* BWF Frame wrapped */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x03,0x00 },  CODEC_ID_PCM_S16LE, Frame }, /* AES Frame wrapped */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x40,0x01 },        CODEC_ID_MP2, Frame }, /* MPEG-ES Frame wrapped, 0x40 ??? stream id */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xc0,0x01 },        CODEC_ID_MP2, Frame }, /* MPEG-ES Frame wrapped, 0xc0 MPA stream id */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xc0,0x02 },        CODEC_ID_MP2,  Clip }, /* MPEG-ES Clip wrapped, 0xc0 MPA stream id */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 },  CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 30Mbps PAL Extended Template */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 },  CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 40Mbps PAL Extended Template */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },  CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 50Mbps PAL Extended Template */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 },  CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 30Mbps NTSC Extended Template */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 },  CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 40Mbps NTSC Extended Template */    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 },  CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 50Mbps NTSC Extended Template */    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },       CODEC_ID_NONE, Frame },};/* * 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, 16))            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) &&

⌨️ 快捷键说明

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