Hi yall,
I really spent precious time getting on top of this nasty one ...
In nglImageJPEGCodec_shr.cpp :
bool nglImageJPEGCodec::Feed(nglIStream* pIStream)
{
while(pIStream->Available() && pIStream->GetState() == eStreamReady)
{
switch(mState)
{
case jpegReadHeader:
if(ReadHeader(pIStream))
{
mpBuffer = mpImage->GetBuffer() +
mLineSize*(mpImage->GetHeight()-1);
mState = jpegReadData;
}
break;
case(jpegReadData):
ReadData();
SendData((float)mLine/(float)mpImage->GetHeight());
return (pIStream->GetState()==eStreamWait) ||
(pIStream->GetState()==eStreamReady);
break;
case(jpegError):
return false;
}
}
return (pIStream->GetState()==eStreamWait) ||
(pIStream->GetState()==eStreamReady);
}
This F&[EMAIL PROTECTED] routine miserably fails and leaks teraloads of garbage to
memory when actual file size is less than : INPUT_BUF_SIZE ...
The patch below seems to correct the flaw.
bool nglImageJPEGCodec::Feed(nglIStream* pIStream)
{
while(pIStream->Available() && pIStream->GetState() == eStreamReady)
{
switch(mState)
{
case jpegReadHeader:
if(!ReadHeader(pIStream))
{
jpeg_finish_decompress(&mCinfo);
jpeg_destroy_decompress(&mCinfo);
mState = jpegError;
return false;
}
mpBuffer = mpImage->GetBuffer() +
mLineSize*(mpImage->GetHeight()-1);
mState = jpegReadData;
/*fallthru!*/
case(jpegReadData):
ReadData();
SendData((float)mLine/(float)mpImage->GetHeight());
if((pIStream->GetState()!=eStreamWait) &&
(pIStream->GetState()!=eStreamReady))
{
return false;
}
break;
case(jpegError):
return false;
}
}
return (pIStream->GetState()==eStreamWait) ||
(pIStream->GetState()==eStreamReady);
}
I haven't looked to other codecs but if the same shit happens it might
be worth propagating the fix.
Cheers.
Lo.
_______________________________________________
https://mail.gna.org/listinfo/ngl-devel