Nicht komprimierte Videomedientypen

In diesem Thema wird beschrieben, wie Sie einen Medientyp erstellen, der ein nicht komprimiertes Videoformat beschreibt. Weitere Informationen zu Medientypen im Allgemeinen finden Sie unter Informationen zu Medientypen.

Um einen vollständigen unkomprimierten Videotyp zu erstellen, legen Sie die folgenden Attribute auf dem IMFMediaType-Schnittstellenzeiger fest.

attribute BESCHREIBUNG
MF_MT_MAJOR_TYPE Haupttyp. Legen Sie auf MFMediaType_Video fest.
MF_MT_SUBTYPE Untertyp. Weitere Informationen finden Sie unter GuiDs des Videountertyps.
MF_MT_DEFAULT_STRIDE Surface-Schritt. Der Schritt ist die Anzahl der Bytes, die benötigt werden, um von einer Pixelzeile zur nächsten zu wechseln. Legen Sie dieses Attribut fest, wenn die Stride in Bytes nicht mit der Videobreite in Bytes identisch ist. Andernfalls können Sie dieses Attribut weglassen.
MF_MT_FRAME_RATE Bildrate.
MF_MT_FRAME_SIZE Framegröße.
MF_MT_INTERLACE_MODE Interlacing-Modus.
MF_MT_ALL_SAMPLES_INDEPENDENT Gibt an, ob jedes Beispiel unabhängig ist. Legen Sie für nicht komprimierte Formate auf TRUE fest.
MF_MT_PIXEL_ASPECT_RATIO Pixelseitenverhältnis.

 

Legen Sie außerdem die folgenden Attribute fest, wenn Sie die richtigen Werte kennen. (Andernfalls lassen Sie diese Attribute weg.)

attribute BESCHREIBUNG
MF_MT_VIDEO_PRIMARIES Farbprimries.
MF_MT_TRANSFER_FUNCTION Übertragungsfunktion.
MF_MT_YUV_MATRIX Transfermatrix.
MF_MT_VIDEO_CHROMA_SITING Chroma-Sitz.
MF_MT_VIDEO_NOMINAL_RANGE Nominalbereich.

 

Weitere Informationen finden Sie unter Erweiterte Farbinformationen. Wenn Sie beispielsweise einen Medientyp erstellen, der einen Videostandard beschreibt, und der Standard die Chroma-Siting definiert, fügen Sie diese Informationen dem Medientyp hinzu. Dies trägt dazu bei, die Farbtreue in der gesamten Pipeline zu erhalten.

Die folgenden Funktionen können beim Erstellen eines Videomedientyps nützlich sein.

Funktion BESCHREIBUNG
MFAverageTimePerFrameToFrameRate Berechnet die Bildrate unter Berücksichtigung der durchschnittlichen Framedauer.
MFCalculateImageSize Berechnet die Bildgröße für ein nicht komprimiertes Videoformat.
MFFrameRateToAverageTimePerFrame Berechnet die durchschnittliche Dauer eines Videoframes unter Berücksichtigung der Bildfrequenz.
MFGetStrideForBitmapInfoHeader Gibt die mindeste Oberflächenschritte für ein Videoformat zurück. Weitere Informationen finden Sie unter Image Stride.
MFInitVideoFormat Initialisiert eine MFVIDEOFORMAT-Struktur für einige Standardvideoformate, z. B. NTSC-Fernsehen. Anschließend können Sie die -Struktur verwenden, um einen Medientyp zu initialisieren.
MFIsFormatYUV Fragt ab, ob ein Videoformat ein YUV-Format ist.

 

Beispiele

Dieses Beispiel zeigt eine Funktion, die die gängigsten Informationen für ein nicht komprimiertes Videoformat ausfüllt. Die Funktion gibt einen IMFMediaType-Schnittstellenzeiger zurück. Anschließend können Sie dem Medientyp nach Bedarf zusätzliche Attribute hinzufügen.

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

Im nächsten Beispiel wird ein codiertes Videoformat als Eingabe verwendet und ein übereinstimmend nicht komprimierter Videotyp erstellt. Dieser Typ eignet sich beispielsweise für die Einstellung für einen Encoder oder Decoder.

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

Erweiterte Farbinformationen

Bildstride

Medientypen

Videomedientypen

Video: Untertyp-GUIDs