다음을 통해 공유


User-Mode 구성 요소에서 Deinterlace DDI 호출

VMR과 같은 사용자 모드 구성 요소는 디인터레이싱 DDI에 대한 호출을 시작합니다.

VMR이 비디오 콘텐츠에서 프레임 속도 변환을 해제하고 수행할 수 있도록 디스플레이 드라이버는 DD_MOTIONCOMPCALLBACKS 구조체의 멤버에 의해 정의된 동작 보정 콜백 함수를 구현해야 합니다.

드라이버 작성기는 드라이버 개발을 간소화하기 위해 동작 보정 코드 템플릿을 사용하고 탈 인터레이싱 샘플 함수를 구현할 수 있습니다. 동작 보정 템플릿은 디인터레이싱 샘플 함수를 호출하여 비디오 콘텐츠에서 탈지정 및 프레임 속도 변환을 수행합니다. 동작 보정 템플릿 사용에 대한 자세한 내용은 DirectX VA 디바이스에 대한 예제 코드를 참조하세요.

다음 단계에서는 VMR이 deinterlace DDI에 대한 호출을 시작하는 방법을 설명합니다.

  1. VMR이 필터 그래프에 추가되면 드라이버에서 제공하는 DdMoCompGetGuids 콜백 함수에 대한 호출을 시작하여 드라이버에서 지원하는 디바이스 목록을 검색합니다. DD_MOTIONCOMPCALLBACKS 구조체의 GetMoCompGuids 멤버는 이 콜백 함수를 가리킵니다. 필터 그래프에 대한 자세한 내용은 KS Minidriver 아키텍처를 참조하세요.

  2. 디인터레이스 컨테이너 디바이스 GUID가 있는 경우 VMR은 DdMoCompCreate 콜백 함수에 대한 호출을 시작하여 디바이스의 instance 만듭니다. DD_MOTIONCOMPCALLBACKS CreateMoComp 멤버는 콜백 함수를 가리킵니다. DdMoCompCreate 호출에서 컨테이너 디바이스 GUID에 대한 포인터는 DD_CREATEMOCOMPDATA 구조체의 lpGuid 멤버에 지정됩니다. 컨테이너 디바이스 GUID는 다음과 같이 정의됩니다.

    DEFINE_GUID(DXVA_DeinterlaceContainerDevice, 0x0e85cb93,0x3046,0x4ff0,0xae,0xcc,0xd5,0x8c,0xb5,0xf0,0x35,0xfd);
    
  3. VMR은 특정 입력 비디오 형식에 대해 사용 가능한 디인터레이싱 또는 프레임 속도 변환 모드를 결정하기 위해 드라이버 제공 DdMoCompRender 콜백 함수에 대한 호출을 시작합니다. DD_MOTIONCOMPCALLBACKSRenderMoComp 멤버는 콜백 함수를 가리킵니다. DdMoCompRender 호출에서 DXVA_ProcAmpControlQueryCapsFnCode 상수(dxva.h에 정의됨)는 DD_RENDERMOCOMPDATA 구조체의 dwFunction 멤버에 설정됩니다. DD_RENDERMOCOMPDATA lpInputData 멤버는 완료된 DXVA_VideoDesc 구조를 가리켜 입력 매개 변수를 드라이버에 전달합니다. 드라이버는 DD_RENDERMOCOMPDATA lpOutputData 멤버를 통해 출력을 반환합니다. lpOutputDataDXVA_DeinterlaceQueryAvailableModes 구조를 가리킵니다.

    드라이버가 DeinterlaceQueryAvailableModes 샘플 함수를 구현하는 경우 DdMoCompRender 콜백 함수는 DeinterlaceQueryAvailableModes를 호출합니다.

  4. 드라이버에서 지원하는 각 deinterlace 모드에 대해 VMR은 드라이버 제공 DdMoCompRender콜백 함수에 대한 호출을 시작합니다. DdMoCompRender 호출에서 DXVA_DeinterlaceQueryModeCapsFnCode 상수(dxva.h에 정의됨)는 DD_RENDERMOCOMPDATA dwFunction 멤버에 설정됩니다. DD_RENDERMOCOMPDATA lpInputData 멤버는 완성된 DXVA_DeinterlaceQueryModeCaps 구조를 가리켜 입력 매개 변수를 드라이버에 전달합니다. 드라이버는 DD_RENDERMOCOMPDATA lpOutputData 멤버를 통해 출력을 반환합니다. lpOutputDataDXVA_DeinterlaceCaps 구조를 가리킵니다.

    드라이버가 DeinterlaceQueryModeCaps 샘플 함수를 구현하는 경우 DdMoCompRender 콜백 함수는 DeinterlaceQueryModeCaps를 호출합니다.

  5. VMR이 특정 deinterlace 모드(예: bob deinterlacing)의 탈지정 기능을 결정한 후 DdMoCompCreate에 대한 호출을 시작하여 deinterlace 모드 디바이스(예: deinterlace bob 디바이스)의 instance 만듭니다. DdMoCompCreate 호출에서 deinterlace 모드 디바이스 GUID에 대한 포인터가 DD_CREATEMOCOMPDATA lpGuid 멤버에 지정됩니다. deinterlace bob 디바이스 GUID는 다음과 같이 정의됩니다.

    DEFINE_GUID(DXVAp_DeinterlaceBobDevice, 0x335aa36e,0x7884,0x43a4,0x9c,0x91,0x7f,0x87,0xfa,0xf3,0xe3,0x7e);
    

    드라이버가 DeinterlaceOpenStream 샘플 함수를 구현하는 경우 DdMoCompCreate 콜백 함수는 DeinterlaceOpenStream을 호출합니다.

  6. 각 디인터레이싱 작업에 대해 VMR은 드라이버 제공 DdMoCompRender 콜백 함수에 대한 호출을 시작합니다. DdMoCompRender 호출에서 DXVA_ProcAmpControlQueryCapsFnCode 상수(dxva.h에 정의됨)는 DD_RENDERMOCOMPDATA dwFunction 멤버에 설정됩니다. DD_RENDERMOCOMPDATA lpBufferInfo 멤버는 대상 표면과 각 입력 비디오 소스 샘플을 설명하는 버퍼 배열을 가리킵니다. DD_RENDERMOCOMPDATA lpInputData 멤버는 완료된 DXVA_DeinterlaceBlt 구조를 가리켜 입력 매개 변수를 드라이버에 전달합니다. 드라이버는 출력을 반환하지 않습니다. 즉, DD_RENDERMOCOMPDATA lpOutputData 멤버가 NULL입니다.

    드라이버가 DeinterlaceBlt 샘플 함수를 구현하는 경우 DdMoCompRender 콜백 함수는 DeinterlaceBlt를 호출합니다.

  7. 각 조합 디인터레이싱 및 하위 스트림 구성 작업에 대해 Microsoft Windows Server 2003 SP1 이상 및 Windows XP SP2의 VMR은 드라이버 제공 DdMoCompRender 콜백 함수에 대한 호출을 시작합니다. DdMoCompRender 호출에서 DXVA_DeinterlaceBltExFnCode 상수(dxva.h에 정의됨)는 DD_RENDERMOCOMPDATA dwFunction 멤버에 설정됩니다. DD_RENDERMOCOMPDATA lpBufferInfo 멤버는 각 입력 비디오 소스 샘플의 대상 표면과 표면을 설명하는 버퍼 배열을 가리킵니다. DD_RENDERMOCOMPDATA lpInputData 멤버는 완료된 DXVA_DeinterlaceBltEx 구조를 가리켜 입력 매개 변수를 드라이버에 전달합니다. 드라이버는 출력을 반환하지 않습니다. 즉, DD_RENDERMOCOMPDATA lpOutputData 멤버가 NULL입니다.

    드라이버가 DeinterlaceBltEx 샘플 함수를 구현하는 경우 DdMoCompRender 콜백 함수는 DeinterlaceBltEx를 호출합니다.

  8. VMR이 더 이상 디인터레이스 작업을 수행할 필요가 없는 경우 드라이버 제공 DdMoCompDestroy 콜백 함수가 호출됩니다. DD_MOTIONCOMPCALLBACKS DestroyMoComp 멤버는 콜백 함수를 가리킵니다.

    드라이버가 DeinterlaceCloseStream 샘플 함수를 구현하는 경우 DdMoCompDestroy 콜백 함수 는 DeinterlaceCloseStream을 호출합니다.

  9. 그런 다음 드라이버는 디인터레이스 모드 디바이스에서 사용하는 모든 리소스를 해제합니다.