19 #if !defined USE_JPEG2000 && defined USE_OPENJPEG
37 static void openjpeg_warning(
const char *msg,
void *client_data)
40 fprintf(stderr,
"openjpeg: %s",msg);
51 static void openjpeg_error(
const char *msg,
void *client_data)
54 fprintf(stderr,
"openjpeg: %s",msg);
65 static void openjpeg_info(
const char *msg,
void *client_data)
95 static OPJ_SIZE_T opj_memory_stream_read(
void *buffer, OPJ_SIZE_T nb_bytes,
void * p_user_data)
97 opj_memory_stream* mstream = (opj_memory_stream*) p_user_data;
98 OPJ_SIZE_T nb_bytes_read = nb_bytes;
101 if (mstream->offset >= mstream->dataSize)
102 return (OPJ_SIZE_T) -1;
105 if (nb_bytes > (mstream->dataSize - mstream->offset))
106 nb_bytes_read = mstream->dataSize - mstream->offset;
108 memcpy(buffer, &(mstream->pData[mstream->offset]), nb_bytes_read);
109 mstream->offset += nb_bytes_read;
110 return nb_bytes_read;
124 static OPJ_SIZE_T opj_memory_stream_write(
void *buffer, OPJ_SIZE_T nb_bytes,
void *user_data)
126 opj_memory_stream* mstream = (opj_memory_stream*) user_data;
127 OPJ_SIZE_T nb_bytes_write = nb_bytes;
130 if (mstream->offset >= mstream->dataSize)
131 return (OPJ_SIZE_T)-1;
134 if (nb_bytes > (mstream->dataSize - mstream->offset))
135 nb_bytes_write = mstream->dataSize - mstream->offset;
138 memcpy(&(mstream->pData[mstream->offset]), buffer, nb_bytes_write);
139 mstream->offset += nb_bytes_write;
140 return nb_bytes_write;
153 static OPJ_OFF_T opj_memory_stream_skip(OPJ_OFF_T nb_bytes,
void *user_data)
155 opj_memory_stream* mstream = (opj_memory_stream*) user_data;
156 OPJ_SIZE_T l_nb_bytes;
160 l_nb_bytes = (OPJ_SIZE_T) nb_bytes;
162 if (l_nb_bytes > mstream->dataSize - mstream->offset)
163 l_nb_bytes = mstream->dataSize - mstream->offset;
164 mstream->offset += l_nb_bytes;
165 return (OPJ_OFF_T)l_nb_bytes;
178 static OPJ_BOOL opj_memory_stream_seek(OPJ_OFF_T nb_bytes,
void * user_data)
180 opj_memory_stream* mstream = (opj_memory_stream*) user_data;
184 if (nb_bytes >(OPJ_OFF_T) mstream->dataSize)
186 mstream->offset = (OPJ_SIZE_T) nb_bytes;
197 static void opj_memory_stream_do_nothing(
void * p_user_data)
199 OPJ_ARG_NOT_USED(p_user_data);
212 static opj_stream_t* opj_stream_create_default_memory_stream(opj_memory_stream* memoryStream, OPJ_BOOL is_read_stream)
214 opj_stream_t* stream;
216 if (!(stream = opj_stream_default_create(is_read_stream)))
220 opj_stream_set_read_function(stream, opj_memory_stream_read);
222 opj_stream_set_write_function(stream, opj_memory_stream_write);
224 opj_stream_set_seek_function(stream, opj_memory_stream_seek);
225 opj_stream_set_skip_function(stream, opj_memory_stream_skip);
226 opj_stream_set_user_data(stream, memoryStream, opj_memory_stream_do_nothing);
227 opj_stream_set_user_data_length(stream, memoryStream->dataSize);
257 opj_stream_t *stream = NULL;
258 opj_image_t *image = NULL;
259 opj_codec_t *codec = NULL;
262 opj_dparameters_t parameters = {0,};
263 opj_set_default_decoder_parameters(¶meters);
264 parameters.decod_format = 1;
267 codec = opj_create_decompress(OPJ_CODEC_J2K);
270 opj_set_info_handler(codec, openjpeg_info, NULL);
271 opj_set_warning_handler(codec, openjpeg_warning, NULL);
272 opj_set_error_handler(codec, openjpeg_error,NULL);
275 opj_memory_stream mstream;
276 mstream.pData = (OPJ_UINT8 *)injpc;
277 mstream.dataSize = (OPJ_SIZE_T)bufsize;
280 stream = opj_stream_create_default_memory_stream( &mstream, OPJ_STREAM_READ);
283 if (!opj_setup_decoder(codec, ¶meters)) {
284 fprintf(stderr,
"openjpeg: failed to setup decoder");
288 if (!opj_read_header(stream, codec, &image)) {
289 fprintf(stderr,
"openjpeg: failed to read the header");
293 if (!opj_decode(codec, stream, image)) {
294 fprintf(stderr,
"openjpeg: failed to decode");
299 if ( (image->numcomps != 1) || (image->x1 * image->y1)==0 ) {
304 assert(image->comps[0].sgnd == 0);
305 assert(image->comps[0].prec <
sizeof(mask)*8-1);
307 mask = (1 << image->comps[0].prec) - 1;
309 for(
unsigned int i = 0; i < image->comps[0].w * image->comps[0].h ; i++)
310 outfld[i] = (
g2int) (image->comps[0].data[i] & mask);
312 if (!opj_end_decompress(codec, stream)) {
313 fprintf(stderr,
"openjpeg: failed in opj_end_decompress");
319 if (codec) opj_destroy_codec(codec);
320 if (stream) opj_stream_destroy(stream);
321 if (image) opj_image_destroy(image);
365 const int numcomps = 1;
367 opj_codec_t *codec = NULL;
368 opj_image_t *image = NULL;
369 opj_stream_t *stream = NULL;
372 opj_cparameters_t parameters = {0,};
373 opj_set_default_encoder_parameters(¶meters);
375 parameters.tcp_numlayers = 1;
376 parameters.cp_disto_alloc = 1;
378 assert(ratio != 255);
379 parameters.tcp_rates[0] = 1.0f/(float)ratio;
385 parameters.numresolution = 6;
386 while ((width < (1 << (parameters.numresolution - 1))) ||
387 (height < (1 << (parameters.numresolution - 1))))
389 parameters.numresolution--;
393 opj_image_cmptparm_t cmptparm = {0,};
394 cmptparm.prec = (OPJ_UINT32)nbits;
395 cmptparm.bpp = (OPJ_UINT32)nbits;
399 cmptparm.w = (OPJ_UINT32)width;
400 cmptparm.h = (OPJ_UINT32)height;
403 image = opj_image_create(numcomps, &cmptparm, OPJ_CLRSPC_GRAY);
411 image->x1 = (OPJ_UINT32)width;
412 image->y1 = (OPJ_UINT32)height;
414 assert(cmptparm.prec <=
sizeof(image->comps[0].data[0])*8 - 1);
417 for (
int i = 0; i < width * height; i++)
418 image->comps[0].data[i] = cin[i];
421 codec = opj_create_compress(OPJ_CODEC_J2K);
423 opj_set_info_handler(codec, openjpeg_info, NULL);
424 opj_set_warning_handler(codec, openjpeg_warning, NULL);
425 opj_set_error_handler(codec, openjpeg_error,NULL);
428 if (!opj_setup_encoder(codec, ¶meters, image))
430 fprintf(stderr,
"openjpeg: failed to setup encoder");
436 opj_memory_stream mstream;
437 mstream.pData = (OPJ_UINT8 *)outjpc;
439 mstream.dataSize = (OPJ_SIZE_T)jpclen;
440 stream = opj_stream_create_default_memory_stream(&mstream, OPJ_STREAM_WRITE);
443 fprintf(stderr,
"openjpeg: failed create default memory stream");
448 if (!opj_start_compress(codec, image, stream))
450 fprintf(stderr,
"openjpeg: failed to setup encoder");
456 if (!opj_encode(codec, stream))
458 fprintf(stderr,
"openjpeg: opj_encode failed");
463 if (!opj_end_compress(codec, stream))
465 fprintf(stderr,
"openjpeg: opj_end_compress failed");
469 iret = (int)mstream.offset;
473 opj_destroy_codec(codec);
475 opj_stream_destroy(stream);
477 opj_image_destroy(image);