2017-03-22 1 views
2

Als ein Beispiel IMediaSample, ein IMediaSample von Zufallsdaten gefüllt ist, einen Directshow Video Source Filter zu testen:eine Bitmap-Set

HRESULT CVCamStream::FillBuffer(IMediaSample *pms) 
{ 
    REFERENCE_TIME rtNow; 
    REFERENCE_TIME avgFrameTime = ((VIDEOINFOHEADER*)m_mt.pbFormat)->AvgTimePerFrame; 

    rtNow = m_rtLastTime; 
    m_rtLastTime += avgFrameTime; 
    pms->SetTime(&rtNow, &m_rtLastTime); 
    pms->SetSyncPoint(TRUE); 

    BYTE *pData; 
    long lDataLen; 
    pms->GetPointer(&pData); 
    lDataLen = pms->GetSize(); 
    for(int i = 0; i < lDataLen; ++i) pData[i] = rand(); 
} 

Stattdessen möchte ich den Puffer mit einer Bitmap aus einer Datei-System geladen füllen und das ist, was ich versuche zu tun:

AM_MEDIA_TYPE *mt; 
HRESULT hr; 
hr = pms->GetMediaType(&mt); 
if (FAILED(hr)) return hr; 

VIDEOINFOHEADER *pVih; 
if ((mt->formattype == FORMAT_VideoInfo) && 
    (mt->cbFormat >= sizeof(VIDEOINFOHEADER)) && 
    (mt->pbFormat != NULL)) 
{ 
    pVih = (VIDEOINFOHEADER*)mt->pbFormat; 
} 
else 
{ 
    FreeMediaType(*mt); 
    return VFW_E_INVALIDMEDIATYPE; 
} 

DWORD dwBmpSize = ((640 * 3 + 31)/32) * 4 * 480; // 640x480x24bit 
HANDLE hDIB = GlobalAlloc(GHND, dwBmpSize); 
char *lpbitmap = (char *)GlobalLock(hDIB); 
HBITMAP hBMP = (HBITMAP)LoadImage(NULL, "path/to/my/image.png", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
HDC hdc = GetDC(NULL); 
GetDIBits(hdc, hBMP, 0, 480, lpbitmap, (BITMAPINFO*)&pVih->bmiHeader, DIB_RGB_COLORS); 

SetDIBitsToDevice(
    hdc, 0, 0, 
    pVih->bmiHeader.biWidth, 
    pVih->bmiHeader.biHeight, 
    0, 0, 
    0, 
    pVih->bmiHeader.biHeight, 
    lpbitmap, 
    (BITMAPINFO*)&pVih->bmiHeader, 
    DIB_RGB_COLORS 
); 

Aber wenn ich es mit Skype versuchen wird gerade abstürzt ... ein Teil jeden Hinweis über den Code oben, wie ich soll so debuggen ein Filter?

+0

eine Art und Weise zu debuggen Gefunden: kompilieren im Debug-Modus, registrieren Sie den Filter laufen graphedt.exe, den Filter hinzufügen, fügen Sie den Debugger an die Graphedt-Prozess. – Mark

Antwort

1

Hier ist der Arbeitscode IMediaSample mit einem Bitmap zu füllen:

HRESULT CVCamStream::FillBuffer(IMediaSample *pms) 
{ 
    REFERENCE_TIME rtNow; 
    REFERENCE_TIME avgFrameTime = ((VIDEOINFOHEADER*)m_mt.pbFormat)->AvgTimePerFrame; 

    rtNow = m_rtLastTime; 
    m_rtLastTime += avgFrameTime; 
    pms->SetTime(&rtNow, &m_rtLastTime); 
    pms->SetSyncPoint(TRUE); 

    BYTE *pData; 
    long lDataLen; 
    pms->GetPointer(&pData); 
    lDataLen = pms->GetSize(); 

    HDC hdc = GetDC(NULL); 
    HBITMAP hBmp = (HBITMAP)LoadImage(NULL, "path/to/image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    BITMAP bmp; 
    GetObject(hBmp, sizeof(BITMAP), &bmp); 

    BITMAPINFOHEADER bi; 

    bi.biSize = sizeof(BITMAPINFOHEADER); 
    bi.biWidth = bmp.bmWidth; 
    bi.biHeight = bmp.bmHeight; 
    bi.biPlanes = 1; 
    bi.biBitCount = 24; 
    bi.biCompression = BI_RGB; 
    bi.biSizeImage = 0; 
    bi.biXPelsPerMeter = 0; 
    bi.biYPelsPerMeter = 0; 
    bi.biClrUsed = 0; 
    bi.biClrImportant = 0; 

    DWORD dwBmpSize = ((bmp.bmWidth * bi.biBitCount + 31)/32) * 4 * bmp.bmHeight; 
    HANDLE hDIB = GlobalAlloc(GHND, dwBmpSize); 
    char *lpbitmap = (char *)GlobalLock(hDIB); 

    GetDIBits(hdc, hBmp, 0, (UINT)bmp.bmHeight, lpbitmap, (BITMAPINFO *)&bi, DIB_RGB_COLORS); 
    memcpy(pData, lpbitmap, lDataLen); 

    return NOERROR; 
} // FillBuffer 
Verwandte Themen