From ed18fc59be461a8f08ffa8d52897f2710e0359bf Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 7 Jul 2014 13:42:12 +0100 Subject: 12-bit hacks. --- src/rgb_xyz.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/rgb_xyz.cc b/src/rgb_xyz.cc index dea2106c..ebe263cb 100644 --- a/src/rgb_xyz.cc +++ b/src/rgb_xyz.cc @@ -99,6 +99,9 @@ libdcp::xyz_to_rgb (shared_ptr xyz_frame, shared_ptr return argb_frame; } +/** Image must be packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian; + * i.e. AV_PIX_FMT_RGB48BE. + */ shared_ptr libdcp::rgb_to_xyz (shared_ptr rgb, shared_ptr lut_in, shared_ptr lut_out, double const colour_matrix[3][3]) { @@ -117,13 +120,13 @@ libdcp::rgb_to_xyz (shared_ptr rgb, shared_ptr lut_in, s int jn = 0; for (int y = 0; y < rgb->size().height; ++y) { - uint8_t* p = rgb->data()[0] + y * rgb->stride()[0]; + uint16_t* p = reinterpret_cast (rgb->data()[0] + y * rgb->stride()[0]); for (int x = 0; x < rgb->size().width; ++x) { - /* In gamma LUT (converting 8-bit input to 12-bit) */ - s.r = lut_in->lut()[*p++ << 4]; - s.g = lut_in->lut()[*p++ << 4]; - s.b = lut_in->lut()[*p++ << 4]; + /* In gamma LUT (truncating 16-bit to 12-bit) */ + s.r = lut_in->lut()[*p++ >> 4]; + s.g = lut_in->lut()[*p++ >> 4]; + s.b = lut_in->lut()[*p++ >> 4]; /* RGB to XYZ Matrix */ d.x = ((s.r * colour_matrix[0][0]) + -- cgit v1.2.3