[trunk] WIP: correct some memory leaks in applications functions

This commit is contained in:
Mickael Savinaud 2011-10-12 14:42:21 +00:00
parent 195190b612
commit 27e255fa75
11 changed files with 153 additions and 97 deletions

View File

@ -6,6 +6,7 @@ What's New for OpenJPEG
+ : 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)

View File

@ -372,19 +372,21 @@ int main(int argc, char *argv[])
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(&parameters);
@ -512,6 +514,7 @@ int main(int argc, char *argv[])
opj_stream_destroy(cio);
fclose(fsrc);
opj_destroy_codec(dinfo);
opj_image_destroy(image);
fclose(fout);
return EXIT_FAILURE;
}
@ -603,7 +606,13 @@ int main(int argc, char *argv[])
}
/* 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);
}

View File

@ -576,7 +576,7 @@ int main(int argc, char **argv)
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 */
@ -712,7 +712,7 @@ int main(int argc, char **argv)
}
/* 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);
@ -725,23 +725,23 @@ int main(int argc, char **argv)
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 {
@ -750,7 +750,7 @@ int main(int argc, char **argv)
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 {
@ -759,7 +759,7 @@ int main(int argc, char **argv)
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 {
@ -768,7 +768,7 @@ int main(int argc, char **argv)
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 {
@ -777,7 +777,7 @@ int main(int argc, char **argv)
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 {
@ -786,7 +786,7 @@ int main(int argc, char **argv)
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 {
@ -795,7 +795,7 @@ int main(int argc, char **argv)
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 {
@ -817,10 +817,10 @@ int main(int argc, char **argv)
/* free image data structure */
opj_image_destroy(&image);
opj_image_destroy(image);
}
return 0;
return EXIT_SUCCESS;
}
//end main

View File

@ -74,6 +74,7 @@ void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) {
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]);
@ -87,7 +88,8 @@ void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) {
if(image->icc_profile_buf) {
opj_free(image->icc_profile_buf);
}
//FIXME opj_free(image);
opj_free(image);
}
}

View File

@ -776,7 +776,7 @@ static opj_bool j2k_read_cbd ( opj_j2k_v2_t *p_j2k,
*
* @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);
@ -5796,13 +5796,12 @@ opj_bool j2k_end_decompress(
*/
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 */
@ -5831,6 +5830,11 @@ opj_bool j2k_read_header( struct opj_stream_private *p_stream,
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;
@ -5841,42 +5845,41 @@ opj_bool j2k_read_header( struct opj_stream_private *p_stream,
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;
}
@ -6327,7 +6330,7 @@ void j2k_destroy (opj_j2k_v2_t *p_j2k)
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;
@ -6338,22 +6341,26 @@ void j2k_destroy (opj_j2k_v2_t *p_j2k)
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
if (p_cstr_ind->tile_index) {
// FIXME not used for the moment
}
opj_free(p_cstr_ind);
}
}
@ -7597,6 +7604,8 @@ opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_v2_t* p_j2k)
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;
@ -7670,6 +7679,7 @@ opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_v2_t* p_j2k)
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;
}
@ -7765,20 +7775,24 @@ opj_bool j2k_decode_v2( opj_j2k_v2_t * p_j2k,
{
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;
}

View File

@ -899,7 +899,7 @@ opj_bool j2k_end_decompress(opj_j2k_v2_t *j2k, struct opj_stream_private *cio, s
*/
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 );

View File

@ -1484,11 +1484,14 @@ opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio,
}/* 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");
@ -2438,7 +2441,7 @@ static opj_bool jp2_read_boxhdr_char(
*/
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
)
{
@ -2527,7 +2530,7 @@ opj_bool jp2_read_tile_header( opj_jp2_v2_t * p_jp2,
* @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,

View File

@ -293,10 +293,10 @@ opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_
* @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);
/**
@ -348,7 +348,7 @@ opj_bool jp2_end_decompress(opj_jp2_v2_t *jp2, struct opj_stream_private *cio, s
*/
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
);
@ -378,7 +378,7 @@ opj_bool jp2_read_tile_header (
* @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,

View File

@ -40,7 +40,7 @@ typedef struct opj_decompression
/** 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,
@ -259,7 +259,7 @@ opj_codec_t* OPJ_CALLCONV opj_create_decompress_v2(OPJ_CODEC_FORMAT p_format)
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 =
@ -306,14 +306,14 @@ opj_codec_t* OPJ_CALLCONV opj_create_decompress_v2(OPJ_CODEC_FORMAT p_format)
(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 (*) (
@ -329,7 +329,7 @@ opj_codec_t* OPJ_CALLCONV opj_create_decompress_v2(OPJ_CODEC_FORMAT p_format)
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;
@ -663,27 +663,6 @@ void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) {
}
}
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
@ -724,7 +703,7 @@ opj_bool OPJ_CALLCONV opj_read_header (
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;
@ -923,6 +902,26 @@ opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_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;
}
}
/*
*
*
@ -938,6 +937,30 @@ opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec)
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)

View File

@ -1262,6 +1262,7 @@ Destroy Codestream information after compression or decompression
*/
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.
@ -1274,7 +1275,7 @@ OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info
*/
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
@ -1386,6 +1387,9 @@ OPJ_API opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_
*/
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
*

View File

@ -970,7 +970,7 @@ opj_t2_v2_t* t2_create_v2( opj_image_t *p_image,
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;