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

📄 inputpin.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.
*
*****************************************************************************************/
// InputPin.cpp: implementation of the CInputPin class.
//
//////////////////////////////////////////////////////////////////////

#include "InputPin.h"
#include "MyFilter.h"
#include "stdio.h"
#include "guid.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CInputPin::CInputPin(CArbitrateFilter *pFilter,HRESULT *phr)
				 :CBaseInputPin(NAME("Input Pin"),pFilter, &pFilter->mFilterLock
				                  , phr, L"I420图像")
{
	pMyFilter=pFilter;
	mSample=NULL;

	m_s264Prop.CodeLength = 0;
	m_s264Prop.DeptPeriod = 520;
	m_s264Prop.FrameType = FRAME_INIT;
	m_s264Prop.ImageHeight = 240;
	m_s264Prop.ImageWidth = 320;
	m_s264Prop.VideoQuality = 30;
}

CInputPin::~CInputPin()
{

}

STDMETHODIMP  CInputPin::Receive(IMediaSample *pSample)
{
	CAutoLock lck(&pMyFilter->mFilterDataLock);

	HRESULT hr=CBaseInputPin::Receive(pSample);
	if(FAILED(hr))
		return hr;

	PBYTE  inBuffer=0;
	pSample->GetPointer(&inBuffer);

	long len = pSample->GetActualDataLength();

	PBYTE  outBuffer=0;
	
	hr=pMyFilter->GetSampleBuffer(&outBuffer);
	if(FAILED(hr)==FALSE)
	{
		DHENC_FRAME(inBuffer,outBuffer,&m_s264Prop);
	}

	pMyFilter->DeliverHoldingSample(m_s264Prop.CodeLength);

	return hr;
}


STDMETHODIMP  CInputPin::BeginFlush(void)
{	
	CAutoLock lck(&pMyFilter->mFilterLock);


	HRESULT hr=CBaseInputPin::BeginFlush();

	hr=pMyFilter->mOutPin->DeliverBeginFlush();

	return hr;
}	

STDMETHODIMP  CInputPin::EndFlush(void)
{
	CAutoLock lck(&pMyFilter->mFilterLock);


	HRESULT hr=CBaseInputPin::EndFlush();

	hr=pMyFilter->mOutPin->DeliverEndFlush();

	return hr;
}
	
HRESULT CInputPin::CheckMediaType(const CMediaType * inMediaType)
{
    CheckPointer(inMediaType,E_POINTER);

    if(*inMediaType->FormatType() != FORMAT_VideoInfo)
    {
        return E_INVALIDARG;
    }

    if((IsEqualGUID(*inMediaType->Type(), MEDIATYPE_Video)) &&
       (IsEqualGUID(*inMediaType->Subtype(), WMMEDIASUBTYPE_I420)))
    {
		VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) inMediaType->Format();

        if (pvi->bmiHeader.biWidth==320 && pvi->bmiHeader.biHeight==240)
        {
			return NOERROR;
        }

		return E_FAIL;
    }

    return E_FAIL;

}

HRESULT CInputPin::GetMediaType(int iPosition,CMediaType *pMediaType)
{
    if(iPosition < 0)
    {
        return E_INVALIDARG;
    }

    if(iPosition > 0)
    {
        return VFW_S_NO_MORE_ITEMS;
    }

    CheckPointer(pMediaType,E_POINTER);

    pMediaType->SetFormatType(&FORMAT_VideoInfo);
    pMediaType->SetType(&MEDIATYPE_Video);
    pMediaType->SetSubtype(&WMMEDIASUBTYPE_I420);

    return NOERROR;
}


STDMETHODIMP CInputPin::EndOfStream(void)
{
	CAutoLock lck(&pMyFilter->mFilterLock);

	HRESULT hr=CBaseInputPin::EndOfStream();

	hr=pMyFilter->mOutPin->DeliverEndOfStream();

    return hr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -