+ opj_dparameters_t parameters; /* decompression parameters */
+ opj_event_mgr_t event_mgr; /* event manager */
+ opj_image_t *image;
+ opj_dinfo_t* dinfo; /* handle to a decompressor */
+ opj_cio_t *cio;
+ unsigned char *src = (unsigned char*)inputdata;
+ int file_length = static_cast< int >( inputlength );
+
+ /* configure the event callbacks (not required) */
+ memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
+ event_mgr.error_handler = error_callback;
+ event_mgr.warning_handler = warning_callback;
+ event_mgr.info_handler = info_callback;
+
+ /* set decoding parameters to default values */
+ opj_set_default_decoder_parameters(¶meters);
+
+ // default blindly copied
+ parameters.cp_layer=0;
+ parameters.cp_reduce=0;
+// parameters.decod_format=-1;
+// parameters.cod_format=-1;
+
+ /* JPEG-2000 codestream */
+ parameters.decod_format = J2K_CFMT;
+ assert(parameters.decod_format == J2K_CFMT);
+ parameters.cod_format = PGX_DFMT;
+ assert(parameters.cod_format == PGX_DFMT);
+
+ /* get a decoder handle */
+ dinfo = opj_create_decompress(CODEC_J2K);
+
+ /* catch events using our callbacks and give a local context */
+ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, NULL);
+
+ /* setup the decoder decoding parameters using user parameters */
+ opj_setup_decoder(dinfo, ¶meters);
+
+ /* open a byte stream */
+ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
+
+ /* decode the stream and fill the image structure */
+ image = opj_decode(dinfo, cio);
+ if(!image) {
+ opj_destroy_decompress(dinfo);
+ opj_cio_close(cio);
+ return 1;
+ }
+
+ /* close the byte stream */
+ opj_cio_close(cio);
+
+ /* free the memory containing the code-stream */
+ delete[] src; //FIXME
+
+ // Copy buffer
+ for (int compno = 0; compno < image->numcomps; compno++)
+ {
+ opj_image_comp_t *comp = &image->comps[compno];
+
+ int w = image->comps[compno].w;
+ int wr = int_ceildivpow2(image->comps[compno].w, image->comps[compno].factor);
+
+ //int h = image.comps[compno].h;
+ int hr = int_ceildivpow2(image->comps[compno].h, image->comps[compno].factor);
+
+ if (comp->prec <= 8)
+ {
+ uint8_t *data8 = (uint8_t*)raw + compno;
+ for (int i = 0; i < wr * hr; i++)
+ {
+ int v = image->comps[compno].data[i / wr * w + i % wr];
+ *data8 = (uint8_t)v;
+ data8 += image->numcomps;
+ }
+ }
+ else if (comp->prec <= 16)
+ {
+ uint16_t *data16 = (uint16_t*)raw + compno;
+ for (int i = 0; i < wr * hr; i++)
+ {
+ int v = image->comps[compno].data[i / wr * w + i % wr];
+ *data16 = (uint16_t)v;
+ data16 += image->numcomps;
+ }
+ }
+ else
+ {
+ uint32_t *data32 = (uint32_t*)raw + compno;
+ for (int i = 0; i < wr * hr; i++)
+ {
+ int v = image->comps[compno].data[i / wr * w + i % wr];
+ *data32 = (uint32_t)v;
+ data32 += image->numcomps;
+ }
+ }
+ //free(image.comps[compno].data);
+ }
+
+
+ /* free remaining structures */
+ if(dinfo) {
+ opj_destroy_decompress(dinfo);