[media] bdisp: composing support
authorFabien Dessenne <fabien.dessenne@st.com>
Fri, 10 Jul 2015 08:29:22 +0000 (05:29 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Fri, 17 Jul 2015 12:52:59 +0000 (09:52 -0300)
Support the composing (at VIDEO_CAPTURE) with the _selection API.
v4l2-compliance successfully run ("test Composing: OK")

Signed-off-by: Fabien Dessenne <fabien.dessenne@st.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/sti/bdisp/bdisp-hw.c
drivers/media/platform/sti/bdisp/bdisp-v4l2.c

index 465828e859e2019af324c8c6c13b0e711fb07cc6..c83f9c2fbe3c776e568d85666ba841d44be66f88 100644 (file)
@@ -336,8 +336,8 @@ static int bdisp_hw_get_hv_inc(struct bdisp_ctx *ctx, u16 *h_inc, u16 *v_inc)
 
        src_w = ctx->src.crop.width;
        src_h = ctx->src.crop.height;
-       dst_w = ctx->dst.width;
-       dst_h = ctx->dst.height;
+       dst_w = ctx->dst.crop.width;
+       dst_h = ctx->dst.crop.height;
 
        if (bdisp_hw_get_inc(src_w, dst_w, h_inc) ||
            bdisp_hw_get_inc(src_h, dst_h, v_inc)) {
@@ -483,9 +483,9 @@ static void bdisp_hw_build_node(struct bdisp_ctx *ctx,
        src_rect.width -= src_x_offset;
        src_rect.width = min_t(__s32, MAX_SRC_WIDTH, src_rect.width);
 
-       dst_x_offset = (src_x_offset * dst->width) / ctx->src.crop.width;
+       dst_x_offset = (src_x_offset * dst_width) / ctx->src.crop.width;
        dst_rect.left += dst_x_offset;
-       dst_rect.width = (src_rect.width * dst->width) / ctx->src.crop.width;
+       dst_rect.width = (src_rect.width * dst_width) / ctx->src.crop.width;
 
        /* General */
        src_fmt = src->fmt->pixelformat;
index 9e782ebe18dad063b9c976fedb36826272edbcae..df61355b46f1a9c6d62b8d170d7931fb61beabe5 100644 (file)
@@ -851,33 +851,56 @@ static int bdisp_g_selection(struct file *file, void *fh,
        struct bdisp_frame *frame;
        struct bdisp_ctx *ctx = fh_to_ctx(fh);
 
-       if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) {
-               /* Composing  / capture is not supported */
-               dev_dbg(ctx->bdisp_dev->dev, "Not supported for capture\n");
-               return -EINVAL;
-       }
-
        frame = ctx_get_frame(ctx, s->type);
        if (IS_ERR(frame)) {
                dev_err(ctx->bdisp_dev->dev, "Invalid frame (%p)\n", frame);
                return PTR_ERR(frame);
        }
 
-       switch (s->target) {
-       case V4L2_SEL_TGT_CROP:
-               /* cropped frame */
-               s->r = frame->crop;
+       switch (s->type) {
+       case V4L2_BUF_TYPE_VIDEO_OUTPUT:
+               switch (s->target) {
+               case V4L2_SEL_TGT_CROP:
+                       /* cropped frame */
+                       s->r = frame->crop;
+                       break;
+               case V4L2_SEL_TGT_CROP_DEFAULT:
+               case V4L2_SEL_TGT_CROP_BOUNDS:
+                       /* complete frame */
+                       s->r.left = 0;
+                       s->r.top = 0;
+                       s->r.width = frame->width;
+                       s->r.height = frame->height;
+                       break;
+               default:
+                       dev_err(ctx->bdisp_dev->dev, "Invalid target\n");
+                       return -EINVAL;
+               }
                break;
-       case V4L2_SEL_TGT_CROP_DEFAULT:
-       case V4L2_SEL_TGT_CROP_BOUNDS:
-               /* complete frame */
-               s->r.left = 0;
-               s->r.top = 0;
-               s->r.width = frame->width;
-               s->r.height = frame->height;
+
+       case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+               switch (s->target) {
+               case V4L2_SEL_TGT_COMPOSE:
+               case V4L2_SEL_TGT_COMPOSE_PADDED:
+                       /* composed (cropped) frame */
+                       s->r = frame->crop;
+                       break;
+               case V4L2_SEL_TGT_COMPOSE_DEFAULT:
+               case V4L2_SEL_TGT_COMPOSE_BOUNDS:
+                       /* complete frame */
+                       s->r.left = 0;
+                       s->r.top = 0;
+                       s->r.width = frame->width;
+                       s->r.height = frame->height;
+                       break;
+               default:
+                       dev_err(ctx->bdisp_dev->dev, "Invalid target\n");
+                       return -EINVAL;
+               }
                break;
+
        default:
-               dev_dbg(ctx->bdisp_dev->dev, "Invalid target\n");
+               dev_err(ctx->bdisp_dev->dev, "Invalid type\n");
                return -EINVAL;
        }
 
@@ -906,15 +929,18 @@ static int bdisp_s_selection(struct file *file, void *fh,
        struct bdisp_frame *frame;
        struct bdisp_ctx *ctx = fh_to_ctx(fh);
        struct v4l2_rect *in, out;
+       bool valid = false;
 
-       if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) {
-               /* Composing  / capture is not supported */
-               dev_dbg(ctx->bdisp_dev->dev, "Not supported for capture\n");
-               return -EINVAL;
-       }
+       if ((s->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) &&
+           (s->target == V4L2_SEL_TGT_CROP))
+               valid = true;
+
+       if ((s->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) &&
+           (s->target == V4L2_SEL_TGT_COMPOSE))
+               valid = true;
 
-       if (s->target != V4L2_SEL_TGT_CROP) {
-               dev_dbg(ctx->bdisp_dev->dev, "Invalid target\n");
+       if (!valid) {
+               dev_err(ctx->bdisp_dev->dev, "Invalid type / target\n");
                return -EINVAL;
        }