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

IAMStreamConfig

COM
IIDc6e13340-30ac-11d0-a18c-00a0c9118956継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IAMStreamConfig インターフェースは、音声と映像の両方について、特定のキャプチャフィルターおよび圧縮フィルターの出力フォーマットを設定します。

解説(Remarks)

フィルターは、このインターフェースを出力ピン上で公開します。このインターフェースを使用するには、フィルターのピンを列挙し、IAMStreamConfig をクエリします。あるいは、フィルターグラフの構築に Capture Graph Builder オブジェクトを使用している場合は、ICaptureGraphBuilder2::FindInterface メソッドを呼び出すことができます。キャプチャフィルターは、キャプチャ用とプレビュー用に別々のピンを持つ場合があることに注意してください。

フィルター開発者向け

キャプチャフィルターまたは圧縮フィルターを作成する場合は、このインターフェースを映像または音声の出力ピン上に実装します。詳細については、Exposing Capture and Compression Formats を参照してください。

メソッド 4

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

vtbl 3 HRESULT SetFormat(AM_MEDIA_TYPE* pmt)

SetFormat メソッドは、ピンの出力フォーマットを設定します。

pmtAM_MEDIA_TYPE*in新しいフォーマットを指定する AM_MEDIA_TYPE 構造体へのポインター。

戻り値

HRESULT 値を返します。取り得る値には次のものがあります。

リターンコード 説明
S_OK
成功しました。
E_OUTOFMEMORY
メモリが不足しています。
E_POINTER
NULL ポインター値です。
VFW_E_INVALIDMEDIATYPE
このメディアタイプは無効です。
VFW_E_NOT_CONNECTED
入力ピンが接続されていません。
VFW_E_NOT_STOPPED
タイプを設定できません。フィルターが停止していません。
VFW_E_WRONG_STATE
タイプを設定できません。フィルターが停止していません。

解説(Remarks)

このメソッドは、出力ピンのフォーマットを指定します。ピンが接続されていない場合は、次回の接続時にこのフォーマットが使用されます。ピンが既に接続されている場合は、このフォーマットで再接続を試みます。相手側のピンが新しいタイプを拒否した場合、このメソッドは失敗することがあります。

このメソッドが成功すると、以降の IPin::EnumMediaTypes メソッドの呼び出しでは、新しいタイプのみが返され、それ以外は返されません。

ほとんどのフィルターでは、フィルターが一時停止中または実行中の場合、このメソッドは失敗します。一部の圧縮フィルターでは、フィルターの入力ピンが接続されていない場合にこのメソッドが失敗します。

一部のフィルターでは、値 NULL を指定してこのメソッドを呼び出すことで、ピンを既定のフォーマットにリセットできます。

フィルター開発者向け: 以下の解説では、このメソッドの実装方法を説明します。

出力ピンが接続されておらず、指定されたメディアタイプをピンがサポートしている場合は、S_OK を返します。そのメディアタイプを保存し、CBasePin::GetMediaType メソッドでフォーマット番号 0 として提供します。それ以外のフォーマットは提供せず、CBasePin::CheckMediaType メソッドで拒否します。

ピンが既に接続されており、そのメディアタイプをピンがサポートしている場合は、そのタイプでピンを再接続します。相手側のピンが新しいタイプを拒否した場合は、VFW_E_INVALIDMEDIATYPE を返し、元の接続を復元します。

vtbl 4 HRESULT GetFormat(AM_MEDIA_TYPE** ppmt)

GetFormat メソッドは、現在または優先される出力フォーマットを取得します。

ppmtAM_MEDIA_TYPE**outAM_MEDIA_TYPE 構造体へのポインターのアドレス。

戻り値

HRESULT 値を返します。取り得る値には次のものがあります。

リターンコード 説明
S_OK
成功しました。
E_OUTOFMEMORY
メモリが不足しています。
E_POINTER
NULL ポインター値です。
VFW_E_NOT_CONNECTED
入力ピンが接続されていません。

解説(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();
vtbl 5 HRESULT GetNumberOfCapabilities(INT* piCount, INT* piSize)

GetNumberOfCapabilities メソッドは、このピンがサポートするフォーマット能力(capability)の数を取得します。

piCountINT*outフォーマット能力の数を受け取る変数へのポインター。
piSizeINT*out構成構造体のサイズ(バイト単位)を受け取る変数へのポインター。詳細については「解説」を参照してください。

戻り値

HRESULT 値を返します。取り得る値には次のものがあります。

リターンコード 説明
S_OK
成功しました。
E_POINTER
NULL ポインター値です。
VFW_E_NOT_CONNECTED
入力ピンが接続されていません。

解説(Remarks)

出力ピンは、複数のフォーマット能力のセットをサポートできます。このメソッドは、ピンがサポートする能力の総数を返します。この数は piCount パラメーターで返されます。特定の能力のセットを取得するには、IAMStreamConfig::GetStreamCaps メソッドを呼び出します。フォーマット能力は 0 から始まるインデックスで管理されるため、piCount で返される値は上限より 1 大きい値になります。

ピンのフォーマットタイプに応じて、映像の場合は VIDEO_STREAM_CONFIG_CAPS 構造体、音声の場合は AUDIO_STREAM_CONFIG_CAPS 構造体になります。piSize パラメーターは、その構造体のサイズ(バイト単位)を受け取ります。

一部の圧縮フィルターでは、フィルターの入力ピンが接続されていない場合にこのメソッドが失敗します。

vtbl 6 HRESULT GetStreamCaps(INT iIndex, AM_MEDIA_TYPE** ppmt, BYTE* pSCC)

GetStreamCaps メソッドは、一組のフォーマット能力を取得します。

iIndexINTin取得するフォーマット能力を、0 から始まるインデックスで指定します。ピンがサポートする能力の数を調べるには、IAMStreamConfig::GetNumberOfCapabilities メソッドを呼び出します。
ppmtAM_MEDIA_TYPE**outAM_MEDIA_TYPE 構造体へのポインターのアドレス。このメソッドが構造体を割り当て、メディアタイプを設定します。
pSCCBYTE*out呼び出し側が割り当てたバイト配列へのポインター。映像の場合は VIDEO_STREAM_CONFIG_CAPS 構造体(「解説」を参照)を、音声の場合は AUDIO_STREAM_CONFIG_CAPS 構造体を使用します。配列に必要なサイズを調べるには、GetNumberOfCapabilities メソッドを呼び出します。サイズは piSize パラメーターで返されます。

戻り値

HRESULT 値を返します。取り得る値には次のものがあります。

リターンコード 説明
S_FALSE
指定されたインデックスが大きすぎます。
S_OK
成功しました。
E_INVALIDARG
インデックスが無効です。
E_OUTOFMEMORY
メモリが不足しています。
E_POINTER
NULL ポインター値です。
VFW_E_NOT_CONNECTED
入力ピンが接続されていません。

解説(Remarks)

このメソッドは、2 種類の情報を返します。

注意 映像デバイスの構成に VIDEO_STREAM_CONFIG_CAPS 構造体を使用することは非推奨です。呼び出し側はバッファーを割り当てる必要がありますが、メソッドが返った後はその内容を無視してください。キャプチャデバイスは、サポートするフォーマットを pmt パラメーターを通じて返します。
出力ピンがこのフォーマットを使用するように構成するには、IAMStreamConfig::SetFormat メソッドを呼び出し、pmt の値を渡します。

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;

hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize);

pSCC = new BYTE[iSize]; if (pSCC == NULL) { // TODO: Out of memory error. }

// Get the first format. hr = pConfig->GetStreamCaps(0, &pmt, pSCC)); if (hr == S_OK) { // TODO: Examine the format. If it's not suitable for some // reason, call GetStreamCaps with the next index value (up // to iCount). Otherwise, set the format: hr = pConfig->SetFormat(pmt); if (FAILED(hr)) { // TODO: Error handling. } DeleteMediaType(pmt); } delete [] pSCC;

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_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 方式にも切替可。