Re: [PATCH v2] media: ov5675: correct the maximum exposure value

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Aug 24, 2020 at 03:23:21PM +0200, Tomasz Figa wrote:
> On Mon, Aug 24, 2020 at 11:00 AM Sakari Ailus
> <sakari.ailus@xxxxxxxxxxxxxxx> wrote:
> >
> > Hi Bingbu,
> >
> > On Mon, Aug 24, 2020 at 11:13:40AM +0800, Bingbu Cao wrote:
> > >
> > >
> > > On 8/22/20 11:03 PM, Tomasz Figa wrote:
> > > > Hi Bingbu,
> > > >
> > > > On Fri, Aug 21, 2020 at 10:00 AM Bingbu Cao <bingbu.cao@xxxxxxxxx> wrote:
> > > >>
> > > >> The unit of exposure value is different from other OmniVision sensors,
> > > >> driver will divide by 2 before set register, the exposure range exposed
> > > >> by v4l2 ctrl to user should be same as others, so the calculation for
> > > >> the maximum exposure value in current driver need be fixed.
> > > >>
> > > >> Signed-off-by: Bingbu Cao <bingbu.cao@xxxxxxxxx>
> > > >> ---
> > > >>  drivers/media/i2c/ov5675.c | 15 ++++++++++-----
> > > >>  1 file changed, 10 insertions(+), 5 deletions(-)
> > > >>
> > > >
> > > > Thanks for the patch! Please see my comments inline.
> > > >
> > > >> diff --git a/drivers/media/i2c/ov5675.c b/drivers/media/i2c/ov5675.c
> > > >> index 8537cc4ca108..9540ce8918f0 100644
> > > >> --- a/drivers/media/i2c/ov5675.c
> > > >> +++ b/drivers/media/i2c/ov5675.c
> > > >> @@ -666,8 +666,8 @@ static int ov5675_set_ctrl(struct v4l2_ctrl *ctrl)
> > > >>         /* Propagate change of current control to all related controls */
> > > >>         if (ctrl->id == V4L2_CID_VBLANK) {
> > > >>                 /* Update max exposure while meeting expected vblanking */
> > > >> -               exposure_max = (ov5675->cur_mode->height + ctrl->val -
> > > >> -                              OV5675_EXPOSURE_MAX_MARGIN) / 2;
> > > >> +               exposure_max = ov5675->cur_mode->height + ctrl->val -
> > > >> +                       OV5675_EXPOSURE_MAX_MARGIN;
> > > >>                 __v4l2_ctrl_modify_range(ov5675->exposure,
> > > >>                                          ov5675->exposure->minimum,
> > > >>                                          exposure_max, ov5675->exposure->step,
> > > >> @@ -689,7 +689,13 @@ static int ov5675_set_ctrl(struct v4l2_ctrl *ctrl)
> > > >>                 break;
> > > >>
> > > >>         case V4L2_CID_EXPOSURE:
> > > >> -               /* 3 least significant bits of expsoure are fractional part */
> > > >> +               /* 4 least significant bits of expsoure are fractional part
> > > >
> > > > exposure
> > > >
> > > >> +                * val = val << 4
> > > >> +                * for ov5675, the unit of exposure is differnt from other
> > > >
> > > > different
> > > >
> > > >> +                * OmniVision sensors, its exposure value is twice of the
> > > >> +                * register value, the exposure should be divided by 2 before
> > > >> +                * set register, e.g. val << 3.
> > > >> +                */
> > > >>                 ret = ov5675_write_reg(ov5675, OV5675_REG_EXPOSURE,
> > > >>                                        OV5675_REG_VALUE_24BIT, ctrl->val << 3);
> > > >
> > > > How about turning this code into (ctrl->val << 4) / 2 ? It will be
> > > > compiled into exactly the same code, but will be obvious that we are
> > > > handling two different factors in the computation.
> > > >
> > > > Another question: Since the V4L2_CID_EXPOSURE control is not specified
> > > > to be in a particular unit and hardware supports fractional exposures,
> > > > why not expose the exposure exactly as it is in the register?
> > > My understanding is that the exposure calculation in userspace is commonly based
> > > on the unit of exposure - line, as some sensor did not support fractional
> > > exposures, so the common calculation only care the integral part. For ov5675, it
> > > is different from others, its register value unit is 2lines instead of lines.
> > >
> > > Sakari, do you have some idea?
> >
> > I've already sent v2 in a pull request to Mauro. So if changes are needed
> > still, please send them on top of v2.
> >
> > Line is commonly used for devices that natively use it (vast majority of
> > raw Bayer camera sensors). So if possible, I'd use the same here. I.e. with
> > two line granularity, the exposure value could be in lines and the step
> > would be 2.
> 
> The sensor unit seems to be 1/8 of a line, so by exposing it from the
> driver as an integer in the unit of lines, we end up losing some
> precision. I'm not sure how relevant it is for image quality, though.

Oh well. Generally it's time consuming to update the registers over I²C and
the more registers you add, the higher the likelihood is to miss doing that
in time. That's why the common pattern of lines / pixels matches really
well with this as both exposure (and the supposedly added fine exposure
control, when needed) match with the registers and control units.

I don't have a perfect answer for this. You could do either. I think I'd be
in favour of keeping the exposure in lines so that the frame rate
calculation works as expected, and adding a fine exposure control if
needed. Does the sub-line exposure value include horizontal blanking?

-- 
Regards,

Sakari Ailus



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux