All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: Jai Luthra <jai.luthra@ideasonboard.com>
Cc: "Dave Stevenson" <dave.stevenson@raspberrypi.com>,
	"Hans Verkuil" <hans@jjverkuil.nl>,
	"Jacopo Mondi" <jacopo.mondi@ideasonboard.com>,
	"Laurent Pinchart" <laurent.pinchart@ideasonboard.com>,
	linux-media@vger.kernel.org,
	Prabhakar <prabhakar.csengg@gmail.com>,
	"Kate Hsuan" <hpa@redhat.com>,
	"Tommaso Merciai" <tomm.merciai@gmail.com>,
	"Benjamin Mugnier" <benjamin.mugnier@foss.st.com>,
	"Sylvain Petinot" <sylvain.petinot@foss.st.com>,
	"Christophe JAILLET" <christophe.jaillet@wanadoo.fr>,
	"Julien Massot" <julien.massot@collabora.com>,
	"Naushir Patuck" <naush@raspberrypi.com>,
	"Yan, Dongcheng" <dongcheng.yan@intel.com>,
	"Stefan Klug" <stefan.klug@ideasonboard.com>,
	"Mirela Rabulea" <mirela.rabulea@nxp.com>,
	"André Apitzsch" <git@apitzsch.eu>,
	"Heimir Thor Sverrisson" <heimir.sverrisson@gmail.com>,
	"Kieran Bingham" <kieran.bingham@ideasonboard.com>,
	"Mehdi Djait" <mehdi.djait@linux.intel.com>,
	"Ricardo Ribalda Delgado" <ribalda@kernel.org>,
	"Hans de Goede" <hansg@kernel.org>,
	"Tomi Valkeinen" <tomi.valkeinen@ideasonboard.com>,
	"David Plowman" <david.plowman@raspberrypi.com>,
	"Yu, Ong Hock" <ong.hock.yu@intel.com>,
	"Ng, Khai Wen" <khai.wen.ng@intel.com>,
	"Rishikesh Donadkar" <r-donadkar@ti.com>
Subject: Re: [PATCH v5 06/10] media: imx219: Fix vertical blanking and exposure for analogue binning
Date: Thu, 11 Jun 2026 11:58:06 +0300	[thread overview]
Message-ID: <aip4nt7ZGlc3GeGf@kekkonen.localdomain> (raw)
In-Reply-To: <178108737654.1799417.12257128301401647481@freya>

Hi Jai,

On Wed, Jun 10, 2026 at 03:59:36PM +0530, Jai Luthra wrote:
> > > > OPTION 1 (as proposed by Sakari):
> > > > 
> > > >     Fix PIXEL_RATE to 182400000 and allow **negative values** for HBLANK
> > > >     and VBLANK controls when using 2x2-special-binning mode.
> > > > 
> > > >     This will break any userspace tools, many libcamera pipelines included,
> > > >     that never expected those control values to be negative (even though
> > > >     the API has always permitted those)
> > 
> > That's a clear bug, but it only becomes apparent when the sign bit is set.
> > 
> 
> Agreed, I'll try to send patches for that in libcamera regardless of what
> we do here.

Thanks, this is much appreciated!

> 
> > > > 
> > > > OPTION 2 (something that struck me today morning discussing with Jacopo):
> > > >     
> > > >     Fix PIXEL_RATE to 182400000 but **adjust the HBLANK values** to go
> > > >     lower to compensate, which will diverge from the sensor registers which
> > > >     keep MIN_LINE_LENGTH fixed across both binning modes.
> > > > 
> > > >     This will make the driver quite more complicated, but userspace
> > > >     expectations of non-negative blankings will be met. And it's likely
> > > >     that the sensor is internally doing pre-ADC averaging horizontally as
> > > >     well, or so my best guess is.
> > > > 
> > > 
> > > Which makes me lean more on OPTION 2 now.
> > > 
> > > In our case above with 2x2-special-binning mode for 1640x1232, the register
> > > values are:
> > > 
> > >     LINE_LENGTH = 3560 pixels
> > >     FRAME_LENGTH = 632 lines
> > > 
> > > 
> > > So OPTION 1 would give us:
> > > 
> > >     HBLANK = 1920, VBLANK = -600
> > > 
> > > When actually the datasheet's "H Binning = Analog" would suggest to me that
> > > reality looks more like:
> > > 
> > >     LINE_LENGTH = 1780 pixels
> > >     FRAME_LENGTH = 1264 lines
> > > 
> > > So OPTION 2 would give us:
> > > 
> > >     HBLANK = 140, VBLANK = 32
> > 
> > This approach has the downsides that 1) it doesn't reflect what the sensor
> > apparently does and 2) you lose one bit of granularity on line length in
> > pixels.
> > 
> 
> I agree with you on 2)
> 
> On 1) though I don't think the sensor's register values are a good
> indicator of what the sensor apparently does.

Let's say the sensor still behaves as if it is using these values in the
control of its internal timing. And as that's the case, I think we can say
these are in fact used for internal sensor timing -- there's no suggestion
of anything else.

If 4x analogue binning was used for the "special binning" mode, then why
would the sensor vendor have written it's special, instead of just saying
it's "4x analogue binning"?

I tested the effect of setting the horizontal blanking and it seems the
step value appears to be 8, not 1 which is suggested by the driver and not
mentioned in the specification.

So even if you multiply FLL and divide LLP by 2 for the special binning
mode, no information is lost and the sensor configurability remains
unaffected. I still wouldn't do this as it's going to be a perpetual glitch
in a driver meant to be exemplary. An integer type change in libcamera
would be a passing issue, albeit it would inflict some intermediate pain.

In either case I'd fix the HBLANK step before changing the rest.

> 
> For example, FLL being programmed to ~ 1/4th of analogue crop height, while
> LLP being fixed to ~ analogue crop width would suggest the sensor is
> averaging 4 R/Gr/Gb/B pixels vertically in the analogue domain (possibly
> through common FD charge summing) before the ADC reads it out.
> 
> But the table in the datasheet clearly mentions horizontal binning is
> (also) done in the analogue domain. Which makes more sense as well, given
> the output has an average of a 2x2 block of pixels and not a 4x1 block of
> pixels.
> 
> > The advantage still is that it works around the sign bit issue. The new
> > controls still have their proper values but conversion between the two
> > becomes rather complicated. See
> > <URL:https://git.linuxtv.org/sailus/media_tree.git/commit/?h=metadata&id=366cb25c7d944ef2935668a07471e4576e7088ed>
> > for instance how it looks like without that.
> > 
> 
> I see.. well IMHO even the LLP and FLL controls should try to model what
> the sensor does (if it is known, at least) rather than being just a 1-to-1
> mapping of the sensor registers. Which as Dave and I have mentioned, is not
> the case in many sensors that scale the HMAX register units according to
> some lower frequency clock (so 1 clock cycle => multiple pixels)
> 
> In this particular case it would mean the new controls should scale like:
> 
> FRAME_LENGTH = FLL_REG / 2
> LINE_LENGTH = LLP_REG * 2
> 
> When analogue binning is used. Which should make your code slightly easier,
> even if not re-usable across all sensors.

-- 
Regards,

Sakari Ailus

  parent reply	other threads:[~2026-06-11  8:58 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-07 21:53 [PATCH v5 00/10] Metadata series preparation Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 00/16] " Sakari Ailus
2026-06-07 21:53 ` [PATCH v5 01/10] media: Documentation: Improve pixel rate calculation documentation Sakari Ailus
2026-06-07 21:53 ` [PATCH v5 02/10] media: imx219: Scale the vblank limits according to rate_factor Sakari Ailus
2026-06-08  7:26   ` Laurent Pinchart
2026-06-08 15:29   ` Dave Stevenson
2026-06-08 21:28     ` Laurent Pinchart
2026-06-09  5:58       ` Jai Luthra
2026-06-09  6:01         ` Jai Luthra
2026-06-10 11:48           ` Laurent Pinchart
2026-06-07 21:53 ` [PATCH v5 03/10] media: imx219: Account rate_factor in setting upper exposure limit Sakari Ailus
2026-06-07 22:05   ` sashiko-bot
2026-06-08  9:06   ` Laurent Pinchart
2026-06-08 13:44     ` Sakari Ailus
2026-06-08 15:42   ` Dave Stevenson
2026-06-08 21:38     ` Laurent Pinchart
2026-06-18 10:40     ` Sakari Ailus
2026-07-02 17:04       ` Dave Stevenson
2026-07-03 21:36         ` Sakari Ailus
2026-06-07 21:53 ` [PATCH v5 04/10] media: imx219: Make control handler ops for PIXEL_RATE NULL Sakari Ailus
2026-06-08  7:36   ` Laurent Pinchart
2026-06-08  7:53     ` Jacopo Mondi
2026-06-08  8:03       ` Laurent Pinchart
2026-06-08  8:14         ` Sakari Ailus
2026-06-08  8:24           ` Laurent Pinchart
2026-06-08 10:21             ` Sakari Ailus
2026-06-08 10:27               ` Laurent Pinchart
2026-06-08 13:47                 ` Sakari Ailus
2026-06-08 14:42                   ` Laurent Pinchart
2026-06-09  6:29                     ` Jacopo Mondi
2026-06-09 14:55                       ` Hans Verkuil
2026-06-09 15:15                         ` Laurent Pinchart
2026-06-09 15:56                           ` Dave Stevenson
2026-06-09 16:07                             ` Laurent Pinchart
2026-06-09 16:44                               ` Dave Stevenson
2026-06-07 21:53 ` [PATCH v5 05/10] media: imx219: Rename "binning" as "bin_hv" in imx219_set_pad_format Sakari Ailus
2026-06-08 15:45   ` Dave Stevenson
2026-06-07 21:53 ` [PATCH v5 06/10] media: imx219: Fix vertical blanking and exposure for analogue binning Sakari Ailus
2026-06-07 22:07   ` sashiko-bot
2026-06-08  6:58   ` Jacopo Mondi
2026-06-08  9:10     ` Laurent Pinchart
2026-06-08 14:07       ` Sakari Ailus
2026-06-08 16:23         ` Jai Luthra
2026-06-08 21:52           ` Laurent Pinchart
2026-06-10  8:27             ` Sakari Ailus
2026-06-10  8:45               ` Jai Luthra
2026-06-08 10:31     ` Jai Luthra
2026-06-08 11:19       ` Jai Luthra
2026-06-10  9:47         ` Sakari Ailus
2026-06-10 10:29           ` Jai Luthra
2026-06-10 10:57             ` Jai Luthra
2026-06-11  8:58             ` Sakari Ailus [this message]
2026-06-08 18:06       ` Dave Stevenson
2026-06-09 16:48         ` Jai Luthra
2026-06-10 10:30           ` Sakari Ailus
2026-06-10 11:59             ` Jai Luthra
2026-06-10 10:13         ` Sakari Ailus
2026-06-10 16:00           ` Jai Luthra
2026-06-08 21:01       ` Laurent Pinchart
2026-06-07 21:53 ` [PATCH v5 07/10] media: Improve enable_streams and disable_streams documentation Sakari Ailus
2026-06-08  9:29   ` Laurent Pinchart
2026-06-08 14:28     ` Sakari Ailus
2026-06-07 21:53 ` [PATCH v5 08/10] media: v4l2-subdev: Move subdev client capabilities into a new struct Sakari Ailus
2026-06-08  9:34   ` Laurent Pinchart
2026-06-08 14:35     ` Sakari Ailus
2026-06-07 21:53 ` [PATCH v5 09/10] media: v4l2-subdev: Add v4l2_subdev_get_fmt_ci() Sakari Ailus
2026-06-08  7:48   ` Laurent Pinchart
2026-06-07 21:53 ` [PATCH v5 10/10] media: v4l2-subdev: Add struct v4l2_subdev_client_info pointer to pad ops Sakari Ailus
2026-06-08 10:16   ` Laurent Pinchart
2026-06-28 14:20     ` Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 01/16] media: Documentation: Improve pixel rate calculation documentation Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 02/16] media: imx219: Account rate_factor in setting upper exposure limit Sakari Ailus
2026-07-02 17:10   ` Dave Stevenson
2026-07-01 12:26 ` [PATCH v6 03/16] media: imx219: Account for rate_factor in control steps Sakari Ailus
2026-07-02 17:09   ` Dave Stevenson
2026-07-01 12:26 ` [PATCH v6 04/16] media: imx219: The horizontal blanking step is 8 Sakari Ailus
2026-07-02 13:57   ` Dave Stevenson
2026-07-01 12:26 ` [PATCH v6 05/16] media: imx219: Rename "binning" as "bin_hv" in imx219_set_pad_format Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 06/16] media: Improve enable_streams and disable_streams documentation Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 07/16] media: v4l2-subdev: Move subdev client capabilities into a new struct Sakari Ailus
2026-07-01 16:17   ` Frank Li
2026-07-01 12:26 ` [PATCH v6 08/16] media: v4l2-subdev: Move op check to sub-device op wrappers Sakari Ailus
2026-07-01 16:37   ` Frank Li
2026-07-04 12:11     ` Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 09/16] media: v4l2-subdev: Always call get_fmt() if set_fmt() is unavailable Sakari Ailus
2026-07-01 16:42   ` Frank Li
2026-07-04 12:15     ` Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 10/16] media: rdacm20: Don't assign set_fmt() Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 11/16] " Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 12/16] media: gc0310: " Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 13/16] media: v4l2-subdev: Add v4l2_subdev_call_ci_state_{active,try} Sakari Ailus
2026-07-01 16:57   ` Frank Li
2026-07-04 12:16     ` Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 14/16] media: mt9m001: Pass sub-device state to set_selection() callback Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 15/16] media: cvs: Drop comments on sub-device operations Sakari Ailus
2026-07-01 12:26 ` [PATCH v6 15/15] media: v4l2-subdev: Add struct v4l2_subdev_client_info pointer to pad ops Sakari Ailus
2026-07-01 17:00   ` Frank Li
2026-07-01 12:26 ` [PATCH v6 16/16] " Sakari Ailus
2026-07-01 17:01   ` Frank Li

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=aip4nt7ZGlc3GeGf@kekkonen.localdomain \
    --to=sakari.ailus@linux.intel.com \
    --cc=benjamin.mugnier@foss.st.com \
    --cc=christophe.jaillet@wanadoo.fr \
    --cc=dave.stevenson@raspberrypi.com \
    --cc=david.plowman@raspberrypi.com \
    --cc=dongcheng.yan@intel.com \
    --cc=git@apitzsch.eu \
    --cc=hans@jjverkuil.nl \
    --cc=hansg@kernel.org \
    --cc=heimir.sverrisson@gmail.com \
    --cc=hpa@redhat.com \
    --cc=jacopo.mondi@ideasonboard.com \
    --cc=jai.luthra@ideasonboard.com \
    --cc=julien.massot@collabora.com \
    --cc=khai.wen.ng@intel.com \
    --cc=kieran.bingham@ideasonboard.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=mehdi.djait@linux.intel.com \
    --cc=mirela.rabulea@nxp.com \
    --cc=naush@raspberrypi.com \
    --cc=ong.hock.yu@intel.com \
    --cc=prabhakar.csengg@gmail.com \
    --cc=r-donadkar@ti.com \
    --cc=ribalda@kernel.org \
    --cc=stefan.klug@ideasonboard.com \
    --cc=sylvain.petinot@foss.st.com \
    --cc=tomi.valkeinen@ideasonboard.com \
    --cc=tomm.merciai@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.