Beispiel #1
0
HRESULT CDecDXVA2::RetrieveVendorId(IDirect3DDeviceManager9 *pDevManager)
{
  HANDLE hDevice = 0;
  IDirect3D9 *pD3D = NULL;
  IDirect3DDevice9 *pDevice = NULL;

  HRESULT hr = pDevManager->OpenDeviceHandle(&hDevice);
  if (FAILED(hr)) {
    DbgLog((LOG_TRACE, 10, L"-> Failed to open device handle with hr: %X", hr));
    goto done;
  }

  hr = pDevManager->LockDevice(hDevice, &pDevice, TRUE);
  if (FAILED(hr)) {
    DbgLog((LOG_TRACE, 10, L"-> Failed to lock device with hr: %X", hr));
    goto done;
  }

  hr = pDevice->GetDirect3D(&pD3D);
  if (FAILED(hr)) {
    DbgLog((LOG_TRACE, 10, L"-> Failed to get D3D object hr: %X", hr));
    goto done;
  }

  D3DDEVICE_CREATION_PARAMETERS devParams;
  hr = pDevice->GetCreationParameters(&devParams);
  if (FAILED(hr)) {
    DbgLog((LOG_TRACE, 10, L"-> Failed to get device creation params hr: %X", hr));
    goto done;
  }

  D3DADAPTER_IDENTIFIER9 adIdentifier;
  hr = pD3D->GetAdapterIdentifier(devParams.AdapterOrdinal, 0, &adIdentifier);
  if (FAILED(hr)) {
    DbgLog((LOG_TRACE, 10, L"-> Failed to get adapter identified hr: %X", hr));
    goto done;
  }

  m_dwVendorId = adIdentifier.VendorId;
  m_dwDeviceId = adIdentifier.DeviceId;

done:
  SafeRelease(&pD3D);
  SafeRelease(&pDevice);
  if (hDevice && hDevice != INVALID_HANDLE_VALUE) {
    pDevManager->UnlockDevice(hDevice, FALSE);
    pDevManager->CloseDeviceHandle(hDevice);
  }
  return hr;
}
HRESULT CMpeg2DecoderDXVA2::CreateDecoderService(CTVTestVideoDecoder *pFilter)
{
	DBG_TRACE(TEXT("CMpeg2DecoderDXVA2::CreateDecoderService()"));

	if (!pFilter)
		return E_POINTER;
	if (!pFilter->m_pD3DDeviceManager || !pFilter->m_hDXVADevice)
		return E_UNEXPECTED;

	CloseDecoderService();

	m_pFilter = pFilter;
	m_pDeviceManager = pFilter->m_pD3DDeviceManager;
	m_pDeviceManager->AddRef();

	HRESULT hr;

	IDirect3DDevice9 *pDevice;
	hr = m_pDeviceManager->LockDevice(m_pFilter->m_hDXVADevice, &pDevice, TRUE);
	if (SUCCEEDED(hr)) {
		D3DDEVICE_CREATION_PARAMETERS CreationParams;
		hr = pDevice->GetCreationParameters(&CreationParams);
		if (SUCCEEDED(hr)) {
			IDirect3D9 *pD3D;
			hr = pDevice->GetDirect3D(&pD3D);
			if (SUCCEEDED(hr)) {
				D3DADAPTER_IDENTIFIER9 AdapterID;
				hr = pD3D->GetAdapterIdentifier(CreationParams.AdapterOrdinal, 0, &AdapterID);
				if (SUCCEEDED(hr)) {
					WCHAR szDriver[MAX_DEVICE_IDENTIFIER_STRING];
					WCHAR szDescription[MAX_DEVICE_IDENTIFIER_STRING];
					WCHAR szDeviceName[32];
					::MultiByteToWideChar(CP_ACP, 0, AdapterID.Driver, -1, szDriver, _countof(szDriver));
					::MultiByteToWideChar(CP_ACP, 0, AdapterID.Description, -1, szDescription, _countof(szDescription));
					::MultiByteToWideChar(CP_ACP, 0, AdapterID.DeviceName, -1, szDeviceName, _countof(szDeviceName));
					DBG_TRACE(TEXT("--- Adapter information ---"));
					DBG_TRACE(TEXT("     Driver : %s"), szDriver);
					DBG_TRACE(TEXT("Description : %s"), szDescription);
					DBG_TRACE(TEXT("Device name : %s"), szDeviceName);
					DBG_TRACE(TEXT("    Product : %08x"), HIWORD(AdapterID.DriverVersion.HighPart));
					DBG_TRACE(TEXT("    Version : %d.%d.%d"),
							  LOWORD(AdapterID.DriverVersion.HighPart),
							  HIWORD(AdapterID.DriverVersion.LowPart),
							  LOWORD(AdapterID.DriverVersion.LowPart));
					DBG_TRACE(TEXT("     Vendor : %08x"), AdapterID.VendorId);
					DBG_TRACE(TEXT("  Device ID : %08x"), AdapterID.DeviceId);
					DBG_TRACE(TEXT("  Subsystem : %08x"), AdapterID.SubSysId);
					DBG_TRACE(TEXT("   Revision : %08x"), AdapterID.Revision);
					m_AdapterIdentifier = AdapterID;
				}
				pD3D->Release();
			}
		}
		pDevice->Release();
		m_pDeviceManager->UnlockDevice(m_pFilter->m_hDXVADevice, FALSE);
	}
	if (FAILED(hr)) {
		::ZeroMemory(&m_AdapterIdentifier, sizeof(m_AdapterIdentifier));
	}

	IDirectXVideoDecoderService *pDecoderService;
	hr = m_pDeviceManager->GetVideoService(m_pFilter->m_hDXVADevice, IID_PPV_ARGS(&pDecoderService));
	if (FAILED(hr)) {
		DBG_ERROR(TEXT("GetVideoService() failed (%x)"), hr);
		CloseDecoderService();
		return hr;
	}
	m_pDecoderService = pDecoderService;

	if (!FindDecoder(nullptr, &m_SurfaceFormat, SurfaceFormatList, _countof(SurfaceFormatList))) {
		CloseDecoderService();
		return E_FAIL;
	}

	return S_OK;
}