Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c03a448 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (6061): ivtv: add VIDIOC_OVERLAY



Add VIDIOC_OVERLAY to enable/disable the OSD. Also add the OSD state to the
log status report.

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 8beb058f
Loading
Loading
Loading
Loading
+39 −6
Original line number Diff line number Diff line
@@ -1217,9 +1217,19 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
		break;
	}

	case VIDIOC_OVERLAY: {
		int *on = arg;

		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
			return -EINVAL;
		ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, *on != 0);
		break;
	}

	case VIDIOC_LOG_STATUS:
	{
		int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT;
		u32 data[CX2341X_MBOX_MAX_DATA];
		struct v4l2_input vidin;
		struct v4l2_audio audin;
		int i;
@@ -1255,6 +1265,22 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
				"Mono",
				"Swapped"
			};
			static const char * const alpha_mode[] = {
				"None",
				"Global",
				"Local",
				"Global and Local"
			};
			static const char * const pixel_format[] = {
				"Indexed",
				"RGB 5:6:5",
				"ARGB 1:5:5:5",
				"ARGB 1:4:4:4",
				"ARGB 8:8:8:8",
				"5",
				"6",
				"7",
			};

			ivtv_get_output(itv, itv->active_output, &vidout);
			ivtv_get_audio_output(itv, 0, &audout);
@@ -1265,6 +1291,11 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
			if (mode < 0 || mode > OUT_PASSTHROUGH)
				mode = OUT_NONE;
			IVTV_INFO("Output Mode:  %s\n", output_modes[mode]);
			ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
			IVTV_INFO("Overlay:      %s, Alpha: %s, Pixel Format: %s\n",
				data[0] & 1 ? "On" : "Off",
				alpha_mode[(data[0] >> 1) & 0x3],
				pixel_format[(data[0] >> 3) & 0x7]);
		}
		IVTV_INFO("Tuner:  %s\n",
			test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
@@ -1279,7 +1310,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
					(s->buffers - s->q_free.buffers) * 100 / s->buffers,
					(s->buffers * s->buf_size) / 1024, s->buffers);
		}
		IVTV_INFO("Read MPEG/VBI: %lld/%lld bytes\n", (long long)itv->mpg_data_received, (long long)itv->vbi_data_inserted);
		IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n", (long long)itv->mpg_data_received, (long long)itv->vbi_data_inserted);
		IVTV_INFO("==================  END STATUS CARD #%d  ==================\n", itv->num);
		break;
	}
@@ -1501,6 +1532,7 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
	case VIDIOC_S_AUDOUT:
	case VIDIOC_S_EXT_CTRLS:
	case VIDIOC_S_FBUF:
	case VIDIOC_OVERLAY:
		ret = v4l2_prio_check(&itv->prio, &id->prio);
		if (ret)
			return ret;
@@ -1554,6 +1586,7 @@ static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
	case VIDIOC_TRY_ENCODER_CMD:
	case VIDIOC_G_FBUF:
	case VIDIOC_S_FBUF:
	case VIDIOC_OVERLAY:
		if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
			printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
			v4l_printk_ioctl(cmd);
+3 −3
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ static struct {
	struct file_operations *fops;
} ivtv_stream_info[] = {
	{	/* IVTV_ENC_STREAM_TYPE_MPG */
		"encoder MPEG",
		"encoder MPG",
		VFL_TYPE_GRABBER, 0,
		PCI_DMA_FROMDEVICE, 0, V4L2_BUF_TYPE_VIDEO_CAPTURE,
		&ivtv_v4l2_enc_fops
@@ -93,7 +93,7 @@ static struct {
		&ivtv_v4l2_enc_fops
	},
	{	/* IVTV_ENC_STREAM_TYPE_PCM */
		"encoder PCM audio",
		"encoder PCM",
		VFL_TYPE_GRABBER, IVTV_V4L2_ENC_PCM_OFFSET,
		PCI_DMA_FROMDEVICE, 0, V4L2_BUF_TYPE_PRIVATE,
		&ivtv_v4l2_enc_fops
@@ -105,7 +105,7 @@ static struct {
		&ivtv_v4l2_enc_fops
	},
	{	/* IVTV_DEC_STREAM_TYPE_MPG */
		"decoder MPEG",
		"decoder MPG",
		VFL_TYPE_GRABBER, IVTV_V4L2_DEC_MPG_OFFSET,
		PCI_DMA_TODEVICE, 0, V4L2_BUF_TYPE_VIDEO_OUTPUT,
		&ivtv_v4l2_dec_fops