USBCAMD2 카메라 미니 드라이버는 일반적으로 다음과 같이 작동합니다.
카메라 미니 드라이버는 DriverEntry 루틴에서 USBCAMD_DriverEntry 호출합니다. 미니 드라이버가 USBCAMD_DriverEntry 호출하면 미니 드라이버의 AdapterReceivePacket 콜백 함수를 USBCAMD2 전달됩니다. 그런 다음 USBCAMD2 미니 드라이버를 stream.sys 클래스 드라이버에 등록합니다.
그런 다음, 카메라 미니 드라이버는 다음을 포함하여 처리할 AdapterReceivePacket 콜백 함수에서 다양한 SRB(스트림 요청 블록)를 수신할 수 있습니다.
카메라 미니 드라이버는 각 SRB를 처리하는 방법을 결정합니다. 미니 드라이버는 USBCAMD2 미니 드라이버 라이브러리에서 루틴을 호출하여 SRB 처리를 지원할 수 있습니다. 이러한 루틴은 일반적으로 USBCAMD_ 접두사로 시작합니다.
예를 들어 카메라 미니 드라이버의 다른 콜백 함수를 USBCAMD2 지정하기 위해 카메라 미니 드라이버는 USBCAMD_DEVICE_DATA2 구조에서 진입점을 지정합니다. 그런 다음 미니 드라이버는 USBCAMD_InitializeNewInterface를 호출하여 초기화된 USBCAMD_DEVICE_DATA2 구조를 USBCAMD2로 전달합니다. USBCAMD2 필요한 경우 미니 드라이버의 콜백 함수를 호출합니다.
미니드라이버는 처리하지 않는 모든 SRB를 USBCAMD2가 처리할 수 있도록 USBCAMD_AdapterReceivePacket을 호출해야 합니다.
USBCAMD 라이브러리 콜백 함수는 미니 드라이버가 구현하는 콜백 함수와 선택 사항인지 필수인지에 대해 설명합니다.
다음 절차 목록은 카메라 미니 드라이버로 전송된 SRB에 대한 일반적인 처리 흐름을 보여 줍니다.
미니 드라이버의 SRB_INITIALIZE_DEVICE 처리기
| 구성 요소 |
조치 |
| 카메라 미니 드라이버 |
USBCAMD_InitializeNewInterface를 호출하여 커널 모드에서 비디오 또는 정지 이미지의 원시 처리 요구 사항을 나타내며, 디바이스 이벤트를 활성화하도록 USBCAMD2를 초기화합니다. |
| 카메라 미니 드라이버 |
USBCAMD_AdapterReceivePacket 호출합니다. |
| USBCAMD2 |
USB 디바이스 및 구성 설명자를 가져옵니다. |
| USBCAMD2 |
미니 드라이버의 CamConfigureEx 콜백 함수를 호출합니다. |
| 카메라 미니 드라이버 |
구성을 완료합니다. 대체 설정 및 최대 전송 크기를 선택합니다.
USBCAMD_Pipe_Config_Descriptor 구조체의 배열을 채웁니다. |
| USBCAMD2 |
USBCAMD_Pipe_Config_Descriptor 구조체의 배열을 구문 분석합니다. |
| USBCAMD2 |
미니 드라이버의 CamInitialize 콜백 함수를 호출합니다. |
| 카메라 미니 드라이버 |
초기화를 완료합니다. 디바이스 전원을 설정하고 카메라의 기본 설정을 활성화합니다. |
| USBCAMD2 |
스트림 수와 스트림 설명자 크기를 stream.sys 클래스 드라이버에 제공합니다. |
미니 드라이버의 SRB_GET_STREAM_INFO 처리기
| 구성 요소 |
조치 |
| 카메라 미니 드라이버 |
stream.sys 클래스 드라이버에 HW_STREAM_INFORMATION 스트림 정보 구조를 제공합니다. |
| 카메라 미니 드라이버 |
stream.sys클래스 드라이버의 HW_STREAM_HEADER 구조체 안의 디바이스 속성 집합 배열에 대한 포인터를 채웁니다. |
| 카메라 미니 드라이버 |
USBCAMD_AdapterReceivePacket 호출합니다. |
| USBCAMD2 |
스트림 헤더의 핀 수를 입력합니다. |
| USBCAMD2 |
디바이스 이벤트 테이블(있는 경우)을 노출합니다. |
| USBCAMD2 |
스트림 정보 테이블의 항목 값을 수정합니다. 범주 이름(캡처 또는 정지)을 설정합니다. |
| USBCAMD2 |
스트림 속성 배열에 대한 포인터를 채웁니다. |
미니 드라이버의 SRB_INITIALIZATION_COMPLETE 처리기
| 구성 요소 |
조치 |
| 카메라 미니 드라이버 |
IRP_MJ_PNP 및 IRP_MN_QUERY_INTERFACE를 사용하여 USBCAMD2의 GUID_USBCAMD_INTERFACE를 획득합니다. |
미니 드라이버의 SRB_GET_DEVICE_PROPERTY 처리기
미니 드라이버의 SRB_SET_DEVICE_PROPERTY 처리기
| 구성 요소 |
조치 |
| 카메라 미니 드라이버 |
PROPSETID_VIDCAP_VIDEOPROCAMP, PROPSETID_VIDCAP_CAMERACONTROL 및PROPSETID_VIDCAP_VIDEOCONTROL 매개 변수 및 기타 사용자 지정 속성 집합을 획득하여 카메라 미니 드라이버가 처리하는 속성을 설정합니다. |
미니드라이버의 SRB_GET_DATA_INTERSECTION 핸들러
| 구성 요소 |
조치 |
| 카메라 미니 드라이버 |
KSDATARANGE 구조체에서 KSDATAFORMAT 구조체를 반환합니다. |
| 카메라 미니 드라이버 |
요청된 프레임 속도(VideoInfoHeader.AvgTimePerFrame)가 요청된 비디오 형식의 상한 및 하한 내에 있는지 확인합니다. 제한을 초과하는 경우, 미니드라이버는 pSrb>-CommandData.IntersectInfo>-Datarange: VideoInfoHeader.AvgTimePerFrame와 VideoInfoHeader.dwBitRate에서 다음 값을 수정해야 합니다. |
미니 드라이버의 SRB_OPEN_STREAM 처리기
| 구성 요소 |
조치 |
| 카메라 미니 드라이버 |
비디오 형식을 확인합니다. |
| 카메라 미니 드라이버 |
USBCAMD_AdapterReceivePacket 호출합니다. |
| USBCAMD2 |
카메라 미니 드라이버에서 허용하는 비디오 형식을 저장합니다. |
| USBCAMD2 |
미니 드라이버의 CamAllocateBandwidthEx 콜백 함수를 호출하여 비디오 형식 데이터를 기반으로 대역폭을 할당하고 비디오 형식의 최대 버퍼 크기를 가져옵니다. |
| 카메라 미니 드라이버 |
요청된 프레임 속도 및 출력 창 크기를 충족하는 등시 채널의 최대 패킷 크기를 계산합니다. |
| 카메라 미니 드라이버 |
USBCAMD_SelectAlternateInterface 호출하여 가장 가까운 대체 설정을 선택합니다. 미니 드라이버는 카메라에서 생성할 수 있는 최대 프레임 크기로 USBCAMD2 제공해야 합니다. |
| 카메라 미니 드라이버 |
카메라에서 하드웨어 크기 조정을 설정합니다. 카메라 컨트롤을 레지스트리의 저장된 값으로 설정하거나, 처음인 경우 기본 설정으로 설정합니다. |
| 카메라 미니 드라이버 |
프레임 속도(VideoInfoHeader.AvgTimePerFrame)가 비디오 형식의 한도 내에 속하는지 확인하고, 그렇지 않은 경우 수정합니다. |
| USBCAMD2 |
미니 드라이버의 CamStartCaptureEx 콜백 함수를 호출합니다. |
| 카메라 미니 드라이버 |
하드웨어를 캡처 모드로 설정합니다. |
| USBCAMD2 |
등시 전송 또는 대량 전송을 초기화합니다. |
미니 드라이버의 SRB_CLOSE_STREAM 처리기
| 구성 요소 |
조치 |
| 카메라 미니 드라이버 |
USBCAMD_AdapterReceivePacket 호출합니다. |
| USBCAMD2 |
USBCAMD2 제출된 보류 중인 IRP를 취소합니다. 보류 중인 모든 데이터 SRB를 stream.sys 클래스 드라이버로 반환합니다. |
| USBCAMD2 |
미니 드라이버의 CamStopCaptureEx 콜백 함수를 호출합니다. |
| 카메라 미니 드라이버 |
카메라에 정지 캡처 명령을 보냅니다. |
| USBCAMD2 |
해당하는 경우 미니 드라이버의 CamFreeBandwidthEx 콜백 함수를 호출하여 등시 버스 대역폭을 해제합니다. |
| 카메라 미니 드라이버 |
유휴 대체 설정을 선택합니다. |
| USBCAMD2 |
USB 파이프와 연결된 무료 리소스입니다. |
미니 드라이버의 SRB_UNINITIALIZE_DEVICE 처리기
미니 드라이버의 SRB_SURPRISE_REMOVAL 처리기
| 구성 요소 |
조치 |
| 카메라 미니 드라이버 |
새 비디오 형식을 확인합니다. |
| 카메라 미니 드라이버 |
USBCAMD_SetVideoFormat 호출합니다. |
| USBCAMD2 |
연결된 스트림 확장을 사용하여 새 형식을 저장합니다. |
미니드라이버의 SRB_CHANGE_POWER_STATE 핸들러: 전원 켜짐에서 전원 꺼짐으로 전환
미니드라이버의 SRB_CHANGE_POWER_STATE가 Power OFF에서 Power ON으로 전환되는 처리기