Aligned malloc using Intel's _mm_malloc(), cleanup on the t1 memory allocation, getting rid of some leftover debug code
This commit is contained in:
parent
ca2a0114a2
commit
3810e943b1
|
@ -10,6 +10,7 @@ August 21, 2007
|
||||||
* [FOD] Robustified MJ2 codecs
|
* [FOD] Robustified MJ2 codecs
|
||||||
* [Parvatha] Solved problems with codec reading from image file directory when filename had more than one "." in name
|
* [Parvatha] Solved problems with codec reading from image file directory when filename had more than one "." in name
|
||||||
* [Callum Lerwick] Minor cleanup patch, that gets rid of a bunch of "old style declaration" warnings from Intel's compiler
|
* [Callum Lerwick] Minor cleanup patch, that gets rid of a bunch of "old style declaration" warnings from Intel's compiler
|
||||||
|
* [Callum Lerwick] Aligned malloc using Intel's _mm_malloc(). Cleanup on the t1 memory allocation, getting rid of some leftover debug code
|
||||||
|
|
||||||
August 20, 2007
|
August 20, 2007
|
||||||
+ [FOD] Added support for the TGA file format in the codec
|
+ [FOD] Added support for the TGA file format in the codec
|
||||||
|
|
|
@ -32,6 +32,10 @@
|
||||||
The functions in J2K_LIB.C are internal utilities mainly used for memory management.
|
The functions in J2K_LIB.C are internal utilities mainly used for memory management.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GCC__
|
||||||
|
#define __attribute__(x) /* */
|
||||||
|
#endif
|
||||||
|
|
||||||
/** @defgroup MISC MISC - Miscellaneous internal functions */
|
/** @defgroup MISC MISC - Miscellaneous internal functions */
|
||||||
/*@{*/
|
/*@{*/
|
||||||
|
|
||||||
|
@ -50,7 +54,16 @@ Allocate a memory block with elements initialized to 0
|
||||||
@param size Bytes to allocate
|
@param size Bytes to allocate
|
||||||
@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
|
@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
|
||||||
*/
|
*/
|
||||||
void* opj_malloc( size_t size );
|
void* __attribute__ ((malloc)) opj_malloc( size_t size );
|
||||||
|
|
||||||
|
/**
|
||||||
|
Allocate memory aligned to a 16 byte boundry
|
||||||
|
@param size Bytes to allocate
|
||||||
|
@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
|
||||||
|
*/
|
||||||
|
#include <xmmintrin.h>
|
||||||
|
#define opj_aligned_malloc(size) _mm_malloc(size, 16)
|
||||||
|
#define opj_aligned_free(m) _mm_free(m)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Reallocate memory blocks.
|
Reallocate memory blocks.
|
||||||
|
@ -58,7 +71,7 @@ Reallocate memory blocks.
|
||||||
@param size New size in bytes
|
@param size New size in bytes
|
||||||
@return Returns a void pointer to the reallocated (and possibly moved) memory block
|
@return Returns a void pointer to the reallocated (and possibly moved) memory block
|
||||||
*/
|
*/
|
||||||
void* opj_realloc( void *memblock, size_t size );
|
void* __attribute__ ((malloc)) opj_realloc( void *memblock, size_t size );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Deallocates or frees a memory block.
|
Deallocates or frees a memory block.
|
||||||
|
|
|
@ -758,47 +758,41 @@ static double t1_getwmsedec(
|
||||||
return wmsedec;
|
return wmsedec;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void allocate_buffers(
|
static bool allocate_buffers(
|
||||||
opj_t1_t *t1,
|
opj_t1_t *t1,
|
||||||
int w,
|
int w,
|
||||||
int h)
|
int h)
|
||||||
{
|
{
|
||||||
int datasize;
|
int datasize=w * h;
|
||||||
int flagssize;
|
int flagssize;
|
||||||
|
|
||||||
datasize=w * h;
|
|
||||||
//fprintf(stderr,"w=%i h=%i datasize=%i flagssize=%i\n",w,h,datasize,flagssize);
|
|
||||||
|
|
||||||
if(datasize > t1->datasize){
|
if(datasize > t1->datasize){
|
||||||
//fprintf(stderr,"Allocating t1->data: datasize=%i\n",datasize);
|
opj_aligned_free(t1->data);
|
||||||
free(t1->data);
|
t1->data=opj_aligned_malloc(datasize * sizeof(int));
|
||||||
t1->data=malloc(datasize * sizeof(int));
|
|
||||||
if(!t1->data){
|
if(!t1->data){
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
t1->datasize=datasize;
|
t1->datasize=datasize;
|
||||||
}
|
}
|
||||||
//memset(t1->data,0xff,t1->datasize);
|
|
||||||
memset(t1->data,0,datasize * sizeof(int));
|
memset(t1->data,0,datasize * sizeof(int));
|
||||||
|
|
||||||
t1->flags_stride=w+2;
|
t1->flags_stride=w+2;
|
||||||
flagssize=t1->flags_stride * (h+2);
|
flagssize = t1->flags_stride * (h+2);
|
||||||
|
|
||||||
if(flagssize > t1->flagssize){
|
if(flagssize > t1->flagssize){
|
||||||
//fprintf(stderr,"Allocating t1->flags: flagssize=%i\n",flagssize);
|
opj_aligned_free(t1->flags);
|
||||||
free(t1->flags);
|
t1->flags=opj_aligned_malloc(flagssize * sizeof(flag_t));
|
||||||
t1->flags=malloc(flagssize * sizeof(flag_t));
|
|
||||||
if(!t1->flags){
|
if(!t1->flags){
|
||||||
fprintf(stderr,"Allocating t1->flags FAILED!\n");
|
return false;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
t1->flagssize=flagssize;
|
t1->flagssize=flagssize;
|
||||||
}
|
}
|
||||||
//memset(t1->flags,0xff,t1->flagssize);
|
|
||||||
memset(t1->flags,0,flagssize * sizeof(flag_t));
|
memset(t1->flags,0,flagssize * sizeof(flag_t));
|
||||||
|
|
||||||
t1->w=w;
|
t1->w=w;
|
||||||
t1->h=h;
|
t1->h=h;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** mod fixed_quality */
|
/** mod fixed_quality */
|
||||||
|
@ -948,12 +942,15 @@ static void t1_decode_cblk(
|
||||||
|
|
||||||
opj_raw_t *raw = t1->raw; /* RAW component */
|
opj_raw_t *raw = t1->raw; /* RAW component */
|
||||||
opj_mqc_t *mqc = t1->mqc; /* MQC component */
|
opj_mqc_t *mqc = t1->mqc; /* MQC component */
|
||||||
|
|
||||||
allocate_buffers(
|
if(!allocate_buffers(
|
||||||
t1,
|
t1,
|
||||||
cblk->x1 - cblk->x0,
|
cblk->x1 - cblk->x0,
|
||||||
cblk->y1 - cblk->y0);
|
cblk->y1 - cblk->y0))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bpno = roishift + cblk->numbps - 1;
|
bpno = roishift + cblk->numbps - 1;
|
||||||
passtype = 2;
|
passtype = 2;
|
||||||
|
|
||||||
|
@ -1025,8 +1022,8 @@ void t1_destroy(opj_t1_t *t1) {
|
||||||
/* destroy MQC and RAW handles */
|
/* destroy MQC and RAW handles */
|
||||||
mqc_destroy(t1->mqc);
|
mqc_destroy(t1->mqc);
|
||||||
raw_destroy(t1->raw);
|
raw_destroy(t1->raw);
|
||||||
free(t1->data);
|
opj_aligned_free(t1->data);
|
||||||
free(t1->flags);
|
opj_aligned_free(t1->flags);
|
||||||
free(t1);
|
free(t1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1067,10 +1064,13 @@ void t1_encode_cblks(
|
||||||
y += pres->y1 - pres->y0;
|
y += pres->y1 - pres->y0;
|
||||||
}
|
}
|
||||||
|
|
||||||
allocate_buffers(
|
if(!allocate_buffers(
|
||||||
t1,
|
t1,
|
||||||
cblk->x1 - cblk->x0,
|
cblk->x1 - cblk->x0,
|
||||||
cblk->y1 - cblk->y0);
|
cblk->y1 - cblk->y0))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
w = tilec->x1 - tilec->x0;
|
w = tilec->x1 - tilec->x0;
|
||||||
if (tcp->tccps[compno].qmfbid == 1) {
|
if (tcp->tccps[compno].qmfbid == 1) {
|
||||||
|
|
|
@ -192,7 +192,7 @@ void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int c
|
||||||
tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
|
tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
|
||||||
tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
|
tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
|
||||||
|
|
||||||
tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
|
tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
|
||||||
tilec->numresolutions = tccp->numresolutions;
|
tilec->numresolutions = tccp->numresolutions;
|
||||||
|
|
||||||
tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
|
tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
|
||||||
|
@ -437,7 +437,7 @@ void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int cur
|
||||||
tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
|
tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
|
||||||
tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
|
tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
|
||||||
|
|
||||||
tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
|
tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
|
||||||
tilec->numresolutions = tccp->numresolutions;
|
tilec->numresolutions = tccp->numresolutions;
|
||||||
/* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */
|
/* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */
|
||||||
for (resno = 0; resno < tilec->numresolutions; resno++) {
|
for (resno = 0; resno < tilec->numresolutions; resno++) {
|
||||||
|
@ -676,7 +676,7 @@ void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp,
|
||||||
tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
|
tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
|
||||||
tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
|
tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
|
||||||
|
|
||||||
tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
|
tilec->data = (int*) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
|
||||||
tilec->numresolutions = tccp->numresolutions;
|
tilec->numresolutions = tccp->numresolutions;
|
||||||
tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
|
tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
|
||||||
|
|
||||||
|
@ -1279,14 +1279,14 @@ int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, op
|
||||||
if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){
|
if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){
|
||||||
tcd->encoding_time = opj_clock() - tcd->encoding_time;
|
tcd->encoding_time = opj_clock() - tcd->encoding_time;
|
||||||
opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time);
|
opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time);
|
||||||
|
|
||||||
/* cleaning memory */
|
/* cleaning memory */
|
||||||
for (compno = 0; compno < tile->numcomps; compno++) {
|
for (compno = 0; compno < tile->numcomps; compno++) {
|
||||||
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
|
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
|
||||||
opj_free(tilec->data);
|
opj_aligned_free(tilec->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1401,12 +1401,12 @@ bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno) {
|
||||||
|
|
||||||
tile_time = opj_clock() - tile_time; /* time needed to decode a tile */
|
tile_time = opj_clock() - tile_time; /* time needed to decode a tile */
|
||||||
opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time);
|
opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time);
|
||||||
|
|
||||||
for (compno = 0; compno < tile->numcomps; compno++) {
|
for (compno = 0; compno < tile->numcomps; compno++) {
|
||||||
opj_free(tcd->tcd_image->tiles[tileno].comps[compno].data);
|
opj_aligned_free(tcd->tcd_image->tiles[tileno].comps[compno].data);
|
||||||
tcd->tcd_image->tiles[tileno].comps[compno].data = NULL;
|
tcd->tcd_image->tiles[tileno].comps[compno].data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eof) {
|
if (eof) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue