]> git.karo-electronics.de Git - linux-beck.git/commitdiff
[media] saa7134: fix empress format compliance bugs
authorHans Verkuil <hans.verkuil@cisco.com>
Sat, 1 Jun 2013 13:02:38 +0000 (10:02 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 17 Jun 2013 14:04:08 +0000 (11:04 -0300)
Fix uninitialized fields and a missing TRY_FMT implementation in saa6752hs.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/pci/saa7134/saa6752hs.c
drivers/media/pci/saa7134/saa7134-empress.c

index 8adb7b02ab5a0343be9d52c24ebcb37326112e26..8ac4b1f2322d7e63a6632c640e45497f3355b32e 100644 (file)
@@ -568,10 +568,36 @@ static int saa6752hs_g_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefm
        return 0;
 }
 
+static int saa6752hs_try_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *f)
+{
+       int dist_352, dist_480, dist_720;
+
+       f->code = V4L2_MBUS_FMT_FIXED;
+
+       dist_352 = abs(f->width - 352);
+       dist_480 = abs(f->width - 480);
+       dist_720 = abs(f->width - 720);
+       if (dist_720 < dist_480) {
+               f->width = 720;
+               f->height = 576;
+       } else if (dist_480 < dist_352) {
+               f->width = 480;
+               f->height = 576;
+       } else {
+               f->width = 352;
+               if (abs(f->height - 576) < abs(f->height - 288))
+                       f->height = 576;
+               else
+                       f->height = 288;
+       }
+       f->field = V4L2_FIELD_INTERLACED;
+       f->colorspace = V4L2_COLORSPACE_SMPTE170M;
+       return 0;
+}
+
 static int saa6752hs_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *f)
 {
        struct saa6752hs_state *h = to_state(sd);
-       int dist_352, dist_480, dist_720;
 
        if (f->code != V4L2_MBUS_FMT_FIXED)
                return -EINVAL;
@@ -588,30 +614,15 @@ static int saa6752hs_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefm
          D1     | 720x576 | 720x480
        */
 
-       dist_352 = abs(f->width - 352);
-       dist_480 = abs(f->width - 480);
-       dist_720 = abs(f->width - 720);
-       if (dist_720 < dist_480) {
-               f->width = 720;
-               f->height = 576;
+       saa6752hs_try_mbus_fmt(sd, f);
+       if (f->width == 720)
                h->video_format = SAA6752HS_VF_D1;
-       } else if (dist_480 < dist_352) {
-               f->width = 480;
-               f->height = 576;
+       else if (f->width == 480)
                h->video_format = SAA6752HS_VF_2_3_D1;
-       } else {
-               f->width = 352;
-               if (abs(f->height - 576) <
-                   abs(f->height - 288)) {
-                       f->height = 576;
-                       h->video_format = SAA6752HS_VF_1_2_D1;
-               } else {
-                       f->height = 288;
-                       h->video_format = SAA6752HS_VF_SIF;
-               }
-       }
-       f->field = V4L2_FIELD_INTERLACED;
-       f->colorspace = V4L2_COLORSPACE_SMPTE170M;
+       else if (f->height == 576)
+               h->video_format = SAA6752HS_VF_1_2_D1;
+       else
+               h->video_format = SAA6752HS_VF_SIF;
        return 0;
 }
 
@@ -644,6 +655,7 @@ static const struct v4l2_subdev_core_ops saa6752hs_core_ops = {
 
 static const struct v4l2_subdev_video_ops saa6752hs_video_ops = {
        .s_mbus_fmt = saa6752hs_s_mbus_fmt,
+       .try_mbus_fmt = saa6752hs_try_mbus_fmt,
        .g_mbus_fmt = saa6752hs_g_mbus_fmt,
 };
 
index 973fa65eb3d33f89c1722f4250000a99346ca2a9..e66bc3d969cfb36e7ec17b145439517ecaae5bbb 100644 (file)
@@ -212,7 +212,7 @@ static int empress_enum_fmt_vid_cap(struct file *file, void  *priv,
 
        strlcpy(f->description, "MPEG TS", sizeof(f->description));
        f->pixelformat = V4L2_PIX_FMT_MPEG;
-
+       f->flags = V4L2_FMT_FLAG_COMPRESSED;
        return 0;
 }
 
@@ -227,6 +227,8 @@ static int empress_g_fmt_vid_cap(struct file *file, void *priv,
        v4l2_fill_pix_format(&f->fmt.pix, &mbus_fmt);
        f->fmt.pix.pixelformat  = V4L2_PIX_FMT_MPEG;
        f->fmt.pix.sizeimage    = TS_PACKET_SIZE * dev->ts.nr_packets;
+       f->fmt.pix.bytesperline = 0;
+       f->fmt.pix.priv = 0;
 
        return 0;
 }
@@ -243,6 +245,8 @@ static int empress_s_fmt_vid_cap(struct file *file, void *priv,
 
        f->fmt.pix.pixelformat  = V4L2_PIX_FMT_MPEG;
        f->fmt.pix.sizeimage    = TS_PACKET_SIZE * dev->ts.nr_packets;
+       f->fmt.pix.bytesperline = 0;
+       f->fmt.pix.priv = 0;
 
        return 0;
 }
@@ -251,9 +255,16 @@ static int empress_try_fmt_vid_cap(struct file *file, void *priv,
                                struct v4l2_format *f)
 {
        struct saa7134_dev *dev = file->private_data;
+       struct v4l2_mbus_framefmt mbus_fmt;
+
+       v4l2_fill_mbus_format(&mbus_fmt, &f->fmt.pix, V4L2_MBUS_FMT_FIXED);
+       saa_call_all(dev, video, try_mbus_fmt, &mbus_fmt);
+       v4l2_fill_pix_format(&f->fmt.pix, &mbus_fmt);
 
        f->fmt.pix.pixelformat  = V4L2_PIX_FMT_MPEG;
        f->fmt.pix.sizeimage    = TS_PACKET_SIZE * dev->ts.nr_packets;
+       f->fmt.pix.bytesperline = 0;
+       f->fmt.pix.priv = 0;
 
        return 0;
 }