データの処理
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
メディア データの解析
フィルターがメディア データを解析する場合は、コンテンツ内のヘッダーやその他の自己記述型データを信頼しないでください。 たとえば、AVI RIFF チャンクまたは MPEG パケットに表示されるサイズ値は信頼しないでください。 この種のエラーの一般的な例を次に示します。
- N バイトのデータを読み取ります。N の値はコンテンツから取得されます。N はバッファーの実際のサイズをチェックしません。
- オフセットがバッファー内にあることを確認せずに、バッファー内のバイト オフセットにジャンプする。
エラーのもう 1 つの一般的なクラスには、コンテンツに含まれる形式の説明を検証しないことが含まれます。 次に例を示します。
- BITMAPINFOHEADER 構造体の後にカラー テーブルを指定できます。 BITMAPINFO 構造体は、BITMAPINFOHEADER 構造体の後に、カラー テーブルを構成する RGBQUAD 値の配列として定義されます。 配列のサイズは、 biClrUsed の値によって決まります。 BITMAPINFO 構造体に割り当てられたバッファーのサイズを最初に確認せずに、カラー テーブルを BITMAPINFO にコピーしないでください。
- WAVEFORMATEX 構造体には、構造体に追加の書式情報が追加されている場合があります。 cbSize メンバーは、追加情報のサイズを指定します。
ピン接続中に、フィルターは、すべての書式構造が整形式であり、適切な値が含まれていることを確認する必要があります。 そうでない場合は、接続を拒否します。 書式構造を検証するコードでは、算術オーバーフローに特に注意してください。 たとえば、 BITMAPINFOHEADER では、幅と高さは 32 ビット の長さの 値ですが、イメージ サイズ (2 つの製品の関数) は DWORD 値のみです。
ソースからのフォーマット データが割り当てられたバッファーよりも大きい場合は、ソース データをバッファーにコピーするために切り捨てないでください。 これにより、暗黙的なサイズが実際のサイズよりも大きい構造体を作成できます。 たとえば、ビットマップ ヘッダーでは、存在しなくなったパレット テーブルを指定できます。 代わりに、バッファーを再割り当てするか、単に接続に失敗します。
ストリーミング中のエラー
グラフの実行中に、フィルターが正しくない形式のコンテンツを受け取った場合は、ストリーミングを終了する必要があります。 次の操作を行います。
- Receive からエラー コードを返 します。
- ダウンストリーム フィルターで IPin::EndOfStream を呼び出します。
- CBaseFilter::NotifyEvent を呼び出して、EC_ERRORABORT イベントをポストします。
変更の書式設定
ストリームの途中で形式を変更するフィルターには、いくつかのメカニズムが存在します。 それぞれに複数の手順が含まれており、誤った受け入れの可能性が生まれます。 フィルターが動的な形式変更の要求を取得する場合は、要求を拒否するか、新しい形式が到着したときに優先する必要があります。 同様に、他のフィルターが一致しない限り、形式を切り替えてはいけません。 詳細については、「 動的書式の変更」を参照してください。