私は以前、ビデオレンダラーフィルターについて非常によく似た質問をしました。
ここを参照してください:カスタムDirectShowビデオレンダラーフィルター-動的解像度の変更
しかし今回は、ソースフィルターのソリューションが必要です。このソースフィルターは、ビデオレンダラーに直接接続します。デコーダーが組み込まれています。
ストリームから解像度の変更を取得できます。また、新しい解像度を取得したときにバッファのサイズを変更します。しかし、ピンを介して新しい解像度を通知する方法がわかりません。どういうわけかからインスタンスを作成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 { ... };
答えは簡単で、周りにはたくさんの例があるはずですが、私はこれらの主題について少し混乱しているので、例以外に良い説明を好みます。