Nieskompresowane typy multimediów wideo
W tym temacie opisano sposób tworzenia typu nośnika opisującego nieskompresowany format wideo. Aby uzyskać więcej informacji na temat typów multimediów, zobacz About Media Types.
Aby utworzyć pełny nieskompresowany typ wideo, ustaw następujące atrybuty na IMFMediaType wskaźnik interfejsu.
Atrybut | Opis |
---|---|
MF_MT_MAJOR_TYPE | Typ główny. Ustaw wartość MFMediaType_Video. |
MF_MT_SUBTYPE | Podtypu. Zobacz identyfikatory GUID podtypu wideo. |
MF_MT_DEFAULT_STRIDE | Krok powierzchni. Krok to liczba bajtów potrzebnych do przejścia z jednego wiersza pikseli do następnego. Ustaw ten atrybut, jeśli krok w bajtach nie jest taki sam jak szerokość wideo w bajtach. W przeciwnym razie można pominąć ten atrybut. |
MF_MT_FRAME_RATE | Klatek. |
MF_MT_FRAME_SIZE | Rozmiar ramki. |
MF_MT_INTERLACE_MODE | Tryb przeplotu. |
MF_MT_ALL_SAMPLES_INDEPENDENT | Określa, czy każda próbka jest niezależna. Ustaw wartość true dla nieskompresowanych formatów. |
MF_MT_PIXEL_ASPECT_RATIO | Współczynnik proporcji pikseli. |
Ponadto ustaw następujące atrybuty, jeśli znasz poprawne wartości. (W przeciwnym razie pomiń te atrybuty).
Atrybut | Opis |
---|---|
MF_MT_VIDEO_PRIMARIES | Kolor prawyborów. |
MF_MT_TRANSFER_FUNCTION | Funkcja transferu. |
MF_MT_YUV_MATRIX | Macierz transferu. |
MF_MT_VIDEO_CHROMA_SITING | Chroma siedzi. |
MF_MT_VIDEO_NOMINAL_RANGE | Zakres nominalny. |
Aby uzyskać więcej informacji, zobacz rozszerzone informacje o kolorze. Jeśli na przykład tworzysz typ nośnika opisujący standard wideo, a standard definiuje sitowanie chroma, dodaj te informacje do typu nośnika. Dzięki temu można zachować wierność kolorów w całym potoku.
Poniższe funkcje mogą być przydatne podczas tworzenia typu nośnika wideo.
Funkcja | Opis |
---|---|
MFAverageTimePerFrameToFrameRate | Oblicza częstotliwość klatek, biorąc pod uwagę średni czas trwania ramki. |
MFCalculateImageSize | Oblicza rozmiar obrazu dla nieskompresowanego formatu wideo. |
MFFrameRateToAverageTimePerFrame | Oblicza średni czas trwania ramki wideo, biorąc pod uwagę szybkość klatek. |
MFGetStrideForBitmapInfoHeader | Zwraca minimalny krok powierzchni dla formatu wideo. Aby uzyskać więcej informacji, zobacz Image Stride. |
MFInitVideoFormat | Inicjuje strukturę MFVIDEOFORMAT dla niektórych standardowych formatów wideo, takich jak telewizja NTSC. Następnie można użyć struktury, aby zainicjować typ nośnika. |
MFIsFormatYUV | Zapytania, czy format wideo jest formatem YUV. |
Przykłady
W tym przykładzie przedstawiono funkcję, która wypełnia najbardziej typowe informacje dotyczące nieskompresowanego formatu wideo. Funkcja zwraca wskaźnik interfejsu IMFMediaType. Następnie możesz dodać dodatkowe atrybuty do typu nośnika zgodnie z potrzebami.
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;
}
Następny przykład przyjmuje zakodowany format wideo jako dane wejściowe i tworzy pasujący nieskompresowany typ wideo. Ten typ może być odpowiedni do ustawienia na przykład kodera lub dekodera.
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;
}
Tematy pokrewne