[media] coda: correctly set capture compose rectangle
authorPhilipp Zabel <p.zabel@pengutronix.de>
Fri, 20 Jan 2017 14:00:21 +0000 (12:00 -0200)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 31 Jan 2017 10:16:01 +0000 (08:16 -0200)
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>
drivers/media/platform/coda/coda-common.c

index 9e6bdafa16f583fc657940824cf9d1236bd9a249..fa3ed74af116c0310265fe28878b1348d1083057 100644 (file)
@@ -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,