一般に、DirectShow とカーネル ストリーミングは、メディア形式の定義とストリーミング規則を共有します。 この統一性は、カーネル モード コンポーネントとユーザー モード コンポーネントで使用される命名規則の違いによってある程度隠されています。 カーネル モードで使用される多くのメディア形式と GUID 定義にはプレフィックス KS_ がありますが、それ以外の場合は、対応するユーザー モードと同じです。 たとえば、カーネル モード構造 の Win32 ユーザー モード バージョン (KS_BITMAPINFOHEADER) は BITMAPINFOHEADER です。
ビデオ キャプチャ ミニドライバーは、KSDATAFORMAT 構造体を使用して特定のストリーム形式を記述します。 ただし、ミニドライバーは、KSDATARANGE 構造体の配列を指定することで、可能性のあるストリーム形式の広い範囲を公開することもできます。 KSDATARANGE 構造体は、カラー形式、ビット深度、トリミングとスケーリングの可能性などの画像特性を記述します。
1 つの KSDATARANGE 構造体は、数千個の潜在的な KSDATAFORMAT 構造体を記述できます。 たとえば、KSDATARANGE 構造体では、最小サイズが 160 x 120 ピクセル、最大サイズが 720 x 480 ピクセルの RGB24 サンプルのビデオ ストリームを指定できます。x および y の次元の粒度ステップのサイズ値は 1 です。 これにより、アプリケーションは、一意の KSDATAFORMAT 構造体を介して、200,000 を超える可能な出力の画像サイズのいずれかを要求できます。
DirectShow では、KSDATAFORMAT に似た構造を使用してストリーム形式を定義します。 次に例を示します。
typedef struct _AMMediaType {
GUID majortype; // Same as KSDATAFORMAT.MajorFormat
GUID subtype; // Same as KSDATAFORMAT.SubFormat
BOOL bFixedSizeSamples;
BOOL bTemporalCompression;
ULONG lSampleSize; // Same as KSDATAFORMAT.SampleSize
GUID formattype; // Same as KSDATAFORMAT.Specifier
IUnknown __RPC_FAR *pUnk;
ULONG cbFormat;
BYTE *pbFormat;
} AM_MEDIA_TYPE;
命名規則の違いにもかかわらず、カーネル モードの KSDATARANGE/KSDATAFORMAT 構造体とユーザー モードの AM_MEDIA_TYPE 構造体の両方で使用される GUID は同じです。
注: KSDATAFORMAT 構造体の SubFormat メンバー (AM_MEDIA_TYPE ユーザー モード構造体のサブタイプ メンバーに類似) の下位 4 バイトは、KS_BITMAPINFOHEADER 構造体の biCompression メンバーで使用される FOURCC 値と一致する必要があります。 これらのバイトは、形式を記述する 16 進数の ASCII 文字を逆の順序で保持します。
たとえば、次の GUID は YVU9 FOURCC ビデオ形式に対応しています。
39555659-0000-0010-8000-00AA00389B71
59 = 'Y'
56 = 'V'
55 = 'U'
39 = '9'