Commit 11fbea3e authored by Jacek Anaszewski's avatar Jacek Anaszewski Committed by Mauro Carvalho Chehab

[media] s5p-jpeg: Ensure setting correct value of the chroma subsampling control

Exynos4x12 has limitations regarding setting chroma subsampling
of an output JPEG image. It cannot be lower than the subsampling
of the raw source image. Also in case of V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY
option the source image fourcc has to be V4L2_PIX_FMT_GREY.
This patch implements try_ctrl callback containing mechanism that
prevents setting invalid value of the V4L2_CID_JPEG_CHROMA_SUBSAMPLING
control.
Signed-off-by: default avatarJacek Anaszewski <j.anaszewski@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Acked-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 4a30d30b
...@@ -1213,6 +1213,40 @@ static int s5p_jpeg_g_volatile_ctrl(struct v4l2_ctrl *ctrl) ...@@ -1213,6 +1213,40 @@ static int s5p_jpeg_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
return 0; return 0;
} }
static int s5p_jpeg_try_ctrl(struct v4l2_ctrl *ctrl)
{
struct s5p_jpeg_ctx *ctx = ctrl_to_ctx(ctrl);
unsigned long flags;
int ret = 0;
spin_lock_irqsave(&ctx->jpeg->slock, flags);
if (ctrl->id == V4L2_CID_JPEG_CHROMA_SUBSAMPLING) {
if (ctx->jpeg->variant->version == SJPEG_S5P)
goto error_free;
/*
* The exynos4x12 device requires input raw image fourcc
* to be V4L2_PIX_FMT_GREY if gray jpeg format
* is to be set.
*/
if (ctx->out_q.fmt->fourcc != V4L2_PIX_FMT_GREY &&
ctrl->val == V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY) {
ret = -EINVAL;
goto error_free;
}
/*
* The exynos4x12 device requires resulting jpeg subsampling
* not to be lower than the input raw image subsampling.
*/
if (ctx->out_q.fmt->subsampling > ctrl->val)
ctrl->val = ctx->out_q.fmt->subsampling;
}
error_free:
spin_unlock_irqrestore(&ctx->jpeg->slock, flags);
return ret;
}
static int s5p_jpeg_s_ctrl(struct v4l2_ctrl *ctrl) static int s5p_jpeg_s_ctrl(struct v4l2_ctrl *ctrl)
{ {
struct s5p_jpeg_ctx *ctx = ctrl_to_ctx(ctrl); struct s5p_jpeg_ctx *ctx = ctrl_to_ctx(ctrl);
...@@ -1238,6 +1272,7 @@ static int s5p_jpeg_s_ctrl(struct v4l2_ctrl *ctrl) ...@@ -1238,6 +1272,7 @@ static int s5p_jpeg_s_ctrl(struct v4l2_ctrl *ctrl)
static const struct v4l2_ctrl_ops s5p_jpeg_ctrl_ops = { static const struct v4l2_ctrl_ops s5p_jpeg_ctrl_ops = {
.g_volatile_ctrl = s5p_jpeg_g_volatile_ctrl, .g_volatile_ctrl = s5p_jpeg_g_volatile_ctrl,
.try_ctrl = s5p_jpeg_try_ctrl,
.s_ctrl = s5p_jpeg_s_ctrl, .s_ctrl = s5p_jpeg_s_ctrl,
}; };
......
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