Bug fixed by David Bruken. Fixed memory allocation issue in opj_malloc.h.

Possible errors in pi_create_encode handled
This commit is contained in:
Francois-Olivier Devaux 2007-12-21 10:19:01 +00:00
parent 847b082b64
commit 287fb0b8fd
5 changed files with 160 additions and 144 deletions

View File

@ -5,6 +5,10 @@ What's New for OpenJPEG
! : changed ! : changed
+ : added + : added
December 21, 2007
* [FOD] Bug fixed by David Bruken. Fixed memory allocation issue in opj_malloc.h
! [FOD] Possible errors in pi_create_encode handled
December 19, 2007 December 19, 2007
* [Antonin] changed variables names alpha, beta, gamma, delta in dwt.c to avoid re-declarations on Macosx * [Antonin] changed variables names alpha, beta, gamma, delta in dwt.c to avoid re-declarations on Macosx
! [Parvatha] In pi.c, removed the Recursive function pi_check_next_level() and modified the code. ! [Parvatha] In pi.c, removed the Recursive function pi_check_next_level() and modified the code.

View File

@ -1,140 +1,145 @@
/* /*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2007, Callum Lerwick <seg@haxxed.com> * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __OPJ_MALLOC_H #ifndef __OPJ_MALLOC_H
#define __OPJ_MALLOC_H #define __OPJ_MALLOC_H
/** /**
@file opj_malloc.h @file opj_malloc.h
@brief Internal functions @brief Internal functions
The functions in opj_malloc.h are internal utilities used for memory management. The functions in opj_malloc.h are internal utilities used for memory management.
*/ */
/** @defgroup MISC MISC - Miscellaneous internal functions */ /** @defgroup MISC MISC - Miscellaneous internal functions */
/*@{*/ /*@{*/
/** @name Exported functions */ /** @name Exported functions */
/*@{*/ /*@{*/
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
/** /**
Allocate an uninitialized memory block Allocate an uninitialized memory block
@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
*/ */
#define opj_malloc(size) malloc(size) #define opj_malloc(size) malloc(size)
/** /**
Allocate a memory block with elements initialized to 0 Allocate a memory block with elements initialized to 0
@param num Blocks to allocate @param num Blocks to allocate
@param size Bytes per block to allocate @param size Bytes per block 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
*/ */
#define opj_calloc(num, size) calloc(num, size) #define opj_calloc(num, size) calloc(num, size)
/** /**
Allocate memory aligned to a 16 byte boundry Allocate memory aligned to a 16 byte boundry
@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
*/ */
/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */ /* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */
#ifdef WIN32 #ifdef WIN32
/* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */ /* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
#ifdef __GNUC__ #ifdef __GNUC__
#include <mm_malloc.h> #include <mm_malloc.h>
#define HAVE_MM_MALLOC #define HAVE_MM_MALLOC
#else /* MSVC, Intel C++ */ #else /* MSVC, Intel C++ */
#include <malloc.h> #include <malloc.h>
#ifdef _mm_malloc #ifdef _mm_malloc
#define HAVE_MM_MALLOC #define HAVE_MM_MALLOC
#endif #endif
#endif #endif
#else /* Not WIN32 */ #else /* Not WIN32 */
#if defined(__sun) #if defined(__sun)
#define HAVE_MEMALIGN #define HAVE_MEMALIGN
/* Linux x86_64 and OSX always align allocations to 16 bytes */ #elif defined(__GNUC__)
#elif !defined(__amd64__) && !defined(__APPLE__) #define HAVE_MEMALIGN
/* FIXME: Yes, this is a big assumption */ #include <malloc.h>
#define HAVE_POSIX_MEMALIGN /* Linux x86_64 and OSX always align allocations to 16 bytes */
#endif #elif !defined(__amd64__) && !defined(__APPLE__)
#endif /* FIXME: Yes, this is a big assumption */
#define HAVE_POSIX_MEMALIGN
#define opj_aligned_malloc(size) malloc(size) #endif
#define opj_aligned_free(m) free(m) #endif
#ifdef HAVE_MM_MALLOC
#undef opj_aligned_malloc
#define opj_aligned_malloc(size) _mm_malloc(size, 16) #define opj_aligned_malloc(size) malloc(size)
#undef opj_aligned_free #define opj_aligned_free(m) free(m)
#define opj_aligned_free(m) _mm_free(m)
#endif #ifdef HAVE_MM_MALLOC
#undef opj_aligned_malloc
#ifdef HAVE_MEMALIGN #define opj_aligned_malloc(size) _mm_malloc(size, 16)
extern void* memalign(size_t, size_t); #undef opj_aligned_free
#undef opj_aligned_malloc #define opj_aligned_free(m) _mm_free(m)
#define opj_aligned_malloc(size) memalign(16, (size)) #endif
#undef opj_aligned_free
#define opj_aligned_free(m) free(m) #ifdef HAVE_MEMALIGN
#endif extern void* memalign(size_t, size_t);
#undef opj_aligned_malloc
#ifdef HAVE_POSIX_MEMALIGN #define opj_aligned_malloc(size) memalign(16, (size))
#undef opj_aligned_malloc #undef opj_aligned_free
extern int posix_memalign(void**, size_t, size_t); #define opj_aligned_free(m) free(m)
#endif
static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
void* mem = NULL; #ifdef HAVE_POSIX_MEMALIGN
posix_memalign(&mem, 16, size); #undef opj_aligned_malloc
return mem; extern int posix_memalign(void**, size_t, size_t);
}
#undef opj_aligned_free static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
#define opj_aligned_free(m) free(m) void* mem = NULL;
#endif posix_memalign(&mem, 16, size);
return mem;
/** }
Reallocate memory blocks. #undef opj_aligned_free
@param memblock Pointer to previously allocated memory block #define opj_aligned_free(m) free(m)
@param size New size in bytes #endif
@return Returns a void pointer to the reallocated (and possibly moved) memory block
*/ /**
#define opj_realloc(m, s) realloc(m, s) Reallocate memory blocks.
@param memblock Pointer to previously allocated memory block
/** @param size New size in bytes
Deallocates or frees a memory block. @return Returns a void pointer to the reallocated (and possibly moved) memory block
@param memblock Previously allocated memory block to be freed */
*/ #define opj_realloc(m, s) realloc(m, s)
#define opj_free(m) free(m)
/**
#ifdef __GNUC__ Deallocates or frees a memory block.
#pragma GCC poison malloc calloc realloc free @param memblock Previously allocated memory block to be freed
#endif */
#define opj_free(m) free(m)
/* ----------------------------------------------------------------------- */
/*@}*/ #ifdef __GNUC__
#pragma GCC poison malloc calloc realloc free
/*@}*/ #endif
#endif /* __OPJ_MALLOC_H */ /* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
#endif /* __OPJ_MALLOC_H */

View File

@ -726,7 +726,7 @@ bool pi_next(opj_pi_iterator_t * pi) {
return false; return false;
} }
void pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){ bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){
char prog[4]; char prog[4];
int i; int i;
int incr_top=1,resetX=0; int incr_top=1,resetX=0;
@ -746,7 +746,9 @@ void pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,
case RLCP: strncpy(prog, "RLCP",4); case RLCP: strncpy(prog, "RLCP",4);
break; break;
case RPCL: strncpy(prog, "RPCL",4); case RPCL: strncpy(prog, "RPCL",4);
break; break;
case PROG_UNKNOWN:
return true;
} }
if(!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))){ if(!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))){
@ -956,5 +958,6 @@ void pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,
} }
} }
} }
return false;
} }

View File

@ -118,8 +118,9 @@ Modify the packet iterator for enabling tile part generation
@param tpnum Tile part number of the current tile @param tpnum Tile part number of the current tile
@param tppos The position of the tile part flag in the progression order @param tppos The position of the tile part flag in the progression order
@param cur_totnum_tp The total number of tile parts in the current tile @param cur_totnum_tp The total number of tile parts in the current tile
@return Returns true if an error is detected
*/ */
void pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp); bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp);
/** /**
Create a packet iterator for Decoder Create a packet iterator for Decoder
@param image Raw image for which the packets will be listed @param image Raw image for which the packets will be listed

View File

@ -612,7 +612,10 @@ int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlaye
for(poc = 0; poc < pocno ; poc++){ for(poc = 0; poc < pocno ; poc++){
int comp_len = 0; int comp_len = 0;
int tpnum = compno; int tpnum = compno;
pi_create_encode(pi, cp,tileno,poc,tpnum,tppos,t2_mode,cur_totnum_tp); if (pi_create_encode(pi, cp,tileno,poc,tpnum,tppos,t2_mode,cur_totnum_tp)) {
opj_event_msg(t2->cinfo, EVT_ERROR, "Error initializing Packet Iterator\n");
return -999;
}
while (pi_next(&pi[poc])) { while (pi_next(&pi[poc])) {
if (pi[poc].layno < maxlayers) { if (pi[poc].layno < maxlayers) {
e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c, cstr_info, tileno); e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c, cstr_info, tileno);