CTransformFilter から派生したカスタム ビデオ変換フィルターに取り組んでいます。メディア サンプルの余分な内部バッファリング、出力サンプルのキューイング、または動的なフォーマット変更など、DirectShow 用語で異常なことは何もしません。
再生を押すと、エンド ツー エンドで接続されたフィルターの 2 つのインスタンス (最初の出力が 2 番目の入力に接続されている) を含むグラフ編集のグラフがハングします。グラフは、::Transform メソッドのオーバーライド内でぶら下がっていません。2 番目のフィルター インスタンスは、ビデオ レンダラーに直接接続されていません。
2 つのフィルターの間にカラー コンバーターが挿入されている場合、この問題は発生しません。要求されたバッファ (ALLOCATOR_PROPERTIES::cBuffers) の数を 1 から 3 に増やすと、問題はなくなります。元の DecideBufferSize オーバーライドは以下にあり、他の多くのサンプル DirectShow フィルター コードに似ています。
DirectShow フィルター (変換またはその他) で要求されたバッファーの数を設定するための堅牢なポリシーは何ですか? 最新の要件に対して 1 つのバッファーを要求するコードは時代遅れですか? 私の問題はバッファーが少なすぎるのでしょうか、それともバッファーの数を増やして別の問題を隠しているのでしょうか?
HRESULT MyFilter::DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProp)
{
AM_MEDIA_TYPE mt;
HRESULT hr = m_pOutput->ConnectionMediaType(&mt);
if (FAILED(hr)) {
return hr;
}
BITMAPINFOHEADER * const pbmi = GetBitmapInfoHeader(mt);
pProp->cbBuffer = DIBSIZE(*pbmi);
if (pProp->cbAlign == 0) {
pProp->cbAlign = 1;
}
if (pProp->cBuffers == 0) {
pProp->cBuffers = 3;
}
// Release the format block.
FreeMediaType(mt);
// Set allocator properties.
ALLOCATOR_PROPERTIES Actual;
hr = pAlloc->SetProperties(pProp, &Actual);
if (FAILED(hr)) {
return hr;
}
// Even when it succeeds, check the actual result.
if (pProp->cbBuffer > Actual.cbBuffer) {
return E_FAIL;
}
return S_OK;
}