Share via


DirectX 비디오 가속 사용

[이 페이지와 연결된 기능인 Windows Media Format 11 SDK는 레거시 기능입니다. 원본 판독기 및 싱크 작성기에 의해 대체되었습니다. 원본 판독기 및 싱크 작성기는 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 Windows Media Format 11 SDK 대신 소스 판독기 및 싱크 작성기를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

이 섹션에서는 사용자 지정 플레이어에서 스트리밍된 콘텐츠를 재생할 때 Microsoft® DirectX® 비디오 가속을 사용하도록 설정하는 방법을 설명합니다.

배경

DirectX VA(DirectX Video Acceleration)는 2차원 디코딩 작업의 하드웨어 가속을 위한 API 사양입니다. 이를 통해 소프트웨어 디코더가 특정 CPU 집약적 작업을 처리를 위한 그래픽 카드 오프로드할 수 있습니다. 최종 사용자의 경우 DirectX VA 호환 그래픽 카드가 장착된 이전 컴퓨터에서 전체 화면 DVD 재생과 같은 고비트 속도 비디오를 사용할 수 있습니다.

Windows Media Format 9 시리즈 SDK부터 DMO 래퍼 필터는 DirectX VA를 지원합니다. 즉, 로컬 재생의 경우 애플리케이션은 WM ASF 판독기 필터를 사용하여 Windows 미디어 기반 콘텐츠를 재생할 수 있으며 그래픽 카드 지원하는 경우 DirectX VA 하드웨어 가속이 자동으로 호출됩니다. 그러나 WM ASF 판독기 필터는 스트리밍된 콘텐츠의 재생을 지원하지 않습니다. 따라서 사용자 지정 플레이어에서 스트리밍 콘텐츠를 재생할 때 DirectX VA를 지원하려면 Windows Media 9 시리즈부터 Windows 미디어 플레이어 사용하는 대체 메커니즘을 사용해야 합니다.

Windows 미디어 플레이어 QASF 필터가 개발되기 전에 설계되었으므로 Windows 미디어 플레이어 Windows 미디어 기반 콘텐츠를 재생하기 위해 Windows Media Format SDK를 기반으로 하는 자체 소스 필터가 있습니다. WMP Windows 미디어 원본 필터는 압축 해제된 데이터를 오디오 및 비디오 렌더러에 직접 전달합니다. 반면, WM ASF 판독기는 DMO 래퍼 내에서 호스트되는 Windows Media 디코더 DMO(DirectX Media Objects)에 압축된 콘텐츠 다운스트림을 제공합니다. 다음 다이어그램에서는 WM ASF 판독기와 WMP Windows 미디어 원본 필터 간의 차이점을 보여 줍니다.

사용자 지정 소스 필터 출력 압축되지 않은 샘플

qasf 원본 필터 출력 압축 샘플

스트리밍된 콘텐츠에 DirectX VA를 사용하도록 설정하려면 위쪽 다이어그램에 있는 것과 같은 사용자 지정 원본 필터를 만들어야 합니다. 기본적으로 이 필터는 Windows Media Format SDK를 사용하여 WM Reader 개체를 인스턴스화하고, 샘플을 압축 해제하고, 출력 핀에서 다운스트림으로 보냅니다. 이 설명에서는 원본 필터를 이미 만들었으며 이제 DirectX VA 지원을 구현할 준비가 되었다고 가정합니다.

DirectX VA를 사용하도록 설정하려면 원본 필터의 기본 작업은 Video Renderer 및 WMV 디코더 DMO에 DirectX VA 연결을 협상하는 데 필요한 인터페이스를 제공하는 것입니다. 원본 필터는 이러한 협상에 참여하지 않습니다. 스트리밍이 시작된 후 원본 필터가 수행할 수 있는 유일한 DirectX VA 관련 작업은 WMV 디코더가 비디오 렌더러에 전달하기 전에 비디오 샘플의 타임스탬프를 수정하는 것입니다. 이 작업을 수행하는 주된 이유는 표준 DirectShow® 인터페이스에서 사용할 수 있는 것 이상으로 사용자 지정 타임라인 제어를 제공하기 위해서입니다.

Windows Media Format SDK, 플레이어의 원본 필터, Windows Media 비디오 디코더 DMO 및 오버레이 믹서 또는 비디오 믹싱 렌더러 간에 필요한 통신을 사용하도록 세 가지 인터페이스가 정의됩니다. 이러한 인터페이스는 다음 표에 설명되어 있습니다.

인터페이스 설명
IWMCodecAMVideoAccelerator Windows Media 디코더 DMO에 의해 노출되고 미디어 플레이어의 원본 필터에 의해 호출되어 Windows Media Video 콘텐츠의 디코딩에 DirectX VA를 사용하도록 설정하는 데 필요한 다양한 연결을 설정합니다.
IWMPlayerTimestampHook 플레이어의 원본 필터에서 구현됩니다. 이를 통해 필터는 비디오 샘플의 타임스탬프를 다운스트림으로 전달하기 전에 수정할 수 있습니다.
IWMReaderAccelerator WM Reader 개체에 구현됩니다. 디코더 DMO에서 인터페이스를 가져오기 위해 플레이어 소스 필터에서 호출됩니다.

 

DirectX VA 사용 재생의 작업 순서

이 섹션에서는 DirectX VA 사용 플레이어 및 원본 필터에 대한 런타임 시 작업의 일반적인 순서에 대해 설명합니다. 이 섹션에서 참조하는 구성 요소는 다음과 같습니다.

  • 타사 미디어 플레이어(플레이어라고 함).
  • 플레이어가 인스턴스화한 사용자 지정 원본 필터로, Windows Media Format SDK를 사용하여 Windows 미디어 기반 콘텐츠를 압축 해제합니다.
  • 플레이어 원본 필터의 비디오 출력 핀(출력 핀이라고 함)입니다.
  • DirectShow 비디오 재생 필터 그래프(그래프라고 함).
  • VMR이라고 하는 비디오 혼합 렌더러입니다.
  • 읽기 권한자라고 하는 Windows Media Format SDK 비동기 Reader 개체입니다.
  • 디코더 DMO라고 하는 Windows Media Video Decoder DirectX Media 개체입니다.

작업의 순서는 다음과 같습니다.

  1. 플레이어는 원본 필터 및 판독기 개체를 인스턴스화합니다. 판독기는 비디오 디코더 DMO를 만들고 (압축된) 입력 형식을 설정합니다. SDK와 디코더 DMO가 그래프를 사용하여 협상 프로세스에 참여해야 하고 DMO가 9단계 동안 입력 형식을 알고 있어야 하므로 플레이어가 비디오 재생 그래프를 구성하기 전에 이 문제가 발생해야 합니다.
  2. 플레이어는 IGraphBuilder::Render를 호출하여 비디오 소스 필터의 출력 핀을 제공합니다. 이 시점에서 DirectShow 필터 그래프 관리자는 VMR을 플레이어의 비디오 원본 필터에 연결하려고 합니다.
  3. 필터 그래프 관리자는 플레이어의 비디오 소스 필터의 출력 핀에서 IPin::Connect 를 호출합니다.

4~10단계는 IPin::Connect 내에서 발생합니다.

  1. 원본 필터는 판독기의 IWMReaderAccelerator::GetCodecInterface 메서드에서 IWMCodecAMVideoAccelerator 인터페이스를 가져옵니다. 코덱이 DirectX VA를 지원하지 않는 경우 GetCodecInterface 호출이 실패할 수 있습니다. 이 경우 DirectX VA 지원 없이 협상이 평소와 같이 진행됩니다.

  2. 원본 필터는 IWMCodecAMVideoAccelerator::SetAcceleratorInterface를 통해 디코더 DMO에 연결에 전달된 핀에서 IAMVideoAccelerator 포인터를 전달합니다.

  3. 그런 다음 원본 필터는 IPin::Connect 작업의 나머지 부분을 CBaseOutputPin::Connect 메서드에 위임합니다. SDK의 형식 열거형은 현재와 같이 진행됩니다. 코덱이 연결되는 콘텐츠에 대해 DirectX VA를 지원하는 경우 코덱 DMO는 지원되는 YUV 및 RGB 형식 이전에 해당 DirectX VA 하위 형식을 먼저 제공합니다. DirectX VA 지원을 사용할 수 있는 경우 DirectX VA 하위 형식의 컨텍스트에서 7~11단계가 시도됩니다. 다음 코드 조각은 DirectX VA 미디어 하위 형식을 식별하는 방법을 보여줍니다.

    bool IsDXVASubtype( AM_MEDIA_TYPE * pmt )
    {
        // All DXVA types have the same last 3 DWORDs.
        // guidDXVA is the base GUID for all DXVA subtypes.
    
        GUID guidDXVA = { 0x00000000, 0xa0c7, 0x11d3, { 0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5 } };
    
        unsigned long const * plguid;
        unsigned long const * plguidDXVA;
        plguid = (unsigned long const *)&pmt->subtype;
        plguidDXVA = (unsigned long *)&guidDXVA;
    
        if( ( plguid[1] == plguidDXVA[1] ) &&
            ( plguid[2] == plguidDXVA[2] ) &&
            ( plguid[3] == plguidDXVA[3] ) )
        {
            return true;
        }
    
        return false;
    }
    
    
  4. CBaseOutputPin::Connect 구현은 3단계 동안 IPin::CompleteConnect를 호출합니다. DirectX VA 하위 형식을 고려하는 경우 DirectX VA 협상이 시도됩니다. 출력 핀은 IWMCodecAMVideoAccelerator::NegotiateConnection을 호출하여 현재 출력 미디어 형식을 전달합니다.

  5. 디코더 DMO는 IAMVideoAccelerator 인터페이스를 통해 VMR과 필요한 협상을 수행하고 두 가지가 합의한 비디오 하위 형식 GUID를 반환합니다. 출력 핀은 이 프로세스 중에 수신된 모든 IAMVideoAcceleratorNotify 호출을 디코더 DMO의 IAMVideoAcceleratorNotify 인터페이스에 위임합니다. 이 호출은 IWMReaderAccelerator::GetCodecInterface 메서드를 통해서도 가져올 수 있습니다.

  6. NegotiateConnection이 성공하면 출력 핀은 IWMPlayerTimestampHook 인터페이스를 사용하여 IWMCodecAMVideoAccelerator::SetPlayerNotify를 호출합니다. 이 후크를 사용하면 소스 필터가 렌더러에 전달되기 전에 샘플의 타임스탬프를 업데이트할 수 있습니다.

  7. 소스 필터는 협상된 미디어 형식으로 IWMReaderAccelerator::Notify 를 호출합니다. 이렇게 하면 판독기가 내부 변수를 업데이트하고 DirectX VA에 커밋할 수 있습니다. 코덱 또는 판독기가 실패할 수 있는 마지막 위치입니다. 위의 단계 중 하나라도 실패하면 원본 필터가 3단계로 돌아가 판독기에서 열거한 다음 형식을 시도해야 합니다.

  8. 재생이 시작됩니다. 연결 출력 형식이 DirectX VA인 경우 판독기는 디코더 DMO에서 출력 버퍼를 무시합니다.

  9. IPin::D isconnect가 발생하면 원본 필터는 NULL을 사용하여 IWMCodecAMVideoAccelerator::SetAcceleratorInterface를 호출합니다. 이렇게 하면 코덱과 렌더러 간의 DirectX VA 연결이 끊어집니다.

ASF 파일 읽기