[FFmpeg-devel] libopenjpeg decoder not correctly setting the pixel format for cinema JP2K wrapped MXF

RĂ©mi Achard remiachard at gmail.com
Sun Aug 30 20:22:35 EEST 2020


Hi,

As you are probably aware, the libopenjpeg decoder is not able to interpret
cinema jp2k mxf correctly, the pixel format being assigned as rgb48 instead
of xyz12 as it should. Note that ffmpeg native jp2k decoder parse the RSIZ
descriptor from the jp2k bitstream and is able to correctly assign the
pixel format, but libopenjpeg currently don't read the RSIZ marker so that
ffmpeg wrapper has no simple mean of doing this at the moment (a pull
request on libopenjpeg is still in progress to try to fix that).

Someone recently pointed me to this commit from 2015
https://github.com/FFmpeg/FFmpeg/commit/2af260e3a85ef2a9fadcac4f4fa652cee53e591e
.
According to my tests, it doesn't work because of a wrong RSIZ key and
missing JP2KEssenceSubDescriptor lookup group. I made a patch I made to fix
that, mxfdec is now able to correctly assign the descriptor->pix_fmt field.
Note that these keys can be found in SMPTE ST 429-4 or discovered through
asdcplib with asdcp-info command line tool parsing a cinema mxf video track.

Then, even with that patch, the pixel format detected by the demuxer is not
communicated to the decoder, as far as I'm aware. Which makes me wonder,
what was the original goal of that commit and what I'm missing to
communicate this information to libopenjpeg decoder ?

diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index 6f6e8d586c..cd85fbedff 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -325,7 +325,7 @@ static const uint8_t mxf_encrypted_essence_container[]
    = { 0x06,0x0e,0x2b,0x
 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
};
 static const uint8_t mxf_sony_mpeg4_extradata[]            = {
0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0e,0x06,0x06,0x02,0x02,0x01,0x00,0x00
};
 static const uint8_t mxf_avid_project_name[]               = {
0xa5,0xfb,0x7b,0x25,0xf6,0x15,0x94,0xb9,0x62,0xfc,0x37,0x17,0x49,0x2d,0x42,0xbf
};
-static const uint8_t mxf_jp2k_rsiz[]                       = {
0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02,0x01,0x00
};
+static const uint8_t mxf_jp2k_rsiz[]                       = {
0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x01,0x00,0x00,0x00
};
 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
};

@@ -2746,6 +2746,7 @@ static const MXFMetadataReadTableEntry
mxf_metadata_read_table[] = {
     { {
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,0x5a,0x00
}, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /*
JPEG2000PictureSubDescriptor */
     { {
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 */
     { {
0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00
}, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /*
MPEG2VideoDescriptor */


More information about the ffmpeg-devel mailing list