window下directshow虚拟摄像头代码:
部分学习例子下载地址:
http://download.csdn.net/detail/ab7936573/9868274
#pragma once
#ifndef POINTER_64
#define POINTER_64 __ptr64
#endif
#include <streams.h>
#include <initguid.h>
#include "LogPrint.h"
#include "CCaptureVideo.h"
#include "EvoPacket.h"
#include "PacketPool.h"
#include "EvoPacketAllocator.h"
extern "C" const GUID CLSID_VirtualCamera;
// {982434C1-D408-4984-A4D0-33DF357BD7ED}
DEFINE_GUID(CLSID_VirtualCamera,
0x982434c1, 0xd408, 0x4984, 0xa4, 0xd0, 0x33, 0xdf, 0x35, 0x7b, 0xd7, 0xed);
#define VirtualCamera_FilterName L"Virtual Camera (By evomotion)"
class CVirtualSource : public CSource {
public:
static CUnknown * WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT *phr);
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
private:
CVirtualSource(LPUNKNOWN lpunk, HRESULT *phr);
CSourceStream *m_pPin;
};
#define DECLARE_PTR(type, ptr, expr) type* ptr = (type*)(expr);
const REFERENCE_TIME FPS_30 = UNITS / 30;
const REFERENCE_TIME FPS_20 = UNITS / 20;
const REFERENCE_TIME FPS_10 = UNITS / 10;
const REFERENCE_TIME FPS_5 = UNITS / 5;
const REFERENCE_TIME FPS_4 = UNITS / 4;
const REFERENCE_TIME FPS_3 = UNITS / 3;
const REFERENCE_TIME FPS_2 = UNITS / 2;
const REFERENCE_TIME FPS_1 = UNITS / 1;
const REFERENCE_TIME rtDefaultFrameLength = FPS_30;
class CVirtualStream : public CSourceStream,
public IAMStreamConfig, public IKsPropertySet,
public CVideoFrameHandler
{
protected:
int m_iImageHeight; // The current image height
int m_iImageWidth; // And current image width
int m_iFrameNumber;
const REFERENCE_TIME m_rtFrameLength;
//采集器
int m_nDeviceID;
char * m_DeviceName;
CCaptureVideo m_capture;
//缓冲器
PacketPool pool;
//当前数据
EvoPacket *m_packet;
EvoPacket *m_lastPacket;
//锁
CCritSec m_cSharedData;
CCritSec m_cSharedState; // Protects our internal state
IReferenceClock *m_pClock;
REFERENCE_TIME m_rtStop;
public:
CVirtualStream(HRESULT *phr, CSource *pFilter);
~CVirtualStream();
//////////////////////////////////////////////////////////////////////////
// CBasePin
//////////////////////////////////////////////////////////////////////////
// Quality control
// Not implemented because we aren't going in real time.
// If the file-writing filter slows the graph down, we just do nothing, which means
// wait until we're unblocked. No frames are ever dropped.
STDMETHODIMP Notify(IBaseFilter *pSelf, Quality q);
//////////////////////////////////////////////////////////////////////////
// IUnknown
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP QueryInterface(REFIID riid, void **ppv) {
if (riid == _uuidof(IAMStreamConfig))
*ppv = (IAMStreamConfig*)this;
else
if (riid == _uuidof(IKsPropertySet))
*ppv = (IKsPropertySet*)this;
else
return CSourceStream::QueryInterface(riid, ppv);
AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) AddRef() { return GetOwner()->AddRef(); }
STDMETHODIMP_(ULONG) Release() { return GetOwner()->Release(); }
//////////////////////////////////////////////////////////////////////////
// CSourceStream
//////////////////////////////////////////////////////////////////////////
// Override the version that offers exactly one media type
HRESULT FillBuffer(IMediaSample *pSample);
HRESULT DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pRequest);
// Set the agreed media type and set up the necessary parameters
HRESULT SetMediaType(const CMediaType *pMediaType);
// Support multiple display formats
HRESULT CheckMediaType(const CMediaType *pMediaType);
HRESULT GetMediaType(int iPosition, CMediaType *pmt);
//////////////////////////////////////////////////////////////////////////
// IAMStreamConfig
//////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE SetFormat(AM_MEDIA_TYPE *pmt);
HRESULT STDMETHODCALLTYPE GetFormat(AM_MEDIA_TYPE **ppmt);
HRESULT STDMETHODCALLTYPE GetNumberOfCapabilities(int *piCount, int *piSize);
HRESULT STDMETHODCALLTYPE GetStreamCaps(int iIndex, AM_MEDIA_TYPE **pmt, BYTE *pSCC);
//////////////////////////////////////////////////////////////////////////
// IKsPropertySet
//////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, DWORD dwID, void *pInstanceData, DWORD cbInstanceData, void *pPropData, DWORD cbPropData);
HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, DWORD dwPropID, void *pInstanceData, DWORD cbInstanceData, void *pPropData, DWORD cbPropData, DWORD *pcbReturned);
HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD *pTypeSupport);
//////////////////////////////////////////////////////