VRAM 캡처 속성

핀 중심 AVStream 미니드라이버가 VRAM에 캡처하려면 여러 속성을 지원해야 합니다. 이 섹션에서는 VRAM 처리 전후에 미니드라이버가 수신하는 요청 시퀀스에 대해 설명합니다.

캡처가 시작되기 전에 KS 프록시는 KSPROPERTY_PREFERRED_CAPTURE_SURFACE get-property 요청을 보냅니다. 미니 드라이버는 드라이버가 시스템 메모리 또는 VRAM에 캡처되는지 여부에 따라 다른 값을 반환해야 합니다.

시스템 메모리에 캡처

시스템 메모리에 캡처하려면 KS_CAPTURE_ALLOC_SYSTEM_AGP 반환합니다.

그런 다음 캡처 드라이버는 시스템 메모리 값 형식의 KSPROPERTY_CURRENT_CAPTURE_SURFACE set-property 요청을 받습니다. 캡처 드라이버는 이제 버스 master DMA 디바이스 역할을 하며 데이터를 시스템 메모리에 직접 배치합니다.

이 모드에서 캡처 드라이버는 출력 핀의 AVStrMiniPinProcess 콜백 함수에서 시스템 메모리 버퍼를 받습니다.

핀 프로세스 콜백에서 DMA를 구현하는 방법에 대한 자세한 내용은 AVStream의 패킷 기반 DMA를 참조하세요.

여러 출력 핀(instance, 별도의 비디오, 오디오 및 VBI 핀)으로 캡처하려면 각 핀이 앞에서 설명한 대로 VRAM 속성 및 처리를 지원해야 합니다. 프록시는 각 핀에 대해 별도의 스레드를 생성합니다.

VRAM에 캡처

드라이버가 VRAM 캡처를 지원하는 경우 KSPROPERTY_PREFERRED_CAPTURE_SURFACE 대한 응답으로 KS_CAPTURE_ALLOC_VRAM 반환합니다.

그런 다음 미니드라이버가 표시 어댑터의 GUID를 쿼리하는 KSPROPERTY_DISPLAY_ADAPTER_GUID get-property 요청을 받습니다.

공급업체에서 제공하는 그래픽 미니포트 드라이버에서 어댑터 GUID를 가져옵니다. DXGK_INTERFACESPECIFICDATA 구조에는 속성 요청에서 반환할 어댑터 GUID가 포함되어 있습니다. 이 구조체는 DXGK(DirectX 그래픽 커널) 하위 시스템에 의해 생성되며 어댑터가 초기화될 때 미니포트 드라이버에 전달됩니다.

핀이 VRAM 전송 및 디스플레이 어댑터 및 다운스트림 필터의 GUID 일치를 지원하는 경우 KS 프록시 모듈이 할당자로 선택됩니다. 프록시는 캡처에 대해 선택한 표면 유형으로 KSPROPERTY_CURRENT_CAPTURE_SURFACE 속성을 설정하여 핀 간의 VRAM 표면 전송 선택에 대해 캡처 핀에 알립니다.

핀이 KS_CAPTURE_ALLOC_VRAM 받으면 VRAM 처리 요청을 수신합니다.

VRAM 처리 요청은 두 부분으로 구성됩니다. 먼저 캡처 드라이버는 KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS get-request를 받습니다. get 처리기는 커널 모드 VRAM 표면 핸들을 포함하는 IRP를 받습니다.

캡처 드라이버 또는 디스플레이 미니포트 드라이버는 VRAM 표면 핸들을 실제 VRAM 물리적 주소에 매핑해야 합니다. VRAM 표면 핸들 은 유효한 상태로 유지되지 않습니다 . 나중에 사용하기 위해 캐시하지 마세요.

속성 요청에 제공된 VRAM_SURFACE_INFO_PROPERTY_S 매핑된 주소를 반환합니다. 캡처 드라이버는 IOCTL을 실행하여 디스플레이 미니포트 드라이버에서 매핑을 요청할 수 있습니다.

둘째, 핀에 처리할 데이터가 있을 때 캡처 필터의 AVStrMiniPinProcess 가 호출됩니다.

이제 미니드라이버가 KsPinGetLeadingEdgeStreamPointer 를 호출하여 이 핀에 대한 선행 에지 스트림 포인터를 획득하고 잠급니다. 이 함수는 KSSTREAM_POINTER 구조체에 대한 포인터를 반환합니다.

이 스트림 포인터 구조에는 KSSTREAM_HEADER 대한 포인터가 포함되어 있습니다.

스트림 헤더의 데이터 멤버에서 VRAM_SURFACE_INFO 구조체에 대한 포인터를 찾습니다.

이 구조체에는 KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS 대한 응답으로 반환된 실제 주소가 포함됩니다. 핸들을 나타내는 hSurface 멤버는 NULL입니다.

캡처 드라이버는 다음을 수행해야 합니다.

  • VRAM 물리적 주소를 사용하여 캡처 하드웨어를 프로그래밍합니다.

  • 비디오 프레임 완성을 처리합니다.

  • vrAM 화면에 복사된 바이트 수로 VRAM_SURFACE_INFO cbCaptured 멤버를 채웁니다. 캡처된 바이트 수로 KSSTREAM_HEADER DataUsed 멤버를 설정하지 마세요. 대신 DataUsed 를 sizeof(VRAM_SURFACE_INFO)로 설정합니다.

  • 캡처 드라이버가 타임스탬프를 수행하는 경우 PresentationTime, Duration 및 관련된 경우 KSSTREAM_HEADER OptionsFlags를 설정합니다.

  • KsStreamPointerAdvanceOffsets를 호출하여 모든 클론을 계속 처리하거나 삭제하고 KsStreamPointerDelete를 호출하여 요청을 완료합니다.

WDK(Windows 드라이버 키트) 샘플의 AVSHwS(AVStream Simulated Hardware Sample Driver)에 있는 Capture.cpp 파일의 CCapturePin::P rocessD3DSurface 메서드는 VRAM 지원을 위해 이 콜백을 구현하는 한 가지 방법을 보여 줍니다.