3a08e858a6
Allow multiple QSV encoders, usefull for live + recorded parallel sessions. The first QSV encoder will create a DirectX device and return a handle / pointer. Any additional QSV encoder will use that same pointer to the DirectX device. We keep track of the number of open QSV encoders so that we wait to close the DirectX resources after all encoders are closed. Closes obsproject/obs-studio#1341
136 lines
4.6 KiB
C++
136 lines
4.6 KiB
C++
/*****************************************************************************
|
|
|
|
INTEL CORPORATION PROPRIETARY INFORMATION
|
|
This software is supplied under the terms of a license agreement or
|
|
nondisclosure agreement with Intel Corporation and may not be copied
|
|
or disclosed except in accordance with the terms of that agreement.
|
|
Copyright(c) 2005-2014 Intel Corporation. All Rights Reserved.
|
|
|
|
*****************************************************************************/
|
|
|
|
#include "common_utils.h"
|
|
|
|
// ATTENTION: If D3D surfaces are used, DX9_D3D or DX11_D3D must be set in project settings or hardcoded here
|
|
|
|
#ifdef DX9_D3D
|
|
#include "common_directx.h"
|
|
#elif DX11_D3D
|
|
#include "common_directx11.h"
|
|
#include "common_directx9.h"
|
|
#endif
|
|
|
|
/* =======================================================
|
|
* Windows implementation of OS-specific utility functions
|
|
*/
|
|
|
|
mfxStatus Initialize(mfxIMPL impl, mfxVersion ver, MFXVideoSession* pSession, mfxFrameAllocator* pmfxAllocator, mfxHDL *deviceHandle, bool bCreateSharedHandles, bool dx9hack)
|
|
{
|
|
bCreateSharedHandles; // (Hugh) Currently unused
|
|
pmfxAllocator; // (Hugh) Currently unused
|
|
|
|
mfxStatus sts = MFX_ERR_NONE;
|
|
|
|
// If mfxFrameAllocator is provided it means we need to setup DirectX device and memory allocator
|
|
if (pmfxAllocator && !dx9hack) {
|
|
// Initialize Intel Media SDK Session
|
|
sts = pSession->Init(impl, &ver);
|
|
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
|
|
|
|
// Create DirectX device context
|
|
if (deviceHandle == NULL || *deviceHandle == NULL) {
|
|
sts = CreateHWDevice(*pSession, deviceHandle, NULL, bCreateSharedHandles);
|
|
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
|
|
}
|
|
|
|
if (deviceHandle == NULL || *deviceHandle == NULL) return MFX_ERR_DEVICE_FAILED;
|
|
|
|
// Provide device manager to Media SDK
|
|
sts = pSession->SetHandle(DEVICE_MGR_TYPE, *deviceHandle);
|
|
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
|
|
|
|
pmfxAllocator->pthis = *pSession; // We use Media SDK session ID as the allocation identifier
|
|
pmfxAllocator->Alloc = simple_alloc;
|
|
pmfxAllocator->Free = simple_free;
|
|
pmfxAllocator->Lock = simple_lock;
|
|
pmfxAllocator->Unlock = simple_unlock;
|
|
pmfxAllocator->GetHDL = simple_gethdl;
|
|
|
|
// Since we are using video memory we must provide Media SDK with an external allocator
|
|
sts = pSession->SetFrameAllocator(pmfxAllocator);
|
|
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
|
|
|
|
} else if (pmfxAllocator && dx9hack) {
|
|
// Initialize Intel Media SDK Session
|
|
sts = pSession->Init(impl, &ver);
|
|
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
|
|
|
|
// Create DirectX device context
|
|
if (deviceHandle == NULL || *deviceHandle == NULL ) {
|
|
sts = DX9_CreateHWDevice(*pSession, deviceHandle, NULL, false);
|
|
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
|
|
}
|
|
if (*deviceHandle == NULL) return MFX_ERR_DEVICE_FAILED;
|
|
|
|
// Provide device manager to Media SDK
|
|
sts = pSession->SetHandle(MFX_HANDLE_D3D9_DEVICE_MANAGER, *deviceHandle);
|
|
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
|
|
|
|
pmfxAllocator->pthis = *pSession; // We use Media SDK session ID as the allocation identifier
|
|
pmfxAllocator->Alloc = dx9_simple_alloc;
|
|
pmfxAllocator->Free = dx9_simple_free;
|
|
pmfxAllocator->Lock = dx9_simple_lock;
|
|
pmfxAllocator->Unlock = dx9_simple_unlock;
|
|
pmfxAllocator->GetHDL = dx9_simple_gethdl;
|
|
|
|
// Since we are using video memory we must provide Media SDK with an external allocator
|
|
sts = pSession->SetFrameAllocator(pmfxAllocator);
|
|
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
|
|
|
|
} else {
|
|
// Initialize Intel Media SDK Session
|
|
sts = pSession->Init(impl, &ver);
|
|
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
|
|
}
|
|
return sts;
|
|
}
|
|
|
|
void Release()
|
|
{
|
|
#if defined(DX9_D3D) || defined(DX11_D3D)
|
|
CleanupHWDevice();
|
|
DX9_CleanupHWDevice();
|
|
#endif
|
|
}
|
|
|
|
void mfxGetTime(mfxTime* timestamp)
|
|
{
|
|
QueryPerformanceCounter(timestamp);
|
|
}
|
|
|
|
double TimeDiffMsec(mfxTime tfinish, mfxTime tstart)
|
|
{
|
|
static LARGE_INTEGER tFreq = { 0 };
|
|
|
|
if (!tFreq.QuadPart) QueryPerformanceFrequency(&tFreq);
|
|
|
|
double freq = (double)tFreq.QuadPart;
|
|
return 1000.0 * ((double)tfinish.QuadPart - (double)tstart.QuadPart) / freq;
|
|
}
|
|
|
|
/* (Hugh) Functions currently unused */
|
|
#if 0
|
|
void ClearYUVSurfaceVMem(mfxMemId memId)
|
|
{
|
|
#if defined(DX9_D3D) || defined(DX11_D3D)
|
|
ClearYUVSurfaceD3D(memId);
|
|
#endif
|
|
}
|
|
|
|
void ClearRGBSurfaceVMem(mfxMemId memId)
|
|
{
|
|
#if defined(DX9_D3D) || defined(DX11_D3D)
|
|
ClearRGBSurfaceD3D(memId);
|
|
#endif
|
|
}
|
|
#endif
|