Win32 API 日本語リファレンス
ホームMedia.DirectShow › IPin

IPin

COM
IID56a86891-0ad4-11ce-b03a-0020af0ba770継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

このインターフェイスは、すべての入力ピンおよび出力ピンによって公開されます。フィルターグラフマネージャーは、このインターフェイスを使用してピンを接続し、フラッシュ操作を実行します。

メソッド 15

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Connect(IPin* pReceivePin, AM_MEDIA_TYPE* pmt)

Connect メソッドは、ピンを別のピンに接続します。

pReceivePinIPin*in受信側ピンの IPin インターフェイスへのポインター。
pmtAM_MEDIA_TYPE*inoptional接続のメディアタイプを指定する AM_MEDIA_TYPE 構造体へのポインター。NULL を指定できます。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
VFW_E_ALREADY_CONNECTED
ピンは既に接続されています。
VFW_E_NO_ACCEPTABLE_TYPES
受け入れ可能なメディアタイプが見つかりません。
VFW_E_NO_TRANSPORT
ピン同士がトランスポートについて合意できないか、接続用のアロケーターがありません。
VFW_E_NOT_STOPPED
フィルターがアクティブで、ピンが動的な再接続をサポートしていません。
VFW_E_TYPE_NOT_ACCEPTED
指定されたメディアタイプは受け入れられません。

解説(Remarks)

pmt パラメーターには NULL を指定できます。また、メジャータイプ、サブタイプ、またはフォーマットに GUID_NULL の値を指定することで、部分的なメディアタイプを指定することもできます。

このメソッドは、接続が可能かどうかを検証します。ピンが接続を拒否した場合、このメソッドは失敗します。接続元のピンは、受信側ピンで IPin::ReceiveConnection を呼び出すことでメディアタイプを提案します。

vtbl 4 HRESULT ReceiveConnection(IPin* pConnector, AM_MEDIA_TYPE* pmt)

ReceiveConnection メソッドは、別のピンからの接続を受け入れます。

pConnectorIPin*in接続元ピンの IPin インターフェイスへのポインター。
pmtAM_MEDIA_TYPE*in接続のメディアタイプを指定する AM_MEDIA_TYPE 構造体へのポインター。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
E_POINTER
NULL ポインター引数です。
VFW_E_ALREADY_CONNECTED
ピンは既に接続されています。
VFW_E_NOT_STOPPED
フィルターがアクティブな間は接続できません。
VFW_E_TYPE_NOT_ACCEPTED
指定されたメディアタイプは受け入れられません。

解説(Remarks)

出力ピンが接続するとき、入力ピンに対してこのメソッドを呼び出します。入力ピンは、指定されたメディアタイプが受け入れ可能かどうかを検証する必要があります。また、所有元フィルター固有のその他の接続要件を確認する必要がある場合もあります。接続が適切であれば、入力ピンは S_OK を返し、さらに次の処理を行う必要があります。

接続が不適切な場合、ピンはエラーコードを返す必要があります。

CBasePin クラスは、メディアタイプと IPin ポインターの保存を含め、このメソッドの基本的なフレームワークを実装しています。

vtbl 5 HRESULT Disconnect()

Disconnect メソッドは、現在のピン接続を切断します。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_FALSE
ピンは接続されていませんでした。
S_OK
成功しました。
VFW_E_NOT_STOPPED
フィルターがアクティブです。

解説(Remarks)

このメソッドは、フィルターが一時停止中または実行中の場合は失敗します。ピンが IPinConnection インターフェイスをサポートしている場合は、フィルターが一時停止中または実行中にピンを切断するには IPinConnection::DynamicDisconnect を呼び出します。

このメソッドは、ピン接続のもう一方のピンは切断しません。

vtbl 6 HRESULT ConnectedTo(IPin** pPin)

ConnectedTo メソッドは、接続されているピンがある場合、そのピンへのポインターを取得します。

pPinIPin**outもう一方のピンの IPin インターフェイスへのポインターを受け取ります。呼び出し元はインターフェイスを解放する必要があります。このパラメーターに NULL を指定することはできません。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
E_POINTER
NULL ポインター引数です。
VFW_E_NOT_CONNECTED
ピンは接続されていません。

解説(Remarks)

このメソッドが成功した場合、返される IPin インターフェイスには未解放の参照カウントが残っています。使用が終わったら必ず解放してください。

vtbl 7 HRESULT ConnectionMediaType(AM_MEDIA_TYPE* pmt)

ConnectionMediaType メソッドは、現在のピン接続にメディアタイプがある場合、そのメディアタイプを取得します。

pmtAM_MEDIA_TYPE*outメディアタイプを受け取る AM_MEDIA_TYPE 構造体へのポインター。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
E_POINTER
NULL ポインター引数です。
VFW_E_NOT_CONNECTED
ピンは接続されていません。

解説(Remarks)

ピンが接続されている場合、このメソッドは pmt で指定された AM_MEDIA_TYPE 構造体にメディアタイプをコピーします。呼び出し元は、メディアタイプのフォーマットブロックを解放する必要があります。Microsoft® Win32® の CoTaskMemFree 関数、または FreeMediaType ヘルパー関数を使用できます。

ピンが接続されていない場合、このメソッドは pmt で指定されたメディアタイプをクリアし、エラーコードを返します。

vtbl 8 HRESULT QueryPinInfo(PIN_INFO* pInfo)

QueryPinInfo メソッドは、ピンに関する情報を取得します。

pInfoPIN_INFO*outピン情報を受け取る PIN_INFO 構造体へのポインター。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
E_POINTER
NULL ポインター引数です。

解説(Remarks)

メソッドが返るときに、PIN_INFO 構造体の pFilter メンバーが非 NULL の場合、そのインターフェイスには未解放の参照カウントが残っています。使用が終わったら必ずインターフェイスを解放してください。

vtbl 9 HRESULT QueryDirection(PIN_DIRECTION* pPinDir)

QueryDirection メソッドは、ピンの方向(入力または出力)を取得します。

pPinDirPIN_DIRECTION*outPIN_DIRECTION 列挙型のメンバーを受け取ります。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
E_POINTER
NULL ポインター引数です。
vtbl 10 HRESULT QueryId(LPWSTR* Id)

QueryId メソッドは、ピンの識別子を取得します。

IdLPWSTR*outピン識別子を含む文字列を受け取ります。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
E_OUTOFMEMORY
メモリが不足しています。
E_POINTER
NULL ポインター引数です。

解説(Remarks)

このメソッドはグラフの永続化をサポートします。ピンの状態を保存するにはこのメソッドを使用し、状態を復元するには IBaseFilter::FindPin メソッドを使用します。ピンの識別子文字列はフィルターの実装によって定義されます。識別子はフィルター内で一意である必要があります。

注意 ピン識別子は、QueryPinInfo メソッドが返すピン名と必ずしも同じとは限りません。
フィルターは、返される文字列を CoTaskMemAlloc 関数を使用して割り当てます。呼び出し元は CoTaskMemFree を使用してそれを解放する必要があります。
vtbl 11 HRESULT QueryAccept(AM_MEDIA_TYPE* pmt)

QueryAccept メソッドは、ピンが指定されたメディアタイプを受け入れるかどうかを判定します。

pmtAM_MEDIA_TYPE*inメディアタイプを指定する AM_MEDIA_TYPE 構造体へのポインター。

戻り値

次のいずれかの値を返します。

Return code Description
S_FALSE
ピンはメディアタイプを拒否します。
S_OK
ピンはメディアタイプを受け入れます。

解説(Remarks)

S_OK という戻り値は、次のサンプル、またはピンの再接続後のいずれかで、ピンがメディアタイプを受け入れることを示します。実装では、他のピンの接続やフィルターに設定可能な各種プロパティを含め、フィルターの現在の状態を考慮する必要があります。

S_FALSE を含むその他の戻り値は、ピンがメディアタイプを拒否することを意味します。したがって、S_OK を明示的にテストしてください。SUCCEEDED マクロは使用しないでください。

フィルターが実行中の場合、S_OK という戻り値はあいまいです。ピンは再接続せずに次のメディアサンプルでのフォーマット変更を受け入れる可能性もあれば、再接続が必要な可能性もあります。ピンが IPinConnection インターフェイスをサポートしている場合は、IPinConnection::DynamicQueryAccept メソッドを呼び出してください。このメソッドは、ピンが再接続せずに新しいタイプを受け入れられるかどうかを具体的にテストします。

vtbl 12 HRESULT EnumMediaTypes(IEnumMediaTypes** ppEnum)

EnumMediaTypes メソッドは、ピンが優先するメディアタイプを列挙します。

ppEnumIEnumMediaTypes**outIEnumMediaTypes インターフェイスへのポインターを受け取ります。呼び出し元はインターフェイスを解放する必要があります。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
E_OUTOFMEMORY
メモリが不足しています。
E_POINTER
NULL ポインター引数です。
VFW_E_NOT_CONNECTED
ピンが接続されていません。一部のピンは、別のフィルターに接続されていない限りメディアタイプを列挙しません。

解説(Remarks)

IEnumMediaTypes インターフェイスは、標準的な COM 列挙子と同様に動作します。詳細については、Enumerating Objects in a Filter Graph を参照してください。このメソッドが成功した場合、IEnumMediaTypes インターフェイスには未解放の参照カウントが残っています。使用が終わったら必ず解放してください。

vtbl 13 HRESULT QueryInternalConnections(IPin** apPin, DWORD* nPin)

QueryInternalConnections メソッドは、このピンに(フィルター内部で)内部的に接続されているピンを取得します。

apPinIPin**outoptionalIPin ポインターの配列のアドレス。呼び出し元が配列を割り当てます。このメソッドは配列を IPin ポインターで埋めます。nPin が 0 の場合、このパラメーターに NULL を指定できます。
nPinDWORD*inout入力時には、配列のサイズを指定します。出力時には、内部的に接続されているピンの数を指定します。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_FALSE
配列のサイズが不足しています。
S_OK
成功しました。
E_NOTIMPL
実装されていません。

解説(Remarks)

このメソッドは、フィルターにおける入力ピンから出力ピンへの内部的なマッピングに関する情報を返します。言い換えると、入力ピンが出力ピンにどのようにデータを配信するかを表します。

ほとんどのフィルターでは、すべての入力ピンがすべての出力ピンに接続されます。たとえば、変換フィルターでは 1 つの入力が 1 つの出力に接続され、スプリッターフィルターでは 1 つの入力が複数の出力に接続されます。これらの場合、このメソッドは単に E_NOTIMPL を返す必要があります。

それ以外の場合、このメソッドは、照会したピンに内部的にマッピングされているピンごとに 1 つずつ、IPin ポインターの配列を返します。入力ピンでこのメソッドを呼び出すと、配列には出力ピンへのポインターが格納され、その逆も同様です。

呼び出し元が IPin ポインターの配列を割り当てます。必要な配列サイズを取得するには、apPinNULL にしてメソッドを一度呼び出します。サイズは nPin パラメーターで返されます。次に配列を割り当て、apPin に配列のアドレスを、nPin に配列サイズを設定して、メソッドを再度呼び出します。するとメソッドは配列を IPin ポインターで埋めます。返される各ポインターには未解放の参照カウントが残っており、呼び出し元が解放する必要があります。

このメソッドには、現在では非推奨となっている別の用途があります。Filter Graph Manager は、少なくとも 1 つの入力ピンがこのメソッドを実装しているが nPin に 0 を返す場合、そのフィルターをレンダラーフィルターと見なします。ただし、新しいレンダラーフィルターを作成する場合は、このメソッドを使用してフィルターがレンダラーであることを示すのではなく、IAMFilterMiscFlags インターフェイスを実装する必要があります。

vtbl 14 HRESULT EndOfStream()

EndOfStream メソッドは、フィルターに新しい実行(run)コマンドが発行されるまで追加のデータが予期されないことをピンに通知します。

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
E_UNEXPECTED
ピンは出力ピンです。

解説(Remarks)

このメソッドは入力ピンでのみ呼び出してください。出力ピンは E_UNEXPECTED を返します。

このメソッドは、ストリーム終端(end-of-stream)通知をピンに送信します。ピンはその通知を下流へ配信します。ストリーム終端通知は IMemInputPin::Receive の呼び出しとの間で順序付けする必要があります。ピンが配信のためにメディアサンプルをキューに入れる場合は、ストリーム終端通知も同様にキューに入れる必要があります。IPin::BeginFlush メソッドは、キューに入っているストリーム終端通知をフラッシュします。

vtbl 15 HRESULT BeginFlush()

BeginFlush メソッドは、フラッシュ操作を開始します。(IPin.BeginFlush)

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
E_UNEXPECTED
ピンは出力ピンです。

解説(Remarks)

このメソッドは入力ピンでのみ呼び出してください。出力ピンは E_UNEXPECTED を返します。

フラッシュ操作では、フィルターは処理中のデータをすべて破棄します。フラッシュが完了するまで、新しいデータを拒否します。フラッシュは、上流のピンが IPin::EndFlush メソッドを呼び出したときに完了します。フラッシュにより、通常のデータフローを変化させるイベントが発生したときに、フィルターグラフの応答性が向上します。たとえば、シーク中にフラッシュが発生します。

BeginFlush が呼び出されると、フィルターは次の手順を実行します。

  1. IPin::BeginFlush の呼び出しを下流へ渡します。
  2. IMemInputPin::Receive など、すべてのデータストリーミングメソッドを失敗させる内部フラグを設定します。
  3. Receive メソッドへのブロックされた呼び出しがあれば、そこから復帰させます。
BeginFlush 通知がレンダラーフィルターに到達すると、レンダラーは保持しているサンプルをすべて解放します。

BeginFlush が呼び出された後、ピンは IPin::EndFlush メソッドが呼び出されるまで、上流からのすべてのサンプルを S_FALSE の戻り値で拒否します。

vtbl 16 HRESULT EndFlush()

EndFlush メソッドは、フラッシュ操作を終了します。(IPin.EndFlush)

戻り値

HRESULT 値を返します。指定できる値には次のものがあります。

Return code Description
S_OK
成功しました。
E_UNEXPECTED
ピンは出力ピンです。

解説(Remarks)

このメソッドは入力ピンでのみ呼び出してください。出力ピンは E_UNEXPECTED を返します。

このメソッドが呼び出されると、フィルターは次の処理を実行します。

  1. キューに入っているすべてのサンプルが破棄されるのを待ちます。
  2. 保留中のストリーム終端通知を含め、バッファリングされたデータをすべて解放します。
  3. 保留中の EC_COMPLETE 通知をすべてクリアします。
  4. 下流に対して EndFlush を呼び出します。
このメソッドが返ると、ピンは新しいサンプルを受け入れられるようになります。
vtbl 17 HRESULT NewSegment(LONGLONG tStart, LONGLONG tStop, DOUBLE dRate)

NewSegment メソッドは、この呼び出し以降に受信するメディアサンプルが、共通の開始時刻・停止時刻・レートを持つ 1 つのセグメントとしてグループ化されることをピンに通知します。

tStartLONGLONGin元のソースを基準とした、セグメントの開始時刻(100 ナノ秒単位)。
tStopLONGLONGin元のソースを基準とした、セグメントの終了時刻(100 ナノ秒単位)。
dRateDOUBLEinこのセグメントを処理すべきレート(元のレートに対する割合)。

戻り値

成功した場合は S_OK を返し、失敗した場合はエラーの原因を示す HRESULT 値を返します。

解説(Remarks)

ソースフィルター(またはパーサーフィルター)は、新しいストリームの開始時、および各シーク操作の後に、このメソッドを呼び出します。前のデータのまとまりを配信した後、かつ新しいデータで IMemInputPin::Receive を呼び出す前に、下流フィルターの入力ピンに対してこのメソッドを呼び出します。下流フィルターは NewSegment の呼び出しをさらに下流へ伝搬させます。

フィルターはセグメント情報を使用してサンプルを処理できます。たとえば、一部のフォーマットでは、次のキーフレームがないとデルタフレームを再構築できません。そのため、停止時刻がデルタフレーム上にある場合、ソースフィルターは追加のフレームをいくつか送信する必要があります。デコーダーフィルターは、セグメント情報に基づいて最終フレームを決定します。セグメントレートは、オーディオデータなどの連続的なデータソースをレンダリングするために使用されます。たとえば、オーディオレンダラーは、サンプリングレートとセグメントレートを使用してオーディオデータを正しくレンダリングします。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IPin "{56A86891-0AD4-11CE-B03A-0020AF0BA770}"
#usecom global IPin IID_IPin "{}"
#comfunc global IPin_Connect                   3 sptr,var
#comfunc global IPin_ReceiveConnection         4 sptr,var
#comfunc global IPin_Disconnect                5
#comfunc global IPin_ConnectedTo               6 sptr
#comfunc global IPin_ConnectionMediaType       7 var
#comfunc global IPin_QueryPinInfo              8 var
#comfunc global IPin_QueryDirection            9 var
#comfunc global IPin_QueryId                   10 var
#comfunc global IPin_QueryAccept               11 var
#comfunc global IPin_EnumMediaTypes            12 sptr
#comfunc global IPin_QueryInternalConnections  13 sptr,var
#comfunc global IPin_EndOfStream               14
#comfunc global IPin_BeginFlush                15
#comfunc global IPin_EndFlush                  16
#comfunc global IPin_NewSegment                17 int64,int64,double
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。