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 지원을 위해 이 콜백을 구현하는 한 가지 방법을 보여 줍니다.