Windows 为什么输出IMediaSample的缓冲区大小小于输入IMediaSample的缓冲区大小?
我已成功构建了DirectShowSDK中的ezrgb24示例项目。但我在调试它时遇到了一个困惑的问题 转换方法调用了以下复制方法Windows 为什么输出IMediaSample的缓冲区大小小于输入IMediaSample的缓冲区大小?,windows,directx,directshow,Windows,Directx,Directshow,我已成功构建了DirectShowSDK中的ezrgb24示例项目。但我在调试它时遇到了一个困惑的问题 转换方法调用了以下复制方法 HRESULT CEZrgb24::Copy(IMediaSample *pSource, IMediaSample *pDest) const { ... // Copy the sample data BYTE *pSourceBuffer, *pDestBuffer; long lSourceSize = pSource->
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
...
}
断言语句失败。使用GraphiEdit,我检查了过滤器的输入媒体类型是RGB24,输出也是RGB24。我无法理解为什么输出的缓冲区大小会小于输入的实际数据大小。谁能帮我
谢谢
-------------------------2009/8/20编辑
O、 我发现实际上输入媒体子画面是RGB32的,而输出媒体子画面是RGB24的。但是,对于CEZrgb24::CheckInputType方法和CEZrgb24::CheckTransform,为什么类型都可以是RGB32,对于RGB24只返回OK
-------------------------2009/8/21编辑
我自己解决了这个问题。我将其作为答案发布。这意味着您无法确保输出的CMediaType是有效的 In::CheckTransform将返回E_FAIL,除非mtIn和mtOut相同,而CanPerformEZrgb24确认子类型为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;
}
我自己找到了解决办法。我已经把答案贴在问题上了。根据StackOverflow的指南,我想我更喜欢把它贴在这里 我碰到了问题。修改CEZrgb24::Copy方法如下:
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
...
}
现在,断言成功了。我没有修改它们。我刚刚构建并调试了该项目。我试图修改CEZrgb24::Copy as CopyMemory PVOID pDestBuffer、PVOID pSourceBuffer、lSourceSize的一条语句CopyMemory PVOID pDestBuffer、PVOID PSourceSize、lDestSize。虽然有一些帧呈现为红色,但它仍然有效。但我不知道为什么pSource->getactualdalength大于m_pInput->CurrentMediaType.GetSampleSize。