Поделиться через


Несжатые типы видеофайла

В этом разделе описывается создание типа мультимедиа, описывающего несжатый формат видео. Дополнительные сведения о типах мультимедиа в целом см. в разделе Сведения о типах мультимедиа.

Чтобы создать полный несжатый тип видео, задайте следующие атрибуты в указателе интерфейса IMFMediaType .

attribute Описание
MF_MT_MAJOR_TYPE Основной тип. Задайте значение MFMediaType_Video.
MF_MT_SUBTYPE Подтип. См. раздел Идентификаторы GUID подтипа видео.
MF_MT_DEFAULT_STRIDE Шаг поверхности. Шаг — это количество байтов, необходимое для перехода от одной строки пикселей к следующей. Установите этот атрибут, если шаг в байтах отличается от ширины видео в байтах. В противном случае этот атрибут можно опустить.
MF_MT_FRAME_RATE Частота кадров.
MF_MT_FRAME_SIZE Размер кадра.
MF_MT_INTERLACE_MODE Режим чередовки.
MF_MT_ALL_SAMPLES_INDEPENDENT Указывает, является ли каждый пример независимым. Задайте значение TRUE для несжатых форматов.
MF_MT_PIXEL_ASPECT_RATIO Пропорции пикселей.

 

Кроме того, задайте следующие атрибуты, если вы знаете правильные значения. (В противном случае опустите эти атрибуты.)

attribute Описание
MF_MT_VIDEO_PRIMARIES Цвет первичных элементов.
MF_MT_TRANSFER_FUNCTION Функция передачи.
MF_MT_YUV_MATRIX Матрица передачи.
MF_MT_VIDEO_CHROMA_SITING Хрома сидит.
MF_MT_VIDEO_NOMINAL_RANGE Номинальный диапазон.

 

Дополнительные сведения см. в разделе Расширенные сведения о цвете. Например, если вы создаете тип мультимедиа, описывающий стандарт видео, а стандарт определяет chroma siting, добавьте эти сведения в тип носителя. Это помогает сохранить точность цвета на протяжении всего конвейера.

При создании типа видеофайла могут быть полезны следующие функции.

Функция Описание
MFAverageTimePerFrameToFrameRate Вычисляет частоту кадров с учетом средней длительности кадра.
MFCalculateImageSize Вычисляет размер изображения для несжатого видеоформата.
MFFrameRateToAverageTimePerFrame Вычисляет среднюю продолжительность видеокадра с учетом частоты кадров.
MFGetStrideForBitmapInfoHeader Возвращает минимальный шаг поверхности для видеоформата. Дополнительные сведения см. в разделе Шаг изображения.
MFInitVideoFormat Инициализирует структуру MFVIDEOFORMAT для некоторых стандартных форматов видео, таких как телевидение NTSC. Затем можно использовать структуру для инициализации типа мультимедиа.
MFIsFormatYUV Запрашивает, является ли формат видео форматом YUV.

 

Примеры

В этом примере показана функция, которая заполняет наиболее распространенные сведения для несжатого видеоформата. Функция возвращает указатель интерфейса IMFMediaType . Затем можно добавить дополнительные атрибуты к типу носителя при необходимости.

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

В следующем примере в качестве входных данных используется закодированный формат видео и создается соответствующий тип несжатого видео. Этот тип можно задать, например, для кодировщика или декодера.

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

Расширенные сведения о цвете

Шаг изображения

Типы носителей

Типы видеофайла

Идентификаторы GUID для подтипов видео