AM_MEDIA_TYPE 構造体

AM_MEDIA_TYPE 構造体は、メディア サンプルのフォーマットを記述する。

構文

typedef struct  _MediaType {
    GUID      majortype;
    GUID      subtype;
    BOOL      bFixedSizeSamples;
    BOOL      bTemporalCompression;
    ULONG     lSampleSize;
    GUID      formattype;
    IUnknown  *pUnk;
    ULONG     cbFormat;
    [size_is(cbFormat)] BYTE *pbFormat;
} AM_MEDIA_TYPE;

メンバ

majortype

メディア サンプルの メジャー タイプを指定するグローバル一意識別子 (GUID)。指定できるメジャー タイプの一覧については、「メディア タイプ」を参照すること。

subtype

メディア サンプルのサブタイプを指定する GUID。指定できるサブタイプの一覧については、「メディア タイプ」を参照すること。一部のフォーマットについては、この値が MEDIASUBTYPE_None の場合がある。これは、フォーマットにはサブタイプが必要ないことを意味している。

bFixedSizeSamples

TRUE の場合、サンプルのサイズは固定である。このフィールドは参照専用である。オーディオの場合は、通常、TRUE に設定される。ビデオの場合、通常、非圧縮ビデオは TRUE、圧縮ビデオは FALSE に設定される。

bTemporalCompression

TRUE の場合、サンプルは時系列 (フレーム間) 圧縮方式で圧縮されている。値 TRUE はフレームがすべてキー フレームとは限らないことを示す。このフィールドは参照専用である。

lSampleSize

サンプルのサイズ (バイト単位)。圧縮データの場合は、0 も可能。

formattype

フォーマット ブロックに使う構造体を指定する GUID。pbFormat メンバは、対応するフォーマット構造体を指す。フォーマット タイプには次のものがある。

フォーマット タイプ (format type) フォーマット構造体
FORMAT_None なし
FORMAT_DvInfo DVINFO
FORMAT_MPEGVideo MPEG1VIDEOINFO
FORMAT_MPEG2Video MPEG2VIDEOINFO
FORMAT_VideoInfo VIDEOINFOHEADER
FORMAT_VideoInfo2 VIDEOINFOHEADER2
FORMAT_WaveFormatEx WAVEFORMATEX
GUID_NULL なし

pUnk

未使用。

cbFormat

フォーマット ブロックのサイズ (バイト単位)。

pbFormat

フォーマット ブロックへのポインタ。構造体の種類は、formattype メンバによって指定される。formattype が GUID_NULL または FORMAT_None でない限り、フォーマット構造体が存在しなければならない。

注意

2 つのピンが接続する場合、AM_MEDIA_TYPE 構造体が定義するメディア タイプをネゴシエートする。メディア タイプはフィルタが交換するデータのフォーマットを記述する。フィルタがメディア タイプを受け入れないと、接続はできない。

ストリーム タイプは "メジャー タイプ" と "サブタイプ" と呼ばれる 2 つの GUID によって指定される。メジャー タイプはビデオ、オーディオ、またはバイト ストリームのような一般的なカテゴリを定義する。サブタイプはメジャー タイプ内部のより細かいカテゴリを定義する。たとえば、ビデオ サブタイプには 8 ビット RGB、16 ビット RGB、24 ビット RGB、32 ビット RGBが含まれる。

AM_MEDIA_TYPE 構造体の後には可変長のデータ ブロックが続き、このデータ ブロックにフォーマット固有の情報を格納する。pbFormat メンバは、"フォーマット ブロック" と呼ばれるこのブロックへのポインタである。フォーマット ブロックのレイアウトはストリーム内のデータ型に依存し、formattype メンバによって指定される。フォーマット ブロックは NULL 値も可能。cbFormat メンバをチェックしてサイズを調べること。フォーマット ブロックにアクセスするには、pbFormat メンバをキャストする。次に例を示す。

if (pmt->formattype == FORMAT_VideoInfo)
{
    // バッファ サイズを調べる。
    if (pmt->cbFormat >= sizeof(VIDEOINFOHEADER))
    {
        VIDEOINFOHEADER *pVih = 
            reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat);
        /* pVih から VIDEOINFOHEADER メンバーにアクセスする。 */
    }
}

場合によっては、フォーマット ブロックを NULL に設定し、フォーマット タイプを GUID_NULL に設定できる。その場合は "パーシャル" メディア タイプとなる。この方法を使うと、一定の範囲の可能なフォーマットを指定できる。たとえば、ビデオフレームの厳密な幅や高さを指定しなくても、24ビット RGB (MEDIASUBTYPE_RGB24) を指定できる。

デバッグを行うために指定するメディア タイプに関する情報を取得するには、DisplayType メソッドを使う。

参照