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

时间:2009-08-20 06:11:27

标签: windows directx directshow

我已成功构建了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编辑

我自己解决了这个问题。我发布了答案。

2 个答案:

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

    ...
}

现在,断言成功了。