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;
}

Informasi Warna Yang Diperluas

Langkah Gambar

Jenis Media

Tipe Media Video

GUID Subjenis Video