未压缩的视频媒体类型
本主题介绍如何创建描述未压缩视频格式的媒体类型。 有关媒体类型一般的详细信息,请参阅 关于媒体类型。
若要创建完整的未压缩视频类型,请在 IMFMediaType 接口指针上设置以下属性。
属性 | 说明 |
---|---|
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 | 像素纵横比。 |
此外,如果知道正确的值,请设置以下属性。 (否则,请省略这些 attributes。)
属性 | 说明 |
---|---|
MF_MT_VIDEO_PRIMARIES | 颜色主色。 |
MF_MT_TRANSFER_FUNCTION | 传输函数。 |
MF_MT_YUV_MATRIX | 传输矩阵。 |
MF_MT_VIDEO_CHROMA_SITING | 色度定位。 |
MF_MT_VIDEO_NOMINAL_RANGE | 名义范围。 |
有关详细信息,请参阅 扩展的颜色信息。 例如,如果创建描述视频标准的媒体类型,并且标准定义色度定位,请将此信息添加到媒体类型。 这样做有助于在整个管道中保持颜色保真度。
创建视频媒体类型时,以下函数可能很有用。
函数 | 说明 |
---|---|
MFAverageTimePerFrameToFrameRate | 根据平均帧持续时间计算帧速率。 |
MFCalculateImageSize | 计算未压缩视频格式的图像大小。 |
MFFrameRateToAverageTimePerFrame | 计算给定帧速率的视频帧的平均持续时间。 |
MFGetStrideForBitmapInfoHeader | 返回视频格式的最小图面步幅。 有关详细信息,请参阅 Image Stride。 |
MFInitVideoFormat | 为某些标准视频格式(如 NTSC 电视)初始化 MFVIDEOFORMAT 结构。 然后,可以使用 结构初始化媒体类型。 |
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;
}
相关主题