之前我曾为视频渲染器过滤器提出了一个非常类似的问题。
见这里: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 { ... };
我知道答案应该很简单,应该有很多例子,但由于我对这些主题有点困惑,除了这个例子,我更喜欢一个很好的解释。
答案 0 :(得分:1)
来自MSDN Dynamic Format Changes:
如果输出引脚建议对其下游对等体进行格式更改,则使用
- 当输出引脚向其下游对等体提出格式更改时,使用
QueryAccept (Downstream),但仅当新格式执行时才使用 不需要更大的缓冲区。
- 醇>
ReceiveConnection,并且新格式需要更大 缓冲液中。
你有没有机会尝试这两种中的任何一种?
答案 1 :(得分:1)
您可以从CDynamicOutputPin
获取输出引脚,并在需要向下游(向渲染器)发送有关格式更改的通知时执行以下操作:
hr = StartUsingOutputPin();
if (SUCCEEDED(hr))
{
hr = ChangeMediaType(&m_mt);
StopUsingOutputPin();
}
在Windows SDK的DirectShow示例中有CDynamicSourceStream
和匹配CDynamicSource
的实现,您可能会发现这些示例很有帮助。