]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/mxfdec.c
Merge commit '5a79bf0284a37855636390e620d189a964214c9e'
[ffmpeg] / libavformat / mxfdec.c
index c8f1c61f9e2e8f8ba8c27e926c789700a62dfa1e..b3c25b765e5fcc625a987cee1ffd7df6dd8bb827 100644 (file)
@@ -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];