Несжатые типы видеофайла
В этом разделе описывается создание типа мультимедиа, описывающего несжатый формат видео. Дополнительные сведения о типах мультимедиа в целом см. в разделе Сведения о типах мультимедиа.
Чтобы создать полный несжатый тип видео, задайте следующие атрибуты в указателе интерфейса 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;
}
Связанные темы