現在、TVキャプチャカードを構成するためのDirectShowベースのアプリケーションに取り組んでいます。そこにあるほとんどのキャプチャカードで動作するはずなので、可能な限り一般的である必要があります。
ほとんどのキャプチャカードメーカーはさまざまな構成方法を考え出しているようですので、私のアプリケーションは関連するフィルターとそのピンを分析しようとします。一般的な方法の1つは、特定のピンをレンダラーに直接接続できるかどうか、または最初にエンコーダー/マルチプレクサが必要かどうかを確認することです。
注:私はVB.NETでDirectShow .NETライブラリを使用していますが、必要に応じてC#またはC++で回答できます。
AMMediaType
次の関数を使用して、出力ピンが特定のものを受け入れるかどうかを確認してみました。
Private Function Check1(filter As IBaseFilter, type As AMMediaType) As Boolean
Dim enumPins As IEnumPins = Nothing
If filter.EnumPins(enumPins) = 0 Then
Dim pin(0) As IPin
While (enumPins.Next(1, pin, Nothing) = 0)
Dim accepted As Boolean = (pin(0).QueryAccept(type) = 0)
Marshal.ReleaseComObject(pin(0))
If accepted Then Return True
End While
End If
Return False
End Function
この関数は常にを返しますFalse
。いくつかのデバッグの後、私はそれがQueryAccept
常にを返すことを発見しました-2147467259
。ドキュメントには、そのような戻り値については記載されていません。さらに調査したところQueryAccept
、新しいMediaTypeの提案に使用されていることがわかりました。そのため、QueryAcceptは、呼び出し元のピンがすでに接続されている場合にのみ機能すると思います。詳細はこちらをご覧ください。
AMMediaType
以下の機能を使用して、出力ピンが特定のものを優先するかどうかを確認できます。
Private Function Check2(filter As IBaseFilter, type As AMMediaType) As Boolean
Dim enumPins As IEnumPins = Nothing
If filter.EnumPins(enumPins) = 0 Then
Dim pin(0) As IPin
While (enumPins.Next(1, pin, Nothing) = 0)
Dim enumMediaTypes As IEnumMediaTypes = Nothing
If pin(0).EnumMediaTypes(enumMediaTypes) = 0 Then
Dim mediaType(0) As AMMediaType
While (enumMediaTypes.Next(1, mediaType, Nothing) = 0)
Dim equals As Boolean = (type Is Nothing OrElse
(type.majorType = Nothing OrElse mediaType(0).majorType = type.majorType) AndAlso
(type.subType = Nothing OrElse mediaType(0).subType = type.subType) AndAlso
(type.formatType = Nothing OrElse mediaType(0).formatType = type.formatType))
DsUtils.FreeAMMediaType(mediaType(0))
If equals Then
Return True
End If
End While
End If
End While
End If
Return False
End Function
を列挙EnumMediaTypes
することで、特定のものが優先AMMediaType
としてリストされているかどうかを判断できます。ただし、これは接続が可能であることを保証するものではありません。多くの場合、この列挙には含まれていないが、接続に使用できるタイプがあります。この列挙は空の場合があります。
私が探しているのは、フィルターを別のフィルターに直接接続できるかどうか、または最初にエンコーダー/マルチプレクサに接続する必要があるかどうかを判断する方法です。誰かが私がこれを達成する方法を知っていますか?
注:フィルターを接続し、戻り値を使用して成功したかどうかを判断することはできません。私の経験では、ICaptureGraphBuilder :: RenderStreamは、接続が確立されていないときに戻ることがよくありますS_OK
。たとえば、MediaType.AnalogVideo
アナログビデオピンがない状態で使用してみてください。