Tipos de medios de vídeo sin comprimir

En este tema se describe cómo crear un tipo de medio que describa un formato de vídeo sin comprimir. Para obtener más información sobre los tipos de medios generalmente, vea Acerca de los tipos de medios.

Para crear un tipo de vídeo completo sin comprimir, establezca los siguientes atributos en el puntero de interfaz IMFMediaType .

Atributo Descripción
MF_MT_MAJOR_TYPE Tipo principal. Establézcalo en MFMediaType_Video.
MF_MT_SUBTYPE Subtipo. Consulte GUID de subtipo de vídeo.
MF_MT_DEFAULT_STRIDE Paso de superficie. El intervalo es el número de bytes necesarios para pasar de una fila de píxeles a la siguiente. Establezca este atributo si el intervalo en bytes no es el mismo que el ancho del vídeo en bytes. De lo contrario, puede omitir este atributo.
MF_MT_FRAME_RATE Velocidad de fotogramas.
MF_MT_FRAME_SIZE Tamaño del marco.
MF_MT_INTERLACE_MODE Modo de entrelazado.
MF_MT_ALL_SAMPLES_INDEPENDENT Especifica si cada ejemplo es independiente. Establézcalo en TRUE para formatos sin comprimir.
MF_MT_PIXEL_ASPECT_RATIO Relación de aspecto de píxeles.

 

Además, establezca los siguientes atributos si conoce los valores correctos. (De lo contrario, omita estos atributos).

Atributo Descripción
MF_MT_VIDEO_PRIMARIES Colores principales.
MF_MT_TRANSFER_FUNCTION Función transfer.
MF_MT_YUV_MATRIX Matriz de transferencia.
MF_MT_VIDEO_CHROMA_SITING Sición cromática.
MF_MT_VIDEO_NOMINAL_RANGE Rango nominal.

 

Para obtener más información, vea Información de color extendida. Por ejemplo, si crea un tipo de medio que describe un estándar de vídeo y el estándar define el siting cromático, agregue esta información al tipo de medio. Esto ayuda a conservar la fidelidad del color en toda la canalización.

Las siguientes funciones pueden ser útiles al crear un tipo de medio de vídeo.

Función Descripción
MFAverageTimePerFrameToFrameRate Calcula la velocidad de fotogramas, dada la duración media del fotograma.
MFCalculateImageSize Calcula el tamaño de la imagen para un formato de vídeo sin comprimir.
MFFrameRateToAverageTimePerFrame Calcula la duración media de un fotograma de vídeo, dada la velocidad de fotogramas.
MFGetStrideForBitmapInfoHeader Devuelve el intervalo de superficie mínimo para un formato de vídeo. Para obtener más información, consulte Image Stride.
MFInitVideoFormat Inicializa una estructura MFVIDEOFORMAT para algunos formatos de vídeo estándar, como la televisión NTSC. A continuación, puede usar la estructura para inicializar un tipo de medio.
MFIsFormatYUV Consulta si un formato de vídeo es un formato YUV.

 

Ejemplos

En este ejemplo se muestra una función que rellena la información más común para un formato de vídeo sin comprimir. La función devuelve un puntero de interfaz IMFMediaType . A continuación, puede agregar atributos adicionales al tipo de medio según sea necesario.

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

En el ejemplo siguiente se toma un formato de vídeo codificado como entrada y se crea un tipo de vídeo sin comprimir coincidente. Este tipo sería adecuado para establecer en un codificador o descodificador, por ejemplo.

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

Información de color extendida

Intervalo de imagen

Tipos de medios

Tipos de medios de vídeo

GUID de subtipo de vídeo