Windows 为什么输出IMediaSample的缓冲区大小小于输入IMediaSample的缓冲区大小?

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->

我已成功构建了DirectShowSDK中的ezrgb24示例项目。但我在调试它时遇到了一个困惑的问题

转换方法调用了以下复制方法

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。