X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=libavformat%2Fmxfdec.c;h=b3c25b765e5fcc625a987cee1ffd7df6dd8bb827;hb=8e2fcd1cb4be938768db74af5c08350df6a156d7;hp=c8f1c61f9e2e8f8ba8c27e926c789700a62dfa1e;hpb=9ac3417c6b1934fee5a687df7b98e905b14719c2;p=ffmpeg diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index c8f1c61f9e2..b3c25b765e5 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -166,6 +166,7 @@ typedef struct MXFDescriptor { enum MXFMetadataSetType type; UID essence_container_ul; UID essence_codec_ul; + UID codec_ul; AVRational sample_rate; AVRational aspect_ratio; int width; @@ -974,6 +975,9 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int case 0x3004: avio_read(pb, descriptor->essence_container_ul, 16); break; + case 0x3005: + avio_read(pb, descriptor->codec_ul, 16); + break; case 0x3006: descriptor->linked_track_id = avio_rb32(pb); break; @@ -1151,6 +1155,11 @@ static const MXFCodecUL mxf_data_essence_container_uls[] = { { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AV_CODEC_ID_NONE }, }; +static const MXFCodecUL mxf_codec_uls[] = { + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 }, 14, AV_CODEC_ID_JPEG2000 }, + { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AV_CODEC_ID_NONE }, +}; + static const char* const mxf_data_essence_descriptor[] = { "vbi_vanc_smpte_436M", }; @@ -1950,6 +1959,11 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) /* TODO: drop PictureEssenceCoding and SoundEssenceCompression, only check EssenceContainer */ codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->essence_codec_ul); st->codec->codec_id = (enum AVCodecID)codec_ul->id; + if (st->codec->codec_id == AV_CODEC_ID_NONE) { + codec_ul = mxf_get_codec_ul(mxf_codec_uls, &descriptor->codec_ul); + st->codec->codec_id = (enum AVCodecID)codec_ul->id; + } + av_log(mxf->fc, AV_LOG_VERBOSE, "%s: Universal Label: ", avcodec_get_name(st->codec->codec_id)); for (k = 0; k < 16; k++) { @@ -2995,6 +3009,10 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) if (mxf->op != OPAtom) return mxf_read_packet_old(s, pkt); + // If we have no streams then we basically are at EOF + if (s->nb_streams < 1) + return AVERROR_EOF; + /* OPAtom - clip wrapped demuxing */ /* NOTE: mxf_read_header() makes sure nb_index_tables > 0 for OPAtom */ st = s->streams[0];