ipa: rpi: imx708: Fix mode switch drop frame count

The imx708 must drop a single frame on startup - but only when in HDR
mode. Non-HDR modes do not need to drop frames. Fix the logic in
hideFramesModeSwitch() which currently unconditionally advertises to
drop one frame.

Unfortunately there is no clear way to tell if the sensor is in the HDR
mode. So for now, look the resolution and framerate to deduce this.

Additionally ensure we override hideFramesStartup() and return the same
number as hideFramesModeSwitch().

Bug: https://github.com/raspberrypi/libcamera-apps/issues/524
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2023-06-27 14:05:53 +01:00 committed by Kieran Bingham
parent 7802471a3b
commit f516141574

View file

@ -21,6 +21,8 @@ using namespace RPiController;
using namespace libcamera;
using libcamera::utils::Duration;
using namespace std::literals::chrono_literals;
namespace libcamera {
LOG_DECLARE_CATEGORY(IPARPI)
}
@ -56,7 +58,8 @@ public:
int &vblankDelay, int &hblankDelay) const override;
bool sensorEmbeddedDataPresent() const override;
double getModeSensitivity(const CameraMode &mode) const override;
unsigned int hideFramesModeSwitch() const override { return 1; } // seems to be required for HDR
unsigned int hideFramesModeSwitch() const override;
unsigned int hideFramesStartup() const override;
private:
/*
@ -225,6 +228,26 @@ double CamHelperImx708::getModeSensitivity(const CameraMode &mode) const
return (mode.width > 2304) ? 1.0 : 2.0;
}
unsigned int CamHelperImx708::hideFramesModeSwitch() const
{
/*
* We need to drop the first startup frame in HDR mode.
* Unfortunately the only way to currently determine if the sensor is in
* the HDR mode is to match with the resolution and framerate - the HDR
* mode only runs upto 30fps.
*/
if (mode_.width == 2304 && mode_.height == 1296 &&
mode_.minFrameDuration > 1.0s / 32)
return 1;
else
return 0;
}
unsigned int CamHelperImx708::hideFramesStartup() const
{
return hideFramesModeSwitch();
}
void CamHelperImx708::populateMetadata(const MdParser::RegisterMap &registers,
Metadata &metadata) const
{