未壓縮的視訊媒體類型
本主題描述如何建立描述未壓縮視訊格式的媒體類型。 如需媒體類型的詳細資訊,請參閱 關於媒體類型。
若要建立完整的未壓縮視訊類型,請在 IMFMediaType 介面指標上設定下列屬性。
屬性 | Description |
---|---|
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.)
屬性 | Description |
---|---|
MF_MT_VIDEO_PRIMARIES | 色彩主要。 |
MF_MT_TRANSFER_FUNCTION | 傳送函式。 |
MF_MT_YUV_MATRIX | 傳輸矩陣。 |
MF_MT_VIDEO_CHROMA_SITING | Chroma siting。 |
MF_MT_VIDEO_NOMINAL_RANGE | 標準範圍。 |
如需詳細資訊,請參閱 擴充色彩資訊。 例如,如果您建立描述視訊標準的媒體類型,而標準會定義色度,請將此資訊新增至媒體類型。 這麼做有助於在整個管線中保留色彩逼真度。
建立視訊媒體類型時,下列函式可能很有用。
函式 | 描述 |
---|---|
MFAverageTimePerFrameToFrameRate | 根據平均畫面持續時間,計算畫面播放速率。 |
MFCalculateImageSize | 計算未壓縮視訊格式的影像大小。 |
MFFrameRateToAverageTimePerFrame | 根據畫面播放速率,計算視訊畫面的平均持續時間。 |
MFGetStrideForBitmapInfoHeader | 傳回視訊格式的最小表面步幅。 如需詳細資訊,請參閱 Image Stride。 |
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;
}
相關主題