Message ID | 20250108090329.3185026-2-naush@raspberrypi.com |
---|---|
State | Accepted |
Commit | 07be807dc74c55bf3109f83714d504a97e5f2f1a |
Headers | show |
Series |
|
Related | show |
Hi everyone On Wed, 8 Jan 2025 at 09:03, Naushir Patuck <naush@raspberrypi.com> wrote: > > From: Dave Stevenson <dave.stevenson@raspberrypi.com> > > As another Starvis sensor, it is near identical to imx290/327. > > Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> If it's truly identical I suppose we could have re-registered the imx290 helper under "imx415". But maybe we don't like that and this is probably better! Thanks David > --- > src/ipa/rpi/cam_helper/cam_helper_imx415.cpp | 64 ++++++++++++++++++++ > src/ipa/rpi/cam_helper/meson.build | 1 + > 2 files changed, 65 insertions(+) > create mode 100644 src/ipa/rpi/cam_helper/cam_helper_imx415.cpp > > diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx415.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx415.cpp > new file mode 100644 > index 000000000000..c0a09eee3dee > --- /dev/null > +++ b/src/ipa/rpi/cam_helper/cam_helper_imx415.cpp > @@ -0,0 +1,64 @@ > +/* SPDX-License-Identifier: BSD-2-Clause */ > +/* > + * Copyright (C) 2025, Raspberry Pi Ltd > + * > + * camera helper for imx415 sensor > + */ > + > +#include <cmath> > + > +#include "cam_helper.h" > + > +using namespace RPiController; > + > +class CamHelperImx415 : public CamHelper > +{ > +public: > + CamHelperImx415(); > + uint32_t gainCode(double gain) const override; > + double gain(uint32_t gainCode) const override; > + unsigned int hideFramesStartup() const override; > + unsigned int hideFramesModeSwitch() const override; > + > +private: > + /* > + * Smallest difference between the frame length and integration time, > + * in units of lines. > + */ > + static constexpr int frameIntegrationDiff = 8; > +}; > + > +CamHelperImx415::CamHelperImx415() > + : CamHelper({}, frameIntegrationDiff) > +{ > +} > + > +uint32_t CamHelperImx415::gainCode(double gain) const > +{ > + int code = 66.6667 * std::log10(gain); > + return std::max(0, std::min(code, 0xf0)); > +} > + > +double CamHelperImx415::gain(uint32_t gainCode) const > +{ > + return std::pow(10, 0.015 * gainCode); > +} > + > +unsigned int CamHelperImx415::hideFramesStartup() const > +{ > + /* On startup, we seem to get 1 bad frame. */ > + return 1; > +} > + > +unsigned int CamHelperImx415::hideFramesModeSwitch() const > +{ > + /* After a mode switch, we seem to get 1 bad frame. */ > + return 1; > +} > + > +static CamHelper *create() > +{ > + return new CamHelperImx415(); > +} > + > +static RegisterCamHelper reg("imx415", &create); > diff --git a/src/ipa/rpi/cam_helper/meson.build b/src/ipa/rpi/cam_helper/meson.build > index 03e88fe082e2..abf021474b5c 100644 > --- a/src/ipa/rpi/cam_helper/meson.build > +++ b/src/ipa/rpi/cam_helper/meson.build > @@ -7,6 +7,7 @@ rpi_ipa_cam_helper_sources = files([ > 'cam_helper_imx283.cpp', > 'cam_helper_imx290.cpp', > 'cam_helper_imx296.cpp', > + 'cam_helper_imx415.cpp', > 'cam_helper_imx477.cpp', > 'cam_helper_imx519.cpp', > 'cam_helper_imx708.cpp', > -- > 2.43.0 >
Hi David On Wed, 8 Jan 2025 at 09:53, David Plowman <david.plowman@raspberrypi.com> wrote: > > Hi everyone > > On Wed, 8 Jan 2025 at 09:03, Naushir Patuck <naush@raspberrypi.com> wrote: > > > > From: Dave Stevenson <dave.stevenson@raspberrypi.com> > > > > As another Starvis sensor, it is near identical to imx290/327. > > > > Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com> > > Signed-off-by: Naushir Patuck <naush@raspberrypi.com> > > Reviewed-by: David Plowman <david.plowman@raspberrypi.com> > > If it's truly identical I suppose we could have re-registered the > imx290 helper under "imx415". But maybe we don't like that and this is > probably better! IMX290/327 are 1080p sensors, whilst IMX415 is 4k. I'd written the coment before the delays moved out to camera_sensor_properties. With that removed it's more that all the Starvis sensors are using the same "steps of 0.3dB" for gain. frameIntegrationDiff does differ as 2 on 290/327 vs 8 here. IMHO It probably makes more sense to keep it separate. Dave > Thanks > David > > > --- > > src/ipa/rpi/cam_helper/cam_helper_imx415.cpp | 64 ++++++++++++++++++++ > > src/ipa/rpi/cam_helper/meson.build | 1 + > > 2 files changed, 65 insertions(+) > > create mode 100644 src/ipa/rpi/cam_helper/cam_helper_imx415.cpp > > > > diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx415.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx415.cpp > > new file mode 100644 > > index 000000000000..c0a09eee3dee > > --- /dev/null > > +++ b/src/ipa/rpi/cam_helper/cam_helper_imx415.cpp > > @@ -0,0 +1,64 @@ > > +/* SPDX-License-Identifier: BSD-2-Clause */ > > +/* > > + * Copyright (C) 2025, Raspberry Pi Ltd > > + * > > + * camera helper for imx415 sensor > > + */ > > + > > +#include <cmath> > > + > > +#include "cam_helper.h" > > + > > +using namespace RPiController; > > + > > +class CamHelperImx415 : public CamHelper > > +{ > > +public: > > + CamHelperImx415(); > > + uint32_t gainCode(double gain) const override; > > + double gain(uint32_t gainCode) const override; > > + unsigned int hideFramesStartup() const override; > > + unsigned int hideFramesModeSwitch() const override; > > + > > +private: > > + /* > > + * Smallest difference between the frame length and integration time, > > + * in units of lines. > > + */ > > + static constexpr int frameIntegrationDiff = 8; > > +}; > > + > > +CamHelperImx415::CamHelperImx415() > > + : CamHelper({}, frameIntegrationDiff) > > +{ > > +} > > + > > +uint32_t CamHelperImx415::gainCode(double gain) const > > +{ > > + int code = 66.6667 * std::log10(gain); > > + return std::max(0, std::min(code, 0xf0)); > > +} > > + > > +double CamHelperImx415::gain(uint32_t gainCode) const > > +{ > > + return std::pow(10, 0.015 * gainCode); > > +} > > + > > +unsigned int CamHelperImx415::hideFramesStartup() const > > +{ > > + /* On startup, we seem to get 1 bad frame. */ > > + return 1; > > +} > > + > > +unsigned int CamHelperImx415::hideFramesModeSwitch() const > > +{ > > + /* After a mode switch, we seem to get 1 bad frame. */ > > + return 1; > > +} > > + > > +static CamHelper *create() > > +{ > > + return new CamHelperImx415(); > > +} > > + > > +static RegisterCamHelper reg("imx415", &create); > > diff --git a/src/ipa/rpi/cam_helper/meson.build b/src/ipa/rpi/cam_helper/meson.build > > index 03e88fe082e2..abf021474b5c 100644 > > --- a/src/ipa/rpi/cam_helper/meson.build > > +++ b/src/ipa/rpi/cam_helper/meson.build > > @@ -7,6 +7,7 @@ rpi_ipa_cam_helper_sources = files([ > > 'cam_helper_imx283.cpp', > > 'cam_helper_imx290.cpp', > > 'cam_helper_imx296.cpp', > > + 'cam_helper_imx415.cpp', > > 'cam_helper_imx477.cpp', > > 'cam_helper_imx519.cpp', > > 'cam_helper_imx708.cpp', > > -- > > 2.43.0 > >
diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx415.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx415.cpp new file mode 100644 index 000000000000..c0a09eee3dee --- /dev/null +++ b/src/ipa/rpi/cam_helper/cam_helper_imx415.cpp @@ -0,0 +1,64 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2025, Raspberry Pi Ltd + * + * camera helper for imx415 sensor + */ + +#include <cmath> + +#include "cam_helper.h" + +using namespace RPiController; + +class CamHelperImx415 : public CamHelper +{ +public: + CamHelperImx415(); + uint32_t gainCode(double gain) const override; + double gain(uint32_t gainCode) const override; + unsigned int hideFramesStartup() const override; + unsigned int hideFramesModeSwitch() const override; + +private: + /* + * Smallest difference between the frame length and integration time, + * in units of lines. + */ + static constexpr int frameIntegrationDiff = 8; +}; + +CamHelperImx415::CamHelperImx415() + : CamHelper({}, frameIntegrationDiff) +{ +} + +uint32_t CamHelperImx415::gainCode(double gain) const +{ + int code = 66.6667 * std::log10(gain); + return std::max(0, std::min(code, 0xf0)); +} + +double CamHelperImx415::gain(uint32_t gainCode) const +{ + return std::pow(10, 0.015 * gainCode); +} + +unsigned int CamHelperImx415::hideFramesStartup() const +{ + /* On startup, we seem to get 1 bad frame. */ + return 1; +} + +unsigned int CamHelperImx415::hideFramesModeSwitch() const +{ + /* After a mode switch, we seem to get 1 bad frame. */ + return 1; +} + +static CamHelper *create() +{ + return new CamHelperImx415(); +} + +static RegisterCamHelper reg("imx415", &create); diff --git a/src/ipa/rpi/cam_helper/meson.build b/src/ipa/rpi/cam_helper/meson.build index 03e88fe082e2..abf021474b5c 100644 --- a/src/ipa/rpi/cam_helper/meson.build +++ b/src/ipa/rpi/cam_helper/meson.build @@ -7,6 +7,7 @@ rpi_ipa_cam_helper_sources = files([ 'cam_helper_imx283.cpp', 'cam_helper_imx290.cpp', 'cam_helper_imx296.cpp', + 'cam_helper_imx415.cpp', 'cam_helper_imx477.cpp', 'cam_helper_imx519.cpp', 'cam_helper_imx708.cpp',