次の方法で共有


データの処理

メディア データの解析

フィルタでメディア データを解析する場合は、コンテンツのヘッダーやその他の内容を記述するデータを信用しないこと。たとえば、AVI RIFF チャンクまたは MPEG パケットに現れるサイズ値は信用しないこと。この種のエラーで犯しやすい例を次に示す。

  • コンテンツから取得した N の値を使い、バッファの実際のサイズに対して N を確認せずに、N バイトのデータを読み取る。
  • バイト オフセットがバッファ内にあるかどうかを確認せずに、バッファ内のバイト オフセットにジャンプする。

もう 1 つの一般的なエラーは、コンテンツ内にあるフォーマット記述の内容を確認しないことである。次に例を示す。

  • BITMAPINFOHEADER 構造体の後にはカラー テーブルを続けることが可能である。BITMAPINFO 構造体は、BITMAPINFOHEADER 構造体とその後に続く RGBQUAD 値 (カラー テーブルを構成する) の配列として定義される。配列のサイズは biClrUsed の値で決まる。BITMAPINFO 構造体に割り当てられたバッファのサイズを必ず先に確認してから、BITMAPINFO にカラー テーブルをコピーすること。
  • WAVEFORMATEX 構造体には、追加フォーマット情報が付加されることがある。cbSize メンバは追加情報のサイズを指定する。

ピン接続の間、すべてのフォーマット構造体が正しく形成され、適切な値を含んでいることをフィルタは確認する必要がある。そうではない場合は、接続を拒絶すること。フォーマット構造体を検証するコードでは、特に計算上のオーバーフローに注意すること。たとえば、BITMAPINFOHEADER は、幅と高さは 32 ビットの long 値だが、イメージ サイズ (2 つの値の積の関数) は DWORD 値である。

ソースからのフォーマット データが割り当て済みバッファより大きい場合は、バッファにコピーするためにソース データを切り捨てないこと。データを切り捨てると、事実上のサイズが実際のサイズより大きい構造体が作成されることがある。たとえば、ビットマップ ヘッダーはもう存在しないパレット テーブルを指定していることがある。代わりに、バッファを割り当て直すこと。そうしないと、接続は失敗する。

ストリーミング中のエラー

グラフの実行中、フォーマットが正しくないコンテンツをフィルタが受信した場合は、ストリーミングを終了する必要がある。次のようにすること。

フォーマット変更

フィルタがストリームの途中でフォーマットを変更する機構がいくつか存在する。それぞれは複数の手順から構成されるため、間違って受け入れる可能性がある。フィルタが動的フォーマット変更の要求を受けた場合は、要求を拒否するか、新しいフォーマットが到着したときに受け入れる必要がある。同様に、他のフィルタが同意するまで、フォーマットは切り替えないこと。詳細については、「動的フォーマット変更」を参照すること。