directshow虚拟摄像头

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);

    //////////////////////////////////////////////////////
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值