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.
26 #if !defined(__USB_H) && !defined(__USBDI_H)
27 #error include usb.h or usbdi.h before usbcamdi.h
36 #if defined(_BATTERYCLASS_)
37 #define USBCAMAPI DECLSPEC_EXPORT
39 #define USBCAMAPI DECLSPEC_IMPORT
43 /* FIXME: Unknown definition */
44 typedef PVOID PHW_STREAM_REQUEST_BLOCK
;
46 DEFINE_GUID(GUID_USBCAMD_INTERFACE
,
47 0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5);
49 #define USBCAMD_PROCESSPACKETEX_DropFrame 0x0002
50 #define USBCAMD_PROCESSPACKETEX_NextFrameIsStill 0x0004
51 #define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill 0x0008
53 #define USBCAMD_DATA_PIPE 0x0001
54 #define USBCAMD_MULTIPLEX_PIPE 0x0002
55 #define USBCAMD_SYNC_PIPE 0x0004
56 #define USBCAMD_DONT_CARE_PIPE 0x0008
58 #define USBCAMD_VIDEO_STREAM 0x1
59 #define USBCAMD_STILL_STREAM 0x2
60 #define USBCAMD_VIDEO_STILL_STREAM (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM)
62 #define USBCAMD_STOP_STREAM 0x00000001
63 #define USBCAMD_START_STREAM 0x00000000
65 typedef struct _pipe_config_descriptor
{
66 CHAR StreamAssociation
;
67 UCHAR PipeConfigFlags
;
68 } USBCAMD_Pipe_Config_Descriptor
, *PUSBCAMD_Pipe_Config_Descriptor
;
71 USBCAMD_CamControlFlag_NoVideoRawProcessing
= 1,
72 USBCAMD_CamControlFlag_NoStillRawProcessing
= 2,
73 USBCAMD_CamControlFlag_AssociatedFormat
= 4,
74 USBCAMD_CamControlFlag_EnableDeviceEvents
= 8
75 } USBCAMD_CamControlFlags
;
78 (DDKAPI
*PCAM_ALLOCATE_BW_ROUTINE
)(
79 PDEVICE_OBJECT BusDeviceObject
,
81 PULONG RawFrameLength
,
85 (DDKAPI
*PCAM_ALLOCATE_BW_ROUTINE_EX
)(
86 PDEVICE_OBJECT BusDeviceObject
,
88 PULONG RawFrameLength
,
93 (DDKAPI
*PCAM_CONFIGURE_ROUTINE
)(
94 PDEVICE_OBJECT BusDeviceObject
,
96 PUSBD_INTERFACE_INFORMATION Interface
,
97 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
102 (DDKAPI
*PCAM_CONFIGURE_ROUTINE_EX
)(
103 PDEVICE_OBJECT BusDeviceObject
,
105 PUSBD_INTERFACE_INFORMATION Interface
,
106 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
107 ULONG PipeConfigListSize
,
108 PUSBCAMD_Pipe_Config_Descriptor PipeConfig
,
109 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
112 (DDKAPI
*PCAM_FREE_BW_ROUTINE
)(
113 PDEVICE_OBJECT BusDeviceObject
,
114 PVOID DeviceContext
);
117 (DDKAPI
*PCAM_FREE_BW_ROUTINE_EX
)(
118 PDEVICE_OBJECT BusDeviceObject
,
123 (DDKAPI
*PCAM_INITIALIZE_ROUTINE
)(
124 PDEVICE_OBJECT BusDeviceObject
,
125 PVOID DeviceContext
);
128 (DDKAPI
*PCAM_NEW_FRAME_ROUTINE
)(
133 (DDKAPI
*PCAM_NEW_FRAME_ROUTINE_EX
)(
140 (DDKAPI
*PCAM_PROCESS_RAW_FRAME_ROUTINE
)(
141 PDEVICE_OBJECT BusDeviceObject
,
146 PVOID RawFrameBuffer
,
147 ULONG RawFrameLength
,
148 ULONG NumberOfPackets
,
149 PULONG BytesReturned
);
152 (DDKAPI
*PCAM_PROCESS_RAW_FRAME_ROUTINE_EX
)(
153 PDEVICE_OBJECT BusDeviceObject
,
158 PVOID RawFrameBuffer
,
159 ULONG RawFrameLength
,
160 ULONG NumberOfPackets
,
161 PULONG BytesReturned
,
162 ULONG ActualRawFrameLength
,
166 (DDKAPI
*PCAM_PROCESS_PACKET_ROUTINE
)(
167 PDEVICE_OBJECT BusDeviceObject
,
169 PVOID CurrentFrameContext
,
170 PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket
,
172 PUSBD_ISO_PACKET_DESCRIPTOR DataPacket
,
174 PBOOLEAN FrameComplete
,
175 PBOOLEAN NextFrameIsStill
);
178 (DDKAPI
*PCAM_PROCESS_PACKET_ROUTINE_EX
)(
179 PDEVICE_OBJECT BusDeviceObject
,
181 PVOID CurrentFrameContext
,
182 PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket
,
184 PUSBD_ISO_PACKET_DESCRIPTOR DataPacket
,
186 PBOOLEAN FrameComplete
,
188 PULONG ValidDataOffset
);
191 (DDKAPI
*PCAM_STATE_ROUTINE
)(
192 PDEVICE_OBJECT BusDeviceObject
,
193 PVOID DeviceContext
);
196 (DDKAPI
*PCAM_START_CAPTURE_ROUTINE
)(
197 PDEVICE_OBJECT BusDeviceObject
,
198 PVOID DeviceContext
);
201 (DDKAPI
*PCAM_START_CAPTURE_ROUTINE_EX
)(
202 PDEVICE_OBJECT BusDeviceObject
,
207 (DDKAPI
*PCAM_STOP_CAPTURE_ROUTINE
)(
208 PDEVICE_OBJECT BusDeviceObject
,
209 PVOID DeviceContext
);
212 (DDKAPI
*PCAM_STOP_CAPTURE_ROUTINE_EX
)(
213 PDEVICE_OBJECT BusDeviceObject
,
217 typedef struct _USBCAMD_DEVICE_DATA
{
219 PCAM_INITIALIZE_ROUTINE CamInitialize
;
220 PCAM_INITIALIZE_ROUTINE CamUnInitialize
;
221 PCAM_PROCESS_PACKET_ROUTINE CamProcessUSBPacket
;
222 PCAM_NEW_FRAME_ROUTINE CamNewVideoFrame
;
223 PCAM_PROCESS_RAW_FRAME_ROUTINE CamProcessRawVideoFrame
;
224 PCAM_START_CAPTURE_ROUTINE CamStartCapture
;
225 PCAM_STOP_CAPTURE_ROUTINE CamStopCapture
;
226 PCAM_CONFIGURE_ROUTINE CamConfigure
;
227 PCAM_STATE_ROUTINE CamSaveState
;
228 PCAM_STATE_ROUTINE CamRestoreState
;
229 PCAM_ALLOCATE_BW_ROUTINE CamAllocateBandwidth
;
230 PCAM_FREE_BW_ROUTINE CamFreeBandwidth
;
231 } USBCAMD_DEVICE_DATA
, *PUSBCAMD_DEVICE_DATA
;
233 typedef struct _USBCAMD_DEVICE_DATA2
{
235 PCAM_INITIALIZE_ROUTINE CamInitialize
;
236 PCAM_INITIALIZE_ROUTINE CamUnInitialize
;
237 PCAM_PROCESS_PACKET_ROUTINE_EX CamProcessUSBPacketEx
;
238 PCAM_NEW_FRAME_ROUTINE_EX CamNewVideoFrameEx
;
239 PCAM_PROCESS_RAW_FRAME_ROUTINE_EX CamProcessRawVideoFrameEx
;
240 PCAM_START_CAPTURE_ROUTINE_EX CamStartCaptureEx
;
241 PCAM_STOP_CAPTURE_ROUTINE_EX CamStopCaptureEx
;
242 PCAM_CONFIGURE_ROUTINE_EX CamConfigureEx
;
243 PCAM_STATE_ROUTINE CamSaveState
;
244 PCAM_STATE_ROUTINE CamRestoreState
;
245 PCAM_ALLOCATE_BW_ROUTINE_EX CamAllocateBandwidthEx
;
246 PCAM_FREE_BW_ROUTINE_EX CamFreeBandwidthEx
;
247 } USBCAMD_DEVICE_DATA2
, *PUSBCAMD_DEVICE_DATA2
;
252 USBCAMD_InitializeNewInterface(
253 IN PVOID DeviceContext
,
256 IN ULONG CamControlFlag
);
259 (DDKAPI
*PCOMMAND_COMPLETE_FUNCTION
)(
261 PVOID CommandContext
,
265 (DDKAPI
*PFNUSBCAMD_BulkReadWrite
)(
266 IN PVOID DeviceContext
,
269 IN ULONG BufferLength
,
270 IN PCOMMAND_COMPLETE_FUNCTION CommandComplete
,
271 IN PVOID CommandContext
);
274 (DDKAPI
*PFNUSBCAMD_SetIsoPipeState
)(
275 IN PVOID DeviceContext
,
276 IN ULONG PipeStateFlags
);
279 (DDKAPI
*PFNUSBCAMD_CancelBulkReadWrite
)(
280 IN PVOID DeviceContext
,
284 (DDKAPI
*PFNUSBCAMD_SetVideoFormat
)(
285 IN PVOID DeviceContext
,
286 IN PHW_STREAM_REQUEST_BLOCK pSrb
);
289 (DDKAPI
*PFNUSBCAMD_WaitOnDeviceEvent
)(
290 IN PVOID DeviceContext
,
293 IN ULONG BufferLength
,
294 IN PCOMMAND_COMPLETE_FUNCTION EventComplete
,
295 IN PVOID EventContext
,
296 IN BOOLEAN LoopBack
);
301 USBCAMD_AdapterReceivePacket(
302 IN PHW_STREAM_REQUEST_BLOCK Srb
,
303 IN PUSBCAMD_DEVICE_DATA DeviceData
,
304 IN PDEVICE_OBJECT
*DeviceObject
,
305 IN BOOLEAN NeedsCompletion
);
310 USBCAMD_ControlVendorCommand(
311 IN PVOID DeviceContext
,
316 IN OUT PULONG BufferLength
,
318 IN PCOMMAND_COMPLETE_FUNCTION CommandComplete
,
319 IN PVOID CommandContext
);
322 (DDKAPI
*PADAPTER_RECEIVE_PACKET_ROUTINE
)(
323 IN PHW_STREAM_REQUEST_BLOCK Srb
);
331 ULONG DeviceContextSize
,
332 ULONG FrameContextSize
,
333 PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket
);
338 USBCAMD_GetRegistryKeyValue(
340 IN PWCHAR KeyNameString
,
341 IN ULONG KeyNameStringLength
,
343 IN ULONG DataLength
);
348 USBCAMD_SelectAlternateInterface(
349 IN PVOID DeviceContext
,
350 IN OUT PUSBD_INTERFACE_INFORMATION RequestInterface
);
352 #define USBCAMD_VERSION_200 0x200
354 typedef struct _USBCAMD_INTERFACE
{
356 PFNUSBCAMD_WaitOnDeviceEvent USBCAMD_WaitOnDeviceEvent
;
357 PFNUSBCAMD_BulkReadWrite USBCAMD_BulkReadWrite
;
358 PFNUSBCAMD_SetVideoFormat USBCAMD_SetVideoFormat
;
359 PFNUSBCAMD_SetIsoPipeState USBCAMD_SetIsoPipeState
;
360 PFNUSBCAMD_CancelBulkReadWrite USBCAMD_CancelBulkReadWrite
;
361 } USBCAMD_INTERFACE
, *PUSBCAMD_INTERFACE
;
364 (DDKAPI
*PSTREAM_RECEIVE_PACKET
)(
366 IN PVOID DeviceContext
,
367 IN PBOOLEAN Completed
);
369 #if defined(DEBUG_LOG)
374 USBCAMD_Debug_LogEntry(
380 #define ILOGENTRY(sig, info1, info2, info3) \
381 USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
385 #define ILOGENTRY(sig, info1, info2, info3)
387 #endif /* DEBUG_LOG */
395 #endif /* !defined(__USB_H) && !defined(__USBDI_H) */
398 #endif /* __USBCAMDI_H */