当前位置: 代码迷 >> 多媒体/流媒体开发 >> 自己写filter完成视频图象旋转,遇到有关问题
  详细解决方案

自己写filter完成视频图象旋转,遇到有关问题

热度:7716   发布时间:2013-02-26 00:00:00.0
自己写filter完成视频图象旋转,遇到问题
如题,我自己写了个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.
  相关解决方案