Udostępnij za pośrednictwem


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

rozszerzone informacje o kolorach

obrazów

typy multimediów

typy multimediów wideo

identyfikatory GUID podtypu wideo