Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+13 −4
Original line number Original line Diff line number Diff line
@@ -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[] = {
	}, {
	}, {
		.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[] = {
	}, {
	}, {
		.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[] = {
	}, {
	}, {
		.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[] = {
	}, {
	}, {
		.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[] = {
	}, {
	}, {
		.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[] = {
	}, {
	}, {
		.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,
		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,
						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,
	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,
						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,
		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,
	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 &&
+2 −0
Original line number Original line Diff line number Diff line
@@ -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 {
	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;