0

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

哦,我发现实际输入的媒体子类型是 RGB32,但输出的子类型是 RGB24。但是,为什么 CEZrgb24::CheckInputType 方法和 CEZrgb24::CheckTransform 的类型都可以是 RGB32 只为 RGB24 返回 OK。

-------------------------------------------------- 2009/8/21 编辑

我自己遇到了问题。我张贴作为答案。

4

2 回答 2

0

那么这意味着您不确定输出的 CMediaType 是否有效。

在 ::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;

}
于 2009-08-20T12:58:50.937 回答
0

我自己找到了解决方案。我已经在问题中发布了答案。根据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

    ...
}

现在,断言成功了。

于 2012-02-07T01:25:54.657 回答