Nicht komprimierte Videomedientypen
In diesem Thema wird beschrieben, wie Sie einen Medientyp erstellen, der ein nicht komprimiertes Videoformat beschreibt. Weitere Informationen zu Medientypen im Allgemeinen finden Sie unter Informationen zu Medientypen.
Um einen vollständigen unkomprimierten Videotyp zu erstellen, legen Sie die folgenden Attribute auf dem IMFMediaType-Schnittstellenzeiger fest.
attribute | BESCHREIBUNG |
---|---|
MF_MT_MAJOR_TYPE | Haupttyp. Legen Sie auf MFMediaType_Video fest. |
MF_MT_SUBTYPE | Untertyp. Weitere Informationen finden Sie unter GuiDs des Videountertyps. |
MF_MT_DEFAULT_STRIDE | Surface-Schritt. Der Schritt ist die Anzahl der Bytes, die benötigt werden, um von einer Pixelzeile zur nächsten zu wechseln. Legen Sie dieses Attribut fest, wenn die Stride in Bytes nicht mit der Videobreite in Bytes identisch ist. Andernfalls können Sie dieses Attribut weglassen. |
MF_MT_FRAME_RATE | Bildrate. |
MF_MT_FRAME_SIZE | Framegröße. |
MF_MT_INTERLACE_MODE | Interlacing-Modus. |
MF_MT_ALL_SAMPLES_INDEPENDENT | Gibt an, ob jedes Beispiel unabhängig ist. Legen Sie für nicht komprimierte Formate auf TRUE fest. |
MF_MT_PIXEL_ASPECT_RATIO | Pixelseitenverhältnis. |
Legen Sie außerdem die folgenden Attribute fest, wenn Sie die richtigen Werte kennen. (Andernfalls lassen Sie diese Attribute weg.)
attribute | BESCHREIBUNG |
---|---|
MF_MT_VIDEO_PRIMARIES | Farbprimries. |
MF_MT_TRANSFER_FUNCTION | Übertragungsfunktion. |
MF_MT_YUV_MATRIX | Transfermatrix. |
MF_MT_VIDEO_CHROMA_SITING | Chroma-Sitz. |
MF_MT_VIDEO_NOMINAL_RANGE | Nominalbereich. |
Weitere Informationen finden Sie unter Erweiterte Farbinformationen. Wenn Sie beispielsweise einen Medientyp erstellen, der einen Videostandard beschreibt, und der Standard die Chroma-Siting definiert, fügen Sie diese Informationen dem Medientyp hinzu. Dies trägt dazu bei, die Farbtreue in der gesamten Pipeline zu erhalten.
Die folgenden Funktionen können beim Erstellen eines Videomedientyps nützlich sein.
Funktion | BESCHREIBUNG |
---|---|
MFAverageTimePerFrameToFrameRate | Berechnet die Bildrate unter Berücksichtigung der durchschnittlichen Framedauer. |
MFCalculateImageSize | Berechnet die Bildgröße für ein nicht komprimiertes Videoformat. |
MFFrameRateToAverageTimePerFrame | Berechnet die durchschnittliche Dauer eines Videoframes unter Berücksichtigung der Bildfrequenz. |
MFGetStrideForBitmapInfoHeader | Gibt die mindeste Oberflächenschritte für ein Videoformat zurück. Weitere Informationen finden Sie unter Image Stride. |
MFInitVideoFormat | Initialisiert eine MFVIDEOFORMAT-Struktur für einige Standardvideoformate, z. B. NTSC-Fernsehen. Anschließend können Sie die -Struktur verwenden, um einen Medientyp zu initialisieren. |
MFIsFormatYUV | Fragt ab, ob ein Videoformat ein YUV-Format ist. |
Beispiele
Dieses Beispiel zeigt eine Funktion, die die gängigsten Informationen für ein nicht komprimiertes Videoformat ausfüllt. Die Funktion gibt einen IMFMediaType-Schnittstellenzeiger zurück. Anschließend können Sie dem Medientyp nach Bedarf zusätzliche Attribute hinzufügen.
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;
}
Im nächsten Beispiel wird ein codiertes Videoformat als Eingabe verwendet und ein übereinstimmend nicht komprimierter Videotyp erstellt. Dieser Typ eignet sich beispielsweise für die Einstellung für einen Encoder oder Decoder.
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;
}
Zugehörige Themen