Show page source of QPin #42163

= ピンの実装 (QPin) =

本フィルターでは、2つの固定的出力ピンを持つ。

一つは、Video 用 (QPinVideo) もう一つは、Audio 用 (QPinAudio) となる。

== IPin

 * Connect()

接続を行う。(下記参照)

 * ReceiveConnection()

出力ピンでは、インプリメントされない。

 * Disconnect()

接続を解除する。動的再接続はサポートしない。

 * ConnectedTo()
 * ConnectionMediaType()

接続状態の情報を返す。

 * QueryPinInfo()
 * QueryDirection()
 * QueryId()

ピンの情報を返す。

 * QueryAccept()

下流フィルターからの MediaType 変更を受け付ける。

Video Renderer は、出力サーフェイスの都合で、ビットマップの Stride (Pitch) を変更
する場合がある。

 * EnumMediaTypes()

出力可能な MediaType を提示する。

 * QueryInternalConnections()

内部接続されたピンはない。

 * EndOfStream()
 * BeginFlush()
 * EndFlush()
 * NewSegment()

出力ピンでは、インプリメントされない。

== 接続処理の実装

フィルターグラフから、接続要求があった場合、出力ピンに対して、IPin::Connect() が
呼び出される。このメソッドで、接続処理を行う必要がある。

BaseClasses では、接続ネゴシエーションの複雑なロジックが実装されているが、ここでは、
簡易的な実装を行うものとする。

=== MediaType フォーマット指定

To be implemented.

=== MediaType ネゴシエーション

ピンの持つ出力 MediaType が入力ピンに受け入れられるかテスト (IPin::QueryAccept()) する。

入力ピンの IPin::ReceiveConnection() を呼び出す。

=== MemoryAllocation ネゴシエーション

Push Model で出力を行うため、入力ピンに対して IMemInputPin を要求する。

入力ピンから提供される Allocator を使用するため、入力ピンに Allocator を
要求 (IMemInputPin::GetAllocator()) する。本フィルターからの Allocator の提供は行わない。
(レンダラーは、上流フィルターの Allocator を受け入れない場合がある。)

Allocator に必要なバッファーサイズの要求 (IMemAllocator::SetProperties()) を行う。

接続先のフィルターによっては、SetProperties() 呼び出しで、
QueryAccept() により、MediaType の修正が求められる場合がある。

IMemInputPin::NotifyAllocator() を呼び出し、Allocator を確定する。

接続プロセスを完了する。

=== その他

なお、本フィルターでは、動的再接続はサポートしない。