4 * USB Camera driver interface.
6 * This file is part of the w32api package.
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
27 #pragma GCC system_header
30 #if !defined(__USB_H) && !defined(__USBDI_H)
31 #error include usb.h or usbdi.h before usbcamdi.h
40 #if defined(_BATTERYCLASS_)
41 #define USBCAMAPI DECLSPEC_EXPORT
43 #define USBCAMAPI DECLSPEC_IMPORT
47 /* FIXME: Unknown definition */
48 typedef PVOID PHW_STREAM_REQUEST_BLOCK
;
50 DEFINE_GUID(GUID_USBCAMD_INTERFACE
,
51 0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5);
53 #define USBCAMD_PROCESSPACKETEX_DropFrame 0x0002
54 #define USBCAMD_PROCESSPACKETEX_NextFrameIsStill 0x0004
55 #define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill 0x0008
57 #define USBCAMD_DATA_PIPE 0x0001
58 #define USBCAMD_MULTIPLEX_PIPE 0x0002
59 #define USBCAMD_SYNC_PIPE 0x0004
60 #define USBCAMD_DONT_CARE_PIPE 0x0008
62 #define USBCAMD_VIDEO_STREAM 0x1
63 #define USBCAMD_STILL_STREAM 0x2
64 #define USBCAMD_VIDEO_STILL_STREAM (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM)
66 #define USBCAMD_STOP_STREAM 0x00000001
67 #define USBCAMD_START_STREAM 0x00000000
69 typedef struct _pipe_config_descriptor
{
70 CHAR StreamAssociation
;
71 UCHAR PipeConfigFlags
;
72 } USBCAMD_Pipe_Config_Descriptor
, *PUSBCAMD_Pipe_Config_Descriptor
;
75 USBCAMD_CamControlFlag_NoVideoRawProcessing
= 1,
76 USBCAMD_CamControlFlag_NoStillRawProcessing
= 2,
77 USBCAMD_CamControlFlag_AssociatedFormat
= 4,
78 USBCAMD_CamControlFlag_EnableDeviceEvents
= 8
79 } USBCAMD_CamControlFlags
;
81 typedef NTSTATUS DDKAPI
82 (*PCAM_ALLOCATE_BW_ROUTINE
)(
83 PDEVICE_OBJECT BusDeviceObject
,
85 PULONG RawFrameLength
,
88 typedef NTSTATUS DDKAPI
89 (*PCAM_ALLOCATE_BW_ROUTINE_EX
)(
90 PDEVICE_OBJECT BusDeviceObject
,
92 PULONG RawFrameLength
,
96 typedef NTSTATUS DDKAPI
97 (*PCAM_CONFIGURE_ROUTINE
)(
98 PDEVICE_OBJECT BusDeviceObject
,
100 PUSBD_INTERFACE_INFORMATION Interface
,
101 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
103 PLONG SyncPipeIndex
);
105 typedef NTSTATUS DDKAPI
106 (*PCAM_CONFIGURE_ROUTINE_EX
)(
107 PDEVICE_OBJECT BusDeviceObject
,
109 PUSBD_INTERFACE_INFORMATION Interface
,
110 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
111 ULONG PipeConfigListSize
,
112 PUSBCAMD_Pipe_Config_Descriptor PipeConfig
,
113 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
115 typedef NTSTATUS DDKAPI
116 (*PCAM_FREE_BW_ROUTINE
)(
117 PDEVICE_OBJECT BusDeviceObject
,
118 PVOID DeviceContext
);
120 typedef NTSTATUS DDKAPI
121 (*PCAM_FREE_BW_ROUTINE_EX
)(
122 PDEVICE_OBJECT BusDeviceObject
,
126 typedef NTSTATUS DDKAPI
127 (*PCAM_INITIALIZE_ROUTINE
)(
128 PDEVICE_OBJECT BusDeviceObject
,
129 PVOID DeviceContext
);
132 (*PCAM_NEW_FRAME_ROUTINE
)(
137 (*PCAM_NEW_FRAME_ROUTINE_EX
)(
143 typedef NTSTATUS DDKAPI
144 (*PCAM_PROCESS_RAW_FRAME_ROUTINE
)(
145 PDEVICE_OBJECT BusDeviceObject
,
150 PVOID RawFrameBuffer
,
151 ULONG RawFrameLength
,
152 ULONG NumberOfPackets
,
153 PULONG BytesReturned
);
155 typedef NTSTATUS DDKAPI
156 (*PCAM_PROCESS_RAW_FRAME_ROUTINE_EX
)(
157 PDEVICE_OBJECT BusDeviceObject
,
162 PVOID RawFrameBuffer
,
163 ULONG RawFrameLength
,
164 ULONG NumberOfPackets
,
165 PULONG BytesReturned
,
166 ULONG ActualRawFrameLength
,
170 (*PCAM_PROCESS_PACKET_ROUTINE
)(
171 PDEVICE_OBJECT BusDeviceObject
,
173 PVOID CurrentFrameContext
,
174 PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket
,
176 PUSBD_ISO_PACKET_DESCRIPTOR DataPacket
,
178 PBOOLEAN FrameComplete
,
179 PBOOLEAN NextFrameIsStill
);
182 (*PCAM_PROCESS_PACKET_ROUTINE_EX
)(
183 PDEVICE_OBJECT BusDeviceObject
,
185 PVOID CurrentFrameContext
,
186 PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket
,
188 PUSBD_ISO_PACKET_DESCRIPTOR DataPacket
,
190 PBOOLEAN FrameComplete
,
192 PULONG ValidDataOffset
);
194 typedef NTSTATUS DDKAPI
195 (*PCAM_STATE_ROUTINE
)(
196 PDEVICE_OBJECT BusDeviceObject
,
197 PVOID DeviceContext
);
199 typedef NTSTATUS DDKAPI
200 (*PCAM_START_CAPTURE_ROUTINE
)(
201 PDEVICE_OBJECT BusDeviceObject
,
202 PVOID DeviceContext
);
204 typedef NTSTATUS DDKAPI
205 (*PCAM_START_CAPTURE_ROUTINE_EX
)(
206 PDEVICE_OBJECT BusDeviceObject
,
210 typedef NTSTATUS DDKAPI
211 (*PCAM_STOP_CAPTURE_ROUTINE
)(
212 PDEVICE_OBJECT BusDeviceObject
,
213 PVOID DeviceContext
);
215 typedef NTSTATUS DDKAPI
216 (*PCAM_STOP_CAPTURE_ROUTINE_EX
)(
217 PDEVICE_OBJECT BusDeviceObject
,
221 typedef struct _USBCAMD_DEVICE_DATA
{
223 PCAM_INITIALIZE_ROUTINE CamInitialize
;
224 PCAM_INITIALIZE_ROUTINE CamUnInitialize
;
225 PCAM_PROCESS_PACKET_ROUTINE CamProcessUSBPacket
;
226 PCAM_NEW_FRAME_ROUTINE CamNewVideoFrame
;
227 PCAM_PROCESS_RAW_FRAME_ROUTINE CamProcessRawVideoFrame
;
228 PCAM_START_CAPTURE_ROUTINE CamStartCapture
;
229 PCAM_STOP_CAPTURE_ROUTINE CamStopCapture
;
230 PCAM_CONFIGURE_ROUTINE CamConfigure
;
231 PCAM_STATE_ROUTINE CamSaveState
;
232 PCAM_STATE_ROUTINE CamRestoreState
;
233 PCAM_ALLOCATE_BW_ROUTINE CamAllocateBandwidth
;
234 PCAM_FREE_BW_ROUTINE CamFreeBandwidth
;
235 } USBCAMD_DEVICE_DATA
, *PUSBCAMD_DEVICE_DATA
;
237 typedef struct _USBCAMD_DEVICE_DATA2
{
239 PCAM_INITIALIZE_ROUTINE CamInitialize
;
240 PCAM_INITIALIZE_ROUTINE CamUnInitialize
;
241 PCAM_PROCESS_PACKET_ROUTINE_EX CamProcessUSBPacketEx
;
242 PCAM_NEW_FRAME_ROUTINE_EX CamNewVideoFrameEx
;
243 PCAM_PROCESS_RAW_FRAME_ROUTINE_EX CamProcessRawVideoFrameEx
;
244 PCAM_START_CAPTURE_ROUTINE_EX CamStartCaptureEx
;
245 PCAM_STOP_CAPTURE_ROUTINE_EX CamStopCaptureEx
;
246 PCAM_CONFIGURE_ROUTINE_EX CamConfigureEx
;
247 PCAM_STATE_ROUTINE CamSaveState
;
248 PCAM_STATE_ROUTINE CamRestoreState
;
249 PCAM_ALLOCATE_BW_ROUTINE_EX CamAllocateBandwidthEx
;
250 PCAM_FREE_BW_ROUTINE_EX CamFreeBandwidthEx
;
251 } USBCAMD_DEVICE_DATA2
, *PUSBCAMD_DEVICE_DATA2
;
256 USBCAMD_InitializeNewInterface(
257 IN PVOID DeviceContext
,
260 IN ULONG CamControlFlag
);
263 (*PCOMMAND_COMPLETE_FUNCTION
)(
265 PVOID CommandContext
,
268 typedef NTSTATUS DDKAPI
269 (*PFNUSBCAMD_BulkReadWrite
)(
270 IN PVOID DeviceContext
,
273 IN ULONG BufferLength
,
274 IN PCOMMAND_COMPLETE_FUNCTION CommandComplete
,
275 IN PVOID CommandContext
);
277 typedef NTSTATUS DDKAPI
278 (*PFNUSBCAMD_SetIsoPipeState
)(
279 IN PVOID DeviceContext
,
280 IN ULONG PipeStateFlags
);
282 typedef NTSTATUS DDKAPI
283 (*PFNUSBCAMD_CancelBulkReadWrite
)(
284 IN PVOID DeviceContext
,
287 typedef NTSTATUS DDKAPI
288 (*PFNUSBCAMD_SetVideoFormat
)(
289 IN PVOID DeviceContext
,
290 IN PHW_STREAM_REQUEST_BLOCK pSrb
);
292 typedef NTSTATUS DDKAPI
293 (*PFNUSBCAMD_WaitOnDeviceEvent
)(
294 IN PVOID DeviceContext
,
297 IN ULONG BufferLength
,
298 IN PCOMMAND_COMPLETE_FUNCTION EventComplete
,
299 IN PVOID EventContext
,
300 IN BOOLEAN LoopBack
);
305 USBCAMD_AdapterReceivePacket(
306 IN PHW_STREAM_REQUEST_BLOCK Srb
,
307 IN PUSBCAMD_DEVICE_DATA DeviceData
,
308 IN PDEVICE_OBJECT
*DeviceObject
,
309 IN BOOLEAN NeedsCompletion
);
314 USBCAMD_ControlVendorCommand(
315 IN PVOID DeviceContext
,
320 IN OUT PULONG BufferLength
,
322 IN PCOMMAND_COMPLETE_FUNCTION CommandComplete
,
323 IN PVOID CommandContext
);
326 (*PADAPTER_RECEIVE_PACKET_ROUTINE
)(
327 IN PHW_STREAM_REQUEST_BLOCK Srb
);
335 ULONG DeviceContextSize
,
336 ULONG FrameContextSize
,
337 PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket
);
342 USBCAMD_GetRegistryKeyValue(
344 IN PWCHAR KeyNameString
,
345 IN ULONG KeyNameStringLength
,
347 IN ULONG DataLength
);
352 USBCAMD_SelectAlternateInterface(
353 IN PVOID DeviceContext
,
354 IN OUT PUSBD_INTERFACE_INFORMATION RequestInterface
);
356 #define USBCAMD_VERSION_200 0x200
358 typedef struct _USBCAMD_INTERFACE
{
360 PFNUSBCAMD_WaitOnDeviceEvent USBCAMD_WaitOnDeviceEvent
;
361 PFNUSBCAMD_BulkReadWrite USBCAMD_BulkReadWrite
;
362 PFNUSBCAMD_SetVideoFormat USBCAMD_SetVideoFormat
;
363 PFNUSBCAMD_SetIsoPipeState USBCAMD_SetIsoPipeState
;
364 PFNUSBCAMD_CancelBulkReadWrite USBCAMD_CancelBulkReadWrite
;
365 } USBCAMD_INTERFACE
, *PUSBCAMD_INTERFACE
;
368 (*PSTREAM_RECEIVE_PACKET
)(
370 IN PVOID DeviceContext
,
371 IN PBOOLEAN Completed
);
373 #if defined(DEBUG_LOG)
378 USBCAMD_Debug_LogEntry(
384 #define ILOGENTRY(sig, info1, info2, info3) \
385 USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
389 #define ILOGENTRY(sig, info1, info2, info3)
391 #endif /* DEBUG_LOG */
399 #endif /* !defined(__USB_H) && !defined(__USBDI_H) */
402 #endif /* __USBCAMDI_H */