未壓縮的視訊媒體類型

本主題描述如何建立描述未壓縮視訊格式的媒體類型。 如需媒體類型的詳細資訊,請參閱 關於媒體類型

若要建立完整的未壓縮視訊類型,請在 IMFMediaType 介面指標上設定下列屬性。

屬性 Description
MF_MT_MAJOR_TYPE 主要類型。 設定為 MFMediaType_Video
MF_MT_SUBTYPE 亞。 請參閱 影片子類型 GUID
MF_MT_DEFAULT_STRIDE 表面步進。 步進是從一個圖元資料列到下一個圖元資料列所需的位元組數目。 如果以位元組為單位的步進與視訊寬度不同,請設定這個屬性。 否則,您可以省略這個屬性。
MF_MT_FRAME_RATE 畫面播放速率。
MF_MT_FRAME_SIZE 框架大小。
MF_MT_INTERLACE_MODE 交錯模式。
MF_MT_ALL_SAMPLES_INDEPENDENT 指定每個樣本是否獨立。 針對未壓縮的格式,設定為 TRUE
MF_MT_PIXEL_ASPECT_RATIO 圖元外觀比例。

 

此外,如果您知道正確的值,請設定下列屬性。 (否則,請省略這些 attributes.)

屬性 Description
MF_MT_VIDEO_PRIMARIES 色彩主要。
MF_MT_TRANSFER_FUNCTION 傳送函式。
MF_MT_YUV_MATRIX 傳輸矩陣。
MF_MT_VIDEO_CHROMA_SITING Chroma siting。
MF_MT_VIDEO_NOMINAL_RANGE 標準範圍。

 

如需詳細資訊,請參閱 擴充色彩資訊。 例如,如果您建立描述視訊標準的媒體類型,而標準會定義色度,請將此資訊新增至媒體類型。 這麼做有助於在整個管線中保留色彩逼真度。

建立視訊媒體類型時,下列函式可能很有用。

函式 描述
MFAverageTimePerFrameToFrameRate 根據平均畫面持續時間,計算畫面播放速率。
MFCalculateImageSize 計算未壓縮視訊格式的影像大小。
MFFrameRateToAverageTimePerFrame 根據畫面播放速率,計算視訊畫面的平均持續時間。
MFGetStrideForBitmapInfoHeader 傳回視訊格式的最小表面步幅。 如需詳細資訊,請參閱 Image Stride
MFInitVideoFormat 初始化某些標準視訊格式 的 MFVIDEOFORMAT 結構,例如 NTSC 電視。 然後,您可以使用 結構來初始化媒體類型。
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;
}

延伸色彩資訊

Image Stride

媒體類型

視訊媒體類型

影片子類型 GUID