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

Commit 5da545ad authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

[media] saa7146: move overlay information from saa7146_fh into saa7146_vv



This is global information, not per-filehandle information.

Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 4894b709
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -436,6 +436,7 @@ static const struct v4l2_ctrl_ops saa7146_ctrl_ops = {
int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
{
{
	struct v4l2_ctrl_handler *hdl = &dev->ctrl_handler;
	struct v4l2_ctrl_handler *hdl = &dev->ctrl_handler;
	struct v4l2_pix_format *fmt;
	struct saa7146_vv *vv;
	struct saa7146_vv *vv;
	int err;
	int err;


@@ -496,6 +497,15 @@ int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
	if (dev->ext_vv_data->capabilities & V4L2_CAP_VBI_CAPTURE)
	if (dev->ext_vv_data->capabilities & V4L2_CAP_VBI_CAPTURE)
		saa7146_vbi_uops.init(dev,vv);
		saa7146_vbi_uops.init(dev,vv);


	fmt = &vv->ov_fb.fmt;
	fmt->width = vv->standard->h_max_out;
	fmt->height = vv->standard->v_max_out;
	fmt->pixelformat = V4L2_PIX_FMT_RGB565;
	fmt->bytesperline = 2 * fmt->width;
	fmt->sizeimage = fmt->bytesperline * fmt->height;
	fmt->colorspace = V4L2_COLORSPACE_SRGB;
	vv->ov_fb.capability = V4L2_FBUF_CAP_LIST_CLIPPING;
	vv->ov_fb.flags = V4L2_FBUF_FLAG_PRIMARY;
	dev->vv_data = vv;
	dev->vv_data = vv;
	dev->vv_callback = &vv_callback;
	dev->vv_callback = &vv_callback;


+12 −11
Original line number Original line Diff line number Diff line
@@ -343,9 +343,9 @@ static void calculate_clipping_registers_rect(struct saa7146_dev *dev, struct sa
	struct saa7146_vv *vv = dev->vv_data;
	struct saa7146_vv *vv = dev->vv_data;
	__le32 *clipping = vv->d_clipping.cpu_addr;
	__le32 *clipping = vv->d_clipping.cpu_addr;


	int width = fh->ov.win.w.width;
	int width = vv->ov.win.w.width;
	int height =  fh->ov.win.w.height;
	int height =  vv->ov.win.w.height;
	int clipcount = fh->ov.nclips;
	int clipcount = vv->ov.nclips;


	u32 line_list[32];
	u32 line_list[32];
	u32 pixel_list[32];
	u32 pixel_list[32];
@@ -365,10 +365,10 @@ static void calculate_clipping_registers_rect(struct saa7146_dev *dev, struct sa
	for(i = 0; i < clipcount; i++) {
	for(i = 0; i < clipcount; i++) {
		int l = 0, r = 0, t = 0, b = 0;
		int l = 0, r = 0, t = 0, b = 0;


		x[i] = fh->ov.clips[i].c.left;
		x[i] = vv->ov.clips[i].c.left;
		y[i] = fh->ov.clips[i].c.top;
		y[i] = vv->ov.clips[i].c.top;
		w[i] = fh->ov.clips[i].c.width;
		w[i] = vv->ov.clips[i].c.width;
		h[i] = fh->ov.clips[i].c.height;
		h[i] = vv->ov.clips[i].c.height;


		if( w[i] < 0) {
		if( w[i] < 0) {
			x[i] += w[i]; w[i] = -w[i];
			x[i] += w[i]; w[i] = -w[i];
@@ -485,13 +485,14 @@ static void saa7146_disable_clipping(struct saa7146_dev *dev)
static void saa7146_set_clipping_rect(struct saa7146_fh *fh)
static void saa7146_set_clipping_rect(struct saa7146_fh *fh)
{
{
	struct saa7146_dev *dev = fh->dev;
	struct saa7146_dev *dev = fh->dev;
	enum v4l2_field field = fh->ov.win.field;
	struct saa7146_vv *vv = dev->vv_data;
	enum v4l2_field field = vv->ov.win.field;
	struct	saa7146_video_dma vdma2;
	struct	saa7146_video_dma vdma2;
	u32 clip_format;
	u32 clip_format;
	u32 arbtr_ctrl;
	u32 arbtr_ctrl;


	/* check clipcount, disable clipping if clipcount == 0*/
	/* check clipcount, disable clipping if clipcount == 0*/
	if( fh->ov.nclips == 0 ) {
	if (vv->ov.nclips == 0) {
		saa7146_disable_clipping(dev);
		saa7146_disable_clipping(dev);
		return;
		return;
	}
	}
@@ -651,8 +652,8 @@ int saa7146_enable_overlay(struct saa7146_fh *fh)
	struct saa7146_dev *dev = fh->dev;
	struct saa7146_dev *dev = fh->dev;
	struct saa7146_vv *vv = dev->vv_data;
	struct saa7146_vv *vv = dev->vv_data;


	saa7146_set_window(dev, fh->ov.win.w.width, fh->ov.win.w.height, fh->ov.win.field);
	saa7146_set_window(dev, vv->ov.win.w.width, vv->ov.win.w.height, vv->ov.win.field);
	saa7146_set_position(dev, fh->ov.win.w.left, fh->ov.win.w.top, fh->ov.win.w.height, fh->ov.win.field, vv->ov_fmt->pixelformat);
	saa7146_set_position(dev, vv->ov.win.w.left, vv->ov.win.w.top, vv->ov.win.w.height, vv->ov.win.field, vv->ov_fmt->pixelformat);
	saa7146_set_output_format(dev, vv->ov_fmt->trans);
	saa7146_set_output_format(dev, vv->ov_fmt->trans);
	saa7146_set_clipping_rect(fh);
	saa7146_set_clipping_rect(fh);


+20 −17
Original line number Original line Diff line number Diff line
@@ -112,8 +112,8 @@ int saa7146_start_preview(struct saa7146_fh *fh)


	DEB_EE("dev:%p, fh:%p\n", dev, fh);
	DEB_EE("dev:%p, fh:%p\n", dev, fh);


	/* check if we have overlay informations */
	/* check if we have overlay information */
	if( NULL == fh->ov.fh ) {
	if (vv->ov.fh == NULL) {
		DEB_D("no overlay data available. try S_FMT first.\n");
		DEB_D("no overlay data available. try S_FMT first.\n");
		return -EAGAIN;
		return -EAGAIN;
	}
	}
@@ -139,19 +139,18 @@ int saa7146_start_preview(struct saa7146_fh *fh)
		return -EBUSY;
		return -EBUSY;
	}
	}


	fmt.fmt.win = fh->ov.win;
	fmt.fmt.win = vv->ov.win;
	err = vidioc_try_fmt_vid_overlay(NULL, fh, &fmt);
	err = vidioc_try_fmt_vid_overlay(NULL, fh, &fmt);
	if (0 != err) {
	if (0 != err) {
		saa7146_res_free(vv->video_fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP);
		saa7146_res_free(vv->video_fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP);
		return -EBUSY;
		return -EBUSY;
	}
	}
	fh->ov.win = fmt.fmt.win;
	vv->ov.win = fmt.fmt.win;
	vv->ov_data = &fh->ov;


	DEB_D("%dx%d+%d+%d %s field=%s\n",
	DEB_D("%dx%d+%d+%d %s field=%s\n",
	      fh->ov.win.w.width, fh->ov.win.w.height,
	      vv->ov.win.w.width, vv->ov.win.w.height,
	      fh->ov.win.w.left, fh->ov.win.w.top,
	      vv->ov.win.w.left, vv->ov.win.w.top,
	      vv->ov_fmt->name, v4l2_field_names[fh->ov.win.field]);
	      vv->ov_fmt->name, v4l2_field_names[vv->ov.win.field]);


	if (0 != (ret = saa7146_enable_overlay(fh))) {
	if (0 != (ret = saa7146_enable_overlay(fh))) {
		DEB_D("enabling overlay failed: %d\n", ret);
		DEB_D("enabling overlay failed: %d\n", ret);
@@ -468,6 +467,7 @@ static int vidioc_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *f


	*fb = vv->ov_fb;
	*fb = vv->ov_fb;
	fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
	fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
	fb->flags = V4L2_FBUF_FLAG_PRIMARY;
	return 0;
	return 0;
}
}


@@ -601,7 +601,10 @@ static int vidioc_g_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format


static int vidioc_g_fmt_vid_overlay(struct file *file, void *fh, struct v4l2_format *f)
static int vidioc_g_fmt_vid_overlay(struct file *file, void *fh, struct v4l2_format *f)
{
{
	f->fmt.win = ((struct saa7146_fh *)fh)->ov.win;
	struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
	struct saa7146_vv *vv = dev->vv_data;

	f->fmt.win = vv->ov.win;
	return 0;
	return 0;
}
}


@@ -768,17 +771,17 @@ static int vidioc_s_fmt_vid_overlay(struct file *file, void *__fh, struct v4l2_f
	err = vidioc_try_fmt_vid_overlay(file, fh, f);
	err = vidioc_try_fmt_vid_overlay(file, fh, f);
	if (0 != err)
	if (0 != err)
		return err;
		return err;
	fh->ov.win    = f->fmt.win;
	vv->ov.win    = f->fmt.win;
	fh->ov.nclips = f->fmt.win.clipcount;
	vv->ov.nclips = f->fmt.win.clipcount;
	if (fh->ov.nclips > 16)
	if (vv->ov.nclips > 16)
		fh->ov.nclips = 16;
		vv->ov.nclips = 16;
	if (copy_from_user(fh->ov.clips, f->fmt.win.clips,
	if (copy_from_user(vv->ov.clips, f->fmt.win.clips,
				sizeof(struct v4l2_clip) * fh->ov.nclips)) {
				sizeof(struct v4l2_clip) * vv->ov.nclips)) {
		return -EFAULT;
		return -EFAULT;
	}
	}


	/* fh->ov.fh is used to indicate that we have valid overlay informations, too */
	/* vv->ov.fh is used to indicate that we have valid overlay informations, too */
	fh->ov.fh = fh;
	vv->ov.fh = fh;


	/* check if our current overlay is active */
	/* check if our current overlay is active */
	if (IS_OVERLAY_ACTIVE(fh) != 0) {
	if (IS_OVERLAY_ACTIVE(fh) != 0) {
+1 −4
Original line number Original line Diff line number Diff line
@@ -88,9 +88,6 @@ struct saa7146_fh {
	/* if this is a vbi or capture open */
	/* if this is a vbi or capture open */
	enum v4l2_buf_type	type;
	enum v4l2_buf_type	type;


	/* video overlay */
	struct saa7146_overlay	ov;

	/* video capture */
	/* video capture */
	struct videobuf_queue	video_q;
	struct videobuf_queue	video_q;
	struct v4l2_pix_format	video_fmt;
	struct v4l2_pix_format	video_fmt;
@@ -119,9 +116,9 @@ struct saa7146_vv
	struct saa7146_fh		*video_fh;
	struct saa7146_fh		*video_fh;


	/* video overlay */
	/* video overlay */
	struct saa7146_overlay		ov;
	struct v4l2_framebuffer		ov_fb;
	struct v4l2_framebuffer		ov_fb;
	struct saa7146_format		*ov_fmt;
	struct saa7146_format		*ov_fmt;
	struct saa7146_overlay		*ov_data;
	struct saa7146_fh		*ov_suspend;
	struct saa7146_fh		*ov_suspend;


	/* video capture */
	/* video capture */