【问题标题】:Why the buffer size of the output IMediaSample is smaller than one of the input?为什么输出 IMediaSample 的缓冲区大小小于输入之一?
【发布时间】:2009-08-20 06:11:26
【问题描述】:

我已经成功构建了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 方法和 CEZrgb24::CheckTransform 的类型都可以是 RGB32 只为 RGB24 返回 OK。

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

我自己遇到了问题。我发布作为答案。

【问题讨论】:

  • 但是我不知道为什么pSource->GetActualDataLength()大于m_pInput->CurrentMediaType().GetSampleSize()。

标签: windows directx directshow


【解决方案1】:

这意味着您不确定输出的 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;

}

【讨论】:

  • 我没有修改它们。我刚刚构建并调试了项目。
  • 我试图修改 CEZrgb24::Copy as CopyMemory( (PVOID) pDestBuffer,(PVOID) pSourceBuffer,min 的语句 CopyMemory( (PVOID) pDestBuffer,(PVOID) pSourceBuffer,lSourceSize) (lSourceSize, lDestSize))。尽管有几帧呈现为红色,但它仍然有效。
【解决方案2】:

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

    ...
}

现在,断言成功了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 2016-08-02
    • 2021-10-08
    • 2012-02-06
    • 2018-12-12
    相关资源
    最近更新 更多