Memory Leak converting JP2 to JPG
Posted: 2012-08-20T04:38:37-07:00
Hello - I am experiencing a memory leak when trying to convert JP2 frames into JPG frames.
I am pretty new to ImageMagick, so i'm fairly certain the problem is on my end, but i'm not sure what i am doing wrong. From everything i've found, it seems like i'm doing things correctly, but i feel like i must be missing a step somewhere.
The leak appears to be rooted at line 106 of jas_malloc.c
I am using ImageMagick-6.7.7, build into static libraries from source.
If anyone has any advice, it would be much appreciated.
Many thanks!
-gS
I am pretty new to ImageMagick, so i'm fairly certain the problem is on my end, but i'm not sure what i am doing wrong. From everything i've found, it seems like i'm doing things correctly, but i feel like i must be missing a step somewhere.
The leak appears to be rooted at line 106 of jas_malloc.c
I am using ImageMagick-6.7.7, build into static libraries from source.
If anyone has any advice, it would be much appreciated.
Code: Select all
// p_pBufferJP2: Input JP2 Image BLOB
// p_iSizeJP2: Input size of JP2 Image BLOB
// p_pBufferJPG: Output buffer for JPG Image
// p_iSizeJPG: Size of Output buffer
bool ConvertJP2toJPG( BYTE*& p_pBufferJP2, const int p_iSizeJP2, BYTE*& p_pBufferJPG, int& p_iSizeJPG )
{
bool bResult = false;
MagickBooleanType bStatus = MagickFalse;
BYTE* pBuffJPG = NULL;
size_t sLength = 0;
MagickWandGenesis();
MagickWand* pIMWand = NewMagickWand();
if( pIMWand && p_pBufferJP2 && p_iSizeJP2 > 0 )
{
try
{
// Set Wand Format
bStatus = MagickSetFormat( pIMWand, "JP2");
// read the blob
bStatus = MagickReadImageBlob( pIMWand, p_pBufferJP2, p_iSizeJP2 );
if( bStatus == MagickFalse )
{
ExceptionType exType;
std::string strException( MagickGetException( pIMWand, &exType ) );
ISCOUT_VIDEO_TRANSCODER_TRACE1( "============== ImageMagicException: %s\n", strException.c_str() );
}
else
{
// convert to a jpg
bStatus = MagickSetFormat( pIMWand, "JPG" );
if( bStatus == MagickFalse )
{
ExceptionType exType;
std::string strException( MagickGetException( pIMWand, &exType ) );
ISCOUT_VIDEO_TRANSCODER_TRACE1( "============== ImageMagicException: %s\n", strException.c_str() );
}
else
{
// read out the converted image
pBuffJPG = MagickGetImageBlob( pIMWand, &sLength );
if( pBuffJPG == NULL )
{
ExceptionType exType;
std::string strException( MagickGetException( pIMWand, &exType ) );
ISCOUT_VIDEO_TRANSCODER_TRACE1( "============== ImageMagicException: %s\n", strException.c_str() );
}
else
{
// ptr points to a buffer of size len bytes w/ the jpeg image.
// Needs to be copied to another buffer of size len so that ImageMagick can relinquish the memory.
p_pBufferJPG = new BYTE[ sLength ];
memcpy( p_pBufferJPG, pBuffJPG, sLength );
p_iSizeJPG = sLength;
MagickRelinquishMemory( pBuffJPG );
bResult = true;
}
}
}
}
catch( std::exception& ex )
{
std::string strEx( ex.what() );
ISCOUT_VIDEO_TRANSCODER_TRACE3(" %s:%d: Exception: %s\n", __FUNCTION__, __LINE__, strEx.c_str() );
}
catch( ... )
{
ISCOUT_VIDEO_TRANSCODER_TRACE2(" %s:%d: Exception\n", __FUNCTION__, __LINE__ );
}
}
return bResult;
}
-gS