📄 inputpin.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 + -