2006-03-25 15:19:53 +03:00
/* Linux driver for Philips webcam
2005-04-17 02:20:36 +04:00
Various miscellaneous functions and tables .
( C ) 1999 - 2003 Nemosoft Unv .
2006-04-24 17:29:46 +04:00
( C ) 2004 - 2006 Luc Saillard ( luc @ saillard . org )
2005-04-17 02:20:36 +04:00
NOTE : this version of pwc is an unofficial ( modified ) release of pwc & pcwx
driver and thus may have bugs that are not present in the original version .
Please send bug reports and support requests to < luc @ saillard . org > .
The decompression routines have been implemented by reverse - engineering the
Nemosoft binary pwcx module . Caveat emptor .
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# include "pwc.h"
2012-01-04 23:58:44 +04:00
const int pwc_image_sizes [ PSZ_MAX ] [ 2 ] =
2005-04-17 02:20:36 +04:00
{
2012-01-04 23:58:44 +04:00
{ 128 , 96 } , /* sqcif */
{ 160 , 120 } , /* qsif */
{ 176 , 144 } , /* qcif */
{ 320 , 240 } , /* sif */
{ 352 , 288 } , /* cif */
{ 640 , 480 } , /* vga */
2005-04-17 02:20:36 +04:00
} ;
/* x,y -> PSZ_ */
2012-01-04 23:58:44 +04:00
int pwc_get_size ( struct pwc_device * pdev , int width , int height )
2005-04-17 02:20:36 +04:00
{
2012-01-04 23:58:44 +04:00
int i ;
2005-04-17 02:20:36 +04:00
/* Find the largest size supported by the camera that fits into the
2012-01-04 23:58:44 +04:00
requested size . */
for ( i = PSZ_MAX - 1 ; i > = 0 ; i - - ) {
if ( ! ( pdev - > image_mask & ( 1 < < i ) ) )
continue ;
if ( pwc_image_sizes [ i ] [ 0 ] < = width & &
pwc_image_sizes [ i ] [ 1 ] < = height )
return i ;
}
/* No mode found, return the smallest mode we have */
2005-04-17 02:20:36 +04:00
for ( i = 0 ; i < PSZ_MAX ; i + + ) {
2012-01-04 23:58:44 +04:00
if ( pdev - > image_mask & ( 1 < < i ) )
return i ;
2005-04-17 02:20:36 +04:00
}
2012-01-04 23:58:44 +04:00
/* Never reached there always is atleast one supported mode */
return 0 ;
2005-04-17 02:20:36 +04:00
}
2012-01-04 23:58:44 +04:00
/* initialize variables depending on type and decompressor */
2005-04-17 02:20:36 +04:00
void pwc_construct ( struct pwc_device * pdev )
{
2006-04-24 17:29:46 +04:00
if ( DEVICE_USE_CODEC1 ( pdev - > type ) ) {
2005-04-17 02:20:36 +04:00
pdev - > image_mask = 1 < < PSZ_SQCIF | 1 < < PSZ_QCIF | 1 < < PSZ_CIF ;
pdev - > vcinterface = 2 ;
pdev - > vendpoint = 4 ;
pdev - > frame_header_size = 0 ;
pdev - > frame_trailer_size = 0 ;
2006-04-24 17:29:46 +04:00
} else if ( DEVICE_USE_CODEC3 ( pdev - > type ) ) {
pdev - > image_mask = 1 < < PSZ_QSIF | 1 < < PSZ_SIF | 1 < < PSZ_VGA ;
pdev - > vcinterface = 3 ;
pdev - > vendpoint = 5 ;
pdev - > frame_header_size = TOUCAM_HEADER_SIZE ;
pdev - > frame_trailer_size = TOUCAM_TRAILER_SIZE ;
} else /* if (DEVICE_USE_CODEC2(pdev->type)) */ {
2005-04-17 02:20:36 +04:00
pdev - > image_mask = 1 < < PSZ_SQCIF | 1 < < PSZ_QSIF | 1 < < PSZ_QCIF | 1 < < PSZ_SIF | 1 < < PSZ_CIF | 1 < < PSZ_VGA ;
pdev - > vcinterface = 3 ;
pdev - > vendpoint = 4 ;
pdev - > frame_header_size = 0 ;
pdev - > frame_trailer_size = 0 ;
}
}