我已成功构建了ezrgb24示例项目,该项目位于DirectShow SDK中。但是当我调试它时遇到了一个混乱的问题。
Transform方法调用了以下Copy方法。
HRESULT CEZrgb24::Copy(IMediaSample *pSource, IMediaSample *pDest) const
{
...
// Copy the sample data
BYTE *pSourceBuffer, *pDestBuffer;
long lSourceSize = pSource->GetActualDataLength();
#ifdef DEBUG
long lDestSize = pDest->GetSize();
ASSERT(lDestSize >= lSourceSize);
#endif
...
}
断言判断失败。使用graphedit,我检查过滤器的输入媒体类型是RGB24,输出也是RGB24。我无法理解为什么输出的缓冲区大小将小于输入的acural数据大小。谁能帮帮我?
感谢。
----------------------------------------------- --- 2009/8/20编辑
O,我发现实际输入的媒体子类是RGB32,但输出的子类型是RGB24。但是为什么CEZrgb24 :: CheckInputType方法的类型可以是RGB32,而CEZrgb24 :: CheckTransform只返回RGB24的OK。
----------------------------------------------- --- 2009/8/21编辑
我自己解决了这个问题。我发布了答案。答案 0 :(得分:0)
那么这意味着您没有确保输出的CMediaType有效。
In :: CheckTransform它将返回E_FAIL,除非mtIn和mtOut相同,而CanPerformEZrgb24确认SubType是RGB_24。其中一个测试必须允许RGB32通过。这意味着您已稍微修改了代码。
检查以下功能如下所示:
HRESULT CEZrgb24::CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut)
{
CheckPointer(mtIn,E_POINTER);
CheckPointer(mtOut,E_POINTER);
if (CanPerformEZrgb24(mtIn))
{
if (*mtIn == *mtOut)
{
return NOERROR;
}
}
return E_FAIL;
}
BOOL CEZrgb24::CanPerformEZrgb24(const CMediaType *pMediaType) const
{
CheckPointer(pMediaType,FALSE);
if (IsEqualGUID(*pMediaType->Type(), MEDIATYPE_Video))
{
if (IsEqualGUID(*pMediaType->Subtype(), MEDIASUBTYPE_RGB24))
{
VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pMediaType->Format();
return (pvi->bmiHeader.biBitCount == 24);
}
}
return FALSE;
}
答案 1 :(得分:0)
我自己找到了解决方案。我在问题中发布了答案。根据 StackOverflow 的指南,我想我更喜欢在这里粘贴它。
我遇到了这个问题。修改CEZrgb24 ::复制方法如下,
HRESULT CEZrgb24::Copy(IMediaSample *pSource, IMediaSample *pDest) const
{
...
// Copy the sample data
BYTE *pSourceBuffer, *pDestBuffer;
long lSourceSize = m_pInput->CurrentMediaType().GetSampleSize();
#ifdef DEBUG
long lDestSize = m_pOutput->CurrentMediaType().GetSampleSize();
ASSERT(lDestSize >= lSourceSize);
#endif
...
}
现在,断言成功了。