4

对于视频渲染器过滤器,我之前曾问过一个非常相似的问题。

请参阅此处:自定义 DirectShow 视频渲染器过滤器 - 动态分辨率更改

但这一次,我需要一个源过滤器的解决方案。此源过滤器直接连接到视频渲染器。解码器被嵌入。

我能够从流中获取分辨率更改。当我得到一个新的分辨率时,我也会调整缓冲区的大小。但我不知道如何通过 pin 通知我的新决议。我应该以某种方式创建一个实例CMediaType,填写新值并调用 pin 的SetMediaType()方法还是正确的解决方案是什么?我目前正在这样做。

if(nWidth * nHeight * 3 != reader->m_RGB24BufferSize) { // if resolution changed
    reader->m_RGB24BufferSize = nWidth * nHeight * 3;
    reader->m_RGB24Buffer = (BYTE*)malloc(reader->m_RGB24BufferSize);

    reader->m_pin->m_bmpInfo.biWidth = nWidth;
    reader->m_pin->m_bmpInfo.biHeight = nHeight;
    reader->m_pin->m_bmpInfo.biSizeImage = GetBitmapSize(&reader->m_pin->m_bmpInfo);

    // Now what? How to notify the video renderer?
}

m_pin是此处声明为源滤波器的唯一输出引脚;

class MyPin : public CSourceStream { ... };

我知道答案应该很简单,并且应该有很多例子,但由于我对这些主题有点困惑,除了例子之外,我更喜欢一个很好的解释。

4

2 回答 2

2

CDynamicOutputPin当您需要向下游(到渲染器)发送有关格式更改的通知时,您可以派生输出引脚并执行以下操作:

hr = StartUsingOutputPin();
if (SUCCEEDED(hr))
{
    hr = ChangeMediaType(&m_mt);
    StopUsingOutputPin();
}

Windows SDK 中的 DirectShow 示例中有一个实现CDynamicSourceStream和匹配,您可能会发现它很有帮助。CDynamicSource

于 2012-01-12T16:56:59.100 回答
1

来自 MSDN动态格式更改

  1. QueryAccept (Downstream)用于如果输出引脚向其下游对等方提出格式更改,但仅当新格式不需要更大的缓冲区时使用。

  2. ReceiveConnection用于当输出引脚向其下游对等方提出格式更改,并且新格式需要更大的缓冲区时。

你有机会尝试这两个中的任何一个吗?

于 2012-01-11T08:50:09.193 回答