由于内存不足错误,Setalphabitmap无法正常工作

时间:2017-01-16 14:06:25

标签: c++ directshow

我正在尝试在直接显示应用程序中的实时视频流上划一条线。我成功地绘制了一条线,但是如果我一直想通过调用下面的函数来创建一条线,我从E_OUTOFMEMORY得到一个错误SetAlphaBitmap()。我一个接一个地调用drawlineOverlay()函数,其中8个调用正常,但第九个和后续调用没有。 SetAlphaBitmap为前8次调用返回S_OK,然后第9次返回8007000E。但视频流正在平静地进行,只有覆盖图被挂起。如果有时视频流停止并挂起,我会不断调用该功能。

为什么会出现此错误?

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;
    }               
    //To draw line
    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;

    // Set the transparency value (1.0 is opaque, 0.0 is transparent).
    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();
            //SAFE_RELEASE(pBmp);

        }
    }
    // Clean up.
    ReleaseDC(m_hwndApp, hdc);
    DeleteBitmap(hbm);
    DeleteObject(SelectObject(hdcBmp, hbmOld));
    DeleteDC(hdcBmp);
}



void drawLine1(int xx1, int yy1, int xx2, int yy2,HDC hdcBmp) 
{
    RECT clntRc;
    int temp,s1,s2,swap;
    double dx,dy,p,x,y;
    x = xx1;
    y = yy1;
    dx = abs(xx2 - xx1);
    dy = abs(yy2 - yy1);
    s1 = sign(xx2 - xx1); 
    s2 = sign(yy2 - yy1);
    swap = 0;
    if (dy > dx)
    { 
        temp = dx; 
        dx = dy;
        dy = temp;
        swap = 1;
    }
    p = 2*dy - dx;
    for (int i = 0; i < dx; i++)
    {
        clntRc.left =x;
        clntRc.top = y;
        clntRc.right = x+g_Thickness;
        clntRc.bottom =y+g_Thickness;   
        FillRect(hdcBmp,&clntRc,CreateSolidBrush(RGB(0,255,0)));

        while (p >= 0)
        { 
            p = p - 2*dx; 
            if (swap)
                x += s1; 
            else
                y += s2;
        }
            p = p + 2*dy; 
            if (swap) 
                y += s2; 
            else 
                x += s1;
    }
}

1 个答案:

答案 0 :(得分:0)

CreateSolidBrush(RGB(0,255,0))正在泄漏资源。 您需要DeleteObject由CreateSolidBrush(RGB(0,255,0))返回的句柄:https://msdn.microsoft.com/en-us/library/windows/desktop/dd183523(v=vs.85).aspx