Share via


圧縮されていないビデオ メディアの種類

このトピックでは、圧縮されていないビデオ形式を記述するメディアの種類を作成する方法について説明します。 一般的なメディアの種類の詳細については、「 メディアの種類について」を参照してください。

完全な圧縮されていないビデオの種類を作成するには、 IMFMediaType インターフェイス ポインターに次の属性を設定します。

属性 説明
MF_MT_MAJOR_TYPE メジャーの種類。 MFMediaType_Videoに設定します。
MF_MT_SUBTYPE サブタイプ。 「ビデオ サブタイプ GUID」を参照してください。
MF_MT_DEFAULT_STRIDE サーフェスストライド。 ストライドは、1 行のピクセルから次の行に移動するために必要なバイト数です。 ストライド (バイト単位) がビデオの幅 (バイト単位) と同じでない場合は、この属性を設定します。 それ以外の場合は、この属性を省略できます。
MF_MT_FRAME_RATE フレーム レート。
MF_MT_FRAME_SIZE フレーム サイズ。
MF_MT_INTERLACE_MODE インターレース モード。
MF_MT_ALL_SAMPLES_INDEPENDENT 各サンプルが独立しているかどうかを指定します。 圧縮されていない形式の場合は TRUE に 設定します。
MF_MT_PIXEL_ASPECT_RATIO ピクセルの縦横比。

 

また、正しい値がわかっている場合は、次の属性を設定します。 (それ以外の場合は、これらの属性を省略します)。

属性 説明
MF_MT_VIDEO_PRIMARIES 色の原色。
MF_MT_TRANSFER_FUNCTION 転送関数。
MF_MT_YUV_MATRIX 転送マトリックス。
MF_MT_VIDEO_CHROMA_SITING 座っている彩度。
MF_MT_VIDEO_NOMINAL_RANGE 標準範囲。

 

詳細については、「 拡張色情報」を参照してください。 たとえば、ビデオ標準を記述するメディアタイプを作成し、標準で彩度を定義する場合は、この情報をメディアタイプに追加します。 そうすることで、パイプライン全体で色の忠実性を維持するのに役立ちます。

ビデオ メディアの種類を作成する場合は、次の関数が役立つ場合があります。

機能 説明
MFAverageTimePerFrameToFrameRate フレームの平均期間を指定して、フレーム レートを計算します。
MFCalculateImageSize 圧縮されていないビデオ形式の画像サイズを計算します。
MFFrameRateToAverageTimePerFrame フレーム レートを指定して、ビデオ フレームの平均継続時間を計算します。
MFGetStrideForBitmapInfoHeader ビデオ形式の最小サーフェス ストライドを返します。 詳細については、「 イメージストライド」を参照してください。
MFInitVideoFormat NTSC テレビなどの一部の標準ビデオ形式の MFVIDEOFORMAT 構造体を初期化します。 その後、 構造体を使用してメディアの種類を初期化できます。
MFIsFormatYUV ビデオ形式が YUV 形式であるかどうかを照会します。

 

この例では、圧縮されていないビデオ形式の最も一般的な情報を入力する関数を示します。 関数は IMFMediaType インターフェイス ポインターを返します。 その後、必要に応じてメディアの種類に属性を追加できます。

HRESULT CreateUncompressedVideoType(
    DWORD                fccFormat,  // FOURCC or D3DFORMAT value.     
    UINT32               width, 
    UINT32               height,
    MFVideoInterlaceMode interlaceMode,
    const MFRatio&       frameRate,
    const MFRatio&       par,
    IMFMediaType         **ppType
    )
{
    if (ppType == NULL)
    {
        return E_POINTER;
    }

    GUID    subtype = MFVideoFormat_Base;
    LONG    lStride = 0;
    UINT    cbImage = 0;

    IMFMediaType *pType = NULL;

    // Set the subtype GUID from the FOURCC or D3DFORMAT value.
    subtype.Data1 = fccFormat;

    HRESULT hr = MFCreateMediaType(&pType);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetGUID(MF_MT_SUBTYPE, subtype);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_INTERLACE_MODE, interlaceMode);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = MFSetAttributeSize(pType, MF_MT_FRAME_SIZE, width, height);
    if (FAILED(hr))
    {
        goto done;
    }

    // Calculate the default stride value.
    hr = pType->SetUINT32(MF_MT_DEFAULT_STRIDE, UINT32(lStride));
    if (FAILED(hr))
    {
        goto done;
    }

    // Calculate the image size in bytes.
    hr = MFCalculateImageSize(subtype, width, height, &cbImage);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_SAMPLE_SIZE, cbImage);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_FIXED_SIZE_SAMPLES, TRUE);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
    if (FAILED(hr))
    {
        goto done;
    }

    // Frame rate
    hr = MFSetAttributeRatio(pType, MF_MT_FRAME_RATE, frameRate.Numerator, 
        frameRate.Denominator);
    if (FAILED(hr))
    {
        goto done;
    }

    // Pixel aspect ratio
    hr = MFSetAttributeRatio(pType, MF_MT_PIXEL_ASPECT_RATIO, par.Numerator, 
        par.Denominator);
    if (FAILED(hr))
    {
        goto done;
    }

    // Return the pointer to the caller.
    *ppType = pType;
    (*ppType)->AddRef();

done:
    SafeRelease(&pType);
    return hr;
}

次の例では、エンコードされたビデオ形式を入力として受け取り、一致する圧縮されていないビデオの種類を作成します。 この型は、たとえば、エンコーダーまたはデコーダーで設定するのに適しています。

HRESULT ConvertVideoTypeToUncompressedType(
    IMFMediaType *pType,    // Pointer to an encoded video type.
    const GUID& subtype,    // Uncompressed subtype (eg, RGB-32, AYUV)
    IMFMediaType **ppType   // Receives a matching uncompressed video type.
    )
{
    IMFMediaType *pTypeUncomp = NULL;

    HRESULT hr = S_OK;
    GUID majortype = { 0 };
    MFRatio par = { 0 };

    hr = pType->GetMajorType(&majortype);

    if (majortype != MFMediaType_Video)
    {
        return MF_E_INVALIDMEDIATYPE;
    }

    // Create a new media type and copy over all of the items.
    // This ensures that extended color information is retained.

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMediaType(&pTypeUncomp);
    }

    if (SUCCEEDED(hr))
    {
        hr = pType->CopyAllItems(pTypeUncomp);
    }

    // Set the subtype.
    if (SUCCEEDED(hr))
    {
        hr = pTypeUncomp->SetGUID(MF_MT_SUBTYPE, subtype);
    }

    // Uncompressed means all samples are independent.
    if (SUCCEEDED(hr))
    {
        hr = pTypeUncomp->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
    }

    // Fix up PAR if not set on the original type.
    if (SUCCEEDED(hr))
    {
        hr = MFGetAttributeRatio(
            pTypeUncomp, 
            MF_MT_PIXEL_ASPECT_RATIO, 
            (UINT32*)&par.Numerator, 
            (UINT32*)&par.Denominator
            );

        // Default to square pixels.
        if (FAILED(hr))
        {
            hr = MFSetAttributeRatio(
                pTypeUncomp, 
                MF_MT_PIXEL_ASPECT_RATIO, 
                1, 1
                );
        }
    }

    if (SUCCEEDED(hr))
    {
        *ppType = pTypeUncomp;
        (*ppType)->AddRef();
    }

    SafeRelease(&pTypeUncomp);
    return hr;
}

拡張色情報

イメージストライド

メディアの種類

ビデオ メディアの種類

ビデオ サブタイプの GUID