Sdílet prostřednictvím


Nekomprimované typy médií videa

Toto téma popisuje, jak vytvořit typ média, který popisuje nekomprimovaný formát videa. Další informace o typech médií obecně naleznete v tématu O typech médií.

Chcete-li vytvořit úplný nekomprimovaný typ videa, nastavte následující atributy na MMFMediaType ukazatel rozhraní.

Atribut Popis
MF_MT_MAJOR_TYPE Hlavní typ. Nastavit na MFMediaType_Video.
MF_MT_SUBTYPE Podtyp. Viz identifikátory GUID podtypu videa.
MF_MT_DEFAULT_STRIDE Povrchová stridka. krokování je počet bajtů potřebných k přechodu z jednoho řádku pixelů na další. Nastavte tento atribut, pokud krok v bajtech není stejný jako šířka videa v bajtech. Jinak můžete tento atribut vynechat.
MF_MT_FRAME_RATE Kmitočet.
MF_MT_FRAME_SIZE Velikost rámce
MF_MT_INTERLACE_MODE Režim prokládání.
MF_MT_ALL_SAMPLES_INDEPENDENT Určuje, jestli je každý vzorek nezávislý. Nastavte na TRUE pro nekomprimované formáty.
MF_MT_PIXEL_ASPECT_RATIO Poměr stran pixelu

 

Kromě toho nastavte následující atributy, pokud znáte správné hodnoty. (Jinak tyto atributy vynecháte.)

Atribut Popis
MF_MT_VIDEO_PRIMARIES Barevné primarie.
MF_MT_TRANSFER_FUNCTION Přenosová funkce.
MF_MT_YUV_MATRIX Matice přenosu.
MF_MT_VIDEO_CHROMA_SITING Chroma siting.
MF_MT_VIDEO_NOMINAL_RANGE Jmenovitý rozsah.

 

Další informace naleznete v tématu rozšířené informace o barvách. Pokud například vytvoříte typ média, který popisuje standard videa a standard definuje nastavení chroma, přidejte tyto informace do typu média. To pomáhá zachovat věrnost barev v celém kanálu.

Při vytváření typu média videa můžou být užitečné následující funkce.

Funkce Popis
MFAverageTimePerFrameToFrameRate Vypočítá frekvenci snímků vzhledem k průměrné době trvání rámce.
MFCalculateImageSize Vypočítá velikost obrázku pro nekomprimovaný formát videa.
MFFrameRateToAverageTimePerFrame Vypočítá průměrnou dobu trvání snímku videa vzhledem k frekvenci snímků.
MFGetStrideForBitmapInfoHeader Vrátí minimální povrchovou krok pro formát videa. Další informace naleznete v tématu Image Stride.
MFInitVideoFormat Inicializuje MFVIDEOFORMAT strukturu pro některé standardní formáty videa, jako je televize NTSC. Strukturu pak můžete použít k inicializaci typu média.
MFIsFormatYUV Dotazuje se, jestli je formát videa formát YUV.

 

Příklady

Tento příklad ukazuje funkci, která vyplní nejběžnější informace pro nekomprimovaný formát videa. Funkce vrátí ukazatel rozhraní MMFMediaType. Podle potřeby pak můžete k typu média přidat další atributy.

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;
}

V dalším příkladu se jako vstup vezme zakódovaný formát videa a vytvoří odpovídající nekomprimovaný typ videa. Tento typ by byl vhodný například pro nastavení kodéru nebo dekodéru.

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;
}

rozšířené informace o barvách

obrázek stride

typy médií

typy médií videa

identifikátory GUID podtypu videa