Dela via


Okomprimerade videomedietyper

I det här avsnittet beskrivs hur du skapar en medietyp som beskriver ett okomprimerat videoformat. Mer information om medietyper finns i Om medietyper.

Om du vill skapa en fullständig okomprimerad videotyp anger du följande attribut på IMFMediaType- gränssnittspekare.

Attribut Beskrivning
MF_MT_MAJOR_TYPE Huvudtyp. Ange till MFMediaType_Video.
MF_MT_SUBTYPE Subtyp. Se videoundertyps-GUID:er.
MF_MT_DEFAULT_STRIDE Ytsteg. Det steget är antalet byte som behövs för att gå från en rad med bildpunkter till nästa. Ange det här attributet om steget i byte inte är samma som videobredden i byte. Annars kan du utelämna det här attributet.
MF_MT_FRAME_RATE Bildfrekvens.
MF_MT_FRAME_SIZE Ramstorlek.
MF_MT_INTERLACE_MODE Sammanflätningsläge.
MF_MT_ALL_SAMPLES_INDEPENDENT Anger om varje exempel är oberoende. Ange till TRUE- för okomprimerade format.
MF_MT_PIXEL_ASPECT_RATIO Bildpunktsproportion.

 

Ange dessutom följande attribut om du känner till rätt värden. (Annars utelämnar du dessa attribut.)

Attribut Beskrivning
MF_MT_VIDEO_PRIMARIES Färg primärval.
MF_MT_TRANSFER_FUNCTION Överföringsfunktion.
MF_MT_YUV_MATRIX Överföringsmatris.
MF_MT_VIDEO_CHROMA_SITING Chroma sitter.
MF_MT_VIDEO_NOMINAL_RANGE Nominellt intervall.

 

Mer information finns i utökad färginformation. Om du till exempel skapar en medietyp som beskriver en videostandard och standarden definierar kroma-siting lägger du till den här informationen i medietypen. Detta hjälper till att bevara färgåtergivningen i hela pipelinen.

Följande funktioner kan vara användbara när du skapar en videomedietyp.

Funktion Beskrivning
MFAverageTimePerFrameToFrameRate Beräknar bildrutefrekvensen med tanke på den genomsnittliga bildrutevaraktigheten.
MFCalculateImageSize Beräknar bildstorleken för ett okomprimerat videoformat.
MFFrameRateToAverageTimePerFrame Beräknar den genomsnittliga varaktigheten för en videobildruta med tanke på bildfrekvensen.
MFGetStrideForBitmapInfoHeader Returnerar minsta ytsteg för ett videoformat. Mer information finns i Image Stride.
MFInitVideoFormat Initierar en MFVIDEOFORMAT struktur för vissa standardvideoformat, till exempel NTSC-tv. Du kan sedan använda strukturen för att initiera en medietyp.
MFIsFormatYUV Frågar om ett videoformat är ett YUV-format.

 

Exempel

Det här exemplet visar en funktion som fyller i den vanligaste informationen för ett okomprimerat videoformat. Funktionen returnerar en IMFMediaType- gränssnittspekare. Du kan sedan lägga till ytterligare attribut till medietypen efter behov.

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

Nästa exempel tar ett kodat videoformat som indata och skapar en matchande okomprimerad videotyp. Den här typen skulle vara lämplig att ställa in på en kodare eller avkodare, till exempel.

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

utökad färginformation

Image Stride

medietyper

videoundertyps-GUID:er