<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi David<div class="">Thanks.</div><div class="">We have shipped the samples this afternoon, the shipping waybill is <span style="color: rgb(23, 26, 29); font-family: -apple-system, system-ui, "PingFang SC", "Hiragino Sans GB", "Segoe UI", system-ui, Roboto, "Droid Sans", "Helvetica Neue", sans-serif; font-size: 14px; orphans: 2; white-space: pre-wrap; widows: 2;" class="">DHL:9758185076</span></div><div class="msg-content scaleable" style="box-sizing: border-box; background-clip: padding-box; margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; position: relative; max-width: 640px; min-width: 10px; color: rgb(23, 26, 29); font-family: -apple-system, system-ui, "PingFang SC", "Hiragino Sans GB", "Segoe UI", system-ui, Roboto, "Droid Sans", "Helvetica Neue", sans-serif; font-size: 14px; font-variant-ligatures: normal; orphans: 2; widows: 2; background-color: rgb(241, 242, 243);"><div class="normal-text text-msg-over-hidden msg-text" style="box-sizing: border-box; background-clip: border-box; margin: 0px; padding: 8px 12px; border: none; overflow: hidden; background-color: var(--im_chat_text_message_other_bg_color,#fff); border-top-left-radius: 3px !important; border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important;"><div class="interaction-info" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); box-sizing: border-box; background-clip: padding-box; margin: 0px; padding: 0px; display: flex; flex-direction: row; color: var(--common_level2_base_color,rgba(23,26,29,0.6)); align-items: center; border-radius: 3px;"><div class="interaction-info-wrap" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); box-sizing: border-box; background-clip: padding-box; margin: 0px; padding: 0px; display: flex; flex-flow: row wrap;"></div></div></div></div><div class="msg-operation " style="box-sizing: border-box; background-clip: padding-box; margin: 0px; padding: 0px 4px; display: flex; flex-direction: row; color: rgb(23, 26, 29); font-family: -apple-system, system-ui, "PingFang SC", "Hiragino Sans GB", "Segoe UI", system-ui, Roboto, "Droid Sans", "Helvetica Neue", sans-serif; font-size: 14px; font-variant-ligatures: normal; orphans: 2; widows: 2; background-color: rgb(241, 242, 243);"></div><div class="">Hope you can get them soon.</div><div class="">Regards</div><div class="">Lee</div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 12 Oct 2021, at 4:44 PM, David Plowman <<a href="mailto:david.plowman@raspberrypi.com" class="">david.plowman@raspberrypi.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta charset="UTF-8" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Hi Lee</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">On Mon, 11 Oct 2021 at 13:12, Arducam info <</span><a href="mailto:info@arducam.com" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">info@arducam.com</a><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">> wrote:</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br class="">Hi David and Naush<br class="">As you know Arducam keeps working for camera solutions for Raspberry pi for a long time.<br class="">This new IMX519 camera is the latest open source camera driver and ISP tuned libcamera json config.<br class="">We have already committed the IMX519 driver source code to RaspberryPi/linux repo with Dave Stevenson weeks ago: <a href="https://github.com/raspberrypi/linux/pull/4548/commits" class="">https://github.com/raspberrypi/linux/pull/4548/commits</a><br class=""><br class="">And this IMX519 also supports the long exposure as the IMX477, check the statement below from the datasheet.<br class=""><br class="">Please let me know your shipping address and contact phone number, I will send you the first few samples tomorrow with DHL shipping.<br class="">Regards<br class="">Lee<br class=""><br class=""><br class=""><br class="">On 11 Oct 2021, at 4:16 PM, David Plowman <<a href="mailto:david.plowman@raspberrypi.com" class="">david.plowman@raspberrypi.com</a>> wrote:<br class=""><br class="">Hi Lee<br class=""><br class="">Thank you very much for your contribution, we're very pleased to see<br class="">others making use of the Pi's camera system in this way!<br class=""><br class="">On Mon, 11 Oct 2021 at 05:06, Arducam info <<a href="mailto:info@arducam.com" class="">info@arducam.com</a>> wrote:<br class=""><br class=""><br class="">The necessary tuning file and CamHelper is added for the imx519 sensor.<br class=""><br class="">The imx519 is a 16MP rolling shutter sensor. To enable<br class="">it, please add<br class=""><br class="">dtoverlay=imx519<br class=""><br class="">to the /boot/config.txt file and reboot the Pi.<br class=""><br class="">Signed-off-by: Lee Jackson <<a href="mailto:info@arducam.com" class="">info@arducam.com</a>><br class="">---<br class="">src/ipa/raspberrypi/cam_helper_imx519.cpp | 185 +++++++++++++++<br class="">src/ipa/raspberrypi/data/imx519.json | 272 ++++++++++++++++++++++<br class="">src/ipa/raspberrypi/data/meson.build | 1 +<br class="">src/ipa/raspberrypi/meson.build | 1 +<br class="">4 files changed, 459 insertions(+)<br class="">create mode 100644 src/ipa/raspberrypi/cam_helper_imx519.cpp<br class="">create mode 100644 src/ipa/raspberrypi/data/imx519.json<br class=""><br class="">diff --git a/src/ipa/raspberrypi/cam_helper_imx519.cpp b/src/ipa/raspberrypi/cam_helper_imx519.cpp<br class="">new file mode 100644<br class="">index 00000000..eaf24982<br class="">--- /dev/null<br class="">+++ b/src/ipa/raspberrypi/cam_helper_imx519.cpp<br class="">@@ -0,0 +1,185 @@<br class="">+/* SPDX-License-Identifier: BSD-2-Clause */<br class="">+/*<br class="">+ * Based on cam_helper_imx477.cpp<br class="">+ * Copyright (C) 2020, Raspberry Pi (Trading) Limited<br class="">+ *<br class="">+ * cam_helper_imx519.cpp - camera helper for imx519 sensor<br class="">+ * Copyright (C) 2021, Arducam Technology co., Ltd.<br class="">+ */<br class="">+<br class="">+#include <assert.h><br class="">+#include <cmath><br class="">+#include <stddef.h><br class="">+#include <stdio.h><br class="">+#include <stdlib.h><br class="">+<br class="">+#include <libcamera/base/log.h><br class="">+<br class="">+#include "cam_helper.hpp"<br class="">+#include "md_parser.hpp"<br class="">+<br class="">+using namespace RPiController;<br class="">+using namespace libcamera;<br class="">+using libcamera::utils::Duration;<br class="">+<br class="">+namespace libcamera {<br class="">+LOG_DECLARE_CATEGORY(IPARPI)<br class="">+}<br class="">+<br class="">+/*<br class="">+ * We care about two gain registers and a pair of exposure registers. Their<br class="">+ * I2C addresses from the Sony IMX519 datasheet:<br class="">+ */<br class="">+constexpr uint32_t expHiReg = 0x0202;<br class="">+constexpr uint32_t expLoReg = 0x0203;<br class="">+constexpr uint32_t gainHiReg = 0x0204;<br class="">+constexpr uint32_t gainLoReg = 0x0205;<br class="">+constexpr uint32_t frameLengthHiReg = 0x0340;<br class="">+constexpr uint32_t frameLengthLoReg = 0x0341;<br class="">+constexpr std::initializer_list<uint32_t> registerList =<br class="">+ { expHiReg, expLoReg, gainHiReg, gainLoReg, frameLengthHiReg, frameLengthLoReg };<br class="">+<br class="">+class CamHelperImx519 : public CamHelper<br class="">+{<br class="">+public:<br class="">+ CamHelperImx519();<br class="">+ uint32_t GainCode(double gain) const override;<br class="">+ double Gain(uint32_t gain_code) const override;<br class="">+ void Prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata) override;<br class="">+ uint32_t GetVBlanking(Duration &exposure, Duration minFrameDuration,<br class="">+ Duration maxFrameDuration) const override;<br class="">+ void GetDelays(int &exposure_delay, int &gain_delay,<br class="">+ int &vblank_delay) const override;<br class="">+ bool SensorEmbeddedDataPresent() const override;<br class="">+<br class="">+private:<br class="">+ /*<br class="">+ * Smallest difference between the frame length and integration time,<br class="">+ * in units of lines.<br class="">+ */<br class="">+ static constexpr int frameIntegrationDiff = 32;<br class="">+ /* Maximum frame length allowable for long exposure calculations. */<br class="">+ static constexpr int frameLengthMax = 0xffdc;<br class="">+ /* Largest long exposure scale factor given as a left shift on the frame length. */<br class="">+ static constexpr int longExposureShiftMax = 7;<br class="">+<br class="">+ void PopulateMetadata(const MdParser::RegisterMap ®isters,<br class="">+ Metadata &metadata) const override;<br class="">+};<br class="">+<br class="">+CamHelperImx519::CamHelperImx519()<br class="">+ : CamHelper(std::make_unique<MdParserSmia>(registerList), frameIntegrationDiff)<br class="">+{<br class="">+}<br class="">+<br class="">+uint32_t CamHelperImx519::GainCode(double gain) const<br class="">+{<br class="">+ return static_cast<uint32_t>(1024 - 1024 / gain);<br class="">+}<br class="">+<br class="">+double CamHelperImx519::Gain(uint32_t gain_code) const<br class="">+{<br class="">+ return 1024.0 / (1024 - gain_code);<br class="">+}<br class="">+<br class="">+void CamHelperImx519::Prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata)<br class="">+{<br class="">+ MdParser::RegisterMap registers;<br class="">+ DeviceStatus deviceStatus;<br class="">+<br class="">+ if (metadata.Get("device.status", deviceStatus)) {<br class="">+ LOG(IPARPI, Error) << "DeviceStatus not found from DelayedControls";<br class="">+ return;<br class="">+ }<br class="">+<br class="">+ parseEmbeddedData(buffer, metadata);<br class="">+<br class="">+ /*<br class="">+ * The DeviceStatus struct is first populated with values obtained from<br class="">+ * DelayedControls. If this reports frame length is > frameLengthMax,<br class="">+ * it means we are using a long exposure mode. Since the long exposure<br class="">+ * scale factor is not returned back through embedded data, we must rely<br class="">+ * on the existing exposure lines and frame length values returned by<br class="">+ * DelayedControls.<br class="">+ *<br class="">+ * Otherwise, all values are updated with what is reported in the<br class="">+ * embedded data.<br class="">+ */<br class="">+ if (deviceStatus.frame_length > frameLengthMax) {<br class="">+ DeviceStatus parsedDeviceStatus;<br class="">+<br class="">+ metadata.Get("device.status", parsedDeviceStatus);<br class="">+ parsedDeviceStatus.shutter_speed = deviceStatus.shutter_speed;<br class="">+ parsedDeviceStatus.frame_length = deviceStatus.frame_length;<br class="">+ metadata.Set("device.status", parsedDeviceStatus);<br class="">+<br class="">+ LOG(IPARPI, Debug) << "Metadata updated for long exposure: "<br class="">+ << parsedDeviceStatus;<br class="">+ }<br class="">+}<br class="">+<br class="">+uint32_t CamHelperImx519::GetVBlanking(Duration &exposure,<br class="">+ Duration minFrameDuration,<br class="">+ Duration maxFrameDuration) const<br class="">+{<br class="">+ uint32_t frameLength, exposureLines;<br class="">+ unsigned int shift = 0;<br class="">+<br class="">+ frameLength = mode_.height + CamHelper::GetVBlanking(exposure, minFrameDuration,<br class="">+ maxFrameDuration);<br class="">+ /*<br class="">+ * Check if the frame length calculated needs to be setup for long<br class="">+ * exposure mode. This will require us to use a long exposure scale<br class="">+ * factor provided by a shift operation in the sensor.<br class="">+ */<br class="">+ while (frameLength > frameLengthMax) {<br class="">+ if (++shift > longExposureShiftMax) {<br class="">+ shift = longExposureShiftMax;<br class="">+ frameLength = frameLengthMax;<br class="">+ break;<br class="">+ }<br class="">+ frameLength >>= 1;<br class="">+ }<br class="">+<br class="">+ if (shift) {<br class="">+ /* Account for any rounding in the scaled frame length value. */<br class="">+ frameLength <<= shift;<br class="">+ exposureLines = ExposureLines(exposure);<br class="">+ exposureLines = std::min(exposureLines, frameLength - frameIntegrationDiff);<br class="">+ exposure = Exposure(exposureLines);<br class="">+ }<br class="">+<br class="">+ return frameLength - mode_.height;<br class="">+}<br class="">+<br class="">+void CamHelperImx519::GetDelays(int &exposure_delay, int &gain_delay,<br class="">+ int &vblank_delay) const<br class="">+{<br class="">+ exposure_delay = 2;<br class="">+ gain_delay = 2;<br class="">+ vblank_delay = 3;<br class="">+}<br class="">+<br class="">+bool CamHelperImx519::SensorEmbeddedDataPresent() const<br class="">+{<br class="">+ return true;<br class="">+}<br class="">+<br class="">+void CamHelperImx519::PopulateMetadata(const MdParser::RegisterMap ®isters,<br class="">+ Metadata &metadata) const<br class="">+{<br class="">+ DeviceStatus deviceStatus;<br class="">+<br class="">+ deviceStatus.shutter_speed = Exposure(<a href="http://registers.at" class="">registers.at</a>(expHiReg) * 256 + <a href="http://registers.at" class="">registers.at</a>(expLoReg));<br class="">+ deviceStatus.analogue_gain = Gain(<a href="http://registers.at" class="">registers.at</a>(gainHiReg) * 256 + <a href="http://registers.at" class="">registers.at</a>(gainLoReg));<br class="">+ deviceStatus.frame_length = <a href="http://registers.at" class="">registers.at</a>(frameLengthHiReg) * 256 + <a href="http://registers.at" class="">registers.at</a>(frameLengthLoReg);<br class="">+<br class="">+ metadata.Set("device.status", deviceStatus);<br class="">+}<br class="">+<br class="">+static CamHelper *Create()<br class="">+{<br class="">+ return new CamHelperImx519();<br class="">+}<br class="">+<br class="">+static RegisterCamHelper reg("imx519", &Create);<br class="">diff --git a/src/ipa/raspberrypi/data/imx519.json b/src/ipa/raspberrypi/data/imx519.json<br class="">new file mode 100644<br class="">index 00000000..39e788ad<br class="">--- /dev/null<br class="">+++ b/src/ipa/raspberrypi/data/imx519.json<br class="">@@ -0,0 +1,272 @@<br class="">+{<br class="">+ "rpi.black_level":<br class="">+ {<br class="">+ "black_level": 4096<br class="">+ },<br class="">+ "rpi.dpc":<br class="">+ {<br class="">+ },<br class="">+ "rpi.lux":<br class="">+ {<br class="">+ "reference_shutter_speed": 10812,<br class="">+ "reference_gain": 2.0,<br class="">+ "reference_aperture": 1.0,<br class="">+ "reference_lux": 1250,<br class="">+ "reference_Y": 12737<br class="">+ },<br class="">+ "rpi.noise":<br class="">+ {<br class="">+ "reference_constant": 0,<br class="">+ "reference_slope": 2.91<br class="">+ },<br class="">+ "rpi.geq":<br class="">+ {<br class="">+ "offset": 444,<br class="">+ "slope": 0.00731<br class="">+ },<br class="">+ "rpi.sdn":<br class="">+ {<br class="">+ "deviation":3.7,<br class="">+ "strength":0.75<br class="">+ },<br class="">+ "rpi.awb":<br class="">+ {<br class="">+ "priors":<br class="">+ [<br class="">+ {<br class="">+ "lux": 0, "prior":<br class="">+ [<br class="">+ 2000, 1.0, 3000, 0.0, 13000, 0.0<br class="">+ ]<br class="">+ },<br class="">+ {<br class="">+ "lux": 800, "prior":<br class="">+ [<br class="">+ 2000, 0.0, 6000, 2.0, 13000, 2.0<br class="">+ ]<br class="">+ },<br class="">+ {<br class="">+ "lux": 1500, "prior":<br class="">+ [<br class="">+ 2000, 0.0, 4000, 1.0, 6000, 6.0, 6500, 7.0, 7000, 1.0, 13000, 1.0<br class="">+ ]<br class="">+ }<br class="">+ ],<br class="">+ "modes":<br class="">+ {<br class="">+ "auto":<br class="">+ {<br class="">+ "lo": 2500,<br class="">+ "hi": 8000<br class="">+ },<br class="">+ "incandescent":<br class="">+ {<br class="">+ "lo": 2500,<br class="">+ "hi": 3000<br class="">+ },<br class="">+ "tungsten":<br class="">+ {<br class="">+ "lo": 3000,<br class="">+ "hi": 3500<br class="">+ },<br class="">+ "fluorescent":<br class="">+ {<br class="">+ "lo": 4000,<br class="">+ "hi": 4700<br class="">+ },<br class="">+ "indoor":<br class="">+ {<br class="">+ "lo": 3000,<br class="">+ "hi": 5000<br class="">+ },<br class="">+ "daylight":<br class="">+ {<br class="">+ "lo": 5500,<br class="">+ "hi": 6500<br class="">+ },<br class="">+ "cloudy":<br class="">+ {<br class="">+ "lo": 7000,<br class="">+ "hi": 8600<br class="">+ }<br class="">+ },<br class="">+ "bayes": 0<br class=""><br class=""><br class="">Just a small thing, but if we're going with the simple grey world<br class="">algorithm it might be worth deleting the other AWB parameters as they<br class="">don't do anything.<br class=""><br class="">And a few final questions:<br class=""><br class="">* Are you planning to upstream an open source driver for the imx519?<br class="">The preference within libcamera (someone will correct me if I'm<br class="">wrong!) is to support sensors where code and drivers are open.<br class=""><br class="">* If you're planning to open-source the driver we'd be pleased to<br class="">receive pull requests into our own Raspberry Pi kernel distribution.<br class=""><br class="">* I assume this is a fairly standard Bayer sensor? If you have a<br class="">working open source driver and can send me a module then I'd be very<br class="">happy to help you further with the json tuning file.<br class=""><br class="">Thanks and best regards<br class="">David<br class=""></blockquote><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Based on the discussions we've had this seems fine to me.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Reviewed-by: David Plowman <</span><a href="mailto:david.plowman@raspberrypi.com" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">david.plowman@raspberrypi.com</a><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">></span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Once I have some modules I'll try and do a more complete colour tuning</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">and then I'll submit that.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Thanks!</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">David</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br class="">+<br class="">+ },<br class="">+ "rpi.agc":<br class="">+ {<br class="">+ "metering_modes":<br class="">+ {<br class="">+ "centre-weighted":<br class="">+ {<br class="">+ "weights":<br class="">+ [<br class="">+ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0<br class="">+ ]<br class="">+ },<br class="">+ "spot":<br class="">+ {<br class="">+ "weights":<br class="">+ [<br class="">+ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br class="">+ ]<br class="">+ },<br class="">+ "matrix":<br class="">+ {<br class="">+ "weights":<br class="">+ [<br class="">+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1<br class="">+ ]<br class="">+ }<br class="">+ },<br class="">+ "exposure_modes":<br class="">+ {<br class="">+ "normal":<br class="">+ {<br class="">+ "shutter":<br class="">+ [<br class="">+ 100, 10000, 30000, 60000, 120000<br class="">+ ],<br class="">+ "gain":<br class="">+ [<br class="">+ 1.0, 2.0, 4.0, 6.0, 12.0<br class="">+ ]<br class="">+ },<br class="">+ "short":<br class="">+ {<br class="">+ "shutter":<br class="">+ [<br class="">+ 100, 5000, 10000, 20000, 120000<br class="">+ ],<br class="">+ "gain":<br class="">+ [<br class="">+ 1.0, 2.0, 4.0, 6.0, 12.0<br class="">+ ]<br class="">+ }<br class="">+ },<br class="">+ "constraint_modes":<br class="">+ {<br class="">+ "normal":<br class="">+ [<br class="">+ {<br class="">+ "bound": "LOWER", "q_lo": 0.98, "q_hi": 1.0, "y_target":<br class="">+ [<br class="">+ 0, 0.5, 1000, 0.5<br class="">+ ]<br class="">+ }<br class="">+ ],<br class="">+ "highlight":<br class="">+ [<br class="">+ {<br class="">+ "bound": "LOWER", "q_lo": 0.98, "q_hi": 1.0, "y_target":<br class="">+ [<br class="">+ 0, 0.5, 1000, 0.5<br class="">+ ]<br class="">+ },<br class="">+ {<br class="">+ "bound": "UPPER", "q_lo": 0.98, "q_hi": 1.0, "y_target":<br class="">+ [<br class="">+ 0, 0.8, 1000, 0.8<br class="">+ ]<br class="">+ }<br class="">+ ]<br class="">+ },<br class="">+ "y_target":<br class="">+ [<br class="">+ 0, 0.16, 1000, 0.165, 10000, 0.17<br class="">+ ]<br class="">+ },<br class="">+ "rpi.alsc":<br class="">+ {<br class="">+ "omega": 1.3,<br class="">+ "n_iter": 100,<br class="">+ "luminance_strength": 0.5,<br class="">+ "calibrations_Cr":<br class="">+ [<br class="">+ {<br class="">+ "ct": 6500, "table":<br class="">+ [<br class="">+ 2.544, 2.541, 2.531, 2.518, 2.506, 2.495, 2.489, 2.489, 2.489, 2.491, 2.502, 2.511, 2.524, 2.534, 2.542, 2.547,<br class="">+ 2.541, 2.532, 2.521, 2.506, 2.493, 2.479, 2.469, 2.462, 2.462, 2.473, 2.488, 2.502, 2.511, 2.527, 2.536, 2.542,<br class="">+ 2.531, 2.523, 2.506, 2.492, 2.474, 2.458, 2.444, 2.435, 2.435, 2.446, 2.466, 2.481, 2.498, 2.511, 2.526, 2.536,<br class="">+ 2.523, 2.513, 2.492, 2.474, 2.458, 2.438, 2.418, 2.408, 2.408, 2.421, 2.443, 2.463, 2.481, 2.498, 2.517, 2.526,<br class="">+ 2.513, 2.502, 2.481, 2.459, 2.438, 2.418, 2.397, 2.379, 2.379, 2.399, 2.421, 2.443, 2.463, 2.486, 2.506, 2.517,<br class="">+ 2.506, 2.492, 2.469, 2.445, 2.423, 2.397, 2.377, 2.368, 2.369, 2.379, 2.399, 2.427, 2.451, 2.474, 2.495, 2.511,<br class="">+ 2.506, 2.492, 2.469, 2.445, 2.423, 2.397, 2.372, 2.364, 2.364, 2.374, 2.399, 2.427, 2.449, 2.474, 2.495, 2.511,<br class="">+ 2.506, 2.493, 2.474, 2.451, 2.426, 2.401, 2.382, 2.368, 2.369, 2.382, 2.405, 2.431, 2.449, 2.476, 2.497, 2.509,<br class="">+ 2.504, 2.493, 2.475, 2.452, 2.431, 2.412, 2.401, 2.382, 2.382, 2.403, 2.416, 2.438, 2.457, 2.477, 2.497, 2.505,<br class="">+ 2.499, 2.492, 2.474, 2.457, 2.441, 2.431, 2.412, 2.404, 2.404, 2.416, 2.432, 2.447, 2.459, 2.478, 2.495, 2.501,<br class="">+ 2.499, 2.488, 2.473, 2.463, 2.453, 2.441, 2.431, 2.425, 2.425, 2.432, 2.445, 2.459, 2.466, 2.478, 2.491, 2.495,<br class="">+ 2.499, 2.481, 2.472, 2.466, 2.458, 2.449, 2.441, 2.439, 2.439, 2.444, 2.454, 2.464, 2.469, 2.477, 2.484, 2.491<br class="">+ ]<br class="">+ }<br class="">+ ],<br class="">+ "calibrations_Cb":<br class="">+ [<br class="">+ {<br class="">+ "ct": 6500, "table":<br class="">+ [<br class="">+ 1.352, 1.352, 1.349, 1.348, 1.347, 1.346, 1.347, 1.349, 1.351, 1.351, 1.352, 1.353, 1.353, 1.355, 1.358, 1.359,<br class="">+ 1.359, 1.355, 1.352, 1.349, 1.348, 1.348, 1.348, 1.351, 1.352, 1.352, 1.352, 1.354, 1.356, 1.358, 1.361, 1.366,<br class="">+ 1.364, 1.359, 1.355, 1.352, 1.349, 1.349, 1.351, 1.353, 1.353, 1.353, 1.355, 1.356, 1.358, 1.362, 1.366, 1.371,<br class="">+ 1.371, 1.365, 1.359, 1.355, 1.352, 1.352, 1.353, 1.357, 1.357, 1.356, 1.356, 1.359, 1.362, 1.366, 1.371, 1.377,<br class="">+ 1.375, 1.371, 1.365, 1.362, 1.359, 1.359, 1.359, 1.364, 1.364, 1.364, 1.364, 1.365, 1.367, 1.371, 1.377, 1.382,<br class="">+ 1.379, 1.375, 1.371, 1.367, 1.367, 1.367, 1.369, 1.373, 1.374, 1.374, 1.373, 1.373, 1.374, 1.377, 1.382, 1.386,<br class="">+ 1.383, 1.378, 1.374, 1.372, 1.372, 1.372, 1.373, 1.375, 1.378, 1.379, 1.379, 1.379, 1.379, 1.381, 1.386, 1.389,<br class="">+ 1.384, 1.379, 1.376, 1.374, 1.373, 1.373, 1.374, 1.379, 1.379, 1.379, 1.379, 1.379, 1.381, 1.382, 1.386, 1.394,<br class="">+ 1.386, 1.379, 1.376, 1.375, 1.374, 1.374, 1.374, 1.378, 1.378, 1.378, 1.378, 1.379, 1.381, 1.383, 1.386, 1.394,<br class="">+ 1.385, 1.379, 1.376, 1.375, 1.374, 1.374, 1.375, 1.378, 1.378, 1.378, 1.378, 1.379, 1.381, 1.383, 1.387, 1.393,<br class="">+ 1.379, 1.378, 1.375, 1.374, 1.373, 1.374, 1.375, 1.377, 1.378, 1.378, 1.378, 1.379, 1.381, 1.382, 1.386, 1.388,<br class="">+ 1.379, 1.376, 1.374, 1.372, 1.372, 1.374, 1.375, 1.377, 1.378, 1.378, 1.377, 1.378, 1.379, 1.382, 1.384, 1.387<br class="">+ ]<br class="">+ }<br class="">+ ],<br class="">+ "luminance_lut":<br class="">+ [<br class="">+ 3.257, 3.091, 2.639, 2.301, 2.009, 1.795, 1.742, 1.742, 1.742, 1.742, 1.798, 2.011, 2.309, 2.649, 3.109, 3.251,<br class="">+ 3.091, 2.703, 2.311, 2.059, 1.791, 1.631, 1.529, 1.482, 1.482, 1.533, 1.635, 1.791, 2.068, 2.313, 2.719, 3.109,<br class="">+ 2.707, 2.424, 2.059, 1.791, 1.626, 1.429, 1.329, 1.282, 1.282, 1.333, 1.433, 1.629, 1.791, 2.068, 2.438, 2.719,<br class="">+ 2.555, 2.233, 1.889, 1.626, 1.429, 1.321, 1.176, 1.126, 1.126, 1.181, 1.327, 1.433, 1.629, 1.894, 2.241, 2.538,<br class="">+ 2.482, 2.108, 1.775, 1.518, 1.321, 1.176, 1.112, 1.011, 1.012, 1.122, 1.181, 1.327, 1.523, 1.779, 2.113, 2.462,<br class="">+ 2.478, 2.048, 1.719, 1.465, 1.266, 1.112, 1.009, 1.001, 1.007, 1.012, 1.122, 1.274, 1.469, 1.722, 2.051, 2.454,<br class="">+ 2.478, 2.048, 1.719, 1.465, 1.266, 1.112, 1.004, 1.001, 1.001, 1.011, 1.122, 1.274, 1.469, 1.722, 2.051, 2.454,<br class="">+ 2.478, 2.099, 1.768, 1.511, 1.312, 1.163, 1.108, 1.004, 1.008, 1.112, 1.171, 1.321, 1.515, 1.767, 2.097, 2.454,<br class="">+ 2.541, 2.217, 1.877, 1.614, 1.417, 1.312, 1.163, 1.112, 1.112, 1.171, 1.317, 1.421, 1.616, 1.874, 2.214, 2.516,<br class="">+ 2.686, 2.404, 2.046, 1.779, 1.614, 1.417, 1.317, 1.267, 1.267, 1.319, 1.421, 1.614, 1.773, 2.039, 2.399, 2.669,<br class="">+ 3.063, 2.678, 2.292, 2.046, 1.779, 1.622, 1.521, 1.469, 1.469, 1.519, 1.622, 1.773, 2.038, 2.277, 2.669, 3.049,<br class="">+ 3.224, 3.063, 2.616, 2.285, 1.995, 1.781, 1.725, 1.723, 1.723, 1.723, 1.777, 1.984, 2.271, 2.598, 3.049, 3.187<br class="">+ ],<br class="">+ "sigma": 0.005,<br class="">+ "sigma_Cb": 0.005<br class="">+ },<br class="">+ "rpi.contrast":<br class="">+ {<br class="">+ "ce_enable": 1,<br class="">+ "gamma_curve":<br class="">+ [<br class="">+ 0, 0, 1024, 5040, 2048, 9338, 3072, 12356, 4096, 15312, 5120, 18051, 6144, 20790, 7168, 23193,<br class="">+ 8192, 25744, 9216, 27942, 10240, 30035, 11264, 32005, 12288, 33975, 13312, 35815, 14336, 37600, 15360, 39168,<br class="">+ 16384, 40642, 18432, 43379, 20480, 45749, 22528, 47753, 24576, 49621, 26624, 51253, 28672, 52698, 30720, 53796,<br class="">+ 32768, 54876, 36864, 57012, 40960, 58656, 45056, 59954, 49152, 61183, 53248, 62355, 57344, 63419, 61440, 64476,<br class="">+ 65535, 65535<br class="">+ ]<br class="">+ },<br class="">+ "rpi.ccm":<br class="">+ {<br class="">+ "ccms":<br class="">+ [<br class="">+ {<br class="">+ "ct": 5500, "ccm":<br class="">+ [<br class="">+ 1.40348, -0.45861, 0.05512, -0.24419, 1.25488, -0.01068, -0.08564, -0.31571, 1.40135<br class="">+ ]<br class="">+ }<br class="">+ ]<br class="">+ },<br class="">+ "rpi.sharpen":<br class="">+ {<br class="">+ "threshold":1.5,<br class="">+ "strength":0.5,<br class="">+ "limit":0.2<br class="">+ }<br class="">+}<br class="">diff --git a/src/ipa/raspberrypi/data/meson.build b/src/ipa/raspberrypi/data/meson.build<br class="">index 2def75cb..e84cd099 100644<br class="">--- a/src/ipa/raspberrypi/data/meson.build<br class="">+++ b/src/ipa/raspberrypi/data/meson.build<br class="">@@ -7,6 +7,7 @@ conf_files = files([<br class=""> 'imx378.json',<br class=""> 'imx477.json',<br class=""> 'imx477_noir.json',<br class="">+ 'imx519.json',<br class=""> 'ov5647.json',<br class=""> 'ov5647_noir.json',<br class=""> 'ov9281.json',<br class="">diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build<br class="">index 1af31e4a..176055f4 100644<br class="">--- a/src/ipa/raspberrypi/meson.build<br class="">+++ b/src/ipa/raspberrypi/meson.build<br class="">@@ -22,6 +22,7 @@ rpi_ipa_sources = files([<br class=""> 'cam_helper_imx219.cpp',<br class=""> 'cam_helper_imx290.cpp',<br class=""> 'cam_helper_imx477.cpp',<br class="">+ 'cam_helper_imx519.cpp',<br class=""> 'cam_helper_ov9281.cpp',<br class=""> 'controller/controller.cpp',<br class=""> 'controller/histogram.cpp',<br class="">--<br class="">2.17.1</blockquote></div></blockquote></div><br class=""></div></body></html>