]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] fix v4l1 backward compatibility in saa7146 driver
authorMichael Hunold <hunold@linuxtv.org>
Wed, 8 Oct 2003 01:48:11 +0000 (18:48 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Wed, 8 Oct 2003 01:48:11 +0000 (18:48 -0700)
 - fix VIDIOC_S_FBUF for v4l1 backward compatility with xfree86 / v4l_drv

drivers/media/common/saa7146_video.c

index 324fb64e1e845e42553d69292607282d4072f16f..812e4a5f876d8491717f60cd496430a4ac4066fc 100644 (file)
@@ -904,6 +904,8 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
        {
                struct v4l2_framebuffer *fb = arg;
                struct saa7146_format *fmt;
+               struct saa7146_fh *ov_fh = NULL;
+               int restart_overlay = 0;
 
                DEB_EE(("VIDIOC_S_FBUF\n"));
 
@@ -913,10 +915,6 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
                        return -EPERM;
                }
 */
-               if( 0 != vv->ov_data ) {
-                       DEB_D(("VIDIOC_S_FBUF: overlay is active.\n"));
-                       return -EPERM;
-               }
 
                /* check args */
                fmt = format_by_fourcc(dev,fb->fmt.pixelformat);
@@ -924,12 +922,27 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
                        return -EINVAL;
                }
                
+               down(&dev->lock);
+
+               if( vv->ov_data != NULL ) {
+                       ov_fh = vv->ov_data->fh;
+                       saa7146_stop_preview(ov_fh);
+                       restart_overlay = 1;
+               }
+
                /* ok, accept it */
                vv->ov_fb = *fb;
                vv->ov_fmt = fmt;
                if (0 == vv->ov_fb.fmt.bytesperline)
                        vv->ov_fb.fmt.bytesperline =
                                vv->ov_fb.fmt.width*fmt->depth/8;
+
+               if( 0 != restart_overlay ) {
+                       saa7146_start_preview(ov_fh);
+               }
+
+               up(&dev->lock);
+
                return 0;
        }
        case VIDIOC_ENUM_FMT: