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.
29 #if defined(_BATTERYCLASS_)
32 #define USBCAMAPI DECLSPEC_IMPORT
35 typedef struct _pipe_config_descriptor
{
36 CHAR StreamAssociation
;
37 UCHAR PipeConfigFlags
;
38 } USBCAMD_Pipe_Config_Descriptor
, *PUSBCAMD_Pipe_Config_Descriptor
;
40 #define USBCAMD_DATA_PIPE 0x0001
41 #define USBCAMD_MULTIPLEX_PIPE 0x0002
42 #define USBCAMD_SYNC_PIPE 0x0004
43 #define USBCAMD_DONT_CARE_PIPE 0x0008
45 #define USBCAMD_VIDEO_STREAM 0x1
46 #define USBCAMD_STILL_STREAM 0x2
47 #define USBCAMD_VIDEO_STILL_STREAM (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM)
49 #define USBCAMD_PROCESSPACKETEX_DropFrame 0x0002
50 #define USBCAMD_PROCESSPACKETEX_NextFrameIsStill 0x0004
51 #define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill 0x0008
53 #define USBCAMD_STOP_STREAM 0x00000001
54 #define USBCAMD_START_STREAM 0x00000000
57 USBCAMD_CamControlFlag_NoVideoRawProcessing
= 1,
58 USBCAMD_CamControlFlag_NoStillRawProcessing
= 2,
59 USBCAMD_CamControlFlag_AssociatedFormat
= 4,
60 USBCAMD_CamControlFlag_EnableDeviceEvents
= 8
61 } USBCAMD_CamControlFlags
;
64 (NTAPI
*PCOMMAND_COMPLETE_FUNCTION
)(
65 IN PVOID DeviceContext
,
66 IN OUT PVOID CommandContext
,
67 IN NTSTATUS NtStatus
);
70 (NTAPI
*PSTREAM_RECEIVE_PACKET
)(
72 IN PVOID DeviceContext
,
73 IN PBOOLEAN Completed
);
76 (NTAPI
*PCAM_INITIALIZE_ROUTINE
)(
77 PDEVICE_OBJECT BusDeviceObject
,
81 (NTAPI
*PCAM_CONFIGURE_ROUTINE
)(
82 IN PDEVICE_OBJECT BusDeviceObject
,
83 IN PVOID DeviceContext
,
84 IN PUSBD_INTERFACE_INFORMATION Interface
,
85 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
86 IN PLONG DataPipeIndex
,
87 IN PLONG SyncPipeIndex
);
90 (NTAPI
*PCAM_CONFIGURE_ROUTINE_EX
)(
91 IN PDEVICE_OBJECT BusDeviceObject
,
92 IN PVOID DeviceContext
,
93 IN PUSBD_INTERFACE_INFORMATION Interface
,
94 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
95 IN ULONG PipeConfigListSize
,
96 IN PUSBCAMD_Pipe_Config_Descriptor PipeConfig
,
97 IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
100 (NTAPI
*PCAM_START_CAPTURE_ROUTINE
)(
101 IN PDEVICE_OBJECT BusDeviceObject
,
102 IN PVOID DeviceContext
);
105 (NTAPI
*PCAM_START_CAPTURE_ROUTINE_EX
)(
106 IN PDEVICE_OBJECT BusDeviceObject
,
107 IN PVOID DeviceContext
,
108 IN ULONG StreamNumber
);
111 (NTAPI
*PCAM_ALLOCATE_BW_ROUTINE
)(
112 IN PDEVICE_OBJECT BusDeviceObject
,
113 IN PVOID DeviceContext
,
114 IN PULONG RawFrameLength
,
118 (NTAPI
*PCAM_ALLOCATE_BW_ROUTINE_EX
)(
119 IN PDEVICE_OBJECT BusDeviceObject
,
120 IN PVOID DeviceContext
,
121 IN PULONG RawFrameLength
,
123 IN ULONG StreamNumber
);
126 (NTAPI
*PCAM_FREE_BW_ROUTINE
)(
127 IN PDEVICE_OBJECT BusDeviceObject
,
128 IN PVOID DeviceContext
);
131 (NTAPI
*PCAM_FREE_BW_ROUTINE_EX
)(
132 IN PDEVICE_OBJECT BusDeviceObject
,
133 IN PVOID DeviceContext
,
134 IN ULONG StreamNumber
);
137 (NTAPI
*PADAPTER_RECEIVE_PACKET_ROUTINE
)(
138 IN OUT PHW_STREAM_REQUEST_BLOCK Srb
);
141 (NTAPI
*PCAM_STOP_CAPTURE_ROUTINE
)(
142 IN PDEVICE_OBJECT BusDeviceObject
,
143 IN PVOID DeviceContext
);
146 (NTAPI
*PCAM_STOP_CAPTURE_ROUTINE_EX
)(
147 IN PDEVICE_OBJECT BusDeviceObject
,
148 IN PVOID DeviceContext
,
149 IN ULONG StreamNumber
);
152 (NTAPI
*PCAM_PROCESS_PACKET_ROUTINE
)(
153 IN PDEVICE_OBJECT BusDeviceObject
,
154 IN PVOID DeviceContext
,
155 IN PVOID CurrentFrameContext
,
156 IN PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket OPTIONAL
,
157 IN PVOID SyncBuffer OPTIONAL
,
158 IN PUSBD_ISO_PACKET_DESCRIPTOR DataPacket OPTIONAL
,
159 IN OUT PVOID DataBuffer
,
160 OUT PBOOLEAN FrameComplete
,
161 OUT PBOOLEAN NextFrameIsStill
);
164 (NTAPI
*PCAM_PROCESS_PACKET_ROUTINE_EX
)(
165 IN PDEVICE_OBJECT BusDeviceObject
,
166 IN PVOID DeviceContext
,
167 IN PVOID CurrentFrameContext
,
168 IN PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket OPTIONAL
,
169 IN PVOID SyncBuffer OPTIONAL
,
170 IN PUSBD_ISO_PACKET_DESCRIPTOR DataPacket OPTIONAL
,
171 IN OUT PVOID DataBuffer
,
172 OUT PBOOLEAN FrameComplete
,
173 OUT PULONG PacketFlag
,
174 OUT PULONG ValidDataOffset
);
177 (NTAPI
*PCAM_NEW_FRAME_ROUTINE
)(
178 IN PVOID DeviceContext
,
179 IN PVOID FrameContext
);
182 (NTAPI
*PCAM_NEW_FRAME_ROUTINE_EX
)(
183 IN PVOID DeviceContext
,
184 IN PVOID FrameContext
,
185 IN ULONG StreamNumber
,
186 OUT PULONG FrameLength
);
189 (NTAPI
*PCAM_PROCESS_RAW_FRAME_ROUTINE
)(
190 IN PDEVICE_OBJECT BusDeviceObject
,
191 IN PVOID DeviceContext
,
192 IN PVOID FrameContext
,
193 IN PVOID FrameBuffer
,
194 IN ULONG FrameLength
,
195 OUT PVOID RawFrameBuffer
,
196 IN ULONG RawFrameLength
,
197 IN ULONG NumberOfPackets
,
198 OUT PULONG BytesReturned
);
201 (NTAPI
*PCAM_PROCESS_RAW_FRAME_ROUTINE_EX
)(
202 IN PDEVICE_OBJECT BusDeviceObject
,
203 IN PVOID DeviceContext
,
204 IN PVOID FrameContext
,
205 IN PVOID FrameBuffer
,
206 IN ULONG FrameLength
,
207 OUT PVOID RawFrameBuffer
,
208 IN ULONG RawFrameLength
,
209 IN ULONG NumberOfPackets
,
210 OUT PULONG BytesReturned
,
211 IN ULONG ActualRawFrameLength
,
212 IN ULONG StreamNumber
);
215 (NTAPI
*PCAM_STATE_ROUTINE
)(
216 IN PDEVICE_OBJECT BusDeviceObject
,
217 IN PVOID DeviceContext
);
219 #if defined(DEBUG_LOG)
224 USBCAMD_Debug_LogEntry(
230 #define ILOGENTRY(sig, info1, info2, info3) \
231 USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
235 #define ILOGENTRY(sig, info1, info2, info3)
237 #endif /* DEBUG_LOG */
239 typedef struct _USBCAMD_DEVICE_DATA
{
241 PCAM_INITIALIZE_ROUTINE CamInitialize
;
242 PCAM_INITIALIZE_ROUTINE CamUnInitialize
;
243 PCAM_PROCESS_PACKET_ROUTINE CamProcessUSBPacket
;
244 PCAM_NEW_FRAME_ROUTINE CamNewVideoFrame
;
245 PCAM_PROCESS_RAW_FRAME_ROUTINE CamProcessRawVideoFrame
;
246 PCAM_START_CAPTURE_ROUTINE CamStartCapture
;
247 PCAM_STOP_CAPTURE_ROUTINE CamStopCapture
;
248 PCAM_CONFIGURE_ROUTINE CamConfigure
;
249 PCAM_STATE_ROUTINE CamSaveState
;
250 PCAM_STATE_ROUTINE CamRestoreState
;
251 PCAM_ALLOCATE_BW_ROUTINE CamAllocateBandwidth
;
252 PCAM_FREE_BW_ROUTINE CamFreeBandwidth
;
253 } USBCAMD_DEVICE_DATA
, *PUSBCAMD_DEVICE_DATA
;
255 typedef struct _USBCAMD_DEVICE_DATA2
{
257 PCAM_INITIALIZE_ROUTINE CamInitialize
;
258 PCAM_INITIALIZE_ROUTINE CamUnInitialize
;
259 PCAM_PROCESS_PACKET_ROUTINE_EX CamProcessUSBPacketEx
;
260 PCAM_NEW_FRAME_ROUTINE_EX CamNewVideoFrameEx
;
261 PCAM_PROCESS_RAW_FRAME_ROUTINE_EX CamProcessRawVideoFrameEx
;
262 PCAM_START_CAPTURE_ROUTINE_EX CamStartCaptureEx
;
263 PCAM_STOP_CAPTURE_ROUTINE_EX CamStopCaptureEx
;
264 PCAM_CONFIGURE_ROUTINE_EX CamConfigureEx
;
265 PCAM_STATE_ROUTINE CamSaveState
;
266 PCAM_STATE_ROUTINE CamRestoreState
;
267 PCAM_ALLOCATE_BW_ROUTINE_EX CamAllocateBandwidthEx
;
268 PCAM_FREE_BW_ROUTINE_EX CamFreeBandwidthEx
;
269 } USBCAMD_DEVICE_DATA2
, *PUSBCAMD_DEVICE_DATA2
;
271 DEFINE_GUID(GUID_USBCAMD_INTERFACE
,
272 0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5);
275 (NTAPI
*PFNUSBCAMD_SetVideoFormat
)(
276 IN PVOID DeviceContext
,
277 IN PHW_STREAM_REQUEST_BLOCK pSrb
);
280 (NTAPI
*PFNUSBCAMD_WaitOnDeviceEvent
)(
281 IN PVOID DeviceContext
,
284 IN ULONG BufferLength
,
285 IN PCOMMAND_COMPLETE_FUNCTION EventComplete
,
286 IN PVOID EventContext
,
287 IN BOOLEAN LoopBack
);
290 (NTAPI
*PFNUSBCAMD_CancelBulkReadWrite
)(
291 IN PVOID DeviceContext
,
295 (NTAPI
*PFNUSBCAMD_SetIsoPipeState
)(
296 IN PVOID DeviceContext
,
297 IN ULONG PipeStateFlags
);
300 (NTAPI
*PFNUSBCAMD_BulkReadWrite
)(
301 IN PVOID DeviceContext
,
304 IN ULONG BufferLength
,
305 IN PCOMMAND_COMPLETE_FUNCTION CommandComplete
,
306 IN PVOID CommandContext
);
308 #define USBCAMD_VERSION_200 0x200
310 typedef struct _USBCAMD_INTERFACE
{
312 PFNUSBCAMD_WaitOnDeviceEvent USBCAMD_WaitOnDeviceEvent
;
313 PFNUSBCAMD_BulkReadWrite USBCAMD_BulkReadWrite
;
314 PFNUSBCAMD_SetVideoFormat USBCAMD_SetVideoFormat
;
315 PFNUSBCAMD_SetIsoPipeState USBCAMD_SetIsoPipeState
;
316 PFNUSBCAMD_CancelBulkReadWrite USBCAMD_CancelBulkReadWrite
;
317 } USBCAMD_INTERFACE
, *PUSBCAMD_INTERFACE
;
319 /* FIXME : Do we need USBCAMAPI here ? */
327 IN ULONG DeviceContextSize
,
328 IN ULONG FrameContextSize
,
329 IN PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket
);
334 USBCAMD_AdapterReceivePacket(
335 IN PHW_STREAM_REQUEST_BLOCK Srb
,
336 IN PUSBCAMD_DEVICE_DATA DeviceData
,
337 IN PDEVICE_OBJECT
*DeviceObject
,
338 IN BOOLEAN NeedsCompletion
);
343 USBCAMD_ControlVendorCommand(
344 IN PVOID DeviceContext
,
349 IN OUT PULONG BufferLength
,
351 IN PCOMMAND_COMPLETE_FUNCTION CommandComplete OPTIONAL
,
352 IN PVOID CommandContext OPTIONAL
);
357 USBCAMD_SelectAlternateInterface(
358 IN PVOID DeviceContext
,
359 IN OUT PUSBD_INTERFACE_INFORMATION RequestInterface
);
364 USBCAMD_GetRegistryKeyValue(
366 IN PWCHAR KeyNameString
,
367 IN ULONG KeyNameStringLength
,
369 IN ULONG DataLength
);
374 USBCAMD_InitializeNewInterface(
375 IN PVOID DeviceContext
,
378 IN ULONG CamControlFlag
);
384 #endif /* !defined(__USB_H) && !defined(__USBDI_H) */