+ : added
October 12, 2011
+* [mickael] WIP: correct some memory leaks in applications functions
+ [mickael] WIP: add a read CBD marker function (JPEG2000 part 2)
+ [mickael] WIP: add a read MCO marker function (JPEG2000 part 2)
+ [mickael] WIP: add a read MCC marker function (JPEG2000 part 2)
opj_dparameters_t parameters; /* Decompression parameters */
opj_event_mgr_t event_mgr; /* Event manager */
- opj_image_t image; /* Image structure */
+ opj_image_t* image = NULL; /* Image structure */
opj_codec_t* dinfo = NULL; /* Handle to a decompressor */
opj_stream_t *cio = NULL; /* Stream */
- opj_codestream_info_v2_t* cstr_info;
- opj_codestream_index_t* cstr_index;
+ opj_codestream_info_v2_t* cstr_info = NULL;
+ opj_codestream_index_t* cstr_index = NULL;
OPJ_INT32 num_images, imageno;
img_fol_t img_fol;
dircnt_t *dirptr = NULL;
+#ifdef MSD
opj_bool l_go_on = OPJ_TRUE;
OPJ_UINT32 l_max_data_size = 1000;
OPJ_BYTE * l_data = (OPJ_BYTE *) malloc(1000);
+#endif
/* Set decoding parameters to default values */
opj_set_default_decoder_parameters(¶meters);
opj_stream_destroy(cio);
fclose(fsrc);
opj_destroy_codec(dinfo);
+ opj_image_destroy(image);
fclose(fout);
return EXIT_FAILURE;
}
}
/* destroy the image header */
- opj_image_destroy(&image);
+ opj_image_destroy(image);
+
+ /* destroy the codestream index */
+ opj_destroy_cstr_index(&cstr_index);
+
+ /* destroy the codestream info */
+ opj_destroy_cstr_info_v2(&cstr_info);
}
opj_dparameters_t parameters; /* decompression parameters */
opj_event_mgr_t event_mgr; /* event manager */
- opj_image_t image;
+ opj_image_t* image = NULL;
opj_stream_t *cio = NULL; /* Stream */
opj_codec_t* dinfo = NULL; /* Handle to a decompressor */
}
/* Get the decoded image */
- if ( !( opj_decode_v2(dinfo, cio, &image) && opj_end_decompress(dinfo,cio) ) ) {
+ if ( !( opj_decode_v2(dinfo, cio, image) && opj_end_decompress(dinfo,cio) ) ) {
fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
opj_destroy_codec(dinfo);
opj_stream_destroy(cio);
fclose(fsrc);
- if(image.color_space == CLRSPC_SYCC){
- color_sycc_to_rgb(&image); /* FIXME */
+ if(image->color_space == CLRSPC_SYCC){
+ color_sycc_to_rgb(image); /* FIXME */
}
- if(image.icc_profile_buf) {
+ if(image->icc_profile_buf) {
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- color_apply_icc_profile(&image); /* FIXME */
+ color_apply_icc_profile(image); /* FIXME */
#endif
- free(image.icc_profile_buf);
- image.icc_profile_buf = NULL; image.icc_profile_len = 0;
+ free(image->icc_profile_buf);
+ image->icc_profile_buf = NULL; image->icc_profile_len = 0;
}
/* create output image */
/* ------------------- */
switch (parameters.cod_format) {
case PXM_DFMT: /* PNM PGM PPM */
- if (imagetopnm(&image, parameters.outfile)) {
+ if (imagetopnm(image, parameters.outfile)) {
fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
}
else {
break;
case PGX_DFMT: /* PGX */
- if(imagetopgx(&image, parameters.outfile)){
+ if(imagetopgx(image, parameters.outfile)){
fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
}
else {
break;
case BMP_DFMT: /* BMP */
- if(imagetobmp(&image, parameters.outfile)){
+ if(imagetobmp(image, parameters.outfile)){
fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
}
else {
break;
#ifdef HAVE_LIBTIFF
case TIF_DFMT: /* TIFF */
- if(imagetotif(&image, parameters.outfile)){
+ if(imagetotif(image, parameters.outfile)){
fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
}
else {
break;
#endif /* HAVE_LIBTIFF */
case RAW_DFMT: /* RAW */
- if(imagetoraw(&image, parameters.outfile)){
+ if(imagetoraw(image, parameters.outfile)){
fprintf(stdout,"Error generating raw file. Outfile %s not generated\n",parameters.outfile);
}
else {
break;
case TGA_DFMT: /* TGA */
- if(imagetotga(&image, parameters.outfile)){
+ if(imagetotga(image, parameters.outfile)){
fprintf(stdout,"Error generating tga file. Outfile %s not generated\n",parameters.outfile);
}
else {
break;
#ifdef HAVE_LIBPNG
case PNG_DFMT: /* PNG */
- if(imagetopng(&image, parameters.outfile)){
+ if(imagetopng(image, parameters.outfile)){
fprintf(stdout,"Error generating png file. Outfile %s not generated\n",parameters.outfile);
}
else {
/* free image data structure */
- opj_image_destroy(&image);
+ opj_image_destroy(image);
}
- return 0;
+ return EXIT_SUCCESS;
}
//end main
if(image) {
if(image->comps) {
OPJ_UINT32 compno;
+
/* image components */
for(compno = 0; compno < image->numcomps; compno++) {
opj_image_comp_t *image_comp = &(image->comps[compno]);
if(image->icc_profile_buf) {
opj_free(image->icc_profile_buf);
}
- //FIXME opj_free(image);
+
+ opj_free(image);
}
}
*
* @return true if the image header is correctly copy.
*/
-static opj_bool j2k_copy_img_header(opj_j2k_v2_t* p_j2k, opj_image_t* p_image);
+static opj_bool j2k_copy_img_header(opj_j2k_v2_t* p_j2k, opj_image_t** p_image);
static void j2k_dump_MH_info(opj_j2k_v2_t* p_j2k, FILE* out_stream);
*/
opj_bool j2k_read_header( struct opj_stream_private *p_stream,
opj_j2k_v2_t* p_j2k,
- opj_image_t* p_image,
+ opj_image_t** p_image,
struct opj_event_mgr* p_manager )
{
/* preconditions */
assert(p_j2k != 00);
assert(p_stream != 00);
- assert(p_image != 00);
assert(p_manager != 00);
/* create an empty image header */
return OPJ_FALSE;
}
+ *p_image = opj_image_create0();
+ if (! (*p_image)) {
+ return OPJ_FALSE;
+ }
+
if (! j2k_copy_img_header(p_j2k, p_image)){
opj_image_destroy(p_j2k->m_image);
p_j2k->m_image = NULL;
return OPJ_TRUE;
}
-opj_bool j2k_copy_img_header(opj_j2k_v2_t* p_j2k, opj_image_t* p_image)
+opj_bool j2k_copy_img_header(opj_j2k_v2_t* p_j2k, opj_image_t** p_image)
{
OPJ_UINT16 compno;
/* preconditions */
assert(p_j2k != 00);
- assert(p_image != 00);
- p_image->x0 = p_j2k->m_image->x0;
- p_image->y0 = p_j2k->m_image->y0;
- p_image->x1 = p_j2k->m_image->x1;
- p_image->y1 = p_j2k->m_image->y1;
+ (*p_image)->x0 = p_j2k->m_image->x0;
+ (*p_image)->y0 = p_j2k->m_image->y0;
+ (*p_image)->x1 = p_j2k->m_image->x1;
+ (*p_image)->y1 = p_j2k->m_image->y1;
- p_image->numcomps = p_j2k->m_image->numcomps;
- p_image->comps = (opj_image_comp_t*)opj_malloc(p_image->numcomps * sizeof(opj_image_comp_t));
- if (!p_image->comps)
+ (*p_image)->numcomps = p_j2k->m_image->numcomps;
+ (*p_image)->comps = (opj_image_comp_t*)opj_malloc((*p_image)->numcomps * sizeof(opj_image_comp_t));
+ if (!(*p_image)->comps)
return OPJ_FALSE;
- for (compno=0; compno < p_image->numcomps; compno++){
- memcpy( &(p_image->comps[compno]),
+ for (compno=0; compno < (*p_image)->numcomps; compno++){
+ memcpy( &((*p_image)->comps[compno]),
&(p_j2k->m_image->comps[compno]),
sizeof(opj_image_comp_t));
}
- p_image->color_space = p_j2k->m_image->color_space;
- p_image->icc_profile_len = p_j2k->m_image->icc_profile_len;
- if (!p_image->icc_profile_len) {
+ (*p_image)->color_space = p_j2k->m_image->color_space;
+ (*p_image)->icc_profile_len = p_j2k->m_image->icc_profile_len;
+ if (!(*p_image)->icc_profile_len) {
- p_image->icc_profile_buf = (unsigned char*)opj_malloc(p_image->icc_profile_len);
- if (!p_image->icc_profile_buf)
+ (*p_image)->icc_profile_buf = (unsigned char*)opj_malloc((*p_image)->icc_profile_len);
+ if (!(*p_image)->icc_profile_buf)
return OPJ_FALSE;
- memcpy( p_image->icc_profile_buf,
+ memcpy( (*p_image)->icc_profile_buf,
p_j2k->m_image->icc_profile_buf,
p_j2k->m_image->icc_profile_len);
}
else
- p_image->icc_profile_buf = NULL;
+ (*p_image)->icc_profile_buf = NULL;
return OPJ_TRUE;
}
tcd_destroy_v2(p_j2k->m_tcd);
j2k_cp_destroy(&(p_j2k->m_cp));
- memset(&(p_j2k->m_cp),0,sizeof(opj_cp_t));
+ memset(&(p_j2k->m_cp),0,sizeof(opj_cp_v2_t));
opj_procedure_list_destroy(p_j2k->m_procedure_list);
p_j2k->m_procedure_list = 00;
j2k_destroy_cstr_index(p_j2k->cstr_index);
p_j2k->cstr_index = NULL;
+ opj_image_destroy(p_j2k->m_image);
+ p_j2k->m_image = NULL;
+
opj_free(p_j2k);
}
void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind)
{
- if (!p_cstr_ind) {
- return;
- }
+ if (p_cstr_ind) {
- if (p_cstr_ind->marker) {
- opj_free(p_cstr_ind->marker);
- p_cstr_ind->marker = NULL;
- }
+ if (p_cstr_ind->marker) {
+ opj_free(p_cstr_ind->marker);
+ p_cstr_ind->marker = NULL;
+ }
+
+ if (p_cstr_ind->tile_index) {
+ // FIXME not used for the moment
+ }
- if (p_cstr_ind->tile_index) {
- // FIXME
+ opj_free(p_cstr_ind);
}
}
cstr_info->tw = p_j2k->m_cp.tw;
cstr_info->th = p_j2k->m_cp.th;
+ cstr_info->tile_info = NULL; /* Not fill from the main header*/
+
l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
cstr_info->m_default_tile_info.csty = l_default_tile->csty;
memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker, l_cstr_index->marknum * sizeof(opj_marker_info_t) );
+ l_cstr_index->tile_index = NULL; /* FIXME not used for the moment*/
return l_cstr_index;
}
{
OPJ_UINT32 compno;
+ if (!p_image)
+ return OPJ_FALSE;
+
/* customization of the decoding */
j2k_setup_decoding(p_j2k);
- /* write header */
+ /* Decode the codestream */
if (! j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
opj_image_destroy(p_j2k->m_image);
p_j2k->m_image = NULL;
return OPJ_FALSE;
}
+ /* Copy data from codec to output image*/
for (compno = 0; compno < p_image->numcomps; compno++) {
p_image->comps[compno].data = p_j2k->m_image->comps[compno].data;
p_j2k->m_image->comps[compno].data = NULL;
}
- return OPJ_TRUE /*p_j2k->m_image*/;
+ return OPJ_TRUE;
}
*/
opj_bool j2k_read_header( struct opj_stream_private *p_stream,
opj_j2k_v2_t* p_j2k,
- opj_image_t* p_image,
+ opj_image_t** p_image,
struct opj_event_mgr* p_manager );
}/* opj_jp2_decode() */
-opj_bool opj_jp2_decode_v2( opj_jp2_v2_t *jp2,
- struct opj_stream_private *cio,
- opj_image_t* p_image,
- struct opj_event_mgr * p_manager)
+opj_bool jp2_decode_v2( opj_jp2_v2_t *jp2,
+ struct opj_stream_private *cio,
+ opj_image_t* p_image,
+ struct opj_event_mgr * p_manager)
{
+ if (!p_image)
+ return OPJ_FALSE;
+
/* J2K decoding */
if( ! j2k_decode_v2(jp2->j2k, cio, p_image, p_manager) ) {
opj_event_msg_v2(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
*/
opj_bool jp2_read_header( struct opj_stream_private *p_stream,
opj_jp2_v2_t *jp2,
- opj_image_t* p_image,
+ opj_image_t** p_image,
struct opj_event_mgr * p_manager
)
{
* @param p_stream the stream to write data to.
* @param p_manager the user event manager.
*/
-opj_bool opj_jp2_decode_tile (
+opj_bool jp2_decode_tile (
opj_jp2_v2_t * p_jp2,
OPJ_UINT32 p_tile_index,
OPJ_BYTE * p_data,
* @param cstr_info Codestream information structure if required, NULL otherwise
* @return Returns a decoded image if successful, returns NULL otherwise
*/
-opj_bool opj_jp2_decode_v2( opj_jp2_v2_t *jp2,
- struct opj_stream_private *cio,
- opj_image_t* p_image,
- struct opj_event_mgr * p_manager);
+opj_bool jp2_decode_v2( opj_jp2_v2_t *jp2,
+ struct opj_stream_private *cio,
+ opj_image_t* p_image,
+ struct opj_event_mgr * p_manager);
/**
*/
opj_bool jp2_read_header( struct opj_stream_private *p_stream,
opj_jp2_v2_t *jp2,
- opj_image_t * p_img_header,
+ opj_image_t ** p_img_header,
struct opj_event_mgr * p_manager
);
* @param p_stream the stream to write data to.
* @param p_manager the user event manager.
*/
-opj_bool opj_jp2_decode_tile (
+opj_bool jp2_decode_tile (
opj_jp2_v2_t * p_jp2,
OPJ_UINT32 p_tile_index,
OPJ_BYTE * p_data,
/** Main header reading function handler*/
opj_bool (* opj_read_header) ( struct opj_stream_private * cio,
void * p_codec,
- opj_image_t *p_image,
+ opj_image_t **p_image,
struct opj_event_mgr * p_manager);
/** FIXME DOC */
opj_bool (* opj_decode) ( void * p_codec,
l_info->m_codec_data.m_decompression.opj_read_header =
(opj_bool (*) ( struct opj_stream_private *,
void *,
- opj_image_t *,
+ opj_image_t **,
struct opj_event_mgr * )) j2k_read_header;
l_info->m_codec_data.m_decompression.opj_destroy =
(opj_bool (*) ( void *,
struct opj_stream_private *,
opj_image_t*,
- struct opj_event_mgr * )) opj_jp2_decode_v2;
+ struct opj_event_mgr * )) jp2_decode_v2;
l_info->m_codec_data.m_decompression.opj_end_decompress = (opj_bool (*) (void *,struct opj_stream_private *,struct opj_event_mgr *)) jp2_end_decompress;
l_info->m_codec_data.m_decompression.opj_read_header = (opj_bool (*) (
struct opj_stream_private *,
void *,
- opj_image_t *,
+ opj_image_t **,
struct opj_event_mgr * )) jp2_read_header;
l_info->m_codec_data.m_decompression.opj_read_tile_header = ( opj_bool (*) (
struct opj_stream_private *,
struct opj_event_mgr * )) jp2_read_tile_header;
- l_info->m_codec_data.m_decompression.opj_decode_tile_data = (opj_bool (*) (void *,OPJ_UINT32,OPJ_BYTE*,OPJ_UINT32,struct opj_stream_private *, struct opj_event_mgr * )) opj_jp2_decode_tile;
+ l_info->m_codec_data.m_decompression.opj_decode_tile_data = (opj_bool (*) (void *,OPJ_UINT32,OPJ_BYTE*,OPJ_UINT32,struct opj_stream_private *, struct opj_event_mgr * )) jp2_decode_tile;
l_info->m_codec_data.m_decompression.opj_destroy = (void (*) (void *))jp2_destroy;
}
}
-void OPJ_CALLCONV opj_destroy_cstr_info_v2(opj_codestream_info_v2_t *cstr_info) {
- if (cstr_info) {
- int tileno, compno;
-
- if (cstr_info->tile_info){
- for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
- for (compno = 0; compno < cstr_info->nbcomps; compno++){
- opj_free(cstr_info->tile_info[tileno].tccp_info);
- }
- }
- opj_free(cstr_info->tile_info);
- }
-
- if (cstr_info->m_default_tile_info.tccp_info){
- opj_free(cstr_info->m_default_tile_info.tccp_info);
- }
-
- opj_free(cstr_info);
- }
-}
-
#ifdef OLD_WAY_MS
opj_bool OPJ_CALLCONV opj_read_header ( opj_stream_t *p_cio,
opj_codec_t *p_codec,
- opj_image_t *p_image )
+ opj_image_t **p_image )
{
if (p_codec && p_cio) {
opj_codec_private_t* l_info = (opj_codec_private_t*) p_codec;
return NULL;
}
+/*
+ *
+ *
+ */
+void OPJ_CALLCONV opj_destroy_cstr_info_v2(opj_codestream_info_v2_t **cstr_info) {
+ if (cstr_info) {
+
+ if ((*cstr_info)->m_default_tile_info.tccp_info){
+ opj_free((*cstr_info)->m_default_tile_info.tccp_info);
+ }
+
+ if ((*cstr_info)->tile_info){
+ /* FIXME not used for the moment*/
+ }
+
+ opj_free((*cstr_info));
+ (*cstr_info) = NULL;
+ }
+}
+
/*
*
*
return NULL;
}
+/*
+ *
+ *
+ */
+void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index)
+{
+ if (*p_cstr_index){
+
+ if((*p_cstr_index)->marker){
+ opj_free((*p_cstr_index)->marker);
+ (*p_cstr_index)->marker = NULL;
+ }
+
+ if((*p_cstr_index)->tile_index) {
+ /* FIXME not used for the moment*/
+ }
+
+ opj_free((*p_cstr_index));
+ (*p_cstr_index) = NULL;
+
+ }
+}
+
+
opj_bool OPJ_CALLCONV opj_decode_v2(opj_codec_t *p_info,
opj_stream_t *cio,
opj_image_t* p_image)
*/
OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info);
+OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info_v2(opj_codestream_info_v2_t **cstr_info);
/**
* Decodes an image header.
*/
OPJ_API opj_bool OPJ_CALLCONV opj_read_header ( opj_stream_t *p_cio,
opj_codec_t *p_codec,
- opj_image_t *p_image);
+ opj_image_t **p_image);
/**
* Destroy a decompressor handle
*/
OPJ_API opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec);
+OPJ_API void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index);
+
+
/**
* Get the JP2 file information from the codec FIXME
*
if (!l_t2) {
return NULL;
}
- memset(l_t2,0,sizeof(opj_t2_t));
+ memset(l_t2,0,sizeof(opj_t2_v2_t));
l_t2->image = p_image;
l_t2->cp = p_cp;