Share via


DXVA 비디오 처리

DXVA 비디오 처리는 압축되지 않은 비디오 이미지 처리에 전념하는 그래픽 하드웨어의 기능을 캡슐화합니다. 비디오 처리 서비스에는 디인터레이싱 및 비디오 믹싱이 포함됩니다.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

개요

그래픽 하드웨어는 GPU(그래픽 처리 장치)를 사용하여 압축되지 않은 비디오 이미지를 처리할 수 있습니다. 비디오 처리 디바이스는 이러한 기능을 캡슐화하는 소프트웨어 구성 요소입니다. 애플리케이션은 비디오 처리 디바이스를 사용하여 다음과 같은 기능을 수행할 수 있습니다.

  • 디인터레이싱 및 역 텔레신
  • 비디오 하위 스트림을 기본 비디오 이미지에 혼합
  • 색 조정(ProcAmp) 및 이미지 필터링
  • 이미지 크기 조정
  • 색 공간 변환
  • 알파 혼합

다음 다이어그램은 비디오 처리 파이프라인의 단계를 보여줍니다. 다이어그램은 실제 구현을 표시하기 위한 것이 아닙니다. 예를 들어 그래픽 드라이버는 여러 단계를 단일 작업으로 결합할 수 있습니다. 이러한 모든 작업은 비디오 처리 디바이스에 대한 단일 호출로 수행할 수 있습니다. 노이즈 및 세부 필터링과 같은 일부 단계는 드라이버에서 지원하지 않을 수 있습니다.

diagram showing the stages of dxva video processing.

비디오 처리 파이프라인에 대한 입력에는 항상 기본 이미지 데이터가 포함된 기본 비디오 스트림이 포함됩니다. 기본 비디오 스트림은 출력 비디오의 프레임 속도를 결정합니다. 출력 비디오의 각 프레임은 기본 비디오 스트림의 입력 데이터를 기준으로 계산됩니다. 기본 스트림의 픽셀은 항상 불투명하며 픽셀당 알파 데이터는 없습니다. 기본 비디오 스트림은 프로그레시브 또는 인터레이스될 수 있습니다.

필요에 따라 비디오 처리 파이프라인은 최대 15개의 비디오 하위 스트림을 받을 수 있습니다. 하위 스트림에는 닫힌 캡션 또는 DVD 하위 그림과 같은 보조 이미지 데이터가 포함됩니다. 이러한 이미지는 기본 비디오 스트림에 표시되며 일반적으로 자체적으로 표시되지 않습니다. 하위 스트림 그림은 픽셀당 알파 데이터를 포함할 수 있으며 항상 프로그레시브 프레임입니다. 비디오 처리 디바이스는 하위 스트림 이미지를 기본 비디오 스트림의 현재 디인터레이스된 프레임과 알파 혼합합니다.

이 항목의 re기본der에서 그림이라는 용어는 비디오 처리 디바이스에 대한 입력 데이터에 사용됩니다. 그림은 프로그레시브 프레임, 단일 필드 또는 두 개의 인터리브 필드로 구성될 수 있습니다. 출력은 항상 디인터레이스된 프레임입니다.

비디오 드라이버는 여러 비디오 처리 디바이스를 구현하여 다양한 비디오 처리 기능을 제공할 수 있습니다. 디바이스는 GUID로 식별됩니다. 다음 GUID가 미리 정의되어 있습니다.

  • DXVA2_VideoProcBobDevice. 이 디바이스는 bob 디인터레이싱을 수행합니다.
  • DXVA2_VideoProcProgressiveDevice. 이 디바이스는 비디오에 인터레이스된 프레임이 없는 프로그레시브 프레임만 포함된 경우에 사용됩니다. (일부 비디오 콘텐츠에는 프로그레시브 프레임과 인터레이스된 프레임이 혼합되어 있습니다. 인터레이스된 프레임에는 디인터레이싱 단계가 필요하기 때문에 이러한 종류의 "혼합" 비디오 콘텐츠에는 프로그레시브 디바이스를 사용할 수 없습니다.)

DXVA 비디오 처리를 지원하는 모든 그래픽 드라이버는 적어도 이러한 두 디바이스를 구현해야 합니다. 그래픽 드라이버는 드라이버별 GUID로 식별되는 다른 디바이스를 제공할 수도 있습니다. 예를 들어 드라이버는 bob 디인터레이싱보다 더 나은 품질 출력을 생성하는 독점 탈인터레이스 알고리즘을 구현할 수 있습니다. 일부 디인터레이싱 알고리즘에는 기본 스트림의 앞으로 또는 뒤로 참조 그림이 필요할 수 있습니다. 그렇다면 호출자는 이 섹션의 뒷부분에 설명된 대로 올바른 순서로 드라이버에 이러한 그림을 제공해야 합니다.

참조 소프트웨어 디바이스도 제공됩니다. 소프트웨어 디바이스는 속도보다는 품질에 최적화되어 있으며 실시간 비디오 처리에 적합하지 않을 수 있습니다. 참조 소프트웨어 디바이스는 GUID 값 DXVA2_VideoProcSoftwareDevice 사용합니다.

비디오 처리 디바이스 만들기

DXVA 비디오 처리를 사용하기 전에 애플리케이션에서 비디오 처리 디바이스를 만들어야 합니다. 다음은 이 섹션의 re기본der에 자세히 설명된 단계의 간략한 개요입니다.

  1. IDirectXVideoProcessorService 인터페이스에 대한 포인터를 가져옵니다.
  2. 기본 비디오 스트림의 비디오 형식에 대한 설명을 만듭니다. 이 설명을 사용하여 비디오 형식을 지원하는 비디오 처리 디바이스 목록을 가져옵니다. 디바이스는 GUID로 식별됩니다.
  3. 특정 디바이스의 경우 디바이스에서 지원하는 렌더링 대상 형식 목록을 가져옵니다. 형식은 D3DFORMAT 값 목록으로 반환됩니다. 하위 스트림을 혼합하려는 경우 지원되는 하위 스트림 형식의 목록도 가져옵니다.
  4. 각 디바이스의 기능을 쿼리합니다.
  5. 비디오 처리 디바이스를 만듭니다.

경우에 따라 이러한 단계 중 일부를 생략할 수 있습니다. 예를 들어 렌더링 대상 형식 목록을 가져오는 대신 원하는 형식으로 비디오 처리 디바이스를 만들고 성공하는지 확인할 수 있습니다. D3DFMT_X8R8G8B8 같은 일반적인 형식이 성공할 가능성이 높습니다.

이 섹션의 re기본der는 이러한 단계를 자세히 설명합니다.

IDirectXVideoProcessorService 포인터 가져오기

IDirectXVideoProcessorService 인터페이스는 Direct3D 디바이스에서 가져옵니다. 이 인터페이스에 대한 포인터를 가져오는 방법에는 두 가지가 있습니다.

Direct3D 디바이스에 대한 포인터가 있는 경우 DXVA2CreateVideoService 함수를 호출하여 IDirectXVideoProcessorService 포인터를 가져올 수 있습니다. 다음 코드와 같이 디바이스의 IDirect3DDevice9 인터페이스에 포인터를 전달하고 riid 매개 변수에 대한 IID_IDirectXVideoProcessorService 지정합니다.

    // Create the DXVA-2 Video Processor service.
    hr = DXVA2CreateVideoService(g_pD3DD9, IID_PPV_ARGS(&g_pDXVAVPS));

n 경우에 따라 한 개체가 Direct3D 디바이스를 만든 다음 Direct3D 장치 관리자 통해 다른 개체와 공유합니다. 이 경우 다음 코드와 같이 디바이스 관리자에서 IDirect3DDeviceManager9::GetVideoService를 호출하여 IDirectXVideoProcessorService 포인터를 가져올 수 있습니다.

HRESULT GetVideoProcessorService(
    IDirect3DDeviceManager9 *pDeviceManager,
    IDirectXVideoProcessorService **ppVPService
    )
{
    *ppVPService = NULL;

    HANDLE hDevice;

    HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);
    if (SUCCEEDED(hr))
    {
        // Get the video processor service 
        HRESULT hr2 = pDeviceManager->GetVideoService(
            hDevice, 
            IID_PPV_ARGS(ppVPService)
            );

        // Close the device handle.
        hr = pDeviceManager->CloseDeviceHandle(hDevice);

        if (FAILED(hr2))
        {
            hr = hr2;
        }
    }

    if (FAILED(hr))
    {
        SafeRelease(ppVPService);
    }

    return hr;
}

비디오 처리 디바이스 열거

비디오 처리 디바이스 목록을 얻으려면 기본 비디오 스트림 형식으로 DXVA2_VideoDesc 구조를 입력하고 이 구조를 IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids 메서드에 전달합니다. 이 메서드는 이 비디오 형식으로 사용할 수 있는 각 비디오 처리 디바이스에 대해 하나씩 GUID 배열을 반환합니다.

초당 프레임 속도가 29.97인 YUV 색의 BT.709 정의를 사용하여 YUY2 형식으로 비디오 스트림을 렌더링하는 애플리케이션을 고려합니다. 비디오 콘텐츠가 전적으로 프로그레시브 프레임으로 구성된다고 가정합니다. 다음 코드 조각에서는 형식 설명을 입력하고 디바이스 GUID를 가져오는 방법을 보여 줍니다.

    // Initialize the video descriptor.

    g_VideoDesc.SampleWidth                         = VIDEO_MAIN_WIDTH;
    g_VideoDesc.SampleHeight                        = VIDEO_MAIN_HEIGHT;
    g_VideoDesc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG2;
    g_VideoDesc.SampleFormat.NominalRange           = DXVA2_NominalRange_16_235;
    g_VideoDesc.SampleFormat.VideoTransferMatrix    = EX_COLOR_INFO[g_ExColorInfo][0];
    g_VideoDesc.SampleFormat.VideoLighting          = DXVA2_VideoLighting_dim;
    g_VideoDesc.SampleFormat.VideoPrimaries         = DXVA2_VideoPrimaries_BT709;
    g_VideoDesc.SampleFormat.VideoTransferFunction  = DXVA2_VideoTransFunc_709;
    g_VideoDesc.SampleFormat.SampleFormat           = DXVA2_SampleProgressiveFrame;
    g_VideoDesc.Format                              = VIDEO_MAIN_FORMAT;
    g_VideoDesc.InputSampleFreq.Numerator           = VIDEO_FPS;
    g_VideoDesc.InputSampleFreq.Denominator         = 1;
    g_VideoDesc.OutputFrameFreq.Numerator           = VIDEO_FPS;
    g_VideoDesc.OutputFrameFreq.Denominator         = 1;

    // Query the video processor GUID.

    UINT count;
    GUID* guids = NULL;

    hr = g_pDXVAVPS->GetVideoProcessorDeviceGuids(&g_VideoDesc, &count, &guids);

이 예제의 코드는 DXVA2_VideoProc SDK 샘플에서 가져옵니다.

이 예제의 pGuids 배열은 GetVideoProcessorDeviceGuids 메서드에 의해 할당되므로 애플리케이션은 CoTaskMemFree를 호출하여 배열을 해제해야 합니다. 이 메서드에서 반환된 디바이스 GUID를 사용하여 다시 기본 단계를 수행할 수 있습니다.

렌더링 대상 형식 열거

디바이스에서 지원하는 렌더링 대상 형식 목록을 얻으려면 다음 코드와 같이 디바이스 GUID 및 DXVA2_VideoDesc 구조를 IDirectXVideoProcessorService::GetVideoProcessorRenderTargets 메서드에 전달합니다.

    // Query the supported render-target formats.

    UINT i, count;
    D3DFORMAT* formats = NULL;

    HRESULT hr = g_pDXVAVPS->GetVideoProcessorRenderTargets(
        guid, &g_VideoDesc, &count, &formats);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorRenderTargets failed: 0x%x.\n", hr));
        return FALSE;
    }

    for (i = 0; i < count; i++)
    {
        if (formats[i] == VIDEO_RENDER_TARGET_FORMAT)
        {
            break;
        }
    }

    CoTaskMemFree(formats);

    if (i >= count)
    {
        DBGMSG((L"The device does not support the render-target format.\n"));
        return FALSE;
    }

이 메서드는 D3DFORMAT 값의 배열을 반환합니다. 입력 형식이 YUY2인 이 예제에서는 일반적인 형식 목록이 D3DFMT_X8R8G8B8(32비트 RGB) 및 D3DMFT_YUY2(입력 형식)일 수 있습니다. 그러나 정확한 목록은 드라이버에 따라 달라집니다.

하위 스트림에 사용 가능한 형식 목록은 렌더링 대상 형식 및 입력 형식에 따라 달라질 수 있습니다. 하위 스트림 형식 목록을 얻으려면 다음 코드와 같이 디바이스 GUID, 형식 구조 및 렌더링 대상 형식 을 IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats 메서드에 전달합니다.

    // Query the supported substream formats.

    formats = NULL;

    hr = g_pDXVAVPS->GetVideoProcessorSubStreamFormats(
        guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &count, &formats);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorSubStreamFormats failed: 0x%x.\n", hr));
        return FALSE;
    }

    for (i = 0; i < count; i++)
    {
        if (formats[i] == VIDEO_SUB_FORMAT)
        {
            break;
        }
    }

    CoTaskMemFree(formats);

    if (i >= count)
    {
        DBGMSG((L"The device does not support the substream format.\n"));
        return FALSE;
    }

이 메서드는 D3DFORMAT 값의 다른 배열을 반환합니다. 일반적인 하위 스트림 형식은 AYUV 및 AI44입니다.

디바이스 기능 쿼리

특정 디바이스의 기능을 얻으려면 디바이스 GUID, 형식 구조 및 렌더링 대상 형식 을 IDirectXVideoProcessorService::GetVideoProcessorCaps 메서드에 전달합니다 . 이 메서드는 디바이스 기능으로 DXVA2_VideoProcessorCaps 구조를 채웁니다.

    // Query video processor capabilities.

    hr = g_pDXVAVPS->GetVideoProcessorCaps(
        guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &g_VPCaps);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorCaps failed: 0x%x.\n", hr));
        return FALSE;
    }

디바이스 만들기

비디오 처리 디바이스를 만들려면 IDirectXVideoProcessorService::CreateVideoProcessor를 호출합니다. 이 메서드에 대한 입력은 디바이스 GUID, 형식 설명, 렌더링 대상 형식 및 혼합하려는 최대 하위 스트림 수입니다. 이 메서드는 비디오 처리 디바이스를 나타내는 IDirectXVideoProcessor 인터페이스에 대한 포인터를 반환합니다.

    // Finally create a video processor device.

    hr = g_pDXVAVPS->CreateVideoProcessor(
        guid,
        &g_VideoDesc,
        VIDEO_RENDER_TARGET_FORMAT,
        SUB_STREAM_COUNT,
        &g_pDXVAVPD
        );

비디오 프로세스 블릿

기본 비디오 처리 작업은 비디오 처리 블릿입니다. (블릿은 둘 이상의 비트맵을 단일 비트맵으로 결합하는 모든 작업입니다. 비디오 처리 블릿은 입력 그림을 결합하여 출력 프레임을 만듭니다.) 비디오 처리 블릿을 수행하려면 IDirectXVideoProcessor::VideoProcessBlt를 호출합니다. 이 메서드는 비디오 샘플 집합을 비디오 처리 디바이스에 전달합니다. 이에 대한 응답으로 비디오 처리 디바이스는 입력 그림을 처리하고 하나의 출력 프레임을 생성합니다. 처리에는 디인터레이싱, 색 공간 변환 및 하위 스트림 혼합이 포함될 수 있습니다. 출력은 호출자가 제공하는 대상 화면에 기록됩니다.

VideoProcessBlt 메서드는 다음 매개 변수를 사용합니다.

  • pRT 는 처리된 비디오 프레임을 받을 IDirect3DSurface9 렌더링 대상 화면을 가리킵니다.
  • pBltParams는 blit에 대한 매개 변수를 지정하는 DXVA2_VideoProcessBltParams 구조를 가리킵니다.
  • pSamples는 DXVA2_VideoSample 구조체 배열의 주소입니다. 이러한 구조에는 blit에 대한 입력 샘플이 포함되어 있습니다.
  • NumSamples는 pSamples 배열의 크기를 제공합니다.
  • Reserved 매개 변수는 예약되어 있으며 NULL설정해야 합니다.

pSamples 배열에서 호출자는 다음 입력 샘플을 제공해야 합니다.

  • 기본 비디오 스트림의 현재 그림입니다.
  • 역방향 참조 그림(디인터레이싱 알고리즘에 필요한 경우).
  • 최대 15개의 하위 스트림까지 0개 이상의 하위 스트림 그림

드라이버는 입력 샘플 순서에 설명된 대로 이 배열이 특정 순서로 표시되어야 합니다.

Blit 매개 변수

DXVA2_VideoProcessBltParams 구조체에는 blit에 대한 일반 매개 변수가 포함되어 있습니다. 가장 중요한 매개 변수는 구조체의 다음 멤버에 저장됩니다.

  • TargetFrame 은 출력 프레임의 프레젠테이션 시간입니다. 점진적 콘텐츠의 경우 이 시간은 기본 비디오 스트림의 현재 프레임에 대한 시작 시간과 같아야 합니다. 이 시간은 해당 입력 샘플에 대한 DXVA2_VideoSample 구조체의 시작 멤버에 지정됩니다.

    인터레이스된 콘텐츠의 경우 인터리브 필드가 두 개 있는 프레임은 두 개의 디인터레이스 출력 프레임을 생성합니다. 첫 번째 출력 프레임에서 프레젠테이션 시간은 점진적 콘텐츠와 마찬가지로 기본 비디오 스트림의 현재 그림 시작 시간과 같아야 합니다. 두 번째 출력 프레임에서 시작 시간은 기본 비디오 스트림의 현재 그림 시작 시간과 스트림의 다음 그림 시작 시간 사이의 중간점과 같아야 합니다. 예를 들어 입력 비디오가 초당 25프레임(초당 50개 필드)인 경우 출력 프레임에는 다음 표에 표시된 타임스탬프를 포함합니다. 타임스탬프는 100나노초 단위로 표시됩니다.

    입력 그림 TargetFrame (1) TargetFrame (2)
    0 0 200000
    400000 0 600000
    800000 800000 1000000
    1200000 1200000 1400000

     

    인터레이스된 콘텐츠가 인터리브 필드가 아닌 단일 필드로 구성된 경우 출력 시간은 프로그레시브 콘텐츠와 마찬가지로 항상 입력 시간과 일치합니다.

  • TargetRect 는 대상 표면 내에서 사각형 영역을 정의합니다. blit는 이 지역에 출력을 씁니다. 특히 TargetRect 내의 모든 픽셀은 수정되며 TargetRect 외부의 픽셀은 수정되지 않습니다. 대상 사각형은 모든 입력 비디오 스트림에 대한 경계 사각형을 정의합니다. 해당 사각형 내의 개별 스트림 배치는 IDirectXVideoProcessor::VideoProcessBlt pSamples 매개 변수를 통해 제어됩니다.

  • BackgroundColor 는 비디오 이미지가 나타나지 않을 때마다 배경색을 제공합니다. 예를 들어 4 x 3 영역(letterboxing) 내에 16 x 9 비디오 이미지가 표시되면 레터박스 영역이 배경색으로 표시됩니다. 배경색은 대상 사각형(TargetRect) 내에서만 적용됩니다. TargetRect 외부의 모든 픽셀은 수정되지 않습니다.

  • DestFormat 은 출력 비디오의 색 공간(예: ITU-R BT.709 또는 BT.601 색 사용 여부)을 설명합니다. 이 정보는 이미지가 표시되는 방식에 영향을 줄 수 있습니다. 자세한 내용은 확장 색 정보를 참조 하세요.

다른 매개 변수는 DXVA2_VideoProcessBltParams 구조에 대한 참조 페이지에 설명되어 있습니다.

입력 샘플

IDirectXVideoProcessor::VideoProcessBltpSamples 매개 변수는 DXVA2_VideoSample 구조의 배열을 가리킵니다. 이러한 각 구조에는 하나의 입력 샘플에 대한 정보와 샘플이 포함된 Direct3D 표면에 대한 포인터가 포함됩니다. 각 샘플은 다음 중 하나입니다.

  • 기본 스트림의 현재 그림입니다.
  • 디인터레이싱에 사용되는 기본 스트림의 앞으로 또는 뒤로 참조 그림입니다.
  • 하위 스트림 그림입니다.

샘플이 배열에 표시되어야 하는 정확한 순서는 나중에 입력 샘플 순서 섹션에 설명되어 있습니다.

대부분의 비디오 애플리케이션에는 최대 하나의 하위 스트림만 필요하지만 최대 15개의 하위 스트림 그림을 제공할 수 있습니다. VideoProcessBlt 호출마다 하위 스트림 수가 변경될 수 있습니다. 하위 스트림 그림은 DXVA2_VideoSample 구조체의 SampleFormat.SampleFormat 멤버를 DXVA2_SampleSubStream 같게 설정하여 표시됩니다. 기본 비디오 스트림의 경우 이 멤버는 입력 비디오의 인터레이싱에 대해 설명합니다. 자세한 내용은 DXVA2_SampleFormat 열거형을 참조하세요.

기본 비디오 스트림의 경우 DXVA2_VideoSample 구조의 시작종료 멤버는 입력 샘플의 시작 및 종료 시간을 제공합니다. 하위 스트림 그림의 경우 프레젠테이션 시간이 항상 기본 스트림에서 계산되므로 이러한 값을 0으로 설정합니다. 애플리케이션은 각 하위 스트림 그림을 표시해야 하는 시점을 추적하고 적절한 시간에 VideoProcessBlt 에 제출하는 작업을 담당합니다.

두 사각형은 각 스트림에 대해 원본 비디오의 위치를 정의하는 방법을 정의합니다.

  • DXVA2_VideoSample 구조체의 SrcRect 멤버는 복합 출력 프레임에 나타날 원본 그림의 사각형 영역인 원본 사각형을 지정합니다. 그림을 자르려면 프레임 크기보다 작은 값으로 설정합니다. 그렇지 않으면 프레임 크기와 동일하게 설정합니다.
  • 동일한 구조의 DstRect 멤버는 대상 사각형, 비디오 프레임이 나타날 대상 표면의 사각형 영역을 지정 합니다.

드라이버는 원본 사각형에서 대상 사각형으로 픽셀을 블릿합니다. 두 사각형은 크기나 가로 세로 비율이 다를 수 있습니다. 드라이버는 필요에 따라 이미지의 크기를 조정합니다. 또한 각 입력 스트림은 다른 배율 인수를 사용할 수 있습니다. 실제로 출력 프레임에서 올바른 가로 세로 비율을 생성하려면 크기 조정이 필요할 수 있습니다. 드라이버는 원본의 픽셀 가로 세로 비율을 고려하지 않으므로 원본 이미지에서 정사각형이 아닌 픽셀을 사용하는 경우 애플리케이션이 올바른 대상 사각형을 계산해야 합니다.

기본 하위 스트림 형식은 AYUV 및 AI44입니다. 후자는 16가지 색으로 된 팔레트 형식입니다. 색상표 항목은 DXVA2_VideoSample 구조체의 Pal 멤버에 지정됩니다. 원본 비디오 형식이 원래 Media Foundation 미디어 형식으로 표현된 경우 색상표 항목은 <a0/>에 저장됩니다. MF_MT_PALETTE 특성입니다.) 팔레트화되지 않은 형식의 경우 이 배열을 0으로 지웁니다.

이미지 컴퍼지션

모든 블릿 작업은 다음 세 개의 사각형으로 정의됩니다.

  • 대상 사각형(TargetRect)은 출력이 나타날 대상 표면 내의 영역을 정의합니다. 출력 이미지가 이 사각형으로 잘립니다.
  • 각 스트림(DstRect)의 대상 사각형은 입력 스트림이 복합 이미지에 표시되는 위치를 정의합니다.
  • 각 스트림(SrcRect)에 대한 원본 사각형은 원본 이미지의 어떤 부분이 표시되는지 정의합니다.

대상 및 대상 사각형은 대상 표면을 기준으로 지정됩니다. 원본 사각형은 원본 이미지를 기준으로 지정됩니다. 모든 사각형은 픽셀 단위로 지정됩니다.

diagram showing source, destination, and target rectangles

비디오 처리 디바이스 알파는 다음 알파 데이터 원본을 사용하여 입력 그림을 혼합합니다.

  • 하위 스트림의 픽셀당 알파 데이터입니다.
  • DXVA2_VideoSample 구조체의 PlanarAlpha 멤버에 지정된 각 비디오 스트림에 대한 평면 알파 값입니다.
  • DXVA2_VideoProcessBltParams 구조체의 알파 멤버에 지정된 복합 이미지의 평면 알파 값입니다. 이 값은 전체 복합 이미지를 배경색과 혼합하는 데 사용됩니다.

이 섹션에서는 비디오 처리 디바이스가 출력 이미지를 만드는 방법을 보여 주는 일련의 예제를 제공합니다.

예제 1: Letterboxing

이 예제에서는 대상 사각형을 대상 사각형보다 작게 설정하여 원본 이미지에 편지함을 보내는 방법을 보여 줍니다. 이 예제의 기본 비디오 스트림은 720 × 480 이미지이며 16:9 가로 세로 비율로 표시됩니다. 대상 표면은 640× 480픽셀(4:3 가로 세로 비율)입니다. 올바른 가로 세로 비율을 달성하려면 대상 사각형이 640 × 360이어야 합니다. 간단히 하기 위해 이 예제에는 하위 스트림이 포함되지 않습니다. 다음 다이어그램에서는 원본 및 대상 사각형을 보여 줍니다.

diagram showing letterboxing.

위의 다이어그램은 다음 사각형을 보여 줍니다.

  • 대상 사각형: { 0, 0, 640, 480 }

  • 기본 비디오:

    • 원본 사각형: { 0, 0, 720, 480 }
    • 대상 사각형: { 0, 60, 640, 420 }

드라이버는 비디오를 디인터레이스하고, 디인터레이스된 프레임을 640× 360으로 축소하고, 프레임을 대상 사각형으로 블릿합니다. 대상 사각형이 대상 사각형보다 크므로 드라이버는 배경색을 사용하여 프레임 위와 아래의 가로 막대를 채웁니다. 배경색은 DXVA2_VideoProcessBltParams 구조체에 지정됩니다.

예제 2: 하위 스트림 이미지 늘이기

하위 스트림 그림은 기본 비디오 사진 이상으로 확장할 수 있습니다. 예를 들어 DVD 비디오에서 기본 비디오 스트림은 4:3 가로 세로 비율을 가질 수 있고 하위 스트림은 16:9일 수 있습니다. 이 예제에서 두 비디오 스트림의 원본 차원은 동일하지만(720 × 480) 하위 스트림은 16:9 가로 세로 비율로 표시되어야 합니다. 이 가로 세로 비율을 달성하기 위해 하위 스트림 이미지는 가로로 확장됩니다. 원본 및 대상 사각형은 다음 다이어그램에 표시됩니다.

diagram showing substream image stretching.

위의 다이어그램은 다음 사각형을 보여 줍니다.

  • 대상 사각형: { 0, 0, 854, 480 }

  • 기본 비디오:

    • 원본 사각형: { 0, 0, 720, 480 }
    • 대상 사각형: { 0, 107, 474, 480 }
  • 하위 스트림:

    • 원본 사각형: { 0, 0, 720, 480 }
    • 대상 사각형: { 0, 0, 854, 480 }

이러한 값은 이미지 높이를 유지하고 두 이미지의 크기를 가로로 조정합니다. 두 이미지가 모두 표시되는 지역에서는 알파가 혼합됩니다. 하위 스트림 그림이 기본 비디오 이상으로 확장되는 경우 하위 스트림은 알파와 배경색이 혼합됩니다. 이 알파 혼합은 다이어그램의 오른쪽에 있는 변경된 색을 고려합니다.

예제 3: 일치하지 않는 스트림 높이

이전 예제에서는 하위 스트림과 기본 스트림의 높이가 동일합니다. 스트림 이 예제와 같이 높이가 일치하지 않는 경우도 있습니다. 이 예제에서는 배경색(검은색)을 사용하여 비디오가 표시되지 않는 대상 사각형 내의 영역을 그립니다. 원본 및 대상 사각형은 다음 다이어그램에 표시됩니다.

diagram showing mismatched stream heights,

위의 다이어그램은 다음 사각형을 보여 줍니다.

  • 대상 사각형: { 0, 0, 150, 85 }
  • 기본 비디오:
    • 원본 사각형: { 0, 0, 150, 50 }
    • 대상 사각형: { 0, 17, 150, 67 }
  • 하위 스트림:
    • 원본 사각형: { 0, 0, 100, 85 }
    • 대상 사각형: { 25, 0, 125, 85 }

예제 4: 대상 표면보다 작은 대상 사각형

이 예제에서는 대상 사각형이 대상 표면보다 작은 경우를 보여 줍니다.

diagram showing a blit to a destination rectangle.

위의 다이어그램은 다음 사각형을 보여 줍니다.

  • 대상 표면: { 0, 0, 300, 200 }
  • 대상 사각형: { 0, 0, 150, 85 }
  • 기본 비디오:
    • 원본 사각형: { 0, 0, 150, 50 }
    • 대상 사각형: { 0, 17, 150, 67 }
  • 하위 스트림:
    • 원본 사각형: { 0, 0, 100, 85 }
    • 대상 사각형: { 25, 0, 125, 85 }

대상 사각형 외부의 픽셀은 수정되지 않으므로 배경색은 대상 사각형 내에만 나타납니다. 점선 영역은 블릿의 영향을 받지 않는 대상 표면의 일부를 나타냅니다.

예제 5: 원본 사각형

원본 그림보다 작은 원본 사각형을 지정하면 드라이버가 그림의 해당 부분만 블릿됩니다. 이 예제에서 원본 사각형은 기본 비디오 스트림의 오른쪽 아래 사분면과 하위 스트림의 왼쪽 아래 사분면(다이어그램의 해시 표시로 표시됨)을 지정합니다. 대상 사각형은 원본 사각형과 크기가 같으므로 비디오가 늘어나지 않습니다. 원본 및 대상 사각형은 다음 다이어그램에 표시됩니다.

diagram showing a blit from two source rectangles.

위의 다이어그램은 다음 사각형을 보여 줍니다.

  • 대상 사각형: { 0, 0, 720, 576 }
  • 기본 비디오:
    • 원본 표면 크기: { 0, 0, 720, 480 }
    • 원본 사각형: { 360, 240, 720, 480 }
    • 대상 사각형: { 0, 0, 360, 240 }
  • 하위 스트림:
    • 원본 표면 크기: { 0, 0, 640, 576 }
    • 원본 사각형: { 0, 288, 320, 576 }
    • 대상 사각형: { 400, 0, 720, 288 }

예제 6: 대상 사각형 교차

이 예제는 이전 예제와 비슷하지만 대상 사각형이 교차합니다. 표면 차원은 이전 예제와 동일하지만 원본 및 대상 사각형은 그렇지 않습니다. 다시 말하지만, 비디오는 잘렸지만 늘어나지 않습니다. 원본 및 대상 사각형은 다음 다이어그램에 표시됩니다.

diagram showing intersecting destination rectangles.

위의 다이어그램은 다음 사각형을 보여 줍니다.

  • 대상 사각형: { 0, 0, 720, 576 }
  • 기본 비디오:
    • 원본 표면 크기: { 0, 0, 720, 480 }
    • 원본 사각형: { 260, 92, 720, 480 }
    • 대상 사각형: { 0, 0, 460, 388 }
  • 하위 스트림:
    • 원본 표면 크기: { 0, 0, 640, 576 }
    • 원본 사각형: { 0, 0, 460, 388 }
    • 대상 사각형: { 260, 188, 720, 576 }

예제 7: 스트레칭 및 자르기 비디오

이 예제에서는 비디오가 늘고 잘립니다. 각 스트림에서 180개의 × 120개 영역이 확장되어 대상 사각형의 360개 × 240개 영역을 커버합니다.

diagram showing stretching and cropping.

위의 다이어그램은 다음 사각형을 보여 줍니다.

  • 대상 사각형: { 0, 0, 720, 480 }
  • 기본 비디오:
    • 원본 표면 크기: { 0, 0, 360, 240 }
    • 원본 사각형: { 180, 120, 360, 240 }
    • 대상 사각형: { 0, 0, 360, 240 }
  • 하위 스트림:
    • 원본 표면 크기: { 0, 0, 360, 240 }
    • 원본 사각형: { 0, 0, 180, 120 }
    • 대상 사각형: { 360, 240, 720, 480 }

입력 샘플 순서

VideoProcessBlt 메서드의 pSamples 매개 변수는 입력 샘플 배열에 대한 포인터입니다. 기본 비디오 스트림의 샘플이 먼저 나타나고 그 다음에는 하위 스트림 그림이 Z 순서로 표시됩니다. 샘플은 다음 순서대로 배열에 배치해야 합니다.

  • 기본 비디오 스트림에 대한 샘플은 배열에서 먼저 임시 순서로 표시됩니다. 디인터레이스 모드에 따라 드라이버는 기본 비디오 스트림에서 하나 이상의 참조 샘플이 필요할 수 있습니다. DXVA2_VideoProcessorCaps 구조체의 NumForwardRefSamplesNumBackwardRefSamples 멤버는 필요한 정방향 및 뒤로 참조 샘플 수를 지정합니다. 비디오 콘텐츠가 점진적이고 디인터레이싱이 필요하지 않은 경우에도 호출자는 이러한 참조 샘플을 제공해야 합니다. (예를 들어 원본에 인터레이스 및 프로그레시브 프레임이 혼합되어 있는 경우와 같이 프로그레시브 프레임이 디인터레이싱 디바이스에 제공될 때 발생할 수 있습니다.)
  • 기본 비디오 스트림에 대한 샘플 후 배열은 맨 아래에서 위로 Z 순서로 정렬된 최대 15개의 하위 스트림 샘플을 포함할 수 있습니다. 하위 스트림은 항상 점진적이며 참조 그림이 필요하지 않습니다.

언제든지 기본 비디오 스트림은 인터레이스된 콘텐츠와 프로그레시브 콘텐츠 간에 전환할 수 있으며 하위 스트림의 수는 변경될 수 있습니다.

DXVA2_VideoSample 구조체의 SampleFormat.SampleFormat 멤버는 그림의 유형을 나타냅니다. 하위 스트림 그림의 경우 이 값을 DXVA2_SampleSubStream 설정합니다. 점진적 그림의 경우 값은 DXVA2_SampleProgressiveFrame. 인터레이스된 그림의 경우 값은 필드 레이아웃에 따라 달라집니다.

드라이버에 정방향 및 역방향 참조 샘플이 필요한 경우 비디오 시퀀스의 시작 부분에 전체 수의 샘플을 사용할 수 없을 수 있습니다. 이 경우 pSamples 배열에 해당 항목의 항목을 포함하지만 누락된 샘플은 형식이 DXVA2_SampleUnknown 것으로 표시합니다.

DXVA2_VideoSample 구조의 시작 멤버는 각 샘플의 임시 위치를 제공합니다. 이러한 값은 기본 비디오 스트림의 샘플에만 사용됩니다. 하위 스트림 그림의 경우 두 멤버를 모두 0으로 설정합니다.

다음 예제는 이러한 요구 사항을 명확히 하는 데 도움이 될 수 있습니다.

예 1

가장 간단한 사례는 하위 스트림이 없고 디인터레이싱 알고리즘에 참조 샘플이 필요하지 않은 경우에 발생합니다(NumForwardRefSamplesNumBackwardRefSamples 는 모두 0임). Bob 디인터레이싱은 이러한 알고리즘의 예입니다. 이 경우 pSamples 배열은 다음 표와 같이 단일 입력 표면을 포함해야 합니다.

인덱스 Surface 형식 임시 위치
pSamples[0] 인터레이스된 그림입니다. T

 

시간 값 T 는 현재 비디오 프레임의 시작 시간으로 간주됩니다.

예제 2

이 예제에서 애플리케이션은 두 개의 하위 스트림을 기본 스트림과 혼합합니다. 디인터레이싱 알고리즘에는 참조 샘플이 필요하지 않습니다. 다음 표에서는 이러한 샘플이 pSamples 배열에서 정렬되는 방법을 보여 줍니다 .

인덱스 Surface 형식 임시 위치 z 순서
pSamples[0] 인터레이스된 그림 T 0
pSamples[1] 하위 스트림 0 1
pSamples[2] 하위 스트림 0 2

 

예 3

이제 역방향 참조 샘플 하나와 정방향 참조 샘플 1개가 디인터레이싱 알고리즘에 필요하다고 가정합니다. 또한 총 5개의 표면에 대해 두 개의 하위 스트림 그림이 제공됩니다. 올바른 순서는 다음 표에 나와 있습니다.

인덱스 Surface 형식 임시 위치 z 순서
pSamples[0] 인터레이스된 그림(참조) T -1 해당 없음
pSamples[1] 인터레이스된 그림 T 0
pSamples[2] 인터레이스된 그림(참조) T +1 해당 없음
pSamples[3] 하위 스트림 0 1
pSamples[4] 하위 스트림 0 2

 

T -1 시간은 현재 프레임 이전 프레임의 시작 시간이며 T +1은 다음 프레임의 시작 시간입니다.

비디오 스트림이 동일한 디인터레이싱 모드를 사용하여 프로그레시브 콘텐츠로 전환되는 경우 애플리케이션은 다음 표와 같이 동일한 수의 샘플을 제공해야 합니다.

인덱스 Surface 형식 임시 위치 z 순서
pSamples[0] 점진적 그림(참조) T -1 해당 없음
pSamples[1] 점진적 그림 T 0
pSamples[2] 점진적 그림(참조) T +1 해당 없음
pSamples[3] 하위 스트림 0 1
pSamples[4] 하위 스트림 0 2

 

예시 4

비디오 시퀀스가 시작될 때는 앞으로 및 뒤로 참조 샘플을 사용할 수 없을 수 있습니다. 이 경우 누락된 샘플에 대한 항목은 샘플 형식이 DXVA2_SampleUnknown pSamples 배열에 포함됩니다.

디인터레이싱 모드에 1개의 앞으로 및 하나의 역방향 참조 샘플이 필요하다고 가정하면 VideoProcessBlt에 대한 처음 세 번의 호출에는 다음 세 테이블에 표시된 입력 시퀀스가 있습니다.

인덱스 Surface 형식 임시 위치
pSamples[0] 알 수 없음 0
pSamples[1] 알 수 없음 0
pSamples[2] 인터레이스된 그림(참조) T +1

 

인덱스 Surface 형식 임시 위치
pSamples[0] 알 수 없음 0
pSamples[1] 인터레이스된 그림 T
pSamples[2] 인터레이스된 그림(참조) T +1

 

인덱스 Surface 형식 임시 위치
pSamples[0] 인터레이스된 그림 T -1
pSamples[1] 인터레이스된 그림 T
pSamples[2] 인터레이스된 그림(참조) T +1

 

DirectX 비디오 가속 2.0

DXVA2_VideoProc 샘플