2 * Copyright 2004-2008, François Revol, <revol@free.fr>.
3 * Distributed under the terms of the MIT License.
18 # include <usb/USBKit.h>
21 #include <MediaAddOn.h>
28 class BParameterGroup
;
33 class WebCamMediaAddOn
;
37 usb_support_descriptor desc
;
40 const char *sensors
; // possible sensors this cam uses (comma separated)
41 } usb_webcam_support_descriptor
;
43 // This class represents each webcam
46 CamDevice(CamDeviceAddon
&_addon
, BUSBDevice
* _device
);
49 virtual status_t
InitCheck();
50 bool Matches(BUSBDevice
* _device
);
51 BUSBDevice
* GetDevice();
52 virtual void Unplugged(); // called before the BUSBDevice deletion
53 virtual bool IsPlugged(); // asserts on-line hardware
55 virtual const char* BrandName();
56 virtual const char* ModelName();
57 const flavor_info
* FlavorInfo() const { return &fFlavorInfo
; };
58 virtual bool SupportsBulk();
59 virtual bool SupportsIsochronous();
60 virtual status_t
StartTransfer();
61 virtual status_t
StopTransfer();
62 virtual bool TransferEnabled() const { return fTransferEnabled
; };
64 virtual status_t
SuggestVideoFrame(uint32
&width
, uint32
&height
);
65 virtual status_t
AcceptVideoFrame(uint32
&width
, uint32
&height
);
66 virtual status_t
SetVideoFrame(BRect rect
);
67 virtual BRect
VideoFrame() const { return fVideoFrame
; };
68 virtual status_t
SetScale(float scale
);
69 virtual status_t
SetVideoParams(float brightness
, float contrast
, float hue
, float red
, float green
, float blue
);
71 virtual void AddParameters(BParameterGroup
*group
, int32
&index
);
72 virtual status_t
GetParameterValue(int32 id
, bigtime_t
*last_change
, void *value
, size_t *size
);
73 virtual status_t
SetParameterValue(int32 id
, bigtime_t when
, const void *value
, size_t size
);
76 // for use by deframer
77 virtual size_t MinRawFrameSize();
78 virtual size_t MaxRawFrameSize();
79 virtual bool ValidateStartOfFrameTag(const uint8
*tag
, size_t taglen
);
80 virtual bool ValidateEndOfFrameTag(const uint8
*tag
, size_t taglen
, size_t datalen
);
82 // several ways to get raw frames
83 virtual status_t
WaitFrame(bigtime_t timeout
);
84 virtual status_t
GetFrameBitmap(BBitmap
**bm
, bigtime_t
*stamp
=NULL
);
85 virtual status_t
FillFrameBuffer(BBuffer
*buffer
, bigtime_t
*stamp
=NULL
);
90 BLocker
* Locker() { return &fLocker
; };
92 // sensor chip handling
93 CamSensor
* Sensor() const { return fSensor
; };
95 virtual status_t
PowerOnSensor(bool on
);
97 // generic register-like access
98 virtual ssize_t
WriteReg(uint16 address
, uint8
*data
, size_t count
=1);
99 virtual ssize_t
WriteReg8(uint16 address
, uint8 data
);
100 virtual ssize_t
WriteReg16(uint16 address
, uint16 data
);
101 virtual ssize_t
ReadReg(uint16 address
, uint8
*data
, size_t count
=1, bool cached
=false);
103 ssize_t
OrReg8(uint16 address
, uint8 data
, uint8 mask
=0xff);
104 ssize_t
AndReg8(uint16 address
, uint8 data
);
107 //virtual status_t GetStatusIIC();
108 //virtual status_t WaitReadyIIC();
109 virtual ssize_t
WriteIIC(uint8 address
, uint8
*data
, size_t count
);
110 virtual ssize_t
WriteIIC8(uint8 address
, uint8 data
);
111 virtual ssize_t
WriteIIC16(uint8 address
, uint16 data
);
112 virtual ssize_t
ReadIIC(uint8 address
, uint8
*data
);
113 virtual ssize_t
ReadIIC8(uint8 address
, uint8
*data
);
114 virtual ssize_t
ReadIIC16(uint8 address
, uint16
*data
);
115 virtual status_t
SetIICBitsMode(size_t bits
=8);
118 void SetDataInput(BDataIO
*input
);
119 virtual status_t
DataPumpThread();
120 static int32
_DataPumpThread(void *_this
);
122 virtual void DumpRegs();
125 virtual status_t
SendCommand(uint8 dir
, uint8 request
, uint16 value
,
126 uint16 index
, uint16 length
, void* data
);
127 virtual status_t
ProbeSensor();
128 CamSensor
*CreateSensor(const char *name
);
129 status_t fInitStatus
;
130 flavor_info fFlavorInfo
;
131 media_format fMediaFormat
;
132 BString fFlavorInfoNameStr
;
133 BString fFlavorInfoInfoStr
;
135 CamDeframer
* fDeframer
;
136 BDataIO
* fDataInput
; // where data from usb goes, likely fDeframer
137 const BUSBEndpoint
* fBulkIn
;
138 const BUSBEndpoint
* fIsoIn
;
139 int32 fFirstParameterID
;
140 bigtime_t fLastParameterChanges
;
143 friend class CamDeviceAddon
;
144 CamDeviceAddon
& fCamDeviceAddon
;
146 int fSupportedDeviceIndex
;
147 bool fChipIsBigEndian
;
148 bool fTransferEnabled
;
149 thread_id fPumpThread
;
157 // the addon itself, that instanciate
159 class CamDeviceAddon
{
161 CamDeviceAddon(WebCamMediaAddOn
* webcam
);
162 virtual ~CamDeviceAddon();
164 virtual const char* BrandName();
165 virtual status_t
Sniff(BUSBDevice
*device
);
166 virtual CamDevice
* Instantiate(CamRoster
&roster
, BUSBDevice
*from
);
168 void SetSupportedDevices(const usb_webcam_support_descriptor
*devs
);
169 const usb_webcam_support_descriptor
* SupportedDevices() const
170 { return fSupportedDevices
; };
171 WebCamMediaAddOn
* WebCamAddOn() const { return fWebCamAddOn
; };
174 WebCamMediaAddOn
* fWebCamAddOn
;
175 const usb_webcam_support_descriptor
* fSupportedDevices
; // last is {{0,0,0,0,0}, NULL, NULL, NULL }
179 #define B_WEBCAM_MKINTFUNC(modname) \
180 get_webcam_addon_##modname
182 // external addons -- UNIMPLEMENTED
183 extern "C" status_t
get_webcam_addon(WebCamMediaAddOn
* webcam
,
184 CamDeviceAddon
**addon
);
185 #define B_WEBCAM_ADDON_INSTANTIATION_FUNC_NAME "get_webcam_addon"
187 #endif // _CAM_DEVICE_H