⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camera.cpp

📁 Window Mobile Capture with DirectDraw
💻 CPP
字号:

#include "stdafx.h"
#include "Camera.h"
#include "PropertyBag.h"

STDAPI VarBstrCmp(BSTR bstrLeft, BSTR bstrRight, LCID lcid, ULONG dwFlags) // dwFlags passed to CompareString
{
	int nRet = wcscmp(bstrLeft, bstrRight);
	return (nRet == 0) ? VARCMP_EQ : (nRet > 0 ? VARCMP_GT : VARCMP_LT);
}

/**********************************************************************************************
 * Get camera driver
 ********************************************************************************************** 
 * It is possible to use other search types, but using the device class GUID is the most reliable
 * way to find a capture device. Once you have obtained a search handle from FindFirstDevice, 
 * you can make successive calls to FindNextDevice to locate all of the available capture devices.
 *
 */

HRESULT CCamera::GetFirstCameraDriver( WCHAR *pwzName )
{
	HRESULT hr = S_OK;
	HANDLE handle = NULL;
	DEVMGR_DEVICE_INFORMATION di;
	GUID guidCamera = { 0xCB998A05, 0x122C, 0x4166, 0x84, 0x6A,	0x93, 0x3E, 0x4D, 0x7E, 0x3C, 0x86 };

	if( pwzName == NULL ) {
		return E_POINTER;
	}

	di.dwSize = sizeof(di);

	handle = FindFirstDevice( DeviceSearchByGuid, &guidCamera, &di );
	if(( handle == NULL ) || ( di.hDevice == NULL )) {
		hr = HRESULT_FROM_WIN32( GetLastError() );
		goto Cleanup;
	}

	StringCchCopy( pwzName, MAX_PATH, di.szLegacyName );

Cleanup:
	FindClose( handle );
	return hr;
}

HRESULT CCamera::GetCameraCaptureFilter(IBaseFilter **ppCaptureFilter, WCHAR *pwzName)
{
	HRESULT hr = E_FAIL;
	CComPtr<IBaseFilter>  pVideoCap;
	CComPtr<IPersistPropertyBag> pPropertyBag;
	
	// Initialize the video capture filter
	hr = pVideoCap.CoCreateInstance( CLSID_VideoCapture ); 
	hr = pVideoCap.QueryInterface( &pPropertyBag );

	CPropertyBag PropBag;
	CComVariant varCamName = pwzName;
	if(( varCamName.vt == VT_BSTR ) == NULL )
	{
		return E_OUTOFMEMORY;
	}

	PropBag.Write( L"VCapName", &varCamName );
	hr = pPropertyBag->Load( &PropBag, NULL );	
	ATLASSERT(SUCCEEDED(hr));	
	*ppCaptureFilter = pVideoCap.Detach();
	return S_OK;
}

HRESULT CCamera::InitCaptureGraph()
{
	HRESULT hr = E_FAIL;	
	hr = GetCameraCaptureFilter(&m_pVideoCapture, m_bstrCameraName);
	ATLASSERT(hr == S_OK);	
	if(hr != S_OK)
		return E_FAIL;

	// Create the Filter Graph Manager.
	hr = m_pGraph.CoCreateInstance(CLSID_FilterGraph);
	ATLASSERT(m_pGraph != NULL);

	hr = m_pGraph->AddFilter( m_pVideoCapture, L"Video capture source" );
	ATLASSERT(hr == S_OK);

	// Create the Capture Graph Builder.	
	hr = m_pGraphBuilder2.CoCreateInstance(CLSID_CaptureGraphBuilder);	
	ATLASSERT(hr == S_OK);

	hr = m_pGraphBuilder2->SetFiltergraph(m_pGraph);
	ATLASSERT(SUCCEEDED(hr));
	if(FAILED(hr))
		return E_FAIL;
	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -