对于视频渲染器过滤器,我之前曾问过一个非常相似的问题。
请参阅此处:自定义 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 { ... };
我知道答案应该很简单,并且应该有很多例子,但由于我对这些主题有点困惑,除了例子之外,我更喜欢一个很好的解释。