diff --git a/codec/image_to_j2k.c b/codec/image_to_j2k.c index 54bd0c92..e7047026 100644 --- a/codec/image_to_j2k.c +++ b/codec/image_to_j2k.c @@ -26,6 +26,14 @@ * POSSIBILITY OF SUCH DAMAGE. */ +//MEMORY LEAK +#ifdef _DEBUG +#define _CRTDBG_MAP_ALLOC +#include // Must be included first +#include +#endif +//MEM + #include #include #include @@ -895,5 +903,12 @@ int main(int argc, char **argv) free(cp.tcps[tileno].tccps); free(cp.tcps); + + //MEMORY LEAK + #ifdef _DEBUG + _CrtDumpMemoryLeaks(); + #endif + //MEM + return 0; } diff --git a/codec/j2k_to_image.c b/codec/j2k_to_image.c index 53104736..f1534d53 100644 --- a/codec/j2k_to_image.c +++ b/codec/j2k_to_image.c @@ -25,6 +25,14 @@ * POSSIBILITY OF SUCH DAMAGE. */ +//MEMORY LEAK +#ifdef _DEBUG +#define _CRTDBG_MAP_ALLOC +#include // Must be included first +#include +#endif +//MEM + #include @@ -39,9 +47,9 @@ int ceildiv(int a, int b) int main(int argc, char **argv) { - FILE *f; - char *src, *src_name; - char *dest, S1, S2, S3; + FILE *f=NULL; + char *src=NULL, *src_name=NULL; + char *dest=NULL, S1, S2, S3; int len; j2k_image_t img; @@ -50,7 +58,7 @@ int main(int argc, char **argv) int w, wr, wrr, h, hr, hrr, max; int i, image_type = -1, compno, pad, j; int adjust; - jp2_struct_t *jp2_struct; + jp2_struct_t *jp2_struct=NULL; if (argc < 3) { fprintf(stderr, @@ -553,5 +561,13 @@ int main(int argc, char **argv) break; } + j2k_dec_release(); + + //MEMORY LEAK + #ifdef _DEBUG + _CrtDumpMemoryLeaks(); + #endif + //MEM + return 0; } diff --git a/libopenjpeg/j2k.c b/libopenjpeg/j2k.c index e8f766e4..6c611adf 100644 --- a/libopenjpeg/j2k.c +++ b/libopenjpeg/j2k.c @@ -1458,6 +1458,7 @@ j2k_decode(unsigned char *src, int len, j2k_image_t * img, j2k_cp_t * cp) cio_init(src, len); for (;;) { + j2k_dec_mstabent_t *e; int id = cio_read(2); if (id >> 8 != 0xff) { @@ -1473,6 +1474,7 @@ j2k_decode(unsigned char *src, int len, j2k_image_t * img, j2k_cp_t * cp) if (e->handler) { (*e->handler) (); } + if (j2k_state == J2K_STATE_NEOC) break; /* RAJOUTE */ } @@ -1562,6 +1564,26 @@ j2k_decode_jpt_stream(unsigned char *src, int len, j2k_image_t * img, return 0; } +void j2k_dec_release() +{ + int i=0; + + //tcd_dec_release(); + + if (j2k_tile_len!=NULL) free(j2k_tile_len); + if (j2k_tile_data!=NULL) free(j2k_tile_data); + if (j2k_default_tcp.ppt_data!=NULL) free(j2k_default_tcp.ppt_data); + if (j2k_default_tcp.tccps!=NULL) free(j2k_default_tcp.tccps); + for (i=0;itw*j2k_cp->th;i++) { + if (j2k_cp->tcps[i].ppt_data!=NULL) free(j2k_cp->tcps[i].ppt_data); + if (j2k_cp->tcps[i].tccps!=NULL) free(j2k_cp->tcps[i].tccps); + } + if (j2k_cp->ppm_data!=NULL) free(j2k_cp->ppm_data); + if (j2k_cp->tcps!=NULL) free(j2k_cp->tcps); + if (j2k_img->comps!=NULL) free(j2k_img->comps); + if (j2k_cp->tileno!=NULL) free(j2k_cp->tileno); +} + #ifdef WIN32 #include diff --git a/libopenjpeg/j2k.h b/libopenjpeg/j2k.h index aafa9de6..7df8ecc7 100644 --- a/libopenjpeg/j2k.h +++ b/libopenjpeg/j2k.h @@ -220,4 +220,6 @@ LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t * img, int j2k_decode_jpt_stream(unsigned char *src, int len, j2k_image_t * img, j2k_cp_t * cp); +void j2k_dec_release();//antonin + #endif diff --git a/libopenjpeg/tcd.c b/libopenjpeg/tcd.c index ab71c129..ff9e0c95 100644 --- a/libopenjpeg/tcd.c +++ b/libopenjpeg/tcd.c @@ -1614,6 +1614,7 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) fprintf(stderr, "total: %ld.%.3ld s\n", time / CLOCKS_PER_SEC, (time % CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); + for (compno = 0; compno < tile->numcomps; compno++) { free(tcd_image.tiles[tileno].comps[compno].data); } @@ -1624,3 +1625,30 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) return l; } + +void tcd_dec_release() +{ + int tileno,compno,resno,bandno,precno; + for (tileno=0;tileno