media: vicodec: fix g_selection: either handle crop or compose
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Tue, 12 Mar 2019 11:53:55 +0000 (07:53 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 25 Mar 2019 17:27:57 +0000 (13:27 -0400)
The logic of g_selection was wrong: encoders support crop,
decoders support compose, but the code allowed both.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/platform/vicodec/vicodec-core.c

index 570d5d0..c34a1ac 100644 (file)
@@ -952,18 +952,14 @@ static int vidioc_g_selection(struct file *file, void *priv,
         * encoder supports only cropping on the OUTPUT buffer
         * decoder supports only composing on the CAPTURE buffer
         */
-       if ((ctx->is_enc && s->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) ||
-           (!ctx->is_enc && s->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)) {
+       if (ctx->is_enc && s->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
                switch (s->target) {
-               case V4L2_SEL_TGT_COMPOSE:
                case V4L2_SEL_TGT_CROP:
                        s->r.left = 0;
                        s->r.top = 0;
                        s->r.width = q_data->visible_width;
                        s->r.height = q_data->visible_height;
                        return 0;
-               case V4L2_SEL_TGT_COMPOSE_DEFAULT:
-               case V4L2_SEL_TGT_COMPOSE_BOUNDS:
                case V4L2_SEL_TGT_CROP_DEFAULT:
                case V4L2_SEL_TGT_CROP_BOUNDS:
                        s->r.left = 0;
@@ -972,6 +968,22 @@ static int vidioc_g_selection(struct file *file, void *priv,
                        s->r.height = q_data->coded_height;
                        return 0;
                }
+       } else if (!ctx->is_enc && s->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
+               switch (s->target) {
+               case V4L2_SEL_TGT_COMPOSE:
+                       s->r.left = 0;
+                       s->r.top = 0;
+                       s->r.width = q_data->visible_width;
+                       s->r.height = q_data->visible_height;
+                       return 0;
+               case V4L2_SEL_TGT_COMPOSE_DEFAULT:
+               case V4L2_SEL_TGT_COMPOSE_BOUNDS:
+                       s->r.left = 0;
+                       s->r.top = 0;
+                       s->r.width = q_data->coded_width;
+                       s->r.height = q_data->coded_height;
+                       return 0;
+               }
        }
        return -EINVAL;
 }