Tipi di supporti video non compressi

In questo argomento viene descritto come creare un tipo di supporto che descrive un formato video non compresso. Per altre informazioni sui tipi di supporti in genere, vedere Informazioni sui tipi di supporti.

Per creare un tipo di video non compresso completo, impostare gli attributi seguenti sul puntatore all'interfaccia IMFMediaType .

Attributo Descrizione
MF_MT_MAJOR_TYPE Tipo principale. Impostare su MFMediaType_Video.
MF_MT_SUBTYPE Sottotipo. Vedere GUID sottotipo video.
MF_MT_DEFAULT_STRIDE Stride superficiale. Lo stride è il numero di byte necessari per passare da una riga di pixel alla successiva. Impostare questo attributo se lo stride in byte non corrisponde alla larghezza del video in byte. In caso contrario, è possibile omettere questo attributo.
MF_MT_FRAME_RATE Frequenza dei fotogrammi.
MF_MT_FRAME_SIZE Dimensioni cornice.
MF_MT_INTERLACE_MODE Modalità interlacciatura.
MF_MT_ALL_SAMPLES_INDEPENDENT Specifica se ogni esempio è indipendente. Impostare su TRUE per i formati non compressi.
MF_MT_PIXEL_ASPECT_RATIO Proporzioni pixel.

 

Inoltre, impostare gli attributi seguenti se si conoscono i valori corretti. In caso contrario, omettere questi attributi.

Attributo Descrizione
MF_MT_VIDEO_PRIMARIES Primarie a colori.
MF_MT_TRANSFER_FUNCTION Funzione di trasferimento.
MF_MT_YUV_MATRIX Matrice di trasferimento.
MF_MT_VIDEO_CHROMA_SITING Cromatico.
MF_MT_VIDEO_NOMINAL_RANGE Intervallo nominale.

 

Per altre informazioni, vedere Extended Color Information.For more information, see Extended Color Information. Ad esempio, se si crea un tipo di supporto che descrive uno standard video e lo standard definisce il siting cromatico, aggiungere queste informazioni al tipo di supporto. In questo modo è possibile mantenere la fedeltà dei colori in tutta la pipeline.

Le funzioni seguenti possono essere utili durante la creazione di un tipo di supporto video.

Funzione Descrizione
MFAverageTimePerFrameToFrameRate Calcola la frequenza dei fotogrammi, in base alla durata media del fotogramma.
MFCalculateImageSize Calcola le dimensioni dell'immagine per un formato video non compresso.
MFFrameRateToAverageTimePerFrame Calcola la durata media di un fotogramma video, in base alla frequenza dei fotogrammi.
MFGetStrideForBitmapInfoHeader Restituisce lo stride minimo della superficie per un formato video. Per altre informazioni, vedere Image Stride.
MFInitVideoFormat Inizializza una struttura MFVIDEOFORMAT per alcuni formati video standard, ad esempio la televisione NTSC. È quindi possibile usare la struttura per inizializzare un tipo di supporto.
MFIsFormatYUV Esegue una query se un formato video è un formato YUV.

 

Esempio

Questo esempio mostra una funzione che inserisce le informazioni più comuni per un formato video non compresso. La funzione restituisce un puntatore all'interfaccia IMFMediaType . È quindi possibile aggiungere altri attributi al tipo di supporto in base alle esigenze.

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

L'esempio seguente accetta un formato video codificato come input e crea un tipo di video non compresso corrispondente. Questo tipo può essere impostato su un codificatore o un decodificatore, ad esempio.

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

Informazioni sul colore estese

Immagine stride

Tipi di supporti

Tipi di supporti video

GUID sottotipo video