如题,我自己写了个CRleFilter(继承TransformFilter),打算完成图象旋转,但是CRleFilter却无法完成连接,麻烦各位帮忙看下
我在CRleFilter里只重写了以下4个函数
virtual HRESULT Transform(IMediaSample * pIn, IMediaSample *pOut);
virtual HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
virtual HRESULT DecideBufferSize(
IMemAllocator * pAllocator,
ALLOCATOR_PROPERTIES *pprop);
virtual HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);
分别实现如下:
HRESULT CRleFilter::CheckInputType(const CMediaType *remtIn)
{
if ((remtIn-> majortype != MEDIATYPE_Video)||
(remtIn-> subtype != MEDIASUBTYPE_RGB565) ||
(remtIn-> formattype != FORMAT_VideoInfo) ||
(remtIn-> cbFormat < sizeof(VIDEOINFOHEADER)))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
VIDEOINFOHEADER *pVih =
reinterpret_cast <VIDEOINFOHEADER*> (remtIn-> pbFormat);
m_biBitCount = pVih-> bmiHeader.biBitCount;
m_biCompression = pVih-> bmiHeader.biCompression;
m_inwidth = pVih-> bmiHeader.biWidth;
m_inheigth = pVih-> bmiHeader.biHeight;
// Everything is good.
return S_OK;
}
HRESULT CRleFilter::GetMediaType(int iPosition, CMediaType *pMediaType)
{
ASSERT(m_pInput-> IsConnected());
if (iPosition < 0)
{
return E_INVALIDARG;
}
if (iPosition > = 0)
{
HRESULT hr = m_pInput-> ConnectionMediaType(pMediaType);
if (FAILED(hr))
{
return hr;
}
//FOURCCMap fccMap(FCC( 'MRLE '));
pMediaType-> subtype = MEDIASUBTYPE_RGB565;//static_cast <GUID> (fccMap);//MEDIASUBTYPE_RGB565;
pMediaType-> SetVariableSize();
pMediaType-> SetTemporalCompression(FALSE);
ASSERT(pMediaType-> formattype == FORMAT_VideoInfo);
VIDEOINFOHEADER *pVih =
reinterpret_cast <VIDEOINFOHEADER*> (pMediaType-> pbFormat);
if(m_biBitCount != NULL)
{
pVih-> bmiHeader.biCompression = m_biCompression;
}
pVih-> bmiHeader.biSizeImage = DIBSIZE(pVih-> bmiHeader);
return S_OK;
}
// else
return VFW_S_NO_MORE_ITEMS;
}
HRESULT CRleFilter::CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut)
{
// Check the major type.
if (mtOut-> majortype != MEDIATYPE_Video)
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Check the subtype and format type.
//FOURCCMap fccMap = FCC( 'MRLE ');
if (mtOut-> subtype != MEDIASUBTYPE_RGB565/*static_cast <GUID> (fccMap)*/)
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
if ((mtOut-> formattype != FORMAT_VideoInfo) ||
(mtOut-> cbFormat < sizeof(VIDEOINFOHEADER)))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Compare the bitmap information against the input type.