IAMStreamConfig::GetStreamCaps
GetStreamCaps メソッドは、フォーマット機能セットを取得する。
構文
HRESULT GetStreamCaps(
int iIndex,
AM_MEDIA_TYPE **pmt,
BYTE *pSCC
);
パラメータ
iIndex
[in] 取得するフォーマット機能を指定する。これはゼロからインデックスされる。ピンがサポートする機能の数を取得するには、IAMStreamConfig::GetNumberOfCapabilities メソッドを呼び出す。
pmt
[out] AM_MEDIA_TYPE 構造体へのポインタのアドレス。このメソッドは構造体を割り当て、メディア タイプを埋め込む。
pSCC
[out] 呼び出し元によって割り当てられたバイト配列へのポインタ。ビデオの場合は、VIDEO_STREAM_CONFIG_CAPS 構造体を使う。オーディオの場合は、AUDIO_STREAM_CONFIG_CAPS 構造体を使う。必要な配列のサイズを調べるには、GetNumberOfCapabilities メソッドを呼び出す。
戻り値
HRESULT 値を返す。可能な値は次のとおりである。
戻りコード | 説明 |
S_FALSE | 指定されたインデックスの値が大きすぎる。 |
S_OK | 成功。 |
E_INVALIDARG | 無効なインデックス。 |
E_OUTOFMEMORY | メモリ不足。 |
E_POINTER | NULL ポインタ値。 |
VFW_E_NOT_CONNECTED | 入力ピンが接続されていない。 |
注意
このメソッドは、以下の 2 つの情報を返す。
- pmt 引数は、情報が埋め込まれた AM_MEDIA_TYPE 構造体を受け取る。これは、サポートされる 1 つの出力フォーマットを記述している。
- pSCC 引数は、追加フォーマット情報を含む構造体を受け取る。ビデオの場合、pSCC は VIDEO_STREAM_CONFIG_CAPS 構造体を受け取る。オーディオの場合、AUDIO_STREAM_CONFIG_CAPS 構造体を受け取る。
出力ピンがこのフォーマットを使うように設定するには、IAMStreamConfig::SetFormat メソッドを呼び出し、pmt の値を渡す。
SetFormat を呼び出す前に、pSCC の情報を使って、pmt 内の AM_MEDIA_TYPE 構造体を修正できる。たとえば、オーディオ ピンは、既存のメディア タイプとして、44 kHz、16 ビット ステレオなどを pmt 引数に返す。AUDIO_STREAM_CONFIG_CAPS 構造体に返される値に基づいて、SetFormat を呼び出す前に、このフォーマットを 8 ビット モノラルなどに変更できる。
このメソッドは、pmt 引数に返される AM_MEDIA_TYPE 構造体のメモリを割り当てる。呼び出し元は、フォーマット ブロックを含め、メモリを解放する必要がある。基底クラス ライブラリのヘルパー関数 DeleteMediaType を使える。呼び出し元は、pSCC 引数にメモリを割り当てる必要がある。
いくつかの圧縮フィルタでは、フィルタの入力ピンが接続されていない場合、このメソッドは失敗する。
フィルタ開発者への注意点 : このメソッドの実装の詳細については、「キャプチャ フォーマットと圧縮フォーマットの公開」を参照すること。
サンプル コード
以下のサンプル コードは、ビデオ出力ピン上でサポートされる最初のフォーマット (インデックス ゼロ) を取得する。その後、ピンがそのフォーマットに最小の出力サイズを使うように設定する。これを実行するために、フォーマット ブロックの BITMAPINFOHEADER 構造体を修正して新しい幅と高さを設定し、新しいサンプルサイズに AM_MEDIA_TYPE 構造体の lSampleSize メンバを設定する。サンプル サイズを決定する要因の 1 つは、メディア サブタイプによって決まるビット深度である。(簡略化のため、この例では、UYVY フォーマットの場合のみを示す。また、ピンがビデオ出力を生成していることを呼び出し元が既に認識しているものとする。)
int iCount, iSize;
VIDEO_STREAM_CONFIG_CAPS scc;
AM_MEDIA_TYPE *pmt;
hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize);
if (sizeof(scc) != iSize)
{
// これは予想していた構造体ではない。
return E_FAIL;
}
// 最初のフォーマットを取得する。
hr = pConfig->GetStreamCaps(0, &pmt, reinterpret_cast<BYTE*>(&scc));
if (hr == S_OK)
{
// VIDEOINFOHEADER と UYVY か。
if (pmt->formattype == FORMAT_VideoInfo &&
pmt->subtype == MEDIASUBTYPE_UYVY)
{
// 最小出力サイズを見つける。
LONG width = scc.MinOutputSize.cx;
LONG height = scc.MinOutputSize.cy;
LONG cbPixel = 2; // UYVY のピクセルあたりのバイト数。
// フォーマット ブロックを修正する。
VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat);
pVih->bmiHeader.biWidth = width;
pVih->bmiHeader.biHeight = height;
// サンプル サイズとイメージ サイズを設定する。
// イメージの幅を DWORD 境界に丸める。
pmt->lSampleSize = pVih->bmiHeader.biSizeImage =
((width + 3) & ~3) * height * cbPixel;
// ここで、フォーマットを設定する。
hr = pConfig->SetFormat(pmt);
if (FAILED(hr))
{
MessageBox(NULL, TEXT("SetFormat Failed\n"), NULL, MB_OK);
}
DeleteMediaType(pmt);
}
}
参照