Re: [PATCH 2/2] media: ov5645: Report number of skip frames
From: Todor Tomov
Date: Tue Nov 06 2018 - 07:31:19 EST
Hi Sakari,
Thank you for the reply and sorry for not following up on this for so long.
On 19.06.2018 07:04, Sakari Ailus wrote:
> Hi Todor,
>
> On Mon, Jun 18, 2018 at 11:06:59AM +0300, Todor Tomov wrote:
>> The OV5645 supports automatic exposure (AE) and automatic white
>> balance (AWB). When streaming is started it takes up to 5 frames
>> until the AE and AWB converge and output a frame with good quality.
>
> The frames aren't bad as such; it's just that the AE hasn't converged yet.
> I presume the number of the frames needed depends on the lighting
> conditions.
Yes, the number of frames (for AE and AWB converge) is different in
different conditions. From testing I see usually 4 frames are needed,
in more rare cases - 5 frames. The sensor doesn't provide any information
about the state of the algorithms - are they currently converged or not.
So the driver has no way to check that or tell for sure.
>
> The g_skip_frames is intended to tell the frames really are bad, i.e.
> distorted or broken somehow.
I was about to say that if the exposure is severely wrong then they are
bad enough to not be used, which means that they are anyway bad, however...
>
> I wouldn't discard them on the grounds of unconverged exposure. If we did,
> then on which other grounds should the frames be discarded as well? Does
> the white balance and focus need to be converged as well before considering
> the frames good, for instance?
...I agree that this measure for a bad vs not bad frame is quite subjective
(when we have no feedback about the state of the algorithms).
>
> If you need this, I'd use a control instead to tell AE has converged.
>
> I wonder what others think.
It would be nice to hear any ideas if anyone has any. I wonder whether the
driver can do anything useful besides leaving it to the userspace.
Best regards,
Todor
>
>>
>> Implement g_skip_frames to report number of frames to be skipped
>> when streaming is started.
>>
>> Signed-off-by: Todor Tomov <todor.tomov@xxxxxxxxxx>
>> ---
>> drivers/media/i2c/ov5645.c | 15 +++++++++++++++
>> 1 file changed, 15 insertions(+)
>>
>> diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c
>> index 1722cda..00bc3c0 100644
>> --- a/drivers/media/i2c/ov5645.c
>> +++ b/drivers/media/i2c/ov5645.c
>> @@ -70,6 +70,9 @@
>> #define OV5645_SDE_SAT_U 0x5583
>> #define OV5645_SDE_SAT_V 0x5584
>>
>> +/* Number of frames needed for AE and AWB to converge */
>> +#define OV5645_NUM_OF_SKIP_FRAMES 5
>> +
>> struct reg_value {
>> u16 reg;
>> u8 val;
>> @@ -1071,6 +1074,13 @@ static int ov5645_s_stream(struct v4l2_subdev *subdev, int enable)
>> return 0;
>> }
>>
>> +static int ov5645_get_skip_frames(struct v4l2_subdev *sd, u32 *frames)
>> +{
>> + *frames = OV5645_NUM_OF_SKIP_FRAMES;
>> +
>> + return 0;
>> +}
>> +
>> static const struct v4l2_subdev_core_ops ov5645_core_ops = {
>> .s_power = ov5645_s_power,
>> };
>> @@ -1088,10 +1098,15 @@ static const struct v4l2_subdev_pad_ops ov5645_subdev_pad_ops = {
>> .get_selection = ov5645_get_selection,
>> };
>>
>> +static const struct v4l2_subdev_sensor_ops ov5645_sensor_ops = {
>> + .g_skip_frames = ov5645_get_skip_frames,
>> +};
>> +
>> static const struct v4l2_subdev_ops ov5645_subdev_ops = {
>> .core = &ov5645_core_ops,
>> .video = &ov5645_video_ops,
>> .pad = &ov5645_subdev_pad_ops,
>> + .sensor = &ov5645_sensor_ops,
>> };
>>
>> static int ov5645_probe(struct i2c_client *client,
>> --
>> 2.7.4
>>
>