다음을 통해 공유


압축되지 않은 비디오 미디어 유형

이 항목에서는 압축되지 않은 비디오 형식을 설명하는 미디어 형식을 만드는 방법을 설명합니다. 일반적으로 미디어 유형에 대한 자세한 내용은 미디어 유형 정보를 참조하세요.

압축되지 않은 전체 비디오 형식을 만들려면 IMFMediaType 인터페이스 포인터에서 다음 특성을 설정합니다.

attribute 설명
MF_MT_MAJOR_TYPE 주 형식입니다. 를 MFMediaType_Video.
MF_MT_SUBTYPE 하위. 비디오 하위 형식 GUID를 참조하세요.
MF_MT_DEFAULT_STRIDE Surface 보폭. 보폭은 픽셀의 한 행에서 다음 행으로 이동하는 데 필요한 바이트 수입니다. 보폭(바이트)이 비디오 너비(바이트)와 같지 않은 경우 이 특성을 설정합니다. 그렇지 않으면 이 특성을 생략할 수 있습니다.
MF_MT_FRAME_RATE 프레임 속도.
MF_MT_FRAME_SIZE 프레임 크기입니다.
MF_MT_INTERLACE_MODE 인터레이싱 모드.
MF_MT_ALL_SAMPLES_INDEPENDENT 각 샘플이 독립적인지 여부를 지정합니다. 압축되지 않은 형식의 경우 TRUE 로 설정합니다.
MF_MT_PIXEL_ASPECT_RATIO 픽셀 가로 세로 비율입니다.

 

또한 올바른 값을 알고 있는 경우 다음 특성을 설정합니다. (그렇지 않으면 이러한 특성을 생략합니다.)

attribute 설명
MF_MT_VIDEO_PRIMARIES 색 주 복제본.
MF_MT_TRANSFER_FUNCTION 전송 함수입니다.
MF_MT_YUV_MATRIX 전송 매트릭스.
MF_MT_VIDEO_CHROMA_SITING 크로마 앉기.
MF_MT_VIDEO_NOMINAL_RANGE 명목 범위입니다.

 

자세한 내용은 확장 색 정보를 참조하세요. 예를 들어 비디오 표준을 설명하는 미디어 형식을 만들고 표준이 chroma siting을 정의하는 경우 이 정보를 미디어 형식에 추가합니다. 이렇게 하면 파이프라인 전체에서 색 충실도를 유지하는 데 도움이 됩니다.

다음 함수는 비디오 미디어 형식을 만들 때 유용할 수 있습니다.

함수 Description
MFAverageTimePerFrameToFrameRate 평균 프레임 기간을 고려하여 프레임 속도를 계산합니다.
MFCalculateImageSize 압축되지 않은 비디오 형식의 이미지 크기를 계산합니다.
MFFrameRateToAverageTimePerFrame 프레임 속도에 따라 비디오 프레임의 평균 기간을 계산합니다.
MFGetStrideForBitmapInfoHeader 비디오 형식의 최소 표면 보폭을 반환합니다. 자세한 내용은 Image Stride를 참조하세요.
MFInitVideoFormat NTSC 텔레비전과 같은 일부 표준 비디오 형식에 대한 MFVIDEOFORMAT 구조를 초기화합니다. 그런 다음, 구조를 사용하여 미디어 형식을 초기화할 수 있습니다.
MFIsFormatYUV 비디오 형식이 YUV 형식인지 여부를 쿼리합니다.

 

예제

이 예제에서는 압축되지 않은 비디오 형식에 대한 가장 일반적인 정보를 채우는 함수를 보여 줍니다. 함수는 IMFMediaType 인터페이스 포인터를 반환합니다. 그런 다음 필요에 따라 미디어 형식에 특성을 추가할 수 있습니다.

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

다음 예제에서는 인코딩된 비디오 형식을 입력으로 사용하고 압축되지 않은 일치하는 비디오 형식을 만듭니다. 예를 들어 이 형식은 인코더 또는 디코더에서 설정하는 데 적합합니다.

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

확장 색 정보

이미지 스트라이드

미디어 유형

비디오 미디어 유형

비디오 하위 유형 GUID