18#if !defined USE_JPEG2000 && defined USE_OPENJPEG
36static void openjpeg_warning(
const char *msg,
void *client_data)
39 fprintf(stderr,
"openjpeg: %s",msg);
50static void openjpeg_error(
const char *msg,
void *client_data)
53 fprintf(stderr,
"openjpeg: %s",msg);
64static void openjpeg_info(
const char *msg,
void *client_data)
94static OPJ_SIZE_T opj_memory_stream_read(
void *buffer, OPJ_SIZE_T nb_bytes,
void * p_user_data)
96 opj_memory_stream* mstream = (opj_memory_stream*) p_user_data;
97 OPJ_SIZE_T nb_bytes_read = nb_bytes;
100 if (mstream->offset >= mstream->dataSize)
101 return (OPJ_SIZE_T) -1;
104 if (nb_bytes > (mstream->dataSize - mstream->offset))
105 nb_bytes_read = mstream->dataSize - mstream->offset;
107 memcpy(buffer, &(mstream->pData[mstream->offset]), nb_bytes_read);
108 mstream->offset += nb_bytes_read;
109 return nb_bytes_read;
123static OPJ_SIZE_T opj_memory_stream_write(
void *buffer, OPJ_SIZE_T nb_bytes,
void *user_data)
125 opj_memory_stream* mstream = (opj_memory_stream*) user_data;
126 OPJ_SIZE_T nb_bytes_write = nb_bytes;
129 if (mstream->offset >= mstream->dataSize)
130 return (OPJ_SIZE_T)-1;
133 if (nb_bytes > (mstream->dataSize - mstream->offset))
134 nb_bytes_write = mstream->dataSize - mstream->offset;
137 memcpy(&(mstream->pData[mstream->offset]), buffer, nb_bytes_write);
138 mstream->offset += nb_bytes_write;
139 return nb_bytes_write;
152static OPJ_OFF_T opj_memory_stream_skip(OPJ_OFF_T nb_bytes,
void *user_data)
154 opj_memory_stream* mstream = (opj_memory_stream*) user_data;
155 OPJ_SIZE_T l_nb_bytes;
159 l_nb_bytes = (OPJ_SIZE_T) nb_bytes;
161 if (l_nb_bytes > mstream->dataSize - mstream->offset)
162 l_nb_bytes = mstream->dataSize - mstream->offset;
163 mstream->offset += l_nb_bytes;
164 return (OPJ_OFF_T)l_nb_bytes;
177static OPJ_BOOL opj_memory_stream_seek(OPJ_OFF_T nb_bytes,
void * user_data)
179 opj_memory_stream* mstream = (opj_memory_stream*) user_data;
183 if (nb_bytes >(OPJ_OFF_T) mstream->dataSize)
185 mstream->offset = (OPJ_SIZE_T) nb_bytes;
196static void opj_memory_stream_do_nothing(
void * p_user_data)
198 OPJ_ARG_NOT_USED(p_user_data);
211static opj_stream_t* opj_stream_create_default_memory_stream(opj_memory_stream* memoryStream, OPJ_BOOL is_read_stream)
213 opj_stream_t* stream;
215 if (!(stream = opj_stream_default_create(is_read_stream)))
219 opj_stream_set_read_function(stream, opj_memory_stream_read);
221 opj_stream_set_write_function(stream, opj_memory_stream_write);
223 opj_stream_set_seek_function(stream, opj_memory_stream_seek);
224 opj_stream_set_skip_function(stream, opj_memory_stream_skip);
225 opj_stream_set_user_data(stream, memoryStream, opj_memory_stream_do_nothing);
226 opj_stream_set_user_data_length(stream, memoryStream->dataSize);
256 opj_stream_t *stream = NULL;
257 opj_image_t *image = NULL;
258 opj_codec_t *codec = NULL;
261 opj_dparameters_t parameters = {0,};
262 opj_set_default_decoder_parameters(¶meters);
263 parameters.decod_format = 1;
266 codec = opj_create_decompress(OPJ_CODEC_J2K);
269 opj_set_info_handler(codec, openjpeg_info, NULL);
270 opj_set_warning_handler(codec, openjpeg_warning, NULL);
271 opj_set_error_handler(codec, openjpeg_error,NULL);
274 opj_memory_stream mstream;
275 mstream.pData = (OPJ_UINT8 *)injpc;
276 mstream.dataSize = (OPJ_SIZE_T)bufsize;
279 stream = opj_stream_create_default_memory_stream( &mstream, OPJ_STREAM_READ);
282 if (!opj_setup_decoder(codec, ¶meters)) {
283 fprintf(stderr,
"openjpeg: failed to setup decoder");
287 if (!opj_read_header(stream, codec, &image)) {
288 fprintf(stderr,
"openjpeg: failed to read the header");
292 if (!opj_decode(codec, stream, image)) {
293 fprintf(stderr,
"openjpeg: failed to decode");
298 if ( (image->numcomps != 1) || (image->x1 * image->y1)==0 ) {
303 assert(image->comps[0].sgnd == 0);
304 assert(image->comps[0].prec <
sizeof(mask)*8-1);
306 mask = (1 << image->comps[0].prec) - 1;
308 for(
unsigned int i = 0; i < image->comps[0].w * image->comps[0].h ; i++)
309 outfld[i] = (
g2int) (image->comps[0].data[i] & mask);
311 if (!opj_end_decompress(codec, stream)) {
312 fprintf(stderr,
"openjpeg: failed in opj_end_decompress");
318 if (codec) opj_destroy_codec(codec);
319 if (stream) opj_stream_destroy(stream);
320 if (image) opj_image_destroy(image);
364 const int numcomps = 1;
366 opj_codec_t *codec = NULL;
367 opj_image_t *image = NULL;
368 opj_stream_t *stream = NULL;
371 opj_cparameters_t parameters = {0,};
372 opj_set_default_encoder_parameters(¶meters);
374 parameters.tcp_numlayers = 1;
375 parameters.cp_disto_alloc = 1;
377 assert(ratio != 255);
378 parameters.tcp_rates[0] = 1.0f/(float)ratio;
384 parameters.numresolution = 6;
385 while ((width < (1 << (parameters.numresolution - 1))) ||
386 (height < (1 << (parameters.numresolution - 1))))
388 parameters.numresolution--;
392 opj_image_cmptparm_t cmptparm = {0,};
393 cmptparm.prec = (OPJ_UINT32)nbits;
394 cmptparm.bpp = (OPJ_UINT32)nbits;
398 cmptparm.w = (OPJ_UINT32)width;
399 cmptparm.h = (OPJ_UINT32)height;
402 image = opj_image_create(numcomps, &cmptparm, OPJ_CLRSPC_GRAY);
410 image->x1 = (OPJ_UINT32)width;
411 image->y1 = (OPJ_UINT32)height;
413 assert(cmptparm.prec <=
sizeof(image->comps[0].data[0])*8 - 1);
416 for (
int i = 0; i < width * height; i++)
417 image->comps[0].data[i] = cin[i];
420 codec = opj_create_compress(OPJ_CODEC_J2K);
422 opj_set_info_handler(codec, openjpeg_info, NULL);
423 opj_set_warning_handler(codec, openjpeg_warning, NULL);
424 opj_set_error_handler(codec, openjpeg_error,NULL);
427 if (!opj_setup_encoder(codec, ¶meters, image))
429 fprintf(stderr,
"openjpeg: failed to setup encoder");
435 opj_memory_stream mstream;
436 mstream.pData = (OPJ_UINT8 *)outjpc;
438 mstream.dataSize = (OPJ_SIZE_T)jpclen;
439 stream = opj_stream_create_default_memory_stream(&mstream, OPJ_STREAM_WRITE);
442 fprintf(stderr,
"openjpeg: failed create default memory stream");
447 if (!opj_start_compress(codec, image, stream))
449 fprintf(stderr,
"openjpeg: failed to setup encoder");
455 if (!opj_encode(codec, stream))
457 fprintf(stderr,
"openjpeg: opj_encode failed");
462 if (!opj_end_compress(codec, stream))
464 fprintf(stderr,
"openjpeg: opj_end_compress failed");
468 iret = (int)mstream.offset;
472 opj_destroy_codec(codec);
474 opj_stream_destroy(stream);
476 opj_image_destroy(image);
int dec_jpeg2000(char *injpc, g2int bufsize, g2int *outfld)
Decode a JPEG2000 code stream specified in the JPEG2000 Part-1 standard (i.e., ISO/IEC 15444-1) using...
int enc_jpeg2000(unsigned char *cin, g2int width, g2int height, g2int nbits, g2int ltype, g2int ratio, g2int retry, char *outjpc, g2int jpclen)
Encode a grayscale image into a JPEG2000 code stream specified in the JPEG2000 Part-1 standard (i....
int64_t g2int
Long integer type.
Header file with internal function prototypes NCEPLIBS-g2c library.