static FIBITMAP * DLL_CALLCONV Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) { if (handle) { opj_dparameters_t parameters; // decompression parameters opj_event_mgr_t event_mgr; // event manager opj_image_t *image = NULL; // decoded image BYTE *src = NULL; long file_length; opj_dinfo_t* dinfo = NULL; // handle to a decompressor opj_cio_t *cio = NULL; FIBITMAP *dib = NULL; // check the file format if(!Validate(io, handle)) { return NULL; } // configure the event callbacks memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = jp2_error_callback; event_mgr.warning_handler = jp2_warning_callback; event_mgr.info_handler = NULL; // set decoding parameters to default values opj_set_default_decoder_parameters(¶meters); try { // read the input file and put it in memory long start_pos = io->tell_proc(handle); io->seek_proc(handle, 0, SEEK_END); file_length = io->tell_proc(handle) - start_pos; io->seek_proc(handle, start_pos, SEEK_SET); src = (BYTE*)malloc(file_length * sizeof(BYTE)); if(!src) { throw FI_MSG_ERROR_MEMORY; } if(io->read_proc(src, 1, file_length, handle) < 1) { throw "Error while reading input stream"; } // decode the JPEG-2000 file // get a decoder handle dinfo = opj_create_decompress(CODEC_JP2); // catch events using our callbacks 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) { throw "Failed to decode image!\n"; } // close the byte stream opj_cio_close(cio); cio = NULL; // free the memory containing the code-stream free(src); src = NULL; // free the codec context opj_destroy_decompress(dinfo); // create output image dib = J2KImageToFIBITMAP(s_format_id, image); if(!dib) throw "Failed to import JPEG2000 image"; // free image data structure opj_image_destroy(image); return dib; } catch (const char *text) { if(src) free(src); if(dib) FreeImage_Unload(dib); // free remaining structures opj_destroy_decompress(dinfo); opj_image_destroy(image); // close the byte stream if(cio) opj_cio_close(cio); FreeImage_OutputMessageProc(s_format_id, text); return NULL; } } return NULL; }
static FIBITMAP * DLL_CALLCONV Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) { J2KFIO_t *fio = (J2KFIO_t*)data; if (handle && fio) { opj_codec_t *d_codec = NULL; // handle to a decompressor opj_dparameters_t parameters; // decompression parameters opj_image_t *image = NULL; // decoded image FIBITMAP *dib = NULL; // check the file format if(!Validate(io, handle)) { return NULL; } BOOL header_only = (flags & FIF_LOAD_NOPIXELS) == FIF_LOAD_NOPIXELS; // get the OpenJPEG stream opj_stream_t *d_stream = fio->stream; // set decoding parameters to default values opj_set_default_decoder_parameters(¶meters); try { // decode the JPEG-2000 codestream // get a decoder handle d_codec = opj_create_decompress(OPJ_CODEC_J2K); // configure the event callbacks // catch events using our callbacks (no local context needed here) opj_set_info_handler(d_codec, NULL, NULL); opj_set_warning_handler(d_codec, j2k_warning_callback, NULL); opj_set_error_handler(d_codec, j2k_error_callback, NULL); // setup the decoder decoding parameters using user parameters if( !opj_setup_decoder(d_codec, ¶meters) ) { throw "Failed to setup the decoder\n"; } // read the main header of the codestream and if necessary the JP2 boxes if( !opj_read_header(d_stream, d_codec, &image)) { throw "Failed to read the header\n"; } // --- header only mode if (header_only) { // create output image dib = J2KImageToFIBITMAP(s_format_id, image, header_only); if(!dib) { throw "Failed to import JPEG2000 image"; } // clean-up and return header data opj_destroy_codec(d_codec); opj_image_destroy(image); return dib; } // decode the stream and fill the image structure if( !( opj_decode(d_codec, d_stream, image) && opj_end_decompress(d_codec, d_stream) ) ) { throw "Failed to decode image!\n"; } // free the codec context opj_destroy_codec(d_codec); d_codec = NULL; // create output image dib = J2KImageToFIBITMAP(s_format_id, image, header_only); if(!dib) { throw "Failed to import JPEG2000 image"; } // free image data structure opj_image_destroy(image); return dib; } catch (const char *text) { if(dib) { FreeImage_Unload(dib); } // free remaining structures opj_destroy_codec(d_codec); opj_image_destroy(image); FreeImage_OutputMessageProc(s_format_id, text); return NULL; } } return NULL; }