Tipe Media Video Tak Terkompresi
Topik ini menjelaskan cara membuat jenis media yang menjelaskan format video yang tidak dikompresi. Untuk informasi selengkapnya tentang jenis media secara umum, lihat Tentang Jenis Media.
Untuk membuat jenis video lengkap yang tidak dikompresi, atur atribut berikut pada penunjuk antarmuka IMFMediaType .
Atribut | Deskripsi |
---|---|
MF_MT_MAJOR_TYPE | Jenis utama. Atur ke MFMediaType_Video. |
MF_MT_SUBTYPE | Subtipe. Lihat GUID Subjenis Video. |
MF_MT_DEFAULT_STRIDE | Langkah permukaan. Langkahnya adalah jumlah byte yang diperlukan untuk pergi dari satu baris piksel ke baris berikutnya. Atur atribut ini jika langkah dalam byte tidak sama dengan lebar video dalam byte. Jika tidak, Anda dapat menghilangkan atribut ini. |
MF_MT_FRAME_RATE | Kecepatan bingkai. |
MF_MT_FRAME_SIZE | Ukuran bingkai. |
MF_MT_INTERLACE_MODE | Mode interlacing. |
MF_MT_ALL_SAMPLES_INDEPENDENT | Menentukan apakah setiap sampel independen. Atur ke TRUE untuk format yang tidak dikompresi. |
MF_MT_PIXEL_ASPECT_RATIO | Rasio aspek piksel. |
Selain itu, atur atribut berikut jika Anda mengetahui nilai yang benar. (Jika tidak, hilangkan atribut ini.)
Atribut | Deskripsi |
---|---|
MF_MT_VIDEO_PRIMARIES | Warna utama. |
MF_MT_TRANSFER_FUNCTION | Fungsi transfer. |
MF_MT_YUV_MATRIX | Transfer matriks. |
MF_MT_VIDEO_CHROMA_SITING | Chroma duduk. |
MF_MT_VIDEO_NOMINAL_RANGE | Rentang nominal. |
Untuk informasi selengkapnya, lihat Informasi Warna yang Diperluas. Misalnya, jika Anda membuat jenis media yang menjelaskan standar video, dan standar menentukan dudukan klorma, tambahkan informasi ini ke jenis media. Melakukannya membantu mempertahankan keakuratan warna di seluruh alur.
Fungsi berikut mungkin berguna saat membuat jenis media video.
Fungsi | Deskripsi |
---|---|
MFAverageTimePerFrameToFrameRate | Menghitung kecepatan bingkai, mengingat durasi bingkai rata-rata. |
MFCalculateImageSize | Menghitung ukuran gambar untuk format video yang tidak dikompresi. |
MFFrameRateToAverageTimePerFrame | Menghitung durasi rata-rata bingkai video, mengingat kecepatan bingkai. |
MFGetStrideForBitmapInfoHeader | Mengembalikan langkah permukaan minimum untuk format video. Untuk informasi selengkapnya, lihat Image Stride. |
MFInitVideoFormat | Menginisialisasi struktur MFVIDEOFORMAT untuk beberapa format video standar, seperti televisi NTSC. Anda kemudian dapat menggunakan struktur untuk menginisialisasi jenis media. |
MFIsFormatYUV | Mengkueri apakah format video adalah format YUV. |
Contoh
Contoh ini memperlihatkan fungsi yang mengisi informasi paling umum untuk format video yang tidak dikompresi. Fungsi mengembalikan penunjuk antarmuka IMFMediaType . Anda kemudian dapat menambahkan atribut tambahan ke jenis media sesuai kebutuhan.
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;
}
Contoh berikutnya mengambil format video yang dikodekan sebagai input, dan membuat jenis video yang tidak dikompresi yang cocok. Jenis ini akan cocok untuk diatur pada encoder atau decoder, misalnya.
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;
}
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk