When using IDeckLinkDX9ScreenPreviewHelper a black screen ap

Ask software engineering and SDK questions for developers working on Mac OS X, Windows or Linux.
  • Author
  • Message
Offline

Lee Seung Jun

  • Posts: 1
  • Joined: Thu Dec 29, 2016 5:34 am

When using IDeckLinkDX9ScreenPreviewHelper a black screen ap

PostThu Dec 29, 2016 5:37 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
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;
}

Return to Software Developers

Who is online

Users browsing this forum: No registered users and 24 guests