2017-01-16 6 views
-2

직접 쇼 응용 프로그램에서 라이브 비디오 스트리밍에 선을 그려하려고합니다. 선을 성공적으로 그리지 만, 아래 함수를 호출하여 선을 계속 만들고 싶다면 에서 오류가 발생합니다. drawlineOverlay()이 하나씩 기능을 수행하고 호출 중 8 개가 정상이지만 9 번째 이후의 호출은 정상이 아닙니다. SetAlphaBitmap은 처음 8 건의 호출에 대해 S_OK을 반환하고 9 번째 호출은 8007000E을 반환합니다. 그러나 비디오 스트리밍은 오버레이 다이어그램 만 매달려 평화롭게 진행됩니다. 때로는 비디오 스트리밍이 중지되고 매달린 후 계속해서 해당 기능을 호출하면됩니다.메모리 부족 오류로 인해 Setalphabitmap이 작동하지 않습니다.

왜이 오류가 발생합니까?

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; 
    } 
} 
+0

[mcve]를 입력하십시오. –

+0

다음 호출 순서를 되돌려보십시오. DeleteBitmap (hbm); DeleteObject (SelectObject (hdcBmp, hbmOld))); – VuVirt

+0

@VuVirt 방금 시도했지만 여전히 동일한 문제가 발생합니다. –

답변