pwc-misc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Linux driver for Philips webcam 
  2.    Various miscellaneous functions and tables.
  3.    (C) 1999-2002 Nemosoft Unv. (webcam@smcc.demon.nl)
  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 2 of the License, or
  7.    (at your option) any later version.
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15. */  
  16. #include <linux/slab.h>
  17. #include "pwc.h"
  18. struct pwc_coord pwc_image_sizes[PSZ_MAX] = 
  19. {
  20. { 128,  96, 0 },
  21. { 160, 120, 0 },
  22. { 176, 144, 0 },
  23. { 320, 240, 0 },
  24. { 352, 288, 0 },
  25. { 640, 480, 0 },
  26. };
  27. /* x,y -> PSZ_ */
  28. int pwc_decode_size(struct pwc_device *pdev, int width, int height)
  29. {
  30. int i, find;
  31. /* Make sure we don't go beyond our max size */
  32. if (width > pdev->view_max.x || height > pdev->view_max.y)
  33. return -1;
  34. /* Find the largest size supported by the camera that fits into the
  35.    requested size. 
  36.  */
  37. find = -1;
  38. for (i = 0; i < PSZ_MAX; i++) {
  39. if (pdev->image_mask & (1 << i)) {
  40. if (pwc_image_sizes[i].x <= width && pwc_image_sizes[i].y <= height)
  41. find = i;
  42. }
  43. }
  44. return find;
  45. }
  46. /* initialize variables depending on type */
  47. void pwc_construct(struct pwc_device *pdev)
  48. {
  49. switch(pdev->type) {
  50. case 645:
  51. case 646:
  52. pdev->view_min.x = 128;
  53. pdev->view_min.y =  96;
  54. pdev->view_max.x = 352;
  55. pdev->view_max.y = 288;
  56. pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QCIF | 1 << PSZ_CIF;
  57. pdev->vcinterface = 2;
  58. pdev->vendpoint = 4;
  59. pdev->frame_header_size = 0;
  60. pdev->frame_trailer_size = 0;
  61. break;
  62. case 675:
  63. case 680:
  64. case 690:
  65. pdev->view_min.x = 128;
  66. pdev->view_min.y =  96;
  67. pdev->view_max.x = 640;
  68. pdev->view_max.y = 480;
  69. pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QSIF | 1 << PSZ_QCIF | 1 << PSZ_SIF | 1 << PSZ_CIF | 1 << PSZ_VGA;
  70. pdev->vcinterface = 3;
  71. pdev->vendpoint = 4;
  72. pdev->frame_header_size = 0;
  73. pdev->frame_trailer_size = 0;
  74. break;
  75. case 730:
  76. case 740:
  77. case 750:
  78. pdev->view_min.x = 160;
  79. pdev->view_min.y = 120;
  80. pdev->view_max.x = 640;
  81. pdev->view_max.y = 480;
  82. pdev->image_mask = 1 << PSZ_QSIF | 1 << PSZ_SIF | 1 << PSZ_VGA;
  83. pdev->vcinterface = 3;
  84. pdev->vendpoint = 5;
  85. pdev->frame_header_size = TOUCAM_HEADER_SIZE;
  86. pdev->frame_trailer_size = TOUCAM_TRAILER_SIZE;
  87. break;
  88. }
  89. pdev->view_min.size = pdev->view_min.x * pdev->view_min.y;
  90. pdev->view_max.size = pdev->view_max.x * pdev->view_max.y;
  91. /* length of image, in YUV format */
  92. pdev->len_per_image = (pdev->view_max.size * 3) / 2;
  93. }