[media] exynos4-is: Correct colorspace handling at FIMC-LITE
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Thu, 20 Jun 2013 13:49:09 +0000 (10:49 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 28 Jun 2013 18:33:27 +0000 (15:33 -0300)
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: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/platform/exynos4-is/fimc-lite.c
include/media/s5p_fimc.h

index 4fa2e05186bd91a04d1a52a6e0e3567541f02eee..08fbfedea90fd59e705b244b81442a4515e2403c 100644 (file)
@@ -44,6 +44,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
        {
                .name           = "YUV 4:2:2 packed, YCbYCr",
                .fourcc         = V4L2_PIX_FMT_YUYV,
+               .colorspace     = V4L2_COLORSPACE_JPEG,
                .depth          = { 16 },
                .color          = FIMC_FMT_YCBYCR422,
                .memplanes      = 1,
@@ -52,6 +53,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
        }, {
                .name           = "YUV 4:2:2 packed, CbYCrY",
                .fourcc         = V4L2_PIX_FMT_UYVY,
+               .colorspace     = V4L2_COLORSPACE_JPEG,
                .depth          = { 16 },
                .color          = FIMC_FMT_CBYCRY422,
                .memplanes      = 1,
@@ -60,6 +62,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
        }, {
                .name           = "YUV 4:2:2 packed, CrYCbY",
                .fourcc         = V4L2_PIX_FMT_VYUY,
+               .colorspace     = V4L2_COLORSPACE_JPEG,
                .depth          = { 16 },
                .color          = FIMC_FMT_CRYCBY422,
                .memplanes      = 1,
@@ -68,6 +71,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
        }, {
                .name           = "YUV 4:2:2 packed, YCrYCb",
                .fourcc         = V4L2_PIX_FMT_YVYU,
+               .colorspace     = V4L2_COLORSPACE_JPEG,
                .depth          = { 16 },
                .color          = FIMC_FMT_YCRYCB422,
                .memplanes      = 1,
@@ -76,6 +80,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
        }, {
                .name           = "RAW8 (GRBG)",
                .fourcc         = V4L2_PIX_FMT_SGRBG8,
+               .colorspace     = V4L2_COLORSPACE_SRGB,
                .depth          = { 8 },
                .color          = FIMC_FMT_RAW8,
                .memplanes      = 1,
@@ -84,6 +89,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
        }, {
                .name           = "RAW10 (GRBG)",
                .fourcc         = V4L2_PIX_FMT_SGRBG10,
+               .colorspace     = V4L2_COLORSPACE_SRGB,
                .depth          = { 10 },
                .color          = FIMC_FMT_RAW10,
                .memplanes      = 1,
@@ -92,6 +98,7 @@ static const struct fimc_fmt fimc_lite_formats[] = {
        }, {
                .name           = "RAW12 (GRBG)",
                .fourcc         = V4L2_PIX_FMT_SGRBG12,
+               .colorspace     = V4L2_COLORSPACE_SRGB,
                .depth          = { 12 },
                .color          = FIMC_FMT_RAW12,
                .memplanes      = 1,
@@ -577,6 +584,7 @@ static const struct fimc_fmt *fimc_lite_subdev_try_fmt(struct fimc_lite *fimc,
                if (WARN_ON(!fmt))
                        return NULL;
 
+               mf->colorspace = fmt->colorspace;
                mf->code = fmt->mbus_code;
        } else {
                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);
 
                        mf->code = sink_fmt->code;
+                       mf->colorspace = sink_fmt->colorspace;
 
                        rect = v4l2_subdev_get_try_crop(fh,
                                                FLITE_SD_PAD_SINK);
                } else {
                        mf->code = sink->fmt->mbus_code;
+                       mf->colorspace = sink->fmt->colorspace;
                        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->height = frame->f_height;
        pixm->field = V4L2_FIELD_NONE;
-       pixm->colorspace = V4L2_COLORSPACE_JPEG;
+       pixm->colorspace = fmt->colorspace;
        return 0;
 }
 
@@ -739,7 +749,7 @@ static int fimc_lite_try_fmt(struct fimc_lite *fimc,
                                                fmt->depth[0]) / 8;
        pixm->num_planes = fmt->memplanes;
        pixm->pixelformat = fmt->fourcc;
-       pixm->colorspace = V4L2_COLORSPACE_JPEG;
+       pixm->colorspace = fmt->colorspace;
        pixm->field = V4L2_FIELD_NONE;
        return 0;
 }
@@ -1071,9 +1081,9 @@ static int fimc_lite_subdev_get_fmt(struct v4l2_subdev *sd,
                fmt->format = *mf;
                return 0;
        }
-       mf->colorspace = V4L2_COLORSPACE_JPEG;
 
        mutex_lock(&fimc->lock);
+       mf->colorspace = f->fmt->colorspace;
        mf->code = f->fmt->mbus_code;
 
        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",
                 fmt->pad, mf->code, mf->width, mf->height);
 
-       mf->colorspace = V4L2_COLORSPACE_JPEG;
        mutex_lock(&fimc->lock);
 
        if ((atomic_read(&fimc->out_path) == FIMC_IO_ISP &&
index 0afadb663bbdc7411f363b3e3ed9912eb4efb29a..b975c285c8a92ad97731b139c1227713c780bcdf 100644 (file)
@@ -116,6 +116,7 @@ struct s5p_platform_fimc {
  * @color: the driver's private color format id
  * @memplanes: number of physically non-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'
  * @mdataplanes: bitmask indicating meta data plane(s), (1 << plane_no)
  * @flags: flags indicating which operation mode format applies to
@@ -127,6 +128,7 @@ struct fimc_fmt {
        u32     color;
        u16     memplanes;
        u16     colplanes;
+       u8      colorspace;
        u8      depth[FIMC_MAX_PLANES];
        u16     mdataplanes;
        u16     flags;