diff options
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-ioctl.c | 36 | ||||
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-streams.c | 6 |
2 files changed, 30 insertions, 12 deletions
diff --git a/drivers/media/pci/ivtv/ivtv-ioctl.c b/drivers/media/pci/ivtv/ivtv-ioctl.c index 683beb4f1951..6fe6c4a0e858 100644 --- a/drivers/media/pci/ivtv/ivtv-ioctl.c +++ b/drivers/media/pci/ivtv/ivtv-ioctl.c | |||
@@ -448,9 +448,12 @@ static int ivtv_g_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *f | |||
448 | static int ivtv_g_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt) | 448 | static int ivtv_g_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt) |
449 | { | 449 | { |
450 | struct ivtv *itv = fh2id(fh)->itv; | 450 | struct ivtv *itv = fh2id(fh)->itv; |
451 | struct ivtv_stream *s = &itv->streams[fh2id(fh)->type]; | ||
451 | struct v4l2_window *winfmt = &fmt->fmt.win; | 452 | struct v4l2_window *winfmt = &fmt->fmt.win; |
452 | 453 | ||
453 | if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) | 454 | if (!(s->caps & V4L2_CAP_VIDEO_OUTPUT_OVERLAY)) |
455 | return -EINVAL; | ||
456 | if (!itv->osd_video_pbase) | ||
454 | return -EINVAL; | 457 | return -EINVAL; |
455 | winfmt->chromakey = itv->osd_chroma_key; | 458 | winfmt->chromakey = itv->osd_chroma_key; |
456 | winfmt->global_alpha = itv->osd_global_alpha; | 459 | winfmt->global_alpha = itv->osd_global_alpha; |
@@ -555,10 +558,13 @@ static int ivtv_try_fmt_vid_out(struct file *file, void *fh, struct v4l2_format | |||
555 | static int ivtv_try_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt) | 558 | static int ivtv_try_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt) |
556 | { | 559 | { |
557 | struct ivtv *itv = fh2id(fh)->itv; | 560 | struct ivtv *itv = fh2id(fh)->itv; |
561 | struct ivtv_stream *s = &itv->streams[fh2id(fh)->type]; | ||
558 | u32 chromakey = fmt->fmt.win.chromakey; | 562 | u32 chromakey = fmt->fmt.win.chromakey; |
559 | u8 global_alpha = fmt->fmt.win.global_alpha; | 563 | u8 global_alpha = fmt->fmt.win.global_alpha; |
560 | 564 | ||
561 | if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) | 565 | if (!(s->caps & V4L2_CAP_VIDEO_OUTPUT_OVERLAY)) |
566 | return -EINVAL; | ||
567 | if (!itv->osd_video_pbase) | ||
562 | return -EINVAL; | 568 | return -EINVAL; |
563 | ivtv_g_fmt_vid_out_overlay(file, fh, fmt); | 569 | ivtv_g_fmt_vid_out_overlay(file, fh, fmt); |
564 | fmt->fmt.win.chromakey = chromakey; | 570 | fmt->fmt.win.chromakey = chromakey; |
@@ -741,6 +747,11 @@ static int ivtv_querycap(struct file *file, void *fh, struct v4l2_capability *vc | |||
741 | snprintf(vcap->bus_info, sizeof(vcap->bus_info), "PCI:%s", pci_name(itv->pdev)); | 747 | snprintf(vcap->bus_info, sizeof(vcap->bus_info), "PCI:%s", pci_name(itv->pdev)); |
742 | vcap->capabilities = itv->v4l2_cap | V4L2_CAP_DEVICE_CAPS; | 748 | vcap->capabilities = itv->v4l2_cap | V4L2_CAP_DEVICE_CAPS; |
743 | vcap->device_caps = s->caps; | 749 | vcap->device_caps = s->caps; |
750 | if ((s->caps & V4L2_CAP_VIDEO_OUTPUT_OVERLAY) && | ||
751 | !itv->osd_video_pbase) { | ||
752 | vcap->capabilities &= ~V4L2_CAP_VIDEO_OUTPUT_OVERLAY; | ||
753 | vcap->device_caps &= ~V4L2_CAP_VIDEO_OUTPUT_OVERLAY; | ||
754 | } | ||
744 | return 0; | 755 | return 0; |
745 | } | 756 | } |
746 | 757 | ||
@@ -1363,6 +1374,7 @@ static int ivtv_try_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder | |||
1363 | static int ivtv_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb) | 1374 | static int ivtv_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb) |
1364 | { | 1375 | { |
1365 | struct ivtv *itv = fh2id(fh)->itv; | 1376 | struct ivtv *itv = fh2id(fh)->itv; |
1377 | struct ivtv_stream *s = &itv->streams[fh2id(fh)->type]; | ||
1366 | u32 data[CX2341X_MBOX_MAX_DATA]; | 1378 | u32 data[CX2341X_MBOX_MAX_DATA]; |
1367 | struct yuv_playback_info *yi = &itv->yuv_info; | 1379 | struct yuv_playback_info *yi = &itv->yuv_info; |
1368 | 1380 | ||
@@ -1386,10 +1398,10 @@ static int ivtv_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb) | |||
1386 | 0, | 1398 | 0, |
1387 | }; | 1399 | }; |
1388 | 1400 | ||
1389 | if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY)) | 1401 | if (!(s->caps & V4L2_CAP_VIDEO_OUTPUT_OVERLAY)) |
1390 | return -EINVAL; | 1402 | return -ENOTTY; |
1391 | if (!itv->osd_video_pbase) | 1403 | if (!itv->osd_video_pbase) |
1392 | return -EINVAL; | 1404 | return -ENOTTY; |
1393 | 1405 | ||
1394 | fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY | | 1406 | fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY | |
1395 | V4L2_FBUF_CAP_GLOBAL_ALPHA; | 1407 | V4L2_FBUF_CAP_GLOBAL_ALPHA; |
@@ -1450,12 +1462,13 @@ static int ivtv_s_fbuf(struct file *file, void *fh, const struct v4l2_framebuffe | |||
1450 | { | 1462 | { |
1451 | struct ivtv_open_id *id = fh2id(fh); | 1463 | struct ivtv_open_id *id = fh2id(fh); |
1452 | struct ivtv *itv = id->itv; | 1464 | struct ivtv *itv = id->itv; |
1465 | struct ivtv_stream *s = &itv->streams[fh2id(fh)->type]; | ||
1453 | struct yuv_playback_info *yi = &itv->yuv_info; | 1466 | struct yuv_playback_info *yi = &itv->yuv_info; |
1454 | 1467 | ||
1455 | if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY)) | 1468 | if (!(s->caps & V4L2_CAP_VIDEO_OUTPUT_OVERLAY)) |
1456 | return -EINVAL; | 1469 | return -ENOTTY; |
1457 | if (!itv->osd_video_pbase) | 1470 | if (!itv->osd_video_pbase) |
1458 | return -EINVAL; | 1471 | return -ENOTTY; |
1459 | 1472 | ||
1460 | itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0; | 1473 | itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0; |
1461 | itv->osd_local_alpha_state = | 1474 | itv->osd_local_alpha_state = |
@@ -1470,9 +1483,12 @@ static int ivtv_overlay(struct file *file, void *fh, unsigned int on) | |||
1470 | { | 1483 | { |
1471 | struct ivtv_open_id *id = fh2id(fh); | 1484 | struct ivtv_open_id *id = fh2id(fh); |
1472 | struct ivtv *itv = id->itv; | 1485 | struct ivtv *itv = id->itv; |
1486 | struct ivtv_stream *s = &itv->streams[fh2id(fh)->type]; | ||
1473 | 1487 | ||
1474 | if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY)) | 1488 | if (!(s->caps & V4L2_CAP_VIDEO_OUTPUT_OVERLAY)) |
1475 | return -EINVAL; | 1489 | return -ENOTTY; |
1490 | if (!itv->osd_video_pbase) | ||
1491 | return -ENOTTY; | ||
1476 | 1492 | ||
1477 | ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, on != 0); | 1493 | ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, on != 0); |
1478 | 1494 | ||
diff --git a/drivers/media/pci/ivtv/ivtv-streams.c b/drivers/media/pci/ivtv/ivtv-streams.c index cfb61f23d8ed..d27c6df97566 100644 --- a/drivers/media/pci/ivtv/ivtv-streams.c +++ b/drivers/media/pci/ivtv/ivtv-streams.c | |||
@@ -130,7 +130,8 @@ static struct { | |||
130 | "decoder MPG", | 130 | "decoder MPG", |
131 | VFL_TYPE_GRABBER, IVTV_V4L2_DEC_MPG_OFFSET, | 131 | VFL_TYPE_GRABBER, IVTV_V4L2_DEC_MPG_OFFSET, |
132 | PCI_DMA_TODEVICE, 0, | 132 | PCI_DMA_TODEVICE, 0, |
133 | V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE, | 133 | V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE | |
134 | V4L2_CAP_VIDEO_OUTPUT_OVERLAY, | ||
134 | &ivtv_v4l2_dec_fops | 135 | &ivtv_v4l2_dec_fops |
135 | }, | 136 | }, |
136 | { /* IVTV_DEC_STREAM_TYPE_VBI */ | 137 | { /* IVTV_DEC_STREAM_TYPE_VBI */ |
@@ -151,7 +152,8 @@ static struct { | |||
151 | "decoder YUV", | 152 | "decoder YUV", |
152 | VFL_TYPE_GRABBER, IVTV_V4L2_DEC_YUV_OFFSET, | 153 | VFL_TYPE_GRABBER, IVTV_V4L2_DEC_YUV_OFFSET, |
153 | PCI_DMA_TODEVICE, 0, | 154 | PCI_DMA_TODEVICE, 0, |
154 | V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE, | 155 | V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE | |
156 | V4L2_CAP_VIDEO_OUTPUT_OVERLAY, | ||
155 | &ivtv_v4l2_dec_fops | 157 | &ivtv_v4l2_dec_fops |
156 | } | 158 | } |
157 | }; | 159 | }; |