diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-06-02 01:12:44 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-06-02 01:12:44 +0200 |
| commit | 427bb8545a42125e29b0f50e1af622a113ddfc7c (patch) | |
| tree | d6e4d4d27cb96a868f7b4b5708f50ab1f1d9bcdc | |
| parent | 4a5609265010b702b0222620bde9f64f1ec7269e (diff) | |
Align openjpeg images on creation.
| -rw-r--r-- | src/openjpeg_image.cc | 45 | ||||
| -rw-r--r-- | src/rgb_xyz.cc | 27 |
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; } |
