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

📄 camera.h

📁 Window Mobile Capture with DirectDraw
💻 H
字号:

#ifndef	 _CAMERA_H_

#include <dshow.h> // DirectShow
#include <Dmodshow.h>
#include <dmo.h>
#include "CameraImageRenderer.h"
#include "wmcodecs.h"      // Window Media Player

#define WM_GRAPHNOTIFY						(WM_USER+2111)

class CCamera : public CMediaSampleCallback
{
	CComBSTR							m_bstrCameraName;
	CComPtr<IBaseFilter>				m_pVideoCapture;
	CComPtr<IGraphBuilder>				m_pGraph;
	CComPtr<ICaptureGraphBuilder2>		m_pGraphBuilder2;
	CComPtr<IImageSinkFilter>			m_pImageSinkFilter;

public:
	CCamera()
	{
		wchar_t szCameraName[MAX_PATH] = {0};
		HRESULT hr = GetFirstCameraDriver(szCameraName);
		ATLASSERT(hr == S_OK);
		m_bstrCameraName = szCameraName;
		InitCaptureGraph();
	}

	CCamera(wchar_t *szCameraName)
	{
		m_bstrCameraName = szCameraName;
		InitCaptureGraph();
	}

	~CCamera(){}

	CComBSTR GetCameraName() { return m_bstrCameraName; }

	HRESULT DefaultPreview()
	{
		HRESULT hr = E_FAIL;
		ATLASSERT(m_pVideoCapture != NULL);
		hr = m_pGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_pVideoCapture, NULL, NULL);
		return hr;
	}

	HRESULT RenderImageFile()
	{
		HRESULT hr = E_FAIL;

		//////////////////////////////////////////////////////////////////////////
		// render still image
		CComPtr<IBaseFilter>			pImageSinkFilter;
		hr = pImageSinkFilter.CoCreateInstance( CLSID_IMGSinkFilter );
		ATLASSERT(SUCCEEDED(hr));
		hr = m_pGraph->AddFilter( pImageSinkFilter, L"Still image filter" );
		ATLASSERT(SUCCEEDED(hr));
		hr = m_pGraphBuilder2->RenderStream( &PIN_CATEGORY_STILL, &MEDIATYPE_Video, m_pVideoCapture, NULL, pImageSinkFilter );
		ATLASSERT(SUCCEEDED(hr));		
		hr = pImageSinkFilter.QueryInterface( &m_pImageSinkFilter );
		ATLASSERT(SUCCEEDED(hr));
		return hr;
	}

	HRESULT RenderAsFile(LPCWSTR pwsFileName)
	{
		HRESULT hr = E_FAIL;

		//////////////////////////////////////////////////////////////////////////
		// render file
		CComPtr<IBaseFilter> pVideoEncoder;
		CComPtr<IDMOWrapperFilter> pWrapperFilter;

		hr = pVideoEncoder.CoCreateInstance(CLSID_DMOWrapperFilter);
		ATLASSERT(hr == S_OK);

		hr = pVideoEncoder->QueryInterface( &pWrapperFilter );
		hr = pWrapperFilter->Init( CLSID_CWMV9EncMediaObject, DMOCATEGORY_VIDEO_ENCODER );
		ATLASSERT(hr == S_OK);
		hr = m_pGraph->AddFilter( pVideoEncoder, L"WMV9DMO Encoder");
		ATLASSERT(hr == S_OK);

		CComPtr<IBaseFilter> pASFMultiplexer;
		CComPtr<IFileSinkFilter> pFileSinkFilter;
		hr = m_pGraphBuilder2->SetOutputFileName(&MEDIASUBTYPE_Asf, CComBSTR(pwsFileName), &pASFMultiplexer, &pFileSinkFilter);
		ATLASSERT(hr == S_OK);

		hr = m_pGraphBuilder2->RenderStream( &PIN_CATEGORY_CAPTURE,	&MEDIATYPE_Video, m_pVideoCapture, pVideoEncoder,	pASFMultiplexer );
		ATLASSERT(SUCCEEDED(hr));
		return hr;
	}

	HRESULT Render()
	{
		HRESULT hr = E_FAIL;
		ATLASSERT(m_pVideoCapture != NULL);

		//////////////////////////////////////////////////////////////////////////
		// preview	
		// Add My Camera Image Renderer filter to the graph.
		CComPtr<IBaseFilter> pImageRenderer;
		CCameraImageRenderer *pRenderer2 = new CCameraImageRenderer(NULL, &hr, this);
		pRenderer2->AddRef();
		pRenderer2->QueryInterface(__uuidof(IBaseFilter), (void**)&pImageRenderer);
		ATLASSERT(pImageRenderer != NULL);
		hr = m_pGraph->AddFilter(pImageRenderer, L"Camera Preview Renderer");
		ATLASSERT(SUCCEEDED(hr));
		hr = m_pGraphBuilder2->RenderStream( &PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, m_pVideoCapture, NULL, pImageRenderer );
		ATLASSERT(SUCCEEDED(hr));

		//////////////////////////////////////////////////////////////////////////
		// Add the Still Image Renderer filter to the graph.
		CComPtr<IBaseFilter> pNullRenderer;
		CCameraImageRenderer *pStillImageRenderer = new CCameraImageRenderer(NULL, &hr, this);
		pStillImageRenderer->AddRef();
		pStillImageRenderer->QueryInterface(__uuidof(IBaseFilter), (void**)&pNullRenderer);
		ATLASSERT(pNullRenderer != NULL);
		hr = m_pGraph->AddFilter(pNullRenderer, L"Null Renderer");
		ATLASSERT(SUCCEEDED(hr));
		hr = m_pGraphBuilder2->RenderStream( &PIN_CATEGORY_STILL, &MEDIATYPE_Video, m_pVideoCapture, NULL, pNullRenderer);
		ATLASSERT(SUCCEEDED(hr));

		return hr;
	}

	HRESULT Configure()
	{
		HRESULT hr = S_OK;

		//////////////////////////////////////////////////////////////////////////
		CComPtr<IAMCameraControl> pCameraControl;
		hr = m_pVideoCapture->QueryInterface( &pCameraControl );
		ATLASSERT(pCameraControl != NULL);

		hr = pCameraControl->Set(CameraControl_Roll, 180, CameraControl_Flags_Auto);
		ATLASSERT(hr == S_OK);

		//////////////////////////////////////////////////////////////////////////
		CComPtr<IAMStreamConfig> pConfig;
		hr = m_pGraphBuilder2->FindInterface(
			&PIN_CATEGORY_CAPTURE, // Preview pin. PIN_CATEGORY_PREVIEW, PIN_CATEGORY_CAPTURE
			0,    // Any media type.
			m_pVideoCapture, // Pointer to the capture filter.
			IID_IAMStreamConfig, (void**)&pConfig);
		
		ATLASSERT(pConfig != NULL);

		int iCount = 0, iSize = 0;
		hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize);

		// Check the size to make sure we pass in the correct structure.
		if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS))
		{
			// Use the video capabilities structure.

			for (int iFormat = 0; iFormat < iCount; iFormat++)
			{
				VIDEO_STREAM_CONFIG_CAPS scc;
				AM_MEDIA_TYPE *pmtConfig;
				hr = pConfig->GetStreamCaps(iFormat, &pmtConfig, (BYTE*)&scc);
				if (SUCCEEDED(hr))
				{
					/* Examine the format, and possibly use it. */

					VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)pmtConfig->pbFormat;
					// pVih contains the detailed format information.
					LONG lWidth = pVih->bmiHeader.biWidth;
					LONG lHeight = pVih->bmiHeader.biHeight;
				}
			}
		}

		AM_MEDIA_TYPE *pmtConfig = NULL;
		hr = pConfig->GetFormat(&pmtConfig);
		if(pmtConfig == NULL)
			return E_FAIL;
		return hr;
	}

	HRESULT Run(HWND hWnd)
	{
		CComPtr<IMediaEventEx> pMediaEvent;
		CComPtr<IMediaControl> pMediaControl;

		// handle media event
		HRESULT hr = m_pGraph->QueryInterface( &pMediaEvent );
		hr = pMediaEvent->SetNotifyWindow((OAHWND)hWnd,	WM_GRAPHNOTIFY,0);

		hr = m_pGraph->QueryInterface(&pMediaControl);
		hr = Configure();
		ATLASSERT(SUCCEEDED(hr));

		hr =pMediaControl->Run();
		ATLASSERT(SUCCEEDED(hr));
		if(FAILED(hr))
			return hr;

		LONGLONG dwStart  = 0, dwEnd      = 0;
		WORD wStartCookie = 1, wEndCookie = 2;

		dwEnd=MAXLONGLONG;

		//start capturing
		hr= m_pGraphBuilder2->ControlStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_pVideoCapture, &dwStart, &dwEnd,wStartCookie, wEndCookie );
		ATLASSERT(SUCCEEDED(hr));
		if(FAILED(hr))
			return hr;

		return S_OK;
	}

	HRESULT Stop()
	{
		CComPtr<IMediaControl> pMediaControl;
		HRESULT hr = m_pGraph->QueryInterface(&pMediaControl);
		hr = pMediaControl->Stop();
		return hr;
	}

	HRESULT ShotStillImage(LPCWSTR szFileName)
	{
		HRESULT hr = S_OK;
		CComPtr<IPin>			 pStillPin;
		CComPtr<IAMVideoControl> pVideoControl;

		if( m_pGraphBuilder2 == NULL || m_pVideoCapture == NULL)
			return E_FAIL;

		hr = m_pGraphBuilder2->FindPin( m_pVideoCapture, PINDIR_OUTPUT, &PIN_CATEGORY_STILL, &MEDIATYPE_Video, FALSE, 0, &pStillPin );
		ATLASSERT(SUCCEEDED(hr));
		hr = m_pVideoCapture.QueryInterface( &pVideoControl );
		ATLASSERT(SUCCEEDED(hr));
		hr = pVideoControl->SetMode( pStillPin, VideoControlFlag_Trigger );
		ATLASSERT(SUCCEEDED(hr));
		return hr;
	}

	HRESULT ShotImageFile(LPCWSTR szFileName)
	{
		HRESULT hr = S_OK;
		CComPtr<IFileSinkFilter> pFileSink;
		CComPtr<IPin>			 pStillPin;
		CComPtr<IAMVideoControl> pVideoControl;

		if( m_pGraphBuilder2 == NULL || m_pVideoCapture == NULL)
			return E_FAIL;

		hr = m_pImageSinkFilter.QueryInterface( &pFileSink );
		ATLASSERT(SUCCEEDED(hr));
		hr = pFileSink->SetFileName( CComBSTR(szFileName), NULL );
		ATLASSERT(SUCCEEDED(hr));

		hr = m_pGraphBuilder2->FindPin( m_pVideoCapture, PINDIR_OUTPUT, &PIN_CATEGORY_STILL, &MEDIATYPE_Video, FALSE, 0, &pStillPin );
		ATLASSERT(SUCCEEDED(hr));
		hr = m_pVideoCapture.QueryInterface( &pVideoControl );
		ATLASSERT(SUCCEEDED(hr));
		hr = pVideoControl->SetMode( pStillPin, VideoControlFlag_Trigger );
		ATLASSERT(SUCCEEDED(hr));
		return hr;
	}

	HRESULT GetSourcePosition(long* pLeft,long* pTop,long* pWidth,long* pHeight)
	{
		CComQIPtr<IVideoWindow> pBasicVideo = m_pGraph;
		ATLASSERT(pBasicVideo != NULL);
		return pBasicVideo->GetWindowPosition(pLeft, pTop, pWidth, pHeight);
	}

	HRESULT SetOwner(OAHWND hwnd)
	{
		CComQIPtr<IVideoWindow> pBasicVideo = m_pGraph;
		ATLASSERT(pBasicVideo != NULL);
		pBasicVideo->put_Owner(hwnd);
		pBasicVideo->put_Left(50);
		pBasicVideo->put_Caption(CComBSTR(L"VCAM"));
		return NOERROR;
	}

	static HRESULT GetFirstCameraDriver( WCHAR *pwzName );

protected:
	HRESULT InitCaptureGraph();
	HRESULT GetCameraCaptureFilter(IBaseFilter **ppCaptureFilter, WCHAR *pwzName);		

	IPin * GetInPin( IBaseFilter * pFilter, int nPin )
	{
		CComPtr<IPin> pComPin=0;
		GetPin(pFilter, PINDIR_INPUT, nPin, &pComPin);
		return pComPin;
	}


	IPin * GetOutPin( IBaseFilter * pFilter, int nPin )
	{
		CComPtr<IPin> pComPin=0;
		GetPin(pFilter, PINDIR_OUTPUT, nPin, &pComPin);
		return pComPin;
	}

	HRESULT GetPin( IBaseFilter * pFilter, PIN_DIRECTION dirrequired, int iNum, IPin **ppPin)
	{
		CComPtr< IEnumPins > pEnum;
		*ppPin = NULL;

		HRESULT hr = pFilter->EnumPins(&pEnum);
		if(FAILED(hr)) 
			return hr;

		ULONG ulFound;
		IPin *pPin;
		hr = E_FAIL;

		while(S_OK == pEnum->Next(1, &pPin, &ulFound))
		{
			PIN_DIRECTION pindir = (PIN_DIRECTION)3;

			pPin->QueryDirection(&pindir);
			if(pindir == dirrequired)
			{
				if(iNum == 0)
				{
					*ppPin = pPin;  // Return the pin's interface
					hr = S_OK;      // Found requested pin, so clear error
					break;
				}
				iNum--;
			} 

			pPin->Release();
		} 

		return hr;
	}
};

#endif

⌨️ 快捷键说明

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