📄 myfilter.cpp
字号:
/***************************************************************************************
* Directshow Filter Integrateion source code is developped by Mr. Xie Haijun.
*
* DHCODEC is authorized to use this code for free.
*
* Date: 2007-April-02.
*
*****************************************************************************************/
#include <streams.h>
#include "stdio.h"
#include <initguid.h>
#include "guid.h"
#include "MyFilter.h"
#include "param.h"
#include "windows.h"
//////////////////////////////////////////////////////////////////////
#pragma warning(disable:4715)
const AMOVIESETUP_MEDIATYPE sudPinTypes =
{
&MEDIATYPE_Video, // Major type
&MEDIASUBTYPE_NULL // Minor type
};
const AMOVIESETUP_PIN psudPins[] =
{
{
L"Input", // String pin name
FALSE, // Is it rendered
FALSE, // Is it an output
FALSE, // Allowed none
FALSE, // Allowed many
&CLSID_NULL, // Connects to filter
L"Output", // Connects to pin
1, // Number of types
&sudPinTypes
},
{
L"Output", // String pin name
FALSE, // Is it rendered
FALSE, // Is it an output
FALSE, // Allowed none
FALSE, // Allowed many
&CLSID_NULL, // Connects to filter
L"Input", // Connects to pin
1, // Number of types
&sudPinTypes
}
};
const AMOVIESETUP_FILTER ArbitrateFilter =
{
&CLSID_ArbitrateFilter, // Filter CLSID
L" S264 编 码 ", // Filter name
MERIT_DO_NOT_USE, // Its merit
2, // Number of pins
psudPins // Pin details
};
CFactoryTemplate g_Templates[1] =
{
{
L"S264 编 码",
&CLSID_ArbitrateFilter,
CArbitrateFilter::CreateInstance,
NULL,
&ArbitrateFilter
}
};
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);
}
//////////////////////////////////////////////////////////////////////
CUnknown * WINAPI CArbitrateFilter::CreateInstance(LPUNKNOWN punk, HRESULT *phr)
{
ASSERT(phr);
CArbitrateFilter *pNewObject = new CArbitrateFilter(punk, phr);
if (pNewObject == NULL) {
if (phr)
*phr = E_OUTOFMEMORY;
}
return pNewObject;
}
CArbitrateFilter::CArbitrateFilter(LPUNKNOWN punk,HRESULT *phr)
:CBaseFilter(NAME("Receive"),punk,&mFilterLock,CLSID_ArbitrateFilter)
{
mInputPin = new CInputPin(this,phr);
mOutPin= new COutputPin(this,phr);
mSample = NULL;
}
CArbitrateFilter::~CArbitrateFilter()
{
delete mInputPin;
delete mOutPin;
}
STDMETHODIMP CArbitrateFilter::NonDelegatingQueryInterface(REFIID riid,void **ppv)
{
CheckPointer(ppv,E_POINTER);
return CBaseFilter::NonDelegatingQueryInterface(riid, ppv);
}
int CArbitrateFilter::GetPinCount()
{
return 2;
}
CBasePin * CArbitrateFilter::GetPin(int n)
{
if(n==0)
{
return mInputPin;
}
else if(n==1)
{
return mOutPin;
}
else
{
return FALSE;
}
}
STDMETHODIMP CArbitrateFilter::Stop()
{
return CBaseFilter::Stop();
}
BOOL CArbitrateFilter::GetSampleBuffer(PBYTE * outBuffer)
{
if(mSample)
{
mSample->Release();
mSample=NULL;
}
HRESULT hr=mOutPin->GetDeliveryBuffer(&mSample,NULL,NULL,0);
if(mSample)
{
long ss=mSample->GetSize();
mSample->GetPointer(outBuffer);
}
return SUCCEEDED(hr);
}
BOOL CArbitrateFilter::DeliverHoldingSample(long inSampleSize)
{
if(mSample)
{
mSample->SetActualDataLength(inSampleSize);
mSample->SetSyncPoint(TRUE);
mSample->SetTime(NULL,NULL);
HRESULT hr=mOutPin->Deliver(mSample);
mSample->Release();
mSample=NULL;
return SUCCEEDED(hr);
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -