Preparation: Install the windows SDK, compile the DirectShow BaseClasses (<your install root>\Microsoft SDKs\Windows\<your sdk version>\Samples\multimedia\directshow\baseclasses), create a new win32 DLL project, add the baseclasses folder to your include directory, and link with strmbase.lib (or strmbasd.lib for Debug build) winmm.lib, if you ignored the default libs, you also need msvcrt.lib. Add tcasFilter.def as Module Definition File. Import tcasFilter.h and tcasFilter.cpp to your project, then compile it. Good luck.
Below are the three needed files:
// tcasFilter.def
;===========================================================================
; Copyright (c) 2011 milkyjing. All Rights Reserved.
;===========================================================================
LIBRARY tcasFilter.dll
EXPORTS
DllMain PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
// tcasFilter.h
/**
* TCAS Filter DirectShow Interface
* milkyjing@gmail.com
* All rights reserved.
*/
#ifndef TCASFILTER_H
#define TCASFILTER_H
#pragma once
#include <Windows.h>
#include <InitGuid.h>
#include <streams.h>
#define TCASFILTER_NAME L"tcasFilter (auto-loading version)"
// {B3A5A510-3053-47F8-BC09-114089D28741}
DEFINE_GUID(CLSID_TcasFilter,
0xb3a5a510, 0x3053, 0x47f8, 0xbc, 0x9, 0x11, 0x40, 0x89, 0xd2, 0x87, 0x41);
////////////////////////////
#include <wchar.h>
void Message(long i) {
WCHAR wcs[65];
wsprintf(wcs, L"%i", i);
MessageBox(NULL, wcs, L"INFO", MB_OK);
}
//////////////////////////
class TcasFilter : public CTransInPlaceFilter {
public:
DECLARE_IUNKNOWN;
TcasFilter(TCHAR *tszName, LPUNKNOWN pUnk, HRESULT *phr);
static CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *phr);
HRESULT CheckInputType(const CMediaType *mtIn);
HRESULT Transform(IMediaSample *pSample);
};
#endif // TCASFILTER_H
// tcasFilter.cpp
/**
* TCAS Filter DirectShow Interface
* milkyjing@gmail.com
* All rights reserved.
*/
#include "tcasFilter.h"
TcasFilter::TcasFilter(TCHAR *tszName, LPUNKNOWN pUnk, HRESULT *phr)
: CTransInPlaceFilter(tszName, pUnk, CLSID_TcasFilter, phr) {
}
CUnknown *TcasFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *phr) {
TcasFilter *pNewObject = new TcasFilter(TEXT("tcasFilter"), pUnk, phr);
if (NULL == pNewObject)
*phr = E_OUTOFMEMORY;
return pNewObject;
}
HRESULT TcasFilter::CheckInputType(const CMediaType *mtIn) {
CAutoLock lock(m_pLock);
CheckPointer(mtIn, E_POINTER);
if (!IsEqualGUID(*mtIn->FormatType(), FORMAT_VideoInfo)) return E_INVALIDARG;
if (IsEqualGUID(*mtIn->Type(), MEDIATYPE_Video)) {
if (IsEqualGUID(*mtIn->Subtype(), MEDIASUBTYPE_YV12)) return S_OK;
}
return E_FAIL;
}
HRESULT TcasFilter::Transform(IMediaSample *pSample) {
CAutoLock lock(m_pLock);
CheckPointer(pSample, E_POINTER);
// do some transformation
return S_OK;
}
// COM things
const AMOVIESETUP_MEDIATYPE sudPinTypes[] = {
{
&MEDIATYPE_Video, // Major type
&MEDIASUBTYPE_NULL // Minor type
}
};
const AMOVIESETUP_PIN sudpPins[] = {
{
L"Input", // Pins string name
FALSE, // Is it rendered
FALSE, // Is it an output
FALSE, // Are we allowed none
FALSE, // And allowed many
&CLSID_NULL, // Connects to filter
NULL, // Connects to pin
1, // Number of types
sudPinTypes // Pin information
},
{
L"Output", // Pins string name
FALSE, // Is it rendered
TRUE, // Is it an output
FALSE, // Are we allowed none
FALSE, // And allowed many
&CLSID_NULL, // Connects to filter
NULL, // Connects to pin
1, // Number of types
sudPinTypes // Pin information
}
};
const AMOVIESETUP_FILTER sudTcasFilter = {
&CLSID_TcasFilter, // Filter CLSID
TCASFILTER_NAME, // String name
MERIT_DO_NOT_USE, // Filter merit
2, // Number of pins
sudpPins // Pin information
};
CFactoryTemplate g_Templates[] = {
{ TCASFILTER_NAME,
&CLSID_TcasFilter,
TcasFilter::CreateInstance,
NULL,
&sudTcasFilter
}
};
int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
STDAPI DllRegisterServer() {
return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer() {
return AMovieDllRegisterServer2(FALSE);
}
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) {
return DllEntryPoint((HINSTANCE)hModule, dwReason, lpReserved);
}
本文将指导您如何使用Windows SDK安装DirectShow基类,并创建一个Win32 DLL项目,实现DirectShow滤波器的集成。通过遵循详细的步骤,您将能够成功配置并编译DirectShow库,为您的应用程序添加多媒体处理能力。
243

被折叠的 条评论
为什么被折叠?



