4

私は以前、ビデオレンダラーフィルターについて非常によく似た質問をしました。

ここを参照してください:カスタム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 { ... };

答えは簡単で、周りにはたくさんの例があるはずですが、私はこれらの主題について少し混乱しているので、例以外に良い説明を好みます。

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(ダウンストリーム)は、出力ピンがダウンストリームピアにフォーマット変更を提案する場合に使用されますが、新しいフォーマットがより大きなバッファを必要としない場合に限ります。

  2. ReceiveConnectionは、出力ピンがダウンストリームピアにフォーマット変更を提案し、新しいフォーマットがより大きなバッファを必要とする場合に使用されます。

これら2つのいずれかを試す機会がありましたか?

于 2012-01-11T08:50:09.193 に答える