usbvideo.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:15k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This program is free software; you can redistribute it and/or modify
  3.  * it under the terms of the GNU General Public License as published by
  4.  * the Free Software Foundation; either version 2, or (at your option)
  5.  * any later version.
  6.  *
  7.  * This program is distributed in the hope that it will be useful,
  8.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.  * GNU General Public License for more details.
  11.  *
  12.  * You should have received a copy of the GNU General Public License
  13.  * along with this program; if not, write to the Free Software
  14.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15.  */
  16. #ifndef usbvideo_h
  17. #define usbvideo_h
  18. #include <linux/config.h>
  19. #include <linux/proc_fs.h>
  20. #include <linux/videodev.h>
  21. #include <linux/usb.h>
  22. /* Most helpful debugging aid */
  23. #define assert(expr) ((void) ((expr) ? 0 : (err("assert failed at line %d",__LINE__))))
  24. #define USES_PROC_FS (defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS))
  25. #define USBVIDEO_REPORT_STATS 1 /* Set to 0 to block statistics on close */
  26. /* Bit flags (options) */
  27. #define FLAGS_RETRY_VIDIOCSYNC (1 << 0)
  28. #define FLAGS_MONOCHROME (1 << 1)
  29. #define FLAGS_DISPLAY_HINTS (1 << 2)
  30. #define FLAGS_OVERLAY_STATS (1 << 3)
  31. #define FLAGS_FORCE_TESTPATTERN (1 << 4)
  32. #define FLAGS_SEPARATE_FRAMES (1 << 5)
  33. #define FLAGS_CLEAN_FRAMES (1 << 6)
  34. #define FLAGS_NO_DECODING (1 << 7)
  35. /* Bit flags for frames (apply to the frame where they are specified) */
  36. #define USBVIDEO_FRAME_FLAG_SOFTWARE_CONTRAST (1 << 0)
  37. /* Camera capabilities (maximum) */
  38. #define CAMERA_URB_FRAMES       32
  39. #define CAMERA_MAX_ISO_PACKET   1023 /* 1022 actually sent by camera */
  40. #define FRAMES_PER_DESC (CAMERA_URB_FRAMES)
  41. #define FRAME_SIZE_PER_DESC (CAMERA_MAX_ISO_PACKET)
  42. /* This macro restricts an int variable to an inclusive range */
  43. #define RESTRICT_TO_RANGE(v,mi,ma) { if ((v) < (mi)) (v) = (mi); else if ((v) > (ma)) (v) = (ma); }
  44. #define V4L_BYTES_PER_PIXEL     3 /* Because we produce RGB24 */
  45. /*
  46.  * Use this macro to construct constants for different video sizes.
  47.  * We have to deal with different video sizes that have to be
  48.  * configured in the device or compared against when we receive
  49.  * a data. Normally one would define a bunch of VIDEOSIZE_x_by_y
  50.  * #defines and that's the end of story. However this solution
  51.  * does not allow to convert between real pixel sizes and the
  52.  * constant (integer) value that may be used to tag a frame or
  53.  * whatever. The set of macros below constructs videosize constants
  54.  * from the pixel size and allows to reconstruct the pixel size
  55.  * from the combined value later.
  56.  */
  57. #define VIDEOSIZE(x,y) (((x) & 0xFFFFL) | (((y) & 0xFFFFL) << 16))
  58. #define VIDEOSIZE_X(vs) ((vs) & 0xFFFFL)
  59. #define VIDEOSIZE_Y(vs) (((vs) >> 16) & 0xFFFFL)
  60. typedef unsigned long videosize_t;
  61. /*
  62.  * This macro checks if the camera is still operational. The 'uvd'
  63.  * pointer must be valid, uvd->dev must be valid, we are not
  64.  * removing the device and the device has not erred on us.
  65.  */
  66. #define CAMERA_IS_OPERATIONAL(uvd) (
  67. (uvd != NULL) && 
  68. ((uvd)->dev != NULL) && 
  69. ((uvd)->last_error == 0) && 
  70. (!(uvd)->remove_pending))
  71. /*
  72.  * We use macros to do YUV -> RGB conversion because this is
  73.  * very important for speed and totally unimportant for size.
  74.  *
  75.  * YUV -> RGB Conversion
  76.  * ---------------------
  77.  *
  78.  * B = 1.164*(Y-16)     + 2.018*(V-128)
  79.  * G = 1.164*(Y-16) - 0.813*(U-128) - 0.391*(V-128)
  80.  * R = 1.164*(Y-16) + 1.596*(U-128)
  81.  *
  82.  * If you fancy integer arithmetics (as you should), hear this:
  83.  *
  84.  * 65536*B = 76284*(Y-16)   + 132252*(V-128)
  85.  * 65536*G = 76284*(Y-16) -  53281*(U-128) -  25625*(V-128)
  86.  * 65536*R = 76284*(Y-16) + 104595*(U-128)
  87.  *
  88.  * Make sure the output values are within [0..255] range.
  89.  */
  90. #define LIMIT_RGB(x) (((x) < 0) ? 0 : (((x) > 255) ? 255 : (x)))
  91. #define YUV_TO_RGB_BY_THE_BOOK(my,mu,mv,mr,mg,mb) { 
  92.     int mm_y, mm_yc, mm_u, mm_v, mm_r, mm_g, mm_b; 
  93.     mm_y = (my) - 16;  
  94.     mm_u = (mu) - 128; 
  95.     mm_v = (mv) - 128; 
  96.     mm_yc= mm_y * 76284; 
  97.     mm_b = (mm_yc + 132252*mm_v ) >> 16; 
  98.     mm_g = (mm_yc -  53281*mm_u -  25625*mm_v ) >> 16; 
  99.     mm_r = (mm_yc + 104595*mm_u ) >> 16; 
  100.     mb = LIMIT_RGB(mm_b); 
  101.     mg = LIMIT_RGB(mm_g); 
  102.     mr = LIMIT_RGB(mm_r); 
  103. }
  104. #define RING_QUEUE_ADVANCE_INDEX(rq,ind,n) (rq)->ind = ((rq)->ind + (n)) % (rq)->length
  105. #define RING_QUEUE_DEQUEUE_BYTES(rq,n) RING_QUEUE_ADVANCE_INDEX(rq,ri,n)
  106. #define RING_QUEUE_PEEK(rq,ofs) ((rq)->queue[((ofs) + (rq)->ri) % (rq)->length])
  107. typedef struct {
  108. unsigned char *queue; /* Data from the Isoc data pump */
  109. int length; /* How many bytes allocated for the queue */
  110. int wi; /* That's where we write */
  111. int ri; /* Read from here until you hit write index */
  112. wait_queue_head_t wqh; /* Processes waiting */
  113. } RingQueue_t;
  114. typedef enum {
  115. ScanState_Scanning, /* Scanning for header */
  116. ScanState_Lines /* Parsing lines */
  117. } ScanState_t;
  118. /* Completion states of the data parser */
  119. typedef enum {
  120. scan_Continue, /* Just parse next item */
  121. scan_NextFrame, /* Frame done, send it to V4L */
  122. scan_Out, /* Not enough data for frame */
  123. scan_EndParse /* End parsing */
  124. } ParseState_t;
  125. typedef enum {
  126. FrameState_Unused, /* Unused (no MCAPTURE) */
  127. FrameState_Ready, /* Ready to start grabbing */
  128. FrameState_Grabbing, /* In the process of being grabbed into */
  129. FrameState_Done, /* Finished grabbing, but not been synced yet */
  130. FrameState_Done_Hold, /* Are syncing or reading */
  131. FrameState_Error, /* Something bad happened while processing */
  132. } FrameState_t;
  133. /*
  134.  * Some frames may contain only even or odd lines. This type
  135.  * specifies what type of deinterlacing is required.
  136.  */
  137. typedef enum {
  138. Deinterlace_None=0,
  139. Deinterlace_FillOddLines,
  140. Deinterlace_FillEvenLines
  141. } Deinterlace_t;
  142. struct usb_device;
  143. #define USBVIDEO_NUMFRAMES 2 /* How many frames we work with */
  144. #define USBVIDEO_NUMSBUF 2 /* How many URBs linked in a ring */
  145. /* This structure represents one Isoc request - URB and buffer */
  146. typedef struct {
  147. char *data;
  148. struct urb *urb;
  149. } usbvideo_sbuf_t;
  150. typedef struct {
  151. char *data; /* Frame buffer */
  152. unsigned long header; /* Significant bits from the header */
  153. videosize_t canvas; /* The canvas (max. image) allocated */
  154. videosize_t request; /* That's what the application asked for */
  155. unsigned short palette; /* The desired format */
  156. FrameState_t frameState;/* State of grabbing */
  157. ScanState_t scanstate; /* State of scanning */
  158. Deinterlace_t deinterlace;
  159. int flags; /* USBVIDEO_FRAME_FLAG_xxx bit flags */
  160. int curline; /* Line of frame we're working on */
  161. long seqRead_Length; /* Raw data length of frame */
  162. long seqRead_Index; /* Amount of data that has been already read */
  163. void *user; /* Additional data that user may need */
  164. } usbvideo_frame_t;
  165. /* Statistics that can be overlaid on screen */
  166. typedef struct {
  167.         unsigned long frame_num; /* Sequential number of the frame */
  168.         unsigned long urb_count;        /* How many URBs we received so far */
  169.         unsigned long urb_length;       /* Length of last URB */
  170.         unsigned long data_count;       /* How many bytes we received */
  171.         unsigned long header_count;     /* How many frame headers we found */
  172. unsigned long iso_skip_count; /* How many empty ISO packets received */
  173. unsigned long iso_err_count; /* How many bad ISO packets received */
  174. } usbvideo_statistics_t;
  175. struct s_usbvideo_t;
  176. typedef struct {
  177. struct video_device vdev; /* Must be the first field! */
  178. struct usb_device *dev;
  179. struct s_usbvideo_t *handle; /* Points back to the usbvideo_t */
  180. void *user_data; /* Camera-dependent data */
  181. int user_size; /* Size of that camera-dependent data */
  182. int debug; /* Debug level for usbvideo */
  183. unsigned char iface; /* Video interface number */
  184. unsigned char video_endp;
  185. unsigned char ifaceAltActive;
  186. unsigned char ifaceAltInactive; /* Alt settings */
  187. unsigned long flags; /* FLAGS_USBVIDEO_xxx */
  188. unsigned long paletteBits; /* Which palettes we accept? */
  189. unsigned short defaultPalette; /* What palette to use for read() */
  190. struct semaphore lock;
  191. int user; /* user count for exclusive use */
  192. videosize_t videosize; /* Current setting */
  193. videosize_t canvas; /* This is the width,height of the V4L canvas */
  194. int max_frame_size; /* Bytes in one video frame */
  195. int uvd_used;         /* Is this structure in use? */
  196. int streaming; /* Are we streaming Isochronous? */
  197. int grabbing; /* Are we grabbing? */
  198. int settingsAdjusted; /* Have we adjusted contrast etc.? */
  199. int last_error; /* What calamity struck us? */
  200. char *fbuf; /* Videodev buffer area */
  201. int fbuf_size; /* Videodev buffer size */
  202. int curframe;
  203. int iso_packet_len; /* Videomode-dependent, saves bus bandwidth */
  204. RingQueue_t dp; /* Isoc data pump */
  205. usbvideo_frame_t frame[USBVIDEO_NUMFRAMES];
  206. usbvideo_sbuf_t sbuf[USBVIDEO_NUMSBUF];
  207. volatile int remove_pending; /* If set then about to exit */
  208. struct video_picture vpic, vpic_old; /* Picture settings */
  209. struct video_capability vcap; /* Video capabilities */
  210. struct video_channel vchan; /* May be used for tuner support */
  211. usbvideo_statistics_t stats;
  212. struct proc_dir_entry *procfs_vEntry; /* /proc/video/MYDRIVER/video2 */
  213. char videoName[32]; /* Holds name like "video7" */
  214. } uvd_t;
  215. /*
  216.  * usbvideo callbacks (virtual methods). They are set when usbvideo
  217.  * services are registered. All of these default to NULL, except those
  218.  * that default to usbvideo-provided methods.
  219.  */
  220. typedef struct {
  221. void *(*probe)(struct usb_device *, unsigned int,const struct usb_device_id *);
  222. void (*userFree)(uvd_t *);
  223. void (*disconnect)(struct usb_device *, void *);
  224. int (*setupOnOpen)(uvd_t *);
  225. void (*videoStart)(uvd_t *);
  226. void (*videoStop)(uvd_t *);
  227. void (*processData)(uvd_t *, usbvideo_frame_t *);
  228. void (*postProcess)(uvd_t *, usbvideo_frame_t *);
  229. void (*adjustPicture)(uvd_t *);
  230. int (*getFPS)(uvd_t *);
  231. int (*overlayHook)(uvd_t *, usbvideo_frame_t *);
  232. int (*getFrame)(uvd_t *, int);
  233. int (*procfs_read)(char *page,char **start,off_t off,int count,int *eof,void *data);
  234. int (*procfs_write)(struct file *file,const char *buffer,unsigned long count,void *data);
  235. } usbvideo_cb_t;
  236. struct s_usbvideo_t {
  237. int num_cameras; /* As allocated */
  238. struct usb_driver usbdrv; /* Interface to the USB stack */
  239. char drvName[80]; /* Driver name */
  240. struct semaphore lock; /* Mutex protecting camera structures */
  241. usbvideo_cb_t cb; /* Table of callbacks (virtual methods) */
  242. struct video_device vdt; /* Video device template */
  243. uvd_t *cam; /* Array of camera structures */
  244. int uses_procfs; /* Non-zero if we create /proc entries */
  245. struct proc_dir_entry *procfs_dEntry; /* /proc/video/MYDRIVER */
  246. struct module *md_module; /* Minidriver module */
  247. };
  248. typedef struct s_usbvideo_t usbvideo_t;
  249. /*
  250.  * This macro retrieves callback address from the uvd_t object.
  251.  * No validity checks are done here, so be sure to check the
  252.  * callback beforehand with VALID_CALLBACK.
  253.  */
  254. #define GET_CALLBACK(uvd,cbName) ((uvd)->handle->cb.cbName)
  255. /*
  256.  * This macro returns either callback pointer or NULL. This is safe
  257.  * macro, meaning that most of components of data structures involved
  258.  * may be NULL - this only results in NULL being returned. You may
  259.  * wish to use this macro to make sure that the callback is callable.
  260.  * However keep in mind that those checks take time.
  261.  */
  262. #define VALID_CALLBACK(uvd,cbName) ((((uvd) != NULL) && 
  263. ((uvd)->handle != NULL)) ? GET_CALLBACK(uvd,cbName) : NULL)
  264. void RingQueue_Initialize(RingQueue_t *rq);
  265. void RingQueue_Allocate(RingQueue_t *rq, int rqLen);
  266. int  RingQueue_IsAllocated(const RingQueue_t *rq);
  267. void RingQueue_Free(RingQueue_t *rq);
  268. int  RingQueue_Dequeue(RingQueue_t *rq, unsigned char *dst, int len);
  269. int  RingQueue_Enqueue(RingQueue_t *rq, const unsigned char *cdata, int n);
  270. int  RingQueue_GetLength(const RingQueue_t *rq);
  271. void RingQueue_InterruptibleSleepOn(RingQueue_t *rq);
  272. void RingQueue_WakeUpInterruptible(RingQueue_t *rq);
  273. void usbvideo_CollectRawData(uvd_t *uvd, usbvideo_frame_t *frame);
  274. void usbvideo_DrawLine(
  275. usbvideo_frame_t *frame,
  276. int x1, int y1,
  277. int x2, int y2,
  278. unsigned char cr, unsigned char cg, unsigned char cb);
  279. void usbvideo_HexDump(const unsigned char *data, int len);
  280. void usbvideo_OverlayChar(uvd_t *uvd, usbvideo_frame_t *frame, int x, int y, int ch);
  281. void usbvideo_OverlayString(uvd_t *uvd, usbvideo_frame_t *frame, int x, int y, const char *str);
  282. void usbvideo_OverlayStats(uvd_t *uvd, usbvideo_frame_t *frame);
  283. void usbvideo_ReportStatistics(const uvd_t *uvd);
  284. void usbvideo_SayAndWait(const char *what);
  285. void usbvideo_TestPattern(uvd_t *uvd, int fullframe, int pmode);
  286. void usbvideo_VideosizeToString(char *buf, int bufLen, videosize_t vs);
  287. /* Memory allocation routines */
  288. unsigned long usbvideo_uvirt_to_kva(pgd_t *pgd, unsigned long adr);
  289. unsigned long usbvideo_kvirt_to_pa(unsigned long adr);
  290. void *usbvideo_rvmalloc(unsigned long size);
  291. void usbvideo_rvfree(void *mem, unsigned long size);
  292. int usbvideo_register(
  293. usbvideo_t **pCams,
  294. const int num_cams,
  295. const int num_extra,
  296. const char *driverName,
  297. const usbvideo_cb_t *cbTable,
  298. struct module *md);
  299. uvd_t *usbvideo_AllocateDevice(usbvideo_t *cams);
  300. int usbvideo_RegisterVideoDevice(uvd_t *uvd);
  301. void usbvideo_Deregister(usbvideo_t **uvt);
  302. void usbvideo_Disconnect(struct usb_device *dev, void *ptr);
  303. void usbvideo_CameraRelease(uvd_t *uvd);
  304. void usbvideo_v4l_close(struct video_device *dev);
  305. int usbvideo_v4l_initialize(struct video_device *dev);
  306. int usbvideo_v4l_ioctl(struct video_device *dev, unsigned int cmd, void *arg);
  307. int usbvideo_v4l_mmap(struct video_device *dev, const char *adr, unsigned long size);
  308. int usbvideo_v4l_open(struct video_device *dev, int flags);
  309. long usbvideo_v4l_read(struct video_device *dev, char *buf,
  310. unsigned long count, int noblock);
  311. long usbvideo_v4l_write(struct video_device *dev, const char *buf,
  312. unsigned long count, int noblock);
  313. int usbvideo_GetFrame(uvd_t *uvd, int frameNum);
  314. int usbvideo_NewFrame(uvd_t *uvd, int framenum);
  315. int usbvideo_StartDataPump(uvd_t *uvd);
  316. void usbvideo_StopDataPump(uvd_t *uvd);
  317. void usbvideo_DeinterlaceFrame(uvd_t *uvd, usbvideo_frame_t *frame);
  318. void usbvideo_SoftwareContrastAdjustment(uvd_t *uvd, usbvideo_frame_t *frame);
  319. /*
  320.  * This code performs bounds checking - use it when working with
  321.  * new formats, or else you may get oopses all over the place.
  322.  * If pixel falls out of bounds then it gets shoved back (as close
  323.  * to place of offence as possible) and is painted bright red.
  324.  *
  325.  * There are two important concepts: frame width, height and
  326.  * V4L canvas width, height. The former is the area requested by
  327.  * the application -for this very frame-. The latter is the largest
  328.  * possible frame that we can serve (we advertise that via V4L ioctl).
  329.  * The frame data is expected to be formatted as lines of length
  330.  * VIDEOSIZE_X(fr->request), total VIDEOSIZE_Y(frame->request) lines.
  331.  */
  332. static inline void RGB24_PUTPIXEL(
  333. usbvideo_frame_t *fr,
  334. int ix, int iy,
  335. unsigned char vr,
  336. unsigned char vg,
  337. unsigned char vb)
  338. {
  339. register unsigned char *pf;
  340. int limiter = 0, mx, my;
  341. mx = ix;
  342. my = iy;
  343. if (mx < 0) {
  344. mx=0;
  345. limiter++;
  346. } else if (mx >= VIDEOSIZE_X((fr)->request)) {
  347. mx= VIDEOSIZE_X((fr)->request) - 1;
  348. limiter++;
  349. }
  350. if (my < 0) {
  351. my = 0;
  352. limiter++;
  353. } else if (my >= VIDEOSIZE_Y((fr)->request)) {
  354. my = VIDEOSIZE_Y((fr)->request) - 1;
  355. limiter++;
  356. }
  357. pf = (fr)->data + V4L_BYTES_PER_PIXEL*((iy)*VIDEOSIZE_X((fr)->request) + (ix));
  358. if (limiter) {
  359. *pf++ = 0;
  360. *pf++ = 0;
  361. *pf++ = 0xFF;
  362. } else {
  363. *pf++ = (vb);
  364. *pf++ = (vg);
  365. *pf++ = (vr);
  366. }
  367. }
  368. #endif /* usbvideo_h */