diff options
author | Philipp Zabel <p.zabel@pengutronix.de> | 2017-01-20 12:00:21 -0200 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2017-01-31 08:16:01 -0200 |
commit | 4ec319eb828af736a11b48f47bc2421294c76f50 (patch) | |
tree | d857d6e15f343f6c4a0ecbd51d86663745e6724e /drivers/media/platform | |
parent | 126f52b02e6ec6a25f0b32058a91648304922d4a (diff) | |
download | talos-obmc-linux-4ec319eb828af736a11b48f47bc2421294c76f50.tar.gz talos-obmc-linux-4ec319eb828af736a11b48f47bc2421294c76f50.zip |
[media] coda: correctly set capture compose rectangle
Correctly store the rectangle of valid video data in the destination
q_data before rounding up to macroblock size. This fixes the output
of VIDIOC_G_SELECTION for the capture side compose rectangle.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Michael Tretter <m.tretter@pengutronix.de>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r-- | drivers/media/platform/coda/coda-common.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c index 9e6bdafa16f5..fa3ed74af116 100644 --- a/drivers/media/platform/coda/coda-common.c +++ b/drivers/media/platform/coda/coda-common.c @@ -566,7 +566,8 @@ static int coda_try_fmt_vid_out(struct file *file, void *priv, return coda_try_fmt(ctx, codec, f); } -static int coda_s_fmt(struct coda_ctx *ctx, struct v4l2_format *f) +static int coda_s_fmt(struct coda_ctx *ctx, struct v4l2_format *f, + struct v4l2_rect *r) { struct coda_q_data *q_data; struct vb2_queue *vq; @@ -589,10 +590,14 @@ static int coda_s_fmt(struct coda_ctx *ctx, struct v4l2_format *f) q_data->height = f->fmt.pix.height; q_data->bytesperline = f->fmt.pix.bytesperline; q_data->sizeimage = f->fmt.pix.sizeimage; - q_data->rect.left = 0; - q_data->rect.top = 0; - q_data->rect.width = f->fmt.pix.width; - q_data->rect.height = f->fmt.pix.height; + if (r) { + q_data->rect = *r; + } else { + q_data->rect.left = 0; + q_data->rect.top = 0; + q_data->rect.width = f->fmt.pix.width; + q_data->rect.height = f->fmt.pix.height; + } switch (f->fmt.pix.pixelformat) { case V4L2_PIX_FMT_NV12: @@ -621,27 +626,37 @@ static int coda_s_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *f) { struct coda_ctx *ctx = fh_to_ctx(priv); + struct coda_q_data *q_data_src; + struct v4l2_rect r; int ret; ret = coda_try_fmt_vid_cap(file, priv, f); if (ret) return ret; - return coda_s_fmt(ctx, f); + q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT); + r.left = 0; + r.top = 0; + r.width = q_data_src->width; + r.height = q_data_src->height; + + return coda_s_fmt(ctx, f, &r); } static int coda_s_fmt_vid_out(struct file *file, void *priv, struct v4l2_format *f) { struct coda_ctx *ctx = fh_to_ctx(priv); + struct coda_q_data *q_data_src; struct v4l2_format f_cap; + struct v4l2_rect r; int ret; ret = coda_try_fmt_vid_out(file, priv, f); if (ret) return ret; - ret = coda_s_fmt(ctx, f); + ret = coda_s_fmt(ctx, f, NULL); if (ret) return ret; @@ -657,7 +672,13 @@ static int coda_s_fmt_vid_out(struct file *file, void *priv, if (ret) return ret; - return coda_s_fmt(ctx, &f_cap); + q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT); + r.left = 0; + r.top = 0; + r.width = q_data_src->width; + r.height = q_data_src->height; + + return coda_s_fmt(ctx, &f_cap, &r); } static int coda_reqbufs(struct file *file, void *priv, |