⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myfilter.cpp

📁 This site include optimized H.264 baseline codec, SF IP Box Binary. PC version and TI DM6437 version
💻 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 + -