Commit 1c26190a authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mauro Carvalho Chehab

[media] exynos4-is: Correct colorspace handling at FIMC-LITE

Ensure the colorspace is properly adjusted by the driver for YUV
and Bayer image formats. The subdev try_fmt helper is simplified.
Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 3ad86245
...@@ -44,6 +44,7 @@ static const struct fimc_fmt fimc_lite_formats[] = { ...@@ -44,6 +44,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
{ {
.name = "YUV 4:2:2 packed, YCbYCr", .name = "YUV 4:2:2 packed, YCbYCr",
.fourcc = V4L2_PIX_FMT_YUYV, .fourcc = V4L2_PIX_FMT_YUYV,
.colorspace = V4L2_COLORSPACE_JPEG,
.depth = { 16 }, .depth = { 16 },
.color = FIMC_FMT_YCBYCR422, .color = FIMC_FMT_YCBYCR422,
.memplanes = 1, .memplanes = 1,
...@@ -52,6 +53,7 @@ static const struct fimc_fmt fimc_lite_formats[] = { ...@@ -52,6 +53,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
}, { }, {
.name = "YUV 4:2:2 packed, CbYCrY", .name = "YUV 4:2:2 packed, CbYCrY",
.fourcc = V4L2_PIX_FMT_UYVY, .fourcc = V4L2_PIX_FMT_UYVY,
.colorspace = V4L2_COLORSPACE_JPEG,
.depth = { 16 }, .depth = { 16 },
.color = FIMC_FMT_CBYCRY422, .color = FIMC_FMT_CBYCRY422,
.memplanes = 1, .memplanes = 1,
...@@ -60,6 +62,7 @@ static const struct fimc_fmt fimc_lite_formats[] = { ...@@ -60,6 +62,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
}, { }, {
.name = "YUV 4:2:2 packed, CrYCbY", .name = "YUV 4:2:2 packed, CrYCbY",
.fourcc = V4L2_PIX_FMT_VYUY, .fourcc = V4L2_PIX_FMT_VYUY,
.colorspace = V4L2_COLORSPACE_JPEG,
.depth = { 16 }, .depth = { 16 },
.color = FIMC_FMT_CRYCBY422, .color = FIMC_FMT_CRYCBY422,
.memplanes = 1, .memplanes = 1,
...@@ -68,6 +71,7 @@ static const struct fimc_fmt fimc_lite_formats[] = { ...@@ -68,6 +71,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
}, { }, {
.name = "YUV 4:2:2 packed, YCrYCb", .name = "YUV 4:2:2 packed, YCrYCb",
.fourcc = V4L2_PIX_FMT_YVYU, .fourcc = V4L2_PIX_FMT_YVYU,
.colorspace = V4L2_COLORSPACE_JPEG,
.depth = { 16 }, .depth = { 16 },
.color = FIMC_FMT_YCRYCB422, .color = FIMC_FMT_YCRYCB422,
.memplanes = 1, .memplanes = 1,
...@@ -76,6 +80,7 @@ static const struct fimc_fmt fimc_lite_formats[] = { ...@@ -76,6 +80,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
}, { }, {
.name = "RAW8 (GRBG)", .name = "RAW8 (GRBG)",
.fourcc = V4L2_PIX_FMT_SGRBG8, .fourcc = V4L2_PIX_FMT_SGRBG8,
.colorspace = V4L2_COLORSPACE_SRGB,
.depth = { 8 }, .depth = { 8 },
.color = FIMC_FMT_RAW8, .color = FIMC_FMT_RAW8,
.memplanes = 1, .memplanes = 1,
...@@ -84,6 +89,7 @@ static const struct fimc_fmt fimc_lite_formats[] = { ...@@ -84,6 +89,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
}, { }, {
.name = "RAW10 (GRBG)", .name = "RAW10 (GRBG)",
.fourcc = V4L2_PIX_FMT_SGRBG10, .fourcc = V4L2_PIX_FMT_SGRBG10,
.colorspace = V4L2_COLORSPACE_SRGB,
.depth = { 10 }, .depth = { 10 },
.color = FIMC_FMT_RAW10, .color = FIMC_FMT_RAW10,
.memplanes = 1, .memplanes = 1,
...@@ -92,6 +98,7 @@ static const struct fimc_fmt fimc_lite_formats[] = { ...@@ -92,6 +98,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
}, { }, {
.name = "RAW12 (GRBG)", .name = "RAW12 (GRBG)",
.fourcc = V4L2_PIX_FMT_SGRBG12, .fourcc = V4L2_PIX_FMT_SGRBG12,
.colorspace = V4L2_COLORSPACE_SRGB,
.depth = { 12 }, .depth = { 12 },
.color = FIMC_FMT_RAW12, .color = FIMC_FMT_RAW12,
.memplanes = 1, .memplanes = 1,
...@@ -577,6 +584,7 @@ static const struct fimc_fmt *fimc_lite_subdev_try_fmt(struct fimc_lite *fimc, ...@@ -577,6 +584,7 @@ static const struct fimc_fmt *fimc_lite_subdev_try_fmt(struct fimc_lite *fimc,
if (WARN_ON(!fmt)) if (WARN_ON(!fmt))
return NULL; return NULL;
mf->colorspace = fmt->colorspace;
mf->code = fmt->mbus_code; mf->code = fmt->mbus_code;
} else { } else {
struct flite_frame *sink = &fimc->inp_frame; struct flite_frame *sink = &fimc->inp_frame;
...@@ -588,11 +596,13 @@ static const struct fimc_fmt *fimc_lite_subdev_try_fmt(struct fimc_lite *fimc, ...@@ -588,11 +596,13 @@ static const struct fimc_fmt *fimc_lite_subdev_try_fmt(struct fimc_lite *fimc,
FLITE_SD_PAD_SINK); FLITE_SD_PAD_SINK);
mf->code = sink_fmt->code; mf->code = sink_fmt->code;
mf->colorspace = sink_fmt->colorspace;
rect = v4l2_subdev_get_try_crop(fh, rect = v4l2_subdev_get_try_crop(fh,
FLITE_SD_PAD_SINK); FLITE_SD_PAD_SINK);
} else { } else {
mf->code = sink->fmt->mbus_code; mf->code = sink->fmt->mbus_code;
mf->colorspace = sink->fmt->colorspace;
rect = &sink->rect; rect = &sink->rect;
} }
...@@ -696,7 +706,7 @@ static int fimc_lite_g_fmt_mplane(struct file *file, void *fh, ...@@ -696,7 +706,7 @@ static int fimc_lite_g_fmt_mplane(struct file *file, void *fh,
pixm->width = frame->f_width; pixm->width = frame->f_width;
pixm->height = frame->f_height; pixm->height = frame->f_height;
pixm->field = V4L2_FIELD_NONE; pixm->field = V4L2_FIELD_NONE;
pixm->colorspace = V4L2_COLORSPACE_JPEG; pixm->colorspace = fmt->colorspace;
return 0; return 0;
} }
...@@ -739,7 +749,7 @@ static int fimc_lite_try_fmt(struct fimc_lite *fimc, ...@@ -739,7 +749,7 @@ static int fimc_lite_try_fmt(struct fimc_lite *fimc,
fmt->depth[0]) / 8; fmt->depth[0]) / 8;
pixm->num_planes = fmt->memplanes; pixm->num_planes = fmt->memplanes;
pixm->pixelformat = fmt->fourcc; pixm->pixelformat = fmt->fourcc;
pixm->colorspace = V4L2_COLORSPACE_JPEG; pixm->colorspace = fmt->colorspace;
pixm->field = V4L2_FIELD_NONE; pixm->field = V4L2_FIELD_NONE;
return 0; return 0;
} }
...@@ -1071,9 +1081,9 @@ static int fimc_lite_subdev_get_fmt(struct v4l2_subdev *sd, ...@@ -1071,9 +1081,9 @@ static int fimc_lite_subdev_get_fmt(struct v4l2_subdev *sd,
fmt->format = *mf; fmt->format = *mf;
return 0; return 0;
} }
mf->colorspace = V4L2_COLORSPACE_JPEG;
mutex_lock(&fimc->lock); mutex_lock(&fimc->lock);
mf->colorspace = f->fmt->colorspace;
mf->code = f->fmt->mbus_code; mf->code = f->fmt->mbus_code;
if (fmt->pad == FLITE_SD_PAD_SINK) { if (fmt->pad == FLITE_SD_PAD_SINK) {
...@@ -1102,7 +1112,6 @@ static int fimc_lite_subdev_set_fmt(struct v4l2_subdev *sd, ...@@ -1102,7 +1112,6 @@ static int fimc_lite_subdev_set_fmt(struct v4l2_subdev *sd,
v4l2_dbg(1, debug, sd, "pad%d: code: 0x%x, %dx%d\n", v4l2_dbg(1, debug, sd, "pad%d: code: 0x%x, %dx%d\n",
fmt->pad, mf->code, mf->width, mf->height); fmt->pad, mf->code, mf->width, mf->height);
mf->colorspace = V4L2_COLORSPACE_JPEG;
mutex_lock(&fimc->lock); mutex_lock(&fimc->lock);
if ((atomic_read(&fimc->out_path) == FIMC_IO_ISP && if ((atomic_read(&fimc->out_path) == FIMC_IO_ISP &&
......
...@@ -116,6 +116,7 @@ struct s5p_platform_fimc { ...@@ -116,6 +116,7 @@ struct s5p_platform_fimc {
* @color: the driver's private color format id * @color: the driver's private color format id
* @memplanes: number of physically non-contiguous data planes * @memplanes: number of physically non-contiguous data planes
* @colplanes: number of physically contiguous data planes * @colplanes: number of physically contiguous data planes
* @colorspace: v4l2 colorspace (V4L2_COLORSPACE_*)
* @depth: per plane driver's private 'number of bits per pixel' * @depth: per plane driver's private 'number of bits per pixel'
* @mdataplanes: bitmask indicating meta data plane(s), (1 << plane_no) * @mdataplanes: bitmask indicating meta data plane(s), (1 << plane_no)
* @flags: flags indicating which operation mode format applies to * @flags: flags indicating which operation mode format applies to
...@@ -127,6 +128,7 @@ struct fimc_fmt { ...@@ -127,6 +128,7 @@ struct fimc_fmt {
u32 color; u32 color;
u16 memplanes; u16 memplanes;
u16 colplanes; u16 colplanes;
u8 colorspace;
u8 depth[FIMC_MAX_PLANES]; u8 depth[FIMC_MAX_PLANES];
u16 mdataplanes; u16 mdataplanes;
u16 flags; u16 flags;
......
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