]> pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
V4L/DVB (8921): ivtv: fix incorrect capability and assorted sliced vbi and video...
authorHans Verkuil <hverkuil@xs4all.nl>
Sat, 6 Sep 2008 12:56:17 +0000 (09:56 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 12 Oct 2008 11:36:59 +0000 (09:36 -0200)
- V4L2_CAP_VBI_OUTPUT is not supported by ivtv, remove it.
- ivtv_try_fmt_vid_out also needed to constrain the width/height of MPEG decoder
  window sizes.
- allow empty sliced services.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/ivtv/ivtv-cards.h
drivers/media/video/ivtv/ivtv-ioctl.c

index 381af1bceef84c9924ee69b0c33f31a64a78820e..0b8fe85fb697972aae85181a36e09fe86f99e946 100644 (file)
 #define IVTV_CAP_ENCODER (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | \
                          V4L2_CAP_AUDIO | V4L2_CAP_READWRITE | V4L2_CAP_VBI_CAPTURE | \
                          V4L2_CAP_SLICED_VBI_CAPTURE)
-#define IVTV_CAP_DECODER (V4L2_CAP_VBI_OUTPUT | V4L2_CAP_VIDEO_OUTPUT | \
+#define IVTV_CAP_DECODER (V4L2_CAP_VIDEO_OUTPUT | \
                          V4L2_CAP_SLICED_VBI_OUTPUT | V4L2_CAP_VIDEO_OUTPUT_OVERLAY)
 
 struct ivtv_card_video_input {
index e67bf1b15cf3a3f9f1a4809a9780d0a935a98e8f..f00854ad64eab9393faa3c8216cc15eeb58bed0c 100644 (file)
@@ -101,18 +101,15 @@ void ivtv_expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
        }
 }
 
-static int check_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
+static void check_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
 {
        int f, l;
-       u16 set = 0;
 
        for (f = 0; f < 2; f++) {
                for (l = 0; l < 24; l++) {
                        fmt->service_lines[f][l] = select_service_from_set(f, l, fmt->service_lines[f][l], is_pal);
-                       set |= fmt->service_lines[f][l];
                }
        }
-       return set != 0;
 }
 
 u16 ivtv_get_service_set(struct v4l2_sliced_vbi_format *fmt)
@@ -474,7 +471,7 @@ static int ivtv_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format
        int h = fmt->fmt.pix.height;
 
        w = min(w, 720);
-       w = max(w, 1);
+       w = max(w, 2);
        h = min(h, itv->is_50hz ? 576 : 480);
        h = max(h, 2);
        ivtv_g_fmt_vid_cap(file, fh, fmt);
@@ -512,18 +509,18 @@ static int ivtv_try_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_
 static int ivtv_try_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
 {
        struct ivtv_open_id *id = fh;
+       struct ivtv *itv = id->itv;
        s32 w = fmt->fmt.pix.width;
        s32 h = fmt->fmt.pix.height;
        int field = fmt->fmt.pix.field;
        int ret = ivtv_g_fmt_vid_out(file, fh, fmt);
 
-       if (!ret && id->type == IVTV_DEC_STREAM_TYPE_YUV) {
+       w = min(w, 720);
+       w = max(w, 2);
+       h = min(h, itv->is_out_50hz ? 576 : 480);
+       h = max(h, 2);
+       if (id->type == IVTV_DEC_STREAM_TYPE_YUV)
                fmt->fmt.pix.field = field;
-               w = min(w, 720);
-               w = max(w, 2);
-               h = min(h, 576);
-               h = max(h, 2);
-       }
        fmt->fmt.pix.width = w;
        fmt->fmt.pix.height = h;
        return ret;
@@ -593,8 +590,7 @@ static int ivtv_s_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_fo
        if (ret || id->type == IVTV_DEC_STREAM_TYPE_VBI)
                return ret;
 
-       if (check_service_set(vbifmt, itv->is_50hz) == 0)
-               return -EINVAL;
+       check_service_set(vbifmt, itv->is_50hz);
        if (atomic_read(&itv->capturing) > 0)
                return -EBUSY;
        itv->video_dec_func(itv, VIDIOC_S_FMT, fmt);