diff options
| author | Antonin Descampe <antonin@gmail.com> | 2014-11-03 14:51:41 +0000 |
|---|---|---|
| committer | Antonin Descampe <antonin@gmail.com> | 2014-11-03 14:51:41 +0000 |
| commit | c3629e37a206ec8a60da6c00dbc04bf4a28b2868 (patch) | |
| tree | 1c61032428dee8ad7362e1ad38decaaca5a85545 /src/lib/openjp2/tcd.c | |
| parent | cf5153c518045027f286e08af36809237a76a7df (diff) | |
[trunk] significantly reduces memory for single tile RGB encoding (fixes
issue 375)
Diffstat (limited to 'src/lib/openjp2/tcd.c')
| -rw-r--r-- | src/lib/openjp2/tcd.c | 67 |
1 files changed, 41 insertions, 26 deletions
diff --git a/src/lib/openjp2/tcd.c b/src/lib/openjp2/tcd.c index 1720b8ef..e368d4ce 100644 --- a/src/lib/openjp2/tcd.c +++ b/src/lib/openjp2/tcd.c @@ -611,6 +611,37 @@ void opj_tcd_destroy(opj_tcd_t *tcd) { } } +OPJ_BOOL opj_alloc_tile_component_data(opj_tcd_tilecomp_t *l_tilec) +{ + if ((l_tilec->data == 00) || ((l_tilec->data_size_needed > l_tilec->data_size) && (l_tilec->ownsData == OPJ_FALSE))) { + l_tilec->data = (OPJ_INT32 *) opj_malloc(l_tilec->data_size_needed); + if (! l_tilec->data ) { + return OPJ_FALSE; + } + /*fprintf(stderr, "tAllocate data of tilec (int): %d x OPJ_UINT32n",l_data_size);*/ + l_tilec->data_size = l_tilec->data_size_needed; + l_tilec->ownsData = OPJ_TRUE; + } + else if (l_tilec->data_size_needed > l_tilec->data_size) { + OPJ_INT32 * new_data = (OPJ_INT32 *) opj_realloc(l_tilec->data, l_tilec->data_size_needed); + /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle tile datan"); */ + /* fprintf(stderr, "Not enough memory to handle tile data"); */ + if (! new_data) { + opj_free(l_tilec->data); + l_tilec->data = NULL; + l_tilec->data_size = 0; + l_tilec->data_size_needed = 0; + l_tilec->ownsData = OPJ_FALSE; + return OPJ_FALSE; + } + l_tilec->data = new_data; + /*fprintf(stderr, "tReallocate data of tilec (int): from %d to %d x OPJ_UINT32n", l_tilec->data_size, l_data_size);*/ + l_tilec->data_size = l_tilec->data_size_needed; + l_tilec->ownsData = OPJ_TRUE; + } + return OPJ_TRUE; +} + /* ----------------------------------------------------------------------- */ #define OPJ_MACRO_TCD_ALLOCATE(FUNCTION,TYPE,FRACTION,ELEMENT,FUNCTION_ELEMENT) \ OPJ_BOOL FUNCTION ( opj_tcd_t *p_tcd, \ @@ -695,29 +726,10 @@ OPJ_BOOL FUNCTION ( opj_tcd_t *p_tcd, \ - l_cp->m_specific_param.m_dec.m_reduce; \ } \ \ - if (l_tilec->data == 00) { \ - l_tilec->data = (OPJ_INT32 *) opj_malloc(l_data_size); \ - if (! l_tilec->data ) { \ - return OPJ_FALSE; \ - } \ - /*fprintf(stderr, "\tAllocate data of tilec (int): %d x OPJ_UINT32\n",l_data_size);*/ \ - \ - l_tilec->data_size = l_data_size; \ - } \ - else if (l_data_size > l_tilec->data_size) { \ - OPJ_INT32 * new_data = (OPJ_INT32 *) opj_realloc(l_tilec->data, l_data_size); \ - /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle tile data\n"); */ \ - fprintf(stderr, "Not enough memory to handle tile data\n"); \ - if (! new_data) { \ - opj_free(l_tilec->data); \ - l_tilec->data = NULL; \ - l_tilec->data_size = 0; \ - return OPJ_FALSE; \ - } \ - l_tilec->data = new_data; \ - /*fprintf(stderr, "\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\n", l_tilec->data_size, l_data_size);*/ \ - l_tilec->data_size = l_data_size; \ - } \ + l_tilec->data_size_needed = l_data_size; \ + if (p_tcd->m_is_decoder && !opj_alloc_tile_component_data(l_tilec)) { \ + return OPJ_FALSE; \ + } \ \ l_data_size = l_tilec->numresolutions * (OPJ_UINT32)sizeof(opj_tcd_resolution_t); \ \ @@ -1457,9 +1469,12 @@ void opj_tcd_free_tile(opj_tcd_t *p_tcd) l_tile_comp->resolutions = 00; } - if (l_tile_comp->data) { + if (l_tile_comp->ownsData && l_tile_comp->data) { opj_free(l_tile_comp->data); l_tile_comp->data = 00; + l_tile_comp->ownsData = 0; + l_tile_comp->data_size = 0; + l_tile_comp->data_size_needed = 0; } ++l_tile_comp; } @@ -1512,7 +1527,7 @@ OPJ_BOOL opj_tcd_t1_decode ( opj_tcd_t *p_tcd ) opj_tccp_t * l_tccp = p_tcd->tcp->tccps; - l_t1 = opj_t1_create(); + l_t1 = opj_t1_create(OPJ_FALSE); if (l_t1 == 00) { return OPJ_FALSE; } @@ -1947,7 +1962,7 @@ OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd ) const OPJ_FLOAT64 * l_mct_norms; opj_tcp_t * l_tcp = p_tcd->tcp; - l_t1 = opj_t1_create(); + l_t1 = opj_t1_create(OPJ_TRUE); if (l_t1 == 00) { return OPJ_FALSE; } |
