Nekomprimované typy médií videa
Toto téma popisuje, jak vytvořit typ média, který popisuje nekomprimovaný formát videa. Další informace o typech médií obecně naleznete v tématu O typech médií.
Chcete-li vytvořit úplný nekomprimovaný typ videa, nastavte následující atributy na MMFMediaType ukazatel rozhraní.
Atribut | Popis |
---|---|
MF_MT_MAJOR_TYPE | Hlavní typ. Nastavit na MFMediaType_Video. |
MF_MT_SUBTYPE | Podtyp. Viz identifikátory GUID podtypu videa. |
MF_MT_DEFAULT_STRIDE | Povrchová stridka. krokování je počet bajtů potřebných k přechodu z jednoho řádku pixelů na další. Nastavte tento atribut, pokud krok v bajtech není stejný jako šířka videa v bajtech. Jinak můžete tento atribut vynechat. |
MF_MT_FRAME_RATE | Kmitočet. |
MF_MT_FRAME_SIZE | Velikost rámce |
MF_MT_INTERLACE_MODE | Režim prokládání. |
MF_MT_ALL_SAMPLES_INDEPENDENT | Určuje, jestli je každý vzorek nezávislý. Nastavte na TRUE pro nekomprimované formáty. |
MF_MT_PIXEL_ASPECT_RATIO | Poměr stran pixelu |
Kromě toho nastavte následující atributy, pokud znáte správné hodnoty. (Jinak tyto atributy vynecháte.)
Atribut | Popis |
---|---|
MF_MT_VIDEO_PRIMARIES | Barevné primarie. |
MF_MT_TRANSFER_FUNCTION | Přenosová funkce. |
MF_MT_YUV_MATRIX | Matice přenosu. |
MF_MT_VIDEO_CHROMA_SITING | Chroma siting. |
MF_MT_VIDEO_NOMINAL_RANGE | Jmenovitý rozsah. |
Další informace naleznete v tématu rozšířené informace o barvách. Pokud například vytvoříte typ média, který popisuje standard videa a standard definuje nastavení chroma, přidejte tyto informace do typu média. To pomáhá zachovat věrnost barev v celém kanálu.
Při vytváření typu média videa můžou být užitečné následující funkce.
Funkce | Popis |
---|---|
MFAverageTimePerFrameToFrameRate | Vypočítá frekvenci snímků vzhledem k průměrné době trvání rámce. |
MFCalculateImageSize | Vypočítá velikost obrázku pro nekomprimovaný formát videa. |
MFFrameRateToAverageTimePerFrame | Vypočítá průměrnou dobu trvání snímku videa vzhledem k frekvenci snímků. |
MFGetStrideForBitmapInfoHeader | Vrátí minimální povrchovou krok pro formát videa. Další informace naleznete v tématu Image Stride. |
MFInitVideoFormat | Inicializuje MFVIDEOFORMAT strukturu pro některé standardní formáty videa, jako je televize NTSC. Strukturu pak můžete použít k inicializaci typu média. |
MFIsFormatYUV | Dotazuje se, jestli je formát videa formát YUV. |
Příklady
Tento příklad ukazuje funkci, která vyplní nejběžnější informace pro nekomprimovaný formát videa. Funkce vrátí ukazatel rozhraní MMFMediaType. Podle potřeby pak můžete k typu média přidat další atributy.
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;
}
V dalším příkladu se jako vstup vezme zakódovaný formát videa a vytvoří odpovídající nekomprimovaný typ videa. Tento typ by byl vhodný například pro nastavení kodéru nebo dekodéru.
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;
}
Související témata