自定义DirectShow源过滤器 - 动态分辨率更改

时间:2012-01-10 15:24:53

标签: video filter directshow dynamic-resizing

之前我曾为视频渲染器过滤器提出了一个非常类似的问题。

见这里:Custom DirectShow Video Renderer Filter - Dynamic Resolution Change

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

我可以从流中获得分辨率更改。当我得到一个新的分辨率时,我也调整了缓冲区的大小。但我不知道如何通过引脚通知我的新决议。我应该以某种方式从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 { ... };

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

2 个答案:

答案 0 :(得分:1)

来自MSDN Dynamic Format Changes

  
      如果输出引脚建议对其下游对等体进行格式更改,则使用
  1. QueryAccept (Downstream),但仅当新格式执行时才使用   不需要更大的缓冲区。

  2.   当输出引脚向其下游对等体提出格式更改时,使用
  3. ReceiveConnection,并且新格式需要更大   缓冲液中。

  4.   

你有没有机会尝试这两种中的任何一种?

答案 1 :(得分:1)

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

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

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