IAMStreamConfig
COM公式ドキュメント
IAMStreamConfig インターフェースは、音声と映像の両方について、特定のキャプチャフィルターおよび圧縮フィルターの出力フォーマットを設定します。
解説(Remarks)
フィルターは、このインターフェースを出力ピン上で公開します。このインターフェースを使用するには、フィルターのピンを列挙し、IAMStreamConfig をクエリします。あるいは、フィルターグラフの構築に Capture Graph Builder オブジェクトを使用している場合は、ICaptureGraphBuilder2::FindInterface メソッドを呼び出すことができます。キャプチャフィルターは、キャプチャ用とプレビュー用に別々のピンを持つ場合があることに注意してください。
フィルター開発者向け
キャプチャフィルターまたは圧縮フィルターを作成する場合は、このインターフェースを映像または音声の出力ピン上に実装します。詳細については、Exposing Capture and Compression Formats を参照してください。メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
SetFormat メソッドは、ピンの出力フォーマットを設定します。
| pmt | AM_MEDIA_TYPE* | in | 新しいフォーマットを指定する AM_MEDIA_TYPE 構造体へのポインター。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功しました。 | |
| メモリが不足しています。 | |
| NULL ポインター値です。 | |
| このメディアタイプは無効です。 | |
| 入力ピンが接続されていません。 | |
| タイプを設定できません。フィルターが停止していません。 | |
| タイプを設定できません。フィルターが停止していません。 |
解説(Remarks)
このメソッドは、出力ピンのフォーマットを指定します。ピンが接続されていない場合は、次回の接続時にこのフォーマットが使用されます。ピンが既に接続されている場合は、このフォーマットで再接続を試みます。相手側のピンが新しいタイプを拒否した場合、このメソッドは失敗することがあります。
このメソッドが成功すると、以降の IPin::EnumMediaTypes メソッドの呼び出しでは、新しいタイプのみが返され、それ以外は返されません。
ほとんどのフィルターでは、フィルターが一時停止中または実行中の場合、このメソッドは失敗します。一部の圧縮フィルターでは、フィルターの入力ピンが接続されていない場合にこのメソッドが失敗します。
一部のフィルターでは、値 NULL を指定してこのメソッドを呼び出すことで、ピンを既定のフォーマットにリセットできます。
フィルター開発者向け: 以下の解説では、このメソッドの実装方法を説明します。
出力ピンが接続されておらず、指定されたメディアタイプをピンがサポートしている場合は、S_OK を返します。そのメディアタイプを保存し、CBasePin::GetMediaType メソッドでフォーマット番号 0 として提供します。それ以外のフォーマットは提供せず、CBasePin::CheckMediaType メソッドで拒否します。
ピンが既に接続されており、そのメディアタイプをピンがサポートしている場合は、そのタイプでピンを再接続します。相手側のピンが新しいタイプを拒否した場合は、VFW_E_INVALIDMEDIATYPE を返し、元の接続を復元します。
GetFormat メソッドは、現在または優先される出力フォーマットを取得します。
| ppmt | AM_MEDIA_TYPE** | out | AM_MEDIA_TYPE 構造体へのポインターのアドレス。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功しました。 | |
| メモリが不足しています。 | |
| NULL ポインター値です。 | |
| 入力ピンが接続されていません。 |
解説(Remarks)
ピンが接続されている場合、このメソッドはピンが現在使用しているフォーマットを返します。それ以外の場合は、次回のピン接続に向けてピンが優先するフォーマットを返します。既に IAMStreamConfig::SetFormat メソッドを呼び出してフォーマットを設定している場合、GetFormat は同じフォーマットを返します。設定していない場合は、IPin::EnumMediaTypes メソッドで決定される、ピンの優先フォーマット一覧の最初のフォーマットを返します。
このメソッドは AM_MEDIA_TYPE 構造体のメモリを割り当て、構造体に値を設定して、pmt パラメーターで返します。呼び出し側は、フォーマットブロックを含め、このメモリを解放する必要があります。基底クラスライブラリの DeleteMediaType ヘルパー関数を使用できます。
一部の圧縮フィルターでは、フィルターの入力ピンが接続されていない場合にこのメソッドが失敗します。
例
| C++ |
|---|
IAMStreamConfig *pConfig = NULL;
// Query the output pin for IAMStreamConfig (not shown).
AM_MEDIA_TYPE *pmt = NULL;
hr = pConfig->GetFormat(&pmt);
if (SUCCEEDED(hr))
{
/* Examine the media type for any information you need. */
DeleteMediaType(pmt);
}
pConfig->Release();
|
GetNumberOfCapabilities メソッドは、このピンがサポートするフォーマット能力(capability)の数を取得します。
| piCount | INT* | out | フォーマット能力の数を受け取る変数へのポインター。 |
| piSize | INT* | out | 構成構造体のサイズ(バイト単位)を受け取る変数へのポインター。詳細については「解説」を参照してください。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功しました。 | |
| NULL ポインター値です。 | |
| 入力ピンが接続されていません。 |
解説(Remarks)
出力ピンは、複数のフォーマット能力のセットをサポートできます。このメソッドは、ピンがサポートする能力の総数を返します。この数は piCount パラメーターで返されます。特定の能力のセットを取得するには、IAMStreamConfig::GetStreamCaps メソッドを呼び出します。フォーマット能力は 0 から始まるインデックスで管理されるため、piCount で返される値は上限より 1 大きい値になります。
ピンのフォーマットタイプに応じて、映像の場合は VIDEO_STREAM_CONFIG_CAPS 構造体、音声の場合は AUDIO_STREAM_CONFIG_CAPS 構造体になります。piSize パラメーターは、その構造体のサイズ(バイト単位)を受け取ります。
一部の圧縮フィルターでは、フィルターの入力ピンが接続されていない場合にこのメソッドが失敗します。
GetStreamCaps メソッドは、一組のフォーマット能力を取得します。
| iIndex | INT | in | 取得するフォーマット能力を、0 から始まるインデックスで指定します。ピンがサポートする能力の数を調べるには、IAMStreamConfig::GetNumberOfCapabilities メソッドを呼び出します。 |
| ppmt | AM_MEDIA_TYPE** | out | AM_MEDIA_TYPE 構造体へのポインターのアドレス。このメソッドが構造体を割り当て、メディアタイプを設定します。 |
| pSCC | BYTE* | out | 呼び出し側が割り当てたバイト配列へのポインター。映像の場合は VIDEO_STREAM_CONFIG_CAPS 構造体(「解説」を参照)を、音声の場合は AUDIO_STREAM_CONFIG_CAPS 構造体を使用します。配列に必要なサイズを調べるには、GetNumberOfCapabilities メソッドを呼び出します。サイズは piSize パラメーターで返されます。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 指定されたインデックスが大きすぎます。 | |
| 成功しました。 | |
| インデックスが無効です。 | |
| メモリが不足しています。 | |
| NULL ポインター値です。 | |
| 入力ピンが接続されていません。 |
解説(Remarks)
このメソッドは、2 種類の情報を返します。
- pmt パラメーターは、サポートされる出力フォーマットの 1 つを記述する、値が設定済みの AM_MEDIA_TYPE 構造体を受け取ります。
- pSCC パラメーターは、追加のフォーマット情報を含む構造体を受け取ります。映像の場合、pSCC は VIDEO_STREAM_CONFIG_CAPS 構造体を受け取ります。音声の場合は、AUDIO_STREAM_CONFIG_CAPS 構造体を受け取ります。
SetFormat を呼び出す前に、pSCC の情報を使用して pmt 内の AM_MEDIA_TYPE 構造体を変更できます。たとえば、音声ピンは pmt パラメーターで既定のメディアタイプとして 44 kHz、16 ビット、ステレオを返すことがあります。AUDIO_STREAM_CONFIG_CAPS 構造体で返された値に基づいて、SetFormat を呼び出す前にこのフォーマットを 8 ビット、モノラルに変更できます。
このメソッドは、pmt パラメーターで返される AM_MEDIA_TYPE 構造体のメモリを割り当てます。呼び出し側は、フォーマットブロックを含め、このメモリを解放する必要があります。基底クラスライブラリの DeleteMediaType ヘルパー関数を使用できます。pSCC パラメーターのメモリは、呼び出し側が割り当てる必要があります。
一部の圧縮フィルターでは、フィルターの入力ピンが接続されていない場合にこのメソッドが失敗します。
フィルター開発者向け: このメソッドの実装に関する詳細については、Exposing Capture and Compression Formats を参照してください。
例
次の例は、映像出力ピンで最初にサポートされるフォーマット(インデックス 0)を取得し、そのフォーマットをピンに設定します。
| C++ |
|---|
int iCount, iSize; BYTE *pSCC = NULL; AM_MEDIA_TYPE *pmt; |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAMStreamConfig "{C6E13340-30AC-11D0-A18C-00A0C9118956}" #usecom global IAMStreamConfig IID_IAMStreamConfig "{}" #comfunc global IAMStreamConfig_SetFormat 3 var #comfunc global IAMStreamConfig_GetFormat 4 var #comfunc global IAMStreamConfig_GetNumberOfCapabilities 5 var,var #comfunc global IAMStreamConfig_GetStreamCaps 6 int,var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IAMStreamConfig "{C6E13340-30AC-11D0-A18C-00A0C9118956}" #usecom global IAMStreamConfig IID_IAMStreamConfig "{}" #comfunc global IAMStreamConfig_SetFormat 3 sptr #comfunc global IAMStreamConfig_GetFormat 4 sptr #comfunc global IAMStreamConfig_GetNumberOfCapabilities 5 sptr,sptr #comfunc global IAMStreamConfig_GetStreamCaps 6 int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。