Okomprimerade videomedietyper
I det här avsnittet beskrivs hur du skapar en medietyp som beskriver ett okomprimerat videoformat. Mer information om medietyper finns i Om medietyper.
Om du vill skapa en fullständig okomprimerad videotyp anger du följande attribut på IMFMediaType- gränssnittspekare.
Attribut | Beskrivning |
---|---|
MF_MT_MAJOR_TYPE | Huvudtyp. Ange till MFMediaType_Video. |
MF_MT_SUBTYPE | Subtyp. Se videoundertyps-GUID:er. |
MF_MT_DEFAULT_STRIDE | Ytsteg. Det steget är antalet byte som behövs för att gå från en rad med bildpunkter till nästa. Ange det här attributet om steget i byte inte är samma som videobredden i byte. Annars kan du utelämna det här attributet. |
MF_MT_FRAME_RATE | Bildfrekvens. |
MF_MT_FRAME_SIZE | Ramstorlek. |
MF_MT_INTERLACE_MODE | Sammanflätningsläge. |
MF_MT_ALL_SAMPLES_INDEPENDENT | Anger om varje exempel är oberoende. Ange till TRUE- för okomprimerade format. |
MF_MT_PIXEL_ASPECT_RATIO | Bildpunktsproportion. |
Ange dessutom följande attribut om du känner till rätt värden. (Annars utelämnar du dessa attribut.)
Attribut | Beskrivning |
---|---|
MF_MT_VIDEO_PRIMARIES | Färg primärval. |
MF_MT_TRANSFER_FUNCTION | Överföringsfunktion. |
MF_MT_YUV_MATRIX | Överföringsmatris. |
MF_MT_VIDEO_CHROMA_SITING | Chroma sitter. |
MF_MT_VIDEO_NOMINAL_RANGE | Nominellt intervall. |
Mer information finns i utökad färginformation. Om du till exempel skapar en medietyp som beskriver en videostandard och standarden definierar kroma-siting lägger du till den här informationen i medietypen. Detta hjälper till att bevara färgåtergivningen i hela pipelinen.
Följande funktioner kan vara användbara när du skapar en videomedietyp.
Funktion | Beskrivning |
---|---|
MFAverageTimePerFrameToFrameRate | Beräknar bildrutefrekvensen med tanke på den genomsnittliga bildrutevaraktigheten. |
MFCalculateImageSize | Beräknar bildstorleken för ett okomprimerat videoformat. |
MFFrameRateToAverageTimePerFrame | Beräknar den genomsnittliga varaktigheten för en videobildruta med tanke på bildfrekvensen. |
MFGetStrideForBitmapInfoHeader | Returnerar minsta ytsteg för ett videoformat. Mer information finns i Image Stride. |
MFInitVideoFormat | Initierar en MFVIDEOFORMAT struktur för vissa standardvideoformat, till exempel NTSC-tv. Du kan sedan använda strukturen för att initiera en medietyp. |
MFIsFormatYUV | Frågar om ett videoformat är ett YUV-format. |
Exempel
Det här exemplet visar en funktion som fyller i den vanligaste informationen för ett okomprimerat videoformat. Funktionen returnerar en IMFMediaType- gränssnittspekare. Du kan sedan lägga till ytterligare attribut till medietypen efter behov.
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;
}
Nästa exempel tar ett kodat videoformat som indata och skapar en matchande okomprimerad videotyp. Den här typen skulle vara lämplig att ställa in på en kodare eller avkodare, till exempel.
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;
}
Relaterade ämnen