Hi all,
I am trying to draw a line over the live video streaming in direct show application. Am successfully drawing a line but if I continuously want to create a line by calling the below function, i got an error E_OUTOFMEMORY from the SetAlphaBitmap(). Am calling drawlineOverlay() function one after the other and 8 of the calling is ok, but the ninth and subsequent ones do not. SetAlphaBitmap returns S_OK for the first 8 callings and then the 9th returns 8007000E.
Why is this error occuring?
Thanks!!
What I have tried:
void drawlineOverlay(HWND m_hwndApp)
{
int cx, cy;
HRESULT hr;
HBITMAP hbm;
RECT rcClient;
GetResolution(&cx,&cy);
GetClientRect(m_hwndApp,&rcClient);
HDC hdc = GetDC(m_hwndApp);
if (hdc == NULL)
{
return E_FAIL;
}
HDC hdcBmp = CreateCompatibleDC(hdc);
if (hdcBmp == NULL)
{
return E_FAIL;
}
hbm = CreateCompatibleBitmap(hdc,cx,cy);
BITMAP bm;
if (0 == GetObject(hbm, sizeof(bm), &bm))
{
DeleteDC(hdcBmp);
return E_FAIL;
}
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcBmp, hbm);
if (hbmOld == 0)
{
DeleteDC(hdcBmp);
return E_FAIL;
}
drawLine1(xx1, yy1, xx2, yy2,hdcBmp,2);
VMR9AlphaBitmap bmpInfo;
ZeroMemory(&bmpInfo, sizeof(bmpInfo));
bmpInfo.dwFlags = VMRBITMAP_HDC | VMRBITMAP_SRCCOLORKEY;
bmpInfo.hdc = hdcBmp;
SetRect(&bmpInfo.rSrc, 0, 0, bm.bmWidth, bm.bmHeight);
bmpInfo.rDest.left = 0.f;
bmpInfo.rDest.top = 0.f;
bmpInfo.rDest.right = 1.0f;
bmpInfo.rDest.bottom = 1.0f;
bmpInfo.fAlpha = 0.5f;
bmpInfo.clrSrcKey = RGB(0,0,0);
if(m_pVideoRender != NULL)
{
IVMRMixerBitmap9* pBmp;
hr = m_pVideoRender->QueryInterface(IID_IVMRMixerBitmap9, (LPVOID *)&pBmp);
if (SUCCEEDED(hr))
{
hr = pBmp->SetAlphaBitmap(&bmpInfo);
if(FAILED(hr))
{
PrintMessage(L"pBmp->SetAlphaBitmap hr = 0x%x GetLastError() = %d\r\n",hr,GetLastError());
}
pBmp->Release();
}
}
ReleaseDC(m_hwndApp, hdc);
DeleteBitmap(hbm);
DeleteObject(SelectObject(hdcBmp, hbmOld));
DeleteDC(hdcBmp);
}