핀 중심 AVStream 미니 드라이버는 VRAM에 캡처하기 위해 여러 속성을 지원해야 합니다. 이 섹션에서는 VRAM 처리 전과 중에 미니 드라이버가 수신하는 요청 시퀀스에 대해 설명합니다.
캡처가 시작되기 전에 KS 프록시는 KSPROPERTY_PREFERRED_CAPTURE_SURFACE get-property 요청을 보냅니다. 미니 드라이버는 드라이버가 시스템 메모리나 VRAM 중 어느 곳에 캡처되는지에 따라 다른 값을 반환해야 합니다.
시스템 메모리에 캡처
시스템 메모리에 캡처하려면 KS_CAPTURE_ALLOC_SYSTEM_AGP 반환합니다.
그런 다음 캡처 드라이버는 시스템 메모리 값 형식의 KSPROPERTY_CURRENT_CAPTURE_SURFACE set-property 요청을 받습니다. 캡처 드라이버는 이제 버스 마스터 DMA 디바이스 역할을 하며 데이터를 시스템 메모리에 직접 배치합니다.
이 모드에서 캡처 드라이버는 출력 핀의 AVStrMiniPinProcess 콜백 함수에서 시스템 메모리 버퍼를 받습니다.
핀 프로세스 콜백에서 DMA를 구현하는 방법에 대한 자세한 내용은 AVStream의 패킷 기반 DMA를 참조하세요.
여러 출력 핀(예: 별도의 비디오, 오디오 및 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_SURFACE_INFO의 cbCaptured 멤버를 VRAM 화면에 복사된 바이트 수로 채우십시오. 캡처된 바이트 수로 KSSTREAM_HEADER DataUsed 멤버를 설정하지 마세요. 대신 DataUsed 를 sizeof(VRAM_SURFACE_INFO)로 설정합니다.
캡처 드라이버가 타임스탬핑을 수행하는 경우 PresentationTime, Duration 및 관련된 경우 KSSTREAM_HEADER OptionsFlags를 설정합니다.
KsStreamPointerAdvanceOffsets를 호출하여 모든 클론을 계속 처리하거나 삭제하고 KsStreamPointerDelete를 호출하여 요청을 완료합니다.
WDK(Windows 드라이버 키트) 샘플의 AVSHwS(AVStream 시뮬레이션 하드웨어 샘플 드라이버)에 있는 Capture.cpp 파일의 CCapturePin::P rocessD3DSurface 메서드는 VRAM 지원을 위해 이 콜백을 구현하는 한 가지 방법을 보여 줍니다.