diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-06-02 19:47:11 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-06-02 19:47:11 +0200 |
| commit | 5f2db276b59257b05e351c1ca5665de9cc3f78f4 (patch) | |
| tree | b1c0c737835fa45409d7285b7619ef989987b7c1 /src | |
| parent | 0e910402791b27e082946d99e8f7bc333ab680a9 (diff) | |
Align OpenJPEG image data arrays to 32-byte boundaries.
Diffstat (limited to 'src')
| -rw-r--r-- | src/openjpeg_image.cc | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/src/openjpeg_image.cc b/src/openjpeg_image.cc index 31889566..3ca7aeb4 100644 --- a/src/openjpeg_image.cc +++ b/src/openjpeg_image.cc @@ -111,32 +111,47 @@ 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->icc_profile_buf = 0; + _opj_image->icc_profile_len = 0; + + _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 () { |
