aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVilius Grigaliūnas <vilius.grigaliunas@gmail.com>2015-03-05 00:36:50 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-03-05 11:47:11 +0100
commit2af260e3a85ef2a9fadcac4f4fa652cee53e591e (patch)
tree01566b30e16f8825553b51adb3589bfb14d365d4
parentf5668e614bdccc19a3b3e3d3d67f7c7778526908 (diff)
downloadffmpeg-2af260e3a85ef2a9fadcac4f4fa652cee53e591e.tar.gz
avformat/mxfdec: Detect XYZ pixel format for digital cinema files
While the native jpeg2000 decoder can determine pixel format correctly from the codestream, libopenjpeg wrapper cannot. To make sure that the output is correct when using libopenjpeg to decode digital cinema files, we do detection from the metadata included in the MXF wrapper. If the container has "JPEG 2000 Coding Parameters" metadata element with Rsiz value set to one of digital cinema profiles, we can safely assume that the given input file is DCI compliant, therefore the pixel format should be XYZ. Reviewed-by: Tomas Härdin <tomas.hardin@codemill.se> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavformat/mxfdec.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index f3501da6b3..2e8dd05ab4 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -281,6 +281,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 };
#define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y)))
@@ -1000,6 +1001,12 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int
descriptor->extradata_size = size;
avio_read(pb, descriptor->extradata, size);
}
+ if (IS_KLV_KEY(uid, mxf_jp2k_rsiz)) {
+ uint32_t rsiz = avio_rb16(pb);
+ if (rsiz == FF_PROFILE_JPEG2000_DCINEMA_2K ||
+ rsiz == FF_PROFILE_JPEG2000_DCINEMA_4K)
+ descriptor->pix_fmt = AV_PIX_FMT_XYZ12;
+ }
break;
}
return 0;