Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

GdiPlus error on GetImageEncodersSize

100 views
Skip to first unread message

vdm

unread,
Jun 3, 2008, 8:01:01 AM6/3/08
to
I wrote my own directshow filter which will make jpp snapshot. pOutBuffer is
BYTE * pointer to the video sample. Filter crashs on function:
GetImageEncodersSize(&num, &size);
Here is code. What is wrong here?

Gdiplus::Bitmap * pBitmap = new Gdiplus::Bitmap(320, 240, 320*4,
PixelFormat32bppRGB, pOutBuffer);

Gdiplus::Bitmap* pbm=NULL;

IStream *inf=NULL;
CreateStreamOnHGlobal(NULL, TRUE, &inf);
if(inf)
{
CLSID clsidEncoder;
USHORT uQuality = 75;
EncoderParameters encoderParams;
encoderParams.Count = 1;
encoderParams.Parameter[0].NumberOfValues = 1;
encoderParams.Parameter[0].Guid = EncoderQuality;
encoderParams.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParams.Parameter[0].Value = &uQuality;
GetEncoderClsid(L"image/jpg", &clsidEncoder);
if(Gdiplus::Ok==pBitmap->Save(inf, &clsidEncoder))
pbm=Gdiplus::Bitmap::FromStream(inf);
inf->Release();
pbm->Save(L"C:\\pucture.jpg",&clsidEncoder,&encoderParams);
}

if(pbm && pbm->GetLastStatus()!=Gdiplus::Ok)
{
delete pbm;
pbm=NULL;
}


int GetEncoderClsid(WCHAR *format, CLSID *pClsid)
{
unsigned int num = 0, size = 0;
GetImageEncodersSize(&num, &size); //HERE FILTER CRASHS
if(size == 0) return -1;
ImageCodecInfo *pImageCodecInfo = (ImageCodecInfo *)(malloc(size));
if(pImageCodecInfo == NULL) return -1;
GetImageEncoders(num, size, pImageCodecInfo);
for(unsigned int j = 0; j < num; ++j){
if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0){
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j;
}
}
free(pImageCodecInfo);
return -1;
}


0 new messages