- Posts: 1
- Joined: Thu Dec 29, 2016 5:34 am
OS : Windows 10
Compiler : VS 2015
Language : C++
Edited Sample Source : Blackmagic_DeckLink_SDK_10.8.3\Blackmagic DeckLink SDK 10.8.3\Win\Samples\CapturePreview
CaptureBoard : DeckLink 4K Pro
Input Source : 1080P 30 & 1080P 60
- PreviewWindow.h
- PreviewWindow.cpp
Compiler : VS 2015
Language : C++
Edited Sample Source : Blackmagic_DeckLink_SDK_10.8.3\Blackmagic DeckLink SDK 10.8.3\Win\Samples\CapturePreview
CaptureBoard : DeckLink 4K Pro
Input Source : 1080P 30 & 1080P 60
- PreviewWindow.h
- Code: Select all
IDeckLinkDX9ScreenPreviewHelper* m_deckLinkScreenPreviewHelper;
IDirect3D9* m_pD3D;
IDirect3DDevice9* m_dxDevice;
- PreviewWindow.cpp
- Code: Select all
bool PreviewWindow::init(CStatic *previewBox)
{
m_previewBox = previewBox;
// Create the DeckLink screen preview helper
if (CoCreateInstance(CLSID_CDeckLinkDX9ScreenPreviewHelper, NULL, CLSCTX_ALL, IID_IDeckLinkDX9ScreenPreviewHelper, (void**)&m_deckLinkScreenPreviewHelper) != S_OK)
return false;
// Initialise OpenGL
return initOpenGL();
}
bool PreviewWindow::initOpenGL()
{
bool result = false;
HRESULT hr = S_OK;
D3DPRESENT_PARAMETERS pp = { 0 };
D3DDISPLAYMODE mode = { 0 };
hr = m_pD3D->GetAdapterDisplayMode(
0,
&mode
);
if (FAILED(hr))
result = false;
hr = m_pD3D->CheckDeviceType(
0,
D3DDEVTYPE_HAL,
mode.Format,
D3DFMT_UNKNOWN, //D3DFMT_X8R8G8B8,//D3DFMT_A8R8G8B8,//D3DFMT_UNKNOWN,
TRUE // windowed
);
if (FAILED(hr))
result = false;
// m_deckLinkScreenPreviewHelper->Set3DPreviewFormat(BMD3DPreviewFormat::bmd3DPreviewFormatDefault);
pp.BackBufferFormat = D3DFMT_UNKNOWN;//D3DFMT_UNKNOWN;//D3DFMT_X8R8G8B8;//D3DFMT_A8R8G8B8;//D3DFMT_UNKNOWN;
pp.BackBufferCount = 2;
// pp.BackBufferWidth = mode.Width;//1;
// pp.BackBufferHeight = mode.Height;//1;
pp.Windowed = TRUE;
pp.SwapEffect = D3DSWAPEFFECT_DISCARD;//D3DSWAPEFFECT_DISCARD;//D3DSWAPEFFECT_FLIP
pp.hDeviceWindow = m_previewBox->GetSafeHwnd();
// pp.Flags = D3DPRESENTFLAG_VIDEO | D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
// pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
UINT AdtCnt = m_pD3D->GetAdapterCount();
hr = m_pD3D->CreateDevice(0, D3DDEVTYPE_HAL, m_previewBox->GetSafeHwnd(), D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &pp, &m_dxDevice);
#endif
if (m_deckLinkScreenPreviewHelper->Initialize(m_dxDevice) == S_OK)
{
result = true;
}
#endif
return result;
}
HRESULT PreviewWindow::DrawFrame(IDeckLinkVideoFrame* theFrame)
{
// Make sure we are initialised
if (m_deckLinkScreenPreviewHelper == NULL)
return E_FAIL;
HRESULT hr = S_OK;
long width = theFrame->GetWidth();
long height = theFrame->GetHeight();
long rowbytes = theFrame->GetRowBytes();
// First, pass the frame to the DeckLink screen preview helper
hr = m_deckLinkScreenPreviewHelper->SetFrame(theFrame);
// hr = m_deckLinkScreenPreviewHelper->Set3DPreviewFormat(BMD3DPreviewFormat::bmd3DPreviewFormatDefault);
RECT rc = {0, 0, width, height };
// hr = m_dxDevice->BeginScene();
hr = m_deckLinkScreenPreviewHelper->Render(&rc); // exeption
// hr = m_dxDevice->EndScene();
hr = m_dxDevice->Present(NULL, NULL, m_previewBox->GetSafeHwnd(), NULL);
return S_OK;
}