summaryrefslogtreecommitdiff
path: root/linux/drivers/media/video/gspca/gspca.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/video/gspca/gspca.c')
-rw-r--r--linux/drivers/media/video/gspca/gspca.c165
1 files changed, 42 insertions, 123 deletions
diff --git a/linux/drivers/media/video/gspca/gspca.c b/linux/drivers/media/video/gspca/gspca.c
index 3fecf3dbb..5a0d60cb6 100644
--- a/linux/drivers/media/video/gspca/gspca.c
+++ b/linux/drivers/media/video/gspca/gspca.c
@@ -43,14 +43,12 @@ MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>");
MODULE_DESCRIPTION("GSPCA USB Camera Driver");
MODULE_LICENSE("GPL");
-#define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 2)
-static const char version[] = "2.1.2";
+#define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5)
+static const char version[] = "2.1.5";
static int video_nr = -1;
-static int comp_fac = 30; /* Buffer size ratio when compressed in % */
-
-#ifdef VIDEO_ADV_DEBUG
+#ifdef CONFIG_VIDEO_ADV_DEBUG
int gspca_debug = D_ERR | D_PROBE;
EXPORT_SYMBOL(gspca_debug);
@@ -253,7 +251,7 @@ static void isoc_transfer(struct gspca_dev *gspca_dev)
struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev,
int packet_type,
struct gspca_frame *frame,
- __u8 *data,
+ const __u8 *data,
int len)
{
int i, j;
@@ -327,6 +325,7 @@ static int gspca_is_compressed(__u32 format)
case V4L2_PIX_FMT_MJPEG:
case V4L2_PIX_FMT_JPEG:
case V4L2_PIX_FMT_SPCA561:
+ case V4L2_PIX_FMT_PAC207:
return 1;
}
return 0;
@@ -339,7 +338,7 @@ static void *rvmalloc(unsigned long size)
/* size = PAGE_ALIGN(size); (already done) */
mem = vmalloc_32(size);
- if (mem != 0) {
+ if (mem != NULL) {
memset(mem, 0, size);
adr = (unsigned long) mem;
while ((long) size > 0) {
@@ -366,48 +365,6 @@ static void rvfree(void *mem, unsigned long size)
vfree(mem);
}
-static __u32 get_v4l2_depth(__u32 pixfmt)
-{
- switch (pixfmt) {
-/* case V4L2_PIX_FMT_BGR32:
- case V4L2_PIX_FMT_RGB32:
- return 32; */
- case V4L2_PIX_FMT_RGB24: /* 'RGB3' */
- case V4L2_PIX_FMT_BGR24:
- return 24;
-/* case V4L2_PIX_FMT_RGB565: * 'RGBP' */
- case V4L2_PIX_FMT_YUYV: /* 'YUYV' packed 4.2.2 */
- case V4L2_PIX_FMT_YYUV: /* 'YYUV' */
- return 16;
- case V4L2_PIX_FMT_YUV420: /* 'YU12' planar 4.2.0 */
- case V4L2_PIX_FMT_SPCA501: /* 'S501' YUYV per line */
- return 12;
- case V4L2_PIX_FMT_MJPEG:
- case V4L2_PIX_FMT_JPEG:
- case V4L2_PIX_FMT_SBGGR8: /* 'BA81' Bayer */
- case V4L2_PIX_FMT_SN9C10X: /* 'S910' SN9C10x compression */
- case V4L2_PIX_FMT_SPCA561: /* 'S561' compressed BGGR bayer */
- return 8;
- }
- PDEBUG(D_ERR|D_CONF, "Unknown pixel format %c%c%c%c",
- pixfmt & 0xff,
- (pixfmt >> 8) & 0xff,
- (pixfmt >> 16) & 0xff,
- pixfmt >> 24);
- return 24;
-}
-
-static int gspca_get_buff_size(struct gspca_dev *gspca_dev)
-{
- unsigned int size;
-
- size = gspca_dev->width * gspca_dev->height
- * get_v4l2_depth(gspca_dev->pixfmt) / 8;
- if (!size)
- return -ENOMEM;
- return size;
-}
-
static int frame_alloc(struct gspca_dev *gspca_dev,
unsigned int count)
{
@@ -415,18 +372,14 @@ static int frame_alloc(struct gspca_dev *gspca_dev,
unsigned int frsz;
int i;
- frsz = gspca_get_buff_size(gspca_dev);
- if (frsz < 0)
- return frsz;
+ i = gspca_dev->curr_mode;
+ frsz = gspca_dev->cam.cam_mode[i].sizeimage;
PDEBUG(D_STREAM, "frame alloc frsz: %d", frsz);
- if (count > GSPCA_MAX_FRAMES)
- count = GSPCA_MAX_FRAMES;
- /* if compressed (JPEG), reduce the buffer size */
- if (gspca_is_compressed(gspca_dev->pixfmt))
- frsz = (frsz * comp_fac) / 100 + 600; /* (+ JPEG header sz) */
frsz = PAGE_ALIGN(frsz);
PDEBUG(D_STREAM, "new fr_sz: %d", frsz);
gspca_dev->frsz = frsz;
+ if (count > GSPCA_MAX_FRAMES)
+ count = GSPCA_MAX_FRAMES;
if (gspca_dev->memory == V4L2_MEMORY_MMAP) {
gspca_dev->frbuf = rvmalloc(frsz * count);
if (!gspca_dev->frbuf) {
@@ -462,7 +415,7 @@ static void frame_free(struct gspca_dev *gspca_dev)
int i;
PDEBUG(D_STREAM, "frame free");
- if (gspca_dev->frbuf != 0) {
+ if (gspca_dev->frbuf != NULL) {
rvfree(gspca_dev->frbuf,
gspca_dev->nframes * gspca_dev->frsz);
gspca_dev->frbuf = NULL;
@@ -485,7 +438,7 @@ static void destroy_urbs(struct gspca_dev *gspca_dev)
gspca_dev->urb[i] = NULL;
usb_kill_urb(urb);
- if (urb->transfer_buffer != 0)
+ if (urb->transfer_buffer != NULL)
usb_buffer_free(gspca_dev->dev,
urb->transfer_buffer_length,
urb->transfer_buffer,
@@ -709,7 +662,7 @@ static void gspca_set_default_mode(struct gspca_dev *gspca_dev)
gspca_dev->curr_mode = i;
gspca_dev->width = gspca_dev->cam.cam_mode[i].width;
gspca_dev->height = gspca_dev->cam.cam_mode[i].height;
- gspca_dev->pixfmt = gspca_dev->cam.cam_mode[i].pixfmt;
+ gspca_dev->pixfmt = gspca_dev->cam.cam_mode[i].pixelformat;
}
static int wxh_to_mode(struct gspca_dev *gspca_dev,
@@ -737,11 +690,13 @@ static int gspca_get_mode(struct gspca_dev *gspca_dev,
modeU = modeD = mode;
while ((modeU < gspca_dev->cam.nmodes) || modeD >= 0) {
if (--modeD >= 0) {
- if (gspca_dev->cam.cam_mode[modeD].pixfmt == pixfmt)
+ if (gspca_dev->cam.cam_mode[modeD].pixelformat
+ == pixfmt)
return modeD;
}
if (++modeU < gspca_dev->cam.nmodes) {
- if (gspca_dev->cam.cam_mode[modeU].pixfmt == pixfmt)
+ if (gspca_dev->cam.cam_mode[modeU].pixelformat
+ == pixfmt)
return modeU;
}
}
@@ -759,7 +714,7 @@ static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
index = 0;
j = 0;
for (i = gspca_dev->cam.nmodes; --i >= 0; ) {
- fmt_tb[index] = gspca_dev->cam.cam_mode[i].pixfmt;
+ fmt_tb[index] = gspca_dev->cam.cam_mode[i].pixelformat;
j = 0;
for (;;) {
if (fmt_tb[j] == fmt_tb[index])
@@ -793,27 +748,20 @@ static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_format *fmt)
{
struct gspca_dev *gspca_dev = priv;
+ int mode;
if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;
- fmt->fmt.pix.width = gspca_dev->width;
- fmt->fmt.pix.height = gspca_dev->height;
- fmt->fmt.pix.pixelformat = gspca_dev->pixfmt;
- fmt->fmt.pix.field = V4L2_FIELD_NONE;
- fmt->fmt.pix.bytesperline = get_v4l2_depth(fmt->fmt.pix.pixelformat)
- * fmt->fmt.pix.width / 8;
- fmt->fmt.pix.sizeimage = fmt->fmt.pix.bytesperline
- * fmt->fmt.pix.height;
-/* (should be in the subdriver) */
- fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
- fmt->fmt.pix.priv = 0;
+ mode = gspca_dev->curr_mode;
+ memcpy(&fmt->fmt.pix, &gspca_dev->cam.cam_mode[mode],
+ sizeof fmt->fmt.pix);
return 0;
}
static int try_fmt_vid_cap(struct gspca_dev *gspca_dev,
struct v4l2_format *fmt)
{
- int w, h, mode, mode2, frsz;
+ int w, h, mode, mode2;
if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;
@@ -823,7 +771,7 @@ static int try_fmt_vid_cap(struct gspca_dev *gspca_dev,
/* (luvcview problem) */
if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG)
fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
-#ifdef VIDEO_ADV_DEBUG
+#ifdef CONFIG_VIDEO_ADV_DEBUG
if (gspca_debug & D_CONF)
PDEBUG_MODE("try fmt cap", fmt->fmt.pix.pixelformat, w, h);
#endif
@@ -831,36 +779,19 @@ static int try_fmt_vid_cap(struct gspca_dev *gspca_dev,
mode = wxh_to_mode(gspca_dev, w, h);
/* OK if right palette */
- if (gspca_dev->cam.cam_mode[mode].pixfmt != fmt->fmt.pix.pixelformat) {
+ if (gspca_dev->cam.cam_mode[mode].pixelformat
+ != fmt->fmt.pix.pixelformat) {
/* else, search the closest mode with the same pixel format */
mode2 = gspca_get_mode(gspca_dev, mode,
fmt->fmt.pix.pixelformat);
- if (mode2 >= 0) {
+ if (mode2 >= 0)
mode = mode2;
- } else {
-
- /* no chance, return this mode */
- fmt->fmt.pix.pixelformat =
- gspca_dev->cam.cam_mode[mode].pixfmt;
-#ifdef VIDEO_ADV_DEBUG
- if (gspca_debug & D_CONF) {
- PDEBUG_MODE("new format",
- fmt->fmt.pix.pixelformat,
- gspca_dev->cam.cam_mode[mode].width,
- gspca_dev->cam.cam_mode[mode].height);
- }
-#endif
- }
+/* else
+ ; * no chance, return this mode */
}
- fmt->fmt.pix.width = gspca_dev->cam.cam_mode[mode].width;
- fmt->fmt.pix.height = gspca_dev->cam.cam_mode[mode].height;
- fmt->fmt.pix.bytesperline = get_v4l2_depth(fmt->fmt.pix.pixelformat)
- * fmt->fmt.pix.width / 8;
- frsz = fmt->fmt.pix.bytesperline * fmt->fmt.pix.height;
- if (gspca_is_compressed(fmt->fmt.pix.pixelformat))
- frsz = (frsz * comp_fac) / 100;
- fmt->fmt.pix.sizeimage = frsz;
+ memcpy(&fmt->fmt.pix, &gspca_dev->cam.cam_mode[mode],
+ sizeof fmt->fmt.pix);
return mode; /* used when s_fmt */
}
@@ -883,16 +814,6 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
struct gspca_dev *gspca_dev = priv;
int ret;
-#ifdef CONFIG_VIDEO_V4L1_COMPAT
- /* if v4l1 got JPEG */
- if (fmt->fmt.pix.pixelformat == 0
- && gspca_dev->streaming) {
- fmt->fmt.pix.width = gspca_dev->width;
- fmt->fmt.pix.height = gspca_dev->height;
- fmt->fmt.pix.pixelformat = gspca_dev->pixfmt;
- return 0;
- }
-#endif
if (mutex_lock_interruptible(&gspca_dev->queue_lock))
return -ERESTARTSYS;
@@ -958,7 +879,7 @@ static int dev_open(struct inode *inode, struct file *file)
}
gspca_dev->users++;
file->private_data = gspca_dev;
-#ifdef VIDEO_ADV_DEBUG
+#ifdef CONFIG_VIDEO_ADV_DEBUG
/* activate the v4l2 debug */
if (gspca_debug & D_V4L2)
gspca_dev->vdev.debug |= 3;
@@ -991,7 +912,7 @@ static int dev_close(struct inode *inode, struct file *file)
gspca_dev->sd_desc->close(gspca_dev);
mutex_unlock(&gspca_dev->usb_lock);
frame_free(gspca_dev);
- gspca_dev->capt_file = 0;
+ gspca_dev->capt_file = NULL;
gspca_dev->memory = GSPCA_MEMORY_NO;
}
file->private_data = NULL;
@@ -1059,7 +980,7 @@ static int vidioc_s_ctrl(struct file *file, void *priv,
struct v4l2_control *ctrl)
{
struct gspca_dev *gspca_dev = priv;
- struct ctrl *ctrls;
+ const struct ctrl *ctrls;
int i, ret;
for (i = 0, ctrls = gspca_dev->sd_desc->ctrls;
@@ -1085,7 +1006,7 @@ static int vidioc_g_ctrl(struct file *file, void *priv,
{
struct gspca_dev *gspca_dev = priv;
- struct ctrl *ctrls;
+ const struct ctrl *ctrls;
int i, ret;
for (i = 0, ctrls = gspca_dev->sd_desc->ctrls;
@@ -1165,7 +1086,7 @@ static int vidioc_reqbufs(struct file *file, void *priv,
}
/* only one file may do capture */
- if ((gspca_dev->capt_file != 0 && gspca_dev->capt_file != file)
+ if ((gspca_dev->capt_file != NULL && gspca_dev->capt_file != file)
|| gspca_dev->streaming) {
ret = -EBUSY;
goto out;
@@ -1173,7 +1094,7 @@ static int vidioc_reqbufs(struct file *file, void *priv,
if (rb->count == 0) { /* unrequest? */
frame_free(gspca_dev);
- gspca_dev->capt_file = 0;
+ gspca_dev->capt_file = NULL;
} else {
gspca_dev->memory = rb->memory;
ret = frame_alloc(gspca_dev, rb->count);
@@ -1231,7 +1152,7 @@ static int vidioc_streamon(struct file *file, void *priv,
if (ret < 0)
goto out;
}
-#ifdef VIDEO_ADV_DEBUG
+#ifdef CONFIG_VIDEO_ADV_DEBUG
if (gspca_debug & D_STREAM) {
PDEBUG_MODE("stream on OK",
gspca_dev->pixfmt,
@@ -1382,7 +1303,7 @@ static int vidiocgmbuf(struct file *file, void *priv,
static int dev_mmap(struct file *file, struct vm_area_struct *vma)
{
struct gspca_dev *gspca_dev = file->private_data;
- struct gspca_frame *frame = 0;
+ struct gspca_frame *frame;
struct page *page;
unsigned long addr, start, size;
int i, ret;
@@ -1405,6 +1326,7 @@ static int dev_mmap(struct file *file, struct vm_area_struct *vma)
goto out;
}
+ frame = NULL;
for (i = 0; i < gspca_dev->nframes; ++i) {
if (gspca_dev->frame[i].v4l2_buf.memory != V4L2_MEMORY_MMAP) {
PDEBUG(D_STREAM, "mmap bad memory type");
@@ -1416,7 +1338,7 @@ static int dev_mmap(struct file *file, struct vm_area_struct *vma)
break;
}
}
- if (frame == 0) {
+ if (frame == NULL) {
PDEBUG(D_STREAM, "mmap no frame buffer found");
ret = -EINVAL;
goto out;
@@ -1986,13 +1908,10 @@ static void __exit gspca_exit(void)
module_init(gspca_init);
module_exit(gspca_exit);
-#ifdef VIDEO_ADV_DEBUG
+#ifdef CONFIG_VIDEO_ADV_DEBUG
module_param_named(debug, gspca_debug, int, 0644);
MODULE_PARM_DESC(debug,
"Debug (bit) 0x01:error 0x02:probe 0x04:config"
" 0x08:stream 0x10:frame 0x20:packet 0x40:USBin 0x80:USBout"
" 0x0100: v4l2");
#endif
-module_param(comp_fac, int, 0644);
-MODULE_PARM_DESC(comp_fac,
- "Buffer size ratio when compressed in percent");