summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-06-02 01:12:44 +0200
committerCarl Hetherington <cth@carlh.net>2020-06-02 01:12:44 +0200
commit427bb8545a42125e29b0f50e1af622a113ddfc7c (patch)
treed6e4d4d27cb96a868f7b4b5708f50ab1f1d9bcdc
parent4a5609265010b702b0222620bde9f64f1ec7269e (diff)
Align openjpeg images on creation.
-rw-r--r--src/openjpeg_image.cc45
-rw-r--r--src/rgb_xyz.cc27
2 files changed, 35 insertions, 37 deletions
diff --git a/src/openjpeg_image.cc b/src/openjpeg_image.cc
index 31889566..7a0ae91d 100644
--- a/src/openjpeg_image.cc
+++ b/src/openjpeg_image.cc
@@ -111,32 +111,45 @@ OpenJPEGImage::OpenJPEGImage (uint8_t const * data_16, dcp::Size size, int strid
void
OpenJPEGImage::create (Size size)
{
- opj_image_cmptparm_t cmptparm[3];
-
- for (int i = 0; i < 3; ++i) {
- cmptparm[i].dx = 1;
- cmptparm[i].dy = 1;
- cmptparm[i].w = size.width;
- cmptparm[i].h = size.height;
- cmptparm[i].x0 = 0;
- cmptparm[i].y0 = 0;
- cmptparm[i].prec = 12;
- cmptparm[i].bpp = 12;
- cmptparm[i].sgnd = 0;
- }
-
- /* XXX: is this _SRGB right? */
- _opj_image = opj_image_create (3, &cmptparm[0], OPJ_CLRSPC_SRGB);
+ _opj_image = reinterpret_cast<opj_image_t*> (malloc(sizeof(opj_image_t)));
if (_opj_image == 0) {
throw std::runtime_error ("could not create libopenjpeg image");
}
+ /* XXX: is this right? */
+ _opj_image->color_space = OPJ_CLRSPC_SRGB;
_opj_image->x0 = 0;
_opj_image->y0 = 0;
_opj_image->x1 = size.width;
_opj_image->y1 = size.height;
+
+ _opj_image->numcomps = 3;
+ _opj_image->comps = reinterpret_cast<opj_image_comp_t *> (malloc(_opj_image->numcomps * sizeof(opj_image_comp_t)));
+ if (!_opj_image->comps) {
+ opj_image_destroy(_opj_image);
+ throw std::runtime_error ("could not create libopenjpeg image");
+ }
+
+ for (int i = 0; i < 3; ++i) {
+ opj_image_comp_t *comp = &_opj_image->comps[i];
+ comp->dx = 1;
+ comp->dy = 1;
+ comp->w = size.width;
+ comp->h = size.height;
+ comp->x0 = 0;
+ comp->y0 = 0;
+ comp->prec = 12;
+ comp->bpp = 12;
+ comp->sgnd = 0;
+ comp->data = reinterpret_cast<int*>(aligned_alloc(32, comp->w * comp->h * sizeof(int)));
+ if (!comp->data) {
+ opj_image_destroy(_opj_image);
+ throw std::runtime_error ("could not create libopenjpeg image");
+ }
+ }
}
+
/** OpenJPEGImage destructor */
OpenJPEGImage::~OpenJPEGImage ()
{
diff --git a/src/rgb_xyz.cc b/src/rgb_xyz.cc
index 4d8fc09c..8b7b99cb 100644
--- a/src/rgb_xyz.cc
+++ b/src/rgb_xyz.cc
@@ -318,12 +318,12 @@ dcp::rgb_to_xyz (
combined_rgb_to_xyz (conversion, fast_matrix);
int clamped = 0;
- int* xyz_x = (int *) aligned_alloc(32, size.height * size.width * 4);
- memcpy (xyz_x, xyz->data(0), size.height * size.width * 4);
- int* xyz_y = (int *) aligned_alloc(32, size.height * size.width * 4);
- memcpy (xyz_y, xyz->data(1), size.height * size.width * 4);
- int* xyz_z = (int *) aligned_alloc(32, size.height * size.width * 4);
- memcpy (xyz_z, xyz->data(2), size.height * size.width * 4);
+ int* xyz_x = xyz->data(0);
+ DCP_ASSERT (!(reinterpret_cast<uintptr_t>(xyz_x) % 32));
+ int* xyz_y = xyz->data(1);
+ DCP_ASSERT (!(reinterpret_cast<uintptr_t>(xyz_y) % 32));
+ int* xyz_z = xyz->data(2);
+ DCP_ASSERT (!(reinterpret_cast<uintptr_t>(xyz_z) % 32));
__m256i* xyz_x_sse = (__m256i *) xyz_x;
__m256i* xyz_y_sse = (__m256i *) xyz_y;
@@ -345,13 +345,6 @@ dcp::rgb_to_xyz (
__m256 const_65535 = _mm256_set1_ps (65535.0);
__m256 const_0 = _mm256_set1_ps (0.0);
__m256i shuffle = _mm256_set_epi32 (7, 3, 6, 2, 5, 1, 4, 0);
-#if 0
- __m256 zero = _mm256_setzero_ps ();
-
- __m256i red_mask_1 = _mm256_set_epi32 (0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000);
- __m256i red_mask_2 = _mm256_set_epi32 (0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff);
- __m256i red_mask_3 = _mm256_set_epi32 (0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000);
-#endif
for (int y = 0; y < size.height; ++y) {
uint16_t const * p = reinterpret_cast<uint16_t const *> (rgb + y * stride);
@@ -515,13 +508,5 @@ dcp::rgb_to_xyz (
delete[] lut_in_float;
delete[] lut_out_int;
- memcpy (xyz->data(0), xyz_x, size.width * size.height * 4);
- memcpy (xyz->data(1), xyz_y, size.width * size.height * 4);
- memcpy (xyz->data(2), xyz_z, size.width * size.height * 4);
-
- free (xyz_x);
- free (xyz_y);
- free (xyz_z);
-
return xyz;
}