Commit 3d8bffe8 authored by Fabien Dessenne's avatar Fabien Dessenne Committed by Mauro Carvalho Chehab

[media] bdisp: composing support

Support the composing (at VIDEO_CAPTURE) with the _selection API.
v4l2-compliance successfully run ("test Composing: OK")
Signed-off-by: default avatarFabien Dessenne <fabien.dessenne@st.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent d3194520
......@@ -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;
......
......@@ -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;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment