From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Sakari Ailus <sakari.ailus@iki.fi>
Cc: linux-media@vger.kernel.org,
Jean-Philippe Francois <jp.francois@cynove.com>
Subject: Re: [PATCH] omap3isp: preview: Add support for non-GRBG Bayer patterns
Date: Tue, 26 Jun 2012 03:30:09 +0200 [thread overview]
Message-ID: <2750049.lYuKrB1hfJ@avalon> (raw)
In-Reply-To: <20120623082237.GA17925@valkosipuli.retiisi.org.uk>
Hi Sakari,
On Saturday 23 June 2012 11:22:37 Sakari Ailus wrote:
> On Mon, Jun 18, 2012 at 04:30:53PM +0200, Laurent Pinchart wrote:
> > Rearrange the CFA interpolation coefficients table based on the Bayer
> > pattern. Modifying the table during streaming isn't supported anymore,
> > but didn't make sense in the first place anyway.
>
> Why not? I could imagine someone might want to change the table while
> streaming to change the white balance, for example. Gamma tables or the SRGB
> matrix can be used to do mostly the same but we should leave the decision
> which one to use to the user space.
Because making the CFA table runtime-configurable brings an additional
complexity without a use case I'm aware of. The preview engine has separate
gamma tables, white balance matrices, and RGB-to-RGB and RGB-to-YUV matrices
that can be modified during streaming. If a user really needs to modify the
CFA tables during streaming I'll be happy to implement that (and even happier
to receive a patch :-)), but I'm a bit reluctant to add complexity to an
already complex code without a real use case.
> > Support for non-Bayer CFA patterns is dropped as they were not correctly
> > supported, and have never been tested.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> >
> > drivers/media/video/omap3isp/isppreview.c | 118 ++++++++++++++----------
> > 1 files changed, 67 insertions(+), 51 deletions(-)
> >
> > Jean-Philippe,
> >
> > Could you please test this patch on your hardware ?
> >
> > diff --git a/drivers/media/video/omap3isp/isppreview.c
> > b/drivers/media/video/omap3isp/isppreview.c index 8a4935e..bfa3107 100644
> > --- a/drivers/media/video/omap3isp/isppreview.c
> > +++ b/drivers/media/video/omap3isp/isppreview.c
> > @@ -309,36 +309,6 @@ preview_config_dcor(struct isp_prev_device *prev,
> > const void *prev_dcor)>
> > }
> >
> > /*
> >
> > - * preview_config_cfa - Configures the CFA Interpolation parameters.
> > - * @prev_cfa: Structure containing the CFA interpolation table, CFA
> > format
> > - * in the image, vertical and horizontal gradient threshold.
> > - */
> > -static void
> > -preview_config_cfa(struct isp_prev_device *prev, const void *prev_cfa)
> > -{
> > - struct isp_device *isp = to_isp_device(prev);
> > - const struct omap3isp_prev_cfa *cfa = prev_cfa;
> > - unsigned int i;
> > -
> > - isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR,
> > - ISPPRV_PCR_CFAFMT_MASK,
> > - cfa->format << ISPPRV_PCR_CFAFMT_SHIFT);
> > -
> > - isp_reg_writel(isp,
> > - (cfa->gradthrs_vert << ISPPRV_CFA_GRADTH_VER_SHIFT) |
> > - (cfa->gradthrs_horz << ISPPRV_CFA_GRADTH_HOR_SHIFT),
> > - OMAP3_ISP_IOMEM_PREV, ISPPRV_CFA);
> > -
> > - isp_reg_writel(isp, ISPPRV_CFA_TABLE_ADDR,
> > - OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR);
> > -
> > - for (i = 0; i < OMAP3ISP_PREV_CFA_TBL_SIZE; i++) {
> > - isp_reg_writel(isp, cfa->table[i],
> > - OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA);
> > - }
> > -}
> > -
> > -/*
> >
> > * preview_config_gammacorrn - Configures the Gamma Correction table
> > values
> > * @gtable: Structure containing the table for red, blue, green gamma
> > table.
> > */
> >
> > @@ -813,7 +783,7 @@ static const struct preview_update update_attrs[] = {
> >
> > FIELD_SIZEOF(struct prev_params, hmed),
> > offsetof(struct omap3isp_prev_update_config, hmed),
> >
> > }, /* OMAP3ISP_PREV_CFA */ {
> >
> > - preview_config_cfa,
> > + NULL,
> >
> > NULL,
> > offsetof(struct prev_params, cfa),
> > FIELD_SIZEOF(struct prev_params, cfa),
> >
> > @@ -1043,42 +1013,88 @@ preview_config_ycpos(struct isp_prev_device *prev,
> >
> > static void preview_config_averager(struct isp_prev_device *prev, u8
> > average) {
> >
> > struct isp_device *isp = to_isp_device(prev);
> >
> > - struct prev_params *params;
> > - int reg = 0;
> >
> > - params = (prev->params.active & OMAP3ISP_PREV_CFA)
> > - ? &prev->params.params[0] : &prev->params.params[1];
> > -
> > - if (params->cfa.format == OMAP3ISP_CFAFMT_BAYER)
> > - reg = ISPPRV_AVE_EVENDIST_2 << ISPPRV_AVE_EVENDIST_SHIFT |
> > - ISPPRV_AVE_ODDDIST_2 << ISPPRV_AVE_ODDDIST_SHIFT |
> > - average;
> > - else if (params->cfa.format == OMAP3ISP_CFAFMT_RGBFOVEON)
> > - reg = ISPPRV_AVE_EVENDIST_3 << ISPPRV_AVE_EVENDIST_SHIFT |
> > - ISPPRV_AVE_ODDDIST_3 << ISPPRV_AVE_ODDDIST_SHIFT |
> > - average;
> > - isp_reg_writel(isp, reg, OMAP3_ISP_IOMEM_PREV, ISPPRV_AVE);
> > + isp_reg_writel(isp, ISPPRV_AVE_EVENDIST_2 <<
ISPPRV_AVE_EVENDIST_SHIFT |
> > + ISPPRV_AVE_ODDDIST_2 << ISPPRV_AVE_ODDDIST_SHIFT |
> > + average, OMAP3_ISP_IOMEM_PREV, ISPPRV_AVE);
> >
> > }
> >
> > +
> > +#define OMAP3ISP_PREV_CFA_BLK_SIZE (OMAP3ISP_PREV_CFA_TBL_SIZE / 4)
> > +
> >
> > /*
> >
> > * preview_config_input_format - Configure the input format
> > * @prev: The preview engine
> > * @format: Format on the preview engine sink pad
> > *
> >
> > - * Enable CFA interpolation for Bayer formats and disable it for
> > greyscale
> > - * formats.
> > + * Enable and configure CFA interpolation for Bayer formats and disable
> > it for + * greyscale formats.
> > + *
> > + * The CFA table is organised in four blocks, one per Bayer component.
> > The
> > + * hardware expects blocks to follow the Bayer order of the input data,
> > while + * the driver stores the table in GRBG order in memory. The blocks
> > need to be + * reordered to support non-GRBG Bayer patterns.
> >
> > */
> >
> > static void preview_config_input_format(struct isp_prev_device *prev,
> >
> > const struct v4l2_mbus_framefmt *format)
> >
> > {
> >
> > + static const unsigned int cfa_coef_order[4][4] = {
> > + { 0, 1, 2, 3 }, /* GRBG */
> > + { 1, 0, 3, 2 }, /* RGGB */
> > + { 2, 3, 0, 1 }, /* BGGR */
> > + { 3, 2, 1, 0 }, /* GBRG */
> > + };
> >
> > struct isp_device *isp = to_isp_device(prev);
> >
> > + struct prev_params *params;
> > + const unsigned int *order;
> > + unsigned int i;
> > + unsigned int j;
> >
> > - if (format->code != V4L2_MBUS_FMT_Y10_1X10)
> > - isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR,
> > - ISPPRV_PCR_CFAEN);
> > - else
> > + if (format->code == V4L2_MBUS_FMT_Y10_1X10) {
> >
> > isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR,
> >
> > ISPPRV_PCR_CFAEN);
> >
> > + return;
> > + }
> > +
> > + params = (prev->params.active & OMAP3ISP_PREV_CFA)
> > + ? &prev->params.params[0] : &prev->params.params[1];
> > +
> > + isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, ISPPRV_PCR_CFAEN);
> > + isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR,
> > + ISPPRV_PCR_CFAFMT_MASK, ISPPRV_PCR_CFAFMT_BAYER);
> > +
> > + isp_reg_writel(isp,
> > + (params->cfa.gradthrs_vert << ISPPRV_CFA_GRADTH_VER_SHIFT) |
> > + (params->cfa.gradthrs_horz << ISPPRV_CFA_GRADTH_HOR_SHIFT),
> > + OMAP3_ISP_IOMEM_PREV, ISPPRV_CFA);
> > +
> > + switch (prev->formats[PREV_PAD_SINK].code) {
> > + case V4L2_MBUS_FMT_SGRBG10_1X10:
>
> > + default:
> Is the "default" case expected to ever happen?
>
> > + order = cfa_coef_order[0];
> > + break;
> > + case V4L2_MBUS_FMT_SRGGB10_1X10:
> > + order = cfa_coef_order[1];
> > + break;
> > + case V4L2_MBUS_FMT_SBGGR10_1X10:
> > + order = cfa_coef_order[2];
> > + break;
> > + case V4L2_MBUS_FMT_SGBRG10_1X10:
> > + order = cfa_coef_order[3];
> > + break;
> > + }
> > +
> > + isp_reg_writel(isp, ISPPRV_CFA_TABLE_ADDR,
> > + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR);
> > +
> > + for (i = 0; i < 4; ++i) {
> > + __u32 *block = params->cfa.table
> > + + order[i] * OMAP3ISP_PREV_CFA_BLK_SIZE;
> > +
> > + for (j = 0; j < OMAP3ISP_PREV_CFA_BLK_SIZE; ++j)
> > + isp_reg_writel(isp, block[j], OMAP3_ISP_IOMEM_PREV,
> > + ISPPRV_SET_TBL_DATA);
> > + }
> >
> > }
> >
> > /*
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2012-06-26 1:30 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-18 14:30 [PATCH] omap3isp: preview: Add support for non-GRBG Bayer patterns Laurent Pinchart
2012-06-21 13:35 ` jean-philippe francois
2012-06-21 23:29 ` Laurent Pinchart
2012-06-22 14:19 ` jean-philippe francois
2012-06-23 8:22 ` Sakari Ailus
2012-06-26 1:30 ` Laurent Pinchart [this message]
2012-06-26 19:01 ` Sakari Ailus
2012-06-27 14:07 ` Laurent Pinchart
2012-06-27 13:42 ` Ivan T. Ivanov
2012-06-27 13:54 ` Laurent Pinchart
2012-06-27 14:30 ` Ivan T. Ivanov
2012-06-27 14:42 ` Laurent Pinchart
2012-06-27 14:43 ` Ivan T. Ivanov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2750049.lYuKrB1hfJ@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=jp.francois@cynove.com \
--cc=linux-media@vger.kernel.org \
--cc=sakari.ailus@iki.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox