2013-05-14 57 views
0

我试图学习directshow和计算机视觉与opencv。但为了保持代码更清洁,我想“放弃”(创建一个类)我从互联网借来的directshow代码。代码是: http://alax.info/trac/public/browser/trunk/Utilities/SetLifeCamStudioResolutionSample/SetLifeCamStudioResolutionSample.cpp为这个directshow系统创建一个自定义的类,不知道如何

好的。所以在我的vC++项目中,我创建了一个新类。我称之为“directshowclass”,我有directshowclass.h & .cpp。

我遇到的问题是我无法弄清楚如何照顾代码中的所有部分。

_tmain()中的所有内容我放在一个函数中。那一个没问题。

可是我该怎么做:

CComPtr<IPin> GetPin(IBaseFilter* pBaseFilter, SIZE_T nIndex = 0) 
{ 
    .... 
} 

和:

#pragma region Formerly located in qedit.h in Windows SDK, now obsoleted and defined within project 

struct __declspec(uuid("0579154a-2b53-4994-b0d0-e773148eff85")) 
ISampleGrabberCB : IUnknown 
{ 
    // 
    // Raw methods provided by interface 
    // 

     virtual HRESULT __stdcall SampleCB (double SampleTime,struct IMediaSample * pSample) = 0; 
     virtual HRESULT __stdcall BufferCB double SampleTime,unsigned char * pBuffer, long BufferLen) = 0; 
}; 

struct __declspec(uuid("6b652fff-11fe-4fce-92ad-0266b5d7c78f")) 
ISampleGrabber : IUnknown 
{ 
    // 
    // Raw methods provided by interface 
    // 

     virtual HRESULT __stdcall SetOneShot (
     long OneShot) = 0; 
     virtual HRESULT __stdcall SetMediaType (
     struct _AMMediaType * pType) = 0; 
     virtual HRESULT __stdcall GetConnectedMediaType (
     struct _AMMediaType * pType) = 0; 
     virtual HRESULT __stdcall SetBufferSamples (
     long BufferThem) = 0; 
     virtual HRESULT __stdcall GetCurrentBuffer (
     /*[in,out]*/ long * pBufferSize, 
     /*[out]*/ long * pBuffer) = 0; 
     virtual HRESULT __stdcall GetCurrentSample (
     /*[out,retval]*/ struct IMediaSample * * ppSample) = 0; 
     virtual HRESULT __stdcall SetCallback (
     struct ISampleGrabberCB * pCallback, 
     long WhichMethodToCallback) = 0; 
}; 

struct __declspec(uuid("c1f400a0-3f08-11d3-9f0b-006008039e37")) 
SampleGrabber; 
    // [ default ] interface ISampleGrabber 

#pragma endregion 

#undef ATLENSURE_SUCCEEDED 
#define ATLENSURE_SUCCEEDED(x) { HRESULT __a = (x); if(FAILED(__a)) { _tprintf(_T("Error 0x%08x in line %d\n"), __a, __LINE__); AtlThrow(__a); } } 

如何声明它们在.h文件?和.cpp文件。

回答

1

第二个片段(的#pragma区/ endregion)是确定被列入在您的项目,到需要它的代码可见的任何.h

第一个片段是一个静态函数。您可以将其复制到您的某些类中,也可以在第一行的“CComPtr GetPin ...”之前添加“内联”说明符,然后再将其保留在.h文件中。

1

您可以在代码中使用以下qedit.h。实现ISampleGrabberCB接口,您可以使用SampleCB或BufferCB来获取样本。

#ifndef __qedit_h__ 
#define __qedit_h__ 

/////////////////////////////////////////////////////////////////////////////////// 

#pragma once 

/////////////////////////////////////////////////////////////////////////////////// 

interface 
ISampleGrabberCB 
: 
    public IUnknown 
{ 
    virtual STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample) = 0; 
    virtual STDMETHODIMP BufferCB(double SampleTime, BYTE *pBuffer, long BufferLen) = 0; 
}; 

/////////////////////////////////////////////////////////////////////////////////// 

static 
const 
IID IID_ISampleGrabberCB = { 0x0579154A, 0x2B53, 0x4994, { 0xB0, 0xD0, 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85 } }; 

/////////////////////////////////////////////////////////////////////////////////// 

interface 
ISampleGrabber 
: 
    public IUnknown 
{ 
    virtual HRESULT STDMETHODCALLTYPE SetOneShot(BOOL OneShot) = 0; 
    virtual HRESULT STDMETHODCALLTYPE SetMediaType(const AM_MEDIA_TYPE *pType) = 0; 
    virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType(AM_MEDIA_TYPE *pType) = 0; 
    virtual HRESULT STDMETHODCALLTYPE SetBufferSamples(BOOL BufferThem) = 0; 
    virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer(long *pBufferSize, long *pBuffer) = 0; 
    virtual HRESULT STDMETHODCALLTYPE GetCurrentSample(IMediaSample **ppSample) = 0; 
    virtual HRESULT STDMETHODCALLTYPE SetCallback(ISampleGrabberCB *pCallback, long WhichMethodToCallback) = 0; 
}; 

/////////////////////////////////////////////////////////////////////////////////// 

static 
const 
IID IID_ISampleGrabber = { 0x6B652FFF, 0x11FE, 0x4fce, { 0x92, 0xAD, 0x02, 0x66, 0xB5, 0xD7, 0xC7, 0x8F } }; 

/////////////////////////////////////////////////////////////////////////////////// 

static 
const 
CLSID CLSID_SampleGrabber = { 0xC1F400A0, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } }; 

/////////////////////////////////////////////////////////////////////////////////// 

static 
const 
CLSID CLSID_NullRenderer = { 0xC1F400A4, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } }; 

/////////////////////////////////////////////////////////////////////////////////// 

static 
const 
CLSID CLSID_VideoEffects1Category = { 0xcc7bfb42, 0xf175, 0x11d1, { 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59 } }; 

/////////////////////////////////////////////////////////////////////////////////// 

static 
const 
CLSID CLSID_VideoEffects2Category = { 0xcc7bfb43, 0xf175, 0x11d1, { 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59 } }; 

/////////////////////////////////////////////////////////////////////////////////// 

static 
const 
CLSID CLSID_AudioEffects1Category = { 0xcc7bfb44, 0xf175, 0x11d1, { 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59 } }; 

/////////////////////////////////////////////////////////////////////////////////// 

static 
const 
CLSID CLSID_AudioEffects2Category = { 0xcc7bfb45, 0xf175, 0x11d1, { 0xa3, 0x92, 0x0, 0xe0, 0x29, 0x1f, 0x39, 0x59 } }; 

/////////////////////////////////////////////////////////////////////////////////// 

#endif 
相关问题