From 50350c5af7861bc352f4cffadf78563ec3ced31d Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Thu, 25 Jul 2024 11:49:55 +0100 Subject: [PATCH 01/46] controls: rpi: Add a vendor rpi::ScalerCrops control Add a vendor control rpi::ScalerCrops that is analogous to the current core::ScalerCrop, but can apply a different crop to each configured stream. This control takes a span of Rectangle structures - the order of rectangles must match the order of streams configured by the application. Signed-off-by: Naushir Patuck --- src/ipa/rpi/common/ipa_base.cpp | 2 ++ src/libcamera/control_ids_rpi.yaml | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp index ee3848b54..463f6d384 100644 --- a/src/ipa/rpi/common/ipa_base.cpp +++ b/src/ipa/rpi/common/ipa_base.cpp @@ -71,6 +71,7 @@ const ControlInfoMap::Map ipaControls{ { &controls::HdrMode, ControlInfo(controls::HdrModeValues) }, { &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) }, { &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) }, + { &controls::rpi::ScalerCrops, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) }, { &controls::FrameDurationLimits, ControlInfo(INT64_C(33333), INT64_C(120000)) }, { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) }, { &controls::rpi::StatsOutputEnable, ControlInfo(false, true, false) }, @@ -1070,6 +1071,7 @@ void IpaBase::applyControls(const ControlList &controls) break; } + case controls::rpi::SCALER_CROPS: case controls::SCALER_CROP: { /* We do nothing with this, but should avoid the warning below. */ break; diff --git a/src/libcamera/control_ids_rpi.yaml b/src/libcamera/control_ids_rpi.yaml index 42c4bf5d4..b066b9ff7 100644 --- a/src/libcamera/control_ids_rpi.yaml +++ b/src/libcamera/control_ids_rpi.yaml @@ -30,4 +30,19 @@ controls: \sa StatsOutputEnable + - ScalerCrops: + type: Rectangle + size: [n] + description: | + An array of rectangles, where each singular value has identical functionality + to the ScalerCrop control. This control allows the Raspberry Pi pipeline + handler to control individual scaler crops per output stream. + + The order of rectangles passed into the control must match the order of + streams configured by the application. + + Note that using different crop rectangles for each output stream is only + applicable on the Pi5/PiSP platform. + + \sa ScalerCrop ... From 7b6faf5a90842405ffb8e0db048a2e4e499dec21 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Tue, 6 Aug 2024 12:23:22 +0100 Subject: [PATCH 02/46] pipeline: rpi: Remove CameraData::scalerCrop_ Do not cache the scalerCrop_ parameter. The cached value is used to update the request metadata, but since this is not an expensive operation (and can only occur once per frame), caching it is of limited value. This will simplify logic in a future commit where we can specify a crop per-output stream. Signed-off-by: Naushir Patuck --- .../pipeline/rpi/common/pipeline_base.cpp | 17 +++-------------- .../pipeline/rpi/common/pipeline_base.h | 1 - 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index 3041fd1ed..5322fd798 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -544,12 +544,6 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config) return ret; } - /* - * Set the scaler crop to the value we are using (scaled to native sensor - * coordinates). - */ - data->scalerCrop_ = data->scaleIspCrop(data->ispCrop_); - /* * Update the ScalerCropMaximum to the correct value for this camera mode. * For us, it's the same as the "analogue crop". @@ -569,7 +563,8 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config) /* Add the ScalerCrop control limits based on the current mode. */ Rectangle ispMinCrop = data->scaleIspCrop(Rectangle(data->ispMinCropSize_)); - ctrlMap[&controls::ScalerCrop] = ControlInfo(ispMinCrop, data->sensorInfo_.analogCrop, data->scalerCrop_); + ctrlMap[&controls::ScalerCrop] = ControlInfo(ispMinCrop, data->sensorInfo_.analogCrop, + data->scaleIspCrop(data->ispCrop_)); data->controlInfo_ = ControlInfoMap(std::move(ctrlMap), result.controlInfo.idmap()); @@ -1321,12 +1316,6 @@ void CameraData::applyScalerCrop(const ControlList &controls) ispCrop_ = ispCrop; platformSetIspCrop(); - /* - * Also update the ScalerCrop in the metadata with what we actually - * used. But we must first rescale that from ISP (camera mode) pixels - * back into sensor native pixels. - */ - scalerCrop_ = scaleIspCrop(ispCrop_); } } } @@ -1483,7 +1472,7 @@ void CameraData::fillRequestMetadata(const ControlList &bufferControls, Request request->metadata().set(controls::SensorTimestamp, bufferControls.get(controls::SensorTimestamp).value_or(0)); - request->metadata().set(controls::ScalerCrop, scalerCrop_); + request->metadata().set(controls::ScalerCrop, scaleIspCrop(ispCrop_)); } } /* namespace libcamera */ diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h index f9cecf70f..5161c16e5 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.h +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h @@ -134,7 +134,6 @@ class CameraData : public Camera::Private /* For handling digital zoom. */ IPACameraSensorInfo sensorInfo_; Rectangle ispCrop_; /* crop in ISP (camera mode) pixels */ - Rectangle scalerCrop_; /* crop in sensor native pixels */ Size ispMinCropSize_; unsigned int dropFrameCount_; From 3fb451a490a455596cca90801ebf9a889a9251ff Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Thu, 8 Aug 2024 11:10:09 +0100 Subject: [PATCH 03/46] pipeline: rpi: Pass crop rectangle as a parameter to platformSetIspCrop() This will be required when we program separate crop values to each ISP output in a future commit. Signed-off-by: Naushir Patuck --- src/libcamera/pipeline/rpi/common/pipeline_base.cpp | 3 +-- src/libcamera/pipeline/rpi/common/pipeline_base.h | 2 +- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 7 ++++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index 5322fd798..2de6111ba 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -1314,8 +1314,7 @@ void CameraData::applyScalerCrop(const ControlList &controls) if (ispCrop != ispCrop_) { ispCrop_ = ispCrop; - platformSetIspCrop(); - + platformSetIspCrop(ispCrop); } } } diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h index 5161c16e5..d65b695c3 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.h +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h @@ -83,7 +83,7 @@ class CameraData : public Camera::Private Rectangle scaleIspCrop(const Rectangle &ispCrop) const; void applyScalerCrop(const ControlList &controls); - virtual void platformSetIspCrop() = 0; + virtual void platformSetIspCrop(const Rectangle &ispCrop) = 0; void cameraTimeout(); void frameStarted(uint32_t sequence); diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index e5b6ef2b3..0ea032293 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -109,9 +109,10 @@ class Vc4CameraData final : public RPi::CameraData Config config_; private: - void platformSetIspCrop() override + void platformSetIspCrop(const Rectangle &ispCrop) override { - isp_[Isp::Input].dev()->setSelection(V4L2_SEL_TGT_CROP, &ispCrop_); + Rectangle crop = ispCrop; + isp_[Isp::Input].dev()->setSelection(V4L2_SEL_TGT_CROP, &crop); } int platformConfigure(const RPi::RPiCameraConfiguration *rpiConfig) override; @@ -707,7 +708,7 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi Size size = unicamFormat.size.boundedToAspectRatio(maxSize); ispCrop_ = size.centeredTo(Rectangle(unicamFormat.size).center()); - platformSetIspCrop(); + platformSetIspCrop(ispCrop_); return 0; } From e56433fb0903e832bc9b8046c200b177450c23c7 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Tue, 6 Aug 2024 13:19:25 +0100 Subject: [PATCH 04/46] pipeline: rpi: Introduce CameraData::CropParams In preparation for assigning separate crop windows for each stream, add a new CropParams structure that stores the existing ispCrop_ and ispMinCropSize_ as fields. Use a new std::map to store a CropParams structure where the map key is the index of the stream configuration in the CameraConfiguration vector. At preset, only a single CropParams structure will be set at key == 0 to preserve the existing crop handling logic. Signed-off-by: Naushir Patuck --- .../pipeline/rpi/common/pipeline_base.cpp | 23 +++++++++++-------- .../pipeline/rpi/common/pipeline_base.h | 21 +++++++++++++++-- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 13 ++++++++--- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index 2de6111ba..412e71648 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -561,10 +561,12 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config) for (auto const &c : result.controlInfo) ctrlMap.emplace(c.first, c.second); - /* Add the ScalerCrop control limits based on the current mode. */ - Rectangle ispMinCrop = data->scaleIspCrop(Rectangle(data->ispMinCropSize_)); - ctrlMap[&controls::ScalerCrop] = ControlInfo(ispMinCrop, data->sensorInfo_.analogCrop, - data->scaleIspCrop(data->ispCrop_)); + if (data->cropParams_.count(0)) { + /* Add the ScalerCrop control limits based on the current mode. */ + Rectangle ispMinCrop = data->scaleIspCrop(Rectangle(data->cropParams_[0].ispMinCropSize)); + ctrlMap[&controls::ScalerCrop] = ControlInfo(ispMinCrop, data->sensorInfo_.analogCrop, + data->scaleIspCrop(data->cropParams_[0].ispCrop)); + } data->controlInfo_ = ControlInfoMap(std::move(ctrlMap), result.controlInfo.idmap()); @@ -1291,7 +1293,8 @@ Rectangle CameraData::scaleIspCrop(const Rectangle &ispCrop) const void CameraData::applyScalerCrop(const ControlList &controls) { const auto &scalerCrop = controls.get(controls::ScalerCrop); - if (scalerCrop) { + if (scalerCrop && cropParams_.count(0)) { + CropParams &cropParams = cropParams_[0]; Rectangle nativeCrop = *scalerCrop; if (!nativeCrop.width || !nativeCrop.height) @@ -1308,12 +1311,12 @@ void CameraData::applyScalerCrop(const ControlList &controls) * 2. With the same mid-point, if possible. * 3. But it can't go outside the sensor area. */ - Size minSize = ispMinCropSize_.expandedToAspectRatio(nativeCrop.size()); + Size minSize = cropParams.ispMinCropSize.expandedToAspectRatio(nativeCrop.size()); Size size = ispCrop.size().expandedTo(minSize); ispCrop = size.centeredTo(ispCrop.center()).enclosedIn(Rectangle(sensorInfo_.outputSize)); - if (ispCrop != ispCrop_) { - ispCrop_ = ispCrop; + if (ispCrop != cropParams.ispCrop) { + cropParams.ispCrop = ispCrop; platformSetIspCrop(ispCrop); } } @@ -1471,7 +1474,9 @@ void CameraData::fillRequestMetadata(const ControlList &bufferControls, Request request->metadata().set(controls::SensorTimestamp, bufferControls.get(controls::SensorTimestamp).value_or(0)); - request->metadata().set(controls::ScalerCrop, scaleIspCrop(ispCrop_)); + if (cropParams_.count(0)) + request->metadata().set(controls::ScalerCrop, + scaleIspCrop(cropParams_[0].ispCrop)); } } /* namespace libcamera */ diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h index d65b695c3..2bed90517 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.h +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h @@ -133,8 +133,25 @@ class CameraData : public Camera::Private /* For handling digital zoom. */ IPACameraSensorInfo sensorInfo_; - Rectangle ispCrop_; /* crop in ISP (camera mode) pixels */ - Size ispMinCropSize_; + + struct CropParams { + CropParams(Rectangle ispCrop_, Size ispMinCropSize_) + : ispCrop(ispCrop_), ispMinCropSize(ispMinCropSize_) + { + } + + CropParams() + { + } + + /* Crop in ISP (camera mode) pixels */ + Rectangle ispCrop; + /* Minimum crop size in ISP output pixels */ + Size ispMinCropSize; + }; + + /* Mapping of CropParams keyed by the stream index in CameraConfiguration */ + std::map cropParams_; unsigned int dropFrameCount_; diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index 0ea032293..d118252f0 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -702,13 +702,20 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi /* Figure out the smallest selection the ISP will allow. */ Rectangle testCrop(0, 0, 1, 1); isp_[Isp::Input].dev()->setSelection(V4L2_SEL_TGT_CROP, &testCrop); - ispMinCropSize_ = testCrop.size(); /* Adjust aspect ratio by providing crops on the input image. */ Size size = unicamFormat.size.boundedToAspectRatio(maxSize); - ispCrop_ = size.centeredTo(Rectangle(unicamFormat.size).center()); + Rectangle ispCrop = size.centeredTo(Rectangle(unicamFormat.size).center()); - platformSetIspCrop(ispCrop_); + platformSetIspCrop(ispCrop); + /* + * Set the scaler crop to the value we are using (scaled to native sensor + * coordinates). + */ + cropParams_.clear(); + cropParams_.emplace(std::piecewise_construct, + std::forward_as_tuple(0), + std::forward_as_tuple(scaleIspCrop(ispCrop), testCrop.size())); return 0; } From 8849e4942c3b43ebd5e3204dd8f97993bd3a8ef2 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Fri, 2 Aug 2024 11:50:45 +0100 Subject: [PATCH 05/46] pipeline: rpi: Track which ISP output is configured for a stream Add a ispIndex field to CropParams that is used to track which ISP output (0/1) will be used for a given stream during configuration. Tracking this information is required for an upcoming change where crop rectangles can be specified for each configured stream. Currently, the value is fixed to 0. Signed-off-by: Naushir Patuck --- src/libcamera/pipeline/rpi/common/pipeline_base.h | 6 ++++-- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h index 2bed90517..0ccfa4e82 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.h +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h @@ -135,8 +135,8 @@ class CameraData : public Camera::Private IPACameraSensorInfo sensorInfo_; struct CropParams { - CropParams(Rectangle ispCrop_, Size ispMinCropSize_) - : ispCrop(ispCrop_), ispMinCropSize(ispMinCropSize_) + CropParams(Rectangle ispCrop_, Size ispMinCropSize_, unsigned int ispIndex_) + : ispCrop(ispCrop_), ispMinCropSize(ispMinCropSize_), ispIndex(ispIndex_) { } @@ -148,6 +148,8 @@ class CameraData : public Camera::Private Rectangle ispCrop; /* Minimum crop size in ISP output pixels */ Size ispMinCropSize; + /* Index of the ISP output channel for this crop */ + unsigned int ispIndex; }; /* Mapping of CropParams keyed by the stream index in CameraConfiguration */ diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index d118252f0..ffc45653d 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -715,7 +715,7 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi cropParams_.clear(); cropParams_.emplace(std::piecewise_construct, std::forward_as_tuple(0), - std::forward_as_tuple(scaleIspCrop(ispCrop), testCrop.size())); + std::forward_as_tuple(scaleIspCrop(ispCrop), testCrop.size(), 0)); return 0; } From be60c002faa8620d578289ea57a54bf14356d4bd Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Thu, 1 Aug 2024 16:25:35 +0100 Subject: [PATCH 06/46] pipeline: rpi: Pass ISP output index into platformSetIspCrop() At this point, the index is unused, but will be in a future commit where we can set different crops on each ISP output. Signed-off-by: Naushir Patuck --- src/libcamera/pipeline/rpi/common/pipeline_base.cpp | 2 +- src/libcamera/pipeline/rpi/common/pipeline_base.h | 2 +- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index 412e71648..a6ea4e9c4 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -1317,7 +1317,7 @@ void CameraData::applyScalerCrop(const ControlList &controls) if (ispCrop != cropParams.ispCrop) { cropParams.ispCrop = ispCrop; - platformSetIspCrop(ispCrop); + platformSetIspCrop(cropParams.ispIndex, ispCrop); } } } diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h index 0ccfa4e82..7959d874d 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.h +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h @@ -83,7 +83,7 @@ class CameraData : public Camera::Private Rectangle scaleIspCrop(const Rectangle &ispCrop) const; void applyScalerCrop(const ControlList &controls); - virtual void platformSetIspCrop(const Rectangle &ispCrop) = 0; + virtual void platformSetIspCrop(unsigned int index, const Rectangle &ispCrop) = 0; void cameraTimeout(); void frameStarted(uint32_t sequence); diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index ffc45653d..04fb3c066 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -109,7 +109,7 @@ class Vc4CameraData final : public RPi::CameraData Config config_; private: - void platformSetIspCrop(const Rectangle &ispCrop) override + void platformSetIspCrop([[maybe_unused]] unsigned int index, const Rectangle &ispCrop) override { Rectangle crop = ispCrop; isp_[Isp::Input].dev()->setSelection(V4L2_SEL_TGT_CROP, &crop); @@ -707,7 +707,7 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi Size size = unicamFormat.size.boundedToAspectRatio(maxSize); Rectangle ispCrop = size.centeredTo(Rectangle(unicamFormat.size).center()); - platformSetIspCrop(ispCrop); + platformSetIspCrop(0, ispCrop); /* * Set the scaler crop to the value we are using (scaled to native sensor * coordinates). From fb5774c0b965a43c70f1d2eebc0df55f1e6b9d32 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Fri, 2 Aug 2024 08:53:56 +0100 Subject: [PATCH 07/46] pipeline: rpi: Handler controls::rpi::ScalerCrops Handle multiple scaler crops being set through the rpi::ScalerCrops control. We now populate the cropParams_ map in the loop where we handle the output stream configuration items. The key of this map is the index of the stream configuration structure set by the application. This will also be the same index used to specify the crop rectangles through the ScalerCrops control. CameraData::applyScalerCrop() has been adapted to look at either controls::ScalerCrop or controls::rpi::ScalerCrops. The former takes priority over the latter, and if present, will apply the same scaler crop to all output streams. Finally return all crops through the same ScalerCrops control via request metadata. The first configure stream's crop rectangle is also returned via the ScalerCrop control in the request metadata. Signed-off-by: Naushir Patuck --- .../pipeline/rpi/common/pipeline_base.cpp | 69 +++++++++++++++---- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index a6ea4e9c4..b9759b682 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -561,11 +561,28 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config) for (auto const &c : result.controlInfo) ctrlMap.emplace(c.first, c.second); - if (data->cropParams_.count(0)) { - /* Add the ScalerCrop control limits based on the current mode. */ + if (data->cropParams_.size()) { + /* + * Add the ScalerCrop control limits based on the current mode and + * the first configured stream. + */ Rectangle ispMinCrop = data->scaleIspCrop(Rectangle(data->cropParams_[0].ispMinCropSize)); ctrlMap[&controls::ScalerCrop] = ControlInfo(ispMinCrop, data->sensorInfo_.analogCrop, data->scaleIspCrop(data->cropParams_[0].ispCrop)); + if (data->cropParams_.size() == 2) { + /* + * The control map for rpi::ScalerCrops has the min value + * as the default crop for stream 0, max value as the default + * value for stream 1. + */ + ctrlMap[&controls::rpi::ScalerCrops] = + ControlInfo(data->scaleIspCrop(data->cropParams_[0].ispCrop), + data->scaleIspCrop(data->cropParams_[1].ispCrop), + ctrlMap[&controls::ScalerCrop].def()); + } else { + /* Match the same ControlInfo for rpi::ScalerCrops. */ + ctrlMap[&controls::rpi::ScalerCrops] = ctrlMap[&controls::ScalerCrop]; + } } data->controlInfo_ = ControlInfoMap(std::move(ctrlMap), result.controlInfo.idmap()); @@ -1292,10 +1309,29 @@ Rectangle CameraData::scaleIspCrop(const Rectangle &ispCrop) const void CameraData::applyScalerCrop(const ControlList &controls) { - const auto &scalerCrop = controls.get(controls::ScalerCrop); - if (scalerCrop && cropParams_.count(0)) { - CropParams &cropParams = cropParams_[0]; - Rectangle nativeCrop = *scalerCrop; + const auto &scalerCropRPi = controls.get>(controls::rpi::ScalerCrops); + const auto &scalerCropCore = controls.get(controls::ScalerCrop); + std::vector scalerCrops; + + /* + * First thing to do is create a vector of crops to apply to each ISP output + * based on either controls::ScalerCrop or controls::rpi::ScalerCrops if + * present. + * + * If controls::ScalerCrop is present, apply the same crop to all ISP output + * streams. Otherwise if controls::rpi::ScalerCrops, apply the given crops + * to the ISP output streams, indexed by the same order in which they had + * been configured. This is not the same as the ISP output index. + */ + for (unsigned int i = 0; i < cropParams_.size(); i++) { + if (scalerCropRPi && i < scalerCropRPi->size()) + scalerCrops.push_back(scalerCropRPi->data()[i]); + else if (scalerCropCore) + scalerCrops.push_back(*scalerCropCore); + } + + for (auto const &[i, scalerCrop] : utils::enumerate(scalerCrops)) { + Rectangle nativeCrop = scalerCrop; if (!nativeCrop.width || !nativeCrop.height) nativeCrop = { 0, 0, 1, 1 }; @@ -1311,13 +1347,13 @@ void CameraData::applyScalerCrop(const ControlList &controls) * 2. With the same mid-point, if possible. * 3. But it can't go outside the sensor area. */ - Size minSize = cropParams.ispMinCropSize.expandedToAspectRatio(nativeCrop.size()); + Size minSize = cropParams_[i].ispMinCropSize.expandedToAspectRatio(nativeCrop.size()); Size size = ispCrop.size().expandedTo(minSize); ispCrop = size.centeredTo(ispCrop.center()).enclosedIn(Rectangle(sensorInfo_.outputSize)); - if (ispCrop != cropParams.ispCrop) { - cropParams.ispCrop = ispCrop; - platformSetIspCrop(cropParams.ispIndex, ispCrop); + if (ispCrop != cropParams_[i].ispCrop) { + cropParams_[i].ispCrop = ispCrop; + platformSetIspCrop(cropParams_[i].ispIndex, ispCrop); } } } @@ -1474,9 +1510,16 @@ void CameraData::fillRequestMetadata(const ControlList &bufferControls, Request request->metadata().set(controls::SensorTimestamp, bufferControls.get(controls::SensorTimestamp).value_or(0)); - if (cropParams_.count(0)) - request->metadata().set(controls::ScalerCrop, - scaleIspCrop(cropParams_[0].ispCrop)); + if (cropParams_.size()) { + std::vector crops; + + for (auto const &[k, v] : cropParams_) + crops.push_back(scaleIspCrop(v.ispCrop)); + + request->metadata().set(controls::ScalerCrop, crops[0]); + request->metadata().set(controls::rpi::ScalerCrops, + Span(crops.data(), crops.size())); + } } } /* namespace libcamera */ From 2da4fb49c4182b269014dc7dc5043695c374ca4c Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Fri, 6 Sep 2024 14:44:39 +0100 Subject: [PATCH 08/46] pipeline: rpi: Fix invalid access to CameraData::sensorInfo_ sensorInfo_ currently gets populated in configureIPA(), but is possibly referenced in platformConfigure() which is called first. Fix this by populating sensorInfo_ straight after configuring the sensor in configure(), ensuring the fields are valid in the call to platformConfigure(). Signed-off-by: Naushir Patuck --- .../pipeline/rpi/common/pipeline_base.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index b9759b682..d9a2766d5 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -529,6 +529,13 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config) if (ret) return ret; + /* We store the IPACameraSensorInfo for digital zoom calculations. */ + ret = data->sensor_->sensorInfo(&data->sensorInfo_); + if (ret) { + LOG(RPI, Error) << "Failed to retrieve camera sensor info"; + return ret; + } + /* * Platform specific internal stream configuration. This also assigns * external streams which get configured below. @@ -1201,13 +1208,6 @@ int CameraData::configureIPA(const CameraConfiguration *config, ipa::RPi::Config if (ret) return ret; - /* We store the IPACameraSensorInfo for digital zoom calculations. */ - ret = sensor_->sensorInfo(&sensorInfo_); - if (ret) { - LOG(RPI, Error) << "Failed to retrieve camera sensor info"; - return ret; - } - /* Always send the user transform to the IPA. */ Transform transform = config->orientation / Orientation::Rotate0; params.transform = static_cast(transform); From 471c190593b6706e68ba5437a7ae49e5a3e736b8 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Fri, 13 Sep 2024 08:13:56 +0100 Subject: [PATCH 09/46] pipeline: rpi: Fix for multiple reported scaler crops Ensure we index the CameraConfiguration incrementally when setting up the raw and output streams. Signed-off-by: Naushir Patuck --- src/libcamera/pipeline/rpi/common/pipeline_base.cpp | 8 +++++--- src/libcamera/pipeline/rpi/common/pipeline_base.h | 2 +- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index d9a2766d5..dbfb6a33d 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -182,11 +182,12 @@ CameraConfiguration::Status RPiCameraConfiguration::validate() rawStreams_.clear(); outStreams_.clear(); - for (const auto &[index, cfg] : utils::enumerate(config_)) { + unsigned int rawIndex = 0, outIndex = 0; + for (auto &cfg : config_) { if (PipelineHandlerBase::isRaw(cfg.pixelFormat)) - rawStreams_.emplace_back(index, &cfg); + rawStreams_.emplace_back(rawIndex++, &cfg); else - outStreams_.emplace_back(index, &cfg); + outStreams_.emplace_back(outIndex++, &cfg); } /* Sort the streams so the highest resolution is first. */ @@ -1513,6 +1514,7 @@ void CameraData::fillRequestMetadata(const ControlList &bufferControls, Request if (cropParams_.size()) { std::vector crops; + ASSERT(cropParams_.size() <= 2); for (auto const &[k, v] : cropParams_) crops.push_back(scaleIspCrop(v.ispCrop)); diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h index 7959d874d..3c47411f7 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.h +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h @@ -152,7 +152,7 @@ class CameraData : public Camera::Private unsigned int ispIndex; }; - /* Mapping of CropParams keyed by the stream index in CameraConfiguration */ + /* Mapping of CropParams keyed by the output stream order in CameraConfiguration */ std::map cropParams_; unsigned int dropFrameCount_; diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index 04fb3c066..94bddc90d 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -715,7 +715,7 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi cropParams_.clear(); cropParams_.emplace(std::piecewise_construct, std::forward_as_tuple(0), - std::forward_as_tuple(scaleIspCrop(ispCrop), testCrop.size(), 0)); + std::forward_as_tuple(ispCrop, testCrop.size(), 0)); return 0; } From bb52ecba4f5d67e369c94b34e418caa463313cea Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Thu, 4 May 2023 08:05:55 +0100 Subject: [PATCH 10/46] meson: Add libpisp.wrap Add a new subpoject wrap file for the libpisp library located at https://github.com/raspberrypi/libpisp The libpisp library is used to configure the Raspberry Pi 5 Frontend and Backend ISP components. Signed-off-by: Naushir Patuck Reviewed-by: David Plowman --- subprojects/.gitignore | 1 + subprojects/libpisp.wrap | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 subprojects/libpisp.wrap diff --git a/subprojects/.gitignore b/subprojects/.gitignore index 04b6271f2..b08d69907 100644 --- a/subprojects/.gitignore +++ b/subprojects/.gitignore @@ -1,6 +1,7 @@ # SPDX-License-Identifier: CC0-1.0 /googletest-release* +/libpisp /libyaml /libyuv /packagecache diff --git a/subprojects/libpisp.wrap b/subprojects/libpisp.wrap new file mode 100644 index 000000000..058e6cc79 --- /dev/null +++ b/subprojects/libpisp.wrap @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: CC0-1.0 + +[wrap-git] +url = https://github.com/raspberrypi/libpisp.git +revision = v1.0.7 +depth = 1 From c28fca8fd9817229d33255bb2b285aaa6f3cc21d Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Mon, 19 Jun 2023 15:49:47 +0100 Subject: [PATCH 11/46] pipeline: rpi: Add support for Raspberry Pi 5 Add the Raspberry Pi 5 ISP (PiSP) pipeline handler to libcamera. To include this pipeline handler in the build, set the following meson option: meson configure -Dpipelines=rpi/pisp Signed-off-by: Naushir Patuck Reviewed-by: David Plowman --- Documentation/guides/pipeline-handler.rst | 2 +- include/libcamera/ipa/meson.build | 1 + include/libcamera/meson.build | 1 + meson.build | 1 + meson_options.txt | 1 + .../pipeline/rpi/common/rpi_stream.h | 5 + .../pipeline/rpi/pisp/data/example.yaml | 45 + .../pipeline/rpi/pisp/data/meson.build | 8 + src/libcamera/pipeline/rpi/pisp/meson.build | 12 + src/libcamera/pipeline/rpi/pisp/pisp.cpp | 2304 +++++++++++++++++ 10 files changed, 2379 insertions(+), 1 deletion(-) create mode 100644 src/libcamera/pipeline/rpi/pisp/data/example.yaml create mode 100644 src/libcamera/pipeline/rpi/pisp/data/meson.build create mode 100644 src/libcamera/pipeline/rpi/pisp/meson.build create mode 100644 src/libcamera/pipeline/rpi/pisp/pisp.cpp diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst index 26aea4334..333d4b88e 100644 --- a/Documentation/guides/pipeline-handler.rst +++ b/Documentation/guides/pipeline-handler.rst @@ -186,7 +186,7 @@ to the libcamera build options in the top level ``meson_options.txt``. option('pipelines', type : 'array', - choices : ['ipu3', 'rkisp1', 'rpi/vc4', 'simple', 'uvcvideo', 'vimc', 'vivid'], + choices : ['ipu3', 'rkisp1', 'rpi/pisp', 'rpi/vc4', 'simple', 'uvcvideo', 'vimc', 'vivid'], description : 'Select which pipeline handlers to include') diff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build index bf55e124e..17050cde0 100644 --- a/include/libcamera/ipa/meson.build +++ b/include/libcamera/ipa/meson.build @@ -65,6 +65,7 @@ libcamera_ipa_headers += custom_target('core_ipa_serializer_h', pipeline_ipa_mojom_mapping = { 'ipu3': 'ipu3.mojom', 'rkisp1': 'rkisp1.mojom', + 'rpi/pisp': 'raspberrypi.mojom', 'rpi/vc4': 'raspberrypi.mojom', 'simple': 'soft.mojom', 'vimc': 'vimc.mojom', diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build index a969a95db..3cb30918d 100644 --- a/include/libcamera/meson.build +++ b/include/libcamera/meson.build @@ -36,6 +36,7 @@ controls_map = { 'controls': { 'draft': 'control_ids_draft.yaml', 'core': 'control_ids_core.yaml', + 'rpi/pisp': 'control_ids_rpi.yaml', 'rpi/vc4': 'control_ids_rpi.yaml', }, diff --git a/meson.build b/meson.build index 63e45465d..86c6582ef 100644 --- a/meson.build +++ b/meson.build @@ -210,6 +210,7 @@ pipelines_support = { 'ipu3': arch_x86, 'mali-c55': arch_arm, 'rkisp1': arch_arm, + 'rpi/pisp': arch_arm, 'rpi/vc4': arch_arm, 'simple': ['any'], 'uvcvideo': ['any'], diff --git a/meson_options.txt b/meson_options.txt index 7aa412491..9eeec1f06 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -50,6 +50,7 @@ option('pipelines', 'ipu3', 'mali-c55', 'rkisp1', + 'rpi/pisp', 'rpi/vc4', 'simple', 'uvcvideo', diff --git a/src/libcamera/pipeline/rpi/common/rpi_stream.h b/src/libcamera/pipeline/rpi/common/rpi_stream.h index a13d5dc0d..a559a2f4e 100644 --- a/src/libcamera/pipeline/rpi/common/rpi_stream.h +++ b/src/libcamera/pipeline/rpi/common/rpi_stream.h @@ -82,6 +82,11 @@ class Stream : public libcamera::Stream * to be applied after ISP processing. */ Needs32bitConv = (1 << 4), + /* + * Indicates that the input stream needs a software 16-bit endian + * conversion to be applied before ISP processing. + */ + Needs16bitEndianSwap = (1 << 5), }; using StreamFlags = Flags; diff --git a/src/libcamera/pipeline/rpi/pisp/data/example.yaml b/src/libcamera/pipeline/rpi/pisp/data/example.yaml new file mode 100644 index 000000000..7b8e51f7a --- /dev/null +++ b/src/libcamera/pipeline/rpi/pisp/data/example.yaml @@ -0,0 +1,45 @@ +{ + "version": 1.0, + "target": "pisp", + + "pipeline_handler": + { + # Number of CFE config and stats buffers to allocate and use. A + # larger number minimises the possibility of dropping frames, + # but increases the latency for updating the HW configuration. + # + # "num_cfe_config_stats_buffers": 12, + + # Number of jobs to queue ahead to the CFE on startup. A larger + # number will increase latency for 3A changes, but may reduce + # avoidable frame drops. + # + # "num_cfe_config_queue": 2, + + # Override any request from the IPA to drop a number of startup + # frames. + # + # "disable_startup_frame_drops": false, + + # Custom timeout value (in ms) for camera to use. This overrides + # the value computed by the pipeline handler based on frame + # durations. + # + # Set this value to 0 to use the pipeline handler computed + # timeout value. + # + # "camera_timeout_value_ms": 0, + + # Disables temporal denoise functionality in the ISP pipeline. + # Disabling temporal denoise avoids allocating 2 additional + # Bayer framebuffers required for its operation. + # + # "disable_tdn": false, + + # Disables multiframe HDR functionality in the ISP pipeline. + # Disabling multiframe HDR avoids allocating 2 additional Bayer + # framebuffers required for its operation. + # + # "disable_hdr": false, + } +} diff --git a/src/libcamera/pipeline/rpi/pisp/data/meson.build b/src/libcamera/pipeline/rpi/pisp/data/meson.build new file mode 100644 index 000000000..17dfc435b --- /dev/null +++ b/src/libcamera/pipeline/rpi/pisp/data/meson.build @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: CC0-1.0 + +conf_files = files([ + 'example.yaml', +]) + +install_data(conf_files, + install_dir : pipeline_data_dir / 'rpi' / 'pisp') diff --git a/src/libcamera/pipeline/rpi/pisp/meson.build b/src/libcamera/pipeline/rpi/pisp/meson.build new file mode 100644 index 000000000..178df94c2 --- /dev/null +++ b/src/libcamera/pipeline/rpi/pisp/meson.build @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: CC0-1.0 + +libcamera_internal_sources += files([ + 'pisp.cpp', +]) + +librt = cc.find_library('rt', required : true) +libpisp_dep = dependency('libpisp', fallback : ['libpisp', 'libpisp_dep']) + +libcamera_deps += [libpisp_dep, librt] + +subdir('data') diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp new file mode 100644 index 000000000..f822c9f3d --- /dev/null +++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp @@ -0,0 +1,2304 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2023, Raspberry Pi Ltd + * + * pisp.cpp - Pipeline handler for PiSP based Raspberry Pi devices + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include "libcamera/internal/device_enumerator.h" +#include "libcamera/internal/shared_mem_object.h" + +#include "libpisp/backend/backend.hpp" +#include "libpisp/common/logging.hpp" +#include "libpisp/common/utils.hpp" +#include "libpisp/common/version.hpp" +#include "libpisp/frontend/frontend.hpp" +#include "libpisp/variants/variant.hpp" + +#include "../common/pipeline_base.h" +#include "../common/rpi_stream.h" + +namespace libcamera { + +LOG_DECLARE_CATEGORY(RPI) + +using StreamFlag = RPi::Stream::StreamFlag; +using StreamParams = RPi::RPiCameraConfiguration::StreamParams; + +namespace { + +enum class Cfe : unsigned int { Output0, Embedded, Stats, Config }; +enum class Isp : unsigned int { Input, Output0, Output1, TdnInput, TdnOutput, + StitchInput, StitchOutput, Config }; + +/* Offset for all compressed buffers; mode for TDN and Stitch. */ +constexpr unsigned int DefaultCompressionOffset = 2048; +constexpr unsigned int DefaultCompressionMode = 1; + +const std::vector> BayerToMbusCodeMap{ + { { BayerFormat::BGGR, 8, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SBGGR8_1X8, }, + { { BayerFormat::GBRG, 8, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SGBRG8_1X8, }, + { { BayerFormat::GRBG, 8, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SGRBG8_1X8, }, + { { BayerFormat::RGGB, 8, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SRGGB8_1X8, }, + { { BayerFormat::BGGR, 10, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SBGGR10_1X10, }, + { { BayerFormat::GBRG, 10, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SGBRG10_1X10, }, + { { BayerFormat::GRBG, 10, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SGRBG10_1X10, }, + { { BayerFormat::RGGB, 10, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SRGGB10_1X10, }, + { { BayerFormat::BGGR, 12, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SBGGR12_1X12, }, + { { BayerFormat::GBRG, 12, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SGBRG12_1X12, }, + { { BayerFormat::GRBG, 12, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SGRBG12_1X12, }, + { { BayerFormat::RGGB, 12, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SRGGB12_1X12, }, + { { BayerFormat::BGGR, 14, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SBGGR14_1X14, }, + { { BayerFormat::GBRG, 14, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SGBRG14_1X14, }, + { { BayerFormat::GRBG, 14, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SGRBG14_1X14, }, + { { BayerFormat::RGGB, 14, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SRGGB14_1X14, }, + { { BayerFormat::BGGR, 16, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SBGGR16_1X16, }, + { { BayerFormat::GBRG, 16, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SGBRG16_1X16, }, + { { BayerFormat::GRBG, 16, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SGRBG16_1X16, }, + { { BayerFormat::RGGB, 16, BayerFormat::Packing::None }, MEDIA_BUS_FMT_SRGGB16_1X16, }, + { { BayerFormat::BGGR, 16, BayerFormat::Packing::PISP1 }, MEDIA_BUS_FMT_SBGGR16_1X16, }, + { { BayerFormat::GBRG, 16, BayerFormat::Packing::PISP1 }, MEDIA_BUS_FMT_SGBRG16_1X16, }, + { { BayerFormat::GRBG, 16, BayerFormat::Packing::PISP1 }, MEDIA_BUS_FMT_SGRBG16_1X16, }, + { { BayerFormat::RGGB, 16, BayerFormat::Packing::PISP1 }, MEDIA_BUS_FMT_SRGGB16_1X16, }, + { { BayerFormat::RGGB, 16, BayerFormat::Packing::PISP1 }, MEDIA_BUS_FMT_SRGGB16_1X16, }, + { { BayerFormat::MONO, 16, BayerFormat::Packing::None }, MEDIA_BUS_FMT_Y16_1X16, }, + { { BayerFormat::MONO, 16, BayerFormat::Packing::PISP1 }, MEDIA_BUS_FMT_Y16_1X16, }, +}; + +unsigned int bayerToMbusCode(const BayerFormat &bayer) +{ + const auto it = std::find_if(BayerToMbusCodeMap.begin(), BayerToMbusCodeMap.end(), + [bayer](const std::pair &match) { + return bayer == match.first; + }); + + if (it != BayerToMbusCodeMap.end()) + return it->second; + + return 0; +} + +uint32_t mbusCodeUnpacked16(unsigned int code) +{ + BayerFormat bayer = BayerFormat::fromMbusCode(code); + BayerFormat bayer16(bayer.order, 16, BayerFormat::Packing::None); + + return bayerToMbusCode(bayer16); +} + +uint8_t toPiSPBayerOrder(V4L2PixelFormat format) +{ + BayerFormat bayer = BayerFormat::fromV4L2PixelFormat(format); + + switch (bayer.order) { + case BayerFormat::Order::BGGR: + return PISP_BAYER_ORDER_BGGR; + case BayerFormat::Order::GBRG: + return PISP_BAYER_ORDER_GBRG; + case BayerFormat::Order::GRBG: + return PISP_BAYER_ORDER_GRBG; + case BayerFormat::Order::RGGB: + return PISP_BAYER_ORDER_RGGB; + case BayerFormat::Order::MONO: + return PISP_BAYER_ORDER_GREYSCALE; + default: + ASSERT(0); + return -1; + } +} + +pisp_image_format_config toPiSPImageFormat(V4L2DeviceFormat &format) +{ + pisp_image_format_config image = {}; + + image.width = format.size.width; + image.height = format.size.height; + image.stride = format.planes[0].bpl; + + PixelFormat pix = format.fourcc.toPixelFormat(); + + if (RPi::PipelineHandlerBase::isRaw(pix)) { + BayerFormat bayer = BayerFormat::fromPixelFormat(pix); + switch (bayer.packing) { + case BayerFormat::Packing::None: + image.format = PISP_IMAGE_FORMAT_BPS_16 + + PISP_IMAGE_FORMAT_UNCOMPRESSED; + break; + case BayerFormat::Packing::PISP1: + image.format = PISP_IMAGE_FORMAT_COMPRESSION_MODE_1; + break; + case BayerFormat::Packing::PISP2: + image.format = PISP_IMAGE_FORMAT_COMPRESSION_MODE_2; + break; + default: + ASSERT(0); + } + return image; + } + + switch (pix) { + case formats::YUV420: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + + PISP_IMAGE_FORMAT_BPS_8 + + PISP_IMAGE_FORMAT_SAMPLING_420 + + PISP_IMAGE_FORMAT_PLANARITY_PLANAR; + image.stride2 = image.stride / 2; + break; + case formats::NV12: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + + PISP_IMAGE_FORMAT_BPS_8 + + PISP_IMAGE_FORMAT_SAMPLING_420 + + PISP_IMAGE_FORMAT_PLANARITY_SEMI_PLANAR; + image.stride2 = image.stride; + break; + case formats::NV21: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + + PISP_IMAGE_FORMAT_BPS_8 + + PISP_IMAGE_FORMAT_SAMPLING_420 + + PISP_IMAGE_FORMAT_PLANARITY_SEMI_PLANAR + + PISP_IMAGE_FORMAT_ORDER_SWAPPED; + image.stride2 = image.stride; + break; + case formats::YUYV: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + + PISP_IMAGE_FORMAT_BPS_8 + + PISP_IMAGE_FORMAT_SAMPLING_422 + + PISP_IMAGE_FORMAT_PLANARITY_INTERLEAVED; + break; + case formats::UYVY: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + + PISP_IMAGE_FORMAT_BPS_8 + + PISP_IMAGE_FORMAT_SAMPLING_422 + + PISP_IMAGE_FORMAT_PLANARITY_INTERLEAVED + + PISP_IMAGE_FORMAT_ORDER_SWAPPED; + break; + case formats::NV16: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + + PISP_IMAGE_FORMAT_BPS_8 + + PISP_IMAGE_FORMAT_SAMPLING_422 + + PISP_IMAGE_FORMAT_PLANARITY_SEMI_PLANAR; + image.stride2 = image.stride; + break; + case formats::NV61: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + + PISP_IMAGE_FORMAT_BPS_8 + + PISP_IMAGE_FORMAT_SAMPLING_422 + + PISP_IMAGE_FORMAT_PLANARITY_SEMI_PLANAR + + PISP_IMAGE_FORMAT_ORDER_SWAPPED; + image.stride2 = image.stride; + break; + case formats::RGB888: + case formats::BGR888: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL; + break; + case formats::XRGB8888: + case formats::XBGR8888: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + PISP_IMAGE_FORMAT_BPP_32; + break; + case formats::RGBX8888: + case formats::BGRX8888: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + PISP_IMAGE_FORMAT_BPP_32 + + PISP_IMAGE_FORMAT_ORDER_SWAPPED; + break; + case formats::RGB161616: + case formats::BGR161616: + image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + PISP_IMAGE_FORMAT_BPS_16; + break; + default: + LOG(RPI, Error) << "Pixel format " << pix << " unsupported"; + ASSERT(0); + } + + return image; +} + +void computeOptimalStride(V4L2DeviceFormat &format) +{ + pisp_image_format_config fmt = toPiSPImageFormat(format); + + libpisp::compute_optimal_stride(fmt); + + uint32_t fourcc = format.fourcc.fourcc(); + + /* + * For YUV420/422 non-multiplanar formats, double the U/V stride for the + * Y-plane to ensure we get the optimal alignment on all three planes. + */ + if (fourcc == V4L2_PIX_FMT_YUV420 || fourcc == V4L2_PIX_FMT_YUV422P || + fourcc == V4L2_PIX_FMT_YVU420) + fmt.stride = fmt.stride2 * 2; + + format.planes[0].bpl = fmt.stride; + format.planes[1].bpl = fmt.stride2; + format.planes[2].bpl = fmt.stride2; + + /* + * Need to set planesCount correctly so that V4L2VideoDevice::trySetFormatMultiplane() + * copies the bpl fields correctly. + */ + const PixelFormat &pixFormat = format.fourcc.toPixelFormat(); + const PixelFormatInfo &info = PixelFormatInfo::info(pixFormat); + format.planesCount = info.numPlanes(); +} + +void setupOutputClipping(const V4L2DeviceFormat &v4l2Format, + pisp_be_output_format_config &outputFormat) +{ + const PixelFormat &pixFormat = v4l2Format.fourcc.toPixelFormat(); + const PixelFormatInfo &info = PixelFormatInfo::info(pixFormat); + + if (info.colourEncoding != PixelFormatInfo::ColourEncodingYUV) + return; + + if (v4l2Format.colorSpace == ColorSpace::Sycc) { + outputFormat.lo = 0; + outputFormat.hi = 65535; + outputFormat.lo2 = 0; + outputFormat.hi2 = 65535; + } else if (v4l2Format.colorSpace == ColorSpace::Smpte170m || + v4l2Format.colorSpace == ColorSpace::Rec709) { + outputFormat.lo = 16 << 8; + outputFormat.hi = 235 << 8; + outputFormat.lo2 = 16 << 8; + outputFormat.hi2 = 240 << 8; + } else { + LOG(RPI, Warning) + << "Unrecognised colour space " + << ColorSpace::toString(v4l2Format.colorSpace) + << ", using full range"; + outputFormat.lo = 0; + outputFormat.hi = 65535; + outputFormat.lo2 = 0; + outputFormat.hi2 = 65535; + } +} + +int dmabufSyncStart(const SharedFD &fd) +{ + struct dma_buf_sync dma_sync {}; + dma_sync.flags = DMA_BUF_SYNC_START | DMA_BUF_SYNC_RW; + + int ret = ::ioctl(fd.get(), DMA_BUF_IOCTL_SYNC, &dma_sync); + if (ret) + LOG(RPI, Error) << "failed to lock-sync-write dma buf"; + + return ret; +} + +int dmabufSyncEnd(const SharedFD &fd) +{ + struct dma_buf_sync dma_sync {}; + dma_sync.flags = DMA_BUF_SYNC_END | DMA_BUF_SYNC_RW; + + int ret = ::ioctl(fd.get(), DMA_BUF_IOCTL_SYNC, &dma_sync); + + if (ret) + LOG(RPI, Error) << "failed to unlock-sync-write dma buf"; + + return ret; +} + +void do32BitConversion(void *mem, unsigned int width, unsigned int height, + unsigned int stride) +{ + /* + * The arm64 version is actually not that much quicker because the + * vast bulk of the time is spent waiting for memory. + */ +#if __aarch64__ + for (unsigned int j = 0; j < height; j++) { + uint8_t *ptr = (uint8_t *)mem + j * stride; + uint64_t count = (width + 15) / 16; + uint8_t *dest = ptr + count * 64; + uint8_t *src = ptr + count * 48; + + /* Pre-decrement would have been nice. */ + asm volatile("movi v3.16b, #255 \n" + "1: \n" + "sub %[src], %[src], #48 \n" + "sub %[dest], %[dest], #64 \n" + "subs %[count], %[count], #1 \n" + "ld3 {v0.16b, v1.16b, v2.16b}, [%[src]] \n" + "st4 {v0.16b, v1.16b, v2.16b, v3.16b}, [%[dest]] \n" + "b.gt 1b \n" + : [count]"+r" (count) + : [src]"r" (src), [dest]"r" (dest) + : "cc", "v1", "v2", "v3", "v4", "memory" + ); + } +#else + std::vector incache(3 * width); + std::vector outcache(4 * width); + + memcpy(incache.data(), mem, 3 * width); + for (unsigned int j = 0; j < height; j++) { + uint8_t *ptr = (uint8_t *)mem + j * stride; + + uint8_t *ptr3 = incache.data(); + uint8_t *ptr4 = outcache.data(); + for (unsigned int i = 0; i < width; i++) { + *(ptr4++) = *(ptr3++); + *(ptr4++) = *(ptr3++); + *(ptr4++) = *(ptr3++); + *(ptr4++) = 255; + } + + if (j < height - 1) + memcpy(incache.data(), ptr + stride, 3 * width); + memcpy(ptr, outcache.data(), 4 * width); + } +#endif +} + +void do16BitEndianSwap([[maybe_unused]] void *mem, [[maybe_unused]] unsigned int width, + [[maybe_unused]] unsigned int height, [[maybe_unused]] unsigned int stride) +{ +#if __aarch64__ + for (unsigned int j = 0; j < height; j++) { + uint8_t *ptr = (uint8_t *)mem + j * stride; + uint64_t count = (width + 7) / 8; + + asm volatile("1: \n" + "ld1 {v1.16b}, [%[ptr]] \n" + "rev16 v1.16b, v1.16b \n" + "st1 {v1.16b}, [%[ptr]], #16 \n" + "subs %[count], %[count], #1 \n" + "b.gt 1b \n" + : [count]"+r" (count), [ptr]"+r" (ptr) + : + : "cc", "v1", "memory" + ); + } +#endif +} + +void downscaleInterleaved3(void *mem, unsigned int height, unsigned int src_width, + unsigned int stride) +{ + std::vector incache(3 * src_width); + unsigned int dst_width = src_width / 2; + std::vector outcache(3 * dst_width); + + memcpy(incache.data(), mem, 3 * src_width); + for (unsigned int j = 0; j < height; j++) { + uint8_t *ptr = (uint8_t *)mem + j * stride; + + uint8_t *src = incache.data(), *dst = outcache.data(); + for (unsigned int i = 0; i < dst_width; i++, src += 6, dst += 3) { + dst[0] = ((int)src[0] + (int)src[3] + 1) >> 1; + dst[1] = ((int)src[1] + (int)src[4] + 1) >> 1; + dst[2] = ((int)src[2] + (int)src[5] + 1) >> 1; + } + + if (j < height - 1) + memcpy(incache.data(), ptr + stride, 3 * src_width); + memcpy(ptr, outcache.data(), 3 * dst_width); + } +} + +void downscaleInterleaved4(void *mem, unsigned int height, unsigned int src_width, + unsigned int stride) +{ + std::vector incache(4 * src_width); + unsigned int dst_width = src_width / 2; + std::vector outcache(4 * dst_width); + + memcpy(incache.data(), mem, 4 * src_width); + for (unsigned int j = 0; j < height; j++) { + uint8_t *ptr = (uint8_t *)mem + j * stride; + + uint8_t *src = incache.data(), *dst = outcache.data(); + for (unsigned int i = 0; i < dst_width; i++, src += 8, dst += 4) { + dst[0] = ((int)src[0] + (int)src[4] + 1) >> 1; + dst[1] = ((int)src[1] + (int)src[5] + 1) >> 1; + dst[2] = ((int)src[2] + (int)src[6] + 1) >> 1; + dst[3] = ((int)src[3] + (int)src[7] + 1) >> 1; + } + + if (j < height - 1) + memcpy(incache.data(), ptr + stride, 4 * src_width); + memcpy(ptr, outcache.data(), 4 * dst_width); + } +} + +void downscalePlaneInternal(void *mem, unsigned int height, unsigned int src_width, + unsigned int stride, std::vector &incache, + std::vector &outcache) +{ + unsigned int dst_width = src_width / 2; + memcpy(incache.data(), mem, src_width); + for (unsigned int j = 0; j < height; j++) { + uint8_t *ptr = (uint8_t *)mem + j * stride; + + uint8_t *src = incache.data(), *dst = outcache.data(); + for (unsigned int i = 0; i < dst_width; i++, src += 2, dst++) + *dst = ((int)src[0] + (int)src[1] + 1) >> 1; + + if (j < height - 1) + memcpy(incache.data(), ptr + stride, src_width); + memcpy(ptr, outcache.data(), dst_width); + } +} + +void downscalePlanar420(void *memY, void *memU, void *memV, unsigned int height, + unsigned int src_width, unsigned int stride) +{ + std::vector incache(src_width); + std::vector outcache(src_width / 2); + + downscalePlaneInternal(memY, height, src_width, stride, incache, outcache); + downscalePlaneInternal(memU, height / 2, src_width / 2, stride / 2, incache, outcache); + downscalePlaneInternal(memV, height / 2, src_width / 2, stride / 2, incache, outcache); +} + +void downscalePlanar422(void *memY, void *memU, void *memV, + unsigned int height, unsigned int src_width, unsigned int stride) +{ + std::vector incache(src_width); + std::vector outcache(src_width / 2); + + downscalePlaneInternal(memY, height, src_width, stride, incache, outcache); + downscalePlaneInternal(memU, height, src_width / 2, stride / 2, incache, outcache); + downscalePlaneInternal(memV, height, src_width / 2, stride / 2, incache, outcache); +} + +void downscaleInterleavedYuyv(void *mem, unsigned int height, unsigned int src_width, + unsigned int stride) +{ + std::vector incache(2 * src_width); + unsigned int dst_width = src_width / 2; + std::vector outcache(2 * dst_width); + + memcpy(incache.data(), mem, 2 * src_width); + for (unsigned int j = 0; j < height; j++) { + uint8_t *ptr = (uint8_t *)mem + j * stride; + + uint8_t *src = incache.data(), *dst = outcache.data(); + for (unsigned int i = 0; i < dst_width; i++, src += 8, dst += 4) { + dst[0] = ((int)src[0] + (int)src[2] + 1) >> 1; + dst[1] = ((int)src[1] + (int)src[5] + 1) >> 1; + dst[2] = ((int)src[4] + (int)src[6] + 1) >> 1; + dst[3] = ((int)src[3] + (int)src[7] + 1) >> 1; + } + + if (j < height - 1) + memcpy(incache.data(), ptr + stride, 4 * src_width); + memcpy(ptr, outcache.data(), 2 * dst_width); + } +} + +void downscaleInterleavedUyvy(void *mem, unsigned int height, unsigned int src_width, + unsigned int stride) +{ + std::vector incache(2 * src_width); + unsigned int dst_width = src_width / 2; + std::vector outcache(2 * dst_width); + + memcpy(incache.data(), mem, 2 * src_width); + for (unsigned int j = 0; j < height; j++) { + uint8_t *ptr = (uint8_t *)mem + j * stride; + + uint8_t *src = incache.data(), *dst = outcache.data(); + for (unsigned int i = 0; i < dst_width; i++, src += 8, dst += 4) { + dst[0] = ((int)src[0] + (int)src[4] + 1) >> 1; + dst[1] = ((int)src[1] + (int)src[3] + 1) >> 1; + dst[2] = ((int)src[2] + (int)src[6] + 1) >> 1; + dst[3] = ((int)src[5] + (int)src[7] + 1) >> 1; + } + + if (j < height - 1) + memcpy(incache.data(), ptr + stride, 4 * src_width); + memcpy(ptr, outcache.data(), 2 * dst_width); + } +} + +void downscaleInterleaved2Internal(void *mem, unsigned int height, unsigned int src_width, + unsigned int stride, std::vector &incache, + std::vector &outcache) +{ + unsigned int dst_width = src_width / 2; + memcpy(incache.data(), mem, 2 * src_width); + for (unsigned int j = 0; j < height; j++) { + uint8_t *ptr = (uint8_t *)mem + j * stride; + + uint8_t *src = incache.data(), *dst = outcache.data(); + for (unsigned int i = 0; i < dst_width; i++, src += 4, dst += 2) { + dst[0] = ((int)src[0] + (int)src[2] + 1) >> 1; + dst[1] = ((int)src[1] + (int)src[3] + 1) >> 1; + } + + if (j < height - 1) + memcpy(incache.data(), ptr + stride, 2 * src_width); + memcpy(ptr, outcache.data(), 2 * dst_width); + } +} + +void downscaleSemiPlanar420(void *memY, void *memUV, unsigned int height, + unsigned int src_width, unsigned int stride) +{ + std::vector incache(src_width); + std::vector outcache(src_width / 2); + + downscalePlaneInternal(memY, height, src_width, stride, incache, outcache); + downscaleInterleaved2Internal(memUV, height / 2, src_width / 2, stride, + incache, outcache); +} + +void downscaleStreamBuffer(RPi::Stream *stream, int index) +{ + unsigned int downscale = stream->swDownscale(); + /* Must be a power of 2. */ + ASSERT((downscale & (downscale - 1)) == 0); + + unsigned int stride = stream->configuration().stride; + unsigned int dst_width = stream->configuration().size.width; + unsigned int height = stream->configuration().size.height; + const PixelFormat &pixFormat = stream->configuration().pixelFormat; + const RPi::BufferObject &b = stream->getBuffer(index); + void *mem = b.mapped->planes()[0].data(); + ASSERT(b.mapped); + + /* Do repeated downscale-by-2 in place until we're done. */ + for (; downscale > 1; downscale >>= 1) { + unsigned int src_width = downscale * dst_width; + + if (pixFormat == formats::RGB888 || pixFormat == formats::BGR888) { + downscaleInterleaved3(mem, height, src_width, stride); + } else if (pixFormat == formats::XRGB8888 || pixFormat == formats::XBGR8888) { + /* On some devices these may actually be 24bpp at this point. */ + if (stream->getFlags() & StreamFlag::Needs32bitConv) + downscaleInterleaved3(mem, height, src_width, stride); + else + downscaleInterleaved4(mem, height, src_width, stride); + } else if (pixFormat == formats::YUV420 || pixFormat == formats::YVU420) { + /* These may look like either single or multi-planar buffers. */ + void *mem1; + void *mem2; + if (b.mapped->planes().size() == 3) { + mem1 = b.mapped->planes()[1].data(); + mem2 = b.mapped->planes()[2].data(); + } else { + unsigned int ySize = height * stride; + mem1 = static_cast(mem) + ySize; + mem2 = static_cast(mem1) + ySize / 4; + } + downscalePlanar420(mem, mem1, mem2, height, src_width, stride); + } else if (pixFormat == formats::YUV422 || pixFormat == formats::YVU422) { + /* These may look like either single or multi-planar buffers. */ + void *mem1; + void *mem2; + if (b.mapped->planes().size() == 3) { + mem1 = b.mapped->planes()[1].data(); + mem2 = b.mapped->planes()[2].data(); + } else { + unsigned int ySize = height * stride; + mem1 = static_cast(mem) + ySize; + mem2 = static_cast(mem1) + ySize / 2; + } + downscalePlanar422(mem, mem1, mem2, height, src_width, stride); + } else if (pixFormat == formats::YUYV || pixFormat == formats::YVYU) { + downscaleInterleavedYuyv(mem, height, src_width, stride); + } else if (pixFormat == formats::UYVY || pixFormat == formats::VYUY) { + downscaleInterleavedUyvy(mem, height, src_width, stride); + } else if (pixFormat == formats::NV12 || pixFormat == formats::NV21) { + /* These may look like either single or multi-planar buffers. */ + void *mem1; + if (b.mapped->planes().size() == 2) + mem1 = b.mapped->planes()[1].data(); + else + mem1 = static_cast(mem) + height * stride; + downscaleSemiPlanar420(mem, mem1, height, src_width, stride); + } else { + LOG(RPI, Error) << "Sw downscale unsupported for " << pixFormat; + ASSERT(0); + } + } +} + +/* Return largest width of any of these streams (or of the camera input). */ +unsigned int getLargestWidth(const V4L2SubdeviceFormat &sensorFormat, + const std::vector &outStreams) +{ + unsigned int largestWidth = sensorFormat.size.width; + + for (const auto &stream : outStreams) + largestWidth = std::max(largestWidth, stream.cfg->size.width); + + return largestWidth; +} + +/* Return the minimum number of pixels required to write out multiples of 16 bytes. */ +unsigned int getFormatAlignment(const V4L2PixelFormat &fourcc) +{ + const PixelFormatInfo &info = PixelFormatInfo::info(fourcc); + unsigned int formatAlignment = 0; + for (const auto &plane : info.planes) { + if (plane.bytesPerGroup) { + /* How many pixels we need in this plane for a multiple of 16 bytes (??). */ + unsigned int align = 16 * info.pixelsPerGroup / + std::gcd(16u, plane.bytesPerGroup); + formatAlignment = std::max(formatAlignment, align); + } + } + + return formatAlignment; +} + +/* Calculate the amount of software downscale required (which is a power of 2). */ +unsigned int calculateSwDownscale(const V4L2DeviceFormat &format, unsigned int largestWidth, + unsigned int platformMaxDownscale) +{ + unsigned int formatAlignment = getFormatAlignment(format.fourcc); + unsigned int maxDownscale = platformMaxDownscale * 16 / formatAlignment; + unsigned int limitWidth = largestWidth / maxDownscale; + + unsigned int hwWidth = format.size.width; + unsigned int swDownscale = 1; + for (; hwWidth < limitWidth; hwWidth *= 2, swDownscale *= 2); + + return swDownscale; +} + +} /* namespace */ + +using ::libpisp::BackEnd; +using ::libpisp::FrontEnd; + +class PiSPCameraData final : public RPi::CameraData +{ +public: + PiSPCameraData(PipelineHandler *pipe, const libpisp::PiSPVariant &variant) + : RPi::CameraData(pipe), pispVariant_(variant) + { + /* Initialise internal libpisp logging. */ + ::libpisp::logging_init(); + LOG(RPI, Info) << "libpisp version " << ::libpisp::version(); + } + + ~PiSPCameraData() + { + freeBuffers(); + } + + V4L2VideoDevice::Formats ispFormats() const override + { + return isp_[Isp::Output0].dev()->formats(); + } + + V4L2VideoDevice::Formats rawFormats() const override + { + return cfe_[Cfe::Output0].dev()->formats(); + } + + V4L2VideoDevice *frontendDevice() override + { + return cfe_[Cfe::Output0].dev(); + } + + CameraConfiguration::Status + platformValidate(RPi::RPiCameraConfiguration *rpiConfig) const override; + + int platformPipelineConfigure(const std::unique_ptr &root) override; + + void platformStart() override; + void platformStop() override; + void platformFreeBuffers() override; + + void cfeBufferDequeue(FrameBuffer *buffer); + void beInputDequeue(FrameBuffer *buffer); + void beOutputDequeue(FrameBuffer *buffer); + + void processStatsComplete(const ipa::RPi::BufferIds &buffers); + void prepareIspComplete(const ipa::RPi::BufferIds &buffers, bool stitchSwapBuffers); + void setCameraTimeout(uint32_t maxFrameLengthMs); + + /* Array of CFE and ISP device streams and associated buffers/streams. */ + RPi::Device cfe_; + RPi::Device isp_; + + const libpisp::PiSPVariant &pispVariant_; + + /* Frontend/Backend objects shared with the IPA. */ + SharedMemObject fe_; + SharedMemObject be_; + bool beEnabled_; + + std::unique_ptr csi2Subdev_; + std::unique_ptr feSubdev_; + + std::vector tdnBuffers_; + std::vector stitchBuffers_; + unsigned int tdnInputIndex_; + unsigned int stitchInputIndex_; + + struct Config { + /* + * Number of CFE config and stats buffers to allocate and use. A + * larger number minimises the possibility of dropping frames, + * but increases the latency for updating the HW configuration. + */ + unsigned int numCfeConfigStatsBuffers; + /* + * Number of jobs to queue ahead to the CFE on startup. + * A larger number will increase latency for 3A changes. + */ + unsigned int numCfeConfigQueue; + /* Don't use BE temporal denoise and free some memory resources. */ + bool disableTdn; + /* Don't use BE HDR and free some memory resources. */ + bool disableHdr; + }; + + Config config_; + + bool adjustDeviceFormat(V4L2DeviceFormat &format) const; + +private: + int platformConfigure(const RPi::RPiCameraConfiguration *rpiConfig) override; + + int platformConfigureIpa([[maybe_unused]] ipa::RPi::ConfigParams ¶ms) override + { + return 0; + } + + int platformInitIpa(ipa::RPi::InitParams ¶ms) override; + + int configureEntities(V4L2SubdeviceFormat sensorFormat, + V4L2SubdeviceFormat &embeddedFormat); + int configureCfe(); + bool calculateCscConfiguration(const V4L2DeviceFormat &v4l2Format, pisp_be_ccm_config &csc); + int configureBe(const std::optional &yuvColorSpace); + + void platformSetIspCrop(unsigned int index, const Rectangle &ispCrop) override; + + void prepareCfe(); + void prepareBe(uint32_t bufferId, bool stitchSwapBuffers); + + void tryRunPipeline() override; + + struct CfeJob { + ControlList sensorControls; + unsigned int delayContext; + std::unordered_map buffers; + }; + + std::queue cfeJobQueue_; + + bool cfeJobComplete() const + { + if (cfeJobQueue_.empty()) + return false; + + const CfeJob &job = cfeJobQueue_.back(); + return job.buffers.count(&cfe_[Cfe::Output0]) && + job.buffers.count(&cfe_[Cfe::Stats]) && + (!sensorMetadata_ || + job.buffers.count(&cfe_[Cfe::Embedded])); + } + + std::string last_dump_file_; +}; + +class PipelineHandlerPiSP : public RPi::PipelineHandlerBase +{ +public: + PipelineHandlerPiSP(CameraManager *manager) + : RPi::PipelineHandlerBase(manager) + { + } + + ~PipelineHandlerPiSP() + { + } + + bool match(DeviceEnumerator *enumerator) override; + +private: + PiSPCameraData *cameraData(Camera *camera) + { + return static_cast(camera->_d()); + } + + int prepareBuffers(Camera *camera) override; + int platformRegister(std::unique_ptr &cameraData, + MediaDevice *cfe, MediaDevice *isp) override; +}; + +bool PipelineHandlerPiSP::match(DeviceEnumerator *enumerator) +{ + constexpr unsigned int numCfeDevices = 2; + + /* + * Loop over all CFE instances, but return out once a match is found. + * This is to ensure we correctly enumerate the camera when an instance + * of the CFE has registered with media controller, but has not registered + * device nodes due to a sensor subdevice failure. + */ + for (unsigned int i = 0; i < numCfeDevices; i++) { + DeviceMatch cfe("rp1-cfe"); + cfe.add("rp1-cfe-fe_image0"); + cfe.add("rp1-cfe-fe_stats"); + cfe.add("rp1-cfe-fe_config"); + MediaDevice *cfeDevice = acquireMediaDevice(enumerator, cfe); + + if (!cfeDevice) { + LOG(RPI, Debug) << "Unable to acquire a CFE instance"; + break; + } + + DeviceMatch isp("pispbe"); + isp.add("pispbe-input"); + isp.add("pispbe-config"); + isp.add("pispbe-output0"); + isp.add("pispbe-output1"); + isp.add("pispbe-tdn_output"); + isp.add("pispbe-tdn_input"); + isp.add("pispbe-stitch_output"); + isp.add("pispbe-stitch_input"); + MediaDevice *ispDevice = acquireMediaDevice(enumerator, isp); + + if (!ispDevice) { + LOG(RPI, Debug) << "Unable to acquire ISP instance"; + break; + } + + /* + * The loop below is used to register multiple cameras behind + * one or more video mux devices that are attached to a + * particular CFE instance. Obviously these cameras cannot be + * used simultaneously. + */ + unsigned int numCameras = 0; + for (MediaEntity *entity : cfeDevice->entities()) { + if (entity->function() != MEDIA_ENT_F_CAM_SENSOR) + continue; + + const libpisp::PiSPVariant &variant = + libpisp::get_variant(cfeDevice->hwRevision(), + ispDevice->hwRevision()); + if (!variant.NumFrontEnds() || !variant.NumBackEnds()) { + LOG(RPI, Error) << "Unsupported PiSP variant"; + break; + } + + std::unique_ptr cameraData = + std::make_unique(this, variant); + PiSPCameraData *pisp = + static_cast(cameraData.get()); + + pisp->fe_ = SharedMemObject + ("pisp_frontend", true, pisp->pispVariant_); + pisp->be_ = SharedMemObject + ("pisp_backend", BackEnd::Config({}), pisp->pispVariant_); + + if (!pisp->fe_.fd().isValid() || !pisp->be_.fd().isValid()) { + LOG(RPI, Error) << "Failed to create ISP shared objects"; + break; + } + + int ret = registerCamera(cameraData, cfeDevice, "csi2", + ispDevice, entity); + if (ret) + LOG(RPI, Error) << "Failed to register camera " + << entity->name() << ": " << ret; + else + numCameras++; + } + + if (numCameras) + return true; + } + + return false; +} + +int PipelineHandlerPiSP::prepareBuffers(Camera *camera) +{ + PiSPCameraData *data = cameraData(camera); + unsigned int numRawBuffers = 0; + int ret; + + for (Stream *s : camera->streams()) { + if (PipelineHandlerBase::isRaw(s->configuration().pixelFormat)) { + numRawBuffers = s->configuration().bufferCount; + break; + } + } + + /* Decide how many internal buffers to allocate. */ + for (auto const stream : data->streams_) { + unsigned int numBuffers; + /* + * For CFE, allocate a minimum of 4 buffers as we want + * to avoid any frame drops. + */ + constexpr unsigned int minBuffers = 4; + if (stream == &data->cfe_[Cfe::Output0]) { + /* + * If an application has configured a RAW stream, allocate + * additional buffers to make up the minimum, but ensure + * we have at least 2 sets of internal buffers to use to + * minimise frame drops. + */ + numBuffers = std::max(2, minBuffers - numRawBuffers); + } else if (stream == &data->isp_[Isp::Input]) { + /* + * ISP input buffers are imported from the CFE, so follow + * similar logic as above to count all the RAW buffers + * available. + */ + numBuffers = numRawBuffers + + std::max(2, minBuffers - numRawBuffers); + } else if (stream == &data->cfe_[Cfe::Embedded]) { + /* + * Embedded data buffers are (currently) for internal use, + * so allocate a reasonably large amount. + */ + numBuffers = 12; + } else if (stream == &data->cfe_[Cfe::Stats] || + stream == &data->cfe_[Cfe::Config]) { + numBuffers = data->config_.numCfeConfigStatsBuffers; + } else if (!data->beEnabled_) { + /* Backend not enabled, we don't need to allocate buffers. */ + numBuffers = 0; + } else if (stream == &data->isp_[Isp::TdnOutput] && data->config_.disableTdn) { + /* TDN is explicitly disabled. */ + continue; + } else if (stream == &data->isp_[Isp::StitchOutput] && data->config_.disableHdr) { + /* Stitch/HDR is explicitly disabled. */ + continue; + } else { + /* Allocate 2 sets of all other Backend buffers */ + numBuffers = 2; + } + + LOG(RPI, Debug) << "Preparing " << numBuffers + << " buffers for stream " << stream->name(); + + ret = stream->prepareBuffers(numBuffers); + if (ret < 0) + return ret; + } + + /* + * Store the Framebuffer pointers for convenience as we will ping-pong + * these buffers between the input and output nodes for TDN and Stitch. + * + * The buffer size needs to be setup here as well. Conveniently this is + * the same for both TDN and stitch. + */ + pisp_image_format_config tdn; + data->be_->GetTdnOutputFormat(tdn); + unsigned int size = tdn.stride * tdn.height; + for (auto const &buffer : data->isp_[Isp::TdnOutput].getBuffers()) { + FrameBuffer *b = buffer.second.buffer; + b->_d()->metadata().planes()[0].bytesused = size; + data->tdnBuffers_.push_back(b); + } + for (auto const &buffer : data->isp_[Isp::StitchOutput].getBuffers()) { + FrameBuffer *b = buffer.second.buffer; + b->_d()->metadata().planes()[0].bytesused = size; + data->stitchBuffers_.push_back(b); + } + + /* Size up the config buffers as well. */ + for (auto &b : data->isp_[Isp::Config].getBuffers()) { + FrameMetadata::Plane &plane = b.second.buffer->_d()->metadata().planes()[0]; + plane.bytesused = sizeof(pisp_be_tiles_config); + } + + /* + * Pass the stats and embedded data buffers to the IPA. No other + * buffers need to be passed. + */ + mapBuffers(camera, data->cfe_[Cfe::Stats].getBuffers(), RPi::MaskStats); + if (data->sensorMetadata_) + mapBuffers(camera, data->cfe_[Cfe::Embedded].getBuffers(), + RPi::MaskEmbeddedData); + + return 0; +} + +int PipelineHandlerPiSP::platformRegister(std::unique_ptr &cameraData, + MediaDevice *cfe, MediaDevice *isp) +{ + PiSPCameraData *data = static_cast(cameraData.get()); + int ret; + + MediaEntity *cfeImage = cfe->getEntityByName("rp1-cfe-fe_image0"); + MediaEntity *cfeEmbedded = cfe->getEntityByName("rp1-cfe-embedded"); + MediaEntity *cfeStats = cfe->getEntityByName("rp1-cfe-fe_stats"); + MediaEntity *cfeConfig = cfe->getEntityByName("rp1-cfe-fe_config"); + MediaEntity *ispInput = isp->getEntityByName("pispbe-input"); + MediaEntity *IpaPrepare = isp->getEntityByName("pispbe-config"); + MediaEntity *ispOutput0 = isp->getEntityByName("pispbe-output0"); + MediaEntity *ispOutput1 = isp->getEntityByName("pispbe-output1"); + MediaEntity *ispTdnOutput = isp->getEntityByName("pispbe-tdn_output"); + MediaEntity *ispTdnInput = isp->getEntityByName("pispbe-tdn_input"); + MediaEntity *ispStitchOutput = isp->getEntityByName("pispbe-stitch_output"); + MediaEntity *ispStitchInput = isp->getEntityByName("pispbe-stitch_input"); + + /* Locate and open the cfe video streams. */ + data->cfe_[Cfe::Output0] = RPi::Stream("CFE Image", cfeImage, StreamFlag::RequiresMmap); + data->cfe_[Cfe::Embedded] = RPi::Stream("CFE Embedded", cfeEmbedded); + data->cfe_[Cfe::Stats] = RPi::Stream("CFE Stats", cfeStats); + data->cfe_[Cfe::Config] = RPi::Stream("CFE Config", cfeConfig, + StreamFlag::Recurrent | StreamFlag::RequiresMmap); + + /* Tag the ISP input stream as an import stream. */ + data->isp_[Isp::Input] = + RPi::Stream("ISP Input", ispInput, StreamFlag::ImportOnly); + data->isp_[Isp::Config] = + RPi::Stream("ISP Config", IpaPrepare, StreamFlag::Recurrent | + StreamFlag::RequiresMmap); + data->isp_[Isp::Output0] = + RPi::Stream("ISP Output0", ispOutput0, StreamFlag::RequiresMmap); + data->isp_[Isp::Output1] = + RPi::Stream("ISP Output1", ispOutput1, StreamFlag::RequiresMmap); + data->isp_[Isp::TdnOutput] = + RPi::Stream("ISP TDN Output", ispTdnOutput, StreamFlag::Recurrent); + data->isp_[Isp::TdnInput] = + RPi::Stream("ISP TDN Input", ispTdnInput, StreamFlag::ImportOnly | + StreamFlag::Recurrent); + data->isp_[Isp::StitchOutput] = + RPi::Stream("ISP Stitch Output", ispStitchOutput, StreamFlag::Recurrent); + data->isp_[Isp::StitchInput] = + RPi::Stream("ISP Stitch Input", ispStitchInput, StreamFlag::ImportOnly | + StreamFlag::Recurrent); + + /* Wire up all the buffer connections. */ + data->cfe_[Cfe::Output0].dev()->bufferReady.connect(data, &PiSPCameraData::cfeBufferDequeue); + data->cfe_[Cfe::Stats].dev()->bufferReady.connect(data, &PiSPCameraData::cfeBufferDequeue); + data->cfe_[Cfe::Config].dev()->bufferReady.connect(data, &PiSPCameraData::cfeBufferDequeue); + data->isp_[Isp::Input].dev()->bufferReady.connect(data, &PiSPCameraData::beInputDequeue); + data->isp_[Isp::Config].dev()->bufferReady.connect(data, &PiSPCameraData::beOutputDequeue); + data->isp_[Isp::Output0].dev()->bufferReady.connect(data, &PiSPCameraData::beOutputDequeue); + data->isp_[Isp::Output1].dev()->bufferReady.connect(data, &PiSPCameraData::beOutputDequeue); + data->cfe_[Cfe::Embedded].dev()->bufferReady.connect(data, &PiSPCameraData::cfeBufferDequeue); + + data->csi2Subdev_ = std::make_unique(cfe->getEntityByName("csi2")); + data->feSubdev_ = std::make_unique(cfe->getEntityByName("pisp-fe")); + data->csi2Subdev_->open(); + data->feSubdev_->open(); + + /* + * Open all CFE and ISP streams. The exception is the embedded data + * stream, which only gets opened below if the IPA reports that the sensor + * supports embedded data. + * + * The below grouping is just for convenience so that we can easily + * iterate over all streams in one go. + */ + data->streams_.push_back(&data->cfe_[Cfe::Output0]); + data->streams_.push_back(&data->cfe_[Cfe::Config]); + data->streams_.push_back(&data->cfe_[Cfe::Stats]); + if (data->sensorMetadata_) + data->streams_.push_back(&data->cfe_[Cfe::Embedded]); + + data->streams_.push_back(&data->isp_[Isp::Input]); + data->streams_.push_back(&data->isp_[Isp::Output0]); + data->streams_.push_back(&data->isp_[Isp::Output1]); + data->streams_.push_back(&data->isp_[Isp::Config]); + data->streams_.push_back(&data->isp_[Isp::TdnInput]); + data->streams_.push_back(&data->isp_[Isp::TdnOutput]); + data->streams_.push_back(&data->isp_[Isp::StitchInput]); + data->streams_.push_back(&data->isp_[Isp::StitchOutput]); + + for (auto stream : data->streams_) { + ret = stream->dev()->open(); + if (ret) + return ret; + } + + /* Write up all the IPA connections. */ + data->ipa_->prepareIspComplete.connect(data, &PiSPCameraData::prepareIspComplete); + data->ipa_->processStatsComplete.connect(data, &PiSPCameraData::processStatsComplete); + data->ipa_->setCameraTimeout.connect(data, &PiSPCameraData::setCameraTimeout); + + /* + * List the available streams an application may request. At present, we + * do not advertise CFE Embedded and ISP Statistics streams, as there + * is no mechanism for the application to request non-image buffer formats. + */ + std::set streams; + streams.insert(&data->cfe_[Cfe::Output0]); + streams.insert(&data->isp_[Isp::Output0]); + streams.insert(&data->isp_[Isp::Output1]); + + /* Create and register the camera. */ + const std::string &id = data->sensor_->id(); + std::shared_ptr camera = + Camera::create(std::move(cameraData), id, streams); + PipelineHandler::registerCamera(std::move(camera)); + + LOG(RPI, Info) << "Registered camera " << id + << " to CFE device " << cfe->deviceNode() + << " and ISP device " << isp->deviceNode() + << " using PiSP variant " << data->pispVariant_.Name(); + + return 0; +} + +CameraConfiguration::Status +PiSPCameraData::platformValidate(RPi::RPiCameraConfiguration *rpiConfig) const +{ + std::vector &rawStreams = rpiConfig->rawStreams_; + std::vector &outStreams = rpiConfig->outStreams_; + + CameraConfiguration::Status status = CameraConfiguration::Status::Valid; + + /* Can only output 1 RAW stream and/or 2 YUV/RGB streams for now. */ + if (rawStreams.size() > 1 || outStreams.size() > 2) { + LOG(RPI, Error) << "Invalid number of streams requested"; + return CameraConfiguration::Status::Invalid; + } + + if (!rawStreams.empty()) { + rawStreams[0].dev = cfe_[Cfe::Output0].dev(); + + StreamConfiguration *rawStream = rawStreams[0].cfg; + BayerFormat bayer = BayerFormat::fromPixelFormat(rawStream->pixelFormat); + /* + * We cannot output CSI2 packed or non 16-bit output from the frontend, + * so signal the output as unpacked 16-bits in these cases. + */ + if (bayer.packing == BayerFormat::Packing::CSI2 || bayer.bitDepth != 16) { + bayer.packing = (bayer.packing == BayerFormat::Packing::CSI2) ? + BayerFormat::Packing::PISP1 : BayerFormat::Packing::None; + bayer.bitDepth = 16; + } + + /* The RAW stream size cannot exceed the sensor frame output - for now. */ + if (rawStream->size != rpiConfig->sensorFormat_.size || + rawStream->pixelFormat != bayer.toPixelFormat()) { + rawStream->size = rpiConfig->sensorFormat_.size; + rawStream->pixelFormat = bayer.toPixelFormat(); + status = CameraConfiguration::Adjusted; + } + + rawStreams[0].format = + RPi::PipelineHandlerBase::toV4L2DeviceFormat(cfe_[Cfe::Output0].dev(), rawStream); + + computeOptimalStride(rawStreams[0].format); + } + + /* + * For the two ISP outputs, the lower resolution must be routed from + * Output 1 + * + * Index 0 contains the largest requested resolution. + */ + unsigned int largestWidth = getLargestWidth(rpiConfig->sensorFormat_, + rpiConfig->outStreams_); + + for (unsigned int i = 0; i < outStreams.size(); i++) { + StreamConfiguration *cfg = outStreams[i].cfg; + + /* + * Output 1 must be for the smallest resolution. We will + * have that fixed up in the code above. + */ + auto ispOutput = i == 1 || outStreams.size() == 1 ? Isp::Output1 + : Isp::Output0; + outStreams[i].dev = isp_[ispOutput].dev(); + + /* + * Don't let The output streams downscale by more than 64x when + * a downscaler block is available, or 16x when there's only the + * resampler. + */ + Size rawSize = rpiConfig->sensorFormat_.size.boundedToAspectRatio(cfg->size); + unsigned int outputIndex = ispOutput == Isp::Output0 ? 0 : 1; + Size minSize; + if (pispVariant_.BackEndDownscalerAvailable(0, outputIndex)) { + /* + * Downscaler available. Allow up to 64x downscale. If not a multiple of + * 64, round up to the next integer, but also ensure the result is even. + */ + const unsigned int downscale = 64; + minSize.width = (rawSize.width + downscale - 1) / downscale; + minSize.width = (minSize.width + 1) & ~1; /* ensure even */ + minSize.height = (rawSize.height + downscale - 1) / downscale; + minSize.height = (minSize.height + 1) & ~1; /* ensure even */ + } else { + /* No downscale. Resampler requires: (output_dim - 1) * 16 <= input_dim - 1 */ + const unsigned int downscale = 16; + minSize.width = (rawSize.width - 1 + downscale - 1) / downscale + 1; + minSize.width = (minSize.width + 1) & ~1; /* ensure even */ + minSize.height = (rawSize.height - 1 + downscale - 1) / downscale + 1; + minSize.height = (minSize.height + 1) & ~1; /* ensure even */ + } + LOG(RPI, Debug) << "minSize: width " << minSize.width << " height " << minSize.height; + + /* Bound the output size to minSize, preserve aspect ratio, and ensure even numbers. */ + if (cfg->size.width < minSize.width) { + cfg->size.height = (cfg->size.height * minSize.width / cfg->size.width + 1) & ~1; + cfg->size.width = minSize.width; + status = CameraConfiguration::Status::Adjusted; + } + + if (cfg->size.height < minSize.height) { + cfg->size.width = (cfg->size.width * minSize.height / cfg->size.height + 1) & ~1; + cfg->size.height = minSize.height; + status = CameraConfiguration::Status::Adjusted; + } + + /* Make sure output1 is no larger than output 0. */ + Size size = cfg->size.boundedTo(outStreams[0].cfg->size); + + /* \todo Warn if upscaling: reduces image quality. */ + + if (cfg->size != size) { + cfg->size = size; + status = CameraConfiguration::Status::Adjusted; + } + + outStreams[i].format = + RPi::PipelineHandlerBase::toV4L2DeviceFormat(outStreams[i].dev, outStreams[i].cfg); + + /* Compute the optimal stride for the BE output buffers. */ + computeOptimalStride(outStreams[i].format); + + /* + * We need to check for software downscaling. This must happen + * after adjusting the device format so that we can choose the + * largest stride - which might have been the original + * unadjusted format, or the adjusted one (if software + * downscaling means it's larger). + */ + V4L2DeviceFormat adjustedFormat = outStreams[i].format; + adjustDeviceFormat(adjustedFormat); + + unsigned int swDownscale = + calculateSwDownscale(adjustedFormat, largestWidth, + be_->GetMaxDownscale()); + LOG(RPI, Debug) << "For stream " << adjustedFormat + << " swDownscale is " << swDownscale; + if (swDownscale > 1) { + adjustedFormat.size.width *= swDownscale; + computeOptimalStride(adjustedFormat); + for (unsigned int p = 0; p < outStreams[i].format.planesCount; p++) + outStreams[i].format.planes[p].bpl = + std::max(outStreams[i].format.planes[p].bpl, adjustedFormat.planes[p].bpl); + } + } + + return status; +} + +int PiSPCameraData::platformPipelineConfigure(const std::unique_ptr &root) +{ + config_ = { + .numCfeConfigStatsBuffers = 12, + .numCfeConfigQueue = 2, + .disableTdn = false, + .disableHdr = false, + }; + + if (!root) + return 0; + + std::optional ver = (*root)["version"].get(); + if (!ver || *ver != 1.0) { + LOG(RPI, Error) << "Unexpected configuration file version reported"; + return -EINVAL; + } + + std::optional target = (*root)["target"].get(); + if (!target || *target != "pisp") { + LOG(RPI, Error) << "Unexpected target reported: expected \"pisp\", got " + << *target; + return -EINVAL; + } + + const YamlObject &phConfig = (*root)["pipeline_handler"]; + config_.numCfeConfigStatsBuffers = + phConfig["num_cfe_config_stats_buffers"].get(config_.numCfeConfigStatsBuffers); + config_.numCfeConfigQueue = + phConfig["num_cfe_config_queue"].get(config_.numCfeConfigQueue); + config_.disableTdn = phConfig["disable_tdn"].get(config_.disableTdn); + config_.disableHdr = phConfig["disable_hdr"].get(config_.disableHdr); + + if (config_.disableTdn) { + LOG(RPI, Info) << "TDN disabled by user config"; + streams_.erase(std::remove_if(streams_.begin(), streams_.end(), + [this] (const RPi::Stream *s) { return s == &isp_[Isp::TdnInput] || + s == &isp_[Isp::TdnInput]; }), + streams_.end()); + } + + if (config_.disableHdr) { + LOG(RPI, Info) << "HDR disabled by user config"; + streams_.erase(std::remove_if(streams_.begin(), streams_.end(), + [this] (const RPi::Stream *s) { return s == &isp_[Isp::StitchInput] || + s == &isp_[Isp::StitchOutput]; }), + streams_.end()); + } + + if (config_.numCfeConfigStatsBuffers < 1) { + LOG(RPI, Error) + << "Invalid configuration: num_cfe_config_stats_buffers must be >= 1"; + return -EINVAL; + } + + if (config_.numCfeConfigQueue < 1) { + LOG(RPI, Error) + << "Invalid configuration: numCfeConfigQueue must be >= 1"; + return -EINVAL; + } + + return 0; +} + +std::unordered_map deviceAdjustTable = { + { V4L2_PIX_FMT_RGBX32, V4L2_PIX_FMT_RGB24 }, + { V4L2_PIX_FMT_XBGR32, V4L2_PIX_FMT_BGR24 } +}; + +bool PiSPCameraData::adjustDeviceFormat(V4L2DeviceFormat &format) const +{ + auto it = deviceAdjustTable.find(format.fourcc.fourcc()); + + if (pispVariant_.BackendRGB32Supported(0)) + return false; + + if (it != deviceAdjustTable.end()) { + LOG(RPI, Debug) << "Swapping 32-bit for 24-bit format"; + format.fourcc = V4L2PixelFormat(it->second); + return true; + } + + return false; +} + +int PiSPCameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfig) +{ + const std::vector &rawStreams = rpiConfig->rawStreams_; + const std::vector &outStreams = rpiConfig->outStreams_; + int ret; + + V4L2VideoDevice *cfe = cfe_[Cfe::Output0].dev(); + V4L2DeviceFormat cfeFormat; + + /* + * See which streams are requested, and route the user + * StreamConfiguration appropriately. + */ + if (rawStreams.empty()) { + /* + * The CFE Frontend output will always be 16-bits unpacked, so adjust the + * mbus code right at the start. + */ + V4L2SubdeviceFormat sensorFormatMod = rpiConfig->sensorFormat_; + sensorFormatMod.code = mbusCodeUnpacked16(sensorFormatMod.code); + cfeFormat = RPi::PipelineHandlerBase::toV4L2DeviceFormat(cfe, + sensorFormatMod, + BayerFormat::Packing::PISP1); + computeOptimalStride(cfeFormat); + } else { + rawStreams[0].cfg->setStream(&cfe_[Cfe::Output0]); + cfe_[Cfe::Output0].setFlags(StreamFlag::External); + cfeFormat = rawStreams[0].format; + } + + /* + * If the sensor output is 16-bits, we must endian swap the buffer + * contents to account for the HW missing this feature. + */ + cfe_[Cfe::Output0].clearFlags(StreamFlag::Needs16bitEndianSwap); + if (MediaBusFormatInfo::info(rpiConfig->sensorFormat_.code).bitsPerPixel == 16) { + cfe_[Cfe::Output0].setFlags(StreamFlag::Needs16bitEndianSwap); + LOG(RPI, Warning) + << "The sensor is configured for a 16-bit output, statistics" + << " will not be correct. You must use manual camera settings."; + } + + ret = cfe->setFormat(&cfeFormat); + if (ret) + return ret; + + /* Set the TDN and Stitch node formats in case they are turned on. */ + isp_[Isp::TdnOutput].dev()->setFormat(&cfeFormat); + isp_[Isp::TdnInput].dev()->setFormat(&cfeFormat); + isp_[Isp::StitchOutput].dev()->setFormat(&cfeFormat); + isp_[Isp::StitchInput].dev()->setFormat(&cfeFormat); + + ret = isp_[Isp::Input].dev()->setFormat(&cfeFormat); + if (ret) + return ret; + + LOG(RPI, Info) << "Sensor: " << sensor_->id() + << " - Selected sensor format: " << rpiConfig->sensorFormat_ + << " - Selected CFE format: " << cfeFormat; + + /* + * Find the largest width of any stream; we'll use it later to check for + * excessive downscaling. + */ + unsigned int largestWidth = getLargestWidth(rpiConfig->sensorFormat_, outStreams); + + unsigned int beEnables = 0; + V4L2DeviceFormat format; + + /* + * First thing is to remove Isp::Output0 and Isp::Output1 from streams_ + * as they may be unused depending on the configuration. Add them back + * only if needed. + */ + streams_.erase(std::remove_if(streams_.begin(), streams_.end(), + [this] (const RPi::Stream *s) { return s == &isp_[Isp::Output0] || + s == &isp_[Isp::Output1]; }), + streams_.end()); + + cropParams_.clear(); + for (unsigned int i = 0; i < outStreams.size(); i++) { + StreamConfiguration *cfg = outStreams[i].cfg; + unsigned int ispIndex; + + /* + * Output 1 must be for the smallest resolution. We will + * have that fixed up in the code above. + */ + RPi::Stream *stream; + if (i == 1 || outStreams.size() == 1) { + stream = &isp_[Isp::Output1]; + beEnables |= PISP_BE_RGB_ENABLE_OUTPUT1; + ispIndex = 1; + } else { + stream = &isp_[Isp::Output0]; + beEnables |= PISP_BE_RGB_ENABLE_OUTPUT0; + ispIndex = 0; + } + + format = outStreams[i].format; + bool needs32BitConversion = adjustDeviceFormat(format); + + /* + * This pixel format may not be the same as the configured + * pixel format if adjustDeviceFormat() above has reqused a change. + */ + PixelFormat pixFmt = format.fourcc.toPixelFormat(); + + /* If there's excessive downscaling we'll do some of it in software. */ + unsigned int swDownscale = calculateSwDownscale(format, largestWidth, + be_->GetMaxDownscale()); + unsigned int hwWidth = format.size.width * swDownscale; + format.size.width = hwWidth; + + LOG(RPI, Debug) << "Setting " << stream->name() << " to " + << format << " (sw downscale " << swDownscale << ")"; + + ret = stream->dev()->setFormat(&format); + if (ret) + return -EINVAL; + LOG(RPI, Debug) << "After setFormat, stride " << format.planes[0].bpl; + + if (format.size.height != cfg->size.height || + format.size.width != hwWidth || format.fourcc.toPixelFormat() != pixFmt) { + LOG(RPI, Error) + << "Failed to set requested format on " << stream->name() + << ", returned " << format; + return -EINVAL; + } + + LOG(RPI, Debug) + << "Stream " << stream->name() << " has color space " + << ColorSpace::toString(cfg->colorSpace); + + libcamera::RPi::Stream::StreamFlags flags = StreamFlag::External; + + stream->clearFlags(StreamFlag::Needs32bitConv); + if (needs32BitConversion) + flags |= StreamFlag::Needs32bitConv; + + /* Set smallest selection the ISP will allow. */ + Size minCrop{ 32, 32 }; + + /* Adjust aspect ratio by providing crops on the input image. */ + Size size = cfeFormat.size.boundedToAspectRatio(outStreams[i].cfg->size); + Rectangle ispCrop = size.centeredTo(Rectangle(cfeFormat.size).center()); + + /* + * Calculate the minimum crop. The rule is that (output_dim - 1) / (input_dim - 1) + * must be strictly < 16. We add 2 after dividing because +1 + * comes from the division that rounds down, and +1 because we + * had (input_dim - 1). + */ + Size scalingMinSize = outStreams[i].cfg->size.shrunkBy({ 1, 1 }) / 16; + scalingMinSize.growBy({ 2, 2 }); + minCrop.expandTo(scalingMinSize); + + platformSetIspCrop(ispIndex, ispCrop); + /* + * Set the scaler crop to the value we are using (scaled to native sensor + * coordinates). + */ + cropParams_.emplace(std::piecewise_construct, + std::forward_as_tuple(outStreams[i].index), + std::forward_as_tuple(ispCrop, minCrop, ispIndex)); + + cfg->setStream(stream); + stream->setFlags(flags); + stream->setSwDownscale(swDownscale); + streams_.push_back(stream); + } + + pisp_be_global_config global; + be_->GetGlobal(global); + global.rgb_enables &= ~(PISP_BE_RGB_ENABLE_OUTPUT0 + PISP_BE_RGB_ENABLE_OUTPUT1); + global.rgb_enables |= beEnables; + be_->SetGlobal(global); + + beEnabled_ = beEnables & (PISP_BE_RGB_ENABLE_OUTPUT0 | PISP_BE_RGB_ENABLE_OUTPUT1); + + /* CFE statistics output format. */ + format = {}; + format.fourcc = V4L2PixelFormat(V4L2_META_FMT_RPI_FE_STATS); + ret = cfe_[Cfe::Stats].dev()->setFormat(&format); + if (ret) { + LOG(RPI, Error) << "Failed to set format on CFE stats stream: " + << format.toString(); + return ret; + } + + /* CFE config format. */ + format = {}; + format.fourcc = V4L2PixelFormat(V4L2_META_FMT_RPI_FE_CFG); + ret = cfe_[Cfe::Config].dev()->setFormat(&format); + if (ret) { + LOG(RPI, Error) << "Failed to set format on CFE config stream: " + << format.toString(); + return ret; + } + + /* + * Configure the CFE embedded data output format only if the sensor + * supports it. + */ + V4L2SubdeviceFormat embeddedFormat; + if (sensorMetadata_) { + sensor_->device()->getFormat(1, &embeddedFormat); + format = {}; + format.fourcc = V4L2PixelFormat(V4L2_META_FMT_SENSOR_DATA); + format.planes[0].size = embeddedFormat.size.width * embeddedFormat.size.height; + + LOG(RPI, Debug) << "Setting embedded data format " << format.toString(); + ret = cfe_[Cfe::Embedded].dev()->setFormat(&format); + if (ret) { + LOG(RPI, Error) << "Failed to set format on CFE embedded: " + << format; + return ret; + } + } + + configureEntities(rpiConfig->sensorFormat_, embeddedFormat); + configureCfe(); + + if (beEnabled_) + configureBe(rpiConfig->yuvColorSpace_); + + return 0; +} + +void PiSPCameraData::platformStart() +{ + /* + * We don't need to worry about dequeue events for the TDN and Stitch + * nodes as the buffers are simply ping-ponged every frame. But we do + * want to track the currently used input index. + */ + tdnInputIndex_ = 0; + stitchInputIndex_ = 0; + + cfeJobQueue_ = {}; + + for (unsigned int i = 0; i < config_.numCfeConfigQueue; i++) + prepareCfe(); + + /* Clear the debug dump file history. */ + last_dump_file_.clear(); +} + +void PiSPCameraData::platformStop() +{ + cfeJobQueue_ = {}; +} + +void PiSPCameraData::platformFreeBuffers() +{ + tdnBuffers_.clear(); + stitchBuffers_.clear(); +} + +void PiSPCameraData::cfeBufferDequeue(FrameBuffer *buffer) +{ + RPi::Stream *stream = nullptr; + int index; + + if (!isRunning()) + return; + + for (RPi::Stream &s : cfe_) { + index = s.getBufferId(buffer); + if (index) { + stream = &s; + break; + } + } + + /* If the last CFE job has completed, we need a new job entry in the queue. */ + if (cfeJobQueue_.empty() || cfeJobComplete()) + cfeJobQueue_.push({}); + + CfeJob &job = cfeJobQueue_.back(); + + /* The buffer must belong to one of our streams. */ + ASSERT(stream); + + LOG(RPI, Debug) << "Stream " << stream->name() << " buffer dequeue" + << ", buffer id " << index + << ", timestamp: " << buffer->metadata().timestamp; + + job.buffers[stream] = buffer; + + if (stream == &cfe_[Cfe::Output0]) { + /* Do an endian swap if needed. */ + if (stream->getFlags() & StreamFlag::Needs16bitEndianSwap) { + const unsigned int stride = stream->configuration().stride; + const unsigned int width = stream->configuration().size.width; + const unsigned int height = stream->configuration().size.height; + const RPi::BufferObject &b = stream->getBuffer(index); + + ASSERT(b.mapped); + void *mem = b.mapped->planes()[0].data(); + + dmabufSyncStart(buffer->planes()[0].fd); + do16BitEndianSwap(mem, width, height, stride); + dmabufSyncEnd(buffer->planes()[0].fd); + } + + /* + * Lookup the sensor controls used for this frame sequence from + * DelayedControl and queue them along with the frame buffer. + */ + auto [ctrl, delayContext] = delayedCtrls_->get(buffer->metadata().sequence); + /* + * Add the frame timestamp to the ControlList for the IPA to use + * as it does not receive the FrameBuffer object. + */ + ctrl.set(controls::SensorTimestamp, buffer->metadata().timestamp); + job.sensorControls = std::move(ctrl); + job.delayContext = delayContext; + } else if (stream == &cfe_[Cfe::Config]) { + /* The config buffer can be re-queued back straight away. */ + handleStreamBuffer(buffer, &cfe_[Cfe::Config]); + prepareCfe(); + } + + handleState(); +} + +void PiSPCameraData::beInputDequeue(FrameBuffer *buffer) +{ + if (!isRunning()) + return; + + LOG(RPI, Debug) << "Stream ISP Input buffer complete" + << ", buffer id " << cfe_[Cfe::Output0].getBufferId(buffer) + << ", timestamp: " << buffer->metadata().timestamp; + + /* The ISP input buffer gets re-queued into CFE. */ + handleStreamBuffer(buffer, &cfe_[Cfe::Output0]); + handleState(); +} + +void PiSPCameraData::beOutputDequeue(FrameBuffer *buffer) +{ + RPi::Stream *stream = nullptr; + int index; + + if (!isRunning()) + return; + + for (RPi::Stream &s : isp_) { + index = s.getBufferId(buffer); + if (index) { + stream = &s; + break; + } + } + + /* The buffer must belong to one of our ISP output streams. */ + ASSERT(stream); + + LOG(RPI, Debug) << "Stream " << stream->name() << " buffer complete" + << ", buffer id " << index + << ", timestamp: " << buffer->metadata().timestamp; + + bool downscale = stream->swDownscale() > 1; + bool needs32bitConv = !!(stream->getFlags() & StreamFlag::Needs32bitConv); + + if (downscale || needs32bitConv) + dmabufSyncStart(buffer->planes()[0].fd); + + if (downscale) { + /* Further software downscaling must be applied. */ + downscaleStreamBuffer(stream, index); + } + + /* Convert 24bpp outputs to 32bpp outputs where necessary. */ + if (needs32bitConv) { + unsigned int stride = stream->configuration().stride; + unsigned int width = stream->configuration().size.width; + unsigned int height = stream->configuration().size.height; + + const RPi::BufferObject &b = stream->getBuffer(index); + + ASSERT(b.mapped); + void *mem = b.mapped->planes()[0].data(); + do32BitConversion(mem, width, height, stride); + } + + if (downscale || needs32bitConv) + dmabufSyncEnd(buffer->planes()[0].fd); + + handleStreamBuffer(buffer, stream); + + /* + * Increment the number of ISP outputs generated. + * This is needed to track dropped frames. + */ + ispOutputCount_++; + handleState(); +} + +void PiSPCameraData::processStatsComplete(const ipa::RPi::BufferIds &buffers) +{ + if (!isRunning()) + return; + + handleStreamBuffer(cfe_[Cfe::Stats].getBuffers().at(buffers.stats & RPi::MaskID).buffer, + &cfe_[Cfe::Stats]); +} + +void PiSPCameraData::setCameraTimeout(uint32_t maxFrameLengthMs) +{ + /* + * Set the dequeue timeout to the larger of 5x the maximum reported + * frame length advertised by the IPA over a number of frames. Allow + * a minimum timeout value of 1s. + */ + utils::Duration timeout = + std::max(1s, 5 * maxFrameLengthMs * 1ms); + + LOG(RPI, Debug) << "Setting CFE timeout to " << timeout; + cfe_[Cfe::Output0].dev()->setDequeueTimeout(timeout); +} + +void PiSPCameraData::prepareIspComplete(const ipa::RPi::BufferIds &buffers, bool stitchSwapBuffers) +{ + unsigned int embeddedId = buffers.embedded & RPi::MaskID; + unsigned int bayerId = buffers.bayer & RPi::MaskID; + FrameBuffer *buffer; + + if (!isRunning()) + return; + + if (sensorMetadata_ && embeddedId) { + buffer = cfe_[Cfe::Embedded].getBuffers().at(embeddedId).buffer; + handleStreamBuffer(buffer, &cfe_[Cfe::Embedded]); + } + + if (!beEnabled_) { + /* + * If there is no need to run the Backend, just signal that the + * input buffer is completed and all Backend outputs are ready. + */ + ispOutputCount_ = ispOutputTotal_; + buffer = cfe_[Cfe::Output0].getBuffers().at(bayerId).buffer; + handleStreamBuffer(buffer, &cfe_[Cfe::Output0]); + } else + prepareBe(bayerId, stitchSwapBuffers); + + state_ = State::IpaComplete; + handleState(); +} + +int PiSPCameraData::configureCfe() +{ + V4L2DeviceFormat cfeFormat; + cfe_[Cfe::Output0].dev()->getFormat(&cfeFormat); + + std::scoped_lock l(*fe_); + + pisp_fe_global_config global; + fe_->GetGlobal(global); + global.enables &= ~PISP_FE_ENABLE_COMPRESS0; + + global.enables |= PISP_FE_ENABLE_OUTPUT0; + global.bayer_order = toPiSPBayerOrder(cfeFormat.fourcc); + + pisp_image_format_config image = toPiSPImageFormat(cfeFormat); + pisp_fe_input_config input = {}; + + input.streaming = 1; + input.format = image; + input.format.format = PISP_IMAGE_FORMAT_BPS_16; + + if (PISP_IMAGE_FORMAT_COMPRESSED(image.format)) { + pisp_compress_config compress; + compress.offset = DefaultCompressionOffset; + compress.mode = (image.format & PISP_IMAGE_FORMAT_COMPRESSION_MASK) / + PISP_IMAGE_FORMAT_COMPRESSION_MODE_1; + global.enables |= PISP_FE_ENABLE_COMPRESS0; + fe_->SetCompress(0, compress); + } + + if (input.format.width > pispVariant_.FrontEndDownscalerMaxWidth(0, 0)) + global.enables |= PISP_FE_ENABLE_DECIMATE; + + fe_->SetGlobal(global); + fe_->SetInput(input); + fe_->SetOutputFormat(0, image); + + return 0; +} + +bool PiSPCameraData::calculateCscConfiguration(const V4L2DeviceFormat &v4l2Format, pisp_be_ccm_config &csc) +{ + const PixelFormat &pixFormat = v4l2Format.fourcc.toPixelFormat(); + const PixelFormatInfo &info = PixelFormatInfo::info(pixFormat); + memset(&csc, 0, sizeof(csc)); + + if (info.colourEncoding == PixelFormatInfo::ColourEncodingYUV) { + /* Look up the correct YCbCr conversion matrix for this colour space. */ + if (v4l2Format.colorSpace == ColorSpace::Sycc) + be_->InitialiseYcbcr(csc, "jpeg"); + else if (v4l2Format.colorSpace == ColorSpace::Smpte170m) + be_->InitialiseYcbcr(csc, "smpte170m"); + else if (v4l2Format.colorSpace == ColorSpace::Rec709) + be_->InitialiseYcbcr(csc, "rec709"); + else { + LOG(RPI, Warning) + << "Unrecognised colour space " + << ColorSpace::toString(v4l2Format.colorSpace) + << ", defaulting to sYCC"; + be_->InitialiseYcbcr(csc, "jpeg"); + } + return true; + } + /* There will be more formats to check for in due course. */ + else if (pixFormat == formats::RGB888 || pixFormat == formats::RGBX8888 || + pixFormat == formats::XRGB8888 || pixFormat == formats::RGB161616) { + /* Identity matrix but with RB colour swap. */ + csc.coeffs[2] = csc.coeffs[4] = csc.coeffs[6] = 1 << 10; + return true; + } + + return false; +} + +int PiSPCameraData::configureBe(const std::optional &yuvColorSpace) +{ + pisp_image_format_config inputFormat; + V4L2DeviceFormat cfeFormat; + + isp_[Isp::Input].dev()->getFormat(&cfeFormat); + inputFormat = toPiSPImageFormat(cfeFormat); + + pisp_be_global_config global; + be_->GetGlobal(global); + global.bayer_enables &= ~(PISP_BE_BAYER_ENABLE_DECOMPRESS + + PISP_BE_BAYER_ENABLE_TDN_DECOMPRESS + + PISP_BE_BAYER_ENABLE_TDN_COMPRESS + + PISP_BE_BAYER_ENABLE_STITCH_DECOMPRESS + + PISP_BE_BAYER_ENABLE_STITCH_COMPRESS); + global.rgb_enables &= ~(PISP_BE_RGB_ENABLE_RESAMPLE0 + + PISP_BE_RGB_ENABLE_RESAMPLE1 + + PISP_BE_RGB_ENABLE_DOWNSCALE0 + + PISP_BE_RGB_ENABLE_DOWNSCALE1 + + PISP_BE_RGB_ENABLE_CSC0 + + PISP_BE_RGB_ENABLE_CSC1); + + global.bayer_enables |= PISP_BE_BAYER_ENABLE_INPUT; + global.bayer_order = toPiSPBayerOrder(cfeFormat.fourcc); + + ispOutputTotal_ = 1; /* Config buffer */ + if (PISP_IMAGE_FORMAT_COMPRESSED(inputFormat.format)) { + pisp_decompress_config decompress; + decompress.offset = DefaultCompressionOffset; + decompress.mode = (inputFormat.format & PISP_IMAGE_FORMAT_COMPRESSION_MASK) + / PISP_IMAGE_FORMAT_COMPRESSION_MODE_1; + global.bayer_enables |= PISP_BE_BAYER_ENABLE_DECOMPRESS; + be_->SetDecompress(decompress); + } + + if (global.rgb_enables & PISP_BE_RGB_ENABLE_OUTPUT0) { + pisp_be_output_format_config outputFormat0 = {}; + V4L2DeviceFormat ispFormat0 = {}; + + isp_[Isp::Output0].dev()->getFormat(&ispFormat0); + outputFormat0.image = toPiSPImageFormat(ispFormat0); + + pisp_be_ccm_config csc; + if (calculateCscConfiguration(ispFormat0, csc)) { + global.rgb_enables |= PISP_BE_RGB_ENABLE_CSC0; + be_->SetCsc(0, csc); + } + + BackEnd::SmartResize resize = {}; + resize.width = ispFormat0.size.width; + resize.height = ispFormat0.size.height; + be_->SetSmartResize(0, resize); + + setupOutputClipping(ispFormat0, outputFormat0); + + be_->SetOutputFormat(0, outputFormat0); + ispOutputTotal_++; + } + + if (global.rgb_enables & PISP_BE_RGB_ENABLE_OUTPUT1) { + pisp_be_output_format_config outputFormat1 = {}; + V4L2DeviceFormat ispFormat1 = {}; + + isp_[Isp::Output1].dev()->getFormat(&ispFormat1); + outputFormat1.image = toPiSPImageFormat(ispFormat1); + + pisp_be_ccm_config csc; + if (calculateCscConfiguration(ispFormat1, csc)) { + global.rgb_enables |= PISP_BE_RGB_ENABLE_CSC1; + be_->SetCsc(1, csc); + } + + BackEnd::SmartResize resize = {}; + resize.width = ispFormat1.size.width; + resize.height = ispFormat1.size.height; + be_->SetSmartResize(1, resize); + + setupOutputClipping(ispFormat1, outputFormat1); + + be_->SetOutputFormat(1, outputFormat1); + ispOutputTotal_++; + } + + /* Setup the TDN I/O blocks in case TDN gets turned on later. */ + V4L2DeviceFormat tdnV4L2Format; + isp_[Isp::TdnOutput].dev()->getFormat(&tdnV4L2Format); + pisp_image_format_config tdnFormat = toPiSPImageFormat(tdnV4L2Format); + be_->SetTdnOutputFormat(tdnFormat); + be_->SetTdnInputFormat(tdnFormat); + + if (PISP_IMAGE_FORMAT_COMPRESSED(tdnFormat.format)) { + pisp_decompress_config tdnDecompress; + pisp_compress_config tdnCompress; + + tdnDecompress.offset = tdnCompress.offset = DefaultCompressionOffset; + tdnDecompress.mode = tdnCompress.mode = DefaultCompressionMode; + be_->SetTdnDecompress(tdnDecompress); + be_->SetTdnCompress(tdnCompress); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_TDN_DECOMPRESS + + PISP_BE_BAYER_ENABLE_TDN_COMPRESS; + } + + /* Likewise for the Stitch block. */ + V4L2DeviceFormat stitchV4L2Format; + isp_[Isp::StitchOutput].dev()->getFormat(&stitchV4L2Format); + pisp_image_format_config stitchFormat = toPiSPImageFormat(stitchV4L2Format); + be_->SetStitchOutputFormat(stitchFormat); + be_->SetStitchInputFormat(stitchFormat); + + if (PISP_IMAGE_FORMAT_COMPRESSED(stitchFormat.format)) { + pisp_decompress_config stitchDecompress; + pisp_compress_config stitchCompress; + + /* Stitch block is after BLC, so compression offset should be 0. */ + stitchDecompress.offset = stitchCompress.offset = 0; + stitchDecompress.mode = stitchCompress.mode = DefaultCompressionMode; + be_->SetStitchDecompress(stitchDecompress); + be_->SetStitchCompress(stitchCompress); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_STITCH_DECOMPRESS + + PISP_BE_BAYER_ENABLE_STITCH_COMPRESS; + } + + /* + * For the bit of the pipeline where we go temporarily into YCbCr, we'll use the + * same flavour of YCbCr as dictated by the headline colour space. But there's + * no benefit from compressing and shifting the range, so we'll stick with the + * full range version of whatever that colour space is. + */ + if (yuvColorSpace) { + pisp_be_ccm_config ccm; + if (yuvColorSpace == ColorSpace::Sycc) { + be_->InitialiseYcbcr(ccm, "jpeg"); + be_->SetYcbcr(ccm); + be_->InitialiseYcbcrInverse(ccm, "jpeg"); + be_->SetYcbcrInverse(ccm); + } else if (yuvColorSpace == ColorSpace::Smpte170m) { + /* We want the full range version of smpte170m, aka. jpeg */ + be_->InitialiseYcbcr(ccm, "jpeg"); + be_->SetYcbcr(ccm); + be_->InitialiseYcbcrInverse(ccm, "jpeg"); + be_->SetYcbcrInverse(ccm); + } else if (yuvColorSpace == ColorSpace::Rec709) { + be_->InitialiseYcbcr(ccm, "rec709_full"); + be_->SetYcbcr(ccm); + be_->InitialiseYcbcrInverse(ccm, "rec709_full"); + be_->SetYcbcrInverse(ccm); + } else { + /* Validation should have ensured this can't happen. */ + LOG(RPI, Error) + << "Invalid colour space " + << ColorSpace::toString(yuvColorSpace); + ASSERT(0); + } + } else { + /* Again, validation should have prevented this. */ + LOG(RPI, Error) << "No YUV colour space"; + ASSERT(0); + } + + be_->SetGlobal(global); + be_->SetInputFormat(inputFormat); + + return 0; +} + +void PiSPCameraData::platformSetIspCrop(unsigned int index, const Rectangle &ispCrop) +{ + pisp_be_crop_config beCrop = { + static_cast(ispCrop.x), + static_cast(ispCrop.y), + static_cast(ispCrop.width), + static_cast(ispCrop.height) + }; + + LOG(RPI, Debug) << "Output " << index << " " << ispCrop.toString(); + be_->SetCrop(index, beCrop); +} + +int PiSPCameraData::platformInitIpa(ipa::RPi::InitParams ¶ms) +{ + params.fe = fe_.fd(); + params.be = be_.fd(); + return 0; +} + +int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat, + V4L2SubdeviceFormat &embeddedFormat) +{ + int ret = 0; + + constexpr unsigned int csiVideoSinkPad = 0; + constexpr unsigned int csiMetaSinkPad = 1; + constexpr unsigned int csiVideoSourcePad = 4; + constexpr unsigned int csiMetaSourcePad = 5; + + constexpr unsigned int feVideoSinkPad = 0; + constexpr unsigned int feConfigSinkPad = 1; + constexpr unsigned int feVideo0SourcePad = 2; + constexpr unsigned int feVideo1SourcePad = 3; + constexpr unsigned int feStatsSourcePad = 4; + + const MediaEntity *csi2 = csi2Subdev_->entity(); + const MediaEntity *fe = feSubdev_->entity(); + + for (MediaLink *link : csi2->pads()[csiVideoSourcePad]->links()) { + if (link->sink()->entity()->name() == "rp1-cfe-csi2_ch0") + link->setEnabled(false); + else if (link->sink()->entity()->name() == "pisp-fe") + link->setEnabled(true); + } + + csi2->pads()[csiMetaSourcePad]->links()[0]->setEnabled(sensorMetadata_); + + fe->pads()[feConfigSinkPad]->links()[0]->setEnabled(true); + fe->pads()[feVideo0SourcePad]->links()[0]->setEnabled(true); + fe->pads()[feVideo1SourcePad]->links()[0]->setEnabled(false); + fe->pads()[feStatsSourcePad]->links()[0]->setEnabled(true); + + ret = csi2Subdev_->setFormat(csiVideoSinkPad, &sensorFormat); + if (ret) + return ret; + + if (sensorMetadata_) { + ret = csi2Subdev_->setFormat(csiMetaSinkPad, &embeddedFormat); + if (ret) + return ret; + + ret = csi2Subdev_->setFormat(csiMetaSourcePad, &embeddedFormat); + if (ret) + return ret; + } + + V4L2SubdeviceFormat feFormat = sensorFormat; + feFormat.code = mbusCodeUnpacked16(sensorFormat.code); + ret = feSubdev_->setFormat(feVideoSinkPad, &feFormat); + if (ret) + return ret; + + ret = csi2Subdev_->setFormat(csiVideoSourcePad, &feFormat); + if (ret) + return ret; + + V4L2DeviceFormat feOutputFormat; + cfe_[Cfe::Output0].dev()->getFormat(&feOutputFormat); + BayerFormat feOutputBayer = BayerFormat::fromV4L2PixelFormat(feOutputFormat.fourcc); + + feFormat.code = bayerToMbusCode(feOutputBayer); + ret = feSubdev_->setFormat(feVideo0SourcePad, &feFormat); + + return ret; +} + +void PiSPCameraData::prepareCfe() +{ + /* Fetch an unused config buffer from the stream .*/ + const RPi::BufferObject &config = cfe_[Cfe::Config].acquireBuffer(); + ASSERT(config.mapped); + + { + std::scoped_lock l(*fe_); + Span configBuffer = config.mapped->planes()[0]; + fe_->Prepare(reinterpret_cast(configBuffer.data())); + } + + config.buffer->_d()->metadata().planes()[0].bytesused = sizeof(pisp_fe_config); + cfe_[Cfe::Config].queueBuffer(config.buffer); +} + +void PiSPCameraData::prepareBe(uint32_t bufferId, bool stitchSwapBuffers) +{ + ispOutputCount_ = 0; + + FrameBuffer *buffer = cfe_[Cfe::Output0].getBuffers().at(bufferId).buffer; + + LOG(RPI, Debug) << "Input re-queue to ISP, buffer id " << bufferId + << ", timestamp: " << buffer->metadata().timestamp; + + isp_[Isp::Input].queueBuffer(buffer); + + /* Ping-pong between input/output buffers for the TDN and Stitch nodes. */ + if (!config_.disableTdn) { + isp_[Isp::TdnInput].queueBuffer(tdnBuffers_[tdnInputIndex_]); + isp_[Isp::TdnOutput].queueBuffer(tdnBuffers_[tdnInputIndex_ ^ 1]); + tdnInputIndex_ ^= 1; + } + + if (!config_.disableHdr) { + if (stitchSwapBuffers) + stitchInputIndex_ ^= 1; + isp_[Isp::StitchInput].queueBuffer(stitchBuffers_[stitchInputIndex_]); + isp_[Isp::StitchOutput].queueBuffer(stitchBuffers_[stitchInputIndex_ ^ 1]); + } + + /* Fetch an unused config buffer from the stream .*/ + const RPi::BufferObject &config = isp_[Isp::Config].acquireBuffer(); + ASSERT(config.mapped); + + Span configBufferSpan = config.mapped->planes()[0]; + pisp_be_tiles_config *configBuffer = reinterpret_cast(configBufferSpan.data()); + be_->Prepare(configBuffer); + + /* + * If the LIBCAMERA_RPI_PISP_CONFIG_DUMP environment variable is set, + * dump the Backend config to the given file. This is a one-shot + * operation, so log the filename that was provided and allow the + * application to change the filename for multiple dumps in a single + * run. + * + * \todo Using an environment variable is only a temporary solution + * until we have support for vendor specific controls in libcamera. + */ + const char *config_dump = utils::secure_getenv("LIBCAMERA_RPI_PISP_CONFIG_DUMP"); + if (config_dump && last_dump_file_ != config_dump) { + std::ofstream of(config_dump); + if (of.is_open()) { + of << be_->GetJsonConfig(configBuffer); + last_dump_file_ = config_dump; + } + } + + isp_[Isp::Config].queueBuffer(config.buffer); +} + +void PiSPCameraData::tryRunPipeline() +{ + /* If any of our request or buffer queues are empty, we cannot proceed. */ + if (state_ != State::Idle || requestQueue_.empty() || !cfeJobComplete()) + return; + + CfeJob &job = cfeJobQueue_.front(); + + /* Take the first request from the queue and action the IPA. */ + Request *request = requestQueue_.front(); + + /* See if a new ScalerCrop value needs to be applied. */ + applyScalerCrop(request->controls()); + + /* + * Clear the request metadata and fill it with some initial non-IPA + * related controls. We clear it first because the request metadata + * may have been populated if we have dropped the previous frame. + */ + request->metadata().clear(); + fillRequestMetadata(job.sensorControls, request); + + /* Set our state to say the pipeline is active. */ + state_ = State::Busy; + + unsigned int bayerId = cfe_[Cfe::Output0].getBufferId(job.buffers[&cfe_[Cfe::Output0]]); + unsigned int statsId = cfe_[Cfe::Stats].getBufferId(job.buffers[&cfe_[Cfe::Stats]]); + ASSERT(bayerId && statsId); + + std::stringstream ss; + ss << "Signalling IPA processStats and prepareIsp:" + << " Bayer buffer id: " << bayerId + << " Stats buffer id: " << statsId; + + ipa::RPi::PrepareParams params; + params.buffers.bayer = RPi::MaskBayerData | bayerId; + params.buffers.stats = RPi::MaskStats | statsId; + params.buffers.embedded = 0; + params.ipaContext = requestQueue_.front()->sequence(); + params.delayContext = job.delayContext; + params.sensorControls = std::move(job.sensorControls); + params.requestControls = request->controls(); + + if (sensorMetadata_) { + unsigned int embeddedId = + cfe_[Cfe::Embedded].getBufferId(job.buffers[&cfe_[Cfe::Embedded]]); + + ASSERT(embeddedId); + params.buffers.embedded = RPi::MaskEmbeddedData | embeddedId; + ss << " Embedded buffer id: " << embeddedId; + } + + LOG(RPI, Debug) << ss.str(); + + cfeJobQueue_.pop(); + ipa_->prepareIsp(params); +} + +REGISTER_PIPELINE_HANDLER(PipelineHandlerPiSP, "rpi/pisp") + +} /* namespace libcamera */ From 62fb6f5653d02af9df73d7dfd24d095ff0a3d7d1 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Thu, 4 May 2023 09:15:27 +0100 Subject: [PATCH 12/46] ipa: rpi: Add support for Raspberry Pi 5 Add the Raspberry Pi 5 ISP (PiSP) IPA to libcamera. To include this IPA in the build, set the following meson option: meson configure -Dipas=rpi/pisp Signed-off-by: Naushir Patuck Reviewed-by: David Plowman --- meson_options.txt | 2 +- src/ipa/rpi/pisp/data/imx219.json | 1187 ++++++++++++++++ src/ipa/rpi/pisp/data/imx219_noir.json | 1112 +++++++++++++++ src/ipa/rpi/pisp/data/imx290.json | 341 +++++ src/ipa/rpi/pisp/data/imx296.json | 1194 ++++++++++++++++ src/ipa/rpi/pisp/data/imx296_16mm.json | 1247 +++++++++++++++++ src/ipa/rpi/pisp/data/imx296_6mm.json | 1247 +++++++++++++++++ src/ipa/rpi/pisp/data/imx296_mono.json | 960 +++++++++++++ src/ipa/rpi/pisp/data/imx378.json | 634 +++++++++ src/ipa/rpi/pisp/data/imx477.json | 1186 ++++++++++++++++ src/ipa/rpi/pisp/data/imx477_16mm.json | 1240 +++++++++++++++++ src/ipa/rpi/pisp/data/imx477_6mm.json | 1240 +++++++++++++++++ src/ipa/rpi/pisp/data/imx477_noir.json | 1148 ++++++++++++++++ src/ipa/rpi/pisp/data/imx477_scientific.json | 546 ++++++++ src/ipa/rpi/pisp/data/imx519.json | 634 +++++++++ src/ipa/rpi/pisp/data/imx708.json | 1270 +++++++++++++++++ src/ipa/rpi/pisp/data/imx708_noir.json | 1233 +++++++++++++++++ src/ipa/rpi/pisp/data/imx708_wide.json | 1293 ++++++++++++++++++ src/ipa/rpi/pisp/data/imx708_wide_noir.json | 1148 ++++++++++++++++ src/ipa/rpi/pisp/data/meson.build | 26 + src/ipa/rpi/pisp/data/ov5647.json | 1186 ++++++++++++++++ src/ipa/rpi/pisp/data/ov5647_noir.json | 1121 +++++++++++++++ src/ipa/rpi/pisp/data/ov64a40.json | 1133 +++++++++++++++ src/ipa/rpi/pisp/data/ov9281_mono.json | 215 +++ src/ipa/rpi/pisp/data/se327m12.json | 639 +++++++++ src/ipa/rpi/pisp/data/uncalibrated.json | 135 ++ src/ipa/rpi/pisp/meson.build | 49 + src/ipa/rpi/pisp/pisp.cpp | 1068 +++++++++++++++ src/libcamera/control_ids_rpi.yaml | 12 + 29 files changed, 24445 insertions(+), 1 deletion(-) create mode 100644 src/ipa/rpi/pisp/data/imx219.json create mode 100644 src/ipa/rpi/pisp/data/imx219_noir.json create mode 100644 src/ipa/rpi/pisp/data/imx290.json create mode 100644 src/ipa/rpi/pisp/data/imx296.json create mode 100644 src/ipa/rpi/pisp/data/imx296_16mm.json create mode 100644 src/ipa/rpi/pisp/data/imx296_6mm.json create mode 100644 src/ipa/rpi/pisp/data/imx296_mono.json create mode 100644 src/ipa/rpi/pisp/data/imx378.json create mode 100644 src/ipa/rpi/pisp/data/imx477.json create mode 100644 src/ipa/rpi/pisp/data/imx477_16mm.json create mode 100644 src/ipa/rpi/pisp/data/imx477_6mm.json create mode 100644 src/ipa/rpi/pisp/data/imx477_noir.json create mode 100644 src/ipa/rpi/pisp/data/imx477_scientific.json create mode 100644 src/ipa/rpi/pisp/data/imx519.json create mode 100644 src/ipa/rpi/pisp/data/imx708.json create mode 100644 src/ipa/rpi/pisp/data/imx708_noir.json create mode 100644 src/ipa/rpi/pisp/data/imx708_wide.json create mode 100644 src/ipa/rpi/pisp/data/imx708_wide_noir.json create mode 100644 src/ipa/rpi/pisp/data/meson.build create mode 100644 src/ipa/rpi/pisp/data/ov5647.json create mode 100644 src/ipa/rpi/pisp/data/ov5647_noir.json create mode 100755 src/ipa/rpi/pisp/data/ov64a40.json create mode 100644 src/ipa/rpi/pisp/data/ov9281_mono.json create mode 100644 src/ipa/rpi/pisp/data/se327m12.json create mode 100644 src/ipa/rpi/pisp/data/uncalibrated.json create mode 100644 src/ipa/rpi/pisp/meson.build create mode 100644 src/ipa/rpi/pisp/pisp.cpp diff --git a/meson_options.txt b/meson_options.txt index 9eeec1f06..6a6b68643 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -32,7 +32,7 @@ option('gstreamer', option('ipas', type : 'array', - choices : ['ipu3', 'rkisp1', 'rpi/vc4', 'simple', 'vimc'], + choices : ['ipu3', 'rkisp1', 'rpi/pisp', 'rpi/vc4', 'simple', 'vimc'], description : 'Select which IPA modules to build') option('lc-compliance', diff --git a/src/ipa/rpi/pisp/data/imx219.json b/src/ipa/rpi/pisp/data/imx219.json new file mode 100644 index 000000000..5254e60da --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx219.json @@ -0,0 +1,1187 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 21965, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 800, + "reference_Y": 11460 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 3.661 + } + }, + { + "rpi.geq": + { + "offset": 239, + "slope": 0.00766 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2860.0, 0.9514, 0.4156, + 2960.0, 0.9289, 0.4372, + 3603.0, 0.8305, 0.5251, + 4650.0, 0.6756, 0.6433, + 5858.0, 0.6193, 0.6807, + 7580.0, 0.5019, 0.7495 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.03392, + "transverse_neg": 0.034 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 10.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 10.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 1.418, 1.428, 1.446, 1.454, 1.454, 1.451, 1.441, 1.428, 1.411, 1.391, 1.371, 1.349, 1.334, 1.327, 1.325, 1.325, 1.325, 1.325, 1.331, 1.344, 1.363, 1.383, 1.402, 1.418, 1.433, 1.446, 1.452, 1.453, 1.446, 1.435, 1.415, 1.404, + 1.428, 1.442, 1.453, 1.455, 1.454, 1.447, 1.431, 1.413, 1.392, 1.371, 1.349, 1.331, 1.318, 1.307, 1.299, 1.299, 1.299, 1.303, 1.313, 1.328, 1.344, 1.363, 1.383, 1.404, 1.424, 1.439, 1.451, 1.453, 1.453, 1.445, 1.431, 1.415, + 1.436, 1.448, 1.453, 1.455, 1.449, 1.435, 1.415, 1.393, 1.369, 1.345, 1.322, 1.303, 1.287, 1.276, 1.269, 1.268, 1.268, 1.272, 1.283, 1.298, 1.316, 1.337, 1.362, 1.384, 1.406, 1.427, 1.444, 1.454, 1.454, 1.452, 1.438, 1.426, + 1.441, 1.451, 1.454, 1.451, 1.439, 1.422, 1.396, 1.372, 1.345, 1.319, 1.295, 1.274, 1.257, 1.245, 1.239, 1.238, 1.238, 1.245, 1.255, 1.269, 1.289, 1.311, 1.336, 1.362, 1.388, 1.412, 1.433, 1.448, 1.454, 1.453, 1.445, 1.433, + 1.445, 1.452, 1.452, 1.445, 1.428, 1.405, 1.379, 1.349, 1.319, 1.295, 1.269, 1.247, 1.229, 1.219, 1.212, 1.211, 1.211, 1.217, 1.228, 1.242, 1.261, 1.286, 1.311, 1.339, 1.367, 1.395, 1.419, 1.439, 1.452, 1.452, 1.451, 1.436, + 1.448, 1.451, 1.451, 1.435, 1.414, 1.387, 1.358, 1.327, 1.296, 1.269, 1.245, 1.222, 1.205, 1.193, 1.187, 1.185, 1.186, 1.191, 1.202, 1.217, 1.237, 1.261, 1.286, 1.316, 1.346, 1.378, 1.404, 1.429, 1.445, 1.451, 1.451, 1.442, + 1.448, 1.448, 1.445, 1.427, 1.401, 1.371, 1.338, 1.306, 1.274, 1.245, 1.222, 1.199, 1.183, 1.171, 1.164, 1.162, 1.162, 1.168, 1.181, 1.194, 1.215, 1.237, 1.264, 1.294, 1.325, 1.359, 1.389, 1.418, 1.441, 1.449, 1.449, 1.443, + 1.449, 1.448, 1.438, 1.415, 1.387, 1.352, 1.318, 1.284, 1.252, 1.223, 1.199, 1.179, 1.161, 1.149, 1.142, 1.142, 1.142, 1.149, 1.159, 1.174, 1.194, 1.215, 1.242, 1.272, 1.307, 1.341, 1.376, 1.405, 1.431, 1.447, 1.447, 1.444, + 1.448, 1.447, 1.431, 1.405, 1.373, 1.336, 1.301, 1.264, 1.234, 1.204, 1.179, 1.161, 1.143, 1.131, 1.124, 1.123, 1.123, 1.131, 1.141, 1.156, 1.174, 1.197, 1.224, 1.254, 1.288, 1.324, 1.361, 1.394, 1.423, 1.442, 1.444, 1.444, + 1.447, 1.442, 1.424, 1.393, 1.359, 1.322, 1.284, 1.248, 1.216, 1.187, 1.162, 1.143, 1.128, 1.115, 1.109, 1.108, 1.108, 1.113, 1.124, 1.139, 1.156, 1.179, 1.206, 1.236, 1.272, 1.309, 1.347, 1.382, 1.411, 1.435, 1.443, 1.444, + 1.444, 1.439, 1.417, 1.383, 1.347, 1.308, 1.271, 1.233, 1.201, 1.173, 1.147, 1.128, 1.115, 1.101, 1.095, 1.093, 1.093, 1.099, 1.111, 1.124, 1.142, 1.165, 1.191, 1.222, 1.258, 1.296, 1.333, 1.372, 1.404, 1.429, 1.441, 1.442, + 1.443, 1.434, 1.409, 1.375, 1.336, 1.297, 1.257, 1.221, 1.189, 1.159, 1.136, 1.116, 1.101, 1.092, 1.083, 1.082, 1.082, 1.089, 1.099, 1.111, 1.131, 1.153, 1.181, 1.211, 1.246, 1.284, 1.324, 1.361, 1.398, 1.425, 1.441, 1.441, + 1.443, 1.431, 1.405, 1.369, 1.328, 1.287, 1.247, 1.211, 1.178, 1.149, 1.126, 1.107, 1.092, 1.083, 1.075, 1.073, 1.073, 1.082, 1.089, 1.101, 1.121, 1.143, 1.171, 1.201, 1.237, 1.274, 1.314, 1.353, 1.389, 1.421, 1.439, 1.441, + 1.442, 1.429, 1.401, 1.364, 1.323, 1.279, 1.241, 1.205, 1.172, 1.144, 1.119, 1.101, 1.085, 1.075, 1.071, 1.067, 1.067, 1.073, 1.082, 1.096, 1.114, 1.136, 1.163, 1.194, 1.229, 1.268, 1.308, 1.348, 1.387, 1.417, 1.439, 1.439, + 1.443, 1.429, 1.399, 1.362, 1.319, 1.276, 1.237, 1.199, 1.169, 1.141, 1.115, 1.096, 1.081, 1.071, 1.066, 1.063, 1.066, 1.068, 1.078, 1.092, 1.109, 1.132, 1.159, 1.191, 1.226, 1.263, 1.304, 1.346, 1.384, 1.416, 1.438, 1.439, + 1.443, 1.428, 1.399, 1.361, 1.319, 1.276, 1.236, 1.199, 1.167, 1.139, 1.115, 1.096, 1.081, 1.071, 1.064, 1.062, 1.062, 1.067, 1.077, 1.091, 1.109, 1.131, 1.158, 1.189, 1.224, 1.262, 1.303, 1.345, 1.383, 1.416, 1.438, 1.439, + 1.444, 1.429, 1.399, 1.361, 1.319, 1.276, 1.236, 1.199, 1.167, 1.139, 1.116, 1.096, 1.081, 1.071, 1.064, 1.063, 1.063, 1.067, 1.077, 1.091, 1.109, 1.131, 1.159, 1.189, 1.224, 1.262, 1.303, 1.345, 1.384, 1.416, 1.438, 1.441, + 1.444, 1.431, 1.402, 1.364, 1.322, 1.281, 1.239, 1.202, 1.171, 1.142, 1.118, 1.099, 1.084, 1.073, 1.069, 1.065, 1.067, 1.071, 1.079, 1.094, 1.112, 1.135, 1.163, 1.191, 1.227, 1.265, 1.307, 1.348, 1.386, 1.418, 1.438, 1.441, + 1.447, 1.433, 1.406, 1.369, 1.328, 1.286, 1.244, 1.209, 1.177, 1.148, 1.124, 1.105, 1.089, 1.081, 1.073, 1.071, 1.071, 1.079, 1.085, 1.099, 1.118, 1.141, 1.168, 1.198, 1.233, 1.271, 1.312, 1.352, 1.391, 1.422, 1.441, 1.444, + 1.448, 1.438, 1.412, 1.376, 1.335, 1.295, 1.255, 1.218, 1.186, 1.157, 1.134, 1.113, 1.098, 1.089, 1.081, 1.079, 1.079, 1.085, 1.094, 1.107, 1.125, 1.149, 1.175, 1.207, 1.242, 1.281, 1.319, 1.359, 1.396, 1.425, 1.445, 1.447, + 1.449, 1.443, 1.417, 1.384, 1.345, 1.305, 1.266, 1.229, 1.197, 1.169, 1.145, 1.124, 1.111, 1.098, 1.091, 1.089, 1.089, 1.094, 1.107, 1.118, 1.137, 1.159, 1.187, 1.218, 1.253, 1.291, 1.329, 1.369, 1.405, 1.433, 1.447, 1.449, + 1.453, 1.449, 1.425, 1.395, 1.358, 1.318, 1.281, 1.244, 1.211, 1.183, 1.158, 1.138, 1.124, 1.111, 1.104, 1.103, 1.103, 1.107, 1.118, 1.133, 1.151, 1.174, 1.201, 1.232, 1.267, 1.304, 1.344, 1.379, 1.413, 1.437, 1.449, 1.449, + 1.457, 1.453, 1.434, 1.405, 1.371, 1.335, 1.297, 1.261, 1.229, 1.199, 1.174, 1.155, 1.138, 1.126, 1.119, 1.117, 1.117, 1.124, 1.133, 1.149, 1.167, 1.189, 1.217, 1.248, 1.284, 1.319, 1.357, 1.393, 1.423, 1.444, 1.452, 1.452, + 1.459, 1.457, 1.443, 1.418, 1.385, 1.352, 1.314, 1.279, 1.246, 1.218, 1.193, 1.174, 1.155, 1.144, 1.137, 1.136, 1.136, 1.141, 1.151, 1.167, 1.187, 1.208, 1.236, 1.267, 1.301, 1.337, 1.373, 1.405, 1.434, 1.453, 1.455, 1.455, + 1.461, 1.461, 1.454, 1.429, 1.401, 1.369, 1.333, 1.301, 1.269, 1.239, 1.216, 1.193, 1.177, 1.165, 1.158, 1.156, 1.156, 1.161, 1.171, 1.187, 1.208, 1.229, 1.258, 1.288, 1.321, 1.356, 1.389, 1.419, 1.445, 1.459, 1.459, 1.455, + 1.462, 1.462, 1.459, 1.442, 1.418, 1.386, 1.354, 1.322, 1.292, 1.262, 1.239, 1.216, 1.199, 1.187, 1.179, 1.178, 1.178, 1.184, 1.194, 1.208, 1.229, 1.253, 1.279, 1.309, 1.342, 1.375, 1.406, 1.433, 1.452, 1.464, 1.464, 1.454, + 1.461, 1.465, 1.465, 1.454, 1.431, 1.405, 1.376, 1.346, 1.316, 1.288, 1.262, 1.242, 1.223, 1.212, 1.205, 1.203, 1.203, 1.208, 1.218, 1.234, 1.253, 1.279, 1.305, 1.334, 1.363, 1.393, 1.421, 1.445, 1.461, 1.465, 1.464, 1.452, + 1.459, 1.465, 1.466, 1.461, 1.443, 1.421, 1.395, 1.368, 1.341, 1.316, 1.288, 1.268, 1.251, 1.238, 1.232, 1.229, 1.229, 1.235, 1.246, 1.261, 1.279, 1.305, 1.331, 1.356, 1.385, 1.411, 1.435, 1.454, 1.466, 1.466, 1.464, 1.451, + 1.454, 1.465, 1.467, 1.466, 1.456, 1.436, 1.414, 1.389, 1.367, 1.341, 1.318, 1.297, 1.279, 1.269, 1.261, 1.259, 1.259, 1.265, 1.274, 1.288, 1.308, 1.331, 1.355, 1.381, 1.404, 1.428, 1.447, 1.462, 1.468, 1.467, 1.457, 1.445, + 1.447, 1.459, 1.466, 1.467, 1.463, 1.451, 1.434, 1.411, 1.389, 1.367, 1.344, 1.325, 1.311, 1.297, 1.292, 1.289, 1.289, 1.295, 1.303, 1.317, 1.336, 1.356, 1.381, 1.402, 1.423, 1.441, 1.457, 1.467, 1.468, 1.463, 1.451, 1.439, + 1.438, 1.449, 1.462, 1.464, 1.464, 1.459, 1.446, 1.429, 1.408, 1.388, 1.369, 1.353, 1.339, 1.329, 1.321, 1.321, 1.321, 1.325, 1.333, 1.348, 1.362, 1.379, 1.401, 1.421, 1.439, 1.454, 1.463, 1.465, 1.465, 1.456, 1.442, 1.427, + 1.429, 1.439, 1.454, 1.464, 1.464, 1.459, 1.449, 1.435, 1.421, 1.402, 1.385, 1.369, 1.353, 1.341, 1.338, 1.337, 1.337, 1.338, 1.348, 1.362, 1.378, 1.395, 1.411, 1.429, 1.445, 1.455, 1.463, 1.464, 1.457, 1.447, 1.427, 1.419 + ] + }, + { + "ct": 5000, + "table": + [ + 2.163, 2.177, 2.194, 2.196, 2.197, 2.192, 2.181, 2.161, 2.139, 2.113, 2.088, 2.063, 2.047, 2.041, 2.036, 2.036, 2.036, 2.037, 2.046, 2.059, 2.083, 2.113, 2.135, 2.158, 2.181, 2.193, 2.205, 2.205, 2.202, 2.189, 2.171, 2.158, + 2.169, 2.184, 2.195, 2.196, 2.194, 2.182, 2.163, 2.141, 2.116, 2.088, 2.063, 2.042, 2.025, 2.013, 2.004, 2.004, 2.006, 2.011, 2.022, 2.038, 2.059, 2.083, 2.113, 2.137, 2.162, 2.182, 2.197, 2.204, 2.203, 2.199, 2.183, 2.171, + 2.177, 2.187, 2.193, 2.193, 2.184, 2.166, 2.142, 2.116, 2.087, 2.057, 2.033, 2.008, 1.991, 1.977, 1.969, 1.969, 1.969, 1.975, 1.988, 2.006, 2.028, 2.055, 2.083, 2.114, 2.139, 2.166, 2.187, 2.199, 2.202, 2.201, 2.189, 2.179, + 2.183, 2.189, 2.192, 2.186, 2.172, 2.146, 2.119, 2.089, 2.058, 2.026, 2.001, 1.975, 1.956, 1.942, 1.934, 1.932, 1.933, 1.941, 1.955, 1.971, 1.995, 2.023, 2.055, 2.084, 2.119, 2.146, 2.171, 2.191, 2.201, 2.201, 2.194, 2.183, + 2.186, 2.189, 2.189, 2.177, 2.158, 2.127, 2.096, 2.059, 2.026, 1.998, 1.969, 1.944, 1.925, 1.911, 1.901, 1.901, 1.903, 1.912, 1.924, 1.941, 1.964, 1.995, 2.023, 2.058, 2.091, 2.126, 2.155, 2.181, 2.195, 2.199, 2.198, 2.188, + 2.189, 2.189, 2.184, 2.166, 2.138, 2.108, 2.071, 2.036, 1.999, 1.969, 1.941, 1.914, 1.894, 1.879, 1.871, 1.871, 1.872, 1.879, 1.893, 1.913, 1.937, 1.964, 1.997, 2.029, 2.065, 2.104, 2.137, 2.169, 2.187, 2.199, 2.199, 2.189, + 2.187, 2.186, 2.176, 2.154, 2.123, 2.087, 2.044, 2.011, 1.974, 1.941, 1.913, 1.887, 1.868, 1.852, 1.844, 1.843, 1.844, 1.852, 1.866, 1.885, 1.912, 1.937, 1.972, 2.004, 2.042, 2.081, 2.119, 2.154, 2.179, 2.195, 2.196, 2.193, + 2.187, 2.181, 2.167, 2.141, 2.103, 2.062, 2.023, 1.984, 1.947, 1.916, 1.887, 1.864, 1.841, 1.828, 1.821, 1.819, 1.819, 1.828, 1.842, 1.862, 1.885, 1.913, 1.945, 1.982, 2.021, 2.058, 2.102, 2.137, 2.168, 2.192, 2.193, 2.193, + 2.182, 2.181, 2.161, 2.127, 2.083, 2.044, 2.002, 1.961, 1.924, 1.891, 1.864, 1.841, 1.819, 1.806, 1.797, 1.797, 1.797, 1.805, 1.819, 1.841, 1.862, 1.892, 1.924, 1.959, 1.999, 2.041, 2.082, 2.123, 2.161, 2.185, 2.191, 2.192, + 2.182, 2.172, 2.149, 2.112, 2.069, 2.026, 1.982, 1.941, 1.904, 1.871, 1.841, 1.819, 1.799, 1.785, 1.776, 1.776, 1.778, 1.784, 1.798, 1.819, 1.841, 1.869, 1.903, 1.939, 1.977, 2.021, 2.067, 2.108, 2.145, 2.174, 2.189, 2.191, + 2.181, 2.167, 2.139, 2.098, 2.056, 2.006, 1.965, 1.921, 1.883, 1.851, 1.823, 1.799, 1.783, 1.767, 1.759, 1.758, 1.758, 1.767, 1.783, 1.798, 1.825, 1.851, 1.883, 1.919, 1.959, 2.004, 2.049, 2.094, 2.136, 2.167, 2.187, 2.189, + 2.179, 2.163, 2.131, 2.087, 2.041, 1.994, 1.948, 1.907, 1.871, 1.835, 1.806, 1.784, 1.767, 1.754, 1.744, 1.742, 1.742, 1.752, 1.767, 1.783, 1.808, 1.838, 1.869, 1.905, 1.945, 1.989, 2.036, 2.083, 2.128, 2.159, 2.183, 2.187, + 2.178, 2.161, 2.126, 2.082, 2.032, 1.982, 1.936, 1.896, 1.857, 1.823, 1.795, 1.772, 1.754, 1.744, 1.732, 1.731, 1.732, 1.742, 1.752, 1.771, 1.796, 1.824, 1.857, 1.895, 1.934, 1.977, 2.024, 2.071, 2.116, 2.154, 2.181, 2.185, + 2.177, 2.157, 2.121, 2.074, 2.025, 1.973, 1.927, 1.886, 1.849, 1.815, 1.787, 1.765, 1.746, 1.732, 1.725, 1.722, 1.724, 1.732, 1.743, 1.762, 1.786, 1.813, 1.848, 1.886, 1.924, 1.969, 2.017, 2.066, 2.111, 2.153, 2.179, 2.183, + 2.177, 2.155, 2.119, 2.072, 2.022, 1.969, 1.925, 1.881, 1.844, 1.811, 1.782, 1.758, 1.739, 1.725, 1.721, 1.717, 1.721, 1.724, 1.739, 1.757, 1.781, 1.809, 1.842, 1.879, 1.921, 1.965, 2.012, 2.062, 2.108, 2.151, 2.179, 2.182, + 2.177, 2.156, 2.121, 2.071, 2.021, 1.968, 1.922, 1.879, 1.842, 1.811, 1.781, 1.757, 1.739, 1.725, 1.717, 1.715, 1.715, 1.723, 1.737, 1.757, 1.779, 1.808, 1.841, 1.877, 1.918, 1.963, 2.011, 2.061, 2.107, 2.148, 2.179, 2.183, + 2.178, 2.157, 2.121, 2.072, 2.021, 1.969, 1.922, 1.881, 1.842, 1.811, 1.781, 1.758, 1.739, 1.726, 1.718, 1.717, 1.718, 1.723, 1.737, 1.757, 1.781, 1.809, 1.841, 1.877, 1.918, 1.964, 2.012, 2.061, 2.108, 2.149, 2.179, 2.183, + 2.178, 2.159, 2.124, 2.074, 2.024, 1.974, 1.926, 1.885, 1.847, 1.813, 1.784, 1.762, 1.743, 1.731, 1.725, 1.719, 1.723, 1.728, 1.742, 1.762, 1.785, 1.814, 1.847, 1.881, 1.922, 1.966, 2.017, 2.065, 2.109, 2.151, 2.181, 2.184, + 2.181, 2.163, 2.129, 2.082, 2.032, 1.982, 1.934, 1.891, 1.854, 1.822, 1.794, 1.769, 1.751, 1.739, 1.731, 1.727, 1.728, 1.739, 1.747, 1.768, 1.791, 1.821, 1.852, 1.889, 1.929, 1.972, 2.022, 2.071, 2.117, 2.155, 2.182, 2.189, + 2.184, 2.169, 2.135, 2.091, 2.041, 1.994, 1.947, 1.902, 1.865, 1.833, 1.805, 1.779, 1.762, 1.751, 1.739, 1.739, 1.739, 1.747, 1.761, 1.779, 1.803, 1.831, 1.864, 1.898, 1.941, 1.984, 2.033, 2.079, 2.123, 2.163, 2.188, 2.193, + 2.185, 2.174, 2.142, 2.099, 2.054, 2.004, 1.959, 1.917, 1.879, 1.846, 1.819, 1.794, 1.779, 1.762, 1.754, 1.753, 1.753, 1.761, 1.777, 1.793, 1.816, 1.843, 1.877, 1.913, 1.953, 1.995, 2.043, 2.091, 2.135, 2.169, 2.191, 2.196, + 2.191, 2.179, 2.154, 2.118, 2.069, 2.023, 1.977, 1.935, 1.898, 1.865, 1.834, 1.813, 1.794, 1.779, 1.769, 1.769, 1.769, 1.777, 1.793, 1.809, 1.834, 1.863, 1.895, 1.929, 1.972, 2.015, 2.061, 2.105, 2.145, 2.178, 2.195, 2.199, + 2.197, 2.188, 2.166, 2.129, 2.087, 2.041, 1.997, 1.956, 1.918, 1.884, 1.855, 1.834, 1.813, 1.798, 1.788, 1.788, 1.788, 1.796, 1.809, 1.832, 1.853, 1.881, 1.912, 1.949, 1.991, 2.033, 2.076, 2.119, 2.159, 2.187, 2.202, 2.205, + 2.202, 2.197, 2.176, 2.148, 2.106, 2.065, 2.021, 1.979, 1.943, 1.909, 1.879, 1.855, 1.835, 1.819, 1.811, 1.811, 1.811, 1.818, 1.832, 1.853, 1.875, 1.904, 1.937, 1.972, 2.013, 2.055, 2.097, 2.138, 2.175, 2.197, 2.206, 2.207, + 2.205, 2.202, 2.189, 2.162, 2.126, 2.084, 2.044, 2.004, 1.967, 1.935, 1.907, 1.879, 1.861, 1.845, 1.838, 1.835, 1.835, 1.844, 1.855, 1.875, 1.902, 1.928, 1.961, 1.998, 2.033, 2.076, 2.118, 2.155, 2.186, 2.205, 2.208, 2.208, + 2.207, 2.205, 2.195, 2.175, 2.145, 2.108, 2.069, 2.029, 1.996, 1.963, 1.934, 1.908, 1.885, 1.872, 1.864, 1.863, 1.863, 1.869, 1.884, 1.902, 1.928, 1.956, 1.989, 2.023, 2.059, 2.099, 2.137, 2.172, 2.199, 2.212, 2.213, 2.209, + 2.207, 2.207, 2.203, 2.188, 2.162, 2.128, 2.094, 2.058, 2.023, 1.993, 1.963, 1.936, 1.916, 1.899, 1.893, 1.892, 1.893, 1.899, 1.912, 1.929, 1.956, 1.986, 2.016, 2.049, 2.084, 2.121, 2.156, 2.187, 2.208, 2.215, 2.215, 2.208, + 2.205, 2.208, 2.209, 2.199, 2.178, 2.149, 2.117, 2.083, 2.052, 2.023, 1.993, 1.967, 1.947, 1.933, 1.925, 1.922, 1.922, 1.929, 1.943, 1.961, 1.986, 2.015, 2.045, 2.076, 2.109, 2.143, 2.173, 2.198, 2.214, 2.218, 2.216, 2.205, + 2.201, 2.207, 2.211, 2.211, 2.193, 2.168, 2.141, 2.112, 2.082, 2.052, 2.025, 2.001, 1.981, 1.967, 1.959, 1.958, 1.958, 1.967, 1.975, 1.992, 2.018, 2.046, 2.076, 2.105, 2.136, 2.163, 2.189, 2.208, 2.217, 2.217, 2.212, 2.203, + 2.194, 2.204, 2.212, 2.213, 2.203, 2.187, 2.165, 2.139, 2.112, 2.083, 2.055, 2.034, 2.016, 2.001, 1.993, 1.993, 1.994, 1.999, 2.011, 2.027, 2.051, 2.077, 2.105, 2.133, 2.158, 2.181, 2.202, 2.217, 2.218, 2.218, 2.206, 2.193, + 2.185, 2.198, 2.213, 2.214, 2.212, 2.201, 2.184, 2.163, 2.135, 2.111, 2.089, 2.071, 2.052, 2.039, 2.032, 2.031, 2.031, 2.036, 2.048, 2.065, 2.085, 2.106, 2.131, 2.155, 2.178, 2.198, 2.212, 2.219, 2.219, 2.215, 2.201, 2.185, + 2.176, 2.191, 2.208, 2.217, 2.216, 2.205, 2.195, 2.177, 2.156, 2.133, 2.109, 2.089, 2.071, 2.055, 2.053, 2.053, 2.053, 2.057, 2.065, 2.085, 2.105, 2.123, 2.149, 2.171, 2.192, 2.205, 2.217, 2.219, 2.219, 2.202, 2.185, 2.181 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 2.518, 2.513, 2.503, 2.496, 2.488, 2.484, 2.485, 2.485, 2.486, 2.487, 2.487, 2.489, 2.494, 2.496, 2.496, 2.497, 2.499, 2.499, 2.496, 2.495, 2.492, 2.491, 2.491, 2.491, 2.492, 2.493, 2.495, 2.501, 2.508, 2.516, 2.528, 2.533, + 2.515, 2.508, 2.495, 2.487, 2.483, 2.481, 2.482, 2.483, 2.485, 2.487, 2.489, 2.491, 2.495, 2.497, 2.498, 2.501, 2.502, 2.502, 2.499, 2.496, 2.494, 2.491, 2.491, 2.489, 2.489, 2.491, 2.493, 2.496, 2.502, 2.511, 2.521, 2.531, + 2.507, 2.495, 2.486, 2.482, 2.478, 2.477, 2.481, 2.482, 2.484, 2.488, 2.491, 2.495, 2.499, 2.502, 2.506, 2.508, 2.509, 2.508, 2.505, 2.501, 2.497, 2.493, 2.491, 2.489, 2.488, 2.489, 2.489, 2.492, 2.496, 2.501, 2.511, 2.524, + 2.501, 2.487, 2.482, 2.481, 2.478, 2.477, 2.481, 2.483, 2.487, 2.491, 2.501, 2.503, 2.509, 2.511, 2.518, 2.519, 2.519, 2.519, 2.516, 2.509, 2.504, 2.498, 2.495, 2.493, 2.489, 2.489, 2.488, 2.489, 2.492, 2.498, 2.505, 2.523, + 2.499, 2.484, 2.481, 2.476, 2.476, 2.476, 2.481, 2.485, 2.492, 2.501, 2.509, 2.514, 2.519, 2.524, 2.528, 2.531, 2.533, 2.533, 2.525, 2.519, 2.514, 2.507, 2.501, 2.497, 2.493, 2.489, 2.489, 2.488, 2.491, 2.494, 2.501, 2.514, + 2.497, 2.483, 2.478, 2.476, 2.476, 2.478, 2.482, 2.491, 2.499, 2.509, 2.515, 2.522, 2.528, 2.535, 2.539, 2.541, 2.543, 2.542, 2.539, 2.529, 2.522, 2.516, 2.507, 2.502, 2.497, 2.491, 2.489, 2.488, 2.489, 2.492, 2.498, 2.514, + 2.492, 2.479, 2.476, 2.475, 2.476, 2.481, 2.488, 2.496, 2.505, 2.516, 2.524, 2.532, 2.541, 2.545, 2.552, 2.554, 2.554, 2.554, 2.548, 2.541, 2.532, 2.522, 2.516, 2.507, 2.502, 2.494, 2.491, 2.489, 2.489, 2.492, 2.494, 2.511, + 2.491, 2.479, 2.476, 2.477, 2.478, 2.482, 2.491, 2.502, 2.514, 2.524, 2.533, 2.543, 2.548, 2.555, 2.562, 2.566, 2.567, 2.562, 2.557, 2.551, 2.541, 2.531, 2.523, 2.512, 2.506, 2.498, 2.493, 2.491, 2.491, 2.491, 2.493, 2.507, + 2.489, 2.478, 2.476, 2.477, 2.481, 2.485, 2.494, 2.507, 2.517, 2.529, 2.542, 2.548, 2.557, 2.563, 2.567, 2.571, 2.572, 2.571, 2.565, 2.558, 2.549, 2.538, 2.528, 2.521, 2.509, 2.501, 2.494, 2.492, 2.491, 2.491, 2.491, 2.505, + 2.488, 2.478, 2.477, 2.478, 2.482, 2.489, 2.499, 2.509, 2.523, 2.538, 2.548, 2.556, 2.563, 2.568, 2.573, 2.577, 2.578, 2.577, 2.573, 2.564, 2.555, 2.543, 2.535, 2.524, 2.515, 2.504, 2.495, 2.492, 2.489, 2.488, 2.489, 2.501, + 2.486, 2.476, 2.475, 2.477, 2.483, 2.491, 2.503, 2.515, 2.529, 2.542, 2.553, 2.562, 2.568, 2.574, 2.581, 2.583, 2.584, 2.581, 2.578, 2.571, 2.562, 2.551, 2.539, 2.531, 2.517, 2.508, 2.497, 2.492, 2.488, 2.487, 2.489, 2.498, + 2.486, 2.476, 2.475, 2.479, 2.484, 2.492, 2.504, 2.519, 2.533, 2.544, 2.557, 2.566, 2.573, 2.581, 2.584, 2.588, 2.588, 2.586, 2.581, 2.575, 2.567, 2.555, 2.546, 2.534, 2.517, 2.509, 2.499, 2.492, 2.489, 2.485, 2.488, 2.497, + 2.487, 2.476, 2.476, 2.479, 2.486, 2.494, 2.506, 2.521, 2.535, 2.549, 2.559, 2.571, 2.578, 2.583, 2.589, 2.591, 2.591, 2.591, 2.587, 2.579, 2.571, 2.559, 2.551, 2.538, 2.523, 2.513, 2.503, 2.493, 2.489, 2.486, 2.487, 2.499, + 2.486, 2.475, 2.475, 2.479, 2.486, 2.495, 2.509, 2.525, 2.541, 2.555, 2.563, 2.573, 2.582, 2.588, 2.591, 2.594, 2.595, 2.592, 2.591, 2.585, 2.574, 2.564, 2.552, 2.541, 2.525, 2.514, 2.503, 2.493, 2.489, 2.486, 2.486, 2.501, + 2.486, 2.475, 2.475, 2.479, 2.488, 2.497, 2.509, 2.526, 2.542, 2.556, 2.564, 2.575, 2.584, 2.591, 2.595, 2.596, 2.597, 2.595, 2.592, 2.587, 2.577, 2.568, 2.554, 2.542, 2.527, 2.515, 2.504, 2.494, 2.491, 2.487, 2.487, 2.505, + 2.484, 2.476, 2.475, 2.478, 2.488, 2.498, 2.509, 2.526, 2.542, 2.555, 2.565, 2.576, 2.584, 2.589, 2.595, 2.598, 2.598, 2.597, 2.593, 2.587, 2.578, 2.569, 2.556, 2.543, 2.528, 2.515, 2.504, 2.494, 2.489, 2.485, 2.485, 2.501, + 2.484, 2.475, 2.475, 2.478, 2.489, 2.498, 2.509, 2.524, 2.539, 2.553, 2.565, 2.576, 2.584, 2.589, 2.594, 2.597, 2.597, 2.596, 2.593, 2.587, 2.577, 2.569, 2.555, 2.543, 2.529, 2.515, 2.503, 2.496, 2.491, 2.485, 2.486, 2.497, + 2.484, 2.474, 2.474, 2.479, 2.487, 2.497, 2.509, 2.523, 2.539, 2.551, 2.563, 2.574, 2.581, 2.587, 2.592, 2.595, 2.596, 2.595, 2.591, 2.584, 2.574, 2.567, 2.554, 2.541, 2.526, 2.514, 2.503, 2.495, 2.489, 2.485, 2.486, 2.497, + 2.484, 2.475, 2.475, 2.478, 2.485, 2.494, 2.507, 2.522, 2.535, 2.546, 2.559, 2.568, 2.579, 2.584, 2.589, 2.592, 2.593, 2.592, 2.588, 2.579, 2.571, 2.562, 2.551, 2.537, 2.524, 2.514, 2.501, 2.493, 2.489, 2.486, 2.487, 2.498, + 2.485, 2.476, 2.475, 2.477, 2.485, 2.491, 2.506, 2.519, 2.531, 2.544, 2.555, 2.563, 2.571, 2.581, 2.584, 2.589, 2.589, 2.588, 2.583, 2.576, 2.566, 2.555, 2.546, 2.534, 2.522, 2.511, 2.499, 2.491, 2.488, 2.486, 2.487, 2.502, + 2.487, 2.477, 2.475, 2.477, 2.483, 2.489, 2.503, 2.515, 2.525, 2.541, 2.551, 2.559, 2.567, 2.573, 2.579, 2.582, 2.583, 2.582, 2.576, 2.569, 2.562, 2.549, 2.542, 2.527, 2.518, 2.505, 2.497, 2.491, 2.489, 2.487, 2.487, 2.502, + 2.487, 2.478, 2.475, 2.477, 2.482, 2.489, 2.497, 2.512, 2.522, 2.536, 2.544, 2.551, 2.562, 2.566, 2.573, 2.578, 2.578, 2.575, 2.571, 2.564, 2.556, 2.548, 2.536, 2.523, 2.513, 2.503, 2.493, 2.489, 2.487, 2.486, 2.487, 2.502, + 2.488, 2.479, 2.477, 2.478, 2.482, 2.488, 2.496, 2.505, 2.516, 2.528, 2.538, 2.547, 2.553, 2.561, 2.565, 2.569, 2.569, 2.568, 2.564, 2.558, 2.549, 2.541, 2.531, 2.517, 2.509, 2.499, 2.492, 2.488, 2.486, 2.484, 2.486, 2.503, + 2.492, 2.482, 2.479, 2.479, 2.482, 2.487, 2.491, 2.501, 2.512, 2.523, 2.531, 2.541, 2.549, 2.552, 2.558, 2.561, 2.562, 2.559, 2.558, 2.552, 2.542, 2.535, 2.525, 2.514, 2.505, 2.497, 2.491, 2.486, 2.485, 2.484, 2.487, 2.503, + 2.495, 2.483, 2.479, 2.479, 2.482, 2.487, 2.491, 2.498, 2.508, 2.515, 2.526, 2.533, 2.541, 2.547, 2.551, 2.554, 2.555, 2.554, 2.552, 2.541, 2.537, 2.527, 2.519, 2.507, 2.502, 2.495, 2.488, 2.485, 2.484, 2.485, 2.488, 2.503, + 2.499, 2.485, 2.483, 2.481, 2.482, 2.486, 2.489, 2.494, 2.504, 2.511, 2.519, 2.527, 2.531, 2.539, 2.542, 2.546, 2.546, 2.545, 2.539, 2.535, 2.527, 2.522, 2.509, 2.505, 2.497, 2.491, 2.486, 2.485, 2.485, 2.487, 2.491, 2.506, + 2.499, 2.489, 2.483, 2.481, 2.481, 2.483, 2.488, 2.491, 2.499, 2.506, 2.512, 2.519, 2.524, 2.529, 2.535, 2.537, 2.536, 2.534, 2.532, 2.525, 2.522, 2.514, 2.506, 2.499, 2.492, 2.489, 2.485, 2.484, 2.485, 2.488, 2.492, 2.506, + 2.507, 2.494, 2.486, 2.483, 2.482, 2.482, 2.486, 2.488, 2.495, 2.501, 2.507, 2.511, 2.517, 2.519, 2.523, 2.525, 2.525, 2.523, 2.523, 2.521, 2.514, 2.506, 2.502, 2.496, 2.491, 2.488, 2.485, 2.485, 2.487, 2.489, 2.496, 2.516, + 2.511, 2.503, 2.489, 2.486, 2.485, 2.485, 2.485, 2.487, 2.489, 2.495, 2.501, 2.505, 2.509, 2.514, 2.517, 2.519, 2.518, 2.517, 2.515, 2.511, 2.505, 2.501, 2.495, 2.492, 2.488, 2.486, 2.485, 2.486, 2.488, 2.492, 2.499, 2.519, + 2.517, 2.505, 2.494, 2.489, 2.487, 2.486, 2.486, 2.486, 2.489, 2.491, 2.496, 2.499, 2.503, 2.506, 2.508, 2.509, 2.511, 2.509, 2.507, 2.503, 2.501, 2.496, 2.493, 2.489, 2.485, 2.485, 2.486, 2.487, 2.491, 2.495, 2.505, 2.526, + 2.526, 2.516, 2.504, 2.494, 2.493, 2.489, 2.489, 2.489, 2.489, 2.491, 2.496, 2.498, 2.501, 2.504, 2.506, 2.506, 2.506, 2.505, 2.503, 2.501, 2.499, 2.496, 2.494, 2.491, 2.487, 2.486, 2.489, 2.492, 2.497, 2.505, 2.517, 2.528, + 2.529, 2.526, 2.508, 2.502, 2.501, 2.498, 2.495, 2.495, 2.495, 2.495, 2.497, 2.499, 2.501, 2.503, 2.504, 2.506, 2.505, 2.505, 2.503, 2.501, 2.499, 2.496, 2.495, 2.494, 2.492, 2.494, 2.494, 2.498, 2.504, 2.513, 2.525, 2.536 + ] + }, + { + "ct": 5000, + "table": + [ + 1.427, 1.425, 1.423, 1.422, 1.421, 1.421, 1.421, 1.421, 1.421, 1.421, 1.422, 1.423, 1.424, 1.425, 1.426, 1.426, 1.426, 1.425, 1.425, 1.424, 1.422, 1.421, 1.421, 1.421, 1.421, 1.422, 1.422, 1.422, 1.424, 1.424, 1.426, 1.428, + 1.426, 1.424, 1.422, 1.421, 1.419, 1.419, 1.419, 1.421, 1.421, 1.422, 1.423, 1.424, 1.425, 1.426, 1.427, 1.427, 1.427, 1.426, 1.425, 1.424, 1.422, 1.421, 1.421, 1.421, 1.421, 1.421, 1.421, 1.421, 1.421, 1.422, 1.424, 1.427, + 1.423, 1.421, 1.421, 1.419, 1.419, 1.418, 1.419, 1.419, 1.421, 1.423, 1.425, 1.426, 1.428, 1.429, 1.431, 1.431, 1.431, 1.431, 1.429, 1.426, 1.424, 1.422, 1.421, 1.421, 1.421, 1.419, 1.419, 1.419, 1.421, 1.421, 1.422, 1.425, + 1.422, 1.419, 1.419, 1.419, 1.418, 1.418, 1.419, 1.421, 1.422, 1.426, 1.428, 1.429, 1.433, 1.434, 1.436, 1.436, 1.436, 1.434, 1.432, 1.429, 1.426, 1.424, 1.423, 1.422, 1.421, 1.419, 1.419, 1.419, 1.419, 1.419, 1.421, 1.425, + 1.422, 1.419, 1.419, 1.418, 1.418, 1.419, 1.419, 1.422, 1.425, 1.429, 1.432, 1.435, 1.436, 1.438, 1.439, 1.439, 1.441, 1.439, 1.435, 1.433, 1.429, 1.427, 1.425, 1.423, 1.422, 1.419, 1.419, 1.418, 1.418, 1.418, 1.419, 1.425, + 1.422, 1.419, 1.418, 1.418, 1.418, 1.419, 1.421, 1.424, 1.428, 1.432, 1.436, 1.437, 1.439, 1.442, 1.443, 1.445, 1.444, 1.443, 1.441, 1.436, 1.434, 1.431, 1.427, 1.425, 1.422, 1.421, 1.419, 1.418, 1.418, 1.418, 1.419, 1.424, + 1.422, 1.418, 1.417, 1.418, 1.419, 1.421, 1.423, 1.427, 1.431, 1.436, 1.438, 1.442, 1.444, 1.446, 1.448, 1.449, 1.448, 1.446, 1.445, 1.441, 1.436, 1.434, 1.429, 1.427, 1.423, 1.421, 1.419, 1.418, 1.418, 1.418, 1.418, 1.423, + 1.421, 1.418, 1.418, 1.418, 1.419, 1.421, 1.424, 1.429, 1.434, 1.438, 1.442, 1.445, 1.447, 1.449, 1.451, 1.452, 1.452, 1.449, 1.447, 1.445, 1.441, 1.436, 1.433, 1.429, 1.425, 1.422, 1.419, 1.419, 1.418, 1.417, 1.418, 1.423, + 1.421, 1.418, 1.418, 1.419, 1.419, 1.423, 1.426, 1.432, 1.436, 1.441, 1.445, 1.448, 1.449, 1.452, 1.453, 1.454, 1.454, 1.453, 1.451, 1.447, 1.444, 1.439, 1.433, 1.431, 1.427, 1.422, 1.421, 1.419, 1.418, 1.417, 1.418, 1.423, + 1.421, 1.418, 1.418, 1.419, 1.421, 1.423, 1.428, 1.433, 1.439, 1.443, 1.448, 1.449, 1.453, 1.454, 1.455, 1.456, 1.456, 1.454, 1.453, 1.449, 1.446, 1.441, 1.437, 1.433, 1.429, 1.423, 1.421, 1.419, 1.418, 1.416, 1.417, 1.423, + 1.421, 1.417, 1.417, 1.419, 1.422, 1.424, 1.429, 1.435, 1.441, 1.444, 1.449, 1.453, 1.454, 1.456, 1.458, 1.459, 1.458, 1.456, 1.454, 1.451, 1.448, 1.442, 1.439, 1.435, 1.429, 1.426, 1.421, 1.419, 1.418, 1.416, 1.417, 1.422, + 1.419, 1.418, 1.417, 1.419, 1.422, 1.425, 1.429, 1.436, 1.442, 1.446, 1.451, 1.454, 1.456, 1.458, 1.461, 1.461, 1.461, 1.459, 1.456, 1.453, 1.451, 1.446, 1.441, 1.436, 1.431, 1.427, 1.422, 1.419, 1.418, 1.416, 1.417, 1.422, + 1.419, 1.418, 1.418, 1.421, 1.423, 1.426, 1.431, 1.437, 1.444, 1.449, 1.452, 1.456, 1.458, 1.461, 1.462, 1.463, 1.463, 1.461, 1.458, 1.454, 1.452, 1.447, 1.443, 1.438, 1.432, 1.428, 1.423, 1.421, 1.419, 1.417, 1.417, 1.421, + 1.419, 1.418, 1.417, 1.421, 1.423, 1.428, 1.432, 1.439, 1.445, 1.451, 1.453, 1.457, 1.459, 1.462, 1.464, 1.465, 1.465, 1.463, 1.461, 1.457, 1.453, 1.449, 1.444, 1.441, 1.432, 1.429, 1.425, 1.421, 1.419, 1.417, 1.418, 1.422, + 1.418, 1.417, 1.417, 1.419, 1.423, 1.428, 1.433, 1.439, 1.446, 1.451, 1.453, 1.457, 1.461, 1.464, 1.465, 1.466, 1.466, 1.464, 1.462, 1.459, 1.454, 1.451, 1.445, 1.441, 1.436, 1.429, 1.425, 1.422, 1.421, 1.417, 1.417, 1.423, + 1.417, 1.416, 1.416, 1.419, 1.423, 1.428, 1.433, 1.441, 1.446, 1.451, 1.454, 1.458, 1.461, 1.463, 1.465, 1.466, 1.466, 1.465, 1.463, 1.459, 1.454, 1.451, 1.446, 1.441, 1.437, 1.431, 1.426, 1.422, 1.421, 1.418, 1.418, 1.423, + 1.417, 1.416, 1.417, 1.418, 1.423, 1.428, 1.433, 1.439, 1.445, 1.451, 1.453, 1.457, 1.461, 1.463, 1.465, 1.466, 1.466, 1.464, 1.462, 1.459, 1.454, 1.451, 1.446, 1.441, 1.437, 1.431, 1.426, 1.422, 1.419, 1.417, 1.417, 1.422, + 1.417, 1.416, 1.416, 1.418, 1.422, 1.428, 1.433, 1.438, 1.444, 1.449, 1.453, 1.456, 1.459, 1.462, 1.464, 1.465, 1.465, 1.463, 1.461, 1.458, 1.453, 1.449, 1.445, 1.441, 1.435, 1.429, 1.426, 1.421, 1.419, 1.417, 1.417, 1.422, + 1.418, 1.416, 1.416, 1.418, 1.421, 1.426, 1.432, 1.438, 1.443, 1.447, 1.451, 1.454, 1.458, 1.459, 1.462, 1.463, 1.463, 1.462, 1.459, 1.455, 1.451, 1.447, 1.443, 1.439, 1.434, 1.429, 1.425, 1.421, 1.419, 1.417, 1.417, 1.422, + 1.418, 1.416, 1.416, 1.418, 1.421, 1.425, 1.431, 1.435, 1.442, 1.445, 1.449, 1.452, 1.455, 1.458, 1.458, 1.461, 1.461, 1.459, 1.456, 1.453, 1.449, 1.445, 1.442, 1.436, 1.433, 1.427, 1.425, 1.421, 1.419, 1.418, 1.418, 1.422, + 1.419, 1.416, 1.415, 1.417, 1.419, 1.424, 1.429, 1.434, 1.439, 1.443, 1.446, 1.449, 1.452, 1.454, 1.456, 1.457, 1.457, 1.456, 1.453, 1.451, 1.447, 1.443, 1.441, 1.435, 1.431, 1.426, 1.424, 1.421, 1.419, 1.418, 1.418, 1.422, + 1.419, 1.416, 1.415, 1.416, 1.419, 1.422, 1.426, 1.433, 1.437, 1.441, 1.444, 1.447, 1.449, 1.452, 1.453, 1.455, 1.455, 1.453, 1.451, 1.447, 1.444, 1.441, 1.438, 1.432, 1.428, 1.424, 1.421, 1.419, 1.418, 1.417, 1.417, 1.421, + 1.419, 1.416, 1.415, 1.416, 1.418, 1.421, 1.425, 1.431, 1.435, 1.438, 1.442, 1.445, 1.446, 1.449, 1.451, 1.451, 1.451, 1.451, 1.447, 1.445, 1.443, 1.439, 1.434, 1.431, 1.427, 1.422, 1.421, 1.418, 1.417, 1.417, 1.417, 1.421, + 1.418, 1.416, 1.415, 1.416, 1.417, 1.421, 1.423, 1.428, 1.433, 1.437, 1.439, 1.442, 1.444, 1.446, 1.448, 1.449, 1.449, 1.447, 1.445, 1.443, 1.439, 1.437, 1.432, 1.429, 1.425, 1.422, 1.419, 1.417, 1.417, 1.416, 1.416, 1.419, + 1.418, 1.416, 1.416, 1.416, 1.417, 1.421, 1.422, 1.426, 1.429, 1.433, 1.436, 1.438, 1.441, 1.443, 1.445, 1.446, 1.445, 1.445, 1.443, 1.439, 1.437, 1.434, 1.431, 1.427, 1.424, 1.421, 1.419, 1.417, 1.417, 1.416, 1.416, 1.421, + 1.419, 1.417, 1.416, 1.416, 1.417, 1.421, 1.422, 1.424, 1.427, 1.429, 1.432, 1.436, 1.437, 1.439, 1.442, 1.443, 1.443, 1.441, 1.439, 1.437, 1.434, 1.431, 1.429, 1.425, 1.422, 1.421, 1.419, 1.417, 1.416, 1.416, 1.417, 1.419, + 1.421, 1.418, 1.416, 1.417, 1.418, 1.421, 1.421, 1.423, 1.424, 1.427, 1.429, 1.432, 1.434, 1.436, 1.438, 1.439, 1.439, 1.438, 1.436, 1.434, 1.431, 1.429, 1.426, 1.423, 1.422, 1.421, 1.418, 1.417, 1.417, 1.417, 1.417, 1.421, + 1.423, 1.419, 1.418, 1.418, 1.419, 1.419, 1.421, 1.422, 1.423, 1.424, 1.427, 1.429, 1.432, 1.432, 1.434, 1.435, 1.435, 1.434, 1.433, 1.431, 1.429, 1.426, 1.424, 1.422, 1.421, 1.419, 1.418, 1.417, 1.417, 1.417, 1.418, 1.421, + 1.425, 1.421, 1.419, 1.419, 1.419, 1.421, 1.421, 1.421, 1.421, 1.423, 1.424, 1.426, 1.428, 1.431, 1.431, 1.432, 1.432, 1.431, 1.431, 1.428, 1.425, 1.425, 1.422, 1.421, 1.419, 1.419, 1.418, 1.418, 1.418, 1.418, 1.419, 1.425, + 1.426, 1.422, 1.419, 1.419, 1.419, 1.419, 1.419, 1.419, 1.419, 1.421, 1.422, 1.424, 1.426, 1.427, 1.428, 1.429, 1.429, 1.429, 1.427, 1.424, 1.423, 1.422, 1.421, 1.419, 1.418, 1.418, 1.418, 1.418, 1.418, 1.418, 1.419, 1.426, + 1.428, 1.425, 1.421, 1.421, 1.421, 1.421, 1.421, 1.419, 1.419, 1.421, 1.422, 1.423, 1.424, 1.426, 1.426, 1.426, 1.426, 1.425, 1.424, 1.424, 1.422, 1.422, 1.421, 1.419, 1.419, 1.419, 1.419, 1.419, 1.419, 1.419, 1.423, 1.426, + 1.429, 1.427, 1.424, 1.422, 1.422, 1.422, 1.421, 1.421, 1.421, 1.422, 1.422, 1.422, 1.424, 1.425, 1.426, 1.426, 1.425, 1.425, 1.424, 1.423, 1.422, 1.422, 1.421, 1.421, 1.421, 1.421, 1.419, 1.419, 1.421, 1.422, 1.424, 1.426 + ] + } + ], + "luminance_lut": + [ + 2.964, 2.872, 2.691, 2.544, 2.416, 2.302, 2.196, 2.093, 2.006, 1.928, 1.852, 1.801, 1.769, 1.752, 1.743, 1.743, 1.743, 1.746, 1.759, 1.784, 1.824, 1.888, 1.968, 2.052, 2.149, 2.253, 2.359, 2.483, 2.626, 2.785, 2.988, 3.051, + 2.872, 2.748, 2.583, 2.442, 2.313, 2.201, 2.104, 2.012, 1.928, 1.852, 1.791, 1.742, 1.701, 1.671, 1.651, 1.643, 1.643, 1.659, 1.685, 1.721, 1.768, 1.824, 1.888, 1.971, 2.068, 2.152, 2.259, 2.381, 2.514, 2.669, 2.853, 2.988, + 2.761, 2.655, 2.497, 2.356, 2.226, 2.114, 2.012, 1.928, 1.845, 1.769, 1.707, 1.653, 1.612, 1.583, 1.562, 1.556, 1.556, 1.572, 1.599, 1.635, 1.681, 1.742, 1.806, 1.888, 1.971, 2.068, 2.175, 2.292, 2.431, 2.576, 2.747, 2.853, + 2.679, 2.571, 2.415, 2.275, 2.151, 2.035, 1.936, 1.845, 1.769, 1.689, 1.623, 1.572, 1.532, 1.501, 1.481, 1.473, 1.473, 1.492, 1.517, 1.556, 1.599, 1.659, 1.731, 1.806, 1.895, 1.992, 2.101, 2.218, 2.349, 2.493, 2.664, 2.753, + 2.609, 2.492, 2.339, 2.204, 2.079, 1.971, 1.865, 1.772, 1.689, 1.619, 1.551, 1.499, 1.457, 1.423, 1.405, 1.397, 1.397, 1.411, 1.438, 1.477, 1.525, 1.585, 1.659, 1.731, 1.823, 1.922, 2.027, 2.148, 2.275, 2.422, 2.586, 2.683, + 2.545, 2.426, 2.279, 2.139, 2.014, 1.903, 1.799, 1.702, 1.619, 1.551, 1.482, 1.427, 1.385, 1.353, 1.331, 1.325, 1.325, 1.338, 1.364, 1.403, 1.455, 1.522, 1.585, 1.665, 1.757, 1.858, 1.963, 2.081, 2.207, 2.356, 2.518, 2.615, + 2.489, 2.367, 2.218, 2.079, 1.956, 1.844, 1.739, 1.642, 1.559, 1.482, 1.426, 1.363, 1.321, 1.287, 1.266, 1.259, 1.259, 1.274, 1.301, 1.339, 1.395, 1.455, 1.523, 1.606, 1.697, 1.797, 1.905, 2.024, 2.154, 2.296, 2.455, 2.563, + 2.439, 2.316, 2.164, 2.028, 1.906, 1.793, 1.686, 1.589, 1.505, 1.427, 1.363, 1.308, 1.261, 1.229, 1.207, 1.202, 1.202, 1.215, 1.242, 1.283, 1.339, 1.395, 1.467, 1.551, 1.639, 1.742, 1.851, 1.972, 2.104, 2.243, 2.402, 2.515, + 2.398, 2.262, 2.116, 1.982, 1.861, 1.745, 1.639, 1.541, 1.456, 1.377, 1.308, 1.261, 1.208, 1.177, 1.157, 1.153, 1.153, 1.167, 1.191, 1.233, 1.283, 1.343, 1.418, 1.499, 1.591, 1.696, 1.804, 1.928, 2.057, 2.194, 2.352, 2.471, + 2.363, 2.222, 2.078, 1.942, 1.818, 1.706, 1.597, 1.501, 1.412, 1.334, 1.266, 1.208, 1.171, 1.134, 1.113, 1.109, 1.109, 1.123, 1.149, 1.191, 1.233, 1.296, 1.371, 1.457, 1.546, 1.654, 1.768, 1.886, 2.014, 2.155, 2.312, 2.436, + 2.334, 2.188, 2.042, 1.909, 1.783, 1.668, 1.561, 1.464, 1.374, 1.295, 1.228, 1.171, 1.134, 1.098, 1.076, 1.072, 1.072, 1.087, 1.119, 1.149, 1.196, 1.259, 1.332, 1.419, 1.514, 1.616, 1.728, 1.849, 1.981, 2.123, 2.276, 2.406, + 2.306, 2.159, 2.015, 1.881, 1.753, 1.639, 1.533, 1.434, 1.341, 1.263, 1.195, 1.139, 1.098, 1.074, 1.046, 1.044, 1.045, 1.059, 1.087, 1.119, 1.165, 1.227, 1.302, 1.387, 1.482, 1.586, 1.698, 1.819, 1.953, 2.093, 2.248, 2.383, + 2.291, 2.141, 1.991, 1.856, 1.732, 1.615, 1.508, 1.409, 1.318, 1.238, 1.171, 1.114, 1.074, 1.046, 1.027, 1.023, 1.025, 1.043, 1.059, 1.095, 1.142, 1.203, 1.278, 1.362, 1.456, 1.559, 1.673, 1.796, 1.928, 2.071, 2.225, 2.359, + 2.279, 2.118, 1.972, 1.839, 1.715, 1.599, 1.488, 1.389, 1.298, 1.219, 1.153, 1.097, 1.057, 1.027, 1.018, 1.009, 1.013, 1.025, 1.044, 1.078, 1.125, 1.186, 1.258, 1.342, 1.438, 1.541, 1.655, 1.779, 1.909, 2.053, 2.211, 2.351, + 2.274, 2.108, 1.963, 1.831, 1.706, 1.588, 1.477, 1.376, 1.288, 1.207, 1.139, 1.086, 1.049, 1.021, 1.005, 1.002, 1.004, 1.013, 1.035, 1.069, 1.116, 1.176, 1.246, 1.331, 1.427, 1.531, 1.645, 1.767, 1.899, 2.045, 2.197, 2.351, + 2.274, 2.106, 1.961, 1.827, 1.701, 1.585, 1.474, 1.374, 1.285, 1.206, 1.139, 1.085, 1.047, 1.019, 1.003, 1.001, 1.001, 1.012, 1.033, 1.067, 1.113, 1.173, 1.245, 1.329, 1.423, 1.529, 1.642, 1.765, 1.897, 2.042, 2.196, 2.349, + 2.274, 2.108, 1.961, 1.827, 1.701, 1.585, 1.474, 1.374, 1.285, 1.206, 1.139, 1.085, 1.047, 1.021, 1.005, 1.001, 1.004, 1.012, 1.033, 1.068, 1.113, 1.173, 1.246, 1.329, 1.423, 1.529, 1.642, 1.766, 1.897, 2.042, 2.198, 2.349, + 2.278, 2.116, 1.968, 1.833, 1.707, 1.591, 1.482, 1.382, 1.291, 1.214, 1.147, 1.091, 1.055, 1.028, 1.016, 1.006, 1.012, 1.018, 1.039, 1.074, 1.121, 1.182, 1.255, 1.339, 1.433, 1.538, 1.651, 1.777, 1.911, 2.051, 2.207, 2.351, + 2.283, 2.127, 1.979, 1.846, 1.723, 1.605, 1.496, 1.397, 1.309, 1.229, 1.162, 1.108, 1.067, 1.041, 1.027, 1.018, 1.018, 1.036, 1.051, 1.087, 1.136, 1.197, 1.269, 1.354, 1.448, 1.554, 1.664, 1.789, 1.922, 2.065, 2.222, 2.365, + 2.298, 2.145, 1.999, 1.865, 1.744, 1.627, 1.518, 1.421, 1.331, 1.251, 1.183, 1.129, 1.087, 1.065, 1.041, 1.036, 1.036, 1.051, 1.074, 1.107, 1.158, 1.219, 1.292, 1.378, 1.471, 1.575, 1.687, 1.809, 1.942, 2.085, 2.239, 2.378, + 2.315, 2.174, 2.024, 1.893, 1.768, 1.652, 1.543, 1.445, 1.355, 1.278, 1.211, 1.155, 1.116, 1.087, 1.066, 1.061, 1.061, 1.074, 1.105, 1.137, 1.186, 1.248, 1.322, 1.405, 1.498, 1.602, 1.713, 1.835, 1.965, 2.109, 2.267, 2.399, + 2.341, 2.206, 2.057, 1.923, 1.799, 1.685, 1.576, 1.479, 1.392, 1.312, 1.244, 1.187, 1.154, 1.116, 1.096, 1.092, 1.092, 1.106, 1.137, 1.173, 1.221, 1.282, 1.356, 1.439, 1.532, 1.635, 1.747, 1.869, 1.997, 2.141, 2.298, 2.425, + 2.375, 2.244, 2.098, 1.965, 1.839, 1.722, 1.614, 1.519, 1.434, 1.355, 1.288, 1.234, 1.187, 1.155, 1.136, 1.132, 1.132, 1.147, 1.173, 1.219, 1.263, 1.324, 1.398, 1.479, 1.571, 1.674, 1.784, 1.904, 2.035, 2.177, 2.336, 2.455, + 2.414, 2.286, 2.144, 2.011, 1.883, 1.767, 1.661, 1.566, 1.479, 1.401, 1.335, 1.286, 1.234, 1.202, 1.183, 1.178, 1.178, 1.195, 1.222, 1.263, 1.313, 1.372, 1.444, 1.526, 1.618, 1.718, 1.827, 1.951, 2.081, 2.221, 2.379, 2.498, + 2.463, 2.339, 2.191, 2.056, 1.931, 1.819, 1.712, 1.616, 1.529, 1.452, 1.392, 1.335, 1.286, 1.254, 1.235, 1.232, 1.232, 1.248, 1.275, 1.313, 1.371, 1.425, 1.495, 1.576, 1.671, 1.768, 1.877, 1.999, 2.128, 2.269, 2.428, 2.541, + 2.514, 2.396, 2.247, 2.112, 1.988, 1.873, 1.766, 1.671, 1.588, 1.513, 1.452, 1.392, 1.348, 1.316, 1.298, 1.292, 1.292, 1.307, 1.336, 1.373, 1.425, 1.486, 1.552, 1.636, 1.728, 1.826, 1.933, 2.051, 2.183, 2.327, 2.488, 2.587, + 2.573, 2.459, 2.307, 2.171, 2.049, 1.931, 1.828, 1.731, 1.649, 1.582, 1.513, 1.459, 1.415, 1.381, 1.363, 1.358, 1.358, 1.373, 1.399, 1.439, 1.486, 1.552, 1.617, 1.696, 1.787, 1.888, 1.995, 2.112, 2.244, 2.391, 2.552, 2.652, + 2.635, 2.525, 2.377, 2.239, 2.111, 1.996, 1.895, 1.799, 1.719, 1.649, 1.582, 1.531, 1.486, 1.454, 1.434, 1.429, 1.429, 1.444, 1.469, 1.507, 1.555, 1.617, 1.692, 1.766, 1.854, 1.954, 2.065, 2.181, 2.313, 2.459, 2.623, 2.722, + 2.714, 2.604, 2.452, 2.313, 2.188, 2.071, 1.966, 1.876, 1.799, 1.719, 1.656, 1.604, 1.562, 1.529, 1.511, 1.504, 1.504, 1.519, 1.544, 1.583, 1.632, 1.692, 1.766, 1.839, 1.929, 2.029, 2.138, 2.259, 2.391, 2.539, 2.712, 2.811, + 2.809, 2.698, 2.537, 2.396, 2.277, 2.163, 2.053, 1.965, 1.876, 1.799, 1.741, 1.688, 1.643, 1.613, 1.592, 1.586, 1.586, 1.601, 1.628, 1.666, 1.715, 1.773, 1.839, 1.927, 2.012, 2.111, 2.222, 2.342, 2.477, 2.625, 2.811, 2.926, + 2.921, 2.809, 2.637, 2.493, 2.376, 2.256, 2.149, 2.053, 1.966, 1.893, 1.832, 1.778, 1.736, 1.708, 1.687, 1.681, 1.681, 1.696, 1.721, 1.757, 1.806, 1.864, 1.929, 2.012, 2.106, 2.199, 2.313, 2.437, 2.577, 2.731, 2.926, 3.051, + 3.029, 2.921, 2.745, 2.591, 2.474, 2.355, 2.246, 2.146, 2.049, 1.966, 1.893, 1.832, 1.799, 1.776, 1.768, 1.768, 1.768, 1.771, 1.783, 1.809, 1.864, 1.929, 2.012, 2.097, 2.195, 2.297, 2.412, 2.539, 2.682, 2.846, 3.051, 3.123 + ], + "sigma": 0.00463, + "sigma_Cb": 0.00149 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "lo_max": 1000, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2860, + "ccm": + [ + 2.12089, -0.52461, -0.59629, + -0.85342, 2.80445, -0.95103, + -0.26897, -1.14788, 2.41685 + ] + }, + { + "ct": 2960, + "ccm": + [ + 2.26962, -0.54174, -0.72789, + -0.77008, 2.60271, -0.83262, + -0.26036, -1.51254, 2.77289 + ] + }, + { + "ct": 3603, + "ccm": + [ + 2.18644, -0.66148, -0.52496, + -0.77828, 2.69474, -0.91645, + -0.25239, -0.83059, 2.08298 + ] + }, + { + "ct": 4650, + "ccm": + [ + 2.18174, -0.70887, -0.47287, + -0.70196, 2.76426, -1.06231, + -0.25157, -0.71978, 1.97135 + ] + }, + { + "ct": 5858, + "ccm": + [ + 2.32392, -0.88421, -0.43971, + -0.63821, 2.58348, -0.94527, + -0.28541, -0.54112, 1.82653 + ] + }, + { + "ct": 7580, + "ccm": + [ + 2.21175, -0.53242, -0.67933, + -0.57875, 3.07922, -1.50047, + -0.27709, -0.73338, 2.01048 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx219_noir.json b/src/ipa/rpi/pisp/data/imx219_noir.json new file mode 100644 index 000000000..8a8ad330f --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx219_noir.json @@ -0,0 +1,1112 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 21965, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 800, + "reference_Y": 11460 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 3.661 + } + }, + { + "rpi.geq": + { + "offset": 239, + "slope": 0.00766 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "bayes": 0 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 10.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 10.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 1.418, 1.428, 1.446, 1.454, 1.454, 1.451, 1.441, 1.428, 1.411, 1.391, 1.371, 1.349, 1.334, 1.327, 1.325, 1.325, 1.325, 1.325, 1.331, 1.344, 1.363, 1.383, 1.402, 1.418, 1.433, 1.446, 1.452, 1.453, 1.446, 1.435, 1.415, 1.404, + 1.428, 1.442, 1.453, 1.455, 1.454, 1.447, 1.431, 1.413, 1.392, 1.371, 1.349, 1.331, 1.318, 1.307, 1.299, 1.299, 1.299, 1.303, 1.313, 1.328, 1.344, 1.363, 1.383, 1.404, 1.424, 1.439, 1.451, 1.453, 1.453, 1.445, 1.431, 1.415, + 1.436, 1.448, 1.453, 1.455, 1.449, 1.435, 1.415, 1.393, 1.369, 1.345, 1.322, 1.303, 1.287, 1.276, 1.269, 1.268, 1.268, 1.272, 1.283, 1.298, 1.316, 1.337, 1.362, 1.384, 1.406, 1.427, 1.444, 1.454, 1.454, 1.452, 1.438, 1.426, + 1.441, 1.451, 1.454, 1.451, 1.439, 1.422, 1.396, 1.372, 1.345, 1.319, 1.295, 1.274, 1.257, 1.245, 1.239, 1.238, 1.238, 1.245, 1.255, 1.269, 1.289, 1.311, 1.336, 1.362, 1.388, 1.412, 1.433, 1.448, 1.454, 1.453, 1.445, 1.433, + 1.445, 1.452, 1.452, 1.445, 1.428, 1.405, 1.379, 1.349, 1.319, 1.295, 1.269, 1.247, 1.229, 1.219, 1.212, 1.211, 1.211, 1.217, 1.228, 1.242, 1.261, 1.286, 1.311, 1.339, 1.367, 1.395, 1.419, 1.439, 1.452, 1.452, 1.451, 1.436, + 1.448, 1.451, 1.451, 1.435, 1.414, 1.387, 1.358, 1.327, 1.296, 1.269, 1.245, 1.222, 1.205, 1.193, 1.187, 1.185, 1.186, 1.191, 1.202, 1.217, 1.237, 1.261, 1.286, 1.316, 1.346, 1.378, 1.404, 1.429, 1.445, 1.451, 1.451, 1.442, + 1.448, 1.448, 1.445, 1.427, 1.401, 1.371, 1.338, 1.306, 1.274, 1.245, 1.222, 1.199, 1.183, 1.171, 1.164, 1.162, 1.162, 1.168, 1.181, 1.194, 1.215, 1.237, 1.264, 1.294, 1.325, 1.359, 1.389, 1.418, 1.441, 1.449, 1.449, 1.443, + 1.449, 1.448, 1.438, 1.415, 1.387, 1.352, 1.318, 1.284, 1.252, 1.223, 1.199, 1.179, 1.161, 1.149, 1.142, 1.142, 1.142, 1.149, 1.159, 1.174, 1.194, 1.215, 1.242, 1.272, 1.307, 1.341, 1.376, 1.405, 1.431, 1.447, 1.447, 1.444, + 1.448, 1.447, 1.431, 1.405, 1.373, 1.336, 1.301, 1.264, 1.234, 1.204, 1.179, 1.161, 1.143, 1.131, 1.124, 1.123, 1.123, 1.131, 1.141, 1.156, 1.174, 1.197, 1.224, 1.254, 1.288, 1.324, 1.361, 1.394, 1.423, 1.442, 1.444, 1.444, + 1.447, 1.442, 1.424, 1.393, 1.359, 1.322, 1.284, 1.248, 1.216, 1.187, 1.162, 1.143, 1.128, 1.115, 1.109, 1.108, 1.108, 1.113, 1.124, 1.139, 1.156, 1.179, 1.206, 1.236, 1.272, 1.309, 1.347, 1.382, 1.411, 1.435, 1.443, 1.444, + 1.444, 1.439, 1.417, 1.383, 1.347, 1.308, 1.271, 1.233, 1.201, 1.173, 1.147, 1.128, 1.115, 1.101, 1.095, 1.093, 1.093, 1.099, 1.111, 1.124, 1.142, 1.165, 1.191, 1.222, 1.258, 1.296, 1.333, 1.372, 1.404, 1.429, 1.441, 1.442, + 1.443, 1.434, 1.409, 1.375, 1.336, 1.297, 1.257, 1.221, 1.189, 1.159, 1.136, 1.116, 1.101, 1.092, 1.083, 1.082, 1.082, 1.089, 1.099, 1.111, 1.131, 1.153, 1.181, 1.211, 1.246, 1.284, 1.324, 1.361, 1.398, 1.425, 1.441, 1.441, + 1.443, 1.431, 1.405, 1.369, 1.328, 1.287, 1.247, 1.211, 1.178, 1.149, 1.126, 1.107, 1.092, 1.083, 1.075, 1.073, 1.073, 1.082, 1.089, 1.101, 1.121, 1.143, 1.171, 1.201, 1.237, 1.274, 1.314, 1.353, 1.389, 1.421, 1.439, 1.441, + 1.442, 1.429, 1.401, 1.364, 1.323, 1.279, 1.241, 1.205, 1.172, 1.144, 1.119, 1.101, 1.085, 1.075, 1.071, 1.067, 1.067, 1.073, 1.082, 1.096, 1.114, 1.136, 1.163, 1.194, 1.229, 1.268, 1.308, 1.348, 1.387, 1.417, 1.439, 1.439, + 1.443, 1.429, 1.399, 1.362, 1.319, 1.276, 1.237, 1.199, 1.169, 1.141, 1.115, 1.096, 1.081, 1.071, 1.066, 1.063, 1.066, 1.068, 1.078, 1.092, 1.109, 1.132, 1.159, 1.191, 1.226, 1.263, 1.304, 1.346, 1.384, 1.416, 1.438, 1.439, + 1.443, 1.428, 1.399, 1.361, 1.319, 1.276, 1.236, 1.199, 1.167, 1.139, 1.115, 1.096, 1.081, 1.071, 1.064, 1.062, 1.062, 1.067, 1.077, 1.091, 1.109, 1.131, 1.158, 1.189, 1.224, 1.262, 1.303, 1.345, 1.383, 1.416, 1.438, 1.439, + 1.444, 1.429, 1.399, 1.361, 1.319, 1.276, 1.236, 1.199, 1.167, 1.139, 1.116, 1.096, 1.081, 1.071, 1.064, 1.063, 1.063, 1.067, 1.077, 1.091, 1.109, 1.131, 1.159, 1.189, 1.224, 1.262, 1.303, 1.345, 1.384, 1.416, 1.438, 1.441, + 1.444, 1.431, 1.402, 1.364, 1.322, 1.281, 1.239, 1.202, 1.171, 1.142, 1.118, 1.099, 1.084, 1.073, 1.069, 1.065, 1.067, 1.071, 1.079, 1.094, 1.112, 1.135, 1.163, 1.191, 1.227, 1.265, 1.307, 1.348, 1.386, 1.418, 1.438, 1.441, + 1.447, 1.433, 1.406, 1.369, 1.328, 1.286, 1.244, 1.209, 1.177, 1.148, 1.124, 1.105, 1.089, 1.081, 1.073, 1.071, 1.071, 1.079, 1.085, 1.099, 1.118, 1.141, 1.168, 1.198, 1.233, 1.271, 1.312, 1.352, 1.391, 1.422, 1.441, 1.444, + 1.448, 1.438, 1.412, 1.376, 1.335, 1.295, 1.255, 1.218, 1.186, 1.157, 1.134, 1.113, 1.098, 1.089, 1.081, 1.079, 1.079, 1.085, 1.094, 1.107, 1.125, 1.149, 1.175, 1.207, 1.242, 1.281, 1.319, 1.359, 1.396, 1.425, 1.445, 1.447, + 1.449, 1.443, 1.417, 1.384, 1.345, 1.305, 1.266, 1.229, 1.197, 1.169, 1.145, 1.124, 1.111, 1.098, 1.091, 1.089, 1.089, 1.094, 1.107, 1.118, 1.137, 1.159, 1.187, 1.218, 1.253, 1.291, 1.329, 1.369, 1.405, 1.433, 1.447, 1.449, + 1.453, 1.449, 1.425, 1.395, 1.358, 1.318, 1.281, 1.244, 1.211, 1.183, 1.158, 1.138, 1.124, 1.111, 1.104, 1.103, 1.103, 1.107, 1.118, 1.133, 1.151, 1.174, 1.201, 1.232, 1.267, 1.304, 1.344, 1.379, 1.413, 1.437, 1.449, 1.449, + 1.457, 1.453, 1.434, 1.405, 1.371, 1.335, 1.297, 1.261, 1.229, 1.199, 1.174, 1.155, 1.138, 1.126, 1.119, 1.117, 1.117, 1.124, 1.133, 1.149, 1.167, 1.189, 1.217, 1.248, 1.284, 1.319, 1.357, 1.393, 1.423, 1.444, 1.452, 1.452, + 1.459, 1.457, 1.443, 1.418, 1.385, 1.352, 1.314, 1.279, 1.246, 1.218, 1.193, 1.174, 1.155, 1.144, 1.137, 1.136, 1.136, 1.141, 1.151, 1.167, 1.187, 1.208, 1.236, 1.267, 1.301, 1.337, 1.373, 1.405, 1.434, 1.453, 1.455, 1.455, + 1.461, 1.461, 1.454, 1.429, 1.401, 1.369, 1.333, 1.301, 1.269, 1.239, 1.216, 1.193, 1.177, 1.165, 1.158, 1.156, 1.156, 1.161, 1.171, 1.187, 1.208, 1.229, 1.258, 1.288, 1.321, 1.356, 1.389, 1.419, 1.445, 1.459, 1.459, 1.455, + 1.462, 1.462, 1.459, 1.442, 1.418, 1.386, 1.354, 1.322, 1.292, 1.262, 1.239, 1.216, 1.199, 1.187, 1.179, 1.178, 1.178, 1.184, 1.194, 1.208, 1.229, 1.253, 1.279, 1.309, 1.342, 1.375, 1.406, 1.433, 1.452, 1.464, 1.464, 1.454, + 1.461, 1.465, 1.465, 1.454, 1.431, 1.405, 1.376, 1.346, 1.316, 1.288, 1.262, 1.242, 1.223, 1.212, 1.205, 1.203, 1.203, 1.208, 1.218, 1.234, 1.253, 1.279, 1.305, 1.334, 1.363, 1.393, 1.421, 1.445, 1.461, 1.465, 1.464, 1.452, + 1.459, 1.465, 1.466, 1.461, 1.443, 1.421, 1.395, 1.368, 1.341, 1.316, 1.288, 1.268, 1.251, 1.238, 1.232, 1.229, 1.229, 1.235, 1.246, 1.261, 1.279, 1.305, 1.331, 1.356, 1.385, 1.411, 1.435, 1.454, 1.466, 1.466, 1.464, 1.451, + 1.454, 1.465, 1.467, 1.466, 1.456, 1.436, 1.414, 1.389, 1.367, 1.341, 1.318, 1.297, 1.279, 1.269, 1.261, 1.259, 1.259, 1.265, 1.274, 1.288, 1.308, 1.331, 1.355, 1.381, 1.404, 1.428, 1.447, 1.462, 1.468, 1.467, 1.457, 1.445, + 1.447, 1.459, 1.466, 1.467, 1.463, 1.451, 1.434, 1.411, 1.389, 1.367, 1.344, 1.325, 1.311, 1.297, 1.292, 1.289, 1.289, 1.295, 1.303, 1.317, 1.336, 1.356, 1.381, 1.402, 1.423, 1.441, 1.457, 1.467, 1.468, 1.463, 1.451, 1.439, + 1.438, 1.449, 1.462, 1.464, 1.464, 1.459, 1.446, 1.429, 1.408, 1.388, 1.369, 1.353, 1.339, 1.329, 1.321, 1.321, 1.321, 1.325, 1.333, 1.348, 1.362, 1.379, 1.401, 1.421, 1.439, 1.454, 1.463, 1.465, 1.465, 1.456, 1.442, 1.427, + 1.429, 1.439, 1.454, 1.464, 1.464, 1.459, 1.449, 1.435, 1.421, 1.402, 1.385, 1.369, 1.353, 1.341, 1.338, 1.337, 1.337, 1.338, 1.348, 1.362, 1.378, 1.395, 1.411, 1.429, 1.445, 1.455, 1.463, 1.464, 1.457, 1.447, 1.427, 1.419 + ] + }, + { + "ct": 5000, + "table": + [ + 2.163, 2.177, 2.194, 2.196, 2.197, 2.192, 2.181, 2.161, 2.139, 2.113, 2.088, 2.063, 2.047, 2.041, 2.036, 2.036, 2.036, 2.037, 2.046, 2.059, 2.083, 2.113, 2.135, 2.158, 2.181, 2.193, 2.205, 2.205, 2.202, 2.189, 2.171, 2.158, + 2.169, 2.184, 2.195, 2.196, 2.194, 2.182, 2.163, 2.141, 2.116, 2.088, 2.063, 2.042, 2.025, 2.013, 2.004, 2.004, 2.006, 2.011, 2.022, 2.038, 2.059, 2.083, 2.113, 2.137, 2.162, 2.182, 2.197, 2.204, 2.203, 2.199, 2.183, 2.171, + 2.177, 2.187, 2.193, 2.193, 2.184, 2.166, 2.142, 2.116, 2.087, 2.057, 2.033, 2.008, 1.991, 1.977, 1.969, 1.969, 1.969, 1.975, 1.988, 2.006, 2.028, 2.055, 2.083, 2.114, 2.139, 2.166, 2.187, 2.199, 2.202, 2.201, 2.189, 2.179, + 2.183, 2.189, 2.192, 2.186, 2.172, 2.146, 2.119, 2.089, 2.058, 2.026, 2.001, 1.975, 1.956, 1.942, 1.934, 1.932, 1.933, 1.941, 1.955, 1.971, 1.995, 2.023, 2.055, 2.084, 2.119, 2.146, 2.171, 2.191, 2.201, 2.201, 2.194, 2.183, + 2.186, 2.189, 2.189, 2.177, 2.158, 2.127, 2.096, 2.059, 2.026, 1.998, 1.969, 1.944, 1.925, 1.911, 1.901, 1.901, 1.903, 1.912, 1.924, 1.941, 1.964, 1.995, 2.023, 2.058, 2.091, 2.126, 2.155, 2.181, 2.195, 2.199, 2.198, 2.188, + 2.189, 2.189, 2.184, 2.166, 2.138, 2.108, 2.071, 2.036, 1.999, 1.969, 1.941, 1.914, 1.894, 1.879, 1.871, 1.871, 1.872, 1.879, 1.893, 1.913, 1.937, 1.964, 1.997, 2.029, 2.065, 2.104, 2.137, 2.169, 2.187, 2.199, 2.199, 2.189, + 2.187, 2.186, 2.176, 2.154, 2.123, 2.087, 2.044, 2.011, 1.974, 1.941, 1.913, 1.887, 1.868, 1.852, 1.844, 1.843, 1.844, 1.852, 1.866, 1.885, 1.912, 1.937, 1.972, 2.004, 2.042, 2.081, 2.119, 2.154, 2.179, 2.195, 2.196, 2.193, + 2.187, 2.181, 2.167, 2.141, 2.103, 2.062, 2.023, 1.984, 1.947, 1.916, 1.887, 1.864, 1.841, 1.828, 1.821, 1.819, 1.819, 1.828, 1.842, 1.862, 1.885, 1.913, 1.945, 1.982, 2.021, 2.058, 2.102, 2.137, 2.168, 2.192, 2.193, 2.193, + 2.182, 2.181, 2.161, 2.127, 2.083, 2.044, 2.002, 1.961, 1.924, 1.891, 1.864, 1.841, 1.819, 1.806, 1.797, 1.797, 1.797, 1.805, 1.819, 1.841, 1.862, 1.892, 1.924, 1.959, 1.999, 2.041, 2.082, 2.123, 2.161, 2.185, 2.191, 2.192, + 2.182, 2.172, 2.149, 2.112, 2.069, 2.026, 1.982, 1.941, 1.904, 1.871, 1.841, 1.819, 1.799, 1.785, 1.776, 1.776, 1.778, 1.784, 1.798, 1.819, 1.841, 1.869, 1.903, 1.939, 1.977, 2.021, 2.067, 2.108, 2.145, 2.174, 2.189, 2.191, + 2.181, 2.167, 2.139, 2.098, 2.056, 2.006, 1.965, 1.921, 1.883, 1.851, 1.823, 1.799, 1.783, 1.767, 1.759, 1.758, 1.758, 1.767, 1.783, 1.798, 1.825, 1.851, 1.883, 1.919, 1.959, 2.004, 2.049, 2.094, 2.136, 2.167, 2.187, 2.189, + 2.179, 2.163, 2.131, 2.087, 2.041, 1.994, 1.948, 1.907, 1.871, 1.835, 1.806, 1.784, 1.767, 1.754, 1.744, 1.742, 1.742, 1.752, 1.767, 1.783, 1.808, 1.838, 1.869, 1.905, 1.945, 1.989, 2.036, 2.083, 2.128, 2.159, 2.183, 2.187, + 2.178, 2.161, 2.126, 2.082, 2.032, 1.982, 1.936, 1.896, 1.857, 1.823, 1.795, 1.772, 1.754, 1.744, 1.732, 1.731, 1.732, 1.742, 1.752, 1.771, 1.796, 1.824, 1.857, 1.895, 1.934, 1.977, 2.024, 2.071, 2.116, 2.154, 2.181, 2.185, + 2.177, 2.157, 2.121, 2.074, 2.025, 1.973, 1.927, 1.886, 1.849, 1.815, 1.787, 1.765, 1.746, 1.732, 1.725, 1.722, 1.724, 1.732, 1.743, 1.762, 1.786, 1.813, 1.848, 1.886, 1.924, 1.969, 2.017, 2.066, 2.111, 2.153, 2.179, 2.183, + 2.177, 2.155, 2.119, 2.072, 2.022, 1.969, 1.925, 1.881, 1.844, 1.811, 1.782, 1.758, 1.739, 1.725, 1.721, 1.717, 1.721, 1.724, 1.739, 1.757, 1.781, 1.809, 1.842, 1.879, 1.921, 1.965, 2.012, 2.062, 2.108, 2.151, 2.179, 2.182, + 2.177, 2.156, 2.121, 2.071, 2.021, 1.968, 1.922, 1.879, 1.842, 1.811, 1.781, 1.757, 1.739, 1.725, 1.717, 1.715, 1.715, 1.723, 1.737, 1.757, 1.779, 1.808, 1.841, 1.877, 1.918, 1.963, 2.011, 2.061, 2.107, 2.148, 2.179, 2.183, + 2.178, 2.157, 2.121, 2.072, 2.021, 1.969, 1.922, 1.881, 1.842, 1.811, 1.781, 1.758, 1.739, 1.726, 1.718, 1.717, 1.718, 1.723, 1.737, 1.757, 1.781, 1.809, 1.841, 1.877, 1.918, 1.964, 2.012, 2.061, 2.108, 2.149, 2.179, 2.183, + 2.178, 2.159, 2.124, 2.074, 2.024, 1.974, 1.926, 1.885, 1.847, 1.813, 1.784, 1.762, 1.743, 1.731, 1.725, 1.719, 1.723, 1.728, 1.742, 1.762, 1.785, 1.814, 1.847, 1.881, 1.922, 1.966, 2.017, 2.065, 2.109, 2.151, 2.181, 2.184, + 2.181, 2.163, 2.129, 2.082, 2.032, 1.982, 1.934, 1.891, 1.854, 1.822, 1.794, 1.769, 1.751, 1.739, 1.731, 1.727, 1.728, 1.739, 1.747, 1.768, 1.791, 1.821, 1.852, 1.889, 1.929, 1.972, 2.022, 2.071, 2.117, 2.155, 2.182, 2.189, + 2.184, 2.169, 2.135, 2.091, 2.041, 1.994, 1.947, 1.902, 1.865, 1.833, 1.805, 1.779, 1.762, 1.751, 1.739, 1.739, 1.739, 1.747, 1.761, 1.779, 1.803, 1.831, 1.864, 1.898, 1.941, 1.984, 2.033, 2.079, 2.123, 2.163, 2.188, 2.193, + 2.185, 2.174, 2.142, 2.099, 2.054, 2.004, 1.959, 1.917, 1.879, 1.846, 1.819, 1.794, 1.779, 1.762, 1.754, 1.753, 1.753, 1.761, 1.777, 1.793, 1.816, 1.843, 1.877, 1.913, 1.953, 1.995, 2.043, 2.091, 2.135, 2.169, 2.191, 2.196, + 2.191, 2.179, 2.154, 2.118, 2.069, 2.023, 1.977, 1.935, 1.898, 1.865, 1.834, 1.813, 1.794, 1.779, 1.769, 1.769, 1.769, 1.777, 1.793, 1.809, 1.834, 1.863, 1.895, 1.929, 1.972, 2.015, 2.061, 2.105, 2.145, 2.178, 2.195, 2.199, + 2.197, 2.188, 2.166, 2.129, 2.087, 2.041, 1.997, 1.956, 1.918, 1.884, 1.855, 1.834, 1.813, 1.798, 1.788, 1.788, 1.788, 1.796, 1.809, 1.832, 1.853, 1.881, 1.912, 1.949, 1.991, 2.033, 2.076, 2.119, 2.159, 2.187, 2.202, 2.205, + 2.202, 2.197, 2.176, 2.148, 2.106, 2.065, 2.021, 1.979, 1.943, 1.909, 1.879, 1.855, 1.835, 1.819, 1.811, 1.811, 1.811, 1.818, 1.832, 1.853, 1.875, 1.904, 1.937, 1.972, 2.013, 2.055, 2.097, 2.138, 2.175, 2.197, 2.206, 2.207, + 2.205, 2.202, 2.189, 2.162, 2.126, 2.084, 2.044, 2.004, 1.967, 1.935, 1.907, 1.879, 1.861, 1.845, 1.838, 1.835, 1.835, 1.844, 1.855, 1.875, 1.902, 1.928, 1.961, 1.998, 2.033, 2.076, 2.118, 2.155, 2.186, 2.205, 2.208, 2.208, + 2.207, 2.205, 2.195, 2.175, 2.145, 2.108, 2.069, 2.029, 1.996, 1.963, 1.934, 1.908, 1.885, 1.872, 1.864, 1.863, 1.863, 1.869, 1.884, 1.902, 1.928, 1.956, 1.989, 2.023, 2.059, 2.099, 2.137, 2.172, 2.199, 2.212, 2.213, 2.209, + 2.207, 2.207, 2.203, 2.188, 2.162, 2.128, 2.094, 2.058, 2.023, 1.993, 1.963, 1.936, 1.916, 1.899, 1.893, 1.892, 1.893, 1.899, 1.912, 1.929, 1.956, 1.986, 2.016, 2.049, 2.084, 2.121, 2.156, 2.187, 2.208, 2.215, 2.215, 2.208, + 2.205, 2.208, 2.209, 2.199, 2.178, 2.149, 2.117, 2.083, 2.052, 2.023, 1.993, 1.967, 1.947, 1.933, 1.925, 1.922, 1.922, 1.929, 1.943, 1.961, 1.986, 2.015, 2.045, 2.076, 2.109, 2.143, 2.173, 2.198, 2.214, 2.218, 2.216, 2.205, + 2.201, 2.207, 2.211, 2.211, 2.193, 2.168, 2.141, 2.112, 2.082, 2.052, 2.025, 2.001, 1.981, 1.967, 1.959, 1.958, 1.958, 1.967, 1.975, 1.992, 2.018, 2.046, 2.076, 2.105, 2.136, 2.163, 2.189, 2.208, 2.217, 2.217, 2.212, 2.203, + 2.194, 2.204, 2.212, 2.213, 2.203, 2.187, 2.165, 2.139, 2.112, 2.083, 2.055, 2.034, 2.016, 2.001, 1.993, 1.993, 1.994, 1.999, 2.011, 2.027, 2.051, 2.077, 2.105, 2.133, 2.158, 2.181, 2.202, 2.217, 2.218, 2.218, 2.206, 2.193, + 2.185, 2.198, 2.213, 2.214, 2.212, 2.201, 2.184, 2.163, 2.135, 2.111, 2.089, 2.071, 2.052, 2.039, 2.032, 2.031, 2.031, 2.036, 2.048, 2.065, 2.085, 2.106, 2.131, 2.155, 2.178, 2.198, 2.212, 2.219, 2.219, 2.215, 2.201, 2.185, + 2.176, 2.191, 2.208, 2.217, 2.216, 2.205, 2.195, 2.177, 2.156, 2.133, 2.109, 2.089, 2.071, 2.055, 2.053, 2.053, 2.053, 2.057, 2.065, 2.085, 2.105, 2.123, 2.149, 2.171, 2.192, 2.205, 2.217, 2.219, 2.219, 2.202, 2.185, 2.181 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 2.518, 2.513, 2.503, 2.496, 2.488, 2.484, 2.485, 2.485, 2.486, 2.487, 2.487, 2.489, 2.494, 2.496, 2.496, 2.497, 2.499, 2.499, 2.496, 2.495, 2.492, 2.491, 2.491, 2.491, 2.492, 2.493, 2.495, 2.501, 2.508, 2.516, 2.528, 2.533, + 2.515, 2.508, 2.495, 2.487, 2.483, 2.481, 2.482, 2.483, 2.485, 2.487, 2.489, 2.491, 2.495, 2.497, 2.498, 2.501, 2.502, 2.502, 2.499, 2.496, 2.494, 2.491, 2.491, 2.489, 2.489, 2.491, 2.493, 2.496, 2.502, 2.511, 2.521, 2.531, + 2.507, 2.495, 2.486, 2.482, 2.478, 2.477, 2.481, 2.482, 2.484, 2.488, 2.491, 2.495, 2.499, 2.502, 2.506, 2.508, 2.509, 2.508, 2.505, 2.501, 2.497, 2.493, 2.491, 2.489, 2.488, 2.489, 2.489, 2.492, 2.496, 2.501, 2.511, 2.524, + 2.501, 2.487, 2.482, 2.481, 2.478, 2.477, 2.481, 2.483, 2.487, 2.491, 2.501, 2.503, 2.509, 2.511, 2.518, 2.519, 2.519, 2.519, 2.516, 2.509, 2.504, 2.498, 2.495, 2.493, 2.489, 2.489, 2.488, 2.489, 2.492, 2.498, 2.505, 2.523, + 2.499, 2.484, 2.481, 2.476, 2.476, 2.476, 2.481, 2.485, 2.492, 2.501, 2.509, 2.514, 2.519, 2.524, 2.528, 2.531, 2.533, 2.533, 2.525, 2.519, 2.514, 2.507, 2.501, 2.497, 2.493, 2.489, 2.489, 2.488, 2.491, 2.494, 2.501, 2.514, + 2.497, 2.483, 2.478, 2.476, 2.476, 2.478, 2.482, 2.491, 2.499, 2.509, 2.515, 2.522, 2.528, 2.535, 2.539, 2.541, 2.543, 2.542, 2.539, 2.529, 2.522, 2.516, 2.507, 2.502, 2.497, 2.491, 2.489, 2.488, 2.489, 2.492, 2.498, 2.514, + 2.492, 2.479, 2.476, 2.475, 2.476, 2.481, 2.488, 2.496, 2.505, 2.516, 2.524, 2.532, 2.541, 2.545, 2.552, 2.554, 2.554, 2.554, 2.548, 2.541, 2.532, 2.522, 2.516, 2.507, 2.502, 2.494, 2.491, 2.489, 2.489, 2.492, 2.494, 2.511, + 2.491, 2.479, 2.476, 2.477, 2.478, 2.482, 2.491, 2.502, 2.514, 2.524, 2.533, 2.543, 2.548, 2.555, 2.562, 2.566, 2.567, 2.562, 2.557, 2.551, 2.541, 2.531, 2.523, 2.512, 2.506, 2.498, 2.493, 2.491, 2.491, 2.491, 2.493, 2.507, + 2.489, 2.478, 2.476, 2.477, 2.481, 2.485, 2.494, 2.507, 2.517, 2.529, 2.542, 2.548, 2.557, 2.563, 2.567, 2.571, 2.572, 2.571, 2.565, 2.558, 2.549, 2.538, 2.528, 2.521, 2.509, 2.501, 2.494, 2.492, 2.491, 2.491, 2.491, 2.505, + 2.488, 2.478, 2.477, 2.478, 2.482, 2.489, 2.499, 2.509, 2.523, 2.538, 2.548, 2.556, 2.563, 2.568, 2.573, 2.577, 2.578, 2.577, 2.573, 2.564, 2.555, 2.543, 2.535, 2.524, 2.515, 2.504, 2.495, 2.492, 2.489, 2.488, 2.489, 2.501, + 2.486, 2.476, 2.475, 2.477, 2.483, 2.491, 2.503, 2.515, 2.529, 2.542, 2.553, 2.562, 2.568, 2.574, 2.581, 2.583, 2.584, 2.581, 2.578, 2.571, 2.562, 2.551, 2.539, 2.531, 2.517, 2.508, 2.497, 2.492, 2.488, 2.487, 2.489, 2.498, + 2.486, 2.476, 2.475, 2.479, 2.484, 2.492, 2.504, 2.519, 2.533, 2.544, 2.557, 2.566, 2.573, 2.581, 2.584, 2.588, 2.588, 2.586, 2.581, 2.575, 2.567, 2.555, 2.546, 2.534, 2.517, 2.509, 2.499, 2.492, 2.489, 2.485, 2.488, 2.497, + 2.487, 2.476, 2.476, 2.479, 2.486, 2.494, 2.506, 2.521, 2.535, 2.549, 2.559, 2.571, 2.578, 2.583, 2.589, 2.591, 2.591, 2.591, 2.587, 2.579, 2.571, 2.559, 2.551, 2.538, 2.523, 2.513, 2.503, 2.493, 2.489, 2.486, 2.487, 2.499, + 2.486, 2.475, 2.475, 2.479, 2.486, 2.495, 2.509, 2.525, 2.541, 2.555, 2.563, 2.573, 2.582, 2.588, 2.591, 2.594, 2.595, 2.592, 2.591, 2.585, 2.574, 2.564, 2.552, 2.541, 2.525, 2.514, 2.503, 2.493, 2.489, 2.486, 2.486, 2.501, + 2.486, 2.475, 2.475, 2.479, 2.488, 2.497, 2.509, 2.526, 2.542, 2.556, 2.564, 2.575, 2.584, 2.591, 2.595, 2.596, 2.597, 2.595, 2.592, 2.587, 2.577, 2.568, 2.554, 2.542, 2.527, 2.515, 2.504, 2.494, 2.491, 2.487, 2.487, 2.505, + 2.484, 2.476, 2.475, 2.478, 2.488, 2.498, 2.509, 2.526, 2.542, 2.555, 2.565, 2.576, 2.584, 2.589, 2.595, 2.598, 2.598, 2.597, 2.593, 2.587, 2.578, 2.569, 2.556, 2.543, 2.528, 2.515, 2.504, 2.494, 2.489, 2.485, 2.485, 2.501, + 2.484, 2.475, 2.475, 2.478, 2.489, 2.498, 2.509, 2.524, 2.539, 2.553, 2.565, 2.576, 2.584, 2.589, 2.594, 2.597, 2.597, 2.596, 2.593, 2.587, 2.577, 2.569, 2.555, 2.543, 2.529, 2.515, 2.503, 2.496, 2.491, 2.485, 2.486, 2.497, + 2.484, 2.474, 2.474, 2.479, 2.487, 2.497, 2.509, 2.523, 2.539, 2.551, 2.563, 2.574, 2.581, 2.587, 2.592, 2.595, 2.596, 2.595, 2.591, 2.584, 2.574, 2.567, 2.554, 2.541, 2.526, 2.514, 2.503, 2.495, 2.489, 2.485, 2.486, 2.497, + 2.484, 2.475, 2.475, 2.478, 2.485, 2.494, 2.507, 2.522, 2.535, 2.546, 2.559, 2.568, 2.579, 2.584, 2.589, 2.592, 2.593, 2.592, 2.588, 2.579, 2.571, 2.562, 2.551, 2.537, 2.524, 2.514, 2.501, 2.493, 2.489, 2.486, 2.487, 2.498, + 2.485, 2.476, 2.475, 2.477, 2.485, 2.491, 2.506, 2.519, 2.531, 2.544, 2.555, 2.563, 2.571, 2.581, 2.584, 2.589, 2.589, 2.588, 2.583, 2.576, 2.566, 2.555, 2.546, 2.534, 2.522, 2.511, 2.499, 2.491, 2.488, 2.486, 2.487, 2.502, + 2.487, 2.477, 2.475, 2.477, 2.483, 2.489, 2.503, 2.515, 2.525, 2.541, 2.551, 2.559, 2.567, 2.573, 2.579, 2.582, 2.583, 2.582, 2.576, 2.569, 2.562, 2.549, 2.542, 2.527, 2.518, 2.505, 2.497, 2.491, 2.489, 2.487, 2.487, 2.502, + 2.487, 2.478, 2.475, 2.477, 2.482, 2.489, 2.497, 2.512, 2.522, 2.536, 2.544, 2.551, 2.562, 2.566, 2.573, 2.578, 2.578, 2.575, 2.571, 2.564, 2.556, 2.548, 2.536, 2.523, 2.513, 2.503, 2.493, 2.489, 2.487, 2.486, 2.487, 2.502, + 2.488, 2.479, 2.477, 2.478, 2.482, 2.488, 2.496, 2.505, 2.516, 2.528, 2.538, 2.547, 2.553, 2.561, 2.565, 2.569, 2.569, 2.568, 2.564, 2.558, 2.549, 2.541, 2.531, 2.517, 2.509, 2.499, 2.492, 2.488, 2.486, 2.484, 2.486, 2.503, + 2.492, 2.482, 2.479, 2.479, 2.482, 2.487, 2.491, 2.501, 2.512, 2.523, 2.531, 2.541, 2.549, 2.552, 2.558, 2.561, 2.562, 2.559, 2.558, 2.552, 2.542, 2.535, 2.525, 2.514, 2.505, 2.497, 2.491, 2.486, 2.485, 2.484, 2.487, 2.503, + 2.495, 2.483, 2.479, 2.479, 2.482, 2.487, 2.491, 2.498, 2.508, 2.515, 2.526, 2.533, 2.541, 2.547, 2.551, 2.554, 2.555, 2.554, 2.552, 2.541, 2.537, 2.527, 2.519, 2.507, 2.502, 2.495, 2.488, 2.485, 2.484, 2.485, 2.488, 2.503, + 2.499, 2.485, 2.483, 2.481, 2.482, 2.486, 2.489, 2.494, 2.504, 2.511, 2.519, 2.527, 2.531, 2.539, 2.542, 2.546, 2.546, 2.545, 2.539, 2.535, 2.527, 2.522, 2.509, 2.505, 2.497, 2.491, 2.486, 2.485, 2.485, 2.487, 2.491, 2.506, + 2.499, 2.489, 2.483, 2.481, 2.481, 2.483, 2.488, 2.491, 2.499, 2.506, 2.512, 2.519, 2.524, 2.529, 2.535, 2.537, 2.536, 2.534, 2.532, 2.525, 2.522, 2.514, 2.506, 2.499, 2.492, 2.489, 2.485, 2.484, 2.485, 2.488, 2.492, 2.506, + 2.507, 2.494, 2.486, 2.483, 2.482, 2.482, 2.486, 2.488, 2.495, 2.501, 2.507, 2.511, 2.517, 2.519, 2.523, 2.525, 2.525, 2.523, 2.523, 2.521, 2.514, 2.506, 2.502, 2.496, 2.491, 2.488, 2.485, 2.485, 2.487, 2.489, 2.496, 2.516, + 2.511, 2.503, 2.489, 2.486, 2.485, 2.485, 2.485, 2.487, 2.489, 2.495, 2.501, 2.505, 2.509, 2.514, 2.517, 2.519, 2.518, 2.517, 2.515, 2.511, 2.505, 2.501, 2.495, 2.492, 2.488, 2.486, 2.485, 2.486, 2.488, 2.492, 2.499, 2.519, + 2.517, 2.505, 2.494, 2.489, 2.487, 2.486, 2.486, 2.486, 2.489, 2.491, 2.496, 2.499, 2.503, 2.506, 2.508, 2.509, 2.511, 2.509, 2.507, 2.503, 2.501, 2.496, 2.493, 2.489, 2.485, 2.485, 2.486, 2.487, 2.491, 2.495, 2.505, 2.526, + 2.526, 2.516, 2.504, 2.494, 2.493, 2.489, 2.489, 2.489, 2.489, 2.491, 2.496, 2.498, 2.501, 2.504, 2.506, 2.506, 2.506, 2.505, 2.503, 2.501, 2.499, 2.496, 2.494, 2.491, 2.487, 2.486, 2.489, 2.492, 2.497, 2.505, 2.517, 2.528, + 2.529, 2.526, 2.508, 2.502, 2.501, 2.498, 2.495, 2.495, 2.495, 2.495, 2.497, 2.499, 2.501, 2.503, 2.504, 2.506, 2.505, 2.505, 2.503, 2.501, 2.499, 2.496, 2.495, 2.494, 2.492, 2.494, 2.494, 2.498, 2.504, 2.513, 2.525, 2.536 + ] + }, + { + "ct": 5000, + "table": + [ + 1.427, 1.425, 1.423, 1.422, 1.421, 1.421, 1.421, 1.421, 1.421, 1.421, 1.422, 1.423, 1.424, 1.425, 1.426, 1.426, 1.426, 1.425, 1.425, 1.424, 1.422, 1.421, 1.421, 1.421, 1.421, 1.422, 1.422, 1.422, 1.424, 1.424, 1.426, 1.428, + 1.426, 1.424, 1.422, 1.421, 1.419, 1.419, 1.419, 1.421, 1.421, 1.422, 1.423, 1.424, 1.425, 1.426, 1.427, 1.427, 1.427, 1.426, 1.425, 1.424, 1.422, 1.421, 1.421, 1.421, 1.421, 1.421, 1.421, 1.421, 1.421, 1.422, 1.424, 1.427, + 1.423, 1.421, 1.421, 1.419, 1.419, 1.418, 1.419, 1.419, 1.421, 1.423, 1.425, 1.426, 1.428, 1.429, 1.431, 1.431, 1.431, 1.431, 1.429, 1.426, 1.424, 1.422, 1.421, 1.421, 1.421, 1.419, 1.419, 1.419, 1.421, 1.421, 1.422, 1.425, + 1.422, 1.419, 1.419, 1.419, 1.418, 1.418, 1.419, 1.421, 1.422, 1.426, 1.428, 1.429, 1.433, 1.434, 1.436, 1.436, 1.436, 1.434, 1.432, 1.429, 1.426, 1.424, 1.423, 1.422, 1.421, 1.419, 1.419, 1.419, 1.419, 1.419, 1.421, 1.425, + 1.422, 1.419, 1.419, 1.418, 1.418, 1.419, 1.419, 1.422, 1.425, 1.429, 1.432, 1.435, 1.436, 1.438, 1.439, 1.439, 1.441, 1.439, 1.435, 1.433, 1.429, 1.427, 1.425, 1.423, 1.422, 1.419, 1.419, 1.418, 1.418, 1.418, 1.419, 1.425, + 1.422, 1.419, 1.418, 1.418, 1.418, 1.419, 1.421, 1.424, 1.428, 1.432, 1.436, 1.437, 1.439, 1.442, 1.443, 1.445, 1.444, 1.443, 1.441, 1.436, 1.434, 1.431, 1.427, 1.425, 1.422, 1.421, 1.419, 1.418, 1.418, 1.418, 1.419, 1.424, + 1.422, 1.418, 1.417, 1.418, 1.419, 1.421, 1.423, 1.427, 1.431, 1.436, 1.438, 1.442, 1.444, 1.446, 1.448, 1.449, 1.448, 1.446, 1.445, 1.441, 1.436, 1.434, 1.429, 1.427, 1.423, 1.421, 1.419, 1.418, 1.418, 1.418, 1.418, 1.423, + 1.421, 1.418, 1.418, 1.418, 1.419, 1.421, 1.424, 1.429, 1.434, 1.438, 1.442, 1.445, 1.447, 1.449, 1.451, 1.452, 1.452, 1.449, 1.447, 1.445, 1.441, 1.436, 1.433, 1.429, 1.425, 1.422, 1.419, 1.419, 1.418, 1.417, 1.418, 1.423, + 1.421, 1.418, 1.418, 1.419, 1.419, 1.423, 1.426, 1.432, 1.436, 1.441, 1.445, 1.448, 1.449, 1.452, 1.453, 1.454, 1.454, 1.453, 1.451, 1.447, 1.444, 1.439, 1.433, 1.431, 1.427, 1.422, 1.421, 1.419, 1.418, 1.417, 1.418, 1.423, + 1.421, 1.418, 1.418, 1.419, 1.421, 1.423, 1.428, 1.433, 1.439, 1.443, 1.448, 1.449, 1.453, 1.454, 1.455, 1.456, 1.456, 1.454, 1.453, 1.449, 1.446, 1.441, 1.437, 1.433, 1.429, 1.423, 1.421, 1.419, 1.418, 1.416, 1.417, 1.423, + 1.421, 1.417, 1.417, 1.419, 1.422, 1.424, 1.429, 1.435, 1.441, 1.444, 1.449, 1.453, 1.454, 1.456, 1.458, 1.459, 1.458, 1.456, 1.454, 1.451, 1.448, 1.442, 1.439, 1.435, 1.429, 1.426, 1.421, 1.419, 1.418, 1.416, 1.417, 1.422, + 1.419, 1.418, 1.417, 1.419, 1.422, 1.425, 1.429, 1.436, 1.442, 1.446, 1.451, 1.454, 1.456, 1.458, 1.461, 1.461, 1.461, 1.459, 1.456, 1.453, 1.451, 1.446, 1.441, 1.436, 1.431, 1.427, 1.422, 1.419, 1.418, 1.416, 1.417, 1.422, + 1.419, 1.418, 1.418, 1.421, 1.423, 1.426, 1.431, 1.437, 1.444, 1.449, 1.452, 1.456, 1.458, 1.461, 1.462, 1.463, 1.463, 1.461, 1.458, 1.454, 1.452, 1.447, 1.443, 1.438, 1.432, 1.428, 1.423, 1.421, 1.419, 1.417, 1.417, 1.421, + 1.419, 1.418, 1.417, 1.421, 1.423, 1.428, 1.432, 1.439, 1.445, 1.451, 1.453, 1.457, 1.459, 1.462, 1.464, 1.465, 1.465, 1.463, 1.461, 1.457, 1.453, 1.449, 1.444, 1.441, 1.432, 1.429, 1.425, 1.421, 1.419, 1.417, 1.418, 1.422, + 1.418, 1.417, 1.417, 1.419, 1.423, 1.428, 1.433, 1.439, 1.446, 1.451, 1.453, 1.457, 1.461, 1.464, 1.465, 1.466, 1.466, 1.464, 1.462, 1.459, 1.454, 1.451, 1.445, 1.441, 1.436, 1.429, 1.425, 1.422, 1.421, 1.417, 1.417, 1.423, + 1.417, 1.416, 1.416, 1.419, 1.423, 1.428, 1.433, 1.441, 1.446, 1.451, 1.454, 1.458, 1.461, 1.463, 1.465, 1.466, 1.466, 1.465, 1.463, 1.459, 1.454, 1.451, 1.446, 1.441, 1.437, 1.431, 1.426, 1.422, 1.421, 1.418, 1.418, 1.423, + 1.417, 1.416, 1.417, 1.418, 1.423, 1.428, 1.433, 1.439, 1.445, 1.451, 1.453, 1.457, 1.461, 1.463, 1.465, 1.466, 1.466, 1.464, 1.462, 1.459, 1.454, 1.451, 1.446, 1.441, 1.437, 1.431, 1.426, 1.422, 1.419, 1.417, 1.417, 1.422, + 1.417, 1.416, 1.416, 1.418, 1.422, 1.428, 1.433, 1.438, 1.444, 1.449, 1.453, 1.456, 1.459, 1.462, 1.464, 1.465, 1.465, 1.463, 1.461, 1.458, 1.453, 1.449, 1.445, 1.441, 1.435, 1.429, 1.426, 1.421, 1.419, 1.417, 1.417, 1.422, + 1.418, 1.416, 1.416, 1.418, 1.421, 1.426, 1.432, 1.438, 1.443, 1.447, 1.451, 1.454, 1.458, 1.459, 1.462, 1.463, 1.463, 1.462, 1.459, 1.455, 1.451, 1.447, 1.443, 1.439, 1.434, 1.429, 1.425, 1.421, 1.419, 1.417, 1.417, 1.422, + 1.418, 1.416, 1.416, 1.418, 1.421, 1.425, 1.431, 1.435, 1.442, 1.445, 1.449, 1.452, 1.455, 1.458, 1.458, 1.461, 1.461, 1.459, 1.456, 1.453, 1.449, 1.445, 1.442, 1.436, 1.433, 1.427, 1.425, 1.421, 1.419, 1.418, 1.418, 1.422, + 1.419, 1.416, 1.415, 1.417, 1.419, 1.424, 1.429, 1.434, 1.439, 1.443, 1.446, 1.449, 1.452, 1.454, 1.456, 1.457, 1.457, 1.456, 1.453, 1.451, 1.447, 1.443, 1.441, 1.435, 1.431, 1.426, 1.424, 1.421, 1.419, 1.418, 1.418, 1.422, + 1.419, 1.416, 1.415, 1.416, 1.419, 1.422, 1.426, 1.433, 1.437, 1.441, 1.444, 1.447, 1.449, 1.452, 1.453, 1.455, 1.455, 1.453, 1.451, 1.447, 1.444, 1.441, 1.438, 1.432, 1.428, 1.424, 1.421, 1.419, 1.418, 1.417, 1.417, 1.421, + 1.419, 1.416, 1.415, 1.416, 1.418, 1.421, 1.425, 1.431, 1.435, 1.438, 1.442, 1.445, 1.446, 1.449, 1.451, 1.451, 1.451, 1.451, 1.447, 1.445, 1.443, 1.439, 1.434, 1.431, 1.427, 1.422, 1.421, 1.418, 1.417, 1.417, 1.417, 1.421, + 1.418, 1.416, 1.415, 1.416, 1.417, 1.421, 1.423, 1.428, 1.433, 1.437, 1.439, 1.442, 1.444, 1.446, 1.448, 1.449, 1.449, 1.447, 1.445, 1.443, 1.439, 1.437, 1.432, 1.429, 1.425, 1.422, 1.419, 1.417, 1.417, 1.416, 1.416, 1.419, + 1.418, 1.416, 1.416, 1.416, 1.417, 1.421, 1.422, 1.426, 1.429, 1.433, 1.436, 1.438, 1.441, 1.443, 1.445, 1.446, 1.445, 1.445, 1.443, 1.439, 1.437, 1.434, 1.431, 1.427, 1.424, 1.421, 1.419, 1.417, 1.417, 1.416, 1.416, 1.421, + 1.419, 1.417, 1.416, 1.416, 1.417, 1.421, 1.422, 1.424, 1.427, 1.429, 1.432, 1.436, 1.437, 1.439, 1.442, 1.443, 1.443, 1.441, 1.439, 1.437, 1.434, 1.431, 1.429, 1.425, 1.422, 1.421, 1.419, 1.417, 1.416, 1.416, 1.417, 1.419, + 1.421, 1.418, 1.416, 1.417, 1.418, 1.421, 1.421, 1.423, 1.424, 1.427, 1.429, 1.432, 1.434, 1.436, 1.438, 1.439, 1.439, 1.438, 1.436, 1.434, 1.431, 1.429, 1.426, 1.423, 1.422, 1.421, 1.418, 1.417, 1.417, 1.417, 1.417, 1.421, + 1.423, 1.419, 1.418, 1.418, 1.419, 1.419, 1.421, 1.422, 1.423, 1.424, 1.427, 1.429, 1.432, 1.432, 1.434, 1.435, 1.435, 1.434, 1.433, 1.431, 1.429, 1.426, 1.424, 1.422, 1.421, 1.419, 1.418, 1.417, 1.417, 1.417, 1.418, 1.421, + 1.425, 1.421, 1.419, 1.419, 1.419, 1.421, 1.421, 1.421, 1.421, 1.423, 1.424, 1.426, 1.428, 1.431, 1.431, 1.432, 1.432, 1.431, 1.431, 1.428, 1.425, 1.425, 1.422, 1.421, 1.419, 1.419, 1.418, 1.418, 1.418, 1.418, 1.419, 1.425, + 1.426, 1.422, 1.419, 1.419, 1.419, 1.419, 1.419, 1.419, 1.419, 1.421, 1.422, 1.424, 1.426, 1.427, 1.428, 1.429, 1.429, 1.429, 1.427, 1.424, 1.423, 1.422, 1.421, 1.419, 1.418, 1.418, 1.418, 1.418, 1.418, 1.418, 1.419, 1.426, + 1.428, 1.425, 1.421, 1.421, 1.421, 1.421, 1.421, 1.419, 1.419, 1.421, 1.422, 1.423, 1.424, 1.426, 1.426, 1.426, 1.426, 1.425, 1.424, 1.424, 1.422, 1.422, 1.421, 1.419, 1.419, 1.419, 1.419, 1.419, 1.419, 1.419, 1.423, 1.426, + 1.429, 1.427, 1.424, 1.422, 1.422, 1.422, 1.421, 1.421, 1.421, 1.422, 1.422, 1.422, 1.424, 1.425, 1.426, 1.426, 1.425, 1.425, 1.424, 1.423, 1.422, 1.422, 1.421, 1.421, 1.421, 1.421, 1.419, 1.419, 1.421, 1.422, 1.424, 1.426 + ] + } + ], + "luminance_lut": + [ + 2.964, 2.872, 2.691, 2.544, 2.416, 2.302, 2.196, 2.093, 2.006, 1.928, 1.852, 1.801, 1.769, 1.752, 1.743, 1.743, 1.743, 1.746, 1.759, 1.784, 1.824, 1.888, 1.968, 2.052, 2.149, 2.253, 2.359, 2.483, 2.626, 2.785, 2.988, 3.051, + 2.872, 2.748, 2.583, 2.442, 2.313, 2.201, 2.104, 2.012, 1.928, 1.852, 1.791, 1.742, 1.701, 1.671, 1.651, 1.643, 1.643, 1.659, 1.685, 1.721, 1.768, 1.824, 1.888, 1.971, 2.068, 2.152, 2.259, 2.381, 2.514, 2.669, 2.853, 2.988, + 2.761, 2.655, 2.497, 2.356, 2.226, 2.114, 2.012, 1.928, 1.845, 1.769, 1.707, 1.653, 1.612, 1.583, 1.562, 1.556, 1.556, 1.572, 1.599, 1.635, 1.681, 1.742, 1.806, 1.888, 1.971, 2.068, 2.175, 2.292, 2.431, 2.576, 2.747, 2.853, + 2.679, 2.571, 2.415, 2.275, 2.151, 2.035, 1.936, 1.845, 1.769, 1.689, 1.623, 1.572, 1.532, 1.501, 1.481, 1.473, 1.473, 1.492, 1.517, 1.556, 1.599, 1.659, 1.731, 1.806, 1.895, 1.992, 2.101, 2.218, 2.349, 2.493, 2.664, 2.753, + 2.609, 2.492, 2.339, 2.204, 2.079, 1.971, 1.865, 1.772, 1.689, 1.619, 1.551, 1.499, 1.457, 1.423, 1.405, 1.397, 1.397, 1.411, 1.438, 1.477, 1.525, 1.585, 1.659, 1.731, 1.823, 1.922, 2.027, 2.148, 2.275, 2.422, 2.586, 2.683, + 2.545, 2.426, 2.279, 2.139, 2.014, 1.903, 1.799, 1.702, 1.619, 1.551, 1.482, 1.427, 1.385, 1.353, 1.331, 1.325, 1.325, 1.338, 1.364, 1.403, 1.455, 1.522, 1.585, 1.665, 1.757, 1.858, 1.963, 2.081, 2.207, 2.356, 2.518, 2.615, + 2.489, 2.367, 2.218, 2.079, 1.956, 1.844, 1.739, 1.642, 1.559, 1.482, 1.426, 1.363, 1.321, 1.287, 1.266, 1.259, 1.259, 1.274, 1.301, 1.339, 1.395, 1.455, 1.523, 1.606, 1.697, 1.797, 1.905, 2.024, 2.154, 2.296, 2.455, 2.563, + 2.439, 2.316, 2.164, 2.028, 1.906, 1.793, 1.686, 1.589, 1.505, 1.427, 1.363, 1.308, 1.261, 1.229, 1.207, 1.202, 1.202, 1.215, 1.242, 1.283, 1.339, 1.395, 1.467, 1.551, 1.639, 1.742, 1.851, 1.972, 2.104, 2.243, 2.402, 2.515, + 2.398, 2.262, 2.116, 1.982, 1.861, 1.745, 1.639, 1.541, 1.456, 1.377, 1.308, 1.261, 1.208, 1.177, 1.157, 1.153, 1.153, 1.167, 1.191, 1.233, 1.283, 1.343, 1.418, 1.499, 1.591, 1.696, 1.804, 1.928, 2.057, 2.194, 2.352, 2.471, + 2.363, 2.222, 2.078, 1.942, 1.818, 1.706, 1.597, 1.501, 1.412, 1.334, 1.266, 1.208, 1.171, 1.134, 1.113, 1.109, 1.109, 1.123, 1.149, 1.191, 1.233, 1.296, 1.371, 1.457, 1.546, 1.654, 1.768, 1.886, 2.014, 2.155, 2.312, 2.436, + 2.334, 2.188, 2.042, 1.909, 1.783, 1.668, 1.561, 1.464, 1.374, 1.295, 1.228, 1.171, 1.134, 1.098, 1.076, 1.072, 1.072, 1.087, 1.119, 1.149, 1.196, 1.259, 1.332, 1.419, 1.514, 1.616, 1.728, 1.849, 1.981, 2.123, 2.276, 2.406, + 2.306, 2.159, 2.015, 1.881, 1.753, 1.639, 1.533, 1.434, 1.341, 1.263, 1.195, 1.139, 1.098, 1.074, 1.046, 1.044, 1.045, 1.059, 1.087, 1.119, 1.165, 1.227, 1.302, 1.387, 1.482, 1.586, 1.698, 1.819, 1.953, 2.093, 2.248, 2.383, + 2.291, 2.141, 1.991, 1.856, 1.732, 1.615, 1.508, 1.409, 1.318, 1.238, 1.171, 1.114, 1.074, 1.046, 1.027, 1.023, 1.025, 1.043, 1.059, 1.095, 1.142, 1.203, 1.278, 1.362, 1.456, 1.559, 1.673, 1.796, 1.928, 2.071, 2.225, 2.359, + 2.279, 2.118, 1.972, 1.839, 1.715, 1.599, 1.488, 1.389, 1.298, 1.219, 1.153, 1.097, 1.057, 1.027, 1.018, 1.009, 1.013, 1.025, 1.044, 1.078, 1.125, 1.186, 1.258, 1.342, 1.438, 1.541, 1.655, 1.779, 1.909, 2.053, 2.211, 2.351, + 2.274, 2.108, 1.963, 1.831, 1.706, 1.588, 1.477, 1.376, 1.288, 1.207, 1.139, 1.086, 1.049, 1.021, 1.005, 1.002, 1.004, 1.013, 1.035, 1.069, 1.116, 1.176, 1.246, 1.331, 1.427, 1.531, 1.645, 1.767, 1.899, 2.045, 2.197, 2.351, + 2.274, 2.106, 1.961, 1.827, 1.701, 1.585, 1.474, 1.374, 1.285, 1.206, 1.139, 1.085, 1.047, 1.019, 1.003, 1.001, 1.001, 1.012, 1.033, 1.067, 1.113, 1.173, 1.245, 1.329, 1.423, 1.529, 1.642, 1.765, 1.897, 2.042, 2.196, 2.349, + 2.274, 2.108, 1.961, 1.827, 1.701, 1.585, 1.474, 1.374, 1.285, 1.206, 1.139, 1.085, 1.047, 1.021, 1.005, 1.001, 1.004, 1.012, 1.033, 1.068, 1.113, 1.173, 1.246, 1.329, 1.423, 1.529, 1.642, 1.766, 1.897, 2.042, 2.198, 2.349, + 2.278, 2.116, 1.968, 1.833, 1.707, 1.591, 1.482, 1.382, 1.291, 1.214, 1.147, 1.091, 1.055, 1.028, 1.016, 1.006, 1.012, 1.018, 1.039, 1.074, 1.121, 1.182, 1.255, 1.339, 1.433, 1.538, 1.651, 1.777, 1.911, 2.051, 2.207, 2.351, + 2.283, 2.127, 1.979, 1.846, 1.723, 1.605, 1.496, 1.397, 1.309, 1.229, 1.162, 1.108, 1.067, 1.041, 1.027, 1.018, 1.018, 1.036, 1.051, 1.087, 1.136, 1.197, 1.269, 1.354, 1.448, 1.554, 1.664, 1.789, 1.922, 2.065, 2.222, 2.365, + 2.298, 2.145, 1.999, 1.865, 1.744, 1.627, 1.518, 1.421, 1.331, 1.251, 1.183, 1.129, 1.087, 1.065, 1.041, 1.036, 1.036, 1.051, 1.074, 1.107, 1.158, 1.219, 1.292, 1.378, 1.471, 1.575, 1.687, 1.809, 1.942, 2.085, 2.239, 2.378, + 2.315, 2.174, 2.024, 1.893, 1.768, 1.652, 1.543, 1.445, 1.355, 1.278, 1.211, 1.155, 1.116, 1.087, 1.066, 1.061, 1.061, 1.074, 1.105, 1.137, 1.186, 1.248, 1.322, 1.405, 1.498, 1.602, 1.713, 1.835, 1.965, 2.109, 2.267, 2.399, + 2.341, 2.206, 2.057, 1.923, 1.799, 1.685, 1.576, 1.479, 1.392, 1.312, 1.244, 1.187, 1.154, 1.116, 1.096, 1.092, 1.092, 1.106, 1.137, 1.173, 1.221, 1.282, 1.356, 1.439, 1.532, 1.635, 1.747, 1.869, 1.997, 2.141, 2.298, 2.425, + 2.375, 2.244, 2.098, 1.965, 1.839, 1.722, 1.614, 1.519, 1.434, 1.355, 1.288, 1.234, 1.187, 1.155, 1.136, 1.132, 1.132, 1.147, 1.173, 1.219, 1.263, 1.324, 1.398, 1.479, 1.571, 1.674, 1.784, 1.904, 2.035, 2.177, 2.336, 2.455, + 2.414, 2.286, 2.144, 2.011, 1.883, 1.767, 1.661, 1.566, 1.479, 1.401, 1.335, 1.286, 1.234, 1.202, 1.183, 1.178, 1.178, 1.195, 1.222, 1.263, 1.313, 1.372, 1.444, 1.526, 1.618, 1.718, 1.827, 1.951, 2.081, 2.221, 2.379, 2.498, + 2.463, 2.339, 2.191, 2.056, 1.931, 1.819, 1.712, 1.616, 1.529, 1.452, 1.392, 1.335, 1.286, 1.254, 1.235, 1.232, 1.232, 1.248, 1.275, 1.313, 1.371, 1.425, 1.495, 1.576, 1.671, 1.768, 1.877, 1.999, 2.128, 2.269, 2.428, 2.541, + 2.514, 2.396, 2.247, 2.112, 1.988, 1.873, 1.766, 1.671, 1.588, 1.513, 1.452, 1.392, 1.348, 1.316, 1.298, 1.292, 1.292, 1.307, 1.336, 1.373, 1.425, 1.486, 1.552, 1.636, 1.728, 1.826, 1.933, 2.051, 2.183, 2.327, 2.488, 2.587, + 2.573, 2.459, 2.307, 2.171, 2.049, 1.931, 1.828, 1.731, 1.649, 1.582, 1.513, 1.459, 1.415, 1.381, 1.363, 1.358, 1.358, 1.373, 1.399, 1.439, 1.486, 1.552, 1.617, 1.696, 1.787, 1.888, 1.995, 2.112, 2.244, 2.391, 2.552, 2.652, + 2.635, 2.525, 2.377, 2.239, 2.111, 1.996, 1.895, 1.799, 1.719, 1.649, 1.582, 1.531, 1.486, 1.454, 1.434, 1.429, 1.429, 1.444, 1.469, 1.507, 1.555, 1.617, 1.692, 1.766, 1.854, 1.954, 2.065, 2.181, 2.313, 2.459, 2.623, 2.722, + 2.714, 2.604, 2.452, 2.313, 2.188, 2.071, 1.966, 1.876, 1.799, 1.719, 1.656, 1.604, 1.562, 1.529, 1.511, 1.504, 1.504, 1.519, 1.544, 1.583, 1.632, 1.692, 1.766, 1.839, 1.929, 2.029, 2.138, 2.259, 2.391, 2.539, 2.712, 2.811, + 2.809, 2.698, 2.537, 2.396, 2.277, 2.163, 2.053, 1.965, 1.876, 1.799, 1.741, 1.688, 1.643, 1.613, 1.592, 1.586, 1.586, 1.601, 1.628, 1.666, 1.715, 1.773, 1.839, 1.927, 2.012, 2.111, 2.222, 2.342, 2.477, 2.625, 2.811, 2.926, + 2.921, 2.809, 2.637, 2.493, 2.376, 2.256, 2.149, 2.053, 1.966, 1.893, 1.832, 1.778, 1.736, 1.708, 1.687, 1.681, 1.681, 1.696, 1.721, 1.757, 1.806, 1.864, 1.929, 2.012, 2.106, 2.199, 2.313, 2.437, 2.577, 2.731, 2.926, 3.051, + 3.029, 2.921, 2.745, 2.591, 2.474, 2.355, 2.246, 2.146, 2.049, 1.966, 1.893, 1.832, 1.799, 1.776, 1.768, 1.768, 1.768, 1.771, 1.783, 1.809, 1.864, 1.929, 2.012, 2.097, 2.195, 2.297, 2.412, 2.539, 2.682, 2.846, 3.051, 3.123 + ], + "sigma": 0.00463, + "sigma_Cb": 0.00149 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "lo_max": 1000, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2498, + "ccm": + [ + 1.58731, -0.18011, -0.40721, + -0.60639, 2.03422, -0.42782, + -0.19612, -1.69203, 2.88815 + ] + }, + { + "ct": 2811, + "ccm": + [ + 1.61593, -0.33164, -0.28429, + -0.55048, 1.97779, -0.42731, + -0.12042, -1.42847, 2.54889 + ] + }, + { + "ct": 2911, + "ccm": + [ + 1.62771, -0.41282, -0.21489, + -0.57991, 2.04176, -0.46186, + -0.07613, -1.13359, 2.20972 + ] + }, + { + "ct": 2919, + "ccm": + [ + 1.62661, -0.37736, -0.24925, + -0.52519, 1.95233, -0.42714, + -0.10842, -1.34929, 2.45771 + ] + }, + { + "ct": 3627, + "ccm": + [ + 1.70385, -0.57231, -0.13154, + -0.47763, 1.85998, -0.38235, + -0.07467, -0.82678, 1.90145 + ] + }, + { + "ct": 4600, + "ccm": + [ + 1.68486, -0.61085, -0.07402, + -0.41927, 2.04016, -0.62089, + -0.08633, -0.67672, 1.76305 + ] + }, + { + "ct": 5716, + "ccm": + [ + 1.80439, -0.73699, -0.06739, + -0.36073, 1.83327, -0.47255, + -0.08378, -0.56403, 1.64781 + ] + }, + { + "ct": 8575, + "ccm": + [ + 1.89357, -0.76427, -0.12931, + -0.27399, 2.15605, -0.88206, + -0.12035, -0.68256, 1.80292 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx290.json b/src/ipa/rpi/pisp/data/imx290.json new file mode 100644 index 000000000..37421e850 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx290.json @@ -0,0 +1,341 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 3840 + } + }, + { + "rpi.dpc": { } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 6813, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 890, + "reference_Y": 12900 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.67 + } + }, + { + "rpi.geq": + { + "offset": 187, + "slope": 0.00842 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "bayes": 0 + } + }, + { + "rpi.agc": + { + "speed": 0.2, + "metering_modes": + { + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + }, + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 10, 30000, 60000 ], + "gain": [ 1.0, 2.0, 8.0 ] + }, + "short": + { + "shutter": [ 10, 5000, 10000, 20000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ] + }, + "long": + { + "shutter": [ 1000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.16, + 10000, 0.16 + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.7, + "luminance_lut": + [ + 2.844, 2.604, 2.365, 2.2, 2.039, 1.916, 1.799, 1.707, 1.622, 1.552, 1.487, 1.435, 1.389, 1.356, 1.332, 1.317, 1.31, 1.308, 1.313, 1.324, 1.344, 1.37, 1.41, 1.454, 1.508, 1.567, 1.641, 1.719, 1.82, 1.925, 2.073, 2.221, + 2.749, 2.521, 2.294, 2.134, 1.979, 1.861, 1.749, 1.661, 1.578, 1.511, 1.448, 1.398, 1.354, 1.322, 1.3, 1.285, 1.278, 1.277, 1.281, 1.292, 1.311, 1.336, 1.374, 1.416, 1.469, 1.526, 1.596, 1.671, 1.77, 1.872, 2.019, 2.166, + 2.654, 2.438, 2.223, 2.069, 1.919, 1.807, 1.7, 1.614, 1.534, 1.469, 1.409, 1.361, 1.318, 1.288, 1.267, 1.254, 1.247, 1.245, 1.25, 1.259, 1.277, 1.302, 1.338, 1.379, 1.43, 1.485, 1.552, 1.623, 1.719, 1.819, 1.965, 2.112, + 2.563, 2.359, 2.155, 2.007, 1.863, 1.755, 1.653, 1.571, 1.493, 1.43, 1.372, 1.325, 1.284, 1.256, 1.236, 1.223, 1.217, 1.216, 1.219, 1.229, 1.246, 1.269, 1.305, 1.344, 1.393, 1.446, 1.51, 1.578, 1.672, 1.77, 1.914, 2.059, + 2.494, 2.299, 2.103, 1.961, 1.822, 1.718, 1.619, 1.538, 1.461, 1.399, 1.343, 1.298, 1.259, 1.232, 1.213, 1.2, 1.194, 1.193, 1.196, 1.205, 1.222, 1.245, 1.279, 1.318, 1.365, 1.416, 1.481, 1.549, 1.641, 1.735, 1.875, 2.015, + 2.425, 2.238, 2.05, 1.914, 1.782, 1.681, 1.585, 1.505, 1.429, 1.369, 1.314, 1.271, 1.234, 1.208, 1.189, 1.177, 1.171, 1.169, 1.173, 1.182, 1.198, 1.221, 1.254, 1.292, 1.338, 1.387, 1.452, 1.519, 1.609, 1.701, 1.836, 1.971, + 2.363, 2.183, 2.003, 1.873, 1.746, 1.648, 1.555, 1.477, 1.401, 1.342, 1.289, 1.247, 1.212, 1.187, 1.168, 1.156, 1.149, 1.148, 1.152, 1.16, 1.177, 1.198, 1.231, 1.267, 1.312, 1.36, 1.425, 1.492, 1.58, 1.671, 1.802, 1.932, + 2.314, 2.14, 1.965, 1.839, 1.716, 1.622, 1.532, 1.454, 1.38, 1.322, 1.27, 1.229, 1.195, 1.169, 1.149, 1.137, 1.129, 1.128, 1.132, 1.142, 1.158, 1.18, 1.21, 1.245, 1.289, 1.336, 1.401, 1.469, 1.557, 1.649, 1.776, 1.903, + 2.264, 2.096, 1.927, 1.805, 1.687, 1.596, 1.509, 1.432, 1.358, 1.301, 1.251, 1.211, 1.177, 1.151, 1.131, 1.117, 1.109, 1.108, 1.113, 1.123, 1.14, 1.161, 1.19, 1.222, 1.265, 1.313, 1.378, 1.445, 1.534, 1.626, 1.75, 1.874, + 2.225, 2.061, 1.897, 1.778, 1.663, 1.574, 1.489, 1.414, 1.341, 1.285, 1.235, 1.196, 1.163, 1.136, 1.115, 1.1, 1.091, 1.089, 1.095, 1.106, 1.124, 1.145, 1.174, 1.205, 1.248, 1.294, 1.359, 1.427, 1.516, 1.606, 1.728, 1.849, + 2.193, 2.033, 1.872, 1.756, 1.642, 1.556, 1.473, 1.399, 1.327, 1.272, 1.224, 1.185, 1.15, 1.123, 1.1, 1.084, 1.074, 1.072, 1.078, 1.09, 1.11, 1.133, 1.161, 1.193, 1.234, 1.28, 1.345, 1.413, 1.501, 1.59, 1.709, 1.828, + 2.161, 2.004, 1.848, 1.734, 1.622, 1.537, 1.457, 1.384, 1.313, 1.26, 1.212, 1.173, 1.138, 1.11, 1.085, 1.068, 1.057, 1.055, 1.062, 1.075, 1.096, 1.12, 1.148, 1.18, 1.221, 1.266, 1.331, 1.399, 1.486, 1.574, 1.69, 1.807, + 2.14, 1.986, 1.832, 1.719, 1.609, 1.525, 1.445, 1.373, 1.304, 1.251, 1.204, 1.165, 1.129, 1.1, 1.074, 1.055, 1.043, 1.041, 1.049, 1.063, 1.086, 1.11, 1.14, 1.172, 1.212, 1.258, 1.323, 1.39, 1.477, 1.566, 1.679, 1.792, + 2.123, 1.971, 1.819, 1.707, 1.598, 1.514, 1.434, 1.364, 1.296, 1.243, 1.197, 1.158, 1.122, 1.091, 1.064, 1.044, 1.031, 1.027, 1.036, 1.052, 1.076, 1.102, 1.132, 1.165, 1.206, 1.251, 1.316, 1.383, 1.471, 1.56, 1.67, 1.78, + 2.106, 1.956, 1.806, 1.695, 1.587, 1.504, 1.424, 1.354, 1.288, 1.236, 1.19, 1.15, 1.114, 1.083, 1.055, 1.033, 1.018, 1.014, 1.024, 1.04, 1.066, 1.094, 1.124, 1.158, 1.199, 1.245, 1.309, 1.376, 1.465, 1.555, 1.661, 1.767, + 2.104, 1.955, 1.805, 1.694, 1.586, 1.502, 1.422, 1.352, 1.285, 1.234, 1.188, 1.149, 1.113, 1.081, 1.053, 1.031, 1.014, 1.011, 1.021, 1.038, 1.064, 1.091, 1.122, 1.156, 1.198, 1.244, 1.308, 1.376, 1.465, 1.555, 1.66, 1.766, + 2.104, 1.955, 1.806, 1.695, 1.586, 1.502, 1.421, 1.351, 1.284, 1.232, 1.187, 1.148, 1.112, 1.08, 1.051, 1.029, 1.012, 1.008, 1.02, 1.036, 1.062, 1.089, 1.12, 1.155, 1.197, 1.244, 1.308, 1.375, 1.465, 1.555, 1.661, 1.766, + 2.105, 1.956, 1.807, 1.696, 1.587, 1.502, 1.42, 1.35, 1.282, 1.231, 1.186, 1.148, 1.112, 1.08, 1.051, 1.028, 1.011, 1.007, 1.019, 1.036, 1.061, 1.088, 1.119, 1.154, 1.197, 1.244, 1.308, 1.376, 1.466, 1.557, 1.662, 1.767, + 2.121, 1.97, 1.818, 1.705, 1.595, 1.508, 1.424, 1.353, 1.286, 1.236, 1.191, 1.153, 1.118, 1.087, 1.059, 1.038, 1.022, 1.018, 1.028, 1.044, 1.067, 1.093, 1.124, 1.158, 1.201, 1.248, 1.314, 1.383, 1.474, 1.567, 1.672, 1.777, + 2.137, 1.983, 1.829, 1.715, 1.603, 1.514, 1.428, 1.357, 1.291, 1.24, 1.196, 1.158, 1.123, 1.094, 1.068, 1.047, 1.033, 1.029, 1.038, 1.052, 1.074, 1.098, 1.128, 1.162, 1.205, 1.253, 1.32, 1.39, 1.483, 1.577, 1.682, 1.788, + 2.154, 1.998, 1.843, 1.726, 1.613, 1.522, 1.435, 1.364, 1.297, 1.246, 1.202, 1.164, 1.131, 1.102, 1.078, 1.059, 1.045, 1.041, 1.048, 1.061, 1.082, 1.105, 1.134, 1.167, 1.211, 1.259, 1.327, 1.399, 1.494, 1.588, 1.694, 1.8, + 2.176, 2.019, 1.862, 1.744, 1.628, 1.537, 1.449, 1.377, 1.309, 1.258, 1.213, 1.176, 1.143, 1.116, 1.092, 1.074, 1.061, 1.057, 1.063, 1.075, 1.094, 1.117, 1.146, 1.178, 1.222, 1.27, 1.34, 1.414, 1.509, 1.604, 1.711, 1.818, + 2.199, 2.04, 1.881, 1.761, 1.644, 1.552, 1.464, 1.391, 1.321, 1.269, 1.223, 1.187, 1.155, 1.129, 1.106, 1.09, 1.078, 1.074, 1.078, 1.088, 1.107, 1.128, 1.157, 1.189, 1.233, 1.281, 1.353, 1.428, 1.524, 1.62, 1.728, 1.836, + 2.228, 2.066, 1.904, 1.782, 1.662, 1.57, 1.482, 1.408, 1.337, 1.284, 1.237, 1.201, 1.17, 1.145, 1.123, 1.107, 1.096, 1.092, 1.095, 1.104, 1.121, 1.142, 1.17, 1.203, 1.247, 1.297, 1.37, 1.446, 1.542, 1.639, 1.75, 1.86, + 2.267, 2.099, 1.932, 1.807, 1.684, 1.592, 1.504, 1.428, 1.356, 1.302, 1.255, 1.219, 1.189, 1.164, 1.141, 1.125, 1.115, 1.111, 1.114, 1.123, 1.138, 1.158, 1.186, 1.22, 1.266, 1.318, 1.391, 1.467, 1.563, 1.661, 1.776, 1.891, + 2.305, 2.132, 1.96, 1.832, 1.707, 1.614, 1.526, 1.449, 1.375, 1.32, 1.272, 1.237, 1.208, 1.182, 1.16, 1.144, 1.135, 1.131, 1.134, 1.141, 1.155, 1.174, 1.203, 1.236, 1.285, 1.338, 1.412, 1.489, 1.585, 1.682, 1.802, 1.922, + 2.351, 2.173, 1.996, 1.864, 1.736, 1.641, 1.552, 1.474, 1.4, 1.344, 1.294, 1.258, 1.228, 1.203, 1.181, 1.165, 1.156, 1.152, 1.155, 1.162, 1.176, 1.195, 1.224, 1.259, 1.309, 1.365, 1.439, 1.516, 1.613, 1.711, 1.835, 1.96, + 2.4, 2.218, 2.036, 1.901, 1.768, 1.671, 1.58, 1.502, 1.428, 1.37, 1.319, 1.281, 1.249, 1.224, 1.203, 1.188, 1.178, 1.174, 1.177, 1.184, 1.197, 1.217, 1.248, 1.285, 1.337, 1.394, 1.469, 1.547, 1.644, 1.743, 1.873, 2.002, + 2.45, 2.264, 2.077, 1.938, 1.801, 1.702, 1.608, 1.53, 1.456, 1.397, 1.344, 1.304, 1.271, 1.245, 1.224, 1.21, 1.2, 1.196, 1.199, 1.206, 1.219, 1.239, 1.272, 1.311, 1.365, 1.424, 1.5, 1.578, 1.676, 1.776, 1.91, 2.044, + 2.513, 2.318, 2.124, 1.984, 1.848, 1.747, 1.652, 1.572, 1.496, 1.436, 1.383, 1.341, 1.303, 1.274, 1.253, 1.238, 1.228, 1.225, 1.228, 1.235, 1.248, 1.269, 1.303, 1.343, 1.4, 1.46, 1.537, 1.617, 1.718, 1.82, 1.962, 2.103, + 2.579, 2.376, 2.172, 2.032, 1.897, 1.796, 1.7, 1.617, 1.538, 1.479, 1.426, 1.38, 1.337, 1.306, 1.283, 1.267, 1.258, 1.254, 1.257, 1.265, 1.279, 1.3, 1.336, 1.377, 1.435, 1.497, 1.576, 1.658, 1.761, 1.867, 2.016, 2.165, + 2.645, 2.433, 2.22, 2.08, 1.946, 1.844, 1.747, 1.663, 1.581, 1.521, 1.468, 1.419, 1.371, 1.337, 1.313, 1.296, 1.287, 1.284, 1.287, 1.295, 1.309, 1.331, 1.368, 1.411, 1.471, 1.535, 1.615, 1.699, 1.805, 1.914, 2.071, 2.227 + ], + "sigma": 0.005, + "sigma_Cb": 0.005 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.sharpen": { } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 3900, + "ccm": + [ + 1.54659, -0.17707, -0.36953, + -0.51471, 1.72733, -0.21262, + 0.06667, -0.92279, 1.85612 + ] + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx296.json b/src/ipa/rpi/pisp/data/imx296.json new file mode 100644 index 000000000..d9dde898e --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx296.json @@ -0,0 +1,1194 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 3840 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 4724, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 860, + "reference_Y": 14551 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.751 + } + }, + { + "rpi.geq": + { + "offset": 226, + "slope": 0.01032 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2875.0, 0.4699, 0.3209, + 3610.0, 0.4089, 0.4265, + 4640.0, 0.3281, 0.5417, + 5912.0, 0.2992, 0.5771, + 7630.0, 0.2285, 0.6524 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.01783, + "transverse_neg": 0.02154 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.16, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 2.084, 2.084, 2.085, 2.085, 2.085, 2.087, 2.088, 2.087, 2.086, 2.082, 2.082, 2.084, 2.086, 2.088, 2.088, 2.088, 2.087, 2.088, 2.088, 2.091, 2.092, 2.093, 2.093, 2.093, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.091, 2.088, + 2.086, 2.086, 2.087, 2.088, 2.089, 2.089, 2.091, 2.089, 2.087, 2.086, 2.087, 2.088, 2.091, 2.089, 2.091, 2.089, 2.091, 2.091, 2.091, 2.092, 2.093, 2.093, 2.094, 2.095, 2.094, 2.094, 2.095, 2.096, 2.096, 2.096, 2.096, 2.093, + 2.087, 2.087, 2.088, 2.091, 2.091, 2.091, 2.091, 2.089, 2.088, 2.088, 2.089, 2.091, 2.092, 2.092, 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.094, 2.095, 2.096, 2.096, 2.096, 2.096, 2.097, 2.097, 2.097, 2.097, 2.096, + 2.089, 2.088, 2.089, 2.091, 2.091, 2.092, 2.091, 2.089, 2.088, 2.088, 2.089, 2.091, 2.092, 2.092, 2.092, 2.091, 2.092, 2.092, 2.092, 2.092, 2.093, 2.094, 2.095, 2.096, 2.096, 2.096, 2.096, 2.097, 2.098, 2.097, 2.097, 2.097, + 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.091, 2.091, 2.089, 2.088, 2.088, 2.089, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.092, 2.093, 2.094, 2.095, 2.095, 2.096, 2.096, 2.097, 2.099, 2.098, 2.097, 2.097, 2.097, + 2.091, 2.091, 2.092, 2.093, 2.093, 2.093, 2.092, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.093, 2.095, 2.096, 2.096, 2.097, 2.097, 2.099, 2.099, 2.099, 2.098, 2.097, + 2.092, 2.092, 2.092, 2.093, 2.093, 2.092, 2.091, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.093, 2.095, 2.096, 2.096, 2.097, 2.097, 2.099, 2.099, 2.101, 2.099, 2.098, + 2.092, 2.092, 2.093, 2.093, 2.093, 2.092, 2.091, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.089, 2.091, 2.091, 2.091, 2.092, 2.092, 2.094, 2.095, 2.096, 2.097, 2.098, 2.098, 2.098, 2.101, 2.101, 2.099, 2.098, + 2.092, 2.092, 2.093, 2.093, 2.094, 2.092, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.089, 2.089, 2.091, 2.092, 2.092, 2.092, 2.092, 2.094, 2.096, 2.096, 2.097, 2.098, 2.099, 2.099, 2.099, 2.099, 2.099, 2.097, + 2.093, 2.094, 2.094, 2.094, 2.095, 2.093, 2.092, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.094, 2.096, 2.096, 2.097, 2.098, 2.098, 2.101, 2.101, 2.099, 2.099, 2.099, + 2.094, 2.094, 2.094, 2.095, 2.095, 2.095, 2.091, 2.089, 2.091, 2.089, 2.089, 2.089, 2.091, 2.091, 2.089, 2.091, 2.091, 2.091, 2.092, 2.092, 2.093, 2.093, 2.095, 2.096, 2.097, 2.098, 2.098, 2.099, 2.101, 2.101, 2.099, 2.099, + 2.095, 2.094, 2.094, 2.095, 2.096, 2.095, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.091, 2.093, 2.093, 2.093, 2.093, 2.094, 2.096, 2.097, 2.098, 2.099, 2.101, 2.101, 2.102, 2.101, 2.099, + 2.095, 2.095, 2.095, 2.095, 2.095, 2.095, 2.092, 2.089, 2.089, 2.088, 2.089, 2.089, 2.091, 2.091, 2.092, 2.092, 2.092, 2.092, 2.093, 2.093, 2.093, 2.093, 2.093, 2.095, 2.096, 2.099, 2.099, 2.101, 2.102, 2.103, 2.102, 2.101, + 2.095, 2.095, 2.095, 2.095, 2.095, 2.094, 2.092, 2.091, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.093, 2.093, 2.093, 2.092, 2.092, 2.094, 2.094, 2.094, 2.096, 2.096, 2.098, 2.099, 2.102, 2.103, 2.103, 2.102, 2.102, + 2.095, 2.095, 2.095, 2.096, 2.096, 2.094, 2.093, 2.091, 2.091, 2.089, 2.089, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.093, 2.092, 2.093, 2.094, 2.094, 2.095, 2.096, 2.097, 2.098, 2.099, 2.103, 2.103, 2.103, 2.101, 2.101, + 2.095, 2.096, 2.096, 2.097, 2.096, 2.095, 2.093, 2.092, 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.092, 2.092, 2.092, 2.094, 2.093, 2.093, 2.094, 2.095, 2.096, 2.096, 2.097, 2.099, 2.101, 2.103, 2.103, 2.103, 2.101, 2.099, + 2.096, 2.096, 2.097, 2.096, 2.097, 2.096, 2.094, 2.092, 2.092, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.093, 2.093, 2.094, 2.093, 2.093, 2.093, 2.095, 2.096, 2.097, 2.099, 2.099, 2.101, 2.103, 2.103, 2.102, 2.101, 2.101, + 2.096, 2.096, 2.097, 2.097, 2.097, 2.096, 2.094, 2.093, 2.092, 2.092, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.093, 2.094, 2.093, 2.093, 2.094, 2.095, 2.096, 2.097, 2.099, 2.101, 2.101, 2.102, 2.102, 2.102, 2.101, 2.101, + 2.097, 2.096, 2.097, 2.097, 2.097, 2.097, 2.095, 2.093, 2.093, 2.093, 2.093, 2.092, 2.091, 2.091, 2.092, 2.092, 2.093, 2.094, 2.093, 2.093, 2.093, 2.095, 2.096, 2.097, 2.099, 2.101, 2.102, 2.102, 2.102, 2.101, 2.101, 2.101, + 2.098, 2.097, 2.096, 2.097, 2.097, 2.097, 2.095, 2.094, 2.094, 2.094, 2.092, 2.092, 2.092, 2.092, 2.092, 2.092, 2.094, 2.095, 2.095, 2.094, 2.093, 2.095, 2.096, 2.099, 2.101, 2.101, 2.102, 2.102, 2.102, 2.101, 2.101, 2.102, + 2.098, 2.097, 2.096, 2.096, 2.097, 2.097, 2.095, 2.094, 2.095, 2.093, 2.093, 2.092, 2.092, 2.092, 2.094, 2.094, 2.096, 2.095, 2.095, 2.095, 2.095, 2.096, 2.098, 2.099, 2.099, 2.101, 2.102, 2.103, 2.102, 2.102, 2.101, 2.102, + 2.098, 2.097, 2.097, 2.098, 2.097, 2.096, 2.095, 2.095, 2.095, 2.094, 2.093, 2.093, 2.094, 2.094, 2.094, 2.095, 2.096, 2.096, 2.096, 2.095, 2.097, 2.097, 2.098, 2.099, 2.099, 2.101, 2.101, 2.103, 2.104, 2.103, 2.102, 2.101, + 2.099, 2.098, 2.098, 2.098, 2.097, 2.096, 2.096, 2.095, 2.095, 2.095, 2.095, 2.095, 2.094, 2.094, 2.094, 2.094, 2.096, 2.097, 2.097, 2.097, 2.097, 2.098, 2.099, 2.101, 2.101, 2.101, 2.101, 2.104, 2.105, 2.105, 2.103, 2.102, + 2.101, 2.099, 2.099, 2.099, 2.099, 2.098, 2.097, 2.097, 2.097, 2.096, 2.096, 2.095, 2.095, 2.095, 2.095, 2.095, 2.096, 2.098, 2.098, 2.097, 2.097, 2.098, 2.099, 2.101, 2.101, 2.102, 2.103, 2.104, 2.105, 2.105, 2.104, 2.103, + 2.102, 2.102, 2.099, 2.098, 2.099, 2.099, 2.099, 2.098, 2.097, 2.097, 2.097, 2.097, 2.097, 2.096, 2.096, 2.097, 2.098, 2.098, 2.099, 2.099, 2.099, 2.101, 2.101, 2.102, 2.104, 2.105, 2.106, 2.106, 2.106, 2.104, 2.104, 2.104, + 2.102, 2.101, 2.099, 2.099, 2.099, 2.101, 2.101, 2.101, 2.099, 2.098, 2.098, 2.098, 2.098, 2.098, 2.098, 2.098, 2.099, 2.099, 2.099, 2.099, 2.101, 2.101, 2.102, 2.103, 2.105, 2.106, 2.106, 2.106, 2.106, 2.105, 2.104, 2.104, + 2.099, 2.099, 2.099, 2.098, 2.098, 2.099, 2.101, 2.101, 2.099, 2.098, 2.097, 2.098, 2.098, 2.099, 2.098, 2.098, 2.099, 2.099, 2.101, 2.101, 2.101, 2.101, 2.102, 2.104, 2.105, 2.105, 2.105, 2.106, 2.106, 2.104, 2.104, 2.103, + 2.096, 2.097, 2.097, 2.097, 2.097, 2.099, 2.099, 2.099, 2.099, 2.097, 2.097, 2.098, 2.098, 2.099, 2.098, 2.097, 2.097, 2.099, 2.101, 2.101, 2.101, 2.101, 2.101, 2.103, 2.105, 2.105, 2.105, 2.104, 2.104, 2.103, 2.101, 2.101, + 2.096, 2.096, 2.096, 2.097, 2.097, 2.098, 2.098, 2.099, 2.097, 2.096, 2.096, 2.097, 2.098, 2.098, 2.097, 2.097, 2.096, 2.098, 2.098, 2.099, 2.101, 2.101, 2.101, 2.102, 2.104, 2.105, 2.104, 2.104, 2.103, 2.101, 2.099, 2.098, + 2.096, 2.096, 2.096, 2.096, 2.097, 2.097, 2.097, 2.097, 2.097, 2.097, 2.096, 2.097, 2.098, 2.097, 2.097, 2.096, 2.096, 2.098, 2.098, 2.098, 2.099, 2.099, 2.101, 2.101, 2.103, 2.103, 2.104, 2.104, 2.102, 2.101, 2.099, 2.098, + 2.097, 2.096, 2.095, 2.096, 2.098, 2.098, 2.098, 2.098, 2.097, 2.098, 2.097, 2.097, 2.097, 2.097, 2.096, 2.096, 2.096, 2.097, 2.097, 2.098, 2.099, 2.099, 2.099, 2.101, 2.102, 2.103, 2.104, 2.104, 2.104, 2.101, 2.099, 2.098, + 2.097, 2.096, 2.095, 2.097, 2.099, 2.099, 2.099, 2.099, 2.099, 2.099, 2.098, 2.098, 2.097, 2.096, 2.096, 2.097, 2.097, 2.098, 2.097, 2.099, 2.101, 2.099, 2.099, 2.099, 2.102, 2.102, 2.104, 2.105, 2.105, 2.102, 2.099, 2.098 + ] + }, + { + "ct": 5000, + "table": + [ + 3.431, 3.437, 3.439, 3.439, 3.436, 3.438, 3.441, 3.441, 3.441, 3.441, 3.442, 3.443, 3.443, 3.444, 3.446, 3.448, 3.451, 3.451, 3.452, 3.451, 3.449, 3.449, 3.452, 3.453, 3.454, 3.454, 3.453, 3.456, 3.456, 3.456, 3.451, 3.448, + 3.445, 3.446, 3.445, 3.449, 3.453, 3.451, 3.451, 3.446, 3.447, 3.446, 3.447, 3.451, 3.453, 3.455, 3.454, 3.453, 3.453, 3.454, 3.455, 3.456, 3.457, 3.459, 3.461, 3.462, 3.463, 3.463, 3.465, 3.466, 3.467, 3.465, 3.459, 3.457, + 3.449, 3.449, 3.449, 3.454, 3.455, 3.454, 3.453, 3.451, 3.451, 3.448, 3.451, 3.451, 3.455, 3.456, 3.457, 3.456, 3.456, 3.458, 3.457, 3.459, 3.459, 3.461, 3.464, 3.467, 3.467, 3.466, 3.468, 3.469, 3.471, 3.468, 3.465, 3.462, + 3.451, 3.448, 3.451, 3.453, 3.457, 3.455, 3.454, 3.449, 3.449, 3.448, 3.449, 3.449, 3.455, 3.455, 3.456, 3.455, 3.454, 3.455, 3.455, 3.457, 3.458, 3.458, 3.461, 3.464, 3.466, 3.468, 3.469, 3.469, 3.469, 3.468, 3.465, 3.463, + 3.449, 3.449, 3.451, 3.453, 3.456, 3.455, 3.452, 3.449, 3.448, 3.447, 3.446, 3.448, 3.451, 3.452, 3.454, 3.455, 3.455, 3.454, 3.457, 3.458, 3.458, 3.459, 3.461, 3.464, 3.464, 3.466, 3.467, 3.469, 3.469, 3.467, 3.463, 3.459, + 3.449, 3.451, 3.452, 3.454, 3.455, 3.454, 3.452, 3.449, 3.447, 3.447, 3.446, 3.449, 3.449, 3.451, 3.452, 3.452, 3.452, 3.452, 3.454, 3.455, 3.457, 3.459, 3.461, 3.464, 3.464, 3.466, 3.465, 3.468, 3.468, 3.469, 3.465, 3.462, + 3.451, 3.451, 3.452, 3.453, 3.453, 3.453, 3.451, 3.449, 3.449, 3.447, 3.446, 3.447, 3.448, 3.451, 3.451, 3.451, 3.453, 3.452, 3.452, 3.452, 3.457, 3.458, 3.461, 3.463, 3.464, 3.465, 3.464, 3.466, 3.468, 3.469, 3.466, 3.463, + 3.451, 3.451, 3.451, 3.454, 3.453, 3.453, 3.451, 3.448, 3.448, 3.444, 3.444, 3.444, 3.448, 3.449, 3.449, 3.448, 3.449, 3.449, 3.451, 3.452, 3.454, 3.457, 3.461, 3.462, 3.464, 3.466, 3.466, 3.467, 3.468, 3.469, 3.466, 3.465, + 3.451, 3.451, 3.452, 3.455, 3.454, 3.453, 3.449, 3.448, 3.447, 3.447, 3.444, 3.446, 3.446, 3.446, 3.446, 3.447, 3.449, 3.449, 3.451, 3.452, 3.455, 3.457, 3.461, 3.462, 3.464, 3.466, 3.466, 3.468, 3.469, 3.468, 3.465, 3.462, + 3.453, 3.452, 3.454, 3.456, 3.455, 3.453, 3.449, 3.447, 3.446, 3.446, 3.445, 3.448, 3.447, 3.446, 3.445, 3.446, 3.448, 3.448, 3.449, 3.453, 3.455, 3.457, 3.459, 3.461, 3.464, 3.466, 3.467, 3.468, 3.468, 3.467, 3.465, 3.463, + 3.453, 3.453, 3.454, 3.456, 3.456, 3.451, 3.448, 3.447, 3.447, 3.446, 3.445, 3.446, 3.446, 3.446, 3.446, 3.446, 3.448, 3.448, 3.449, 3.452, 3.454, 3.456, 3.459, 3.459, 3.461, 3.465, 3.466, 3.468, 3.468, 3.468, 3.467, 3.465, + 3.451, 3.451, 3.452, 3.455, 3.456, 3.452, 3.448, 3.446, 3.446, 3.444, 3.446, 3.445, 3.446, 3.446, 3.447, 3.448, 3.449, 3.449, 3.449, 3.452, 3.453, 3.454, 3.458, 3.458, 3.461, 3.461, 3.464, 3.469, 3.469, 3.468, 3.466, 3.466, + 3.452, 3.452, 3.453, 3.454, 3.454, 3.453, 3.447, 3.446, 3.444, 3.444, 3.444, 3.444, 3.445, 3.446, 3.448, 3.451, 3.452, 3.453, 3.451, 3.453, 3.453, 3.455, 3.458, 3.459, 3.461, 3.462, 3.463, 3.468, 3.471, 3.469, 3.467, 3.467, + 3.454, 3.455, 3.457, 3.458, 3.458, 3.455, 3.449, 3.446, 3.445, 3.445, 3.445, 3.445, 3.447, 3.447, 3.448, 3.451, 3.452, 3.453, 3.452, 3.452, 3.452, 3.454, 3.457, 3.459, 3.459, 3.462, 3.464, 3.468, 3.469, 3.467, 3.465, 3.465, + 3.457, 3.455, 3.455, 3.459, 3.458, 3.454, 3.451, 3.448, 3.445, 3.445, 3.445, 3.446, 3.448, 3.449, 3.451, 3.452, 3.451, 3.453, 3.452, 3.452, 3.453, 3.457, 3.457, 3.461, 3.461, 3.463, 3.465, 3.468, 3.471, 3.468, 3.465, 3.463, + 3.458, 3.456, 3.456, 3.459, 3.457, 3.454, 3.452, 3.449, 3.447, 3.445, 3.446, 3.447, 3.447, 3.448, 3.449, 3.448, 3.449, 3.451, 3.451, 3.451, 3.451, 3.455, 3.456, 3.458, 3.462, 3.463, 3.464, 3.465, 3.467, 3.466, 3.464, 3.462, + 3.457, 3.456, 3.455, 3.457, 3.457, 3.454, 3.449, 3.447, 3.445, 3.445, 3.446, 3.446, 3.448, 3.446, 3.448, 3.449, 3.449, 3.451, 3.451, 3.451, 3.453, 3.455, 3.457, 3.459, 3.462, 3.464, 3.464, 3.465, 3.467, 3.464, 3.464, 3.463, + 3.458, 3.457, 3.455, 3.456, 3.456, 3.456, 3.453, 3.449, 3.447, 3.448, 3.447, 3.447, 3.447, 3.447, 3.447, 3.448, 3.449, 3.451, 3.451, 3.452, 3.453, 3.455, 3.458, 3.459, 3.459, 3.463, 3.464, 3.463, 3.464, 3.463, 3.464, 3.464, + 3.457, 3.456, 3.456, 3.456, 3.456, 3.456, 3.455, 3.449, 3.447, 3.448, 3.451, 3.449, 3.449, 3.449, 3.448, 3.449, 3.449, 3.451, 3.451, 3.452, 3.453, 3.456, 3.458, 3.459, 3.461, 3.462, 3.464, 3.464, 3.465, 3.464, 3.464, 3.463, + 3.457, 3.456, 3.455, 3.455, 3.455, 3.455, 3.453, 3.451, 3.449, 3.448, 3.448, 3.449, 3.449, 3.449, 3.448, 3.449, 3.451, 3.452, 3.452, 3.453, 3.454, 3.457, 3.458, 3.459, 3.462, 3.464, 3.465, 3.464, 3.465, 3.464, 3.463, 3.463, + 3.456, 3.456, 3.454, 3.453, 3.454, 3.453, 3.452, 3.451, 3.449, 3.448, 3.448, 3.449, 3.451, 3.451, 3.448, 3.449, 3.451, 3.454, 3.454, 3.454, 3.455, 3.457, 3.458, 3.461, 3.461, 3.462, 3.464, 3.464, 3.466, 3.465, 3.464, 3.464, + 3.459, 3.457, 3.456, 3.455, 3.454, 3.453, 3.453, 3.452, 3.452, 3.451, 3.449, 3.449, 3.449, 3.448, 3.447, 3.449, 3.451, 3.454, 3.455, 3.455, 3.456, 3.458, 3.459, 3.461, 3.461, 3.462, 3.463, 3.466, 3.469, 3.465, 3.465, 3.464, + 3.463, 3.461, 3.458, 3.458, 3.457, 3.456, 3.456, 3.454, 3.454, 3.452, 3.452, 3.451, 3.451, 3.449, 3.448, 3.448, 3.452, 3.454, 3.456, 3.455, 3.457, 3.458, 3.461, 3.464, 3.462, 3.461, 3.463, 3.466, 3.469, 3.469, 3.467, 3.467, + 3.466, 3.462, 3.461, 3.461, 3.459, 3.457, 3.457, 3.457, 3.456, 3.454, 3.455, 3.455, 3.455, 3.451, 3.452, 3.453, 3.454, 3.455, 3.456, 3.456, 3.459, 3.462, 3.463, 3.466, 3.466, 3.467, 3.466, 3.469, 3.471, 3.469, 3.468, 3.466, + 3.467, 3.463, 3.463, 3.459, 3.461, 3.459, 3.461, 3.459, 3.458, 3.456, 3.457, 3.456, 3.457, 3.455, 3.456, 3.455, 3.456, 3.457, 3.459, 3.461, 3.461, 3.464, 3.465, 3.468, 3.469, 3.469, 3.469, 3.469, 3.471, 3.468, 3.467, 3.468, + 3.467, 3.464, 3.459, 3.459, 3.462, 3.462, 3.462, 3.461, 3.461, 3.462, 3.461, 3.459, 3.461, 3.459, 3.458, 3.457, 3.459, 3.461, 3.462, 3.463, 3.464, 3.466, 3.468, 3.469, 3.471, 3.469, 3.471, 3.472, 3.471, 3.467, 3.466, 3.464, + 3.464, 3.462, 3.458, 3.457, 3.458, 3.461, 3.461, 3.461, 3.461, 3.462, 3.462, 3.461, 3.461, 3.459, 3.459, 3.459, 3.461, 3.461, 3.464, 3.465, 3.465, 3.468, 3.468, 3.469, 3.471, 3.469, 3.469, 3.469, 3.469, 3.464, 3.462, 3.459, + 3.457, 3.458, 3.455, 3.456, 3.456, 3.457, 3.459, 3.459, 3.459, 3.459, 3.458, 3.456, 3.458, 3.457, 3.458, 3.458, 3.458, 3.459, 3.461, 3.463, 3.465, 3.466, 3.468, 3.469, 3.471, 3.468, 3.466, 3.466, 3.465, 3.461, 3.459, 3.457, + 3.456, 3.455, 3.454, 3.454, 3.455, 3.456, 3.458, 3.459, 3.459, 3.456, 3.456, 3.456, 3.455, 3.456, 3.455, 3.455, 3.455, 3.454, 3.457, 3.461, 3.462, 3.464, 3.465, 3.467, 3.467, 3.466, 3.464, 3.464, 3.463, 3.461, 3.457, 3.456, + 3.456, 3.454, 3.453, 3.454, 3.454, 3.455, 3.458, 3.459, 3.459, 3.456, 3.455, 3.455, 3.455, 3.451, 3.453, 3.454, 3.454, 3.455, 3.455, 3.458, 3.461, 3.462, 3.461, 3.463, 3.465, 3.464, 3.463, 3.463, 3.462, 3.459, 3.456, 3.451, + 3.455, 3.452, 3.452, 3.452, 3.455, 3.457, 3.459, 3.459, 3.459, 3.458, 3.456, 3.456, 3.455, 3.453, 3.453, 3.455, 3.457, 3.457, 3.457, 3.461, 3.461, 3.461, 3.459, 3.462, 3.464, 3.464, 3.464, 3.463, 3.463, 3.459, 3.454, 3.451, + 3.452, 3.452, 3.452, 3.453, 3.457, 3.458, 3.458, 3.459, 3.459, 3.458, 3.457, 3.457, 3.455, 3.455, 3.458, 3.459, 3.458, 3.459, 3.459, 3.461, 3.461, 3.461, 3.459, 3.461, 3.463, 3.464, 3.466, 3.463, 3.461, 3.458, 3.453, 3.449 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 3.403, 3.399, 3.395, 3.391, 3.392, 3.394, 3.401, 3.403, 3.404, 3.404, 3.403, 3.399, 3.398, 3.396, 3.395, 3.396, 3.399, 3.403, 3.404, 3.401, 3.399, 3.398, 3.397, 3.401, 3.401, 3.401, 3.396, 3.394, 3.397, 3.396, 3.388, 3.364, + 3.403, 3.399, 3.393, 3.389, 3.391, 3.395, 3.401, 3.404, 3.406, 3.404, 3.403, 3.399, 3.399, 3.397, 3.397, 3.397, 3.401, 3.404, 3.404, 3.402, 3.398, 3.396, 3.397, 3.401, 3.401, 3.401, 3.395, 3.394, 3.396, 3.393, 3.387, 3.364, + 3.399, 3.398, 3.391, 3.385, 3.386, 3.395, 3.402, 3.405, 3.405, 3.404, 3.402, 3.399, 3.399, 3.398, 3.398, 3.398, 3.401, 3.404, 3.405, 3.403, 3.399, 3.396, 3.396, 3.398, 3.401, 3.401, 3.398, 3.394, 3.392, 3.389, 3.386, 3.364, + 3.398, 3.393, 3.386, 3.382, 3.385, 3.392, 3.399, 3.403, 3.405, 3.404, 3.402, 3.398, 3.398, 3.397, 3.397, 3.398, 3.401, 3.404, 3.405, 3.403, 3.398, 3.394, 3.394, 3.398, 3.401, 3.401, 3.396, 3.392, 3.391, 3.388, 3.383, 3.362, + 3.396, 3.391, 3.384, 3.381, 3.384, 3.389, 3.398, 3.402, 3.402, 3.401, 3.399, 3.395, 3.395, 3.395, 3.397, 3.397, 3.401, 3.402, 3.404, 3.403, 3.399, 3.394, 3.393, 3.395, 3.399, 3.399, 3.397, 3.391, 3.388, 3.384, 3.381, 3.363, + 3.391, 3.386, 3.382, 3.381, 3.385, 3.389, 3.396, 3.398, 3.399, 3.399, 3.398, 3.395, 3.394, 3.394, 3.395, 3.397, 3.399, 3.401, 3.403, 3.401, 3.398, 3.394, 3.393, 3.393, 3.394, 3.396, 3.395, 3.392, 3.387, 3.382, 3.378, 3.361, + 3.389, 3.386, 3.379, 3.379, 3.383, 3.388, 3.394, 3.397, 3.397, 3.397, 3.395, 3.393, 3.393, 3.393, 3.395, 3.395, 3.397, 3.398, 3.401, 3.399, 3.397, 3.395, 3.394, 3.391, 3.393, 3.393, 3.393, 3.389, 3.387, 3.381, 3.374, 3.357, + 3.386, 3.383, 3.376, 3.375, 3.381, 3.386, 3.394, 3.396, 3.396, 3.394, 3.392, 3.392, 3.394, 3.394, 3.395, 3.394, 3.396, 3.398, 3.399, 3.397, 3.397, 3.394, 3.393, 3.391, 3.389, 3.391, 3.392, 3.388, 3.386, 3.379, 3.372, 3.355, + 3.386, 3.379, 3.373, 3.373, 3.378, 3.384, 3.391, 3.396, 3.395, 3.393, 3.389, 3.391, 3.391, 3.393, 3.394, 3.393, 3.394, 3.396, 3.397, 3.396, 3.393, 3.394, 3.393, 3.392, 3.389, 3.389, 3.389, 3.389, 3.386, 3.378, 3.371, 3.351, + 3.379, 3.375, 3.371, 3.371, 3.376, 3.381, 3.388, 3.393, 3.394, 3.391, 3.386, 3.386, 3.388, 3.393, 3.392, 3.392, 3.393, 3.395, 3.394, 3.392, 3.389, 3.391, 3.391, 3.392, 3.389, 3.388, 3.389, 3.389, 3.383, 3.377, 3.369, 3.351, + 3.373, 3.371, 3.367, 3.368, 3.373, 3.381, 3.387, 3.389, 3.391, 3.389, 3.385, 3.386, 3.383, 3.389, 3.389, 3.392, 3.392, 3.394, 3.393, 3.389, 3.387, 3.387, 3.388, 3.389, 3.389, 3.388, 3.386, 3.386, 3.382, 3.374, 3.367, 3.345, + 3.371, 3.369, 3.365, 3.366, 3.373, 3.379, 3.386, 3.389, 3.391, 3.389, 3.385, 3.384, 3.382, 3.386, 3.387, 3.389, 3.391, 3.392, 3.391, 3.387, 3.385, 3.385, 3.386, 3.388, 3.388, 3.388, 3.386, 3.385, 3.381, 3.373, 3.367, 3.345, + 3.367, 3.365, 3.365, 3.366, 3.374, 3.379, 3.384, 3.388, 3.389, 3.387, 3.384, 3.383, 3.383, 3.385, 3.385, 3.386, 3.388, 3.389, 3.388, 3.386, 3.383, 3.382, 3.384, 3.386, 3.387, 3.386, 3.381, 3.381, 3.379, 3.372, 3.364, 3.344, + 3.365, 3.363, 3.362, 3.367, 3.375, 3.379, 3.383, 3.384, 3.386, 3.384, 3.381, 3.379, 3.379, 3.383, 3.383, 3.384, 3.385, 3.387, 3.387, 3.385, 3.381, 3.381, 3.382, 3.384, 3.384, 3.385, 3.382, 3.379, 3.374, 3.369, 3.359, 3.343, + 3.359, 3.358, 3.361, 3.364, 3.373, 3.381, 3.384, 3.384, 3.385, 3.384, 3.381, 3.377, 3.379, 3.379, 3.382, 3.383, 3.384, 3.386, 3.386, 3.385, 3.381, 3.379, 3.381, 3.382, 3.382, 3.383, 3.379, 3.377, 3.371, 3.364, 3.357, 3.339, + 3.357, 3.356, 3.356, 3.362, 3.372, 3.379, 3.384, 3.384, 3.383, 3.381, 3.378, 3.376, 3.377, 3.379, 3.381, 3.382, 3.383, 3.385, 3.385, 3.383, 3.379, 3.379, 3.379, 3.381, 3.381, 3.382, 3.379, 3.372, 3.367, 3.362, 3.354, 3.334, + 3.357, 3.354, 3.357, 3.361, 3.372, 3.381, 3.385, 3.385, 3.384, 3.379, 3.376, 3.376, 3.376, 3.379, 3.381, 3.383, 3.383, 3.384, 3.383, 3.379, 3.378, 3.381, 3.379, 3.379, 3.379, 3.379, 3.378, 3.371, 3.363, 3.358, 3.354, 3.332, + 3.354, 3.351, 3.354, 3.359, 3.371, 3.379, 3.382, 3.384, 3.381, 3.378, 3.375, 3.374, 3.376, 3.378, 3.381, 3.383, 3.384, 3.382, 3.377, 3.377, 3.376, 3.377, 3.378, 3.378, 3.379, 3.379, 3.376, 3.367, 3.361, 3.357, 3.352, 3.333, + 3.352, 3.349, 3.351, 3.357, 3.372, 3.381, 3.383, 3.383, 3.381, 3.376, 3.372, 3.373, 3.375, 3.377, 3.382, 3.384, 3.384, 3.379, 3.376, 3.374, 3.374, 3.375, 3.375, 3.376, 3.377, 3.376, 3.373, 3.366, 3.361, 3.356, 3.347, 3.332, + 3.347, 3.346, 3.346, 3.355, 3.371, 3.377, 3.382, 3.381, 3.379, 3.372, 3.371, 3.371, 3.372, 3.375, 3.379, 3.383, 3.384, 3.379, 3.374, 3.373, 3.371, 3.373, 3.374, 3.375, 3.374, 3.374, 3.371, 3.365, 3.359, 3.352, 3.343, 3.331, + 3.345, 3.344, 3.345, 3.353, 3.367, 3.374, 3.382, 3.382, 3.376, 3.371, 3.369, 3.368, 3.369, 3.373, 3.377, 3.381, 3.379, 3.376, 3.373, 3.369, 3.368, 3.371, 3.372, 3.373, 3.371, 3.371, 3.369, 3.363, 3.357, 3.349, 3.341, 3.326, + 3.343, 3.341, 3.344, 3.351, 3.362, 3.371, 3.376, 3.376, 3.372, 3.369, 3.367, 3.366, 3.367, 3.369, 3.376, 3.378, 3.378, 3.375, 3.371, 3.367, 3.367, 3.368, 3.369, 3.369, 3.369, 3.368, 3.365, 3.361, 3.354, 3.347, 3.338, 3.321, + 3.341, 3.339, 3.342, 3.349, 3.359, 3.367, 3.371, 3.372, 3.371, 3.368, 3.366, 3.363, 3.365, 3.368, 3.371, 3.374, 3.376, 3.374, 3.368, 3.365, 3.365, 3.366, 3.368, 3.367, 3.367, 3.363, 3.361, 3.356, 3.352, 3.346, 3.336, 3.317, + 3.338, 3.336, 3.338, 3.346, 3.359, 3.364, 3.368, 3.369, 3.367, 3.366, 3.363, 3.362, 3.364, 3.364, 3.367, 3.371, 3.372, 3.369, 3.365, 3.362, 3.362, 3.365, 3.367, 3.367, 3.366, 3.362, 3.357, 3.353, 3.349, 3.342, 3.335, 3.317, + 3.334, 3.334, 3.336, 3.346, 3.354, 3.361, 3.365, 3.365, 3.365, 3.362, 3.361, 3.361, 3.362, 3.362, 3.364, 3.366, 3.368, 3.366, 3.361, 3.357, 3.357, 3.359, 3.363, 3.365, 3.363, 3.361, 3.355, 3.351, 3.346, 3.339, 3.336, 3.317, + 3.332, 3.332, 3.334, 3.344, 3.354, 3.359, 3.363, 3.365, 3.363, 3.361, 3.359, 3.359, 3.363, 3.363, 3.365, 3.365, 3.367, 3.366, 3.358, 3.356, 3.356, 3.358, 3.362, 3.364, 3.363, 3.359, 3.353, 3.348, 3.345, 3.339, 3.336, 3.315, + 3.332, 3.328, 3.331, 3.343, 3.351, 3.357, 3.358, 3.362, 3.361, 3.359, 3.357, 3.357, 3.361, 3.362, 3.364, 3.363, 3.363, 3.359, 3.356, 3.354, 3.354, 3.355, 3.358, 3.359, 3.361, 3.359, 3.351, 3.346, 3.344, 3.339, 3.336, 3.313, + 3.324, 3.324, 3.327, 3.334, 3.345, 3.351, 3.354, 3.356, 3.356, 3.354, 3.353, 3.354, 3.357, 3.358, 3.361, 3.358, 3.359, 3.355, 3.352, 3.348, 3.347, 3.351, 3.354, 3.358, 3.359, 3.355, 3.346, 3.343, 3.341, 3.336, 3.331, 3.312, + 3.318, 3.319, 3.321, 3.328, 3.337, 3.339, 3.345, 3.348, 3.346, 3.345, 3.347, 3.348, 3.351, 3.354, 3.356, 3.353, 3.354, 3.344, 3.343, 3.343, 3.343, 3.344, 3.347, 3.349, 3.353, 3.346, 3.341, 3.339, 3.331, 3.329, 3.325, 3.311, + 3.309, 3.313, 3.317, 3.325, 3.329, 3.332, 3.338, 3.339, 3.341, 3.339, 3.339, 3.342, 3.346, 3.346, 3.351, 3.351, 3.343, 3.338, 3.338, 3.339, 3.339, 3.339, 3.341, 3.341, 3.346, 3.343, 3.339, 3.332, 3.327, 3.326, 3.322, 3.309, + 3.305, 3.309, 3.317, 3.325, 3.328, 3.331, 3.334, 3.336, 3.337, 3.336, 3.339, 3.341, 3.344, 3.346, 3.348, 3.347, 3.341, 3.336, 3.335, 3.337, 3.339, 3.341, 3.339, 3.339, 3.342, 3.341, 3.337, 3.329, 3.326, 3.325, 3.321, 3.314, + 3.302, 3.306, 3.319, 3.325, 3.329, 3.331, 3.334, 3.335, 3.337, 3.337, 3.339, 3.341, 3.344, 3.346, 3.348, 3.347, 3.342, 3.336, 3.336, 3.338, 3.339, 3.341, 3.341, 3.341, 3.339, 3.338, 3.336, 3.331, 3.327, 3.324, 3.321, 3.314 + ] + }, + { + "ct": 5000, + "table": + [ + 1.726, 1.725, 1.723, 1.721, 1.723, 1.724, 1.724, 1.726, 1.727, 1.728, 1.729, 1.728, 1.725, 1.724, 1.726, 1.726, 1.727, 1.729, 1.727, 1.727, 1.724, 1.725, 1.724, 1.726, 1.725, 1.725, 1.724, 1.724, 1.722, 1.721, 1.719, 1.714, + 1.726, 1.724, 1.722, 1.721, 1.722, 1.723, 1.725, 1.726, 1.727, 1.727, 1.727, 1.726, 1.725, 1.725, 1.725, 1.726, 1.727, 1.728, 1.728, 1.727, 1.725, 1.724, 1.724, 1.725, 1.726, 1.725, 1.724, 1.723, 1.722, 1.721, 1.719, 1.714, + 1.724, 1.722, 1.719, 1.719, 1.721, 1.723, 1.726, 1.726, 1.727, 1.727, 1.727, 1.725, 1.726, 1.725, 1.725, 1.725, 1.726, 1.727, 1.728, 1.728, 1.725, 1.724, 1.724, 1.724, 1.726, 1.725, 1.724, 1.722, 1.722, 1.721, 1.719, 1.712, + 1.723, 1.721, 1.719, 1.719, 1.719, 1.723, 1.725, 1.726, 1.727, 1.727, 1.727, 1.726, 1.725, 1.725, 1.725, 1.726, 1.726, 1.728, 1.729, 1.728, 1.725, 1.723, 1.723, 1.725, 1.726, 1.725, 1.724, 1.722, 1.721, 1.719, 1.718, 1.711, + 1.722, 1.719, 1.719, 1.718, 1.719, 1.722, 1.725, 1.726, 1.726, 1.727, 1.727, 1.726, 1.725, 1.726, 1.726, 1.726, 1.727, 1.727, 1.728, 1.727, 1.726, 1.725, 1.724, 1.725, 1.726, 1.725, 1.724, 1.722, 1.721, 1.719, 1.715, 1.711, + 1.721, 1.717, 1.717, 1.716, 1.719, 1.722, 1.724, 1.726, 1.726, 1.727, 1.726, 1.726, 1.726, 1.726, 1.726, 1.727, 1.727, 1.727, 1.727, 1.727, 1.726, 1.725, 1.725, 1.725, 1.725, 1.725, 1.724, 1.722, 1.721, 1.718, 1.715, 1.707, + 1.718, 1.717, 1.716, 1.716, 1.718, 1.721, 1.725, 1.726, 1.726, 1.726, 1.725, 1.725, 1.725, 1.725, 1.726, 1.727, 1.727, 1.727, 1.727, 1.726, 1.726, 1.726, 1.725, 1.724, 1.724, 1.724, 1.723, 1.722, 1.721, 1.718, 1.715, 1.709, + 1.718, 1.716, 1.716, 1.715, 1.717, 1.721, 1.724, 1.725, 1.726, 1.725, 1.725, 1.724, 1.724, 1.725, 1.726, 1.726, 1.727, 1.727, 1.727, 1.726, 1.726, 1.726, 1.725, 1.723, 1.723, 1.723, 1.722, 1.722, 1.719, 1.718, 1.714, 1.709, + 1.718, 1.716, 1.715, 1.715, 1.717, 1.721, 1.723, 1.725, 1.726, 1.725, 1.724, 1.723, 1.724, 1.725, 1.725, 1.726, 1.726, 1.726, 1.726, 1.726, 1.726, 1.726, 1.725, 1.724, 1.724, 1.723, 1.722, 1.722, 1.721, 1.717, 1.714, 1.707, + 1.717, 1.716, 1.714, 1.714, 1.716, 1.721, 1.723, 1.725, 1.725, 1.725, 1.723, 1.723, 1.724, 1.726, 1.726, 1.726, 1.726, 1.725, 1.726, 1.725, 1.725, 1.725, 1.725, 1.725, 1.724, 1.723, 1.722, 1.721, 1.718, 1.716, 1.714, 1.706, + 1.715, 1.714, 1.714, 1.714, 1.716, 1.719, 1.722, 1.724, 1.725, 1.725, 1.723, 1.723, 1.724, 1.725, 1.725, 1.725, 1.726, 1.725, 1.725, 1.725, 1.724, 1.724, 1.724, 1.725, 1.724, 1.723, 1.722, 1.721, 1.718, 1.716, 1.713, 1.705, + 1.714, 1.714, 1.713, 1.714, 1.717, 1.719, 1.722, 1.724, 1.724, 1.724, 1.723, 1.722, 1.723, 1.724, 1.724, 1.724, 1.726, 1.725, 1.726, 1.725, 1.723, 1.723, 1.724, 1.724, 1.724, 1.723, 1.721, 1.719, 1.717, 1.715, 1.713, 1.706, + 1.712, 1.712, 1.712, 1.713, 1.718, 1.719, 1.721, 1.723, 1.724, 1.724, 1.722, 1.722, 1.723, 1.724, 1.724, 1.724, 1.725, 1.725, 1.725, 1.725, 1.723, 1.722, 1.724, 1.723, 1.723, 1.722, 1.721, 1.719, 1.717, 1.714, 1.711, 1.706, + 1.712, 1.711, 1.711, 1.713, 1.717, 1.719, 1.722, 1.724, 1.724, 1.723, 1.722, 1.722, 1.723, 1.724, 1.724, 1.724, 1.724, 1.725, 1.725, 1.724, 1.723, 1.722, 1.722, 1.722, 1.723, 1.722, 1.721, 1.718, 1.716, 1.714, 1.711, 1.706, + 1.711, 1.709, 1.711, 1.713, 1.716, 1.719, 1.722, 1.724, 1.724, 1.723, 1.722, 1.721, 1.722, 1.724, 1.724, 1.724, 1.723, 1.724, 1.724, 1.724, 1.722, 1.722, 1.722, 1.722, 1.722, 1.721, 1.719, 1.718, 1.714, 1.712, 1.709, 1.702, + 1.709, 1.709, 1.709, 1.712, 1.717, 1.719, 1.721, 1.723, 1.723, 1.723, 1.721, 1.721, 1.722, 1.723, 1.724, 1.723, 1.724, 1.724, 1.724, 1.724, 1.723, 1.722, 1.721, 1.721, 1.721, 1.721, 1.719, 1.716, 1.713, 1.711, 1.709, 1.701, + 1.708, 1.707, 1.709, 1.712, 1.716, 1.719, 1.722, 1.723, 1.723, 1.723, 1.721, 1.721, 1.721, 1.722, 1.723, 1.723, 1.723, 1.723, 1.724, 1.723, 1.722, 1.722, 1.721, 1.721, 1.721, 1.721, 1.719, 1.714, 1.712, 1.709, 1.708, 1.702, + 1.707, 1.707, 1.708, 1.711, 1.716, 1.721, 1.722, 1.722, 1.722, 1.721, 1.721, 1.721, 1.722, 1.722, 1.723, 1.723, 1.723, 1.722, 1.722, 1.722, 1.722, 1.721, 1.721, 1.721, 1.721, 1.721, 1.717, 1.714, 1.711, 1.709, 1.707, 1.702, + 1.706, 1.706, 1.707, 1.711, 1.714, 1.719, 1.722, 1.722, 1.722, 1.721, 1.719, 1.721, 1.721, 1.722, 1.723, 1.724, 1.723, 1.722, 1.722, 1.721, 1.719, 1.719, 1.721, 1.721, 1.719, 1.719, 1.716, 1.713, 1.711, 1.709, 1.706, 1.701, + 1.705, 1.704, 1.706, 1.709, 1.713, 1.718, 1.721, 1.722, 1.721, 1.719, 1.718, 1.719, 1.721, 1.722, 1.723, 1.724, 1.724, 1.721, 1.721, 1.721, 1.719, 1.719, 1.719, 1.719, 1.719, 1.717, 1.715, 1.713, 1.711, 1.707, 1.704, 1.699, + 1.703, 1.703, 1.704, 1.709, 1.712, 1.717, 1.719, 1.721, 1.719, 1.718, 1.717, 1.718, 1.719, 1.721, 1.722, 1.723, 1.723, 1.722, 1.719, 1.719, 1.718, 1.719, 1.719, 1.718, 1.717, 1.716, 1.714, 1.712, 1.709, 1.706, 1.703, 1.697, + 1.702, 1.703, 1.704, 1.708, 1.712, 1.715, 1.718, 1.719, 1.719, 1.717, 1.717, 1.717, 1.717, 1.718, 1.721, 1.722, 1.722, 1.721, 1.719, 1.718, 1.717, 1.718, 1.718, 1.717, 1.716, 1.714, 1.714, 1.711, 1.709, 1.706, 1.703, 1.697, + 1.702, 1.702, 1.703, 1.706, 1.709, 1.715, 1.717, 1.718, 1.717, 1.717, 1.716, 1.716, 1.717, 1.717, 1.719, 1.721, 1.721, 1.721, 1.719, 1.717, 1.716, 1.717, 1.717, 1.716, 1.714, 1.713, 1.712, 1.711, 1.708, 1.706, 1.702, 1.696, + 1.701, 1.701, 1.702, 1.706, 1.709, 1.714, 1.716, 1.717, 1.716, 1.716, 1.716, 1.715, 1.716, 1.716, 1.717, 1.718, 1.719, 1.719, 1.716, 1.715, 1.715, 1.715, 1.715, 1.715, 1.714, 1.713, 1.711, 1.709, 1.708, 1.704, 1.701, 1.695, + 1.699, 1.699, 1.702, 1.706, 1.708, 1.712, 1.714, 1.715, 1.715, 1.715, 1.714, 1.715, 1.714, 1.715, 1.716, 1.716, 1.716, 1.716, 1.714, 1.713, 1.713, 1.714, 1.715, 1.714, 1.714, 1.712, 1.709, 1.707, 1.706, 1.703, 1.701, 1.695, + 1.698, 1.699, 1.701, 1.705, 1.708, 1.711, 1.714, 1.714, 1.714, 1.714, 1.714, 1.714, 1.714, 1.715, 1.715, 1.716, 1.716, 1.715, 1.713, 1.713, 1.713, 1.714, 1.714, 1.714, 1.713, 1.712, 1.709, 1.707, 1.706, 1.703, 1.701, 1.696, + 1.698, 1.699, 1.701, 1.705, 1.707, 1.711, 1.712, 1.713, 1.713, 1.713, 1.713, 1.714, 1.714, 1.715, 1.715, 1.716, 1.715, 1.714, 1.713, 1.712, 1.712, 1.712, 1.713, 1.713, 1.713, 1.711, 1.709, 1.707, 1.705, 1.703, 1.701, 1.696, + 1.698, 1.697, 1.699, 1.702, 1.705, 1.707, 1.711, 1.711, 1.711, 1.711, 1.711, 1.712, 1.712, 1.713, 1.714, 1.714, 1.713, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.708, 1.706, 1.704, 1.703, 1.699, 1.696, + 1.694, 1.695, 1.697, 1.699, 1.702, 1.705, 1.706, 1.707, 1.707, 1.708, 1.708, 1.708, 1.709, 1.711, 1.711, 1.711, 1.708, 1.708, 1.708, 1.707, 1.707, 1.707, 1.708, 1.708, 1.709, 1.708, 1.706, 1.703, 1.702, 1.701, 1.698, 1.696, + 1.692, 1.692, 1.695, 1.698, 1.699, 1.701, 1.704, 1.704, 1.704, 1.704, 1.705, 1.706, 1.707, 1.709, 1.709, 1.707, 1.706, 1.704, 1.704, 1.705, 1.705, 1.706, 1.706, 1.706, 1.706, 1.706, 1.703, 1.702, 1.701, 1.699, 1.696, 1.694, + 1.691, 1.692, 1.695, 1.697, 1.699, 1.699, 1.702, 1.703, 1.703, 1.702, 1.703, 1.704, 1.706, 1.707, 1.708, 1.706, 1.705, 1.703, 1.703, 1.703, 1.704, 1.705, 1.705, 1.705, 1.705, 1.704, 1.703, 1.701, 1.699, 1.698, 1.696, 1.695, + 1.689, 1.691, 1.696, 1.698, 1.699, 1.699, 1.701, 1.702, 1.702, 1.702, 1.703, 1.703, 1.706, 1.707, 1.708, 1.706, 1.705, 1.703, 1.703, 1.703, 1.703, 1.704, 1.704, 1.705, 1.704, 1.704, 1.702, 1.701, 1.698, 1.698, 1.696, 1.696 + ] + } + ], + "luminance_lut": + [ + 1.425, 1.393, 1.341, 1.295, 1.258, 1.226, 1.201, 1.181, 1.162, 1.146, 1.133, 1.123, 1.115, 1.111, 1.107, 1.106, 1.106, 1.107, 1.108, 1.111, 1.114, 1.122, 1.133, 1.148, 1.164, 1.184, 1.208, 1.236, 1.271, 1.309, 1.359, 1.381, + 1.397, 1.367, 1.317, 1.274, 1.237, 1.207, 1.183, 1.163, 1.146, 1.133, 1.123, 1.114, 1.107, 1.101, 1.098, 1.096, 1.096, 1.096, 1.097, 1.102, 1.106, 1.112, 1.122, 1.133, 1.148, 1.166, 1.187, 1.215, 1.249, 1.288, 1.335, 1.359, + 1.374, 1.341, 1.292, 1.251, 1.215, 1.186, 1.166, 1.146, 1.131, 1.117, 1.108, 1.099, 1.091, 1.088, 1.084, 1.082, 1.081, 1.082, 1.084, 1.088, 1.093, 1.098, 1.107, 1.118, 1.133, 1.149, 1.169, 1.195, 1.228, 1.267, 1.313, 1.335, + 1.352, 1.318, 1.271, 1.231, 1.196, 1.169, 1.149, 1.131, 1.115, 1.103, 1.093, 1.086, 1.079, 1.074, 1.071, 1.069, 1.069, 1.069, 1.071, 1.076, 1.079, 1.085, 1.094, 1.102, 1.117, 1.133, 1.152, 1.176, 1.208, 1.246, 1.289, 1.313, + 1.333, 1.298, 1.253, 1.212, 1.179, 1.153, 1.134, 1.116, 1.102, 1.089, 1.079, 1.072, 1.066, 1.062, 1.059, 1.058, 1.057, 1.057, 1.059, 1.064, 1.068, 1.072, 1.081, 1.091, 1.102, 1.119, 1.137, 1.161, 1.191, 1.227, 1.271, 1.293, + 1.317, 1.281, 1.235, 1.196, 1.165, 1.139, 1.119, 1.104, 1.089, 1.078, 1.068, 1.062, 1.055, 1.051, 1.048, 1.047, 1.047, 1.047, 1.048, 1.053, 1.056, 1.061, 1.069, 1.079, 1.091, 1.105, 1.126, 1.147, 1.177, 1.212, 1.253, 1.278, + 1.301, 1.265, 1.221, 1.181, 1.151, 1.127, 1.108, 1.091, 1.078, 1.068, 1.059, 1.051, 1.045, 1.041, 1.038, 1.037, 1.036, 1.037, 1.038, 1.042, 1.046, 1.051, 1.059, 1.069, 1.081, 1.096, 1.113, 1.135, 1.164, 1.198, 1.238, 1.264, + 1.286, 1.251, 1.207, 1.169, 1.141, 1.116, 1.098, 1.081, 1.068, 1.058, 1.049, 1.042, 1.037, 1.033, 1.031, 1.029, 1.028, 1.028, 1.029, 1.033, 1.037, 1.043, 1.051, 1.059, 1.071, 1.086, 1.104, 1.124, 1.152, 1.185, 1.225, 1.252, + 1.275, 1.239, 1.196, 1.161, 1.132, 1.107, 1.089, 1.073, 1.059, 1.049, 1.041, 1.035, 1.028, 1.024, 1.023, 1.021, 1.021, 1.021, 1.022, 1.024, 1.029, 1.036, 1.043, 1.051, 1.063, 1.078, 1.095, 1.115, 1.143, 1.175, 1.214, 1.243, + 1.267, 1.227, 1.187, 1.152, 1.122, 1.101, 1.081, 1.067, 1.054, 1.042, 1.035, 1.028, 1.023, 1.018, 1.015, 1.014, 1.014, 1.014, 1.016, 1.019, 1.024, 1.029, 1.036, 1.045, 1.056, 1.071, 1.088, 1.107, 1.134, 1.167, 1.204, 1.234, + 1.261, 1.219, 1.179, 1.145, 1.116, 1.095, 1.076, 1.061, 1.047, 1.037, 1.031, 1.023, 1.018, 1.014, 1.011, 1.009, 1.009, 1.009, 1.011, 1.013, 1.018, 1.024, 1.031, 1.039, 1.049, 1.065, 1.083, 1.102, 1.128, 1.161, 1.196, 1.228, + 1.256, 1.213, 1.173, 1.139, 1.111, 1.091, 1.071, 1.056, 1.043, 1.033, 1.026, 1.019, 1.014, 1.009, 1.006, 1.005, 1.004, 1.004, 1.006, 1.009, 1.013, 1.018, 1.026, 1.035, 1.046, 1.061, 1.078, 1.097, 1.123, 1.154, 1.191, 1.222, + 1.251, 1.208, 1.169, 1.137, 1.108, 1.088, 1.069, 1.053, 1.039, 1.029, 1.023, 1.015, 1.011, 1.006, 1.004, 1.003, 1.001, 1.002, 1.003, 1.006, 1.009, 1.015, 1.022, 1.032, 1.044, 1.057, 1.076, 1.094, 1.119, 1.149, 1.186, 1.218, + 1.249, 1.205, 1.167, 1.133, 1.107, 1.085, 1.067, 1.052, 1.038, 1.029, 1.021, 1.013, 1.008, 1.004, 1.003, 1.001, 1.001, 1.001, 1.002, 1.004, 1.007, 1.013, 1.021, 1.031, 1.042, 1.055, 1.073, 1.093, 1.116, 1.147, 1.182, 1.218, + 1.249, 1.204, 1.165, 1.132, 1.106, 1.085, 1.067, 1.051, 1.038, 1.029, 1.019, 1.013, 1.007, 1.003, 1.002, 1.001, 1.001, 1.001, 1.001, 1.004, 1.007, 1.013, 1.021, 1.029, 1.042, 1.055, 1.072, 1.091, 1.115, 1.145, 1.181, 1.217, + 1.249, 1.204, 1.165, 1.132, 1.107, 1.086, 1.067, 1.051, 1.038, 1.029, 1.019, 1.013, 1.008, 1.004, 1.002, 1.001, 1.001, 1.001, 1.002, 1.004, 1.007, 1.014, 1.021, 1.029, 1.042, 1.056, 1.072, 1.091, 1.115, 1.145, 1.181, 1.217, + 1.251, 1.205, 1.166, 1.133, 1.108, 1.087, 1.068, 1.052, 1.039, 1.031, 1.021, 1.014, 1.009, 1.006, 1.003, 1.002, 1.001, 1.001, 1.003, 1.006, 1.009, 1.014, 1.022, 1.031, 1.043, 1.056, 1.073, 1.093, 1.116, 1.145, 1.182, 1.218, + 1.252, 1.208, 1.168, 1.137, 1.111, 1.089, 1.071, 1.055, 1.043, 1.033, 1.023, 1.016, 1.012, 1.009, 1.006, 1.005, 1.004, 1.004, 1.006, 1.008, 1.012, 1.017, 1.024, 1.034, 1.045, 1.059, 1.075, 1.095, 1.119, 1.149, 1.185, 1.218, + 1.256, 1.213, 1.173, 1.142, 1.115, 1.093, 1.075, 1.059, 1.047, 1.036, 1.027, 1.021, 1.016, 1.012, 1.011, 1.009, 1.008, 1.008, 1.009, 1.012, 1.016, 1.021, 1.028, 1.038, 1.049, 1.064, 1.081, 1.099, 1.126, 1.155, 1.192, 1.223, + 1.261, 1.221, 1.179, 1.148, 1.121, 1.099, 1.081, 1.065, 1.052, 1.042, 1.032, 1.026, 1.021, 1.017, 1.015, 1.014, 1.014, 1.013, 1.013, 1.016, 1.021, 1.026, 1.033, 1.043, 1.054, 1.068, 1.085, 1.106, 1.132, 1.161, 1.199, 1.228, + 1.267, 1.228, 1.188, 1.155, 1.128, 1.105, 1.086, 1.071, 1.059, 1.047, 1.038, 1.031, 1.027, 1.022, 1.021, 1.019, 1.019, 1.019, 1.019, 1.022, 1.026, 1.032, 1.038, 1.049, 1.061, 1.075, 1.092, 1.112, 1.138, 1.169, 1.207, 1.236, + 1.278, 1.241, 1.199, 1.164, 1.137, 1.114, 1.094, 1.078, 1.066, 1.055, 1.046, 1.038, 1.032, 1.029, 1.027, 1.027, 1.027, 1.027, 1.027, 1.029, 1.032, 1.038, 1.047, 1.056, 1.067, 1.083, 1.099, 1.121, 1.146, 1.178, 1.217, 1.244, + 1.291, 1.252, 1.211, 1.175, 1.147, 1.124, 1.103, 1.088, 1.075, 1.063, 1.054, 1.046, 1.041, 1.036, 1.035, 1.035, 1.035, 1.035, 1.036, 1.038, 1.041, 1.047, 1.055, 1.065, 1.075, 1.092, 1.111, 1.132, 1.157, 1.189, 1.231, 1.255, + 1.303, 1.265, 1.222, 1.187, 1.158, 1.133, 1.112, 1.097, 1.083, 1.072, 1.063, 1.054, 1.048, 1.043, 1.043, 1.043, 1.043, 1.043, 1.043, 1.046, 1.049, 1.055, 1.065, 1.074, 1.086, 1.102, 1.119, 1.144, 1.171, 1.203, 1.243, 1.268, + 1.317, 1.282, 1.236, 1.201, 1.171, 1.146, 1.125, 1.109, 1.095, 1.083, 1.072, 1.064, 1.058, 1.054, 1.052, 1.051, 1.051, 1.053, 1.054, 1.057, 1.061, 1.065, 1.074, 1.086, 1.099, 1.113, 1.133, 1.156, 1.183, 1.217, 1.259, 1.282, + 1.335, 1.301, 1.254, 1.218, 1.186, 1.159, 1.138, 1.121, 1.108, 1.095, 1.085, 1.076, 1.069, 1.066, 1.065, 1.063, 1.062, 1.063, 1.065, 1.068, 1.073, 1.078, 1.087, 1.098, 1.113, 1.126, 1.146, 1.171, 1.199, 1.235, 1.277, 1.299, + 1.356, 1.321, 1.274, 1.235, 1.202, 1.175, 1.153, 1.137, 1.121, 1.108, 1.097, 1.089, 1.084, 1.081, 1.077, 1.075, 1.075, 1.075, 1.077, 1.081, 1.086, 1.091, 1.099, 1.113, 1.126, 1.144, 1.162, 1.187, 1.218, 1.255, 1.297, 1.321, + 1.376, 1.344, 1.296, 1.257, 1.223, 1.194, 1.171, 1.153, 1.137, 1.124, 1.112, 1.104, 1.099, 1.095, 1.093, 1.091, 1.089, 1.091, 1.092, 1.095, 1.101, 1.108, 1.116, 1.128, 1.144, 1.161, 1.181, 1.206, 1.237, 1.275, 1.321, 1.347, + 1.403, 1.369, 1.319, 1.279, 1.244, 1.214, 1.191, 1.171, 1.154, 1.139, 1.129, 1.121, 1.115, 1.111, 1.109, 1.106, 1.105, 1.105, 1.108, 1.112, 1.117, 1.124, 1.135, 1.147, 1.162, 1.181, 1.203, 1.228, 1.262, 1.301, 1.347, 1.377, + 1.429, 1.398, 1.348, 1.306, 1.269, 1.237, 1.214, 1.191, 1.173, 1.158, 1.146, 1.138, 1.132, 1.128, 1.125, 1.123, 1.122, 1.123, 1.125, 1.129, 1.136, 1.142, 1.154, 1.166, 1.182, 1.203, 1.226, 1.253, 1.288, 1.329, 1.377, 1.406, + 1.465, 1.429, 1.377, 1.335, 1.295, 1.262, 1.236, 1.214, 1.194, 1.179, 1.167, 1.157, 1.151, 1.146, 1.144, 1.142, 1.142, 1.142, 1.144, 1.149, 1.154, 1.163, 1.174, 1.187, 1.205, 1.226, 1.251, 1.279, 1.315, 1.357, 1.406, 1.437, + 1.493, 1.465, 1.409, 1.364, 1.323, 1.289, 1.261, 1.235, 1.214, 1.194, 1.179, 1.171, 1.166, 1.163, 1.161, 1.161, 1.161, 1.161, 1.162, 1.164, 1.168, 1.175, 1.187, 1.205, 1.225, 1.251, 1.276, 1.306, 1.344, 1.387, 1.437, 1.455 + ], + "sigma": 0.0007, + "sigma_Cb": 0.00098 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2500, + "ccm": + [ + 1.95054, -0.57435, -0.37619, + -0.46945, 1.86661, -0.39716, + 0.07977, -1.14072, 2.06095 + ] + }, + { + "ct": 2800, + "ccm": + [ + 1.94104, -0.60261, -0.33844, + -0.43162, 1.85422, -0.42261, + 0.03799, -0.95022, 1.91222 + ] + }, + { + "ct": 2900, + "ccm": + [ + 1.91828, -0.59569, -0.32258, + -0.51902, 2.09091, -0.57189, + -0.03324, -0.73462, 1.76785 + ] + }, + { + "ct": 3620, + "ccm": + [ + 1.97199, -0.66403, -0.30797, + -0.46411, 2.02612, -0.56201, + -0.07764, -0.61178, 1.68942 + ] + }, + { + "ct": 4560, + "ccm": + [ + 2.15256, -0.84787, -0.30469, + -0.48422, 2.28962, -0.80541, + -0.15113, -0.53014, 1.68127 + ] + }, + { + "ct": 5600, + "ccm": + [ + 2.04576, -0.74771, -0.29805, + -0.36332, 1.98993, -0.62662, + -0.09328, -0.46543, 1.55871 + ] + }, + { + "ct": 7400, + "ccm": + [ + 2.37532, -0.83069, -0.54462, + -0.48279, 2.84309, -1.36031, + -0.21178, -0.66532, 1.87709 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.06, + "strength": 0.5, + "limit": 0.5 + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx296_16mm.json b/src/ipa/rpi/pisp/data/imx296_16mm.json new file mode 100644 index 000000000..874437451 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx296_16mm.json @@ -0,0 +1,1247 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 3840 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 4724, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 860, + "reference_Y": 14551 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.751 + } + }, + { + "rpi.geq": + { + "offset": 226, + "slope": 0.01032 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2875.0, 0.4699, 0.3209, + 3610.0, 0.4089, 0.4265, + 4640.0, 0.3281, 0.5417, + 5912.0, 0.2992, 0.5771, + 7630.0, 0.2285, 0.6524 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.01783, + "transverse_neg": 0.02154 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.16, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 2.084, 2.084, 2.085, 2.085, 2.085, 2.087, 2.088, 2.087, 2.086, 2.082, 2.082, 2.084, 2.086, 2.088, 2.088, 2.088, 2.087, 2.088, 2.088, 2.091, 2.092, 2.093, 2.093, 2.093, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.091, 2.088, + 2.086, 2.086, 2.087, 2.088, 2.089, 2.089, 2.091, 2.089, 2.087, 2.086, 2.087, 2.088, 2.091, 2.089, 2.091, 2.089, 2.091, 2.091, 2.091, 2.092, 2.093, 2.093, 2.094, 2.095, 2.094, 2.094, 2.095, 2.096, 2.096, 2.096, 2.096, 2.093, + 2.087, 2.087, 2.088, 2.091, 2.091, 2.091, 2.091, 2.089, 2.088, 2.088, 2.089, 2.091, 2.092, 2.092, 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.094, 2.095, 2.096, 2.096, 2.096, 2.096, 2.097, 2.097, 2.097, 2.097, 2.096, + 2.089, 2.088, 2.089, 2.091, 2.091, 2.092, 2.091, 2.089, 2.088, 2.088, 2.089, 2.091, 2.092, 2.092, 2.092, 2.091, 2.092, 2.092, 2.092, 2.092, 2.093, 2.094, 2.095, 2.096, 2.096, 2.096, 2.096, 2.097, 2.098, 2.097, 2.097, 2.097, + 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.091, 2.091, 2.089, 2.088, 2.088, 2.089, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.092, 2.093, 2.094, 2.095, 2.095, 2.096, 2.096, 2.097, 2.099, 2.098, 2.097, 2.097, 2.097, + 2.091, 2.091, 2.092, 2.093, 2.093, 2.093, 2.092, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.093, 2.095, 2.096, 2.096, 2.097, 2.097, 2.099, 2.099, 2.099, 2.098, 2.097, + 2.092, 2.092, 2.092, 2.093, 2.093, 2.092, 2.091, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.093, 2.095, 2.096, 2.096, 2.097, 2.097, 2.099, 2.099, 2.101, 2.099, 2.098, + 2.092, 2.092, 2.093, 2.093, 2.093, 2.092, 2.091, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.089, 2.091, 2.091, 2.091, 2.092, 2.092, 2.094, 2.095, 2.096, 2.097, 2.098, 2.098, 2.098, 2.101, 2.101, 2.099, 2.098, + 2.092, 2.092, 2.093, 2.093, 2.094, 2.092, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.089, 2.089, 2.091, 2.092, 2.092, 2.092, 2.092, 2.094, 2.096, 2.096, 2.097, 2.098, 2.099, 2.099, 2.099, 2.099, 2.099, 2.097, + 2.093, 2.094, 2.094, 2.094, 2.095, 2.093, 2.092, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.094, 2.096, 2.096, 2.097, 2.098, 2.098, 2.101, 2.101, 2.099, 2.099, 2.099, + 2.094, 2.094, 2.094, 2.095, 2.095, 2.095, 2.091, 2.089, 2.091, 2.089, 2.089, 2.089, 2.091, 2.091, 2.089, 2.091, 2.091, 2.091, 2.092, 2.092, 2.093, 2.093, 2.095, 2.096, 2.097, 2.098, 2.098, 2.099, 2.101, 2.101, 2.099, 2.099, + 2.095, 2.094, 2.094, 2.095, 2.096, 2.095, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.091, 2.093, 2.093, 2.093, 2.093, 2.094, 2.096, 2.097, 2.098, 2.099, 2.101, 2.101, 2.102, 2.101, 2.099, + 2.095, 2.095, 2.095, 2.095, 2.095, 2.095, 2.092, 2.089, 2.089, 2.088, 2.089, 2.089, 2.091, 2.091, 2.092, 2.092, 2.092, 2.092, 2.093, 2.093, 2.093, 2.093, 2.093, 2.095, 2.096, 2.099, 2.099, 2.101, 2.102, 2.103, 2.102, 2.101, + 2.095, 2.095, 2.095, 2.095, 2.095, 2.094, 2.092, 2.091, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.093, 2.093, 2.093, 2.092, 2.092, 2.094, 2.094, 2.094, 2.096, 2.096, 2.098, 2.099, 2.102, 2.103, 2.103, 2.102, 2.102, + 2.095, 2.095, 2.095, 2.096, 2.096, 2.094, 2.093, 2.091, 2.091, 2.089, 2.089, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.093, 2.092, 2.093, 2.094, 2.094, 2.095, 2.096, 2.097, 2.098, 2.099, 2.103, 2.103, 2.103, 2.101, 2.101, + 2.095, 2.096, 2.096, 2.097, 2.096, 2.095, 2.093, 2.092, 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.092, 2.092, 2.092, 2.094, 2.093, 2.093, 2.094, 2.095, 2.096, 2.096, 2.097, 2.099, 2.101, 2.103, 2.103, 2.103, 2.101, 2.099, + 2.096, 2.096, 2.097, 2.096, 2.097, 2.096, 2.094, 2.092, 2.092, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.093, 2.093, 2.094, 2.093, 2.093, 2.093, 2.095, 2.096, 2.097, 2.099, 2.099, 2.101, 2.103, 2.103, 2.102, 2.101, 2.101, + 2.096, 2.096, 2.097, 2.097, 2.097, 2.096, 2.094, 2.093, 2.092, 2.092, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.093, 2.094, 2.093, 2.093, 2.094, 2.095, 2.096, 2.097, 2.099, 2.101, 2.101, 2.102, 2.102, 2.102, 2.101, 2.101, + 2.097, 2.096, 2.097, 2.097, 2.097, 2.097, 2.095, 2.093, 2.093, 2.093, 2.093, 2.092, 2.091, 2.091, 2.092, 2.092, 2.093, 2.094, 2.093, 2.093, 2.093, 2.095, 2.096, 2.097, 2.099, 2.101, 2.102, 2.102, 2.102, 2.101, 2.101, 2.101, + 2.098, 2.097, 2.096, 2.097, 2.097, 2.097, 2.095, 2.094, 2.094, 2.094, 2.092, 2.092, 2.092, 2.092, 2.092, 2.092, 2.094, 2.095, 2.095, 2.094, 2.093, 2.095, 2.096, 2.099, 2.101, 2.101, 2.102, 2.102, 2.102, 2.101, 2.101, 2.102, + 2.098, 2.097, 2.096, 2.096, 2.097, 2.097, 2.095, 2.094, 2.095, 2.093, 2.093, 2.092, 2.092, 2.092, 2.094, 2.094, 2.096, 2.095, 2.095, 2.095, 2.095, 2.096, 2.098, 2.099, 2.099, 2.101, 2.102, 2.103, 2.102, 2.102, 2.101, 2.102, + 2.098, 2.097, 2.097, 2.098, 2.097, 2.096, 2.095, 2.095, 2.095, 2.094, 2.093, 2.093, 2.094, 2.094, 2.094, 2.095, 2.096, 2.096, 2.096, 2.095, 2.097, 2.097, 2.098, 2.099, 2.099, 2.101, 2.101, 2.103, 2.104, 2.103, 2.102, 2.101, + 2.099, 2.098, 2.098, 2.098, 2.097, 2.096, 2.096, 2.095, 2.095, 2.095, 2.095, 2.095, 2.094, 2.094, 2.094, 2.094, 2.096, 2.097, 2.097, 2.097, 2.097, 2.098, 2.099, 2.101, 2.101, 2.101, 2.101, 2.104, 2.105, 2.105, 2.103, 2.102, + 2.101, 2.099, 2.099, 2.099, 2.099, 2.098, 2.097, 2.097, 2.097, 2.096, 2.096, 2.095, 2.095, 2.095, 2.095, 2.095, 2.096, 2.098, 2.098, 2.097, 2.097, 2.098, 2.099, 2.101, 2.101, 2.102, 2.103, 2.104, 2.105, 2.105, 2.104, 2.103, + 2.102, 2.102, 2.099, 2.098, 2.099, 2.099, 2.099, 2.098, 2.097, 2.097, 2.097, 2.097, 2.097, 2.096, 2.096, 2.097, 2.098, 2.098, 2.099, 2.099, 2.099, 2.101, 2.101, 2.102, 2.104, 2.105, 2.106, 2.106, 2.106, 2.104, 2.104, 2.104, + 2.102, 2.101, 2.099, 2.099, 2.099, 2.101, 2.101, 2.101, 2.099, 2.098, 2.098, 2.098, 2.098, 2.098, 2.098, 2.098, 2.099, 2.099, 2.099, 2.099, 2.101, 2.101, 2.102, 2.103, 2.105, 2.106, 2.106, 2.106, 2.106, 2.105, 2.104, 2.104, + 2.099, 2.099, 2.099, 2.098, 2.098, 2.099, 2.101, 2.101, 2.099, 2.098, 2.097, 2.098, 2.098, 2.099, 2.098, 2.098, 2.099, 2.099, 2.101, 2.101, 2.101, 2.101, 2.102, 2.104, 2.105, 2.105, 2.105, 2.106, 2.106, 2.104, 2.104, 2.103, + 2.096, 2.097, 2.097, 2.097, 2.097, 2.099, 2.099, 2.099, 2.099, 2.097, 2.097, 2.098, 2.098, 2.099, 2.098, 2.097, 2.097, 2.099, 2.101, 2.101, 2.101, 2.101, 2.101, 2.103, 2.105, 2.105, 2.105, 2.104, 2.104, 2.103, 2.101, 2.101, + 2.096, 2.096, 2.096, 2.097, 2.097, 2.098, 2.098, 2.099, 2.097, 2.096, 2.096, 2.097, 2.098, 2.098, 2.097, 2.097, 2.096, 2.098, 2.098, 2.099, 2.101, 2.101, 2.101, 2.102, 2.104, 2.105, 2.104, 2.104, 2.103, 2.101, 2.099, 2.098, + 2.096, 2.096, 2.096, 2.096, 2.097, 2.097, 2.097, 2.097, 2.097, 2.097, 2.096, 2.097, 2.098, 2.097, 2.097, 2.096, 2.096, 2.098, 2.098, 2.098, 2.099, 2.099, 2.101, 2.101, 2.103, 2.103, 2.104, 2.104, 2.102, 2.101, 2.099, 2.098, + 2.097, 2.096, 2.095, 2.096, 2.098, 2.098, 2.098, 2.098, 2.097, 2.098, 2.097, 2.097, 2.097, 2.097, 2.096, 2.096, 2.096, 2.097, 2.097, 2.098, 2.099, 2.099, 2.099, 2.101, 2.102, 2.103, 2.104, 2.104, 2.104, 2.101, 2.099, 2.098, + 2.097, 2.096, 2.095, 2.097, 2.099, 2.099, 2.099, 2.099, 2.099, 2.099, 2.098, 2.098, 2.097, 2.096, 2.096, 2.097, 2.097, 2.098, 2.097, 2.099, 2.101, 2.099, 2.099, 2.099, 2.102, 2.102, 2.104, 2.105, 2.105, 2.102, 2.099, 2.098 + ] + }, + { + "ct": 5000, + "table": + [ + 3.431, 3.437, 3.439, 3.439, 3.436, 3.438, 3.441, 3.441, 3.441, 3.441, 3.442, 3.443, 3.443, 3.444, 3.446, 3.448, 3.451, 3.451, 3.452, 3.451, 3.449, 3.449, 3.452, 3.453, 3.454, 3.454, 3.453, 3.456, 3.456, 3.456, 3.451, 3.448, + 3.445, 3.446, 3.445, 3.449, 3.453, 3.451, 3.451, 3.446, 3.447, 3.446, 3.447, 3.451, 3.453, 3.455, 3.454, 3.453, 3.453, 3.454, 3.455, 3.456, 3.457, 3.459, 3.461, 3.462, 3.463, 3.463, 3.465, 3.466, 3.467, 3.465, 3.459, 3.457, + 3.449, 3.449, 3.449, 3.454, 3.455, 3.454, 3.453, 3.451, 3.451, 3.448, 3.451, 3.451, 3.455, 3.456, 3.457, 3.456, 3.456, 3.458, 3.457, 3.459, 3.459, 3.461, 3.464, 3.467, 3.467, 3.466, 3.468, 3.469, 3.471, 3.468, 3.465, 3.462, + 3.451, 3.448, 3.451, 3.453, 3.457, 3.455, 3.454, 3.449, 3.449, 3.448, 3.449, 3.449, 3.455, 3.455, 3.456, 3.455, 3.454, 3.455, 3.455, 3.457, 3.458, 3.458, 3.461, 3.464, 3.466, 3.468, 3.469, 3.469, 3.469, 3.468, 3.465, 3.463, + 3.449, 3.449, 3.451, 3.453, 3.456, 3.455, 3.452, 3.449, 3.448, 3.447, 3.446, 3.448, 3.451, 3.452, 3.454, 3.455, 3.455, 3.454, 3.457, 3.458, 3.458, 3.459, 3.461, 3.464, 3.464, 3.466, 3.467, 3.469, 3.469, 3.467, 3.463, 3.459, + 3.449, 3.451, 3.452, 3.454, 3.455, 3.454, 3.452, 3.449, 3.447, 3.447, 3.446, 3.449, 3.449, 3.451, 3.452, 3.452, 3.452, 3.452, 3.454, 3.455, 3.457, 3.459, 3.461, 3.464, 3.464, 3.466, 3.465, 3.468, 3.468, 3.469, 3.465, 3.462, + 3.451, 3.451, 3.452, 3.453, 3.453, 3.453, 3.451, 3.449, 3.449, 3.447, 3.446, 3.447, 3.448, 3.451, 3.451, 3.451, 3.453, 3.452, 3.452, 3.452, 3.457, 3.458, 3.461, 3.463, 3.464, 3.465, 3.464, 3.466, 3.468, 3.469, 3.466, 3.463, + 3.451, 3.451, 3.451, 3.454, 3.453, 3.453, 3.451, 3.448, 3.448, 3.444, 3.444, 3.444, 3.448, 3.449, 3.449, 3.448, 3.449, 3.449, 3.451, 3.452, 3.454, 3.457, 3.461, 3.462, 3.464, 3.466, 3.466, 3.467, 3.468, 3.469, 3.466, 3.465, + 3.451, 3.451, 3.452, 3.455, 3.454, 3.453, 3.449, 3.448, 3.447, 3.447, 3.444, 3.446, 3.446, 3.446, 3.446, 3.447, 3.449, 3.449, 3.451, 3.452, 3.455, 3.457, 3.461, 3.462, 3.464, 3.466, 3.466, 3.468, 3.469, 3.468, 3.465, 3.462, + 3.453, 3.452, 3.454, 3.456, 3.455, 3.453, 3.449, 3.447, 3.446, 3.446, 3.445, 3.448, 3.447, 3.446, 3.445, 3.446, 3.448, 3.448, 3.449, 3.453, 3.455, 3.457, 3.459, 3.461, 3.464, 3.466, 3.467, 3.468, 3.468, 3.467, 3.465, 3.463, + 3.453, 3.453, 3.454, 3.456, 3.456, 3.451, 3.448, 3.447, 3.447, 3.446, 3.445, 3.446, 3.446, 3.446, 3.446, 3.446, 3.448, 3.448, 3.449, 3.452, 3.454, 3.456, 3.459, 3.459, 3.461, 3.465, 3.466, 3.468, 3.468, 3.468, 3.467, 3.465, + 3.451, 3.451, 3.452, 3.455, 3.456, 3.452, 3.448, 3.446, 3.446, 3.444, 3.446, 3.445, 3.446, 3.446, 3.447, 3.448, 3.449, 3.449, 3.449, 3.452, 3.453, 3.454, 3.458, 3.458, 3.461, 3.461, 3.464, 3.469, 3.469, 3.468, 3.466, 3.466, + 3.452, 3.452, 3.453, 3.454, 3.454, 3.453, 3.447, 3.446, 3.444, 3.444, 3.444, 3.444, 3.445, 3.446, 3.448, 3.451, 3.452, 3.453, 3.451, 3.453, 3.453, 3.455, 3.458, 3.459, 3.461, 3.462, 3.463, 3.468, 3.471, 3.469, 3.467, 3.467, + 3.454, 3.455, 3.457, 3.458, 3.458, 3.455, 3.449, 3.446, 3.445, 3.445, 3.445, 3.445, 3.447, 3.447, 3.448, 3.451, 3.452, 3.453, 3.452, 3.452, 3.452, 3.454, 3.457, 3.459, 3.459, 3.462, 3.464, 3.468, 3.469, 3.467, 3.465, 3.465, + 3.457, 3.455, 3.455, 3.459, 3.458, 3.454, 3.451, 3.448, 3.445, 3.445, 3.445, 3.446, 3.448, 3.449, 3.451, 3.452, 3.451, 3.453, 3.452, 3.452, 3.453, 3.457, 3.457, 3.461, 3.461, 3.463, 3.465, 3.468, 3.471, 3.468, 3.465, 3.463, + 3.458, 3.456, 3.456, 3.459, 3.457, 3.454, 3.452, 3.449, 3.447, 3.445, 3.446, 3.447, 3.447, 3.448, 3.449, 3.448, 3.449, 3.451, 3.451, 3.451, 3.451, 3.455, 3.456, 3.458, 3.462, 3.463, 3.464, 3.465, 3.467, 3.466, 3.464, 3.462, + 3.457, 3.456, 3.455, 3.457, 3.457, 3.454, 3.449, 3.447, 3.445, 3.445, 3.446, 3.446, 3.448, 3.446, 3.448, 3.449, 3.449, 3.451, 3.451, 3.451, 3.453, 3.455, 3.457, 3.459, 3.462, 3.464, 3.464, 3.465, 3.467, 3.464, 3.464, 3.463, + 3.458, 3.457, 3.455, 3.456, 3.456, 3.456, 3.453, 3.449, 3.447, 3.448, 3.447, 3.447, 3.447, 3.447, 3.447, 3.448, 3.449, 3.451, 3.451, 3.452, 3.453, 3.455, 3.458, 3.459, 3.459, 3.463, 3.464, 3.463, 3.464, 3.463, 3.464, 3.464, + 3.457, 3.456, 3.456, 3.456, 3.456, 3.456, 3.455, 3.449, 3.447, 3.448, 3.451, 3.449, 3.449, 3.449, 3.448, 3.449, 3.449, 3.451, 3.451, 3.452, 3.453, 3.456, 3.458, 3.459, 3.461, 3.462, 3.464, 3.464, 3.465, 3.464, 3.464, 3.463, + 3.457, 3.456, 3.455, 3.455, 3.455, 3.455, 3.453, 3.451, 3.449, 3.448, 3.448, 3.449, 3.449, 3.449, 3.448, 3.449, 3.451, 3.452, 3.452, 3.453, 3.454, 3.457, 3.458, 3.459, 3.462, 3.464, 3.465, 3.464, 3.465, 3.464, 3.463, 3.463, + 3.456, 3.456, 3.454, 3.453, 3.454, 3.453, 3.452, 3.451, 3.449, 3.448, 3.448, 3.449, 3.451, 3.451, 3.448, 3.449, 3.451, 3.454, 3.454, 3.454, 3.455, 3.457, 3.458, 3.461, 3.461, 3.462, 3.464, 3.464, 3.466, 3.465, 3.464, 3.464, + 3.459, 3.457, 3.456, 3.455, 3.454, 3.453, 3.453, 3.452, 3.452, 3.451, 3.449, 3.449, 3.449, 3.448, 3.447, 3.449, 3.451, 3.454, 3.455, 3.455, 3.456, 3.458, 3.459, 3.461, 3.461, 3.462, 3.463, 3.466, 3.469, 3.465, 3.465, 3.464, + 3.463, 3.461, 3.458, 3.458, 3.457, 3.456, 3.456, 3.454, 3.454, 3.452, 3.452, 3.451, 3.451, 3.449, 3.448, 3.448, 3.452, 3.454, 3.456, 3.455, 3.457, 3.458, 3.461, 3.464, 3.462, 3.461, 3.463, 3.466, 3.469, 3.469, 3.467, 3.467, + 3.466, 3.462, 3.461, 3.461, 3.459, 3.457, 3.457, 3.457, 3.456, 3.454, 3.455, 3.455, 3.455, 3.451, 3.452, 3.453, 3.454, 3.455, 3.456, 3.456, 3.459, 3.462, 3.463, 3.466, 3.466, 3.467, 3.466, 3.469, 3.471, 3.469, 3.468, 3.466, + 3.467, 3.463, 3.463, 3.459, 3.461, 3.459, 3.461, 3.459, 3.458, 3.456, 3.457, 3.456, 3.457, 3.455, 3.456, 3.455, 3.456, 3.457, 3.459, 3.461, 3.461, 3.464, 3.465, 3.468, 3.469, 3.469, 3.469, 3.469, 3.471, 3.468, 3.467, 3.468, + 3.467, 3.464, 3.459, 3.459, 3.462, 3.462, 3.462, 3.461, 3.461, 3.462, 3.461, 3.459, 3.461, 3.459, 3.458, 3.457, 3.459, 3.461, 3.462, 3.463, 3.464, 3.466, 3.468, 3.469, 3.471, 3.469, 3.471, 3.472, 3.471, 3.467, 3.466, 3.464, + 3.464, 3.462, 3.458, 3.457, 3.458, 3.461, 3.461, 3.461, 3.461, 3.462, 3.462, 3.461, 3.461, 3.459, 3.459, 3.459, 3.461, 3.461, 3.464, 3.465, 3.465, 3.468, 3.468, 3.469, 3.471, 3.469, 3.469, 3.469, 3.469, 3.464, 3.462, 3.459, + 3.457, 3.458, 3.455, 3.456, 3.456, 3.457, 3.459, 3.459, 3.459, 3.459, 3.458, 3.456, 3.458, 3.457, 3.458, 3.458, 3.458, 3.459, 3.461, 3.463, 3.465, 3.466, 3.468, 3.469, 3.471, 3.468, 3.466, 3.466, 3.465, 3.461, 3.459, 3.457, + 3.456, 3.455, 3.454, 3.454, 3.455, 3.456, 3.458, 3.459, 3.459, 3.456, 3.456, 3.456, 3.455, 3.456, 3.455, 3.455, 3.455, 3.454, 3.457, 3.461, 3.462, 3.464, 3.465, 3.467, 3.467, 3.466, 3.464, 3.464, 3.463, 3.461, 3.457, 3.456, + 3.456, 3.454, 3.453, 3.454, 3.454, 3.455, 3.458, 3.459, 3.459, 3.456, 3.455, 3.455, 3.455, 3.451, 3.453, 3.454, 3.454, 3.455, 3.455, 3.458, 3.461, 3.462, 3.461, 3.463, 3.465, 3.464, 3.463, 3.463, 3.462, 3.459, 3.456, 3.451, + 3.455, 3.452, 3.452, 3.452, 3.455, 3.457, 3.459, 3.459, 3.459, 3.458, 3.456, 3.456, 3.455, 3.453, 3.453, 3.455, 3.457, 3.457, 3.457, 3.461, 3.461, 3.461, 3.459, 3.462, 3.464, 3.464, 3.464, 3.463, 3.463, 3.459, 3.454, 3.451, + 3.452, 3.452, 3.452, 3.453, 3.457, 3.458, 3.458, 3.459, 3.459, 3.458, 3.457, 3.457, 3.455, 3.455, 3.458, 3.459, 3.458, 3.459, 3.459, 3.461, 3.461, 3.461, 3.459, 3.461, 3.463, 3.464, 3.466, 3.463, 3.461, 3.458, 3.453, 3.449 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 3.403, 3.399, 3.395, 3.391, 3.392, 3.394, 3.401, 3.403, 3.404, 3.404, 3.403, 3.399, 3.398, 3.396, 3.395, 3.396, 3.399, 3.403, 3.404, 3.401, 3.399, 3.398, 3.397, 3.401, 3.401, 3.401, 3.396, 3.394, 3.397, 3.396, 3.388, 3.364, + 3.403, 3.399, 3.393, 3.389, 3.391, 3.395, 3.401, 3.404, 3.406, 3.404, 3.403, 3.399, 3.399, 3.397, 3.397, 3.397, 3.401, 3.404, 3.404, 3.402, 3.398, 3.396, 3.397, 3.401, 3.401, 3.401, 3.395, 3.394, 3.396, 3.393, 3.387, 3.364, + 3.399, 3.398, 3.391, 3.385, 3.386, 3.395, 3.402, 3.405, 3.405, 3.404, 3.402, 3.399, 3.399, 3.398, 3.398, 3.398, 3.401, 3.404, 3.405, 3.403, 3.399, 3.396, 3.396, 3.398, 3.401, 3.401, 3.398, 3.394, 3.392, 3.389, 3.386, 3.364, + 3.398, 3.393, 3.386, 3.382, 3.385, 3.392, 3.399, 3.403, 3.405, 3.404, 3.402, 3.398, 3.398, 3.397, 3.397, 3.398, 3.401, 3.404, 3.405, 3.403, 3.398, 3.394, 3.394, 3.398, 3.401, 3.401, 3.396, 3.392, 3.391, 3.388, 3.383, 3.362, + 3.396, 3.391, 3.384, 3.381, 3.384, 3.389, 3.398, 3.402, 3.402, 3.401, 3.399, 3.395, 3.395, 3.395, 3.397, 3.397, 3.401, 3.402, 3.404, 3.403, 3.399, 3.394, 3.393, 3.395, 3.399, 3.399, 3.397, 3.391, 3.388, 3.384, 3.381, 3.363, + 3.391, 3.386, 3.382, 3.381, 3.385, 3.389, 3.396, 3.398, 3.399, 3.399, 3.398, 3.395, 3.394, 3.394, 3.395, 3.397, 3.399, 3.401, 3.403, 3.401, 3.398, 3.394, 3.393, 3.393, 3.394, 3.396, 3.395, 3.392, 3.387, 3.382, 3.378, 3.361, + 3.389, 3.386, 3.379, 3.379, 3.383, 3.388, 3.394, 3.397, 3.397, 3.397, 3.395, 3.393, 3.393, 3.393, 3.395, 3.395, 3.397, 3.398, 3.401, 3.399, 3.397, 3.395, 3.394, 3.391, 3.393, 3.393, 3.393, 3.389, 3.387, 3.381, 3.374, 3.357, + 3.386, 3.383, 3.376, 3.375, 3.381, 3.386, 3.394, 3.396, 3.396, 3.394, 3.392, 3.392, 3.394, 3.394, 3.395, 3.394, 3.396, 3.398, 3.399, 3.397, 3.397, 3.394, 3.393, 3.391, 3.389, 3.391, 3.392, 3.388, 3.386, 3.379, 3.372, 3.355, + 3.386, 3.379, 3.373, 3.373, 3.378, 3.384, 3.391, 3.396, 3.395, 3.393, 3.389, 3.391, 3.391, 3.393, 3.394, 3.393, 3.394, 3.396, 3.397, 3.396, 3.393, 3.394, 3.393, 3.392, 3.389, 3.389, 3.389, 3.389, 3.386, 3.378, 3.371, 3.351, + 3.379, 3.375, 3.371, 3.371, 3.376, 3.381, 3.388, 3.393, 3.394, 3.391, 3.386, 3.386, 3.388, 3.393, 3.392, 3.392, 3.393, 3.395, 3.394, 3.392, 3.389, 3.391, 3.391, 3.392, 3.389, 3.388, 3.389, 3.389, 3.383, 3.377, 3.369, 3.351, + 3.373, 3.371, 3.367, 3.368, 3.373, 3.381, 3.387, 3.389, 3.391, 3.389, 3.385, 3.386, 3.383, 3.389, 3.389, 3.392, 3.392, 3.394, 3.393, 3.389, 3.387, 3.387, 3.388, 3.389, 3.389, 3.388, 3.386, 3.386, 3.382, 3.374, 3.367, 3.345, + 3.371, 3.369, 3.365, 3.366, 3.373, 3.379, 3.386, 3.389, 3.391, 3.389, 3.385, 3.384, 3.382, 3.386, 3.387, 3.389, 3.391, 3.392, 3.391, 3.387, 3.385, 3.385, 3.386, 3.388, 3.388, 3.388, 3.386, 3.385, 3.381, 3.373, 3.367, 3.345, + 3.367, 3.365, 3.365, 3.366, 3.374, 3.379, 3.384, 3.388, 3.389, 3.387, 3.384, 3.383, 3.383, 3.385, 3.385, 3.386, 3.388, 3.389, 3.388, 3.386, 3.383, 3.382, 3.384, 3.386, 3.387, 3.386, 3.381, 3.381, 3.379, 3.372, 3.364, 3.344, + 3.365, 3.363, 3.362, 3.367, 3.375, 3.379, 3.383, 3.384, 3.386, 3.384, 3.381, 3.379, 3.379, 3.383, 3.383, 3.384, 3.385, 3.387, 3.387, 3.385, 3.381, 3.381, 3.382, 3.384, 3.384, 3.385, 3.382, 3.379, 3.374, 3.369, 3.359, 3.343, + 3.359, 3.358, 3.361, 3.364, 3.373, 3.381, 3.384, 3.384, 3.385, 3.384, 3.381, 3.377, 3.379, 3.379, 3.382, 3.383, 3.384, 3.386, 3.386, 3.385, 3.381, 3.379, 3.381, 3.382, 3.382, 3.383, 3.379, 3.377, 3.371, 3.364, 3.357, 3.339, + 3.357, 3.356, 3.356, 3.362, 3.372, 3.379, 3.384, 3.384, 3.383, 3.381, 3.378, 3.376, 3.377, 3.379, 3.381, 3.382, 3.383, 3.385, 3.385, 3.383, 3.379, 3.379, 3.379, 3.381, 3.381, 3.382, 3.379, 3.372, 3.367, 3.362, 3.354, 3.334, + 3.357, 3.354, 3.357, 3.361, 3.372, 3.381, 3.385, 3.385, 3.384, 3.379, 3.376, 3.376, 3.376, 3.379, 3.381, 3.383, 3.383, 3.384, 3.383, 3.379, 3.378, 3.381, 3.379, 3.379, 3.379, 3.379, 3.378, 3.371, 3.363, 3.358, 3.354, 3.332, + 3.354, 3.351, 3.354, 3.359, 3.371, 3.379, 3.382, 3.384, 3.381, 3.378, 3.375, 3.374, 3.376, 3.378, 3.381, 3.383, 3.384, 3.382, 3.377, 3.377, 3.376, 3.377, 3.378, 3.378, 3.379, 3.379, 3.376, 3.367, 3.361, 3.357, 3.352, 3.333, + 3.352, 3.349, 3.351, 3.357, 3.372, 3.381, 3.383, 3.383, 3.381, 3.376, 3.372, 3.373, 3.375, 3.377, 3.382, 3.384, 3.384, 3.379, 3.376, 3.374, 3.374, 3.375, 3.375, 3.376, 3.377, 3.376, 3.373, 3.366, 3.361, 3.356, 3.347, 3.332, + 3.347, 3.346, 3.346, 3.355, 3.371, 3.377, 3.382, 3.381, 3.379, 3.372, 3.371, 3.371, 3.372, 3.375, 3.379, 3.383, 3.384, 3.379, 3.374, 3.373, 3.371, 3.373, 3.374, 3.375, 3.374, 3.374, 3.371, 3.365, 3.359, 3.352, 3.343, 3.331, + 3.345, 3.344, 3.345, 3.353, 3.367, 3.374, 3.382, 3.382, 3.376, 3.371, 3.369, 3.368, 3.369, 3.373, 3.377, 3.381, 3.379, 3.376, 3.373, 3.369, 3.368, 3.371, 3.372, 3.373, 3.371, 3.371, 3.369, 3.363, 3.357, 3.349, 3.341, 3.326, + 3.343, 3.341, 3.344, 3.351, 3.362, 3.371, 3.376, 3.376, 3.372, 3.369, 3.367, 3.366, 3.367, 3.369, 3.376, 3.378, 3.378, 3.375, 3.371, 3.367, 3.367, 3.368, 3.369, 3.369, 3.369, 3.368, 3.365, 3.361, 3.354, 3.347, 3.338, 3.321, + 3.341, 3.339, 3.342, 3.349, 3.359, 3.367, 3.371, 3.372, 3.371, 3.368, 3.366, 3.363, 3.365, 3.368, 3.371, 3.374, 3.376, 3.374, 3.368, 3.365, 3.365, 3.366, 3.368, 3.367, 3.367, 3.363, 3.361, 3.356, 3.352, 3.346, 3.336, 3.317, + 3.338, 3.336, 3.338, 3.346, 3.359, 3.364, 3.368, 3.369, 3.367, 3.366, 3.363, 3.362, 3.364, 3.364, 3.367, 3.371, 3.372, 3.369, 3.365, 3.362, 3.362, 3.365, 3.367, 3.367, 3.366, 3.362, 3.357, 3.353, 3.349, 3.342, 3.335, 3.317, + 3.334, 3.334, 3.336, 3.346, 3.354, 3.361, 3.365, 3.365, 3.365, 3.362, 3.361, 3.361, 3.362, 3.362, 3.364, 3.366, 3.368, 3.366, 3.361, 3.357, 3.357, 3.359, 3.363, 3.365, 3.363, 3.361, 3.355, 3.351, 3.346, 3.339, 3.336, 3.317, + 3.332, 3.332, 3.334, 3.344, 3.354, 3.359, 3.363, 3.365, 3.363, 3.361, 3.359, 3.359, 3.363, 3.363, 3.365, 3.365, 3.367, 3.366, 3.358, 3.356, 3.356, 3.358, 3.362, 3.364, 3.363, 3.359, 3.353, 3.348, 3.345, 3.339, 3.336, 3.315, + 3.332, 3.328, 3.331, 3.343, 3.351, 3.357, 3.358, 3.362, 3.361, 3.359, 3.357, 3.357, 3.361, 3.362, 3.364, 3.363, 3.363, 3.359, 3.356, 3.354, 3.354, 3.355, 3.358, 3.359, 3.361, 3.359, 3.351, 3.346, 3.344, 3.339, 3.336, 3.313, + 3.324, 3.324, 3.327, 3.334, 3.345, 3.351, 3.354, 3.356, 3.356, 3.354, 3.353, 3.354, 3.357, 3.358, 3.361, 3.358, 3.359, 3.355, 3.352, 3.348, 3.347, 3.351, 3.354, 3.358, 3.359, 3.355, 3.346, 3.343, 3.341, 3.336, 3.331, 3.312, + 3.318, 3.319, 3.321, 3.328, 3.337, 3.339, 3.345, 3.348, 3.346, 3.345, 3.347, 3.348, 3.351, 3.354, 3.356, 3.353, 3.354, 3.344, 3.343, 3.343, 3.343, 3.344, 3.347, 3.349, 3.353, 3.346, 3.341, 3.339, 3.331, 3.329, 3.325, 3.311, + 3.309, 3.313, 3.317, 3.325, 3.329, 3.332, 3.338, 3.339, 3.341, 3.339, 3.339, 3.342, 3.346, 3.346, 3.351, 3.351, 3.343, 3.338, 3.338, 3.339, 3.339, 3.339, 3.341, 3.341, 3.346, 3.343, 3.339, 3.332, 3.327, 3.326, 3.322, 3.309, + 3.305, 3.309, 3.317, 3.325, 3.328, 3.331, 3.334, 3.336, 3.337, 3.336, 3.339, 3.341, 3.344, 3.346, 3.348, 3.347, 3.341, 3.336, 3.335, 3.337, 3.339, 3.341, 3.339, 3.339, 3.342, 3.341, 3.337, 3.329, 3.326, 3.325, 3.321, 3.314, + 3.302, 3.306, 3.319, 3.325, 3.329, 3.331, 3.334, 3.335, 3.337, 3.337, 3.339, 3.341, 3.344, 3.346, 3.348, 3.347, 3.342, 3.336, 3.336, 3.338, 3.339, 3.341, 3.341, 3.341, 3.339, 3.338, 3.336, 3.331, 3.327, 3.324, 3.321, 3.314 + ] + }, + { + "ct": 5000, + "table": + [ + 1.726, 1.725, 1.723, 1.721, 1.723, 1.724, 1.724, 1.726, 1.727, 1.728, 1.729, 1.728, 1.725, 1.724, 1.726, 1.726, 1.727, 1.729, 1.727, 1.727, 1.724, 1.725, 1.724, 1.726, 1.725, 1.725, 1.724, 1.724, 1.722, 1.721, 1.719, 1.714, + 1.726, 1.724, 1.722, 1.721, 1.722, 1.723, 1.725, 1.726, 1.727, 1.727, 1.727, 1.726, 1.725, 1.725, 1.725, 1.726, 1.727, 1.728, 1.728, 1.727, 1.725, 1.724, 1.724, 1.725, 1.726, 1.725, 1.724, 1.723, 1.722, 1.721, 1.719, 1.714, + 1.724, 1.722, 1.719, 1.719, 1.721, 1.723, 1.726, 1.726, 1.727, 1.727, 1.727, 1.725, 1.726, 1.725, 1.725, 1.725, 1.726, 1.727, 1.728, 1.728, 1.725, 1.724, 1.724, 1.724, 1.726, 1.725, 1.724, 1.722, 1.722, 1.721, 1.719, 1.712, + 1.723, 1.721, 1.719, 1.719, 1.719, 1.723, 1.725, 1.726, 1.727, 1.727, 1.727, 1.726, 1.725, 1.725, 1.725, 1.726, 1.726, 1.728, 1.729, 1.728, 1.725, 1.723, 1.723, 1.725, 1.726, 1.725, 1.724, 1.722, 1.721, 1.719, 1.718, 1.711, + 1.722, 1.719, 1.719, 1.718, 1.719, 1.722, 1.725, 1.726, 1.726, 1.727, 1.727, 1.726, 1.725, 1.726, 1.726, 1.726, 1.727, 1.727, 1.728, 1.727, 1.726, 1.725, 1.724, 1.725, 1.726, 1.725, 1.724, 1.722, 1.721, 1.719, 1.715, 1.711, + 1.721, 1.717, 1.717, 1.716, 1.719, 1.722, 1.724, 1.726, 1.726, 1.727, 1.726, 1.726, 1.726, 1.726, 1.726, 1.727, 1.727, 1.727, 1.727, 1.727, 1.726, 1.725, 1.725, 1.725, 1.725, 1.725, 1.724, 1.722, 1.721, 1.718, 1.715, 1.707, + 1.718, 1.717, 1.716, 1.716, 1.718, 1.721, 1.725, 1.726, 1.726, 1.726, 1.725, 1.725, 1.725, 1.725, 1.726, 1.727, 1.727, 1.727, 1.727, 1.726, 1.726, 1.726, 1.725, 1.724, 1.724, 1.724, 1.723, 1.722, 1.721, 1.718, 1.715, 1.709, + 1.718, 1.716, 1.716, 1.715, 1.717, 1.721, 1.724, 1.725, 1.726, 1.725, 1.725, 1.724, 1.724, 1.725, 1.726, 1.726, 1.727, 1.727, 1.727, 1.726, 1.726, 1.726, 1.725, 1.723, 1.723, 1.723, 1.722, 1.722, 1.719, 1.718, 1.714, 1.709, + 1.718, 1.716, 1.715, 1.715, 1.717, 1.721, 1.723, 1.725, 1.726, 1.725, 1.724, 1.723, 1.724, 1.725, 1.725, 1.726, 1.726, 1.726, 1.726, 1.726, 1.726, 1.726, 1.725, 1.724, 1.724, 1.723, 1.722, 1.722, 1.721, 1.717, 1.714, 1.707, + 1.717, 1.716, 1.714, 1.714, 1.716, 1.721, 1.723, 1.725, 1.725, 1.725, 1.723, 1.723, 1.724, 1.726, 1.726, 1.726, 1.726, 1.725, 1.726, 1.725, 1.725, 1.725, 1.725, 1.725, 1.724, 1.723, 1.722, 1.721, 1.718, 1.716, 1.714, 1.706, + 1.715, 1.714, 1.714, 1.714, 1.716, 1.719, 1.722, 1.724, 1.725, 1.725, 1.723, 1.723, 1.724, 1.725, 1.725, 1.725, 1.726, 1.725, 1.725, 1.725, 1.724, 1.724, 1.724, 1.725, 1.724, 1.723, 1.722, 1.721, 1.718, 1.716, 1.713, 1.705, + 1.714, 1.714, 1.713, 1.714, 1.717, 1.719, 1.722, 1.724, 1.724, 1.724, 1.723, 1.722, 1.723, 1.724, 1.724, 1.724, 1.726, 1.725, 1.726, 1.725, 1.723, 1.723, 1.724, 1.724, 1.724, 1.723, 1.721, 1.719, 1.717, 1.715, 1.713, 1.706, + 1.712, 1.712, 1.712, 1.713, 1.718, 1.719, 1.721, 1.723, 1.724, 1.724, 1.722, 1.722, 1.723, 1.724, 1.724, 1.724, 1.725, 1.725, 1.725, 1.725, 1.723, 1.722, 1.724, 1.723, 1.723, 1.722, 1.721, 1.719, 1.717, 1.714, 1.711, 1.706, + 1.712, 1.711, 1.711, 1.713, 1.717, 1.719, 1.722, 1.724, 1.724, 1.723, 1.722, 1.722, 1.723, 1.724, 1.724, 1.724, 1.724, 1.725, 1.725, 1.724, 1.723, 1.722, 1.722, 1.722, 1.723, 1.722, 1.721, 1.718, 1.716, 1.714, 1.711, 1.706, + 1.711, 1.709, 1.711, 1.713, 1.716, 1.719, 1.722, 1.724, 1.724, 1.723, 1.722, 1.721, 1.722, 1.724, 1.724, 1.724, 1.723, 1.724, 1.724, 1.724, 1.722, 1.722, 1.722, 1.722, 1.722, 1.721, 1.719, 1.718, 1.714, 1.712, 1.709, 1.702, + 1.709, 1.709, 1.709, 1.712, 1.717, 1.719, 1.721, 1.723, 1.723, 1.723, 1.721, 1.721, 1.722, 1.723, 1.724, 1.723, 1.724, 1.724, 1.724, 1.724, 1.723, 1.722, 1.721, 1.721, 1.721, 1.721, 1.719, 1.716, 1.713, 1.711, 1.709, 1.701, + 1.708, 1.707, 1.709, 1.712, 1.716, 1.719, 1.722, 1.723, 1.723, 1.723, 1.721, 1.721, 1.721, 1.722, 1.723, 1.723, 1.723, 1.723, 1.724, 1.723, 1.722, 1.722, 1.721, 1.721, 1.721, 1.721, 1.719, 1.714, 1.712, 1.709, 1.708, 1.702, + 1.707, 1.707, 1.708, 1.711, 1.716, 1.721, 1.722, 1.722, 1.722, 1.721, 1.721, 1.721, 1.722, 1.722, 1.723, 1.723, 1.723, 1.722, 1.722, 1.722, 1.722, 1.721, 1.721, 1.721, 1.721, 1.721, 1.717, 1.714, 1.711, 1.709, 1.707, 1.702, + 1.706, 1.706, 1.707, 1.711, 1.714, 1.719, 1.722, 1.722, 1.722, 1.721, 1.719, 1.721, 1.721, 1.722, 1.723, 1.724, 1.723, 1.722, 1.722, 1.721, 1.719, 1.719, 1.721, 1.721, 1.719, 1.719, 1.716, 1.713, 1.711, 1.709, 1.706, 1.701, + 1.705, 1.704, 1.706, 1.709, 1.713, 1.718, 1.721, 1.722, 1.721, 1.719, 1.718, 1.719, 1.721, 1.722, 1.723, 1.724, 1.724, 1.721, 1.721, 1.721, 1.719, 1.719, 1.719, 1.719, 1.719, 1.717, 1.715, 1.713, 1.711, 1.707, 1.704, 1.699, + 1.703, 1.703, 1.704, 1.709, 1.712, 1.717, 1.719, 1.721, 1.719, 1.718, 1.717, 1.718, 1.719, 1.721, 1.722, 1.723, 1.723, 1.722, 1.719, 1.719, 1.718, 1.719, 1.719, 1.718, 1.717, 1.716, 1.714, 1.712, 1.709, 1.706, 1.703, 1.697, + 1.702, 1.703, 1.704, 1.708, 1.712, 1.715, 1.718, 1.719, 1.719, 1.717, 1.717, 1.717, 1.717, 1.718, 1.721, 1.722, 1.722, 1.721, 1.719, 1.718, 1.717, 1.718, 1.718, 1.717, 1.716, 1.714, 1.714, 1.711, 1.709, 1.706, 1.703, 1.697, + 1.702, 1.702, 1.703, 1.706, 1.709, 1.715, 1.717, 1.718, 1.717, 1.717, 1.716, 1.716, 1.717, 1.717, 1.719, 1.721, 1.721, 1.721, 1.719, 1.717, 1.716, 1.717, 1.717, 1.716, 1.714, 1.713, 1.712, 1.711, 1.708, 1.706, 1.702, 1.696, + 1.701, 1.701, 1.702, 1.706, 1.709, 1.714, 1.716, 1.717, 1.716, 1.716, 1.716, 1.715, 1.716, 1.716, 1.717, 1.718, 1.719, 1.719, 1.716, 1.715, 1.715, 1.715, 1.715, 1.715, 1.714, 1.713, 1.711, 1.709, 1.708, 1.704, 1.701, 1.695, + 1.699, 1.699, 1.702, 1.706, 1.708, 1.712, 1.714, 1.715, 1.715, 1.715, 1.714, 1.715, 1.714, 1.715, 1.716, 1.716, 1.716, 1.716, 1.714, 1.713, 1.713, 1.714, 1.715, 1.714, 1.714, 1.712, 1.709, 1.707, 1.706, 1.703, 1.701, 1.695, + 1.698, 1.699, 1.701, 1.705, 1.708, 1.711, 1.714, 1.714, 1.714, 1.714, 1.714, 1.714, 1.714, 1.715, 1.715, 1.716, 1.716, 1.715, 1.713, 1.713, 1.713, 1.714, 1.714, 1.714, 1.713, 1.712, 1.709, 1.707, 1.706, 1.703, 1.701, 1.696, + 1.698, 1.699, 1.701, 1.705, 1.707, 1.711, 1.712, 1.713, 1.713, 1.713, 1.713, 1.714, 1.714, 1.715, 1.715, 1.716, 1.715, 1.714, 1.713, 1.712, 1.712, 1.712, 1.713, 1.713, 1.713, 1.711, 1.709, 1.707, 1.705, 1.703, 1.701, 1.696, + 1.698, 1.697, 1.699, 1.702, 1.705, 1.707, 1.711, 1.711, 1.711, 1.711, 1.711, 1.712, 1.712, 1.713, 1.714, 1.714, 1.713, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.708, 1.706, 1.704, 1.703, 1.699, 1.696, + 1.694, 1.695, 1.697, 1.699, 1.702, 1.705, 1.706, 1.707, 1.707, 1.708, 1.708, 1.708, 1.709, 1.711, 1.711, 1.711, 1.708, 1.708, 1.708, 1.707, 1.707, 1.707, 1.708, 1.708, 1.709, 1.708, 1.706, 1.703, 1.702, 1.701, 1.698, 1.696, + 1.692, 1.692, 1.695, 1.698, 1.699, 1.701, 1.704, 1.704, 1.704, 1.704, 1.705, 1.706, 1.707, 1.709, 1.709, 1.707, 1.706, 1.704, 1.704, 1.705, 1.705, 1.706, 1.706, 1.706, 1.706, 1.706, 1.703, 1.702, 1.701, 1.699, 1.696, 1.694, + 1.691, 1.692, 1.695, 1.697, 1.699, 1.699, 1.702, 1.703, 1.703, 1.702, 1.703, 1.704, 1.706, 1.707, 1.708, 1.706, 1.705, 1.703, 1.703, 1.703, 1.704, 1.705, 1.705, 1.705, 1.705, 1.704, 1.703, 1.701, 1.699, 1.698, 1.696, 1.695, + 1.689, 1.691, 1.696, 1.698, 1.699, 1.699, 1.701, 1.702, 1.702, 1.702, 1.703, 1.703, 1.706, 1.707, 1.708, 1.706, 1.705, 1.703, 1.703, 1.703, 1.703, 1.704, 1.704, 1.705, 1.704, 1.704, 1.702, 1.701, 1.698, 1.698, 1.696, 1.696 + ] + } + ], + "luminance_lut": + [ + 1.425, 1.393, 1.341, 1.295, 1.258, 1.226, 1.201, 1.181, 1.162, 1.146, 1.133, 1.123, 1.115, 1.111, 1.107, 1.106, 1.106, 1.107, 1.108, 1.111, 1.114, 1.122, 1.133, 1.148, 1.164, 1.184, 1.208, 1.236, 1.271, 1.309, 1.359, 1.381, + 1.397, 1.367, 1.317, 1.274, 1.237, 1.207, 1.183, 1.163, 1.146, 1.133, 1.123, 1.114, 1.107, 1.101, 1.098, 1.096, 1.096, 1.096, 1.097, 1.102, 1.106, 1.112, 1.122, 1.133, 1.148, 1.166, 1.187, 1.215, 1.249, 1.288, 1.335, 1.359, + 1.374, 1.341, 1.292, 1.251, 1.215, 1.186, 1.166, 1.146, 1.131, 1.117, 1.108, 1.099, 1.091, 1.088, 1.084, 1.082, 1.081, 1.082, 1.084, 1.088, 1.093, 1.098, 1.107, 1.118, 1.133, 1.149, 1.169, 1.195, 1.228, 1.267, 1.313, 1.335, + 1.352, 1.318, 1.271, 1.231, 1.196, 1.169, 1.149, 1.131, 1.115, 1.103, 1.093, 1.086, 1.079, 1.074, 1.071, 1.069, 1.069, 1.069, 1.071, 1.076, 1.079, 1.085, 1.094, 1.102, 1.117, 1.133, 1.152, 1.176, 1.208, 1.246, 1.289, 1.313, + 1.333, 1.298, 1.253, 1.212, 1.179, 1.153, 1.134, 1.116, 1.102, 1.089, 1.079, 1.072, 1.066, 1.062, 1.059, 1.058, 1.057, 1.057, 1.059, 1.064, 1.068, 1.072, 1.081, 1.091, 1.102, 1.119, 1.137, 1.161, 1.191, 1.227, 1.271, 1.293, + 1.317, 1.281, 1.235, 1.196, 1.165, 1.139, 1.119, 1.104, 1.089, 1.078, 1.068, 1.062, 1.055, 1.051, 1.048, 1.047, 1.047, 1.047, 1.048, 1.053, 1.056, 1.061, 1.069, 1.079, 1.091, 1.105, 1.126, 1.147, 1.177, 1.212, 1.253, 1.278, + 1.301, 1.265, 1.221, 1.181, 1.151, 1.127, 1.108, 1.091, 1.078, 1.068, 1.059, 1.051, 1.045, 1.041, 1.038, 1.037, 1.036, 1.037, 1.038, 1.042, 1.046, 1.051, 1.059, 1.069, 1.081, 1.096, 1.113, 1.135, 1.164, 1.198, 1.238, 1.264, + 1.286, 1.251, 1.207, 1.169, 1.141, 1.116, 1.098, 1.081, 1.068, 1.058, 1.049, 1.042, 1.037, 1.033, 1.031, 1.029, 1.028, 1.028, 1.029, 1.033, 1.037, 1.043, 1.051, 1.059, 1.071, 1.086, 1.104, 1.124, 1.152, 1.185, 1.225, 1.252, + 1.275, 1.239, 1.196, 1.161, 1.132, 1.107, 1.089, 1.073, 1.059, 1.049, 1.041, 1.035, 1.028, 1.024, 1.023, 1.021, 1.021, 1.021, 1.022, 1.024, 1.029, 1.036, 1.043, 1.051, 1.063, 1.078, 1.095, 1.115, 1.143, 1.175, 1.214, 1.243, + 1.267, 1.227, 1.187, 1.152, 1.122, 1.101, 1.081, 1.067, 1.054, 1.042, 1.035, 1.028, 1.023, 1.018, 1.015, 1.014, 1.014, 1.014, 1.016, 1.019, 1.024, 1.029, 1.036, 1.045, 1.056, 1.071, 1.088, 1.107, 1.134, 1.167, 1.204, 1.234, + 1.261, 1.219, 1.179, 1.145, 1.116, 1.095, 1.076, 1.061, 1.047, 1.037, 1.031, 1.023, 1.018, 1.014, 1.011, 1.009, 1.009, 1.009, 1.011, 1.013, 1.018, 1.024, 1.031, 1.039, 1.049, 1.065, 1.083, 1.102, 1.128, 1.161, 1.196, 1.228, + 1.256, 1.213, 1.173, 1.139, 1.111, 1.091, 1.071, 1.056, 1.043, 1.033, 1.026, 1.019, 1.014, 1.009, 1.006, 1.005, 1.004, 1.004, 1.006, 1.009, 1.013, 1.018, 1.026, 1.035, 1.046, 1.061, 1.078, 1.097, 1.123, 1.154, 1.191, 1.222, + 1.251, 1.208, 1.169, 1.137, 1.108, 1.088, 1.069, 1.053, 1.039, 1.029, 1.023, 1.015, 1.011, 1.006, 1.004, 1.003, 1.001, 1.002, 1.003, 1.006, 1.009, 1.015, 1.022, 1.032, 1.044, 1.057, 1.076, 1.094, 1.119, 1.149, 1.186, 1.218, + 1.249, 1.205, 1.167, 1.133, 1.107, 1.085, 1.067, 1.052, 1.038, 1.029, 1.021, 1.013, 1.008, 1.004, 1.003, 1.001, 1.001, 1.001, 1.002, 1.004, 1.007, 1.013, 1.021, 1.031, 1.042, 1.055, 1.073, 1.093, 1.116, 1.147, 1.182, 1.218, + 1.249, 1.204, 1.165, 1.132, 1.106, 1.085, 1.067, 1.051, 1.038, 1.029, 1.019, 1.013, 1.007, 1.003, 1.002, 1.001, 1.001, 1.001, 1.001, 1.004, 1.007, 1.013, 1.021, 1.029, 1.042, 1.055, 1.072, 1.091, 1.115, 1.145, 1.181, 1.217, + 1.249, 1.204, 1.165, 1.132, 1.107, 1.086, 1.067, 1.051, 1.038, 1.029, 1.019, 1.013, 1.008, 1.004, 1.002, 1.001, 1.001, 1.001, 1.002, 1.004, 1.007, 1.014, 1.021, 1.029, 1.042, 1.056, 1.072, 1.091, 1.115, 1.145, 1.181, 1.217, + 1.251, 1.205, 1.166, 1.133, 1.108, 1.087, 1.068, 1.052, 1.039, 1.031, 1.021, 1.014, 1.009, 1.006, 1.003, 1.002, 1.001, 1.001, 1.003, 1.006, 1.009, 1.014, 1.022, 1.031, 1.043, 1.056, 1.073, 1.093, 1.116, 1.145, 1.182, 1.218, + 1.252, 1.208, 1.168, 1.137, 1.111, 1.089, 1.071, 1.055, 1.043, 1.033, 1.023, 1.016, 1.012, 1.009, 1.006, 1.005, 1.004, 1.004, 1.006, 1.008, 1.012, 1.017, 1.024, 1.034, 1.045, 1.059, 1.075, 1.095, 1.119, 1.149, 1.185, 1.218, + 1.256, 1.213, 1.173, 1.142, 1.115, 1.093, 1.075, 1.059, 1.047, 1.036, 1.027, 1.021, 1.016, 1.012, 1.011, 1.009, 1.008, 1.008, 1.009, 1.012, 1.016, 1.021, 1.028, 1.038, 1.049, 1.064, 1.081, 1.099, 1.126, 1.155, 1.192, 1.223, + 1.261, 1.221, 1.179, 1.148, 1.121, 1.099, 1.081, 1.065, 1.052, 1.042, 1.032, 1.026, 1.021, 1.017, 1.015, 1.014, 1.014, 1.013, 1.013, 1.016, 1.021, 1.026, 1.033, 1.043, 1.054, 1.068, 1.085, 1.106, 1.132, 1.161, 1.199, 1.228, + 1.267, 1.228, 1.188, 1.155, 1.128, 1.105, 1.086, 1.071, 1.059, 1.047, 1.038, 1.031, 1.027, 1.022, 1.021, 1.019, 1.019, 1.019, 1.019, 1.022, 1.026, 1.032, 1.038, 1.049, 1.061, 1.075, 1.092, 1.112, 1.138, 1.169, 1.207, 1.236, + 1.278, 1.241, 1.199, 1.164, 1.137, 1.114, 1.094, 1.078, 1.066, 1.055, 1.046, 1.038, 1.032, 1.029, 1.027, 1.027, 1.027, 1.027, 1.027, 1.029, 1.032, 1.038, 1.047, 1.056, 1.067, 1.083, 1.099, 1.121, 1.146, 1.178, 1.217, 1.244, + 1.291, 1.252, 1.211, 1.175, 1.147, 1.124, 1.103, 1.088, 1.075, 1.063, 1.054, 1.046, 1.041, 1.036, 1.035, 1.035, 1.035, 1.035, 1.036, 1.038, 1.041, 1.047, 1.055, 1.065, 1.075, 1.092, 1.111, 1.132, 1.157, 1.189, 1.231, 1.255, + 1.303, 1.265, 1.222, 1.187, 1.158, 1.133, 1.112, 1.097, 1.083, 1.072, 1.063, 1.054, 1.048, 1.043, 1.043, 1.043, 1.043, 1.043, 1.043, 1.046, 1.049, 1.055, 1.065, 1.074, 1.086, 1.102, 1.119, 1.144, 1.171, 1.203, 1.243, 1.268, + 1.317, 1.282, 1.236, 1.201, 1.171, 1.146, 1.125, 1.109, 1.095, 1.083, 1.072, 1.064, 1.058, 1.054, 1.052, 1.051, 1.051, 1.053, 1.054, 1.057, 1.061, 1.065, 1.074, 1.086, 1.099, 1.113, 1.133, 1.156, 1.183, 1.217, 1.259, 1.282, + 1.335, 1.301, 1.254, 1.218, 1.186, 1.159, 1.138, 1.121, 1.108, 1.095, 1.085, 1.076, 1.069, 1.066, 1.065, 1.063, 1.062, 1.063, 1.065, 1.068, 1.073, 1.078, 1.087, 1.098, 1.113, 1.126, 1.146, 1.171, 1.199, 1.235, 1.277, 1.299, + 1.356, 1.321, 1.274, 1.235, 1.202, 1.175, 1.153, 1.137, 1.121, 1.108, 1.097, 1.089, 1.084, 1.081, 1.077, 1.075, 1.075, 1.075, 1.077, 1.081, 1.086, 1.091, 1.099, 1.113, 1.126, 1.144, 1.162, 1.187, 1.218, 1.255, 1.297, 1.321, + 1.376, 1.344, 1.296, 1.257, 1.223, 1.194, 1.171, 1.153, 1.137, 1.124, 1.112, 1.104, 1.099, 1.095, 1.093, 1.091, 1.089, 1.091, 1.092, 1.095, 1.101, 1.108, 1.116, 1.128, 1.144, 1.161, 1.181, 1.206, 1.237, 1.275, 1.321, 1.347, + 1.403, 1.369, 1.319, 1.279, 1.244, 1.214, 1.191, 1.171, 1.154, 1.139, 1.129, 1.121, 1.115, 1.111, 1.109, 1.106, 1.105, 1.105, 1.108, 1.112, 1.117, 1.124, 1.135, 1.147, 1.162, 1.181, 1.203, 1.228, 1.262, 1.301, 1.347, 1.377, + 1.429, 1.398, 1.348, 1.306, 1.269, 1.237, 1.214, 1.191, 1.173, 1.158, 1.146, 1.138, 1.132, 1.128, 1.125, 1.123, 1.122, 1.123, 1.125, 1.129, 1.136, 1.142, 1.154, 1.166, 1.182, 1.203, 1.226, 1.253, 1.288, 1.329, 1.377, 1.406, + 1.465, 1.429, 1.377, 1.335, 1.295, 1.262, 1.236, 1.214, 1.194, 1.179, 1.167, 1.157, 1.151, 1.146, 1.144, 1.142, 1.142, 1.142, 1.144, 1.149, 1.154, 1.163, 1.174, 1.187, 1.205, 1.226, 1.251, 1.279, 1.315, 1.357, 1.406, 1.437, + 1.493, 1.465, 1.409, 1.364, 1.323, 1.289, 1.261, 1.235, 1.214, 1.194, 1.179, 1.171, 1.166, 1.163, 1.161, 1.161, 1.161, 1.161, 1.162, 1.164, 1.168, 1.175, 1.187, 1.205, 1.225, 1.251, 1.276, 1.306, 1.344, 1.387, 1.437, 1.455 + ], + "sigma": 0.0007, + "sigma_Cb": 0.00098 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2500, + "ccm": + [ + 1.95054, -0.57435, -0.37619, + -0.46945, 1.86661, -0.39716, + 0.07977, -1.14072, 2.06095 + ] + }, + { + "ct": 2800, + "ccm": + [ + 1.94104, -0.60261, -0.33844, + -0.43162, 1.85422, -0.42261, + 0.03799, -0.95022, 1.91222 + ] + }, + { + "ct": 2900, + "ccm": + [ + 1.91828, -0.59569, -0.32258, + -0.51902, 2.09091, -0.57189, + -0.03324, -0.73462, 1.76785 + ] + }, + { + "ct": 3620, + "ccm": + [ + 1.97199, -0.66403, -0.30797, + -0.46411, 2.02612, -0.56201, + -0.07764, -0.61178, 1.68942 + ] + }, + { + "ct": 4560, + "ccm": + [ + 2.15256, -0.84787, -0.30469, + -0.48422, 2.28962, -0.80541, + -0.15113, -0.53014, 1.68127 + ] + }, + { + "ct": 5600, + "ccm": + [ + 2.04576, -0.74771, -0.29805, + -0.36332, 1.98993, -0.62662, + -0.09328, -0.46543, 1.55871 + ] + }, + { + "ct": 7400, + "ccm": + [ + 2.37532, -0.83069, -0.54462, + -0.48279, 2.84309, -1.36031, + -0.21178, -0.66532, 1.87709 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.06, + "strength": 0.5, + "limit": 0.5 + } + }, + { + "rpi.cac": + { + "lut_rx": + [ + -0.15, -0.12, -0.08, -0.03, 0.02, 0.06, 0.11, 0.14, 0.22, + -0.15, -0.12, -0.08, -0.04, 0.01, 0.05, 0.1, 0.14, 0.21, + -0.15, -0.12, -0.08, -0.04, 0.01, 0.06, 0.1, 0.14, 0.21, + -0.14, -0.11, -0.08, -0.04, 0.01, 0.05, 0.1, 0.13, 0.2, + -0.13, -0.11, -0.08, -0.03, 0.01, 0.05, 0.09, 0.13, 0.2, + -0.14, -0.11, -0.07, -0.03, 0.01, 0.06, 0.09, 0.14, 0.21, + -0.14, -0.11, -0.07, -0.03, 0.01, 0.05, 0.09, 0.13, 0.21, + -0.14, -0.11, -0.07, -0.03, 0.01, 0.05, 0.09, 0.13, 0.2, + -0.14, -0.1, -0.07, -0.03, 0.01, 0.06, 0.09, 0.13, 0.2 + ], + "lut_ry": + [ + -0.13, -0.13, -0.12, -0.13, -0.13, -0.14, -0.14, -0.13, -0.13, + -0.1, -0.1, -0.1, -0.1, -0.11, -0.11, -0.11, -0.11, -0.1, + -0.08, -0.08, -0.09, -0.09, -0.1, -0.09, -0.09, -0.1, -0.09, + -0.07, -0.06, -0.06, -0.07, -0.07, -0.07, -0.07, -0.07, -0.09, + -0.04, -0.03, -0.04, -0.04, -0.04, -0.04, -0.05, -0.04, -0.06, + -0.02, -0.01, -0.01, -0.02, -0.02, -0.02, -0.02, -0.02, -0.03, + -0.0, 0.01, 0.0, -0.0, -0.01, -0.01, -0.0, 0.0, -0.0, + 0.02, 0.02, 0.02, 0.01, 0.01, 0.01, 0.01, 0.02, 0.02, + 0.04, 0.05, 0.04, 0.03, 0.03, 0.03, 0.03, 0.04, 0.04 + ], + "lut_bx": + [ + -0.35, -0.28, -0.22, -0.13, -0.05, 0.02, 0.1, 0.16, 0.28, + -0.32, -0.25, -0.19, -0.12, -0.05, 0.02, 0.09, 0.16, 0.28, + -0.32, -0.26, -0.19, -0.12, -0.05, 0.02, 0.09, 0.15, 0.28, + -0.32, -0.25, -0.19, -0.11, -0.05, 0.02, 0.09, 0.16, 0.28, + -0.3, -0.25, -0.19, -0.11, -0.04, 0.02, 0.09, 0.16, 0.28, + -0.3, -0.25, -0.18, -0.11, -0.05, 0.02, 0.09, 0.15, 0.28, + -0.3, -0.25, -0.19, -0.11, -0.05, 0.02, 0.09, 0.15, 0.27, + -0.3, -0.24, -0.17, -0.11, -0.04, 0.02, 0.09, 0.15, 0.27, + -0.27, -0.21, -0.15, -0.09, -0.03, 0.03, 0.09, 0.15, 0.27 + ], + "lut_by": + [ + -0.23, -0.22, -0.22, -0.21, -0.21, -0.21, -0.21, -0.21, -0.23, + -0.19, -0.17, -0.17, -0.17, -0.17, -0.17, -0.17, -0.17, -0.19, + -0.16, -0.13, -0.13, -0.13, -0.12, -0.13, -0.12, -0.13, -0.15, + -0.11, -0.08, -0.08, -0.08, -0.07, -0.08, -0.08, -0.08, -0.1, + -0.07, -0.04, -0.04, -0.04, -0.03, -0.03, -0.04, -0.04, -0.07, + -0.02, 0.01, 0.01, 0.01, 0.02, 0.02, 0.01, 0.01, -0.02, + 0.03, 0.07, 0.07, 0.07, 0.07, 0.07, 0.06, 0.06, 0.05, + 0.09, 0.1, 0.1, 0.1, 0.12, 0.12, 0.11, 0.11, 0.09, + 0.13, 0.13, 0.13, 0.14, 0.18, 0.2, 0.19, 0.18, 0.16 + ] + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx296_6mm.json b/src/ipa/rpi/pisp/data/imx296_6mm.json new file mode 100644 index 000000000..abbcaa83f --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx296_6mm.json @@ -0,0 +1,1247 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 3840 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 4724, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 860, + "reference_Y": 14551 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.751 + } + }, + { + "rpi.geq": + { + "offset": 226, + "slope": 0.01032 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2875.0, 0.4699, 0.3209, + 3610.0, 0.4089, 0.4265, + 4640.0, 0.3281, 0.5417, + 5912.0, 0.2992, 0.5771, + 7630.0, 0.2285, 0.6524 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.01783, + "transverse_neg": 0.02154 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.16, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 2.084, 2.084, 2.085, 2.085, 2.085, 2.087, 2.088, 2.087, 2.086, 2.082, 2.082, 2.084, 2.086, 2.088, 2.088, 2.088, 2.087, 2.088, 2.088, 2.091, 2.092, 2.093, 2.093, 2.093, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.091, 2.088, + 2.086, 2.086, 2.087, 2.088, 2.089, 2.089, 2.091, 2.089, 2.087, 2.086, 2.087, 2.088, 2.091, 2.089, 2.091, 2.089, 2.091, 2.091, 2.091, 2.092, 2.093, 2.093, 2.094, 2.095, 2.094, 2.094, 2.095, 2.096, 2.096, 2.096, 2.096, 2.093, + 2.087, 2.087, 2.088, 2.091, 2.091, 2.091, 2.091, 2.089, 2.088, 2.088, 2.089, 2.091, 2.092, 2.092, 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.094, 2.095, 2.096, 2.096, 2.096, 2.096, 2.097, 2.097, 2.097, 2.097, 2.096, + 2.089, 2.088, 2.089, 2.091, 2.091, 2.092, 2.091, 2.089, 2.088, 2.088, 2.089, 2.091, 2.092, 2.092, 2.092, 2.091, 2.092, 2.092, 2.092, 2.092, 2.093, 2.094, 2.095, 2.096, 2.096, 2.096, 2.096, 2.097, 2.098, 2.097, 2.097, 2.097, + 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.091, 2.091, 2.089, 2.088, 2.088, 2.089, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.092, 2.093, 2.094, 2.095, 2.095, 2.096, 2.096, 2.097, 2.099, 2.098, 2.097, 2.097, 2.097, + 2.091, 2.091, 2.092, 2.093, 2.093, 2.093, 2.092, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.093, 2.095, 2.096, 2.096, 2.097, 2.097, 2.099, 2.099, 2.099, 2.098, 2.097, + 2.092, 2.092, 2.092, 2.093, 2.093, 2.092, 2.091, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.091, 2.091, 2.092, 2.092, 2.093, 2.095, 2.096, 2.096, 2.097, 2.097, 2.099, 2.099, 2.101, 2.099, 2.098, + 2.092, 2.092, 2.093, 2.093, 2.093, 2.092, 2.091, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.089, 2.091, 2.091, 2.091, 2.092, 2.092, 2.094, 2.095, 2.096, 2.097, 2.098, 2.098, 2.098, 2.101, 2.101, 2.099, 2.098, + 2.092, 2.092, 2.093, 2.093, 2.094, 2.092, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.089, 2.089, 2.091, 2.092, 2.092, 2.092, 2.092, 2.094, 2.096, 2.096, 2.097, 2.098, 2.099, 2.099, 2.099, 2.099, 2.099, 2.097, + 2.093, 2.094, 2.094, 2.094, 2.095, 2.093, 2.092, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.094, 2.096, 2.096, 2.097, 2.098, 2.098, 2.101, 2.101, 2.099, 2.099, 2.099, + 2.094, 2.094, 2.094, 2.095, 2.095, 2.095, 2.091, 2.089, 2.091, 2.089, 2.089, 2.089, 2.091, 2.091, 2.089, 2.091, 2.091, 2.091, 2.092, 2.092, 2.093, 2.093, 2.095, 2.096, 2.097, 2.098, 2.098, 2.099, 2.101, 2.101, 2.099, 2.099, + 2.095, 2.094, 2.094, 2.095, 2.096, 2.095, 2.091, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.091, 2.093, 2.093, 2.093, 2.093, 2.094, 2.096, 2.097, 2.098, 2.099, 2.101, 2.101, 2.102, 2.101, 2.099, + 2.095, 2.095, 2.095, 2.095, 2.095, 2.095, 2.092, 2.089, 2.089, 2.088, 2.089, 2.089, 2.091, 2.091, 2.092, 2.092, 2.092, 2.092, 2.093, 2.093, 2.093, 2.093, 2.093, 2.095, 2.096, 2.099, 2.099, 2.101, 2.102, 2.103, 2.102, 2.101, + 2.095, 2.095, 2.095, 2.095, 2.095, 2.094, 2.092, 2.091, 2.089, 2.089, 2.089, 2.089, 2.091, 2.091, 2.091, 2.093, 2.093, 2.093, 2.092, 2.092, 2.094, 2.094, 2.094, 2.096, 2.096, 2.098, 2.099, 2.102, 2.103, 2.103, 2.102, 2.102, + 2.095, 2.095, 2.095, 2.096, 2.096, 2.094, 2.093, 2.091, 2.091, 2.089, 2.089, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.093, 2.092, 2.093, 2.094, 2.094, 2.095, 2.096, 2.097, 2.098, 2.099, 2.103, 2.103, 2.103, 2.101, 2.101, + 2.095, 2.096, 2.096, 2.097, 2.096, 2.095, 2.093, 2.092, 2.091, 2.091, 2.091, 2.092, 2.092, 2.092, 2.092, 2.092, 2.092, 2.094, 2.093, 2.093, 2.094, 2.095, 2.096, 2.096, 2.097, 2.099, 2.101, 2.103, 2.103, 2.103, 2.101, 2.099, + 2.096, 2.096, 2.097, 2.096, 2.097, 2.096, 2.094, 2.092, 2.092, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.093, 2.093, 2.094, 2.093, 2.093, 2.093, 2.095, 2.096, 2.097, 2.099, 2.099, 2.101, 2.103, 2.103, 2.102, 2.101, 2.101, + 2.096, 2.096, 2.097, 2.097, 2.097, 2.096, 2.094, 2.093, 2.092, 2.092, 2.091, 2.091, 2.092, 2.092, 2.092, 2.093, 2.093, 2.094, 2.093, 2.093, 2.094, 2.095, 2.096, 2.097, 2.099, 2.101, 2.101, 2.102, 2.102, 2.102, 2.101, 2.101, + 2.097, 2.096, 2.097, 2.097, 2.097, 2.097, 2.095, 2.093, 2.093, 2.093, 2.093, 2.092, 2.091, 2.091, 2.092, 2.092, 2.093, 2.094, 2.093, 2.093, 2.093, 2.095, 2.096, 2.097, 2.099, 2.101, 2.102, 2.102, 2.102, 2.101, 2.101, 2.101, + 2.098, 2.097, 2.096, 2.097, 2.097, 2.097, 2.095, 2.094, 2.094, 2.094, 2.092, 2.092, 2.092, 2.092, 2.092, 2.092, 2.094, 2.095, 2.095, 2.094, 2.093, 2.095, 2.096, 2.099, 2.101, 2.101, 2.102, 2.102, 2.102, 2.101, 2.101, 2.102, + 2.098, 2.097, 2.096, 2.096, 2.097, 2.097, 2.095, 2.094, 2.095, 2.093, 2.093, 2.092, 2.092, 2.092, 2.094, 2.094, 2.096, 2.095, 2.095, 2.095, 2.095, 2.096, 2.098, 2.099, 2.099, 2.101, 2.102, 2.103, 2.102, 2.102, 2.101, 2.102, + 2.098, 2.097, 2.097, 2.098, 2.097, 2.096, 2.095, 2.095, 2.095, 2.094, 2.093, 2.093, 2.094, 2.094, 2.094, 2.095, 2.096, 2.096, 2.096, 2.095, 2.097, 2.097, 2.098, 2.099, 2.099, 2.101, 2.101, 2.103, 2.104, 2.103, 2.102, 2.101, + 2.099, 2.098, 2.098, 2.098, 2.097, 2.096, 2.096, 2.095, 2.095, 2.095, 2.095, 2.095, 2.094, 2.094, 2.094, 2.094, 2.096, 2.097, 2.097, 2.097, 2.097, 2.098, 2.099, 2.101, 2.101, 2.101, 2.101, 2.104, 2.105, 2.105, 2.103, 2.102, + 2.101, 2.099, 2.099, 2.099, 2.099, 2.098, 2.097, 2.097, 2.097, 2.096, 2.096, 2.095, 2.095, 2.095, 2.095, 2.095, 2.096, 2.098, 2.098, 2.097, 2.097, 2.098, 2.099, 2.101, 2.101, 2.102, 2.103, 2.104, 2.105, 2.105, 2.104, 2.103, + 2.102, 2.102, 2.099, 2.098, 2.099, 2.099, 2.099, 2.098, 2.097, 2.097, 2.097, 2.097, 2.097, 2.096, 2.096, 2.097, 2.098, 2.098, 2.099, 2.099, 2.099, 2.101, 2.101, 2.102, 2.104, 2.105, 2.106, 2.106, 2.106, 2.104, 2.104, 2.104, + 2.102, 2.101, 2.099, 2.099, 2.099, 2.101, 2.101, 2.101, 2.099, 2.098, 2.098, 2.098, 2.098, 2.098, 2.098, 2.098, 2.099, 2.099, 2.099, 2.099, 2.101, 2.101, 2.102, 2.103, 2.105, 2.106, 2.106, 2.106, 2.106, 2.105, 2.104, 2.104, + 2.099, 2.099, 2.099, 2.098, 2.098, 2.099, 2.101, 2.101, 2.099, 2.098, 2.097, 2.098, 2.098, 2.099, 2.098, 2.098, 2.099, 2.099, 2.101, 2.101, 2.101, 2.101, 2.102, 2.104, 2.105, 2.105, 2.105, 2.106, 2.106, 2.104, 2.104, 2.103, + 2.096, 2.097, 2.097, 2.097, 2.097, 2.099, 2.099, 2.099, 2.099, 2.097, 2.097, 2.098, 2.098, 2.099, 2.098, 2.097, 2.097, 2.099, 2.101, 2.101, 2.101, 2.101, 2.101, 2.103, 2.105, 2.105, 2.105, 2.104, 2.104, 2.103, 2.101, 2.101, + 2.096, 2.096, 2.096, 2.097, 2.097, 2.098, 2.098, 2.099, 2.097, 2.096, 2.096, 2.097, 2.098, 2.098, 2.097, 2.097, 2.096, 2.098, 2.098, 2.099, 2.101, 2.101, 2.101, 2.102, 2.104, 2.105, 2.104, 2.104, 2.103, 2.101, 2.099, 2.098, + 2.096, 2.096, 2.096, 2.096, 2.097, 2.097, 2.097, 2.097, 2.097, 2.097, 2.096, 2.097, 2.098, 2.097, 2.097, 2.096, 2.096, 2.098, 2.098, 2.098, 2.099, 2.099, 2.101, 2.101, 2.103, 2.103, 2.104, 2.104, 2.102, 2.101, 2.099, 2.098, + 2.097, 2.096, 2.095, 2.096, 2.098, 2.098, 2.098, 2.098, 2.097, 2.098, 2.097, 2.097, 2.097, 2.097, 2.096, 2.096, 2.096, 2.097, 2.097, 2.098, 2.099, 2.099, 2.099, 2.101, 2.102, 2.103, 2.104, 2.104, 2.104, 2.101, 2.099, 2.098, + 2.097, 2.096, 2.095, 2.097, 2.099, 2.099, 2.099, 2.099, 2.099, 2.099, 2.098, 2.098, 2.097, 2.096, 2.096, 2.097, 2.097, 2.098, 2.097, 2.099, 2.101, 2.099, 2.099, 2.099, 2.102, 2.102, 2.104, 2.105, 2.105, 2.102, 2.099, 2.098 + ] + }, + { + "ct": 5000, + "table": + [ + 3.431, 3.437, 3.439, 3.439, 3.436, 3.438, 3.441, 3.441, 3.441, 3.441, 3.442, 3.443, 3.443, 3.444, 3.446, 3.448, 3.451, 3.451, 3.452, 3.451, 3.449, 3.449, 3.452, 3.453, 3.454, 3.454, 3.453, 3.456, 3.456, 3.456, 3.451, 3.448, + 3.445, 3.446, 3.445, 3.449, 3.453, 3.451, 3.451, 3.446, 3.447, 3.446, 3.447, 3.451, 3.453, 3.455, 3.454, 3.453, 3.453, 3.454, 3.455, 3.456, 3.457, 3.459, 3.461, 3.462, 3.463, 3.463, 3.465, 3.466, 3.467, 3.465, 3.459, 3.457, + 3.449, 3.449, 3.449, 3.454, 3.455, 3.454, 3.453, 3.451, 3.451, 3.448, 3.451, 3.451, 3.455, 3.456, 3.457, 3.456, 3.456, 3.458, 3.457, 3.459, 3.459, 3.461, 3.464, 3.467, 3.467, 3.466, 3.468, 3.469, 3.471, 3.468, 3.465, 3.462, + 3.451, 3.448, 3.451, 3.453, 3.457, 3.455, 3.454, 3.449, 3.449, 3.448, 3.449, 3.449, 3.455, 3.455, 3.456, 3.455, 3.454, 3.455, 3.455, 3.457, 3.458, 3.458, 3.461, 3.464, 3.466, 3.468, 3.469, 3.469, 3.469, 3.468, 3.465, 3.463, + 3.449, 3.449, 3.451, 3.453, 3.456, 3.455, 3.452, 3.449, 3.448, 3.447, 3.446, 3.448, 3.451, 3.452, 3.454, 3.455, 3.455, 3.454, 3.457, 3.458, 3.458, 3.459, 3.461, 3.464, 3.464, 3.466, 3.467, 3.469, 3.469, 3.467, 3.463, 3.459, + 3.449, 3.451, 3.452, 3.454, 3.455, 3.454, 3.452, 3.449, 3.447, 3.447, 3.446, 3.449, 3.449, 3.451, 3.452, 3.452, 3.452, 3.452, 3.454, 3.455, 3.457, 3.459, 3.461, 3.464, 3.464, 3.466, 3.465, 3.468, 3.468, 3.469, 3.465, 3.462, + 3.451, 3.451, 3.452, 3.453, 3.453, 3.453, 3.451, 3.449, 3.449, 3.447, 3.446, 3.447, 3.448, 3.451, 3.451, 3.451, 3.453, 3.452, 3.452, 3.452, 3.457, 3.458, 3.461, 3.463, 3.464, 3.465, 3.464, 3.466, 3.468, 3.469, 3.466, 3.463, + 3.451, 3.451, 3.451, 3.454, 3.453, 3.453, 3.451, 3.448, 3.448, 3.444, 3.444, 3.444, 3.448, 3.449, 3.449, 3.448, 3.449, 3.449, 3.451, 3.452, 3.454, 3.457, 3.461, 3.462, 3.464, 3.466, 3.466, 3.467, 3.468, 3.469, 3.466, 3.465, + 3.451, 3.451, 3.452, 3.455, 3.454, 3.453, 3.449, 3.448, 3.447, 3.447, 3.444, 3.446, 3.446, 3.446, 3.446, 3.447, 3.449, 3.449, 3.451, 3.452, 3.455, 3.457, 3.461, 3.462, 3.464, 3.466, 3.466, 3.468, 3.469, 3.468, 3.465, 3.462, + 3.453, 3.452, 3.454, 3.456, 3.455, 3.453, 3.449, 3.447, 3.446, 3.446, 3.445, 3.448, 3.447, 3.446, 3.445, 3.446, 3.448, 3.448, 3.449, 3.453, 3.455, 3.457, 3.459, 3.461, 3.464, 3.466, 3.467, 3.468, 3.468, 3.467, 3.465, 3.463, + 3.453, 3.453, 3.454, 3.456, 3.456, 3.451, 3.448, 3.447, 3.447, 3.446, 3.445, 3.446, 3.446, 3.446, 3.446, 3.446, 3.448, 3.448, 3.449, 3.452, 3.454, 3.456, 3.459, 3.459, 3.461, 3.465, 3.466, 3.468, 3.468, 3.468, 3.467, 3.465, + 3.451, 3.451, 3.452, 3.455, 3.456, 3.452, 3.448, 3.446, 3.446, 3.444, 3.446, 3.445, 3.446, 3.446, 3.447, 3.448, 3.449, 3.449, 3.449, 3.452, 3.453, 3.454, 3.458, 3.458, 3.461, 3.461, 3.464, 3.469, 3.469, 3.468, 3.466, 3.466, + 3.452, 3.452, 3.453, 3.454, 3.454, 3.453, 3.447, 3.446, 3.444, 3.444, 3.444, 3.444, 3.445, 3.446, 3.448, 3.451, 3.452, 3.453, 3.451, 3.453, 3.453, 3.455, 3.458, 3.459, 3.461, 3.462, 3.463, 3.468, 3.471, 3.469, 3.467, 3.467, + 3.454, 3.455, 3.457, 3.458, 3.458, 3.455, 3.449, 3.446, 3.445, 3.445, 3.445, 3.445, 3.447, 3.447, 3.448, 3.451, 3.452, 3.453, 3.452, 3.452, 3.452, 3.454, 3.457, 3.459, 3.459, 3.462, 3.464, 3.468, 3.469, 3.467, 3.465, 3.465, + 3.457, 3.455, 3.455, 3.459, 3.458, 3.454, 3.451, 3.448, 3.445, 3.445, 3.445, 3.446, 3.448, 3.449, 3.451, 3.452, 3.451, 3.453, 3.452, 3.452, 3.453, 3.457, 3.457, 3.461, 3.461, 3.463, 3.465, 3.468, 3.471, 3.468, 3.465, 3.463, + 3.458, 3.456, 3.456, 3.459, 3.457, 3.454, 3.452, 3.449, 3.447, 3.445, 3.446, 3.447, 3.447, 3.448, 3.449, 3.448, 3.449, 3.451, 3.451, 3.451, 3.451, 3.455, 3.456, 3.458, 3.462, 3.463, 3.464, 3.465, 3.467, 3.466, 3.464, 3.462, + 3.457, 3.456, 3.455, 3.457, 3.457, 3.454, 3.449, 3.447, 3.445, 3.445, 3.446, 3.446, 3.448, 3.446, 3.448, 3.449, 3.449, 3.451, 3.451, 3.451, 3.453, 3.455, 3.457, 3.459, 3.462, 3.464, 3.464, 3.465, 3.467, 3.464, 3.464, 3.463, + 3.458, 3.457, 3.455, 3.456, 3.456, 3.456, 3.453, 3.449, 3.447, 3.448, 3.447, 3.447, 3.447, 3.447, 3.447, 3.448, 3.449, 3.451, 3.451, 3.452, 3.453, 3.455, 3.458, 3.459, 3.459, 3.463, 3.464, 3.463, 3.464, 3.463, 3.464, 3.464, + 3.457, 3.456, 3.456, 3.456, 3.456, 3.456, 3.455, 3.449, 3.447, 3.448, 3.451, 3.449, 3.449, 3.449, 3.448, 3.449, 3.449, 3.451, 3.451, 3.452, 3.453, 3.456, 3.458, 3.459, 3.461, 3.462, 3.464, 3.464, 3.465, 3.464, 3.464, 3.463, + 3.457, 3.456, 3.455, 3.455, 3.455, 3.455, 3.453, 3.451, 3.449, 3.448, 3.448, 3.449, 3.449, 3.449, 3.448, 3.449, 3.451, 3.452, 3.452, 3.453, 3.454, 3.457, 3.458, 3.459, 3.462, 3.464, 3.465, 3.464, 3.465, 3.464, 3.463, 3.463, + 3.456, 3.456, 3.454, 3.453, 3.454, 3.453, 3.452, 3.451, 3.449, 3.448, 3.448, 3.449, 3.451, 3.451, 3.448, 3.449, 3.451, 3.454, 3.454, 3.454, 3.455, 3.457, 3.458, 3.461, 3.461, 3.462, 3.464, 3.464, 3.466, 3.465, 3.464, 3.464, + 3.459, 3.457, 3.456, 3.455, 3.454, 3.453, 3.453, 3.452, 3.452, 3.451, 3.449, 3.449, 3.449, 3.448, 3.447, 3.449, 3.451, 3.454, 3.455, 3.455, 3.456, 3.458, 3.459, 3.461, 3.461, 3.462, 3.463, 3.466, 3.469, 3.465, 3.465, 3.464, + 3.463, 3.461, 3.458, 3.458, 3.457, 3.456, 3.456, 3.454, 3.454, 3.452, 3.452, 3.451, 3.451, 3.449, 3.448, 3.448, 3.452, 3.454, 3.456, 3.455, 3.457, 3.458, 3.461, 3.464, 3.462, 3.461, 3.463, 3.466, 3.469, 3.469, 3.467, 3.467, + 3.466, 3.462, 3.461, 3.461, 3.459, 3.457, 3.457, 3.457, 3.456, 3.454, 3.455, 3.455, 3.455, 3.451, 3.452, 3.453, 3.454, 3.455, 3.456, 3.456, 3.459, 3.462, 3.463, 3.466, 3.466, 3.467, 3.466, 3.469, 3.471, 3.469, 3.468, 3.466, + 3.467, 3.463, 3.463, 3.459, 3.461, 3.459, 3.461, 3.459, 3.458, 3.456, 3.457, 3.456, 3.457, 3.455, 3.456, 3.455, 3.456, 3.457, 3.459, 3.461, 3.461, 3.464, 3.465, 3.468, 3.469, 3.469, 3.469, 3.469, 3.471, 3.468, 3.467, 3.468, + 3.467, 3.464, 3.459, 3.459, 3.462, 3.462, 3.462, 3.461, 3.461, 3.462, 3.461, 3.459, 3.461, 3.459, 3.458, 3.457, 3.459, 3.461, 3.462, 3.463, 3.464, 3.466, 3.468, 3.469, 3.471, 3.469, 3.471, 3.472, 3.471, 3.467, 3.466, 3.464, + 3.464, 3.462, 3.458, 3.457, 3.458, 3.461, 3.461, 3.461, 3.461, 3.462, 3.462, 3.461, 3.461, 3.459, 3.459, 3.459, 3.461, 3.461, 3.464, 3.465, 3.465, 3.468, 3.468, 3.469, 3.471, 3.469, 3.469, 3.469, 3.469, 3.464, 3.462, 3.459, + 3.457, 3.458, 3.455, 3.456, 3.456, 3.457, 3.459, 3.459, 3.459, 3.459, 3.458, 3.456, 3.458, 3.457, 3.458, 3.458, 3.458, 3.459, 3.461, 3.463, 3.465, 3.466, 3.468, 3.469, 3.471, 3.468, 3.466, 3.466, 3.465, 3.461, 3.459, 3.457, + 3.456, 3.455, 3.454, 3.454, 3.455, 3.456, 3.458, 3.459, 3.459, 3.456, 3.456, 3.456, 3.455, 3.456, 3.455, 3.455, 3.455, 3.454, 3.457, 3.461, 3.462, 3.464, 3.465, 3.467, 3.467, 3.466, 3.464, 3.464, 3.463, 3.461, 3.457, 3.456, + 3.456, 3.454, 3.453, 3.454, 3.454, 3.455, 3.458, 3.459, 3.459, 3.456, 3.455, 3.455, 3.455, 3.451, 3.453, 3.454, 3.454, 3.455, 3.455, 3.458, 3.461, 3.462, 3.461, 3.463, 3.465, 3.464, 3.463, 3.463, 3.462, 3.459, 3.456, 3.451, + 3.455, 3.452, 3.452, 3.452, 3.455, 3.457, 3.459, 3.459, 3.459, 3.458, 3.456, 3.456, 3.455, 3.453, 3.453, 3.455, 3.457, 3.457, 3.457, 3.461, 3.461, 3.461, 3.459, 3.462, 3.464, 3.464, 3.464, 3.463, 3.463, 3.459, 3.454, 3.451, + 3.452, 3.452, 3.452, 3.453, 3.457, 3.458, 3.458, 3.459, 3.459, 3.458, 3.457, 3.457, 3.455, 3.455, 3.458, 3.459, 3.458, 3.459, 3.459, 3.461, 3.461, 3.461, 3.459, 3.461, 3.463, 3.464, 3.466, 3.463, 3.461, 3.458, 3.453, 3.449 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 3.403, 3.399, 3.395, 3.391, 3.392, 3.394, 3.401, 3.403, 3.404, 3.404, 3.403, 3.399, 3.398, 3.396, 3.395, 3.396, 3.399, 3.403, 3.404, 3.401, 3.399, 3.398, 3.397, 3.401, 3.401, 3.401, 3.396, 3.394, 3.397, 3.396, 3.388, 3.364, + 3.403, 3.399, 3.393, 3.389, 3.391, 3.395, 3.401, 3.404, 3.406, 3.404, 3.403, 3.399, 3.399, 3.397, 3.397, 3.397, 3.401, 3.404, 3.404, 3.402, 3.398, 3.396, 3.397, 3.401, 3.401, 3.401, 3.395, 3.394, 3.396, 3.393, 3.387, 3.364, + 3.399, 3.398, 3.391, 3.385, 3.386, 3.395, 3.402, 3.405, 3.405, 3.404, 3.402, 3.399, 3.399, 3.398, 3.398, 3.398, 3.401, 3.404, 3.405, 3.403, 3.399, 3.396, 3.396, 3.398, 3.401, 3.401, 3.398, 3.394, 3.392, 3.389, 3.386, 3.364, + 3.398, 3.393, 3.386, 3.382, 3.385, 3.392, 3.399, 3.403, 3.405, 3.404, 3.402, 3.398, 3.398, 3.397, 3.397, 3.398, 3.401, 3.404, 3.405, 3.403, 3.398, 3.394, 3.394, 3.398, 3.401, 3.401, 3.396, 3.392, 3.391, 3.388, 3.383, 3.362, + 3.396, 3.391, 3.384, 3.381, 3.384, 3.389, 3.398, 3.402, 3.402, 3.401, 3.399, 3.395, 3.395, 3.395, 3.397, 3.397, 3.401, 3.402, 3.404, 3.403, 3.399, 3.394, 3.393, 3.395, 3.399, 3.399, 3.397, 3.391, 3.388, 3.384, 3.381, 3.363, + 3.391, 3.386, 3.382, 3.381, 3.385, 3.389, 3.396, 3.398, 3.399, 3.399, 3.398, 3.395, 3.394, 3.394, 3.395, 3.397, 3.399, 3.401, 3.403, 3.401, 3.398, 3.394, 3.393, 3.393, 3.394, 3.396, 3.395, 3.392, 3.387, 3.382, 3.378, 3.361, + 3.389, 3.386, 3.379, 3.379, 3.383, 3.388, 3.394, 3.397, 3.397, 3.397, 3.395, 3.393, 3.393, 3.393, 3.395, 3.395, 3.397, 3.398, 3.401, 3.399, 3.397, 3.395, 3.394, 3.391, 3.393, 3.393, 3.393, 3.389, 3.387, 3.381, 3.374, 3.357, + 3.386, 3.383, 3.376, 3.375, 3.381, 3.386, 3.394, 3.396, 3.396, 3.394, 3.392, 3.392, 3.394, 3.394, 3.395, 3.394, 3.396, 3.398, 3.399, 3.397, 3.397, 3.394, 3.393, 3.391, 3.389, 3.391, 3.392, 3.388, 3.386, 3.379, 3.372, 3.355, + 3.386, 3.379, 3.373, 3.373, 3.378, 3.384, 3.391, 3.396, 3.395, 3.393, 3.389, 3.391, 3.391, 3.393, 3.394, 3.393, 3.394, 3.396, 3.397, 3.396, 3.393, 3.394, 3.393, 3.392, 3.389, 3.389, 3.389, 3.389, 3.386, 3.378, 3.371, 3.351, + 3.379, 3.375, 3.371, 3.371, 3.376, 3.381, 3.388, 3.393, 3.394, 3.391, 3.386, 3.386, 3.388, 3.393, 3.392, 3.392, 3.393, 3.395, 3.394, 3.392, 3.389, 3.391, 3.391, 3.392, 3.389, 3.388, 3.389, 3.389, 3.383, 3.377, 3.369, 3.351, + 3.373, 3.371, 3.367, 3.368, 3.373, 3.381, 3.387, 3.389, 3.391, 3.389, 3.385, 3.386, 3.383, 3.389, 3.389, 3.392, 3.392, 3.394, 3.393, 3.389, 3.387, 3.387, 3.388, 3.389, 3.389, 3.388, 3.386, 3.386, 3.382, 3.374, 3.367, 3.345, + 3.371, 3.369, 3.365, 3.366, 3.373, 3.379, 3.386, 3.389, 3.391, 3.389, 3.385, 3.384, 3.382, 3.386, 3.387, 3.389, 3.391, 3.392, 3.391, 3.387, 3.385, 3.385, 3.386, 3.388, 3.388, 3.388, 3.386, 3.385, 3.381, 3.373, 3.367, 3.345, + 3.367, 3.365, 3.365, 3.366, 3.374, 3.379, 3.384, 3.388, 3.389, 3.387, 3.384, 3.383, 3.383, 3.385, 3.385, 3.386, 3.388, 3.389, 3.388, 3.386, 3.383, 3.382, 3.384, 3.386, 3.387, 3.386, 3.381, 3.381, 3.379, 3.372, 3.364, 3.344, + 3.365, 3.363, 3.362, 3.367, 3.375, 3.379, 3.383, 3.384, 3.386, 3.384, 3.381, 3.379, 3.379, 3.383, 3.383, 3.384, 3.385, 3.387, 3.387, 3.385, 3.381, 3.381, 3.382, 3.384, 3.384, 3.385, 3.382, 3.379, 3.374, 3.369, 3.359, 3.343, + 3.359, 3.358, 3.361, 3.364, 3.373, 3.381, 3.384, 3.384, 3.385, 3.384, 3.381, 3.377, 3.379, 3.379, 3.382, 3.383, 3.384, 3.386, 3.386, 3.385, 3.381, 3.379, 3.381, 3.382, 3.382, 3.383, 3.379, 3.377, 3.371, 3.364, 3.357, 3.339, + 3.357, 3.356, 3.356, 3.362, 3.372, 3.379, 3.384, 3.384, 3.383, 3.381, 3.378, 3.376, 3.377, 3.379, 3.381, 3.382, 3.383, 3.385, 3.385, 3.383, 3.379, 3.379, 3.379, 3.381, 3.381, 3.382, 3.379, 3.372, 3.367, 3.362, 3.354, 3.334, + 3.357, 3.354, 3.357, 3.361, 3.372, 3.381, 3.385, 3.385, 3.384, 3.379, 3.376, 3.376, 3.376, 3.379, 3.381, 3.383, 3.383, 3.384, 3.383, 3.379, 3.378, 3.381, 3.379, 3.379, 3.379, 3.379, 3.378, 3.371, 3.363, 3.358, 3.354, 3.332, + 3.354, 3.351, 3.354, 3.359, 3.371, 3.379, 3.382, 3.384, 3.381, 3.378, 3.375, 3.374, 3.376, 3.378, 3.381, 3.383, 3.384, 3.382, 3.377, 3.377, 3.376, 3.377, 3.378, 3.378, 3.379, 3.379, 3.376, 3.367, 3.361, 3.357, 3.352, 3.333, + 3.352, 3.349, 3.351, 3.357, 3.372, 3.381, 3.383, 3.383, 3.381, 3.376, 3.372, 3.373, 3.375, 3.377, 3.382, 3.384, 3.384, 3.379, 3.376, 3.374, 3.374, 3.375, 3.375, 3.376, 3.377, 3.376, 3.373, 3.366, 3.361, 3.356, 3.347, 3.332, + 3.347, 3.346, 3.346, 3.355, 3.371, 3.377, 3.382, 3.381, 3.379, 3.372, 3.371, 3.371, 3.372, 3.375, 3.379, 3.383, 3.384, 3.379, 3.374, 3.373, 3.371, 3.373, 3.374, 3.375, 3.374, 3.374, 3.371, 3.365, 3.359, 3.352, 3.343, 3.331, + 3.345, 3.344, 3.345, 3.353, 3.367, 3.374, 3.382, 3.382, 3.376, 3.371, 3.369, 3.368, 3.369, 3.373, 3.377, 3.381, 3.379, 3.376, 3.373, 3.369, 3.368, 3.371, 3.372, 3.373, 3.371, 3.371, 3.369, 3.363, 3.357, 3.349, 3.341, 3.326, + 3.343, 3.341, 3.344, 3.351, 3.362, 3.371, 3.376, 3.376, 3.372, 3.369, 3.367, 3.366, 3.367, 3.369, 3.376, 3.378, 3.378, 3.375, 3.371, 3.367, 3.367, 3.368, 3.369, 3.369, 3.369, 3.368, 3.365, 3.361, 3.354, 3.347, 3.338, 3.321, + 3.341, 3.339, 3.342, 3.349, 3.359, 3.367, 3.371, 3.372, 3.371, 3.368, 3.366, 3.363, 3.365, 3.368, 3.371, 3.374, 3.376, 3.374, 3.368, 3.365, 3.365, 3.366, 3.368, 3.367, 3.367, 3.363, 3.361, 3.356, 3.352, 3.346, 3.336, 3.317, + 3.338, 3.336, 3.338, 3.346, 3.359, 3.364, 3.368, 3.369, 3.367, 3.366, 3.363, 3.362, 3.364, 3.364, 3.367, 3.371, 3.372, 3.369, 3.365, 3.362, 3.362, 3.365, 3.367, 3.367, 3.366, 3.362, 3.357, 3.353, 3.349, 3.342, 3.335, 3.317, + 3.334, 3.334, 3.336, 3.346, 3.354, 3.361, 3.365, 3.365, 3.365, 3.362, 3.361, 3.361, 3.362, 3.362, 3.364, 3.366, 3.368, 3.366, 3.361, 3.357, 3.357, 3.359, 3.363, 3.365, 3.363, 3.361, 3.355, 3.351, 3.346, 3.339, 3.336, 3.317, + 3.332, 3.332, 3.334, 3.344, 3.354, 3.359, 3.363, 3.365, 3.363, 3.361, 3.359, 3.359, 3.363, 3.363, 3.365, 3.365, 3.367, 3.366, 3.358, 3.356, 3.356, 3.358, 3.362, 3.364, 3.363, 3.359, 3.353, 3.348, 3.345, 3.339, 3.336, 3.315, + 3.332, 3.328, 3.331, 3.343, 3.351, 3.357, 3.358, 3.362, 3.361, 3.359, 3.357, 3.357, 3.361, 3.362, 3.364, 3.363, 3.363, 3.359, 3.356, 3.354, 3.354, 3.355, 3.358, 3.359, 3.361, 3.359, 3.351, 3.346, 3.344, 3.339, 3.336, 3.313, + 3.324, 3.324, 3.327, 3.334, 3.345, 3.351, 3.354, 3.356, 3.356, 3.354, 3.353, 3.354, 3.357, 3.358, 3.361, 3.358, 3.359, 3.355, 3.352, 3.348, 3.347, 3.351, 3.354, 3.358, 3.359, 3.355, 3.346, 3.343, 3.341, 3.336, 3.331, 3.312, + 3.318, 3.319, 3.321, 3.328, 3.337, 3.339, 3.345, 3.348, 3.346, 3.345, 3.347, 3.348, 3.351, 3.354, 3.356, 3.353, 3.354, 3.344, 3.343, 3.343, 3.343, 3.344, 3.347, 3.349, 3.353, 3.346, 3.341, 3.339, 3.331, 3.329, 3.325, 3.311, + 3.309, 3.313, 3.317, 3.325, 3.329, 3.332, 3.338, 3.339, 3.341, 3.339, 3.339, 3.342, 3.346, 3.346, 3.351, 3.351, 3.343, 3.338, 3.338, 3.339, 3.339, 3.339, 3.341, 3.341, 3.346, 3.343, 3.339, 3.332, 3.327, 3.326, 3.322, 3.309, + 3.305, 3.309, 3.317, 3.325, 3.328, 3.331, 3.334, 3.336, 3.337, 3.336, 3.339, 3.341, 3.344, 3.346, 3.348, 3.347, 3.341, 3.336, 3.335, 3.337, 3.339, 3.341, 3.339, 3.339, 3.342, 3.341, 3.337, 3.329, 3.326, 3.325, 3.321, 3.314, + 3.302, 3.306, 3.319, 3.325, 3.329, 3.331, 3.334, 3.335, 3.337, 3.337, 3.339, 3.341, 3.344, 3.346, 3.348, 3.347, 3.342, 3.336, 3.336, 3.338, 3.339, 3.341, 3.341, 3.341, 3.339, 3.338, 3.336, 3.331, 3.327, 3.324, 3.321, 3.314 + ] + }, + { + "ct": 5000, + "table": + [ + 1.726, 1.725, 1.723, 1.721, 1.723, 1.724, 1.724, 1.726, 1.727, 1.728, 1.729, 1.728, 1.725, 1.724, 1.726, 1.726, 1.727, 1.729, 1.727, 1.727, 1.724, 1.725, 1.724, 1.726, 1.725, 1.725, 1.724, 1.724, 1.722, 1.721, 1.719, 1.714, + 1.726, 1.724, 1.722, 1.721, 1.722, 1.723, 1.725, 1.726, 1.727, 1.727, 1.727, 1.726, 1.725, 1.725, 1.725, 1.726, 1.727, 1.728, 1.728, 1.727, 1.725, 1.724, 1.724, 1.725, 1.726, 1.725, 1.724, 1.723, 1.722, 1.721, 1.719, 1.714, + 1.724, 1.722, 1.719, 1.719, 1.721, 1.723, 1.726, 1.726, 1.727, 1.727, 1.727, 1.725, 1.726, 1.725, 1.725, 1.725, 1.726, 1.727, 1.728, 1.728, 1.725, 1.724, 1.724, 1.724, 1.726, 1.725, 1.724, 1.722, 1.722, 1.721, 1.719, 1.712, + 1.723, 1.721, 1.719, 1.719, 1.719, 1.723, 1.725, 1.726, 1.727, 1.727, 1.727, 1.726, 1.725, 1.725, 1.725, 1.726, 1.726, 1.728, 1.729, 1.728, 1.725, 1.723, 1.723, 1.725, 1.726, 1.725, 1.724, 1.722, 1.721, 1.719, 1.718, 1.711, + 1.722, 1.719, 1.719, 1.718, 1.719, 1.722, 1.725, 1.726, 1.726, 1.727, 1.727, 1.726, 1.725, 1.726, 1.726, 1.726, 1.727, 1.727, 1.728, 1.727, 1.726, 1.725, 1.724, 1.725, 1.726, 1.725, 1.724, 1.722, 1.721, 1.719, 1.715, 1.711, + 1.721, 1.717, 1.717, 1.716, 1.719, 1.722, 1.724, 1.726, 1.726, 1.727, 1.726, 1.726, 1.726, 1.726, 1.726, 1.727, 1.727, 1.727, 1.727, 1.727, 1.726, 1.725, 1.725, 1.725, 1.725, 1.725, 1.724, 1.722, 1.721, 1.718, 1.715, 1.707, + 1.718, 1.717, 1.716, 1.716, 1.718, 1.721, 1.725, 1.726, 1.726, 1.726, 1.725, 1.725, 1.725, 1.725, 1.726, 1.727, 1.727, 1.727, 1.727, 1.726, 1.726, 1.726, 1.725, 1.724, 1.724, 1.724, 1.723, 1.722, 1.721, 1.718, 1.715, 1.709, + 1.718, 1.716, 1.716, 1.715, 1.717, 1.721, 1.724, 1.725, 1.726, 1.725, 1.725, 1.724, 1.724, 1.725, 1.726, 1.726, 1.727, 1.727, 1.727, 1.726, 1.726, 1.726, 1.725, 1.723, 1.723, 1.723, 1.722, 1.722, 1.719, 1.718, 1.714, 1.709, + 1.718, 1.716, 1.715, 1.715, 1.717, 1.721, 1.723, 1.725, 1.726, 1.725, 1.724, 1.723, 1.724, 1.725, 1.725, 1.726, 1.726, 1.726, 1.726, 1.726, 1.726, 1.726, 1.725, 1.724, 1.724, 1.723, 1.722, 1.722, 1.721, 1.717, 1.714, 1.707, + 1.717, 1.716, 1.714, 1.714, 1.716, 1.721, 1.723, 1.725, 1.725, 1.725, 1.723, 1.723, 1.724, 1.726, 1.726, 1.726, 1.726, 1.725, 1.726, 1.725, 1.725, 1.725, 1.725, 1.725, 1.724, 1.723, 1.722, 1.721, 1.718, 1.716, 1.714, 1.706, + 1.715, 1.714, 1.714, 1.714, 1.716, 1.719, 1.722, 1.724, 1.725, 1.725, 1.723, 1.723, 1.724, 1.725, 1.725, 1.725, 1.726, 1.725, 1.725, 1.725, 1.724, 1.724, 1.724, 1.725, 1.724, 1.723, 1.722, 1.721, 1.718, 1.716, 1.713, 1.705, + 1.714, 1.714, 1.713, 1.714, 1.717, 1.719, 1.722, 1.724, 1.724, 1.724, 1.723, 1.722, 1.723, 1.724, 1.724, 1.724, 1.726, 1.725, 1.726, 1.725, 1.723, 1.723, 1.724, 1.724, 1.724, 1.723, 1.721, 1.719, 1.717, 1.715, 1.713, 1.706, + 1.712, 1.712, 1.712, 1.713, 1.718, 1.719, 1.721, 1.723, 1.724, 1.724, 1.722, 1.722, 1.723, 1.724, 1.724, 1.724, 1.725, 1.725, 1.725, 1.725, 1.723, 1.722, 1.724, 1.723, 1.723, 1.722, 1.721, 1.719, 1.717, 1.714, 1.711, 1.706, + 1.712, 1.711, 1.711, 1.713, 1.717, 1.719, 1.722, 1.724, 1.724, 1.723, 1.722, 1.722, 1.723, 1.724, 1.724, 1.724, 1.724, 1.725, 1.725, 1.724, 1.723, 1.722, 1.722, 1.722, 1.723, 1.722, 1.721, 1.718, 1.716, 1.714, 1.711, 1.706, + 1.711, 1.709, 1.711, 1.713, 1.716, 1.719, 1.722, 1.724, 1.724, 1.723, 1.722, 1.721, 1.722, 1.724, 1.724, 1.724, 1.723, 1.724, 1.724, 1.724, 1.722, 1.722, 1.722, 1.722, 1.722, 1.721, 1.719, 1.718, 1.714, 1.712, 1.709, 1.702, + 1.709, 1.709, 1.709, 1.712, 1.717, 1.719, 1.721, 1.723, 1.723, 1.723, 1.721, 1.721, 1.722, 1.723, 1.724, 1.723, 1.724, 1.724, 1.724, 1.724, 1.723, 1.722, 1.721, 1.721, 1.721, 1.721, 1.719, 1.716, 1.713, 1.711, 1.709, 1.701, + 1.708, 1.707, 1.709, 1.712, 1.716, 1.719, 1.722, 1.723, 1.723, 1.723, 1.721, 1.721, 1.721, 1.722, 1.723, 1.723, 1.723, 1.723, 1.724, 1.723, 1.722, 1.722, 1.721, 1.721, 1.721, 1.721, 1.719, 1.714, 1.712, 1.709, 1.708, 1.702, + 1.707, 1.707, 1.708, 1.711, 1.716, 1.721, 1.722, 1.722, 1.722, 1.721, 1.721, 1.721, 1.722, 1.722, 1.723, 1.723, 1.723, 1.722, 1.722, 1.722, 1.722, 1.721, 1.721, 1.721, 1.721, 1.721, 1.717, 1.714, 1.711, 1.709, 1.707, 1.702, + 1.706, 1.706, 1.707, 1.711, 1.714, 1.719, 1.722, 1.722, 1.722, 1.721, 1.719, 1.721, 1.721, 1.722, 1.723, 1.724, 1.723, 1.722, 1.722, 1.721, 1.719, 1.719, 1.721, 1.721, 1.719, 1.719, 1.716, 1.713, 1.711, 1.709, 1.706, 1.701, + 1.705, 1.704, 1.706, 1.709, 1.713, 1.718, 1.721, 1.722, 1.721, 1.719, 1.718, 1.719, 1.721, 1.722, 1.723, 1.724, 1.724, 1.721, 1.721, 1.721, 1.719, 1.719, 1.719, 1.719, 1.719, 1.717, 1.715, 1.713, 1.711, 1.707, 1.704, 1.699, + 1.703, 1.703, 1.704, 1.709, 1.712, 1.717, 1.719, 1.721, 1.719, 1.718, 1.717, 1.718, 1.719, 1.721, 1.722, 1.723, 1.723, 1.722, 1.719, 1.719, 1.718, 1.719, 1.719, 1.718, 1.717, 1.716, 1.714, 1.712, 1.709, 1.706, 1.703, 1.697, + 1.702, 1.703, 1.704, 1.708, 1.712, 1.715, 1.718, 1.719, 1.719, 1.717, 1.717, 1.717, 1.717, 1.718, 1.721, 1.722, 1.722, 1.721, 1.719, 1.718, 1.717, 1.718, 1.718, 1.717, 1.716, 1.714, 1.714, 1.711, 1.709, 1.706, 1.703, 1.697, + 1.702, 1.702, 1.703, 1.706, 1.709, 1.715, 1.717, 1.718, 1.717, 1.717, 1.716, 1.716, 1.717, 1.717, 1.719, 1.721, 1.721, 1.721, 1.719, 1.717, 1.716, 1.717, 1.717, 1.716, 1.714, 1.713, 1.712, 1.711, 1.708, 1.706, 1.702, 1.696, + 1.701, 1.701, 1.702, 1.706, 1.709, 1.714, 1.716, 1.717, 1.716, 1.716, 1.716, 1.715, 1.716, 1.716, 1.717, 1.718, 1.719, 1.719, 1.716, 1.715, 1.715, 1.715, 1.715, 1.715, 1.714, 1.713, 1.711, 1.709, 1.708, 1.704, 1.701, 1.695, + 1.699, 1.699, 1.702, 1.706, 1.708, 1.712, 1.714, 1.715, 1.715, 1.715, 1.714, 1.715, 1.714, 1.715, 1.716, 1.716, 1.716, 1.716, 1.714, 1.713, 1.713, 1.714, 1.715, 1.714, 1.714, 1.712, 1.709, 1.707, 1.706, 1.703, 1.701, 1.695, + 1.698, 1.699, 1.701, 1.705, 1.708, 1.711, 1.714, 1.714, 1.714, 1.714, 1.714, 1.714, 1.714, 1.715, 1.715, 1.716, 1.716, 1.715, 1.713, 1.713, 1.713, 1.714, 1.714, 1.714, 1.713, 1.712, 1.709, 1.707, 1.706, 1.703, 1.701, 1.696, + 1.698, 1.699, 1.701, 1.705, 1.707, 1.711, 1.712, 1.713, 1.713, 1.713, 1.713, 1.714, 1.714, 1.715, 1.715, 1.716, 1.715, 1.714, 1.713, 1.712, 1.712, 1.712, 1.713, 1.713, 1.713, 1.711, 1.709, 1.707, 1.705, 1.703, 1.701, 1.696, + 1.698, 1.697, 1.699, 1.702, 1.705, 1.707, 1.711, 1.711, 1.711, 1.711, 1.711, 1.712, 1.712, 1.713, 1.714, 1.714, 1.713, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.711, 1.708, 1.706, 1.704, 1.703, 1.699, 1.696, + 1.694, 1.695, 1.697, 1.699, 1.702, 1.705, 1.706, 1.707, 1.707, 1.708, 1.708, 1.708, 1.709, 1.711, 1.711, 1.711, 1.708, 1.708, 1.708, 1.707, 1.707, 1.707, 1.708, 1.708, 1.709, 1.708, 1.706, 1.703, 1.702, 1.701, 1.698, 1.696, + 1.692, 1.692, 1.695, 1.698, 1.699, 1.701, 1.704, 1.704, 1.704, 1.704, 1.705, 1.706, 1.707, 1.709, 1.709, 1.707, 1.706, 1.704, 1.704, 1.705, 1.705, 1.706, 1.706, 1.706, 1.706, 1.706, 1.703, 1.702, 1.701, 1.699, 1.696, 1.694, + 1.691, 1.692, 1.695, 1.697, 1.699, 1.699, 1.702, 1.703, 1.703, 1.702, 1.703, 1.704, 1.706, 1.707, 1.708, 1.706, 1.705, 1.703, 1.703, 1.703, 1.704, 1.705, 1.705, 1.705, 1.705, 1.704, 1.703, 1.701, 1.699, 1.698, 1.696, 1.695, + 1.689, 1.691, 1.696, 1.698, 1.699, 1.699, 1.701, 1.702, 1.702, 1.702, 1.703, 1.703, 1.706, 1.707, 1.708, 1.706, 1.705, 1.703, 1.703, 1.703, 1.703, 1.704, 1.704, 1.705, 1.704, 1.704, 1.702, 1.701, 1.698, 1.698, 1.696, 1.696 + ] + } + ], + "luminance_lut": + [ + 1.425, 1.393, 1.341, 1.295, 1.258, 1.226, 1.201, 1.181, 1.162, 1.146, 1.133, 1.123, 1.115, 1.111, 1.107, 1.106, 1.106, 1.107, 1.108, 1.111, 1.114, 1.122, 1.133, 1.148, 1.164, 1.184, 1.208, 1.236, 1.271, 1.309, 1.359, 1.381, + 1.397, 1.367, 1.317, 1.274, 1.237, 1.207, 1.183, 1.163, 1.146, 1.133, 1.123, 1.114, 1.107, 1.101, 1.098, 1.096, 1.096, 1.096, 1.097, 1.102, 1.106, 1.112, 1.122, 1.133, 1.148, 1.166, 1.187, 1.215, 1.249, 1.288, 1.335, 1.359, + 1.374, 1.341, 1.292, 1.251, 1.215, 1.186, 1.166, 1.146, 1.131, 1.117, 1.108, 1.099, 1.091, 1.088, 1.084, 1.082, 1.081, 1.082, 1.084, 1.088, 1.093, 1.098, 1.107, 1.118, 1.133, 1.149, 1.169, 1.195, 1.228, 1.267, 1.313, 1.335, + 1.352, 1.318, 1.271, 1.231, 1.196, 1.169, 1.149, 1.131, 1.115, 1.103, 1.093, 1.086, 1.079, 1.074, 1.071, 1.069, 1.069, 1.069, 1.071, 1.076, 1.079, 1.085, 1.094, 1.102, 1.117, 1.133, 1.152, 1.176, 1.208, 1.246, 1.289, 1.313, + 1.333, 1.298, 1.253, 1.212, 1.179, 1.153, 1.134, 1.116, 1.102, 1.089, 1.079, 1.072, 1.066, 1.062, 1.059, 1.058, 1.057, 1.057, 1.059, 1.064, 1.068, 1.072, 1.081, 1.091, 1.102, 1.119, 1.137, 1.161, 1.191, 1.227, 1.271, 1.293, + 1.317, 1.281, 1.235, 1.196, 1.165, 1.139, 1.119, 1.104, 1.089, 1.078, 1.068, 1.062, 1.055, 1.051, 1.048, 1.047, 1.047, 1.047, 1.048, 1.053, 1.056, 1.061, 1.069, 1.079, 1.091, 1.105, 1.126, 1.147, 1.177, 1.212, 1.253, 1.278, + 1.301, 1.265, 1.221, 1.181, 1.151, 1.127, 1.108, 1.091, 1.078, 1.068, 1.059, 1.051, 1.045, 1.041, 1.038, 1.037, 1.036, 1.037, 1.038, 1.042, 1.046, 1.051, 1.059, 1.069, 1.081, 1.096, 1.113, 1.135, 1.164, 1.198, 1.238, 1.264, + 1.286, 1.251, 1.207, 1.169, 1.141, 1.116, 1.098, 1.081, 1.068, 1.058, 1.049, 1.042, 1.037, 1.033, 1.031, 1.029, 1.028, 1.028, 1.029, 1.033, 1.037, 1.043, 1.051, 1.059, 1.071, 1.086, 1.104, 1.124, 1.152, 1.185, 1.225, 1.252, + 1.275, 1.239, 1.196, 1.161, 1.132, 1.107, 1.089, 1.073, 1.059, 1.049, 1.041, 1.035, 1.028, 1.024, 1.023, 1.021, 1.021, 1.021, 1.022, 1.024, 1.029, 1.036, 1.043, 1.051, 1.063, 1.078, 1.095, 1.115, 1.143, 1.175, 1.214, 1.243, + 1.267, 1.227, 1.187, 1.152, 1.122, 1.101, 1.081, 1.067, 1.054, 1.042, 1.035, 1.028, 1.023, 1.018, 1.015, 1.014, 1.014, 1.014, 1.016, 1.019, 1.024, 1.029, 1.036, 1.045, 1.056, 1.071, 1.088, 1.107, 1.134, 1.167, 1.204, 1.234, + 1.261, 1.219, 1.179, 1.145, 1.116, 1.095, 1.076, 1.061, 1.047, 1.037, 1.031, 1.023, 1.018, 1.014, 1.011, 1.009, 1.009, 1.009, 1.011, 1.013, 1.018, 1.024, 1.031, 1.039, 1.049, 1.065, 1.083, 1.102, 1.128, 1.161, 1.196, 1.228, + 1.256, 1.213, 1.173, 1.139, 1.111, 1.091, 1.071, 1.056, 1.043, 1.033, 1.026, 1.019, 1.014, 1.009, 1.006, 1.005, 1.004, 1.004, 1.006, 1.009, 1.013, 1.018, 1.026, 1.035, 1.046, 1.061, 1.078, 1.097, 1.123, 1.154, 1.191, 1.222, + 1.251, 1.208, 1.169, 1.137, 1.108, 1.088, 1.069, 1.053, 1.039, 1.029, 1.023, 1.015, 1.011, 1.006, 1.004, 1.003, 1.001, 1.002, 1.003, 1.006, 1.009, 1.015, 1.022, 1.032, 1.044, 1.057, 1.076, 1.094, 1.119, 1.149, 1.186, 1.218, + 1.249, 1.205, 1.167, 1.133, 1.107, 1.085, 1.067, 1.052, 1.038, 1.029, 1.021, 1.013, 1.008, 1.004, 1.003, 1.001, 1.001, 1.001, 1.002, 1.004, 1.007, 1.013, 1.021, 1.031, 1.042, 1.055, 1.073, 1.093, 1.116, 1.147, 1.182, 1.218, + 1.249, 1.204, 1.165, 1.132, 1.106, 1.085, 1.067, 1.051, 1.038, 1.029, 1.019, 1.013, 1.007, 1.003, 1.002, 1.001, 1.001, 1.001, 1.001, 1.004, 1.007, 1.013, 1.021, 1.029, 1.042, 1.055, 1.072, 1.091, 1.115, 1.145, 1.181, 1.217, + 1.249, 1.204, 1.165, 1.132, 1.107, 1.086, 1.067, 1.051, 1.038, 1.029, 1.019, 1.013, 1.008, 1.004, 1.002, 1.001, 1.001, 1.001, 1.002, 1.004, 1.007, 1.014, 1.021, 1.029, 1.042, 1.056, 1.072, 1.091, 1.115, 1.145, 1.181, 1.217, + 1.251, 1.205, 1.166, 1.133, 1.108, 1.087, 1.068, 1.052, 1.039, 1.031, 1.021, 1.014, 1.009, 1.006, 1.003, 1.002, 1.001, 1.001, 1.003, 1.006, 1.009, 1.014, 1.022, 1.031, 1.043, 1.056, 1.073, 1.093, 1.116, 1.145, 1.182, 1.218, + 1.252, 1.208, 1.168, 1.137, 1.111, 1.089, 1.071, 1.055, 1.043, 1.033, 1.023, 1.016, 1.012, 1.009, 1.006, 1.005, 1.004, 1.004, 1.006, 1.008, 1.012, 1.017, 1.024, 1.034, 1.045, 1.059, 1.075, 1.095, 1.119, 1.149, 1.185, 1.218, + 1.256, 1.213, 1.173, 1.142, 1.115, 1.093, 1.075, 1.059, 1.047, 1.036, 1.027, 1.021, 1.016, 1.012, 1.011, 1.009, 1.008, 1.008, 1.009, 1.012, 1.016, 1.021, 1.028, 1.038, 1.049, 1.064, 1.081, 1.099, 1.126, 1.155, 1.192, 1.223, + 1.261, 1.221, 1.179, 1.148, 1.121, 1.099, 1.081, 1.065, 1.052, 1.042, 1.032, 1.026, 1.021, 1.017, 1.015, 1.014, 1.014, 1.013, 1.013, 1.016, 1.021, 1.026, 1.033, 1.043, 1.054, 1.068, 1.085, 1.106, 1.132, 1.161, 1.199, 1.228, + 1.267, 1.228, 1.188, 1.155, 1.128, 1.105, 1.086, 1.071, 1.059, 1.047, 1.038, 1.031, 1.027, 1.022, 1.021, 1.019, 1.019, 1.019, 1.019, 1.022, 1.026, 1.032, 1.038, 1.049, 1.061, 1.075, 1.092, 1.112, 1.138, 1.169, 1.207, 1.236, + 1.278, 1.241, 1.199, 1.164, 1.137, 1.114, 1.094, 1.078, 1.066, 1.055, 1.046, 1.038, 1.032, 1.029, 1.027, 1.027, 1.027, 1.027, 1.027, 1.029, 1.032, 1.038, 1.047, 1.056, 1.067, 1.083, 1.099, 1.121, 1.146, 1.178, 1.217, 1.244, + 1.291, 1.252, 1.211, 1.175, 1.147, 1.124, 1.103, 1.088, 1.075, 1.063, 1.054, 1.046, 1.041, 1.036, 1.035, 1.035, 1.035, 1.035, 1.036, 1.038, 1.041, 1.047, 1.055, 1.065, 1.075, 1.092, 1.111, 1.132, 1.157, 1.189, 1.231, 1.255, + 1.303, 1.265, 1.222, 1.187, 1.158, 1.133, 1.112, 1.097, 1.083, 1.072, 1.063, 1.054, 1.048, 1.043, 1.043, 1.043, 1.043, 1.043, 1.043, 1.046, 1.049, 1.055, 1.065, 1.074, 1.086, 1.102, 1.119, 1.144, 1.171, 1.203, 1.243, 1.268, + 1.317, 1.282, 1.236, 1.201, 1.171, 1.146, 1.125, 1.109, 1.095, 1.083, 1.072, 1.064, 1.058, 1.054, 1.052, 1.051, 1.051, 1.053, 1.054, 1.057, 1.061, 1.065, 1.074, 1.086, 1.099, 1.113, 1.133, 1.156, 1.183, 1.217, 1.259, 1.282, + 1.335, 1.301, 1.254, 1.218, 1.186, 1.159, 1.138, 1.121, 1.108, 1.095, 1.085, 1.076, 1.069, 1.066, 1.065, 1.063, 1.062, 1.063, 1.065, 1.068, 1.073, 1.078, 1.087, 1.098, 1.113, 1.126, 1.146, 1.171, 1.199, 1.235, 1.277, 1.299, + 1.356, 1.321, 1.274, 1.235, 1.202, 1.175, 1.153, 1.137, 1.121, 1.108, 1.097, 1.089, 1.084, 1.081, 1.077, 1.075, 1.075, 1.075, 1.077, 1.081, 1.086, 1.091, 1.099, 1.113, 1.126, 1.144, 1.162, 1.187, 1.218, 1.255, 1.297, 1.321, + 1.376, 1.344, 1.296, 1.257, 1.223, 1.194, 1.171, 1.153, 1.137, 1.124, 1.112, 1.104, 1.099, 1.095, 1.093, 1.091, 1.089, 1.091, 1.092, 1.095, 1.101, 1.108, 1.116, 1.128, 1.144, 1.161, 1.181, 1.206, 1.237, 1.275, 1.321, 1.347, + 1.403, 1.369, 1.319, 1.279, 1.244, 1.214, 1.191, 1.171, 1.154, 1.139, 1.129, 1.121, 1.115, 1.111, 1.109, 1.106, 1.105, 1.105, 1.108, 1.112, 1.117, 1.124, 1.135, 1.147, 1.162, 1.181, 1.203, 1.228, 1.262, 1.301, 1.347, 1.377, + 1.429, 1.398, 1.348, 1.306, 1.269, 1.237, 1.214, 1.191, 1.173, 1.158, 1.146, 1.138, 1.132, 1.128, 1.125, 1.123, 1.122, 1.123, 1.125, 1.129, 1.136, 1.142, 1.154, 1.166, 1.182, 1.203, 1.226, 1.253, 1.288, 1.329, 1.377, 1.406, + 1.465, 1.429, 1.377, 1.335, 1.295, 1.262, 1.236, 1.214, 1.194, 1.179, 1.167, 1.157, 1.151, 1.146, 1.144, 1.142, 1.142, 1.142, 1.144, 1.149, 1.154, 1.163, 1.174, 1.187, 1.205, 1.226, 1.251, 1.279, 1.315, 1.357, 1.406, 1.437, + 1.493, 1.465, 1.409, 1.364, 1.323, 1.289, 1.261, 1.235, 1.214, 1.194, 1.179, 1.171, 1.166, 1.163, 1.161, 1.161, 1.161, 1.161, 1.162, 1.164, 1.168, 1.175, 1.187, 1.205, 1.225, 1.251, 1.276, 1.306, 1.344, 1.387, 1.437, 1.455 + ], + "sigma": 0.0007, + "sigma_Cb": 0.00098 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2500, + "ccm": + [ + 1.95054, -0.57435, -0.37619, + -0.46945, 1.86661, -0.39716, + 0.07977, -1.14072, 2.06095 + ] + }, + { + "ct": 2800, + "ccm": + [ + 1.94104, -0.60261, -0.33844, + -0.43162, 1.85422, -0.42261, + 0.03799, -0.95022, 1.91222 + ] + }, + { + "ct": 2900, + "ccm": + [ + 1.91828, -0.59569, -0.32258, + -0.51902, 2.09091, -0.57189, + -0.03324, -0.73462, 1.76785 + ] + }, + { + "ct": 3620, + "ccm": + [ + 1.97199, -0.66403, -0.30797, + -0.46411, 2.02612, -0.56201, + -0.07764, -0.61178, 1.68942 + ] + }, + { + "ct": 4560, + "ccm": + [ + 2.15256, -0.84787, -0.30469, + -0.48422, 2.28962, -0.80541, + -0.15113, -0.53014, 1.68127 + ] + }, + { + "ct": 5600, + "ccm": + [ + 2.04576, -0.74771, -0.29805, + -0.36332, 1.98993, -0.62662, + -0.09328, -0.46543, 1.55871 + ] + }, + { + "ct": 7400, + "ccm": + [ + 2.37532, -0.83069, -0.54462, + -0.48279, 2.84309, -1.36031, + -0.21178, -0.66532, 1.87709 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.06, + "strength": 0.5, + "limit": 0.5 + } + }, + { + "rpi.cac": + { + "lut_rx": + [ + -0.28, -0.22, -0.16, -0.09, -0.02, 0.04, 0.11, 0.17, 0.29, + -0.28, -0.22, -0.16, -0.09, -0.02, 0.04, 0.11, 0.18, 0.3, + -0.28, -0.22, -0.16, -0.09, -0.02, 0.05, 0.11, 0.18, 0.31, + -0.28, -0.22, -0.16, -0.09, -0.02, 0.05, 0.12, 0.18, 0.31, + -0.27, -0.22, -0.16, -0.09, -0.02, 0.05, 0.12, 0.19, 0.31, + -0.27, -0.21, -0.15, -0.08, -0.02, 0.05, 0.12, 0.18, 0.31, + -0.27, -0.21, -0.15, -0.08, -0.02, 0.05, 0.11, 0.18, 0.3, + -0.25, -0.2, -0.15, -0.09, -0.02, 0.05, 0.11, 0.17, 0.29, + -0.24, -0.19, -0.14, -0.08, -0.02, 0.04, 0.11, 0.17, 0.29 + ], + "lut_ry": + [ + -0.19, -0.18, -0.19, -0.19, -0.19, -0.18, -0.19, -0.19, -0.2, + -0.14, -0.14, -0.15, -0.16, -0.16, -0.16, -0.16, -0.16, -0.17, + -0.11, -0.1, -0.11, -0.12, -0.12, -0.12, -0.12, -0.12, -0.14, + -0.06, -0.05, -0.05, -0.06, -0.07, -0.07, -0.06, -0.06, -0.08, + -0.01, 0.0, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.02, + 0.04, 0.05, 0.04, 0.03, 0.03, 0.03, 0.03, 0.04, 0.03, + 0.07, 0.08, 0.07, 0.07, 0.07, 0.07, 0.08, 0.08, 0.07, + 0.1, 0.11, 0.1, 0.1, 0.1, 0.1, 0.1, 0.11, 0.1, + 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.15, 0.15, 0.14 + ], + "lut_bx": + [ + -0.21, -0.17, -0.13, -0.06, 0.01, 0.07, 0.13, 0.18, 0.27, + -0.21, -0.17, -0.13, -0.06, 0.01, 0.08, 0.14, 0.2, 0.28, + -0.22, -0.18, -0.13, -0.06, 0.01, 0.08, 0.15, 0.21, 0.3, + -0.22, -0.18, -0.13, -0.06, 0.01, 0.08, 0.15, 0.21, 0.31, + -0.21, -0.17, -0.13, -0.07, 0.01, 0.08, 0.15, 0.2, 0.31, + -0.2, -0.16, -0.12, -0.06, 0.0, 0.07, 0.14, 0.18, 0.28, + -0.19, -0.15, -0.11, -0.06, 0.01, 0.07, 0.13, 0.18, 0.26, + -0.17, -0.14, -0.1, -0.05, 0.01, 0.07, 0.12, 0.16, 0.25, + -0.15, -0.12, -0.08, -0.04, 0.01, 0.07, 0.1, 0.13, 0.22 + ], + "lut_by": + [ + -0.15, -0.15, -0.17, -0.18, -0.18, -0.18, -0.17, -0.16, -0.14, + -0.12, -0.12, -0.13, -0.14, -0.14, -0.14, -0.13, -0.12, -0.11, + -0.09, -0.08, -0.09, -0.1, -0.1, -0.09, -0.09, -0.08, -0.09, + -0.06, -0.04, -0.04, -0.05, -0.04, -0.04, -0.04, -0.04, -0.06, + -0.02, 0.01, 0.01, 0.02, 0.02, 0.02, 0.02, 0.01, -0.02, + 0.02, 0.05, 0.07, 0.08, 0.09, 0.09, 0.08, 0.06, 0.02, + 0.05, 0.08, 0.1, 0.12, 0.13, 0.13, 0.12, 0.1, 0.06, + 0.07, 0.09, 0.11, 0.14, 0.16, 0.16, 0.14, 0.12, 0.07, + 0.09, 0.11, 0.14, 0.17, 0.19, 0.19, 0.18, 0.15, 0.1 + ] + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx296_mono.json b/src/ipa/rpi/pisp/data/imx296_mono.json new file mode 100644 index 000000000..153f86a07 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx296_mono.json @@ -0,0 +1,960 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 3840 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 4724, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 860, + "reference_Y": 14551 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.751 + } + }, + { + "rpi.geq": + { + "offset": 226, + "slope": 0.01032 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.16, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 4000, + "table": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 4000, + "table": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + ], + "luminance_lut": + [ + 1.425, 1.393, 1.341, 1.295, 1.258, 1.226, 1.201, 1.181, 1.162, 1.146, 1.133, 1.123, 1.115, 1.111, 1.107, 1.106, 1.106, 1.107, 1.108, 1.111, 1.114, 1.122, 1.133, 1.148, 1.164, 1.184, 1.208, 1.236, 1.271, 1.309, 1.359, 1.381, + 1.397, 1.367, 1.317, 1.274, 1.237, 1.207, 1.183, 1.163, 1.146, 1.133, 1.123, 1.114, 1.107, 1.101, 1.098, 1.096, 1.096, 1.096, 1.097, 1.102, 1.106, 1.112, 1.122, 1.133, 1.148, 1.166, 1.187, 1.215, 1.249, 1.288, 1.335, 1.359, + 1.374, 1.341, 1.292, 1.251, 1.215, 1.186, 1.166, 1.146, 1.131, 1.117, 1.108, 1.099, 1.091, 1.088, 1.084, 1.082, 1.081, 1.082, 1.084, 1.088, 1.093, 1.098, 1.107, 1.118, 1.133, 1.149, 1.169, 1.195, 1.228, 1.267, 1.313, 1.335, + 1.352, 1.318, 1.271, 1.231, 1.196, 1.169, 1.149, 1.131, 1.115, 1.103, 1.093, 1.086, 1.079, 1.074, 1.071, 1.069, 1.069, 1.069, 1.071, 1.076, 1.079, 1.085, 1.094, 1.102, 1.117, 1.133, 1.152, 1.176, 1.208, 1.246, 1.289, 1.313, + 1.333, 1.298, 1.253, 1.212, 1.179, 1.153, 1.134, 1.116, 1.102, 1.089, 1.079, 1.072, 1.066, 1.062, 1.059, 1.058, 1.057, 1.057, 1.059, 1.064, 1.068, 1.072, 1.081, 1.091, 1.102, 1.119, 1.137, 1.161, 1.191, 1.227, 1.271, 1.293, + 1.317, 1.281, 1.235, 1.196, 1.165, 1.139, 1.119, 1.104, 1.089, 1.078, 1.068, 1.062, 1.055, 1.051, 1.048, 1.047, 1.047, 1.047, 1.048, 1.053, 1.056, 1.061, 1.069, 1.079, 1.091, 1.105, 1.126, 1.147, 1.177, 1.212, 1.253, 1.278, + 1.301, 1.265, 1.221, 1.181, 1.151, 1.127, 1.108, 1.091, 1.078, 1.068, 1.059, 1.051, 1.045, 1.041, 1.038, 1.037, 1.036, 1.037, 1.038, 1.042, 1.046, 1.051, 1.059, 1.069, 1.081, 1.096, 1.113, 1.135, 1.164, 1.198, 1.238, 1.264, + 1.286, 1.251, 1.207, 1.169, 1.141, 1.116, 1.098, 1.081, 1.068, 1.058, 1.049, 1.042, 1.037, 1.033, 1.031, 1.029, 1.028, 1.028, 1.029, 1.033, 1.037, 1.043, 1.051, 1.059, 1.071, 1.086, 1.104, 1.124, 1.152, 1.185, 1.225, 1.252, + 1.275, 1.239, 1.196, 1.161, 1.132, 1.107, 1.089, 1.073, 1.059, 1.049, 1.041, 1.035, 1.028, 1.024, 1.023, 1.021, 1.021, 1.021, 1.022, 1.024, 1.029, 1.036, 1.043, 1.051, 1.063, 1.078, 1.095, 1.115, 1.143, 1.175, 1.214, 1.243, + 1.267, 1.227, 1.187, 1.152, 1.122, 1.101, 1.081, 1.067, 1.054, 1.042, 1.035, 1.028, 1.023, 1.018, 1.015, 1.014, 1.014, 1.014, 1.016, 1.019, 1.024, 1.029, 1.036, 1.045, 1.056, 1.071, 1.088, 1.107, 1.134, 1.167, 1.204, 1.234, + 1.261, 1.219, 1.179, 1.145, 1.116, 1.095, 1.076, 1.061, 1.047, 1.037, 1.031, 1.023, 1.018, 1.014, 1.011, 1.009, 1.009, 1.009, 1.011, 1.013, 1.018, 1.024, 1.031, 1.039, 1.049, 1.065, 1.083, 1.102, 1.128, 1.161, 1.196, 1.228, + 1.256, 1.213, 1.173, 1.139, 1.111, 1.091, 1.071, 1.056, 1.043, 1.033, 1.026, 1.019, 1.014, 1.009, 1.006, 1.005, 1.004, 1.004, 1.006, 1.009, 1.013, 1.018, 1.026, 1.035, 1.046, 1.061, 1.078, 1.097, 1.123, 1.154, 1.191, 1.222, + 1.251, 1.208, 1.169, 1.137, 1.108, 1.088, 1.069, 1.053, 1.039, 1.029, 1.023, 1.015, 1.011, 1.006, 1.004, 1.003, 1.001, 1.002, 1.003, 1.006, 1.009, 1.015, 1.022, 1.032, 1.044, 1.057, 1.076, 1.094, 1.119, 1.149, 1.186, 1.218, + 1.249, 1.205, 1.167, 1.133, 1.107, 1.085, 1.067, 1.052, 1.038, 1.029, 1.021, 1.013, 1.008, 1.004, 1.003, 1.001, 1.001, 1.001, 1.002, 1.004, 1.007, 1.013, 1.021, 1.031, 1.042, 1.055, 1.073, 1.093, 1.116, 1.147, 1.182, 1.218, + 1.249, 1.204, 1.165, 1.132, 1.106, 1.085, 1.067, 1.051, 1.038, 1.029, 1.019, 1.013, 1.007, 1.003, 1.002, 1.001, 1.001, 1.001, 1.001, 1.004, 1.007, 1.013, 1.021, 1.029, 1.042, 1.055, 1.072, 1.091, 1.115, 1.145, 1.181, 1.217, + 1.249, 1.204, 1.165, 1.132, 1.107, 1.086, 1.067, 1.051, 1.038, 1.029, 1.019, 1.013, 1.008, 1.004, 1.002, 1.001, 1.001, 1.001, 1.002, 1.004, 1.007, 1.014, 1.021, 1.029, 1.042, 1.056, 1.072, 1.091, 1.115, 1.145, 1.181, 1.217, + 1.251, 1.205, 1.166, 1.133, 1.108, 1.087, 1.068, 1.052, 1.039, 1.031, 1.021, 1.014, 1.009, 1.006, 1.003, 1.002, 1.001, 1.001, 1.003, 1.006, 1.009, 1.014, 1.022, 1.031, 1.043, 1.056, 1.073, 1.093, 1.116, 1.145, 1.182, 1.218, + 1.252, 1.208, 1.168, 1.137, 1.111, 1.089, 1.071, 1.055, 1.043, 1.033, 1.023, 1.016, 1.012, 1.009, 1.006, 1.005, 1.004, 1.004, 1.006, 1.008, 1.012, 1.017, 1.024, 1.034, 1.045, 1.059, 1.075, 1.095, 1.119, 1.149, 1.185, 1.218, + 1.256, 1.213, 1.173, 1.142, 1.115, 1.093, 1.075, 1.059, 1.047, 1.036, 1.027, 1.021, 1.016, 1.012, 1.011, 1.009, 1.008, 1.008, 1.009, 1.012, 1.016, 1.021, 1.028, 1.038, 1.049, 1.064, 1.081, 1.099, 1.126, 1.155, 1.192, 1.223, + 1.261, 1.221, 1.179, 1.148, 1.121, 1.099, 1.081, 1.065, 1.052, 1.042, 1.032, 1.026, 1.021, 1.017, 1.015, 1.014, 1.014, 1.013, 1.013, 1.016, 1.021, 1.026, 1.033, 1.043, 1.054, 1.068, 1.085, 1.106, 1.132, 1.161, 1.199, 1.228, + 1.267, 1.228, 1.188, 1.155, 1.128, 1.105, 1.086, 1.071, 1.059, 1.047, 1.038, 1.031, 1.027, 1.022, 1.021, 1.019, 1.019, 1.019, 1.019, 1.022, 1.026, 1.032, 1.038, 1.049, 1.061, 1.075, 1.092, 1.112, 1.138, 1.169, 1.207, 1.236, + 1.278, 1.241, 1.199, 1.164, 1.137, 1.114, 1.094, 1.078, 1.066, 1.055, 1.046, 1.038, 1.032, 1.029, 1.027, 1.027, 1.027, 1.027, 1.027, 1.029, 1.032, 1.038, 1.047, 1.056, 1.067, 1.083, 1.099, 1.121, 1.146, 1.178, 1.217, 1.244, + 1.291, 1.252, 1.211, 1.175, 1.147, 1.124, 1.103, 1.088, 1.075, 1.063, 1.054, 1.046, 1.041, 1.036, 1.035, 1.035, 1.035, 1.035, 1.036, 1.038, 1.041, 1.047, 1.055, 1.065, 1.075, 1.092, 1.111, 1.132, 1.157, 1.189, 1.231, 1.255, + 1.303, 1.265, 1.222, 1.187, 1.158, 1.133, 1.112, 1.097, 1.083, 1.072, 1.063, 1.054, 1.048, 1.043, 1.043, 1.043, 1.043, 1.043, 1.043, 1.046, 1.049, 1.055, 1.065, 1.074, 1.086, 1.102, 1.119, 1.144, 1.171, 1.203, 1.243, 1.268, + 1.317, 1.282, 1.236, 1.201, 1.171, 1.146, 1.125, 1.109, 1.095, 1.083, 1.072, 1.064, 1.058, 1.054, 1.052, 1.051, 1.051, 1.053, 1.054, 1.057, 1.061, 1.065, 1.074, 1.086, 1.099, 1.113, 1.133, 1.156, 1.183, 1.217, 1.259, 1.282, + 1.335, 1.301, 1.254, 1.218, 1.186, 1.159, 1.138, 1.121, 1.108, 1.095, 1.085, 1.076, 1.069, 1.066, 1.065, 1.063, 1.062, 1.063, 1.065, 1.068, 1.073, 1.078, 1.087, 1.098, 1.113, 1.126, 1.146, 1.171, 1.199, 1.235, 1.277, 1.299, + 1.356, 1.321, 1.274, 1.235, 1.202, 1.175, 1.153, 1.137, 1.121, 1.108, 1.097, 1.089, 1.084, 1.081, 1.077, 1.075, 1.075, 1.075, 1.077, 1.081, 1.086, 1.091, 1.099, 1.113, 1.126, 1.144, 1.162, 1.187, 1.218, 1.255, 1.297, 1.321, + 1.376, 1.344, 1.296, 1.257, 1.223, 1.194, 1.171, 1.153, 1.137, 1.124, 1.112, 1.104, 1.099, 1.095, 1.093, 1.091, 1.089, 1.091, 1.092, 1.095, 1.101, 1.108, 1.116, 1.128, 1.144, 1.161, 1.181, 1.206, 1.237, 1.275, 1.321, 1.347, + 1.403, 1.369, 1.319, 1.279, 1.244, 1.214, 1.191, 1.171, 1.154, 1.139, 1.129, 1.121, 1.115, 1.111, 1.109, 1.106, 1.105, 1.105, 1.108, 1.112, 1.117, 1.124, 1.135, 1.147, 1.162, 1.181, 1.203, 1.228, 1.262, 1.301, 1.347, 1.377, + 1.429, 1.398, 1.348, 1.306, 1.269, 1.237, 1.214, 1.191, 1.173, 1.158, 1.146, 1.138, 1.132, 1.128, 1.125, 1.123, 1.122, 1.123, 1.125, 1.129, 1.136, 1.142, 1.154, 1.166, 1.182, 1.203, 1.226, 1.253, 1.288, 1.329, 1.377, 1.406, + 1.465, 1.429, 1.377, 1.335, 1.295, 1.262, 1.236, 1.214, 1.194, 1.179, 1.167, 1.157, 1.151, 1.146, 1.144, 1.142, 1.142, 1.142, 1.144, 1.149, 1.154, 1.163, 1.174, 1.187, 1.205, 1.226, 1.251, 1.279, 1.315, 1.357, 1.406, 1.437, + 1.493, 1.465, 1.409, 1.364, 1.323, 1.289, 1.261, 1.235, 1.214, 1.194, 1.179, 1.171, 1.166, 1.163, 1.161, 1.161, 1.161, 1.161, 1.162, 1.164, 1.168, 1.175, 1.187, 1.205, 1.225, 1.251, 1.276, 1.306, 1.344, 1.387, 1.437, 1.455 + ], + "sigma": 0.0007, + "sigma_Cb": 0.00098 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.06, + "strength": 0.5, + "limit": 0.5 + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": [ 0.0, 2.5, 0.01, 2.5, 0.06, 1.0, 1.0, 1.0 ], + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": [ 0.0, 2.5, 0.01, 2.5, 0.06, 1.0, 1.0, 1.0 ], + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx378.json b/src/ipa/rpi/pisp/data/imx378.json new file mode 100644 index 000000000..ac760f794 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx378.json @@ -0,0 +1,634 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.dpc": { } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 9999, + "reference_gain": 1.95, + "reference_aperture": 1.0, + "reference_lux": 1000, + "reference_Y": 12996 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.641 + } + }, + { + "rpi.geq": + { + "offset": 235, + "slope": 0.00902 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 8000 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8100 + } + }, + "bayes": 1, + "ct_curve": + [ + 2850.0, 0.6361, 0.3911, + 3550.0, 0.5386, 0.5077, + 4500.0, 0.4472, 0.6171, + 5600.0, 0.3906, 0.6848, + 8000.0, 0.3412, 0.7441 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.01667, + "transverse_neg": 0.01195 + } + }, + { + "rpi.agc": + { + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ] + }, + "long": + { + "shutter": [ 1000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.5, + "calibrations_Cr": [ + { + "ct": 2800, + "table": + [ + 1.604, 1.603, 1.601, 1.597, 1.594, 1.588, 1.582, 1.576, 1.57, 1.566, 1.562, 1.561, 1.561, 1.561, 1.561, 1.561, 1.561, 1.562, 1.565, 1.57, 1.577, 1.584, 1.591, 1.598, 1.604, 1.61, 1.617, 1.623, 1.627, 1.632, 1.634, 1.636, + 1.603, 1.601, 1.599, 1.595, 1.591, 1.585, 1.579, 1.572, 1.565, 1.561, 1.557, 1.555, 1.555, 1.555, 1.555, 1.555, 1.556, 1.558, 1.561, 1.566, 1.573, 1.581, 1.587, 1.594, 1.6, 1.607, 1.613, 1.62, 1.625, 1.63, 1.632, 1.635, + 1.602, 1.599, 1.596, 1.592, 1.589, 1.582, 1.575, 1.568, 1.561, 1.556, 1.552, 1.55, 1.549, 1.548, 1.548, 1.549, 1.55, 1.553, 1.556, 1.562, 1.57, 1.577, 1.583, 1.589, 1.596, 1.603, 1.61, 1.617, 1.622, 1.627, 1.63, 1.633, + 1.601, 1.597, 1.594, 1.59, 1.586, 1.579, 1.571, 1.564, 1.556, 1.551, 1.546, 1.544, 1.542, 1.541, 1.541, 1.542, 1.544, 1.547, 1.551, 1.557, 1.565, 1.573, 1.579, 1.585, 1.592, 1.6, 1.607, 1.614, 1.62, 1.625, 1.628, 1.632, + 1.6, 1.596, 1.591, 1.586, 1.58, 1.573, 1.566, 1.559, 1.551, 1.546, 1.54, 1.537, 1.534, 1.533, 1.533, 1.534, 1.536, 1.539, 1.544, 1.551, 1.559, 1.567, 1.574, 1.581, 1.589, 1.596, 1.604, 1.612, 1.618, 1.624, 1.627, 1.631, + 1.599, 1.594, 1.588, 1.582, 1.575, 1.568, 1.56, 1.553, 1.547, 1.54, 1.534, 1.529, 1.525, 1.524, 1.524, 1.525, 1.527, 1.531, 1.537, 1.545, 1.553, 1.561, 1.569, 1.577, 1.585, 1.593, 1.601, 1.609, 1.616, 1.623, 1.626, 1.63, + 1.599, 1.592, 1.586, 1.578, 1.571, 1.563, 1.555, 1.548, 1.542, 1.535, 1.528, 1.522, 1.517, 1.515, 1.515, 1.516, 1.519, 1.523, 1.531, 1.539, 1.547, 1.556, 1.564, 1.573, 1.581, 1.59, 1.599, 1.607, 1.615, 1.622, 1.625, 1.629, + 1.598, 1.591, 1.583, 1.575, 1.567, 1.559, 1.55, 1.543, 1.537, 1.53, 1.523, 1.516, 1.509, 1.506, 1.506, 1.507, 1.51, 1.516, 1.525, 1.533, 1.541, 1.55, 1.56, 1.57, 1.579, 1.587, 1.596, 1.605, 1.613, 1.621, 1.625, 1.629, + 1.597, 1.589, 1.581, 1.572, 1.564, 1.555, 1.546, 1.539, 1.532, 1.525, 1.517, 1.509, 1.5, 1.497, 1.497, 1.499, 1.501, 1.508, 1.519, 1.528, 1.535, 1.544, 1.556, 1.567, 1.576, 1.585, 1.594, 1.603, 1.612, 1.62, 1.624, 1.629, + 1.597, 1.588, 1.579, 1.57, 1.561, 1.552, 1.543, 1.535, 1.527, 1.519, 1.511, 1.503, 1.494, 1.491, 1.49, 1.492, 1.496, 1.502, 1.512, 1.521, 1.529, 1.539, 1.552, 1.564, 1.574, 1.583, 1.592, 1.602, 1.611, 1.619, 1.624, 1.629, + 1.597, 1.588, 1.579, 1.569, 1.56, 1.55, 1.54, 1.531, 1.522, 1.513, 1.504, 1.497, 1.489, 1.486, 1.486, 1.488, 1.493, 1.498, 1.506, 1.514, 1.523, 1.535, 1.548, 1.561, 1.572, 1.582, 1.591, 1.601, 1.61, 1.619, 1.624, 1.629, + 1.597, 1.587, 1.578, 1.568, 1.559, 1.548, 1.538, 1.527, 1.516, 1.507, 1.498, 1.491, 1.485, 1.482, 1.481, 1.484, 1.489, 1.495, 1.499, 1.506, 1.518, 1.53, 1.545, 1.559, 1.57, 1.58, 1.59, 1.6, 1.61, 1.619, 1.624, 1.629, + 1.597, 1.587, 1.578, 1.568, 1.558, 1.548, 1.537, 1.526, 1.514, 1.504, 1.494, 1.487, 1.482, 1.479, 1.479, 1.481, 1.486, 1.491, 1.496, 1.503, 1.515, 1.529, 1.544, 1.558, 1.569, 1.58, 1.59, 1.6, 1.61, 1.619, 1.624, 1.629, + 1.597, 1.587, 1.578, 1.568, 1.558, 1.548, 1.537, 1.525, 1.513, 1.502, 1.491, 1.484, 1.48, 1.478, 1.477, 1.479, 1.483, 1.488, 1.494, 1.502, 1.515, 1.528, 1.543, 1.557, 1.569, 1.58, 1.59, 1.6, 1.61, 1.619, 1.624, 1.629, + 1.597, 1.587, 1.578, 1.568, 1.558, 1.547, 1.536, 1.524, 1.511, 1.499, 1.487, 1.481, 1.478, 1.476, 1.476, 1.477, 1.48, 1.485, 1.492, 1.501, 1.514, 1.527, 1.543, 1.557, 1.569, 1.58, 1.59, 1.6, 1.61, 1.619, 1.624, 1.629, + 1.597, 1.587, 1.578, 1.568, 1.558, 1.547, 1.536, 1.524, 1.511, 1.499, 1.487, 1.481, 1.479, 1.477, 1.477, 1.478, 1.48, 1.484, 1.492, 1.501, 1.514, 1.527, 1.543, 1.557, 1.569, 1.58, 1.591, 1.601, 1.61, 1.619, 1.624, 1.63, + 1.597, 1.588, 1.578, 1.568, 1.558, 1.547, 1.536, 1.524, 1.511, 1.499, 1.487, 1.482, 1.48, 1.479, 1.478, 1.479, 1.48, 1.484, 1.492, 1.501, 1.514, 1.527, 1.543, 1.557, 1.569, 1.581, 1.591, 1.602, 1.611, 1.619, 1.625, 1.63, + 1.597, 1.588, 1.579, 1.569, 1.559, 1.548, 1.536, 1.524, 1.512, 1.5, 1.488, 1.483, 1.482, 1.48, 1.48, 1.48, 1.481, 1.485, 1.492, 1.501, 1.514, 1.527, 1.543, 1.557, 1.57, 1.581, 1.592, 1.602, 1.611, 1.62, 1.625, 1.631, + 1.597, 1.588, 1.58, 1.57, 1.56, 1.549, 1.538, 1.526, 1.515, 1.504, 1.494, 1.488, 1.484, 1.481, 1.48, 1.482, 1.485, 1.49, 1.497, 1.506, 1.518, 1.531, 1.546, 1.56, 1.572, 1.583, 1.594, 1.604, 1.613, 1.621, 1.626, 1.631, + 1.597, 1.589, 1.581, 1.571, 1.562, 1.551, 1.54, 1.529, 1.518, 1.509, 1.501, 1.493, 1.486, 1.482, 1.481, 1.483, 1.489, 1.496, 1.503, 1.511, 1.522, 1.534, 1.548, 1.562, 1.574, 1.586, 1.596, 1.607, 1.615, 1.622, 1.627, 1.632, + 1.597, 1.59, 1.582, 1.573, 1.564, 1.553, 1.543, 1.532, 1.522, 1.514, 1.507, 1.499, 1.489, 1.485, 1.484, 1.487, 1.494, 1.501, 1.508, 1.517, 1.527, 1.538, 1.552, 1.565, 1.577, 1.588, 1.599, 1.609, 1.616, 1.624, 1.628, 1.632, + 1.599, 1.592, 1.585, 1.576, 1.566, 1.557, 1.548, 1.538, 1.529, 1.521, 1.513, 1.504, 1.496, 1.492, 1.492, 1.494, 1.5, 1.507, 1.515, 1.524, 1.534, 1.545, 1.557, 1.569, 1.581, 1.592, 1.602, 1.611, 1.619, 1.626, 1.63, 1.634, + 1.6, 1.594, 1.588, 1.579, 1.569, 1.561, 1.553, 1.545, 1.537, 1.528, 1.518, 1.51, 1.503, 1.5, 1.5, 1.502, 1.506, 1.512, 1.522, 1.531, 1.542, 1.552, 1.563, 1.574, 1.585, 1.596, 1.605, 1.614, 1.621, 1.628, 1.632, 1.635, + 1.602, 1.597, 1.591, 1.582, 1.573, 1.565, 1.558, 1.551, 1.543, 1.534, 1.524, 1.517, 1.511, 1.509, 1.509, 1.511, 1.514, 1.52, 1.529, 1.539, 1.549, 1.559, 1.569, 1.579, 1.589, 1.6, 1.608, 1.617, 1.624, 1.631, 1.634, 1.637, + 1.605, 1.6, 1.596, 1.587, 1.579, 1.571, 1.563, 1.556, 1.549, 1.541, 1.533, 1.527, 1.522, 1.52, 1.52, 1.522, 1.525, 1.53, 1.538, 1.546, 1.557, 1.566, 1.576, 1.585, 1.595, 1.604, 1.612, 1.621, 1.627, 1.633, 1.637, 1.641, + 1.608, 1.604, 1.6, 1.592, 1.585, 1.577, 1.569, 1.561, 1.554, 1.547, 1.541, 1.536, 1.533, 1.531, 1.531, 1.533, 1.536, 1.54, 1.546, 1.554, 1.564, 1.574, 1.583, 1.592, 1.6, 1.608, 1.616, 1.624, 1.63, 1.636, 1.64, 1.644, + 1.611, 1.607, 1.604, 1.597, 1.59, 1.582, 1.574, 1.567, 1.56, 1.554, 1.549, 1.545, 1.543, 1.542, 1.542, 1.543, 1.546, 1.55, 1.556, 1.562, 1.571, 1.58, 1.589, 1.598, 1.605, 1.613, 1.621, 1.628, 1.634, 1.639, 1.643, 1.647, + 1.614, 1.61, 1.607, 1.601, 1.595, 1.588, 1.58, 1.574, 1.567, 1.562, 1.557, 1.554, 1.553, 1.552, 1.552, 1.554, 1.557, 1.561, 1.565, 1.571, 1.579, 1.587, 1.595, 1.603, 1.61, 1.618, 1.625, 1.633, 1.638, 1.642, 1.646, 1.65, + 1.616, 1.614, 1.611, 1.606, 1.601, 1.594, 1.586, 1.58, 1.574, 1.569, 1.565, 1.563, 1.562, 1.562, 1.562, 1.564, 1.567, 1.571, 1.575, 1.58, 1.586, 1.593, 1.601, 1.609, 1.616, 1.623, 1.63, 1.637, 1.641, 1.646, 1.65, 1.653, + 1.618, 1.615, 1.613, 1.609, 1.604, 1.598, 1.592, 1.586, 1.58, 1.575, 1.572, 1.571, 1.57, 1.57, 1.57, 1.572, 1.574, 1.577, 1.581, 1.585, 1.592, 1.599, 1.606, 1.614, 1.621, 1.628, 1.634, 1.64, 1.644, 1.649, 1.651, 1.654, + 1.618, 1.617, 1.615, 1.612, 1.608, 1.603, 1.597, 1.591, 1.585, 1.581, 1.579, 1.578, 1.578, 1.578, 1.578, 1.579, 1.581, 1.583, 1.586, 1.59, 1.597, 1.604, 1.612, 1.619, 1.626, 1.633, 1.638, 1.643, 1.647, 1.651, 1.653, 1.655, + 1.619, 1.618, 1.617, 1.614, 1.611, 1.607, 1.602, 1.596, 1.59, 1.587, 1.585, 1.585, 1.585, 1.585, 1.585, 1.586, 1.587, 1.589, 1.591, 1.595, 1.602, 1.609, 1.617, 1.624, 1.631, 1.638, 1.642, 1.646, 1.65, 1.654, 1.655, 1.655 + ] + }, + { + "ct": 5500, + "table": + [ + 2.664, 2.661, 2.658, 2.652, 2.646, 2.638, 2.631, 2.619, 2.605, 2.602, 2.602, 2.602, 2.602, 2.603, 2.605, 2.609, 2.614, 2.619, 2.625, 2.632, 2.642, 2.654, 2.667, 2.68, 2.69, 2.701, 2.712, 2.723, 2.73, 2.736, 2.742, 2.747, + 2.662, 2.659, 2.656, 2.649, 2.64, 2.631, 2.622, 2.61, 2.596, 2.593, 2.592, 2.593, 2.593, 2.595, 2.599, 2.604, 2.61, 2.616, 2.621, 2.628, 2.636, 2.646, 2.659, 2.671, 2.682, 2.694, 2.706, 2.718, 2.726, 2.733, 2.739, 2.745, + 2.66, 2.657, 2.655, 2.645, 2.635, 2.625, 2.614, 2.601, 2.587, 2.583, 2.583, 2.583, 2.584, 2.588, 2.593, 2.599, 2.606, 2.612, 2.618, 2.624, 2.63, 2.639, 2.65, 2.662, 2.674, 2.687, 2.7, 2.713, 2.721, 2.73, 2.736, 2.743, + 2.657, 2.655, 2.652, 2.641, 2.629, 2.617, 2.605, 2.592, 2.579, 2.575, 2.574, 2.574, 2.575, 2.58, 2.587, 2.593, 2.6, 2.607, 2.613, 2.619, 2.625, 2.632, 2.643, 2.654, 2.667, 2.68, 2.694, 2.708, 2.717, 2.727, 2.734, 2.741, + 2.654, 2.649, 2.644, 2.633, 2.621, 2.608, 2.595, 2.584, 2.573, 2.569, 2.566, 2.566, 2.566, 2.57, 2.575, 2.582, 2.59, 2.598, 2.607, 2.615, 2.621, 2.628, 2.639, 2.65, 2.664, 2.677, 2.691, 2.705, 2.715, 2.725, 2.733, 2.741, + 2.651, 2.644, 2.636, 2.624, 2.612, 2.599, 2.585, 2.576, 2.568, 2.563, 2.559, 2.557, 2.558, 2.56, 2.563, 2.57, 2.579, 2.589, 2.6, 2.61, 2.617, 2.625, 2.635, 2.647, 2.66, 2.674, 2.688, 2.701, 2.712, 2.723, 2.732, 2.741, + 2.648, 2.639, 2.629, 2.617, 2.604, 2.59, 2.577, 2.569, 2.563, 2.557, 2.551, 2.549, 2.549, 2.55, 2.552, 2.558, 2.568, 2.58, 2.593, 2.604, 2.612, 2.621, 2.632, 2.644, 2.658, 2.671, 2.685, 2.699, 2.71, 2.722, 2.731, 2.741, + 2.646, 2.635, 2.623, 2.61, 2.596, 2.584, 2.572, 2.565, 2.559, 2.552, 2.544, 2.541, 2.54, 2.541, 2.542, 2.548, 2.559, 2.57, 2.583, 2.595, 2.605, 2.616, 2.63, 2.643, 2.656, 2.67, 2.684, 2.698, 2.71, 2.722, 2.731, 2.741, + 2.644, 2.63, 2.617, 2.603, 2.588, 2.578, 2.567, 2.561, 2.555, 2.547, 2.538, 2.533, 2.532, 2.531, 2.532, 2.538, 2.549, 2.561, 2.574, 2.586, 2.598, 2.612, 2.627, 2.642, 2.655, 2.668, 2.682, 2.696, 2.709, 2.722, 2.731, 2.741, + 2.643, 2.628, 2.613, 2.598, 2.583, 2.573, 2.564, 2.557, 2.55, 2.541, 2.531, 2.526, 2.524, 2.523, 2.524, 2.53, 2.541, 2.552, 2.565, 2.578, 2.593, 2.608, 2.625, 2.641, 2.654, 2.668, 2.682, 2.696, 2.709, 2.722, 2.731, 2.741, + 2.643, 2.627, 2.61, 2.595, 2.581, 2.571, 2.562, 2.553, 2.543, 2.534, 2.526, 2.52, 2.516, 2.516, 2.519, 2.525, 2.533, 2.543, 2.556, 2.57, 2.588, 2.606, 2.623, 2.64, 2.654, 2.668, 2.682, 2.696, 2.709, 2.722, 2.731, 2.741, + 2.643, 2.625, 2.608, 2.593, 2.578, 2.569, 2.56, 2.549, 2.536, 2.528, 2.52, 2.514, 2.508, 2.509, 2.515, 2.52, 2.526, 2.535, 2.546, 2.562, 2.583, 2.603, 2.622, 2.639, 2.653, 2.668, 2.682, 2.696, 2.709, 2.722, 2.731, 2.741, + 2.643, 2.625, 2.607, 2.592, 2.577, 2.568, 2.56, 2.548, 2.534, 2.524, 2.516, 2.51, 2.505, 2.506, 2.51, 2.516, 2.522, 2.531, 2.544, 2.56, 2.581, 2.601, 2.621, 2.639, 2.654, 2.669, 2.683, 2.696, 2.71, 2.723, 2.732, 2.742, + 2.643, 2.625, 2.607, 2.592, 2.577, 2.568, 2.56, 2.548, 2.534, 2.523, 2.512, 2.506, 2.503, 2.504, 2.506, 2.512, 2.52, 2.53, 2.543, 2.559, 2.58, 2.6, 2.62, 2.639, 2.655, 2.67, 2.684, 2.697, 2.711, 2.725, 2.734, 2.743, + 2.643, 2.625, 2.607, 2.592, 2.577, 2.568, 2.56, 2.548, 2.534, 2.521, 2.508, 2.503, 2.502, 2.501, 2.502, 2.508, 2.517, 2.529, 2.543, 2.559, 2.579, 2.599, 2.62, 2.639, 2.656, 2.671, 2.685, 2.698, 2.713, 2.727, 2.736, 2.744, + 2.645, 2.627, 2.609, 2.593, 2.578, 2.569, 2.56, 2.548, 2.535, 2.522, 2.51, 2.504, 2.502, 2.502, 2.504, 2.509, 2.518, 2.529, 2.543, 2.559, 2.579, 2.599, 2.621, 2.642, 2.658, 2.673, 2.686, 2.7, 2.715, 2.729, 2.738, 2.747, + 2.646, 2.628, 2.611, 2.595, 2.58, 2.569, 2.56, 2.548, 2.535, 2.523, 2.512, 2.506, 2.503, 2.504, 2.507, 2.512, 2.518, 2.529, 2.543, 2.559, 2.579, 2.6, 2.623, 2.644, 2.659, 2.674, 2.688, 2.702, 2.716, 2.73, 2.74, 2.749, + 2.648, 2.63, 2.612, 2.597, 2.581, 2.571, 2.56, 2.548, 2.536, 2.525, 2.515, 2.509, 2.504, 2.505, 2.509, 2.514, 2.52, 2.53, 2.544, 2.56, 2.58, 2.6, 2.625, 2.646, 2.661, 2.676, 2.69, 2.704, 2.718, 2.732, 2.742, 2.752, + 2.648, 2.632, 2.615, 2.6, 2.585, 2.575, 2.565, 2.555, 2.544, 2.533, 2.523, 2.516, 2.511, 2.511, 2.514, 2.52, 2.529, 2.539, 2.551, 2.566, 2.585, 2.605, 2.628, 2.649, 2.664, 2.68, 2.694, 2.709, 2.723, 2.736, 2.745, 2.754, + 2.648, 2.633, 2.618, 2.603, 2.588, 2.579, 2.569, 2.561, 2.552, 2.542, 2.53, 2.523, 2.517, 2.516, 2.518, 2.526, 2.538, 2.549, 2.558, 2.571, 2.589, 2.609, 2.631, 2.651, 2.667, 2.683, 2.699, 2.713, 2.727, 2.74, 2.748, 2.756, + 2.649, 2.635, 2.622, 2.607, 2.593, 2.584, 2.575, 2.567, 2.559, 2.549, 2.538, 2.531, 2.525, 2.523, 2.525, 2.533, 2.546, 2.558, 2.566, 2.579, 2.597, 2.615, 2.635, 2.655, 2.671, 2.688, 2.703, 2.718, 2.732, 2.745, 2.752, 2.76, + 2.653, 2.64, 2.628, 2.615, 2.602, 2.591, 2.581, 2.573, 2.565, 2.556, 2.546, 2.54, 2.537, 2.536, 2.537, 2.543, 2.553, 2.565, 2.577, 2.592, 2.609, 2.627, 2.645, 2.662, 2.678, 2.693, 2.708, 2.723, 2.737, 2.75, 2.758, 2.766, + 2.657, 2.646, 2.634, 2.622, 2.61, 2.599, 2.588, 2.579, 2.57, 2.562, 2.554, 2.55, 2.549, 2.548, 2.548, 2.553, 2.561, 2.572, 2.588, 2.605, 2.622, 2.639, 2.655, 2.67, 2.685, 2.699, 2.714, 2.728, 2.742, 2.756, 2.764, 2.773, + 2.662, 2.652, 2.642, 2.63, 2.618, 2.607, 2.595, 2.586, 2.578, 2.571, 2.565, 2.563, 2.562, 2.562, 2.563, 2.567, 2.573, 2.584, 2.601, 2.618, 2.635, 2.651, 2.665, 2.679, 2.692, 2.706, 2.72, 2.735, 2.748, 2.761, 2.77, 2.778, + 2.669, 2.661, 2.652, 2.64, 2.627, 2.615, 2.604, 2.596, 2.589, 2.584, 2.58, 2.578, 2.578, 2.579, 2.581, 2.585, 2.591, 2.601, 2.615, 2.63, 2.646, 2.661, 2.675, 2.688, 2.701, 2.714, 2.729, 2.744, 2.756, 2.768, 2.775, 2.782, + 2.676, 2.669, 2.662, 2.649, 2.636, 2.624, 2.612, 2.605, 2.6, 2.596, 2.594, 2.593, 2.593, 2.595, 2.598, 2.603, 2.609, 2.618, 2.629, 2.642, 2.657, 2.672, 2.685, 2.698, 2.71, 2.723, 2.738, 2.752, 2.763, 2.774, 2.78, 2.786, + 2.683, 2.676, 2.67, 2.658, 2.646, 2.635, 2.623, 2.616, 2.611, 2.609, 2.608, 2.608, 2.608, 2.611, 2.614, 2.619, 2.625, 2.633, 2.644, 2.655, 2.668, 2.681, 2.694, 2.707, 2.719, 2.732, 2.747, 2.76, 2.77, 2.779, 2.785, 2.791, + 2.688, 2.682, 2.676, 2.667, 2.658, 2.646, 2.635, 2.628, 2.623, 2.621, 2.621, 2.621, 2.623, 2.625, 2.629, 2.634, 2.64, 2.648, 2.658, 2.669, 2.679, 2.691, 2.703, 2.716, 2.729, 2.742, 2.755, 2.768, 2.776, 2.783, 2.79, 2.796, + 2.694, 2.689, 2.683, 2.676, 2.67, 2.658, 2.646, 2.64, 2.635, 2.634, 2.634, 2.635, 2.637, 2.64, 2.644, 2.649, 2.655, 2.663, 2.673, 2.682, 2.691, 2.7, 2.712, 2.725, 2.738, 2.752, 2.764, 2.775, 2.782, 2.788, 2.795, 2.802, + 2.697, 2.693, 2.689, 2.682, 2.676, 2.666, 2.655, 2.65, 2.645, 2.644, 2.644, 2.645, 2.647, 2.649, 2.652, 2.657, 2.663, 2.671, 2.68, 2.69, 2.699, 2.709, 2.722, 2.735, 2.747, 2.76, 2.77, 2.78, 2.787, 2.793, 2.798, 2.804, + 2.7, 2.697, 2.694, 2.687, 2.68, 2.672, 2.664, 2.659, 2.655, 2.654, 2.654, 2.655, 2.655, 2.657, 2.66, 2.664, 2.671, 2.678, 2.687, 2.696, 2.707, 2.718, 2.732, 2.744, 2.756, 2.767, 2.776, 2.785, 2.791, 2.798, 2.801, 2.804, + 2.702, 2.701, 2.699, 2.692, 2.685, 2.679, 2.672, 2.668, 2.665, 2.664, 2.664, 2.664, 2.664, 2.665, 2.667, 2.671, 2.678, 2.685, 2.693, 2.703, 2.715, 2.728, 2.741, 2.754, 2.764, 2.774, 2.782, 2.789, 2.796, 2.803, 2.804, 2.805 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 2800, + "table": + [ + 2.876, 2.872, 2.868, 2.866, 2.863, 2.858, 2.852, 2.849, 2.847, 2.846, 2.846, 2.846, 2.847, 2.848, 2.85, 2.851, 2.851, 2.852, 2.855, 2.859, 2.864, 2.868, 2.872, 2.877, 2.884, 2.89, 2.895, 2.9, 2.907, 2.913, 2.92, 2.926, + 2.871, 2.869, 2.866, 2.863, 2.861, 2.856, 2.85, 2.848, 2.846, 2.846, 2.846, 2.847, 2.847, 2.848, 2.85, 2.852, 2.853, 2.854, 2.856, 2.86, 2.866, 2.871, 2.875, 2.879, 2.884, 2.889, 2.894, 2.899, 2.905, 2.912, 2.917, 2.923, + 2.867, 2.865, 2.863, 2.861, 2.858, 2.854, 2.848, 2.847, 2.846, 2.846, 2.847, 2.847, 2.848, 2.849, 2.85, 2.852, 2.854, 2.856, 2.858, 2.861, 2.868, 2.874, 2.877, 2.881, 2.884, 2.888, 2.893, 2.898, 2.904, 2.91, 2.915, 2.92, + 2.863, 2.862, 2.861, 2.858, 2.856, 2.851, 2.847, 2.846, 2.846, 2.846, 2.847, 2.848, 2.849, 2.85, 2.852, 2.854, 2.857, 2.859, 2.86, 2.864, 2.871, 2.877, 2.88, 2.883, 2.884, 2.887, 2.892, 2.896, 2.903, 2.909, 2.913, 2.917, + 2.862, 2.861, 2.859, 2.856, 2.852, 2.848, 2.845, 2.844, 2.844, 2.846, 2.849, 2.852, 2.855, 2.857, 2.86, 2.863, 2.868, 2.87, 2.871, 2.873, 2.877, 2.88, 2.881, 2.883, 2.885, 2.887, 2.89, 2.894, 2.9, 2.906, 2.911, 2.915, + 2.861, 2.859, 2.857, 2.853, 2.849, 2.846, 2.843, 2.842, 2.842, 2.846, 2.851, 2.856, 2.861, 2.865, 2.868, 2.873, 2.878, 2.881, 2.881, 2.882, 2.882, 2.883, 2.883, 2.883, 2.885, 2.886, 2.889, 2.891, 2.897, 2.903, 2.909, 2.914, + 2.861, 2.858, 2.856, 2.851, 2.847, 2.844, 2.842, 2.842, 2.843, 2.848, 2.854, 2.861, 2.867, 2.872, 2.876, 2.881, 2.887, 2.89, 2.89, 2.889, 2.888, 2.887, 2.885, 2.884, 2.886, 2.887, 2.888, 2.89, 2.896, 2.901, 2.907, 2.912, + 2.86, 2.857, 2.854, 2.85, 2.846, 2.845, 2.844, 2.845, 2.847, 2.852, 2.859, 2.865, 2.872, 2.878, 2.883, 2.887, 2.892, 2.895, 2.895, 2.894, 2.893, 2.892, 2.889, 2.887, 2.888, 2.889, 2.89, 2.892, 2.897, 2.901, 2.906, 2.911, + 2.858, 2.855, 2.852, 2.849, 2.846, 2.846, 2.845, 2.848, 2.852, 2.857, 2.863, 2.87, 2.878, 2.884, 2.889, 2.894, 2.898, 2.9, 2.9, 2.899, 2.899, 2.897, 2.893, 2.89, 2.89, 2.89, 2.892, 2.894, 2.897, 2.901, 2.905, 2.91, + 2.858, 2.855, 2.851, 2.849, 2.846, 2.846, 2.846, 2.85, 2.856, 2.862, 2.868, 2.875, 2.883, 2.889, 2.894, 2.898, 2.902, 2.904, 2.904, 2.904, 2.903, 2.901, 2.896, 2.893, 2.892, 2.892, 2.894, 2.895, 2.899, 2.902, 2.905, 2.909, + 2.858, 2.855, 2.851, 2.849, 2.846, 2.846, 2.846, 2.852, 2.86, 2.867, 2.874, 2.881, 2.887, 2.893, 2.897, 2.901, 2.904, 2.907, 2.908, 2.909, 2.907, 2.905, 2.9, 2.896, 2.894, 2.893, 2.895, 2.897, 2.9, 2.903, 2.906, 2.909, + 2.858, 2.855, 2.851, 2.849, 2.846, 2.846, 2.846, 2.854, 2.863, 2.872, 2.88, 2.886, 2.892, 2.896, 2.9, 2.903, 2.907, 2.91, 2.912, 2.913, 2.911, 2.908, 2.904, 2.899, 2.897, 2.895, 2.896, 2.898, 2.901, 2.904, 2.906, 2.909, + 2.858, 2.855, 2.851, 2.849, 2.847, 2.847, 2.848, 2.856, 2.866, 2.875, 2.882, 2.889, 2.894, 2.899, 2.902, 2.906, 2.909, 2.912, 2.915, 2.916, 2.914, 2.911, 2.907, 2.903, 2.899, 2.897, 2.898, 2.899, 2.902, 2.904, 2.907, 2.909, + 2.858, 2.855, 2.851, 2.85, 2.848, 2.849, 2.85, 2.858, 2.869, 2.877, 2.884, 2.89, 2.896, 2.901, 2.905, 2.908, 2.912, 2.915, 2.918, 2.918, 2.916, 2.913, 2.91, 2.906, 2.902, 2.899, 2.899, 2.899, 2.902, 2.905, 2.907, 2.908, + 2.858, 2.855, 2.851, 2.85, 2.849, 2.851, 2.852, 2.861, 2.871, 2.879, 2.886, 2.892, 2.898, 2.903, 2.907, 2.911, 2.915, 2.918, 2.92, 2.921, 2.918, 2.916, 2.913, 2.909, 2.905, 2.901, 2.9, 2.899, 2.902, 2.905, 2.907, 2.908, + 2.859, 2.856, 2.853, 2.851, 2.85, 2.852, 2.853, 2.862, 2.871, 2.879, 2.886, 2.892, 2.898, 2.904, 2.908, 2.912, 2.916, 2.918, 2.921, 2.921, 2.919, 2.917, 2.914, 2.91, 2.905, 2.901, 2.9, 2.9, 2.903, 2.906, 2.907, 2.908, + 2.86, 2.857, 2.854, 2.853, 2.852, 2.853, 2.854, 2.862, 2.871, 2.879, 2.886, 2.892, 2.898, 2.904, 2.909, 2.913, 2.916, 2.919, 2.921, 2.922, 2.92, 2.918, 2.914, 2.91, 2.905, 2.901, 2.901, 2.901, 2.904, 2.906, 2.907, 2.908, + 2.861, 2.858, 2.855, 2.854, 2.853, 2.854, 2.855, 2.862, 2.871, 2.879, 2.886, 2.892, 2.898, 2.904, 2.91, 2.914, 2.917, 2.919, 2.921, 2.922, 2.921, 2.919, 2.914, 2.91, 2.905, 2.901, 2.901, 2.902, 2.904, 2.907, 2.908, 2.908, + 2.861, 2.859, 2.857, 2.855, 2.854, 2.854, 2.855, 2.862, 2.871, 2.878, 2.885, 2.891, 2.898, 2.903, 2.908, 2.912, 2.915, 2.918, 2.919, 2.919, 2.918, 2.916, 2.912, 2.909, 2.906, 2.903, 2.903, 2.904, 2.906, 2.907, 2.908, 2.908, + 2.862, 2.86, 2.858, 2.856, 2.855, 2.855, 2.856, 2.862, 2.87, 2.877, 2.884, 2.89, 2.897, 2.902, 2.906, 2.91, 2.914, 2.916, 2.918, 2.917, 2.915, 2.913, 2.91, 2.908, 2.906, 2.905, 2.905, 2.906, 2.907, 2.908, 2.908, 2.909, + 2.862, 2.861, 2.859, 2.858, 2.856, 2.856, 2.857, 2.863, 2.87, 2.876, 2.883, 2.889, 2.895, 2.9, 2.904, 2.908, 2.912, 2.914, 2.915, 2.915, 2.912, 2.91, 2.908, 2.907, 2.907, 2.907, 2.907, 2.907, 2.908, 2.909, 2.909, 2.909, + 2.862, 2.862, 2.861, 2.859, 2.857, 2.858, 2.859, 2.864, 2.87, 2.876, 2.881, 2.886, 2.891, 2.896, 2.901, 2.905, 2.909, 2.911, 2.911, 2.911, 2.909, 2.907, 2.906, 2.906, 2.906, 2.907, 2.908, 2.908, 2.909, 2.91, 2.911, 2.911, + 2.863, 2.863, 2.862, 2.86, 2.858, 2.86, 2.862, 2.866, 2.87, 2.875, 2.88, 2.884, 2.887, 2.891, 2.897, 2.902, 2.905, 2.907, 2.907, 2.907, 2.906, 2.905, 2.905, 2.905, 2.906, 2.907, 2.908, 2.909, 2.91, 2.912, 2.912, 2.912, + 2.863, 2.863, 2.863, 2.862, 2.86, 2.862, 2.864, 2.867, 2.87, 2.874, 2.878, 2.881, 2.883, 2.888, 2.894, 2.898, 2.901, 2.903, 2.903, 2.903, 2.903, 2.903, 2.903, 2.904, 2.906, 2.907, 2.908, 2.91, 2.912, 2.913, 2.913, 2.914, + 2.865, 2.864, 2.864, 2.863, 2.862, 2.864, 2.865, 2.867, 2.869, 2.872, 2.875, 2.878, 2.882, 2.886, 2.89, 2.893, 2.895, 2.897, 2.899, 2.899, 2.899, 2.9, 2.902, 2.903, 2.905, 2.907, 2.909, 2.911, 2.912, 2.914, 2.914, 2.915, + 2.866, 2.865, 2.865, 2.865, 2.864, 2.865, 2.866, 2.867, 2.868, 2.87, 2.872, 2.876, 2.88, 2.883, 2.886, 2.888, 2.89, 2.892, 2.894, 2.896, 2.896, 2.897, 2.9, 2.903, 2.905, 2.907, 2.91, 2.913, 2.913, 2.914, 2.915, 2.916, + 2.868, 2.868, 2.867, 2.867, 2.866, 2.867, 2.868, 2.868, 2.869, 2.87, 2.871, 2.874, 2.877, 2.879, 2.881, 2.883, 2.885, 2.888, 2.891, 2.893, 2.894, 2.896, 2.898, 2.901, 2.904, 2.907, 2.91, 2.913, 2.914, 2.915, 2.916, 2.918, + 2.871, 2.871, 2.871, 2.87, 2.869, 2.869, 2.869, 2.869, 2.87, 2.87, 2.871, 2.872, 2.874, 2.875, 2.875, 2.877, 2.881, 2.885, 2.889, 2.892, 2.893, 2.895, 2.897, 2.899, 2.903, 2.907, 2.91, 2.914, 2.915, 2.916, 2.918, 2.919, + 2.874, 2.874, 2.874, 2.873, 2.871, 2.871, 2.871, 2.871, 2.871, 2.871, 2.871, 2.871, 2.87, 2.87, 2.87, 2.872, 2.876, 2.881, 2.886, 2.89, 2.893, 2.894, 2.895, 2.897, 2.902, 2.907, 2.911, 2.914, 2.916, 2.917, 2.919, 2.921, + 2.877, 2.877, 2.876, 2.874, 2.873, 2.872, 2.872, 2.872, 2.871, 2.871, 2.871, 2.87, 2.869, 2.869, 2.869, 2.871, 2.874, 2.878, 2.883, 2.887, 2.891, 2.893, 2.894, 2.896, 2.901, 2.907, 2.911, 2.914, 2.916, 2.918, 2.919, 2.921, + 2.88, 2.879, 2.878, 2.876, 2.874, 2.874, 2.873, 2.872, 2.871, 2.871, 2.871, 2.87, 2.869, 2.869, 2.869, 2.87, 2.871, 2.874, 2.879, 2.884, 2.889, 2.892, 2.894, 2.896, 2.901, 2.906, 2.91, 2.914, 2.916, 2.918, 2.92, 2.921, + 2.882, 2.881, 2.879, 2.878, 2.876, 2.875, 2.874, 2.873, 2.871, 2.871, 2.871, 2.87, 2.869, 2.869, 2.869, 2.869, 2.869, 2.871, 2.875, 2.881, 2.887, 2.891, 2.893, 2.895, 2.901, 2.906, 2.91, 2.914, 2.917, 2.919, 2.92, 2.921 + ] + }, + { + "ct": 5500, + "table": + [ + 1.488, 1.488, 1.488, 1.488, 1.488, 1.488, 1.488, 1.489, 1.491, 1.491, 1.492, 1.492, 1.492, 1.492, 1.491, 1.491, 1.491, 1.491, 1.491, 1.491, 1.492, 1.492, 1.494, 1.495, 1.496, 1.497, 1.498, 1.499, 1.499, 1.499, 1.501, 1.503, + 1.486, 1.486, 1.487, 1.487, 1.487, 1.487, 1.488, 1.489, 1.49, 1.491, 1.492, 1.492, 1.492, 1.492, 1.492, 1.491, 1.491, 1.491, 1.491, 1.492, 1.492, 1.493, 1.494, 1.495, 1.495, 1.495, 1.496, 1.496, 1.497, 1.497, 1.498, 1.5, + 1.484, 1.485, 1.486, 1.486, 1.486, 1.486, 1.487, 1.488, 1.489, 1.49, 1.492, 1.492, 1.492, 1.492, 1.492, 1.492, 1.492, 1.492, 1.492, 1.492, 1.493, 1.494, 1.494, 1.494, 1.494, 1.493, 1.493, 1.493, 1.494, 1.495, 1.496, 1.497, + 1.482, 1.483, 1.485, 1.485, 1.485, 1.486, 1.487, 1.488, 1.489, 1.49, 1.491, 1.492, 1.492, 1.492, 1.492, 1.492, 1.492, 1.492, 1.492, 1.493, 1.493, 1.494, 1.494, 1.494, 1.493, 1.492, 1.491, 1.491, 1.492, 1.493, 1.493, 1.494, + 1.482, 1.483, 1.484, 1.484, 1.485, 1.485, 1.486, 1.487, 1.488, 1.49, 1.491, 1.493, 1.493, 1.494, 1.494, 1.495, 1.495, 1.495, 1.495, 1.494, 1.494, 1.494, 1.493, 1.493, 1.492, 1.492, 1.491, 1.491, 1.492, 1.492, 1.492, 1.493, + 1.482, 1.482, 1.483, 1.483, 1.484, 1.485, 1.485, 1.486, 1.487, 1.489, 1.491, 1.493, 1.494, 1.496, 1.496, 1.497, 1.497, 1.497, 1.497, 1.496, 1.495, 1.494, 1.493, 1.492, 1.492, 1.491, 1.491, 1.491, 1.491, 1.491, 1.492, 1.492, + 1.482, 1.482, 1.482, 1.483, 1.484, 1.484, 1.485, 1.486, 1.487, 1.489, 1.492, 1.494, 1.496, 1.497, 1.498, 1.498, 1.499, 1.499, 1.498, 1.497, 1.496, 1.494, 1.493, 1.492, 1.491, 1.491, 1.491, 1.491, 1.491, 1.491, 1.491, 1.491, + 1.482, 1.482, 1.482, 1.482, 1.483, 1.484, 1.485, 1.487, 1.488, 1.491, 1.493, 1.495, 1.496, 1.497, 1.498, 1.499, 1.5, 1.5, 1.499, 1.498, 1.497, 1.495, 1.494, 1.492, 1.492, 1.491, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, + 1.481, 1.481, 1.481, 1.482, 1.482, 1.483, 1.485, 1.487, 1.49, 1.492, 1.495, 1.496, 1.497, 1.498, 1.499, 1.499, 1.5, 1.5, 1.499, 1.499, 1.498, 1.497, 1.494, 1.493, 1.492, 1.491, 1.49, 1.488, 1.488, 1.488, 1.488, 1.488, + 1.481, 1.481, 1.481, 1.481, 1.482, 1.483, 1.484, 1.487, 1.49, 1.493, 1.495, 1.497, 1.498, 1.498, 1.499, 1.5, 1.5, 1.501, 1.5, 1.499, 1.498, 1.497, 1.495, 1.492, 1.491, 1.49, 1.489, 1.487, 1.487, 1.487, 1.487, 1.487, + 1.481, 1.481, 1.481, 1.481, 1.481, 1.482, 1.484, 1.487, 1.49, 1.493, 1.496, 1.497, 1.498, 1.498, 1.499, 1.5, 1.5, 1.501, 1.5, 1.499, 1.498, 1.497, 1.494, 1.492, 1.491, 1.489, 1.488, 1.486, 1.486, 1.485, 1.485, 1.485, + 1.481, 1.481, 1.481, 1.481, 1.481, 1.482, 1.483, 1.486, 1.49, 1.493, 1.496, 1.497, 1.498, 1.498, 1.499, 1.5, 1.5, 1.501, 1.5, 1.499, 1.498, 1.497, 1.494, 1.492, 1.49, 1.488, 1.487, 1.485, 1.484, 1.483, 1.483, 1.483, + 1.48, 1.48, 1.48, 1.481, 1.481, 1.482, 1.483, 1.486, 1.489, 1.493, 1.496, 1.497, 1.497, 1.498, 1.499, 1.499, 1.5, 1.5, 1.499, 1.499, 1.498, 1.496, 1.494, 1.491, 1.489, 1.487, 1.485, 1.484, 1.483, 1.483, 1.483, 1.482, + 1.48, 1.48, 1.48, 1.48, 1.481, 1.482, 1.482, 1.485, 1.489, 1.492, 1.495, 1.496, 1.497, 1.498, 1.498, 1.499, 1.499, 1.5, 1.499, 1.498, 1.497, 1.495, 1.493, 1.491, 1.488, 1.486, 1.484, 1.483, 1.483, 1.482, 1.482, 1.482, + 1.479, 1.479, 1.479, 1.48, 1.481, 1.481, 1.482, 1.485, 1.488, 1.491, 1.494, 1.496, 1.497, 1.497, 1.498, 1.498, 1.499, 1.499, 1.499, 1.498, 1.496, 1.495, 1.493, 1.491, 1.488, 1.485, 1.483, 1.482, 1.482, 1.482, 1.482, 1.481, + 1.479, 1.479, 1.479, 1.48, 1.48, 1.481, 1.482, 1.485, 1.488, 1.491, 1.494, 1.495, 1.496, 1.497, 1.497, 1.498, 1.498, 1.498, 1.498, 1.497, 1.496, 1.494, 1.492, 1.49, 1.487, 1.484, 1.483, 1.482, 1.481, 1.481, 1.48, 1.48, + 1.479, 1.479, 1.479, 1.479, 1.48, 1.48, 1.481, 1.484, 1.488, 1.491, 1.493, 1.495, 1.496, 1.497, 1.497, 1.497, 1.498, 1.497, 1.497, 1.497, 1.496, 1.494, 1.492, 1.489, 1.486, 1.483, 1.482, 1.481, 1.481, 1.48, 1.479, 1.478, + 1.479, 1.479, 1.479, 1.479, 1.479, 1.48, 1.481, 1.484, 1.488, 1.491, 1.493, 1.495, 1.496, 1.496, 1.497, 1.497, 1.497, 1.497, 1.496, 1.496, 1.495, 1.494, 1.491, 1.488, 1.485, 1.482, 1.481, 1.481, 1.48, 1.479, 1.478, 1.477, + 1.479, 1.479, 1.479, 1.479, 1.479, 1.48, 1.481, 1.484, 1.487, 1.49, 1.492, 1.494, 1.495, 1.496, 1.496, 1.497, 1.497, 1.496, 1.496, 1.495, 1.494, 1.493, 1.49, 1.487, 1.484, 1.482, 1.481, 1.48, 1.479, 1.479, 1.478, 1.477, + 1.478, 1.478, 1.478, 1.479, 1.479, 1.48, 1.481, 1.484, 1.487, 1.489, 1.491, 1.493, 1.494, 1.495, 1.496, 1.496, 1.496, 1.496, 1.496, 1.495, 1.494, 1.492, 1.489, 1.487, 1.484, 1.482, 1.481, 1.479, 1.479, 1.478, 1.477, 1.476, + 1.478, 1.478, 1.478, 1.478, 1.479, 1.48, 1.481, 1.483, 1.486, 1.488, 1.49, 1.492, 1.493, 1.494, 1.495, 1.496, 1.496, 1.495, 1.495, 1.494, 1.493, 1.491, 1.488, 1.486, 1.484, 1.482, 1.48, 1.479, 1.478, 1.478, 1.477, 1.476, + 1.478, 1.478, 1.478, 1.478, 1.479, 1.48, 1.481, 1.483, 1.486, 1.488, 1.489, 1.491, 1.492, 1.493, 1.494, 1.495, 1.495, 1.494, 1.494, 1.493, 1.491, 1.489, 1.487, 1.485, 1.483, 1.481, 1.48, 1.479, 1.478, 1.477, 1.477, 1.476, + 1.478, 1.478, 1.478, 1.478, 1.479, 1.48, 1.482, 1.484, 1.486, 1.487, 1.488, 1.49, 1.491, 1.492, 1.493, 1.494, 1.494, 1.493, 1.493, 1.492, 1.489, 1.487, 1.486, 1.484, 1.483, 1.481, 1.48, 1.479, 1.478, 1.476, 1.476, 1.476, + 1.478, 1.478, 1.478, 1.479, 1.479, 1.481, 1.482, 1.484, 1.485, 1.486, 1.487, 1.489, 1.49, 1.491, 1.492, 1.492, 1.492, 1.492, 1.491, 1.49, 1.488, 1.486, 1.485, 1.483, 1.482, 1.481, 1.48, 1.479, 1.477, 1.476, 1.476, 1.476, + 1.477, 1.478, 1.478, 1.479, 1.48, 1.481, 1.482, 1.484, 1.485, 1.486, 1.487, 1.488, 1.489, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.489, 1.487, 1.485, 1.484, 1.483, 1.482, 1.481, 1.48, 1.479, 1.477, 1.476, 1.476, 1.476, + 1.477, 1.478, 1.479, 1.48, 1.481, 1.482, 1.483, 1.484, 1.485, 1.486, 1.486, 1.487, 1.488, 1.488, 1.489, 1.488, 1.488, 1.488, 1.488, 1.487, 1.485, 1.484, 1.484, 1.483, 1.482, 1.481, 1.48, 1.479, 1.477, 1.476, 1.476, 1.476, + 1.477, 1.478, 1.479, 1.48, 1.481, 1.482, 1.483, 1.484, 1.485, 1.485, 1.486, 1.486, 1.487, 1.487, 1.487, 1.486, 1.486, 1.486, 1.486, 1.486, 1.485, 1.484, 1.483, 1.483, 1.482, 1.481, 1.48, 1.479, 1.477, 1.476, 1.476, 1.476, + 1.477, 1.478, 1.479, 1.48, 1.481, 1.482, 1.483, 1.484, 1.484, 1.485, 1.485, 1.486, 1.486, 1.485, 1.485, 1.484, 1.484, 1.484, 1.485, 1.485, 1.484, 1.483, 1.483, 1.482, 1.482, 1.481, 1.48, 1.479, 1.478, 1.477, 1.476, 1.476, + 1.477, 1.478, 1.479, 1.48, 1.482, 1.482, 1.483, 1.483, 1.484, 1.484, 1.485, 1.485, 1.484, 1.484, 1.483, 1.482, 1.482, 1.483, 1.484, 1.484, 1.483, 1.483, 1.482, 1.482, 1.481, 1.481, 1.48, 1.479, 1.478, 1.477, 1.476, 1.476, + 1.477, 1.478, 1.479, 1.48, 1.482, 1.482, 1.483, 1.483, 1.484, 1.484, 1.485, 1.484, 1.484, 1.483, 1.482, 1.482, 1.482, 1.482, 1.483, 1.483, 1.483, 1.483, 1.482, 1.482, 1.481, 1.48, 1.48, 1.479, 1.478, 1.478, 1.477, 1.477, + 1.477, 1.478, 1.479, 1.48, 1.482, 1.482, 1.483, 1.483, 1.484, 1.484, 1.484, 1.484, 1.483, 1.483, 1.482, 1.482, 1.482, 1.482, 1.483, 1.483, 1.482, 1.482, 1.482, 1.481, 1.48, 1.48, 1.479, 1.479, 1.479, 1.478, 1.478, 1.478, + 1.477, 1.478, 1.479, 1.48, 1.482, 1.482, 1.483, 1.483, 1.484, 1.484, 1.484, 1.483, 1.482, 1.482, 1.482, 1.482, 1.482, 1.482, 1.482, 1.482, 1.482, 1.482, 1.481, 1.481, 1.48, 1.479, 1.479, 1.479, 1.479, 1.479, 1.479, 1.479 + ] + } + ], + "luminance_lut": + [ + 2.764, 2.711, 2.658, 2.504, 2.342, 2.204, 2.07, 1.937, 1.803, 1.706, 1.622, 1.582, 1.565, 1.558, 1.558, 1.558, 1.558, 1.56, 1.565, 1.586, 1.631, 1.7, 1.818, 1.941, 2.081, 2.222, 2.37, 2.522, 2.711, 2.893, 2.968, 3.043, + 2.725, 2.642, 2.56, 2.405, 2.246, 2.115, 1.989, 1.86, 1.732, 1.642, 1.567, 1.527, 1.504, 1.493, 1.488, 1.486, 1.486, 1.492, 1.503, 1.528, 1.574, 1.64, 1.746, 1.86, 1.995, 2.131, 2.274, 2.423, 2.608, 2.788, 2.888, 2.988, + 2.686, 2.574, 2.462, 2.307, 2.149, 2.026, 1.908, 1.784, 1.66, 1.578, 1.511, 1.471, 1.443, 1.427, 1.419, 1.415, 1.415, 1.423, 1.44, 1.47, 1.516, 1.579, 1.674, 1.779, 1.909, 2.04, 2.179, 2.323, 2.504, 2.682, 2.808, 2.933, + 2.636, 2.502, 2.368, 2.212, 2.055, 1.937, 1.825, 1.709, 1.592, 1.517, 1.457, 1.416, 1.385, 1.365, 1.353, 1.347, 1.347, 1.358, 1.38, 1.413, 1.46, 1.52, 1.605, 1.7, 1.824, 1.949, 2.085, 2.227, 2.405, 2.581, 2.725, 2.87, + 2.537, 2.413, 2.289, 2.133, 1.974, 1.853, 1.737, 1.637, 1.54, 1.468, 1.406, 1.366, 1.336, 1.317, 1.306, 1.301, 1.301, 1.311, 1.332, 1.362, 1.407, 1.464, 1.545, 1.633, 1.743, 1.858, 1.999, 2.144, 2.323, 2.5, 2.635, 2.771, + 2.439, 2.325, 2.211, 2.053, 1.892, 1.768, 1.649, 1.564, 1.488, 1.42, 1.355, 1.315, 1.288, 1.27, 1.259, 1.254, 1.254, 1.263, 1.283, 1.312, 1.355, 1.409, 1.485, 1.567, 1.662, 1.767, 1.912, 2.062, 2.242, 2.419, 2.545, 2.672, + 2.362, 2.251, 2.14, 1.982, 1.82, 1.695, 1.576, 1.501, 1.437, 1.375, 1.313, 1.273, 1.243, 1.225, 1.214, 1.209, 1.209, 1.218, 1.238, 1.267, 1.31, 1.361, 1.43, 1.504, 1.591, 1.689, 1.835, 1.986, 2.167, 2.345, 2.469, 2.594, + 2.323, 2.202, 2.081, 1.924, 1.764, 1.643, 1.529, 1.454, 1.389, 1.335, 1.286, 1.244, 1.206, 1.184, 1.172, 1.166, 1.166, 1.177, 1.201, 1.233, 1.278, 1.327, 1.385, 1.45, 1.537, 1.634, 1.776, 1.924, 2.105, 2.283, 2.418, 2.552, + 2.285, 2.154, 2.023, 1.866, 1.708, 1.592, 1.481, 1.406, 1.341, 1.296, 1.258, 1.215, 1.169, 1.143, 1.13, 1.124, 1.124, 1.137, 1.164, 1.199, 1.246, 1.292, 1.339, 1.397, 1.483, 1.58, 1.717, 1.861, 2.043, 2.222, 2.366, 2.51, + 2.258, 2.116, 1.975, 1.82, 1.665, 1.552, 1.446, 1.372, 1.306, 1.262, 1.227, 1.185, 1.141, 1.113, 1.097, 1.089, 1.089, 1.103, 1.134, 1.17, 1.214, 1.259, 1.303, 1.358, 1.443, 1.537, 1.671, 1.81, 1.992, 2.171, 2.325, 2.479, + 2.24, 2.088, 1.936, 1.784, 1.631, 1.522, 1.42, 1.347, 1.282, 1.234, 1.192, 1.156, 1.121, 1.093, 1.07, 1.06, 1.06, 1.076, 1.11, 1.146, 1.184, 1.225, 1.274, 1.332, 1.414, 1.505, 1.634, 1.77, 1.951, 2.13, 2.294, 2.457, + 2.223, 2.06, 1.898, 1.747, 1.597, 1.492, 1.394, 1.323, 1.258, 1.206, 1.158, 1.126, 1.101, 1.074, 1.044, 1.03, 1.031, 1.049, 1.087, 1.122, 1.153, 1.192, 1.245, 1.306, 1.385, 1.473, 1.598, 1.73, 1.91, 2.089, 2.262, 2.435, + 2.218, 2.047, 1.876, 1.727, 1.579, 1.476, 1.38, 1.309, 1.245, 1.19, 1.138, 1.104, 1.078, 1.053, 1.028, 1.018, 1.019, 1.035, 1.065, 1.097, 1.131, 1.172, 1.228, 1.29, 1.367, 1.453, 1.575, 1.705, 1.884, 2.062, 2.245, 2.428, + 2.218, 2.039, 1.861, 1.712, 1.566, 1.465, 1.37, 1.299, 1.234, 1.178, 1.124, 1.085, 1.054, 1.032, 1.017, 1.012, 1.015, 1.026, 1.045, 1.072, 1.112, 1.158, 1.216, 1.279, 1.354, 1.438, 1.559, 1.686, 1.863, 2.041, 2.234, 2.427, + 2.218, 2.032, 1.846, 1.698, 1.553, 1.453, 1.36, 1.29, 1.224, 1.166, 1.109, 1.066, 1.03, 1.012, 1.006, 1.005, 1.011, 1.017, 1.024, 1.047, 1.093, 1.143, 1.203, 1.267, 1.341, 1.424, 1.542, 1.667, 1.842, 2.02, 2.223, 2.426, + 2.218, 2.031, 1.844, 1.697, 1.552, 1.452, 1.36, 1.289, 1.223, 1.164, 1.108, 1.064, 1.027, 1.009, 1.004, 1.004, 1.009, 1.015, 1.022, 1.045, 1.091, 1.142, 1.202, 1.266, 1.34, 1.423, 1.54, 1.665, 1.841, 2.018, 2.222, 2.426, + 2.218, 2.031, 1.844, 1.697, 1.552, 1.452, 1.36, 1.289, 1.223, 1.164, 1.108, 1.064, 1.027, 1.009, 1.004, 1.004, 1.008, 1.014, 1.021, 1.045, 1.091, 1.142, 1.202, 1.266, 1.34, 1.423, 1.54, 1.665, 1.841, 2.018, 2.222, 2.426, + 2.218, 2.032, 1.846, 1.699, 1.554, 1.454, 1.361, 1.29, 1.225, 1.166, 1.11, 1.066, 1.028, 1.01, 1.004, 1.004, 1.007, 1.014, 1.023, 1.047, 1.093, 1.143, 1.203, 1.267, 1.341, 1.424, 1.542, 1.667, 1.842, 2.02, 2.223, 2.426, + 2.22, 2.044, 1.869, 1.719, 1.572, 1.471, 1.376, 1.305, 1.24, 1.183, 1.129, 1.089, 1.054, 1.031, 1.014, 1.009, 1.013, 1.026, 1.048, 1.077, 1.115, 1.159, 1.218, 1.28, 1.356, 1.44, 1.56, 1.687, 1.863, 2.041, 2.234, 2.427, + 2.222, 2.056, 1.891, 1.74, 1.591, 1.487, 1.391, 1.319, 1.254, 1.2, 1.149, 1.111, 1.08, 1.052, 1.025, 1.015, 1.019, 1.038, 1.073, 1.106, 1.136, 1.175, 1.232, 1.294, 1.371, 1.457, 1.578, 1.706, 1.884, 2.062, 2.245, 2.427, + 2.231, 2.074, 1.918, 1.766, 1.614, 1.508, 1.41, 1.338, 1.273, 1.22, 1.173, 1.136, 1.106, 1.074, 1.041, 1.028, 1.033, 1.055, 1.097, 1.134, 1.16, 1.196, 1.251, 1.311, 1.39, 1.477, 1.601, 1.732, 1.911, 2.089, 2.262, 2.434, + 2.255, 2.108, 1.961, 1.807, 1.652, 1.542, 1.439, 1.365, 1.299, 1.25, 1.207, 1.167, 1.13, 1.099, 1.074, 1.063, 1.066, 1.084, 1.119, 1.155, 1.192, 1.233, 1.281, 1.338, 1.419, 1.509, 1.637, 1.772, 1.953, 2.132, 2.294, 2.456, + 2.279, 2.142, 2.004, 1.848, 1.69, 1.576, 1.468, 1.393, 1.326, 1.279, 1.241, 1.198, 1.153, 1.125, 1.107, 1.099, 1.1, 1.113, 1.141, 1.177, 1.223, 1.269, 1.312, 1.366, 1.449, 1.541, 1.673, 1.812, 1.995, 2.175, 2.327, 2.479, + 2.317, 2.187, 2.057, 1.898, 1.737, 1.619, 1.508, 1.431, 1.363, 1.314, 1.273, 1.229, 1.183, 1.157, 1.143, 1.137, 1.137, 1.148, 1.171, 1.205, 1.255, 1.304, 1.35, 1.406, 1.49, 1.584, 1.72, 1.863, 2.047, 2.228, 2.37, 2.512, + 2.37, 2.247, 2.123, 1.961, 1.797, 1.675, 1.559, 1.481, 1.413, 1.356, 1.303, 1.259, 1.22, 1.196, 1.184, 1.178, 1.178, 1.188, 1.21, 1.242, 1.287, 1.337, 1.396, 1.462, 1.545, 1.64, 1.781, 1.928, 2.112, 2.292, 2.425, 2.559, + 2.424, 2.306, 2.188, 2.024, 1.857, 1.731, 1.611, 1.532, 1.462, 1.397, 1.334, 1.29, 1.256, 1.236, 1.224, 1.219, 1.219, 1.229, 1.249, 1.278, 1.32, 1.371, 1.443, 1.518, 1.6, 1.695, 1.842, 1.994, 2.177, 2.356, 2.48, 2.605, + 2.513, 2.39, 2.266, 2.102, 1.935, 1.808, 1.687, 1.597, 1.516, 1.446, 1.379, 1.335, 1.302, 1.282, 1.271, 1.266, 1.266, 1.276, 1.296, 1.325, 1.366, 1.42, 1.497, 1.58, 1.674, 1.779, 1.923, 2.073, 2.255, 2.434, 2.563, 2.693, + 2.621, 2.486, 2.352, 2.189, 2.024, 1.897, 1.775, 1.672, 1.572, 1.498, 1.433, 1.388, 1.353, 1.333, 1.322, 1.316, 1.316, 1.326, 1.348, 1.378, 1.421, 1.476, 1.556, 1.645, 1.759, 1.877, 2.016, 2.159, 2.341, 2.52, 2.662, 2.804, + 2.728, 2.583, 2.438, 2.276, 2.113, 1.986, 1.864, 1.746, 1.628, 1.55, 1.487, 1.441, 1.405, 1.383, 1.372, 1.367, 1.367, 1.377, 1.399, 1.431, 1.476, 1.533, 1.615, 1.71, 1.843, 1.976, 2.108, 2.246, 2.427, 2.606, 2.76, 2.915, + 2.781, 2.661, 2.54, 2.378, 2.213, 2.08, 1.952, 1.826, 1.699, 1.613, 1.542, 1.497, 1.465, 1.447, 1.439, 1.436, 1.436, 1.444, 1.461, 1.489, 1.533, 1.594, 1.686, 1.791, 1.93, 2.069, 2.206, 2.349, 2.533, 2.714, 2.845, 2.977, + 2.822, 2.734, 2.646, 2.483, 2.316, 2.176, 2.04, 1.907, 1.774, 1.678, 1.597, 1.553, 1.527, 1.515, 1.511, 1.509, 1.509, 1.514, 1.525, 1.549, 1.591, 1.655, 1.76, 1.875, 2.018, 2.161, 2.305, 2.454, 2.643, 2.827, 2.927, 3.027, + 2.862, 2.807, 2.752, 2.589, 2.418, 2.271, 2.128, 1.988, 1.848, 1.744, 1.652, 1.608, 1.59, 1.582, 1.582, 1.582, 1.582, 1.584, 1.589, 1.608, 1.65, 1.716, 1.833, 1.958, 2.105, 2.253, 2.404, 2.56, 2.754, 2.94, 3.009, 3.078 + ], + "sigma": 0.00428, + "sigma_Cb": 0.00363 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2850, + "ccm": + [ + 1.42601, -0.20537, -0.22063, + -0.47682, 1.81987, -0.34305, + 0.01854, -0.86036, 1.84181 + ] + }, + { + "ct": 2900, + "ccm": + [ + 1.29755, 0.04602, -0.34356, + -0.41491, 1.73477, -0.31987, + -0.01345, -0.97115, 1.98459 + ] + }, + { + "ct": 3550, + "ccm": + [ + 1.49811, -0.33412, -0.16398, + -0.40869, 1.72995, -0.32127, + -0.01924, -0.62181, 1.64105 + ] + }, + { + "ct": 4500, + "ccm": + [ + 1.47015, -0.29229, -0.17786, + -0.36561, 1.88919, -0.52358, + -0.03552, -0.56717, 1.60269 + ] + }, + { + "ct": 5600, + "ccm": + [ + 1.60962, -0.47434, -0.13528, + -0.32701, 1.73797, -0.41096, + -0.07626, -0.40171, 1.47796 + ] + }, + { + "ct": 8000, + "ccm": + [ + 1.54642, -0.20396, -0.34246, + -0.31748, 2.22559, -0.90811, + -0.10035, -0.65877, 1.75912 + ] + } + ] + } + }, + { + "rpi.sharpen": { } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx477.json b/src/ipa/rpi/pisp/data/imx477.json new file mode 100644 index 000000000..2fe04c211 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx477.json @@ -0,0 +1,1186 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 12000, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 740, + "reference_Y": 15051 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.809 + } + }, + { + "rpi.geq": + { + "offset": 204, + "slope": 0.0061 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2850.0, 0.4307, 0.3957, + 2960.0, 0.4159, 0.4313, + 3580.0, 0.3771, 0.5176, + 4559.0, 0.3031, 0.6573, + 5881.0, 0.2809, 0.6942, + 7600.0, 0.2263, 0.7762 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.02634, + "transverse_neg": 0.02255 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.16, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 2.359, 2.354, 2.351, 2.351, 2.343, 2.337, 2.331, 2.325, 2.323, 2.321, 2.317, 2.315, 2.313, 2.313, 2.311, 2.312, 2.312, 2.313, 2.315, 2.315, 2.316, 2.317, 2.319, 2.323, 2.326, 2.329, 2.332, 2.332, 2.335, 2.337, 2.352, 2.363, + 2.352, 2.351, 2.349, 2.346, 2.342, 2.334, 2.328, 2.324, 2.321, 2.317, 2.315, 2.314, 2.312, 2.311, 2.311, 2.311, 2.311, 2.311, 2.312, 2.314, 2.315, 2.316, 2.317, 2.319, 2.324, 2.326, 2.328, 2.329, 2.331, 2.337, 2.348, 2.355, + 2.346, 2.346, 2.345, 2.344, 2.338, 2.329, 2.325, 2.319, 2.316, 2.314, 2.311, 2.309, 2.308, 2.306, 2.304, 2.304, 2.305, 2.307, 2.308, 2.309, 2.311, 2.311, 2.313, 2.316, 2.319, 2.322, 2.325, 2.326, 2.328, 2.335, 2.343, 2.349, + 2.342, 2.342, 2.341, 2.338, 2.332, 2.326, 2.319, 2.316, 2.312, 2.309, 2.308, 2.305, 2.303, 2.302, 2.301, 2.301, 2.302, 2.303, 2.304, 2.305, 2.305, 2.307, 2.311, 2.313, 2.315, 2.319, 2.321, 2.325, 2.328, 2.333, 2.338, 2.348, + 2.337, 2.337, 2.337, 2.336, 2.331, 2.322, 2.317, 2.312, 2.309, 2.307, 2.304, 2.302, 2.299, 2.299, 2.298, 2.298, 2.299, 2.299, 2.301, 2.302, 2.302, 2.304, 2.305, 2.309, 2.314, 2.316, 2.321, 2.324, 2.326, 2.329, 2.335, 2.343, + 2.335, 2.334, 2.333, 2.333, 2.326, 2.318, 2.313, 2.309, 2.306, 2.302, 2.299, 2.297, 2.297, 2.296, 2.295, 2.295, 2.294, 2.295, 2.296, 2.298, 2.298, 2.301, 2.303, 2.305, 2.311, 2.315, 2.319, 2.323, 2.325, 2.329, 2.333, 2.339, + 2.329, 2.331, 2.329, 2.329, 2.325, 2.315, 2.309, 2.306, 2.302, 2.299, 2.297, 2.295, 2.293, 2.292, 2.291, 2.291, 2.291, 2.291, 2.293, 2.294, 2.296, 2.298, 2.301, 2.304, 2.307, 2.313, 2.317, 2.319, 2.323, 2.327, 2.331, 2.339, + 2.329, 2.328, 2.328, 2.328, 2.321, 2.313, 2.307, 2.303, 2.299, 2.295, 2.294, 2.292, 2.289, 2.289, 2.288, 2.288, 2.288, 2.289, 2.289, 2.292, 2.294, 2.295, 2.297, 2.301, 2.306, 2.311, 2.315, 2.318, 2.319, 2.323, 2.329, 2.335, + 2.326, 2.327, 2.325, 2.325, 2.319, 2.311, 2.305, 2.299, 2.296, 2.293, 2.291, 2.289, 2.288, 2.287, 2.285, 2.285, 2.286, 2.288, 2.288, 2.289, 2.291, 2.294, 2.295, 2.298, 2.304, 2.308, 2.313, 2.315, 2.317, 2.319, 2.327, 2.335, + 2.325, 2.325, 2.323, 2.323, 2.317, 2.309, 2.303, 2.298, 2.294, 2.292, 2.289, 2.287, 2.286, 2.285, 2.284, 2.284, 2.284, 2.285, 2.287, 2.289, 2.291, 2.291, 2.294, 2.297, 2.302, 2.305, 2.309, 2.313, 2.315, 2.317, 2.325, 2.334, + 2.322, 2.324, 2.322, 2.322, 2.316, 2.306, 2.301, 2.296, 2.292, 2.289, 2.287, 2.286, 2.285, 2.284, 2.283, 2.283, 2.283, 2.284, 2.286, 2.288, 2.289, 2.291, 2.293, 2.296, 2.301, 2.304, 2.308, 2.311, 2.312, 2.315, 2.323, 2.333, + 2.321, 2.323, 2.322, 2.322, 2.314, 2.306, 2.299, 2.294, 2.291, 2.288, 2.286, 2.285, 2.284, 2.282, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.289, 2.291, 2.291, 2.294, 2.297, 2.302, 2.306, 2.308, 2.311, 2.312, 2.322, 2.332, + 2.319, 2.321, 2.321, 2.321, 2.314, 2.305, 2.297, 2.293, 2.289, 2.287, 2.285, 2.284, 2.283, 2.281, 2.281, 2.281, 2.282, 2.283, 2.283, 2.285, 2.287, 2.289, 2.291, 2.292, 2.297, 2.301, 2.305, 2.307, 2.309, 2.312, 2.321, 2.333, + 2.319, 2.321, 2.319, 2.319, 2.314, 2.303, 2.296, 2.293, 2.289, 2.286, 2.285, 2.283, 2.282, 2.281, 2.281, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.288, 2.289, 2.291, 2.296, 2.301, 2.305, 2.307, 2.308, 2.312, 2.321, 2.332, + 2.319, 2.321, 2.319, 2.319, 2.313, 2.303, 2.296, 2.291, 2.289, 2.286, 2.284, 2.282, 2.281, 2.281, 2.281, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.287, 2.288, 2.291, 2.295, 2.299, 2.304, 2.306, 2.307, 2.311, 2.321, 2.332, + 2.319, 2.321, 2.319, 2.319, 2.313, 2.303, 2.297, 2.292, 2.289, 2.287, 2.285, 2.282, 2.281, 2.281, 2.282, 2.282, 2.282, 2.282, 2.283, 2.284, 2.285, 2.286, 2.288, 2.291, 2.295, 2.299, 2.303, 2.306, 2.307, 2.312, 2.321, 2.331, + 2.318, 2.319, 2.319, 2.319, 2.313, 2.303, 2.297, 2.292, 2.289, 2.286, 2.285, 2.282, 2.281, 2.281, 2.281, 2.282, 2.282, 2.282, 2.282, 2.283, 2.285, 2.286, 2.287, 2.291, 2.294, 2.298, 2.303, 2.306, 2.307, 2.311, 2.321, 2.331, + 2.319, 2.319, 2.319, 2.319, 2.313, 2.302, 2.297, 2.292, 2.289, 2.287, 2.285, 2.283, 2.282, 2.281, 2.281, 2.282, 2.283, 2.283, 2.283, 2.283, 2.285, 2.286, 2.287, 2.289, 2.294, 2.297, 2.303, 2.305, 2.308, 2.313, 2.321, 2.331, + 2.319, 2.319, 2.319, 2.319, 2.313, 2.303, 2.299, 2.293, 2.291, 2.287, 2.285, 2.283, 2.282, 2.281, 2.281, 2.282, 2.283, 2.283, 2.283, 2.283, 2.285, 2.286, 2.288, 2.291, 2.294, 2.298, 2.304, 2.306, 2.308, 2.312, 2.322, 2.331, + 2.319, 2.321, 2.321, 2.321, 2.315, 2.305, 2.301, 2.295, 2.292, 2.289, 2.286, 2.285, 2.283, 2.282, 2.282, 2.282, 2.284, 2.283, 2.284, 2.284, 2.285, 2.287, 2.288, 2.291, 2.294, 2.299, 2.304, 2.306, 2.309, 2.313, 2.322, 2.334, + 2.321, 2.322, 2.322, 2.322, 2.317, 2.307, 2.301, 2.296, 2.292, 2.291, 2.288, 2.286, 2.285, 2.284, 2.283, 2.284, 2.285, 2.284, 2.285, 2.285, 2.287, 2.288, 2.289, 2.293, 2.297, 2.301, 2.305, 2.308, 2.311, 2.314, 2.323, 2.335, + 2.322, 2.324, 2.324, 2.324, 2.319, 2.309, 2.303, 2.297, 2.295, 2.292, 2.291, 2.288, 2.286, 2.286, 2.285, 2.286, 2.286, 2.286, 2.287, 2.288, 2.289, 2.289, 2.291, 2.294, 2.299, 2.302, 2.307, 2.311, 2.312, 2.316, 2.325, 2.335, + 2.324, 2.326, 2.325, 2.326, 2.321, 2.311, 2.305, 2.301, 2.297, 2.295, 2.293, 2.291, 2.289, 2.289, 2.288, 2.288, 2.287, 2.288, 2.289, 2.291, 2.292, 2.292, 2.295, 2.299, 2.301, 2.304, 2.309, 2.312, 2.315, 2.319, 2.327, 2.337, + 2.329, 2.329, 2.328, 2.328, 2.323, 2.315, 2.308, 2.304, 2.301, 2.298, 2.296, 2.294, 2.291, 2.291, 2.289, 2.291, 2.291, 2.291, 2.292, 2.293, 2.294, 2.295, 2.297, 2.299, 2.303, 2.308, 2.312, 2.315, 2.318, 2.321, 2.329, 2.339, + 2.329, 2.331, 2.332, 2.332, 2.326, 2.318, 2.311, 2.306, 2.304, 2.301, 2.299, 2.297, 2.295, 2.293, 2.292, 2.292, 2.292, 2.293, 2.294, 2.294, 2.296, 2.297, 2.299, 2.302, 2.306, 2.311, 2.315, 2.318, 2.319, 2.324, 2.332, 2.342, + 2.331, 2.333, 2.334, 2.334, 2.328, 2.321, 2.313, 2.308, 2.305, 2.303, 2.301, 2.299, 2.297, 2.295, 2.295, 2.295, 2.294, 2.296, 2.296, 2.297, 2.298, 2.299, 2.302, 2.305, 2.308, 2.314, 2.317, 2.321, 2.323, 2.327, 2.334, 2.346, + 2.331, 2.332, 2.334, 2.334, 2.329, 2.321, 2.314, 2.309, 2.306, 2.304, 2.303, 2.301, 2.299, 2.297, 2.295, 2.295, 2.296, 2.297, 2.298, 2.298, 2.299, 2.301, 2.303, 2.306, 2.309, 2.315, 2.319, 2.321, 2.324, 2.328, 2.337, 2.346, + 2.331, 2.332, 2.334, 2.334, 2.329, 2.321, 2.314, 2.311, 2.306, 2.304, 2.303, 2.302, 2.299, 2.297, 2.295, 2.295, 2.296, 2.297, 2.298, 2.298, 2.299, 2.301, 2.303, 2.306, 2.311, 2.314, 2.319, 2.323, 2.325, 2.329, 2.339, 2.348, + 2.329, 2.329, 2.329, 2.331, 2.326, 2.319, 2.312, 2.309, 2.304, 2.303, 2.302, 2.301, 2.298, 2.295, 2.294, 2.294, 2.295, 2.295, 2.296, 2.297, 2.299, 2.301, 2.302, 2.304, 2.308, 2.313, 2.319, 2.322, 2.325, 2.329, 2.339, 2.351, + 2.329, 2.329, 2.329, 2.329, 2.326, 2.317, 2.311, 2.308, 2.303, 2.302, 2.301, 2.298, 2.296, 2.295, 2.294, 2.294, 2.294, 2.294, 2.296, 2.297, 2.298, 2.299, 2.301, 2.304, 2.307, 2.312, 2.318, 2.322, 2.326, 2.331, 2.341, 2.355, + 2.339, 2.332, 2.331, 2.331, 2.327, 2.323, 2.316, 2.309, 2.306, 2.302, 2.301, 2.299, 2.297, 2.296, 2.295, 2.294, 2.294, 2.296, 2.297, 2.297, 2.299, 2.301, 2.303, 2.306, 2.308, 2.317, 2.322, 2.325, 2.329, 2.341, 2.353, 2.361, + 2.347, 2.347, 2.345, 2.343, 2.338, 2.332, 2.326, 2.322, 2.321, 2.318, 2.316, 2.315, 2.313, 2.312, 2.311, 2.311, 2.311, 2.311, 2.312, 2.315, 2.317, 2.318, 2.319, 2.323, 2.324, 2.329, 2.334, 2.337, 2.344, 2.347, 2.361, 2.364 + ] + }, + { + "ct": 5000, + "table": + [ + 3.869, 3.852, 3.844, 3.842, 3.836, 3.821, 3.807, 3.796, 3.789, 3.784, 3.778, 3.775, 3.769, 3.768, 3.765, 3.765, 3.767, 3.769, 3.772, 3.774, 3.773, 3.775, 3.779, 3.787, 3.793, 3.801, 3.806, 3.804, 3.813, 3.819, 3.855, 3.879, + 3.854, 3.844, 3.837, 3.836, 3.824, 3.811, 3.797, 3.789, 3.784, 3.777, 3.774, 3.769, 3.764, 3.758, 3.757, 3.758, 3.758, 3.761, 3.763, 3.764, 3.765, 3.766, 3.772, 3.778, 3.787, 3.792, 3.794, 3.798, 3.802, 3.815, 3.839, 3.873, + 3.838, 3.831, 3.826, 3.823, 3.813, 3.799, 3.787, 3.781, 3.773, 3.768, 3.763, 3.759, 3.753, 3.749, 3.745, 3.745, 3.745, 3.752, 3.754, 3.757, 3.757, 3.759, 3.763, 3.769, 3.773, 3.781, 3.786, 3.792, 3.798, 3.811, 3.831, 3.861, + 3.833, 3.822, 3.817, 3.816, 3.804, 3.788, 3.779, 3.772, 3.766, 3.759, 3.755, 3.749, 3.744, 3.741, 3.738, 3.739, 3.739, 3.741, 3.743, 3.747, 3.749, 3.751, 3.756, 3.764, 3.769, 3.776, 3.783, 3.789, 3.798, 3.809, 3.821, 3.855, + 3.824, 3.818, 3.808, 3.808, 3.797, 3.781, 3.772, 3.764, 3.757, 3.752, 3.747, 3.743, 3.737, 3.735, 3.733, 3.733, 3.733, 3.735, 3.737, 3.738, 3.741, 3.746, 3.749, 3.755, 3.766, 3.771, 3.781, 3.789, 3.794, 3.806, 3.818, 3.849, + 3.815, 3.808, 3.799, 3.801, 3.787, 3.775, 3.767, 3.757, 3.751, 3.745, 3.738, 3.734, 3.732, 3.727, 3.725, 3.723, 3.722, 3.722, 3.726, 3.729, 3.734, 3.738, 3.744, 3.749, 3.759, 3.769, 3.781, 3.788, 3.792, 3.799, 3.811, 3.841, + 3.804, 3.799, 3.793, 3.793, 3.783, 3.771, 3.759, 3.751, 3.744, 3.735, 3.732, 3.727, 3.723, 3.721, 3.719, 3.716, 3.716, 3.716, 3.718, 3.722, 3.727, 3.731, 3.737, 3.746, 3.756, 3.767, 3.776, 3.782, 3.788, 3.795, 3.808, 3.831, + 3.802, 3.797, 3.787, 3.787, 3.779, 3.762, 3.753, 3.744, 3.734, 3.727, 3.725, 3.721, 3.716, 3.714, 3.709, 3.709, 3.711, 3.711, 3.712, 3.717, 3.722, 3.725, 3.731, 3.739, 3.752, 3.762, 3.772, 3.778, 3.779, 3.789, 3.798, 3.826, + 3.791, 3.789, 3.784, 3.784, 3.775, 3.759, 3.746, 3.735, 3.729, 3.724, 3.718, 3.714, 3.712, 3.707, 3.704, 3.704, 3.706, 3.708, 3.709, 3.711, 3.716, 3.722, 3.726, 3.735, 3.746, 3.754, 3.767, 3.774, 3.777, 3.781, 3.794, 3.824, + 3.789, 3.784, 3.779, 3.781, 3.771, 3.753, 3.741, 3.732, 3.725, 3.719, 3.715, 3.711, 3.707, 3.704, 3.701, 3.701, 3.702, 3.704, 3.708, 3.709, 3.713, 3.718, 3.724, 3.731, 3.742, 3.749, 3.761, 3.768, 3.772, 3.778, 3.791, 3.822, + 3.789, 3.781, 3.777, 3.777, 3.764, 3.749, 3.739, 3.729, 3.722, 3.718, 3.711, 3.708, 3.705, 3.701, 3.699, 3.699, 3.699, 3.701, 3.705, 3.707, 3.711, 3.715, 3.721, 3.727, 3.738, 3.746, 3.757, 3.763, 3.765, 3.773, 3.788, 3.821, + 3.785, 3.779, 3.774, 3.774, 3.764, 3.747, 3.736, 3.726, 3.719, 3.711, 3.709, 3.706, 3.701, 3.698, 3.696, 3.695, 3.695, 3.698, 3.702, 3.704, 3.707, 3.712, 3.718, 3.725, 3.734, 3.741, 3.753, 3.756, 3.759, 3.764, 3.784, 3.818, + 3.779, 3.776, 3.773, 3.773, 3.759, 3.744, 3.733, 3.724, 3.714, 3.709, 3.706, 3.704, 3.699, 3.696, 3.694, 3.694, 3.694, 3.697, 3.701, 3.703, 3.706, 3.709, 3.714, 3.721, 3.731, 3.737, 3.749, 3.753, 3.758, 3.762, 3.783, 3.819, + 3.779, 3.776, 3.769, 3.769, 3.757, 3.741, 3.729, 3.721, 3.712, 3.708, 3.705, 3.701, 3.697, 3.695, 3.694, 3.694, 3.695, 3.696, 3.698, 3.702, 3.705, 3.709, 3.712, 3.717, 3.728, 3.736, 3.749, 3.752, 3.756, 3.761, 3.781, 3.815, + 3.779, 3.773, 3.768, 3.768, 3.756, 3.738, 3.731, 3.719, 3.711, 3.707, 3.703, 3.698, 3.695, 3.694, 3.694, 3.695, 3.695, 3.695, 3.696, 3.702, 3.705, 3.708, 3.712, 3.717, 3.728, 3.736, 3.747, 3.751, 3.754, 3.761, 3.781, 3.815, + 3.782, 3.773, 3.767, 3.767, 3.755, 3.738, 3.728, 3.721, 3.711, 3.707, 3.701, 3.698, 3.695, 3.693, 3.694, 3.696, 3.695, 3.695, 3.695, 3.701, 3.703, 3.706, 3.711, 3.715, 3.726, 3.735, 3.745, 3.751, 3.754, 3.763, 3.779, 3.815, + 3.781, 3.771, 3.767, 3.767, 3.754, 3.739, 3.726, 3.721, 3.712, 3.706, 3.701, 3.698, 3.695, 3.693, 3.693, 3.695, 3.695, 3.695, 3.696, 3.698, 3.703, 3.705, 3.709, 3.715, 3.725, 3.734, 3.745, 3.751, 3.755, 3.762, 3.783, 3.818, + 3.781, 3.774, 3.767, 3.767, 3.755, 3.741, 3.729, 3.722, 3.712, 3.708, 3.701, 3.699, 3.695, 3.693, 3.693, 3.694, 3.695, 3.695, 3.697, 3.698, 3.702, 3.704, 3.709, 3.713, 3.725, 3.732, 3.746, 3.751, 3.756, 3.763, 3.783, 3.821, + 3.781, 3.774, 3.769, 3.769, 3.756, 3.741, 3.731, 3.724, 3.713, 3.711, 3.707, 3.699, 3.697, 3.694, 3.693, 3.694, 3.695, 3.695, 3.697, 3.698, 3.702, 3.704, 3.709, 3.713, 3.724, 3.734, 3.747, 3.751, 3.756, 3.765, 3.784, 3.821, + 3.784, 3.776, 3.773, 3.773, 3.759, 3.742, 3.733, 3.726, 3.719, 3.711, 3.709, 3.703, 3.698, 3.695, 3.694, 3.695, 3.697, 3.696, 3.698, 3.699, 3.703, 3.706, 3.711, 3.714, 3.727, 3.735, 3.746, 3.751, 3.757, 3.766, 3.787, 3.822, + 3.786, 3.783, 3.774, 3.774, 3.766, 3.747, 3.737, 3.727, 3.722, 3.716, 3.711, 3.706, 3.702, 3.698, 3.697, 3.698, 3.699, 3.699, 3.701, 3.703, 3.706, 3.711, 3.713, 3.719, 3.731, 3.739, 3.748, 3.753, 3.761, 3.769, 3.789, 3.826, + 3.786, 3.784, 3.779, 3.779, 3.769, 3.751, 3.742, 3.732, 3.725, 3.719, 3.715, 3.711, 3.706, 3.704, 3.701, 3.701, 3.702, 3.702, 3.705, 3.707, 3.712, 3.714, 3.717, 3.724, 3.733, 3.743, 3.749, 3.758, 3.764, 3.769, 3.791, 3.826, + 3.793, 3.787, 3.782, 3.782, 3.774, 3.756, 3.747, 3.737, 3.729, 3.725, 3.719, 3.715, 3.712, 3.708, 3.707, 3.706, 3.707, 3.708, 3.709, 3.713, 3.714, 3.717, 3.723, 3.729, 3.736, 3.747, 3.757, 3.764, 3.768, 3.774, 3.794, 3.829, + 3.794, 3.791, 3.786, 3.786, 3.779, 3.762, 3.751, 3.742, 3.735, 3.729, 3.725, 3.719, 3.716, 3.711, 3.709, 3.709, 3.709, 3.711, 3.716, 3.717, 3.721, 3.723, 3.726, 3.732, 3.741, 3.752, 3.761, 3.767, 3.773, 3.779, 3.801, 3.829, + 3.802, 3.798, 3.793, 3.793, 3.779, 3.766, 3.754, 3.746, 3.741, 3.736, 3.731, 3.726, 3.719, 3.717, 3.716, 3.715, 3.716, 3.717, 3.719, 3.721, 3.724, 3.726, 3.731, 3.737, 3.744, 3.756, 3.766, 3.772, 3.776, 3.784, 3.807, 3.839, + 3.805, 3.799, 3.795, 3.795, 3.784, 3.767, 3.757, 3.749, 3.744, 3.739, 3.736, 3.731, 3.726, 3.722, 3.719, 3.719, 3.719, 3.721, 3.723, 3.725, 3.727, 3.732, 3.738, 3.742, 3.751, 3.761, 3.771, 3.775, 3.782, 3.789, 3.811, 3.841, + 3.804, 3.801, 3.799, 3.799, 3.787, 3.772, 3.761, 3.752, 3.746, 3.742, 3.739, 3.735, 3.729, 3.726, 3.723, 3.724, 3.725, 3.726, 3.727, 3.728, 3.732, 3.736, 3.739, 3.745, 3.754, 3.765, 3.775, 3.779, 3.785, 3.795, 3.816, 3.844, + 3.801, 3.799, 3.796, 3.796, 3.787, 3.773, 3.761, 3.753, 3.746, 3.743, 3.739, 3.735, 3.731, 3.726, 3.725, 3.725, 3.725, 3.726, 3.727, 3.729, 3.733, 3.736, 3.741, 3.745, 3.755, 3.766, 3.776, 3.783, 3.786, 3.797, 3.819, 3.851, + 3.799, 3.795, 3.788, 3.788, 3.783, 3.772, 3.759, 3.749, 3.744, 3.738, 3.735, 3.733, 3.726, 3.724, 3.722, 3.722, 3.723, 3.724, 3.725, 3.727, 3.729, 3.733, 3.736, 3.742, 3.754, 3.762, 3.772, 3.779, 3.784, 3.796, 3.821, 3.859, + 3.799, 3.789, 3.787, 3.788, 3.779, 3.766, 3.755, 3.749, 3.742, 3.736, 3.733, 3.727, 3.723, 3.722, 3.721, 3.719, 3.719, 3.721, 3.725, 3.726, 3.728, 3.732, 3.734, 3.741, 3.747, 3.758, 3.771, 3.778, 3.785, 3.796, 3.825, 3.862, + 3.824, 3.799, 3.789, 3.789, 3.788, 3.777, 3.761, 3.751, 3.743, 3.739, 3.736, 3.728, 3.726, 3.725, 3.721, 3.719, 3.721, 3.723, 3.727, 3.728, 3.729, 3.733, 3.737, 3.744, 3.755, 3.769, 3.776, 3.784, 3.793, 3.819, 3.863, 3.877, + 3.833, 3.833, 3.833, 3.842, 3.825, 3.815, 3.807, 3.799, 3.792, 3.788, 3.785, 3.782, 3.778, 3.777, 3.773, 3.772, 3.772, 3.774, 3.778, 3.779, 3.779, 3.785, 3.792, 3.798, 3.803, 3.811, 3.822, 3.834, 3.843, 3.846, 3.877, 3.886 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 2.616, 2.616, 2.618, 2.621, 2.619, 2.618, 2.615, 2.615, 2.613, 2.611, 2.609, 2.609, 2.609, 2.611, 2.611, 2.611, 2.611, 2.609, 2.608, 2.608, 2.611, 2.613, 2.613, 2.614, 2.614, 2.615, 2.615, 2.622, 2.624, 2.621, 2.624, 2.641, + 2.616, 2.618, 2.621, 2.623, 2.623, 2.619, 2.618, 2.616, 2.616, 2.613, 2.611, 2.611, 2.611, 2.611, 2.612, 2.612, 2.611, 2.611, 2.611, 2.611, 2.611, 2.612, 2.613, 2.612, 2.613, 2.615, 2.617, 2.621, 2.621, 2.619, 2.621, 2.641, + 2.621, 2.624, 2.627, 2.627, 2.625, 2.623, 2.621, 2.619, 2.618, 2.618, 2.618, 2.617, 2.616, 2.616, 2.615, 2.613, 2.612, 2.613, 2.613, 2.614, 2.614, 2.613, 2.614, 2.613, 2.614, 2.617, 2.619, 2.621, 2.621, 2.619, 2.623, 2.643, + 2.626, 2.627, 2.628, 2.629, 2.628, 2.625, 2.622, 2.621, 2.621, 2.622, 2.621, 2.619, 2.619, 2.618, 2.617, 2.616, 2.616, 2.616, 2.618, 2.618, 2.617, 2.617, 2.618, 2.619, 2.621, 2.623, 2.624, 2.626, 2.625, 2.624, 2.625, 2.654, + 2.627, 2.628, 2.628, 2.628, 2.626, 2.623, 2.622, 2.622, 2.622, 2.622, 2.621, 2.621, 2.619, 2.617, 2.617, 2.616, 2.617, 2.617, 2.618, 2.619, 2.618, 2.618, 2.618, 2.621, 2.622, 2.624, 2.626, 2.627, 2.627, 2.626, 2.628, 2.655, + 2.625, 2.626, 2.627, 2.626, 2.625, 2.623, 2.622, 2.621, 2.622, 2.621, 2.621, 2.619, 2.617, 2.616, 2.615, 2.616, 2.616, 2.616, 2.616, 2.616, 2.617, 2.618, 2.619, 2.621, 2.622, 2.624, 2.626, 2.628, 2.628, 2.629, 2.629, 2.655, + 2.626, 2.625, 2.626, 2.625, 2.625, 2.623, 2.622, 2.622, 2.622, 2.621, 2.619, 2.617, 2.616, 2.614, 2.613, 2.614, 2.614, 2.614, 2.614, 2.614, 2.616, 2.618, 2.619, 2.621, 2.623, 2.624, 2.627, 2.629, 2.631, 2.629, 2.631, 2.651, + 2.625, 2.625, 2.625, 2.624, 2.623, 2.623, 2.622, 2.622, 2.622, 2.621, 2.619, 2.617, 2.614, 2.613, 2.612, 2.611, 2.611, 2.612, 2.612, 2.613, 2.616, 2.618, 2.619, 2.622, 2.624, 2.626, 2.628, 2.631, 2.631, 2.631, 2.631, 2.651, + 2.625, 2.625, 2.624, 2.623, 2.622, 2.622, 2.622, 2.622, 2.622, 2.621, 2.617, 2.615, 2.613, 2.612, 2.611, 2.611, 2.611, 2.611, 2.611, 2.613, 2.615, 2.618, 2.619, 2.622, 2.625, 2.627, 2.631, 2.632, 2.631, 2.629, 2.631, 2.651, + 2.624, 2.624, 2.622, 2.622, 2.621, 2.621, 2.621, 2.621, 2.621, 2.618, 2.616, 2.614, 2.612, 2.611, 2.609, 2.609, 2.608, 2.609, 2.611, 2.611, 2.615, 2.617, 2.619, 2.621, 2.625, 2.628, 2.631, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.622, 2.623, 2.622, 2.622, 2.621, 2.619, 2.619, 2.619, 2.618, 2.616, 2.614, 2.613, 2.611, 2.609, 2.608, 2.606, 2.607, 2.607, 2.609, 2.611, 2.615, 2.617, 2.619, 2.622, 2.626, 2.629, 2.632, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.621, 2.622, 2.622, 2.622, 2.621, 2.619, 2.619, 2.618, 2.617, 2.614, 2.613, 2.611, 2.611, 2.607, 2.606, 2.605, 2.604, 2.605, 2.607, 2.609, 2.613, 2.616, 2.619, 2.622, 2.627, 2.631, 2.632, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.619, 2.621, 2.623, 2.623, 2.621, 2.621, 2.619, 2.617, 2.616, 2.615, 2.613, 2.609, 2.607, 2.604, 2.602, 2.601, 2.602, 2.603, 2.605, 2.609, 2.612, 2.616, 2.619, 2.624, 2.628, 2.631, 2.632, 2.633, 2.629, 2.627, 2.627, 2.651, + 2.619, 2.621, 2.623, 2.623, 2.622, 2.621, 2.618, 2.617, 2.615, 2.614, 2.612, 2.608, 2.603, 2.601, 2.598, 2.597, 2.599, 2.602, 2.605, 2.608, 2.611, 2.615, 2.622, 2.625, 2.629, 2.631, 2.631, 2.633, 2.631, 2.627, 2.627, 2.651, + 2.621, 2.622, 2.623, 2.623, 2.622, 2.621, 2.618, 2.617, 2.616, 2.614, 2.611, 2.606, 2.601, 2.598, 2.595, 2.595, 2.597, 2.601, 2.604, 2.608, 2.612, 2.615, 2.623, 2.627, 2.629, 2.631, 2.631, 2.632, 2.631, 2.628, 2.628, 2.651, + 2.622, 2.623, 2.624, 2.624, 2.622, 2.621, 2.619, 2.617, 2.615, 2.613, 2.609, 2.606, 2.601, 2.596, 2.594, 2.594, 2.596, 2.599, 2.603, 2.609, 2.613, 2.617, 2.623, 2.627, 2.629, 2.631, 2.632, 2.632, 2.631, 2.629, 2.631, 2.651, + 2.623, 2.625, 2.625, 2.624, 2.621, 2.621, 2.619, 2.617, 2.616, 2.613, 2.608, 2.605, 2.601, 2.595, 2.593, 2.593, 2.595, 2.598, 2.604, 2.609, 2.615, 2.619, 2.625, 2.627, 2.629, 2.629, 2.632, 2.633, 2.632, 2.629, 2.631, 2.651, + 2.624, 2.626, 2.626, 2.623, 2.621, 2.619, 2.618, 2.617, 2.615, 2.612, 2.608, 2.605, 2.601, 2.597, 2.595, 2.595, 2.596, 2.598, 2.605, 2.609, 2.616, 2.621, 2.626, 2.627, 2.629, 2.631, 2.633, 2.633, 2.633, 2.631, 2.631, 2.655, + 2.624, 2.625, 2.625, 2.623, 2.621, 2.619, 2.618, 2.617, 2.614, 2.612, 2.609, 2.606, 2.602, 2.599, 2.598, 2.597, 2.598, 2.602, 2.607, 2.612, 2.619, 2.621, 2.626, 2.628, 2.629, 2.632, 2.633, 2.634, 2.633, 2.631, 2.631, 2.655, + 2.624, 2.625, 2.625, 2.623, 2.621, 2.621, 2.618, 2.617, 2.614, 2.612, 2.611, 2.608, 2.604, 2.602, 2.599, 2.599, 2.603, 2.606, 2.611, 2.616, 2.621, 2.624, 2.626, 2.629, 2.631, 2.632, 2.633, 2.634, 2.634, 2.633, 2.633, 2.656, + 2.623, 2.624, 2.625, 2.623, 2.622, 2.621, 2.619, 2.617, 2.615, 2.613, 2.611, 2.611, 2.607, 2.604, 2.604, 2.604, 2.606, 2.609, 2.613, 2.619, 2.622, 2.625, 2.628, 2.631, 2.632, 2.633, 2.633, 2.636, 2.636, 2.634, 2.634, 2.658, + 2.623, 2.624, 2.625, 2.623, 2.622, 2.619, 2.618, 2.616, 2.614, 2.613, 2.612, 2.611, 2.609, 2.608, 2.607, 2.608, 2.609, 2.613, 2.617, 2.621, 2.623, 2.626, 2.629, 2.631, 2.632, 2.633, 2.634, 2.635, 2.636, 2.636, 2.636, 2.661, + 2.623, 2.624, 2.625, 2.625, 2.623, 2.621, 2.619, 2.616, 2.615, 2.614, 2.613, 2.612, 2.612, 2.611, 2.611, 2.611, 2.614, 2.615, 2.619, 2.622, 2.625, 2.627, 2.631, 2.632, 2.633, 2.635, 2.635, 2.637, 2.637, 2.636, 2.637, 2.661, + 2.623, 2.624, 2.625, 2.626, 2.624, 2.621, 2.619, 2.617, 2.616, 2.615, 2.615, 2.614, 2.614, 2.614, 2.614, 2.614, 2.616, 2.619, 2.621, 2.623, 2.626, 2.628, 2.631, 2.632, 2.634, 2.635, 2.636, 2.637, 2.638, 2.637, 2.638, 2.661, + 2.625, 2.626, 2.627, 2.627, 2.626, 2.623, 2.619, 2.619, 2.618, 2.618, 2.618, 2.617, 2.617, 2.616, 2.616, 2.616, 2.619, 2.622, 2.623, 2.625, 2.628, 2.628, 2.631, 2.632, 2.634, 2.636, 2.638, 2.639, 2.639, 2.638, 2.638, 2.661, + 2.625, 2.626, 2.627, 2.628, 2.626, 2.623, 2.621, 2.619, 2.619, 2.619, 2.619, 2.619, 2.619, 2.618, 2.618, 2.619, 2.623, 2.624, 2.625, 2.627, 2.629, 2.629, 2.632, 2.633, 2.635, 2.638, 2.639, 2.639, 2.639, 2.636, 2.636, 2.662, + 2.625, 2.627, 2.628, 2.628, 2.626, 2.624, 2.623, 2.622, 2.621, 2.621, 2.621, 2.621, 2.621, 2.621, 2.621, 2.624, 2.624, 2.625, 2.627, 2.628, 2.631, 2.631, 2.632, 2.634, 2.636, 2.639, 2.639, 2.641, 2.639, 2.635, 2.635, 2.663, + 2.625, 2.626, 2.628, 2.628, 2.627, 2.625, 2.624, 2.623, 2.623, 2.622, 2.623, 2.624, 2.624, 2.625, 2.625, 2.625, 2.625, 2.626, 2.627, 2.629, 2.631, 2.632, 2.633, 2.635, 2.638, 2.641, 2.642, 2.643, 2.642, 2.636, 2.636, 2.665, + 2.624, 2.626, 2.628, 2.628, 2.628, 2.626, 2.624, 2.624, 2.623, 2.623, 2.623, 2.625, 2.627, 2.627, 2.626, 2.626, 2.626, 2.627, 2.628, 2.629, 2.632, 2.633, 2.635, 2.637, 2.639, 2.642, 2.644, 2.644, 2.642, 2.638, 2.638, 2.665, + 2.623, 2.625, 2.626, 2.627, 2.626, 2.626, 2.624, 2.623, 2.623, 2.623, 2.623, 2.623, 2.626, 2.627, 2.626, 2.626, 2.626, 2.626, 2.628, 2.628, 2.629, 2.631, 2.634, 2.636, 2.639, 2.642, 2.644, 2.643, 2.641, 2.637, 2.638, 2.659, + 2.623, 2.627, 2.627, 2.627, 2.627, 2.628, 2.627, 2.624, 2.624, 2.623, 2.624, 2.624, 2.628, 2.628, 2.627, 2.628, 2.628, 2.628, 2.629, 2.629, 2.631, 2.635, 2.637, 2.639, 2.641, 2.643, 2.646, 2.645, 2.643, 2.641, 2.654, 2.659, + 2.642, 2.641, 2.643, 2.645, 2.645, 2.644, 2.644, 2.643, 2.643, 2.642, 2.642, 2.642, 2.643, 2.644, 2.644, 2.644, 2.646, 2.646, 2.647, 2.649, 2.651, 2.652, 2.654, 2.656, 2.658, 2.661, 2.661, 2.661, 2.659, 2.654, 2.659, 2.659 + ] + }, + { + "ct": 5000, + "table": + [ + 1.391, 1.394, 1.395, 1.396, 1.398, 1.398, 1.398, 1.398, 1.398, 1.399, 1.399, 1.398, 1.398, 1.399, 1.399, 1.399, 1.399, 1.398, 1.398, 1.398, 1.399, 1.399, 1.398, 1.397, 1.397, 1.398, 1.399, 1.401, 1.399, 1.397, 1.399, 1.402, + 1.393, 1.395, 1.396, 1.398, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.401, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.398, 1.398, 1.399, 1.401, 1.401, 1.399, 1.398, 1.399, 1.402, + 1.398, 1.401, 1.401, 1.401, 1.401, 1.401, 1.402, 1.402, 1.402, 1.402, 1.403, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.402, 1.401, 1.401, 1.401, 1.401, 1.401, 1.399, 1.399, 1.401, 1.401, 1.401, 1.401, 1.399, 1.401, 1.406, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.405, 1.405, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.402, 1.403, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.403, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.402, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.405, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.405, 1.404, 1.404, 1.404, 1.404, 1.405, 1.404, 1.405, 1.405, 1.405, 1.406, 1.406, 1.404, 1.405, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.406, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.406, 1.407, 1.407, 1.406, 1.405, 1.405, 1.412, + 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.407, 1.407, 1.408, 1.408, 1.407, 1.405, 1.405, 1.412, + 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.405, 1.405, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.407, 1.405, 1.405, 1.413, + 1.402, 1.402, 1.402, 1.402, 1.402, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.403, 1.403, 1.402, 1.402, 1.402, 1.403, 1.403, 1.404, 1.405, 1.406, 1.406, 1.407, 1.408, 1.409, 1.409, 1.408, 1.407, 1.405, 1.405, 1.414, + 1.402, 1.402, 1.402, 1.402, 1.403, 1.403, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.403, 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.403, 1.404, 1.405, 1.406, 1.407, 1.409, 1.409, 1.409, 1.409, 1.407, 1.405, 1.405, 1.413, + 1.402, 1.402, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.401, 1.401, 1.399, 1.399, 1.401, 1.402, 1.403, 1.404, 1.405, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.408, 1.405, 1.405, 1.413, + 1.402, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.402, 1.401, 1.399, 1.398, 1.398, 1.399, 1.399, 1.401, 1.403, 1.404, 1.405, 1.407, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.401, 1.398, 1.397, 1.397, 1.398, 1.399, 1.401, 1.403, 1.404, 1.405, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.399, 1.397, 1.396, 1.396, 1.397, 1.399, 1.401, 1.403, 1.404, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.399, 1.397, 1.396, 1.396, 1.397, 1.398, 1.401, 1.403, 1.406, 1.407, 1.409, 1.409, 1.411, 1.409, 1.409, 1.409, 1.408, 1.407, 1.407, 1.413, + 1.403, 1.404, 1.404, 1.403, 1.403, 1.404, 1.404, 1.405, 1.404, 1.404, 1.403, 1.402, 1.399, 1.398, 1.397, 1.397, 1.398, 1.399, 1.402, 1.404, 1.406, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.407, 1.407, 1.414, + 1.403, 1.403, 1.404, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.403, 1.403, 1.402, 1.401, 1.399, 1.398, 1.398, 1.398, 1.401, 1.403, 1.404, 1.408, 1.408, 1.409, 1.409, 1.409, 1.411, 1.411, 1.409, 1.408, 1.407, 1.407, 1.415, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.403, 1.403, 1.403, 1.401, 1.401, 1.399, 1.399, 1.401, 1.402, 1.404, 1.407, 1.408, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.407, 1.407, 1.415, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.403, 1.403, 1.403, 1.402, 1.401, 1.401, 1.401, 1.402, 1.404, 1.406, 1.407, 1.408, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.409, 1.409, 1.408, 1.408, 1.415, + 1.402, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.406, 1.408, 1.408, 1.409, 1.411, 1.411, 1.411, 1.411, 1.409, 1.409, 1.409, 1.408, 1.408, 1.416, + 1.403, 1.402, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.403, 1.404, 1.404, 1.404, 1.405, 1.406, 1.407, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.416, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.406, 1.407, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.406, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.404, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.407, 1.407, 1.416, + 1.402, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.406, 1.407, 1.407, 1.407, 1.408, 1.409, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.409, 1.407, 1.407, 1.417, + 1.402, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.409, 1.411, 1.411, 1.411, 1.412, 1.411, 1.409, 1.407, 1.407, 1.415, + 1.402, 1.402, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.407, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.412, 1.411, 1.409, 1.407, 1.407, 1.413, + 1.402, 1.402, 1.403, 1.403, 1.405, 1.406, 1.406, 1.406, 1.406, 1.406, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.412, 1.412, 1.413, 1.413, 1.411, 1.408, 1.411, 1.413, + 1.406, 1.406, 1.408, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.411, 1.411, 1.414, 1.414, 1.414, 1.414, 1.415, 1.415, 1.415, 1.415, 1.416, 1.416, 1.416, 1.417, 1.418, 1.418, 1.417, 1.417, 1.414, 1.411, 1.413, 1.413 + ] + } + ], + "luminance_lut": + [ + 1.554, 1.522, 1.466, 1.422, 1.385, 1.351, 1.322, 1.294, 1.269, 1.246, 1.228, 1.214, 1.207, 1.202, 1.199, 1.199, 1.199, 1.199, 1.202, 1.207, 1.218, 1.235, 1.255, 1.279, 1.305, 1.333, 1.365, 1.402, 1.447, 1.508, 1.602, 1.638, + 1.522, 1.478, 1.431, 1.391, 1.355, 1.323, 1.298, 1.271, 1.247, 1.228, 1.212, 1.199, 1.187, 1.179, 1.173, 1.172, 1.172, 1.174, 1.179, 1.189, 1.201, 1.216, 1.235, 1.256, 1.282, 1.308, 1.335, 1.368, 1.411, 1.461, 1.535, 1.602, + 1.479, 1.449, 1.407, 1.367, 1.332, 1.301, 1.271, 1.247, 1.226, 1.208, 1.191, 1.178, 1.166, 1.158, 1.153, 1.151, 1.151, 1.153, 1.159, 1.168, 1.179, 1.194, 1.212, 1.234, 1.256, 1.282, 1.311, 1.343, 1.382, 1.427, 1.489, 1.535, + 1.454, 1.423, 1.383, 1.345, 1.309, 1.278, 1.249, 1.226, 1.206, 1.187, 1.171, 1.158, 1.146, 1.138, 1.132, 1.129, 1.129, 1.133, 1.139, 1.147, 1.159, 1.173, 1.191, 1.212, 1.234, 1.261, 1.288, 1.321, 1.357, 1.401, 1.455, 1.489, + 1.433, 1.401, 1.362, 1.325, 1.289, 1.258, 1.231, 1.206, 1.187, 1.169, 1.153, 1.138, 1.129, 1.121, 1.115, 1.112, 1.112, 1.114, 1.121, 1.129, 1.141, 1.155, 1.172, 1.191, 1.214, 1.241, 1.269, 1.301, 1.337, 1.377, 1.428, 1.457, + 1.415, 1.382, 1.343, 1.306, 1.273, 1.241, 1.213, 1.189, 1.169, 1.153, 1.137, 1.123, 1.112, 1.105, 1.097, 1.095, 1.095, 1.098, 1.103, 1.112, 1.124, 1.139, 1.155, 1.173, 1.197, 1.222, 1.252, 1.282, 1.317, 1.356, 1.405, 1.434, + 1.398, 1.363, 1.325, 1.289, 1.256, 1.224, 1.198, 1.175, 1.155, 1.137, 1.123, 1.108, 1.097, 1.089, 1.083, 1.079, 1.079, 1.083, 1.088, 1.097, 1.109, 1.124, 1.139, 1.158, 1.181, 1.206, 1.234, 1.266, 1.299, 1.339, 1.384, 1.415, + 1.382, 1.347, 1.309, 1.274, 1.242, 1.211, 1.185, 1.162, 1.142, 1.124, 1.108, 1.095, 1.083, 1.075, 1.069, 1.066, 1.066, 1.068, 1.074, 1.083, 1.096, 1.109, 1.125, 1.145, 1.166, 1.191, 1.219, 1.251, 1.285, 1.324, 1.367, 1.399, + 1.369, 1.334, 1.296, 1.261, 1.228, 1.199, 1.173, 1.151, 1.131, 1.112, 1.095, 1.083, 1.071, 1.062, 1.056, 1.053, 1.053, 1.055, 1.061, 1.069, 1.083, 1.096, 1.112, 1.132, 1.153, 1.178, 1.206, 1.237, 1.271, 1.309, 1.353, 1.385, + 1.359, 1.321, 1.284, 1.251, 1.217, 1.189, 1.164, 1.141, 1.121, 1.102, 1.086, 1.071, 1.061, 1.049, 1.045, 1.042, 1.042, 1.043, 1.051, 1.061, 1.069, 1.085, 1.101, 1.121, 1.143, 1.167, 1.195, 1.225, 1.259, 1.298, 1.341, 1.375, + 1.351, 1.312, 1.275, 1.241, 1.209, 1.181, 1.155, 1.133, 1.112, 1.092, 1.076, 1.061, 1.049, 1.041, 1.034, 1.032, 1.032, 1.035, 1.041, 1.051, 1.061, 1.075, 1.092, 1.112, 1.133, 1.158, 1.185, 1.216, 1.249, 1.288, 1.331, 1.364, + 1.344, 1.303, 1.267, 1.233, 1.201, 1.173, 1.147, 1.124, 1.104, 1.085, 1.067, 1.053, 1.041, 1.033, 1.024, 1.022, 1.022, 1.025, 1.034, 1.041, 1.053, 1.066, 1.083, 1.103, 1.126, 1.149, 1.177, 1.207, 1.241, 1.279, 1.321, 1.357, + 1.339, 1.297, 1.261, 1.226, 1.194, 1.166, 1.142, 1.119, 1.098, 1.078, 1.061, 1.046, 1.034, 1.024, 1.017, 1.014, 1.014, 1.017, 1.025, 1.034, 1.046, 1.059, 1.077, 1.096, 1.118, 1.143, 1.169, 1.201, 1.235, 1.273, 1.314, 1.352, + 1.337, 1.293, 1.256, 1.223, 1.191, 1.163, 1.136, 1.114, 1.093, 1.074, 1.056, 1.041, 1.027, 1.017, 1.012, 1.006, 1.006, 1.013, 1.017, 1.028, 1.041, 1.055, 1.072, 1.092, 1.114, 1.138, 1.165, 1.195, 1.229, 1.268, 1.309, 1.348, + 1.337, 1.291, 1.253, 1.219, 1.187, 1.159, 1.133, 1.109, 1.089, 1.071, 1.053, 1.037, 1.023, 1.012, 1.006, 1.002, 1.003, 1.006, 1.013, 1.023, 1.038, 1.052, 1.069, 1.089, 1.111, 1.135, 1.161, 1.192, 1.226, 1.264, 1.306, 1.348, + 1.337, 1.291, 1.253, 1.218, 1.186, 1.157, 1.132, 1.109, 1.088, 1.068, 1.049, 1.035, 1.021, 1.009, 1.001, 1.001, 1.001, 1.003, 1.011, 1.021, 1.035, 1.051, 1.069, 1.087, 1.109, 1.133, 1.161, 1.189, 1.224, 1.262, 1.304, 1.347, + 1.341, 1.292, 1.253, 1.218, 1.186, 1.157, 1.132, 1.109, 1.088, 1.068, 1.049, 1.034, 1.021, 1.009, 1.001, 1.001, 1.001, 1.003, 1.011, 1.021, 1.035, 1.051, 1.069, 1.087, 1.109, 1.133, 1.161, 1.189, 1.224, 1.262, 1.304, 1.347, + 1.348, 1.298, 1.255, 1.219, 1.188, 1.159, 1.134, 1.111, 1.088, 1.069, 1.051, 1.035, 1.021, 1.009, 1.003, 1.001, 1.002, 1.004, 1.011, 1.022, 1.036, 1.053, 1.071, 1.089, 1.111, 1.135, 1.162, 1.191, 1.226, 1.264, 1.306, 1.347, + 1.354, 1.306, 1.258, 1.222, 1.191, 1.162, 1.135, 1.113, 1.092, 1.073, 1.054, 1.038, 1.024, 1.014, 1.008, 1.003, 1.004, 1.008, 1.014, 1.026, 1.039, 1.056, 1.073, 1.093, 1.115, 1.139, 1.165, 1.195, 1.229, 1.267, 1.309, 1.349, + 1.358, 1.312, 1.263, 1.227, 1.195, 1.167, 1.141, 1.117, 1.097, 1.078, 1.061, 1.043, 1.029, 1.021, 1.014, 1.008, 1.008, 1.014, 1.021, 1.032, 1.045, 1.061, 1.078, 1.097, 1.119, 1.144, 1.169, 1.201, 1.234, 1.272, 1.315, 1.353, + 1.364, 1.319, 1.269, 1.234, 1.201, 1.174, 1.148, 1.124, 1.103, 1.084, 1.067, 1.052, 1.038, 1.029, 1.021, 1.016, 1.016, 1.021, 1.029, 1.038, 1.051, 1.067, 1.084, 1.103, 1.126, 1.151, 1.176, 1.207, 1.241, 1.279, 1.321, 1.358, + 1.371, 1.326, 1.277, 1.242, 1.209, 1.181, 1.155, 1.132, 1.111, 1.092, 1.075, 1.061, 1.049, 1.038, 1.029, 1.027, 1.027, 1.029, 1.038, 1.047, 1.061, 1.075, 1.092, 1.111, 1.133, 1.157, 1.185, 1.213, 1.247, 1.286, 1.329, 1.365, + 1.379, 1.334, 1.287, 1.251, 1.219, 1.191, 1.164, 1.141, 1.119, 1.101, 1.085, 1.071, 1.061, 1.049, 1.041, 1.038, 1.038, 1.041, 1.047, 1.059, 1.071, 1.084, 1.101, 1.119, 1.141, 1.165, 1.193, 1.223, 1.257, 1.295, 1.338, 1.374, + 1.389, 1.343, 1.298, 1.262, 1.231, 1.201, 1.174, 1.151, 1.131, 1.111, 1.095, 1.083, 1.071, 1.061, 1.054, 1.051, 1.051, 1.054, 1.059, 1.071, 1.081, 1.094, 1.111, 1.129, 1.152, 1.176, 1.203, 1.235, 1.269, 1.307, 1.351, 1.384, + 1.401, 1.351, 1.311, 1.274, 1.242, 1.214, 1.187, 1.164, 1.142, 1.124, 1.108, 1.095, 1.083, 1.074, 1.068, 1.066, 1.066, 1.068, 1.073, 1.081, 1.094, 1.108, 1.123, 1.141, 1.164, 1.188, 1.215, 1.247, 1.281, 1.321, 1.364, 1.396, + 1.412, 1.366, 1.327, 1.289, 1.257, 1.227, 1.201, 1.176, 1.156, 1.137, 1.122, 1.108, 1.096, 1.088, 1.083, 1.081, 1.081, 1.082, 1.087, 1.095, 1.108, 1.122, 1.136, 1.154, 1.177, 1.201, 1.229, 1.261, 1.296, 1.337, 1.382, 1.409, + 1.421, 1.383, 1.343, 1.306, 1.273, 1.243, 1.216, 1.192, 1.169, 1.152, 1.137, 1.122, 1.111, 1.103, 1.098, 1.095, 1.095, 1.097, 1.102, 1.111, 1.123, 1.136, 1.152, 1.169, 1.191, 1.217, 1.246, 1.278, 1.314, 1.354, 1.399, 1.429, + 1.434, 1.402, 1.362, 1.324, 1.291, 1.261, 1.232, 1.208, 1.187, 1.168, 1.152, 1.138, 1.127, 1.119, 1.114, 1.112, 1.112, 1.115, 1.121, 1.128, 1.139, 1.152, 1.169, 1.186, 1.209, 1.234, 1.262, 1.295, 1.332, 1.372, 1.419, 1.451, + 1.453, 1.422, 1.382, 1.344, 1.309, 1.278, 1.249, 1.226, 1.204, 1.187, 1.168, 1.155, 1.144, 1.135, 1.131, 1.131, 1.131, 1.133, 1.138, 1.146, 1.157, 1.171, 1.186, 1.206, 1.227, 1.252, 1.281, 1.314, 1.351, 1.393, 1.442, 1.473, + 1.475, 1.446, 1.404, 1.366, 1.329, 1.298, 1.269, 1.245, 1.224, 1.204, 1.188, 1.174, 1.163, 1.154, 1.149, 1.148, 1.148, 1.152, 1.156, 1.164, 1.176, 1.189, 1.206, 1.226, 1.247, 1.274, 1.303, 1.336, 1.374, 1.417, 1.471, 1.505, + 1.503, 1.472, 1.428, 1.389, 1.353, 1.321, 1.291, 1.266, 1.245, 1.224, 1.207, 1.192, 1.183, 1.174, 1.169, 1.167, 1.168, 1.169, 1.175, 1.183, 1.195, 1.209, 1.226, 1.247, 1.267, 1.294, 1.325, 1.359, 1.397, 1.445, 1.505, 1.548, + 1.534, 1.503, 1.455, 1.413, 1.378, 1.344, 1.315, 1.289, 1.265, 1.243, 1.224, 1.207, 1.196, 1.192, 1.189, 1.189, 1.189, 1.189, 1.192, 1.198, 1.209, 1.226, 1.244, 1.266, 1.291, 1.318, 1.349, 1.383, 1.425, 1.475, 1.548, 1.591 + ], + "sigma": 0.00095, + "sigma_Cb": 0.00098 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2850, + "ccm": + [ + 1.97469, -0.71439, -0.26031, + -0.43521, 2.09769, -0.66248, + -0.04826, -0.84642, 1.89468 + ] + }, + { + "ct": 2960, + "ccm": + [ + 2.12952, -0.91185, -0.21768, + -0.38018, 1.90789, -0.52771, + 0.03988, -1.10079, 2.06092 + ] + }, + { + "ct": 3580, + "ccm": + [ + 2.03422, -0.80048, -0.23374, + -0.39089, 1.97221, -0.58132, + -0.08969, -0.61439, 1.70408 + ] + }, + { + "ct": 4559, + "ccm": + [ + 2.15423, -0.98143, -0.17279, + -0.38131, 2.14763, -0.76632, + -0.10069, -0.54383, 1.64452 + ] + }, + { + "ct": 5881, + "ccm": + [ + 2.18464, -0.95493, -0.22971, + -0.36826, 2.00298, -0.63471, + -0.15219, -0.38055, 1.53274 + ] + }, + { + "ct": 7600, + "ccm": + [ + 2.30687, -0.97295, -0.33392, + -0.30872, 2.32779, -1.01908, + -0.17761, -0.55891, 1.73651 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx477_16mm.json b/src/ipa/rpi/pisp/data/imx477_16mm.json new file mode 100644 index 000000000..f4e65c92c --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx477_16mm.json @@ -0,0 +1,1240 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 12000, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 740, + "reference_Y": 15051 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.809 + } + }, + { + "rpi.geq": + { + "offset": 204, + "slope": 0.0061 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2850.0, 0.4307, 0.3957, + 2960.0, 0.4159, 0.4313, + 3580.0, 0.3771, 0.5176, + 4559.0, 0.3031, 0.6573, + 5881.0, 0.2809, 0.6942, + 7600.0, 0.2263, 0.7762 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.02634, + "transverse_neg": 0.02255 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 2.359, 2.354, 2.351, 2.351, 2.343, 2.337, 2.331, 2.325, 2.323, 2.321, 2.317, 2.315, 2.313, 2.313, 2.311, 2.312, 2.312, 2.313, 2.315, 2.315, 2.316, 2.317, 2.319, 2.323, 2.326, 2.329, 2.332, 2.332, 2.335, 2.337, 2.352, 2.363, + 2.352, 2.351, 2.349, 2.346, 2.342, 2.334, 2.328, 2.324, 2.321, 2.317, 2.315, 2.314, 2.312, 2.311, 2.311, 2.311, 2.311, 2.311, 2.312, 2.314, 2.315, 2.316, 2.317, 2.319, 2.324, 2.326, 2.328, 2.329, 2.331, 2.337, 2.348, 2.355, + 2.346, 2.346, 2.345, 2.344, 2.338, 2.329, 2.325, 2.319, 2.316, 2.314, 2.311, 2.309, 2.308, 2.306, 2.304, 2.304, 2.305, 2.307, 2.308, 2.309, 2.311, 2.311, 2.313, 2.316, 2.319, 2.322, 2.325, 2.326, 2.328, 2.335, 2.343, 2.349, + 2.342, 2.342, 2.341, 2.338, 2.332, 2.326, 2.319, 2.316, 2.312, 2.309, 2.308, 2.305, 2.303, 2.302, 2.301, 2.301, 2.302, 2.303, 2.304, 2.305, 2.305, 2.307, 2.311, 2.313, 2.315, 2.319, 2.321, 2.325, 2.328, 2.333, 2.338, 2.348, + 2.337, 2.337, 2.337, 2.336, 2.331, 2.322, 2.317, 2.312, 2.309, 2.307, 2.304, 2.302, 2.299, 2.299, 2.298, 2.298, 2.299, 2.299, 2.301, 2.302, 2.302, 2.304, 2.305, 2.309, 2.314, 2.316, 2.321, 2.324, 2.326, 2.329, 2.335, 2.343, + 2.335, 2.334, 2.333, 2.333, 2.326, 2.318, 2.313, 2.309, 2.306, 2.302, 2.299, 2.297, 2.297, 2.296, 2.295, 2.295, 2.294, 2.295, 2.296, 2.298, 2.298, 2.301, 2.303, 2.305, 2.311, 2.315, 2.319, 2.323, 2.325, 2.329, 2.333, 2.339, + 2.329, 2.331, 2.329, 2.329, 2.325, 2.315, 2.309, 2.306, 2.302, 2.299, 2.297, 2.295, 2.293, 2.292, 2.291, 2.291, 2.291, 2.291, 2.293, 2.294, 2.296, 2.298, 2.301, 2.304, 2.307, 2.313, 2.317, 2.319, 2.323, 2.327, 2.331, 2.339, + 2.329, 2.328, 2.328, 2.328, 2.321, 2.313, 2.307, 2.303, 2.299, 2.295, 2.294, 2.292, 2.289, 2.289, 2.288, 2.288, 2.288, 2.289, 2.289, 2.292, 2.294, 2.295, 2.297, 2.301, 2.306, 2.311, 2.315, 2.318, 2.319, 2.323, 2.329, 2.335, + 2.326, 2.327, 2.325, 2.325, 2.319, 2.311, 2.305, 2.299, 2.296, 2.293, 2.291, 2.289, 2.288, 2.287, 2.285, 2.285, 2.286, 2.288, 2.288, 2.289, 2.291, 2.294, 2.295, 2.298, 2.304, 2.308, 2.313, 2.315, 2.317, 2.319, 2.327, 2.335, + 2.325, 2.325, 2.323, 2.323, 2.317, 2.309, 2.303, 2.298, 2.294, 2.292, 2.289, 2.287, 2.286, 2.285, 2.284, 2.284, 2.284, 2.285, 2.287, 2.289, 2.291, 2.291, 2.294, 2.297, 2.302, 2.305, 2.309, 2.313, 2.315, 2.317, 2.325, 2.334, + 2.322, 2.324, 2.322, 2.322, 2.316, 2.306, 2.301, 2.296, 2.292, 2.289, 2.287, 2.286, 2.285, 2.284, 2.283, 2.283, 2.283, 2.284, 2.286, 2.288, 2.289, 2.291, 2.293, 2.296, 2.301, 2.304, 2.308, 2.311, 2.312, 2.315, 2.323, 2.333, + 2.321, 2.323, 2.322, 2.322, 2.314, 2.306, 2.299, 2.294, 2.291, 2.288, 2.286, 2.285, 2.284, 2.282, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.289, 2.291, 2.291, 2.294, 2.297, 2.302, 2.306, 2.308, 2.311, 2.312, 2.322, 2.332, + 2.319, 2.321, 2.321, 2.321, 2.314, 2.305, 2.297, 2.293, 2.289, 2.287, 2.285, 2.284, 2.283, 2.281, 2.281, 2.281, 2.282, 2.283, 2.283, 2.285, 2.287, 2.289, 2.291, 2.292, 2.297, 2.301, 2.305, 2.307, 2.309, 2.312, 2.321, 2.333, + 2.319, 2.321, 2.319, 2.319, 2.314, 2.303, 2.296, 2.293, 2.289, 2.286, 2.285, 2.283, 2.282, 2.281, 2.281, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.288, 2.289, 2.291, 2.296, 2.301, 2.305, 2.307, 2.308, 2.312, 2.321, 2.332, + 2.319, 2.321, 2.319, 2.319, 2.313, 2.303, 2.296, 2.291, 2.289, 2.286, 2.284, 2.282, 2.281, 2.281, 2.281, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.287, 2.288, 2.291, 2.295, 2.299, 2.304, 2.306, 2.307, 2.311, 2.321, 2.332, + 2.319, 2.321, 2.319, 2.319, 2.313, 2.303, 2.297, 2.292, 2.289, 2.287, 2.285, 2.282, 2.281, 2.281, 2.282, 2.282, 2.282, 2.282, 2.283, 2.284, 2.285, 2.286, 2.288, 2.291, 2.295, 2.299, 2.303, 2.306, 2.307, 2.312, 2.321, 2.331, + 2.318, 2.319, 2.319, 2.319, 2.313, 2.303, 2.297, 2.292, 2.289, 2.286, 2.285, 2.282, 2.281, 2.281, 2.281, 2.282, 2.282, 2.282, 2.282, 2.283, 2.285, 2.286, 2.287, 2.291, 2.294, 2.298, 2.303, 2.306, 2.307, 2.311, 2.321, 2.331, + 2.319, 2.319, 2.319, 2.319, 2.313, 2.302, 2.297, 2.292, 2.289, 2.287, 2.285, 2.283, 2.282, 2.281, 2.281, 2.282, 2.283, 2.283, 2.283, 2.283, 2.285, 2.286, 2.287, 2.289, 2.294, 2.297, 2.303, 2.305, 2.308, 2.313, 2.321, 2.331, + 2.319, 2.319, 2.319, 2.319, 2.313, 2.303, 2.299, 2.293, 2.291, 2.287, 2.285, 2.283, 2.282, 2.281, 2.281, 2.282, 2.283, 2.283, 2.283, 2.283, 2.285, 2.286, 2.288, 2.291, 2.294, 2.298, 2.304, 2.306, 2.308, 2.312, 2.322, 2.331, + 2.319, 2.321, 2.321, 2.321, 2.315, 2.305, 2.301, 2.295, 2.292, 2.289, 2.286, 2.285, 2.283, 2.282, 2.282, 2.282, 2.284, 2.283, 2.284, 2.284, 2.285, 2.287, 2.288, 2.291, 2.294, 2.299, 2.304, 2.306, 2.309, 2.313, 2.322, 2.334, + 2.321, 2.322, 2.322, 2.322, 2.317, 2.307, 2.301, 2.296, 2.292, 2.291, 2.288, 2.286, 2.285, 2.284, 2.283, 2.284, 2.285, 2.284, 2.285, 2.285, 2.287, 2.288, 2.289, 2.293, 2.297, 2.301, 2.305, 2.308, 2.311, 2.314, 2.323, 2.335, + 2.322, 2.324, 2.324, 2.324, 2.319, 2.309, 2.303, 2.297, 2.295, 2.292, 2.291, 2.288, 2.286, 2.286, 2.285, 2.286, 2.286, 2.286, 2.287, 2.288, 2.289, 2.289, 2.291, 2.294, 2.299, 2.302, 2.307, 2.311, 2.312, 2.316, 2.325, 2.335, + 2.324, 2.326, 2.325, 2.326, 2.321, 2.311, 2.305, 2.301, 2.297, 2.295, 2.293, 2.291, 2.289, 2.289, 2.288, 2.288, 2.287, 2.288, 2.289, 2.291, 2.292, 2.292, 2.295, 2.299, 2.301, 2.304, 2.309, 2.312, 2.315, 2.319, 2.327, 2.337, + 2.329, 2.329, 2.328, 2.328, 2.323, 2.315, 2.308, 2.304, 2.301, 2.298, 2.296, 2.294, 2.291, 2.291, 2.289, 2.291, 2.291, 2.291, 2.292, 2.293, 2.294, 2.295, 2.297, 2.299, 2.303, 2.308, 2.312, 2.315, 2.318, 2.321, 2.329, 2.339, + 2.329, 2.331, 2.332, 2.332, 2.326, 2.318, 2.311, 2.306, 2.304, 2.301, 2.299, 2.297, 2.295, 2.293, 2.292, 2.292, 2.292, 2.293, 2.294, 2.294, 2.296, 2.297, 2.299, 2.302, 2.306, 2.311, 2.315, 2.318, 2.319, 2.324, 2.332, 2.342, + 2.331, 2.333, 2.334, 2.334, 2.328, 2.321, 2.313, 2.308, 2.305, 2.303, 2.301, 2.299, 2.297, 2.295, 2.295, 2.295, 2.294, 2.296, 2.296, 2.297, 2.298, 2.299, 2.302, 2.305, 2.308, 2.314, 2.317, 2.321, 2.323, 2.327, 2.334, 2.346, + 2.331, 2.332, 2.334, 2.334, 2.329, 2.321, 2.314, 2.309, 2.306, 2.304, 2.303, 2.301, 2.299, 2.297, 2.295, 2.295, 2.296, 2.297, 2.298, 2.298, 2.299, 2.301, 2.303, 2.306, 2.309, 2.315, 2.319, 2.321, 2.324, 2.328, 2.337, 2.346, + 2.331, 2.332, 2.334, 2.334, 2.329, 2.321, 2.314, 2.311, 2.306, 2.304, 2.303, 2.302, 2.299, 2.297, 2.295, 2.295, 2.296, 2.297, 2.298, 2.298, 2.299, 2.301, 2.303, 2.306, 2.311, 2.314, 2.319, 2.323, 2.325, 2.329, 2.339, 2.348, + 2.329, 2.329, 2.329, 2.331, 2.326, 2.319, 2.312, 2.309, 2.304, 2.303, 2.302, 2.301, 2.298, 2.295, 2.294, 2.294, 2.295, 2.295, 2.296, 2.297, 2.299, 2.301, 2.302, 2.304, 2.308, 2.313, 2.319, 2.322, 2.325, 2.329, 2.339, 2.351, + 2.329, 2.329, 2.329, 2.329, 2.326, 2.317, 2.311, 2.308, 2.303, 2.302, 2.301, 2.298, 2.296, 2.295, 2.294, 2.294, 2.294, 2.294, 2.296, 2.297, 2.298, 2.299, 2.301, 2.304, 2.307, 2.312, 2.318, 2.322, 2.326, 2.331, 2.341, 2.355, + 2.339, 2.332, 2.331, 2.331, 2.327, 2.323, 2.316, 2.309, 2.306, 2.302, 2.301, 2.299, 2.297, 2.296, 2.295, 2.294, 2.294, 2.296, 2.297, 2.297, 2.299, 2.301, 2.303, 2.306, 2.308, 2.317, 2.322, 2.325, 2.329, 2.341, 2.353, 2.361, + 2.347, 2.347, 2.345, 2.343, 2.338, 2.332, 2.326, 2.322, 2.321, 2.318, 2.316, 2.315, 2.313, 2.312, 2.311, 2.311, 2.311, 2.311, 2.312, 2.315, 2.317, 2.318, 2.319, 2.323, 2.324, 2.329, 2.334, 2.337, 2.344, 2.347, 2.361, 2.364 + ] + }, + { + "ct": 5000, + "table": + [ + 3.869, 3.852, 3.844, 3.842, 3.836, 3.821, 3.807, 3.796, 3.789, 3.784, 3.778, 3.775, 3.769, 3.768, 3.765, 3.765, 3.767, 3.769, 3.772, 3.774, 3.773, 3.775, 3.779, 3.787, 3.793, 3.801, 3.806, 3.804, 3.813, 3.819, 3.855, 3.879, + 3.854, 3.844, 3.837, 3.836, 3.824, 3.811, 3.797, 3.789, 3.784, 3.777, 3.774, 3.769, 3.764, 3.758, 3.757, 3.758, 3.758, 3.761, 3.763, 3.764, 3.765, 3.766, 3.772, 3.778, 3.787, 3.792, 3.794, 3.798, 3.802, 3.815, 3.839, 3.873, + 3.838, 3.831, 3.826, 3.823, 3.813, 3.799, 3.787, 3.781, 3.773, 3.768, 3.763, 3.759, 3.753, 3.749, 3.745, 3.745, 3.745, 3.752, 3.754, 3.757, 3.757, 3.759, 3.763, 3.769, 3.773, 3.781, 3.786, 3.792, 3.798, 3.811, 3.831, 3.861, + 3.833, 3.822, 3.817, 3.816, 3.804, 3.788, 3.779, 3.772, 3.766, 3.759, 3.755, 3.749, 3.744, 3.741, 3.738, 3.739, 3.739, 3.741, 3.743, 3.747, 3.749, 3.751, 3.756, 3.764, 3.769, 3.776, 3.783, 3.789, 3.798, 3.809, 3.821, 3.855, + 3.824, 3.818, 3.808, 3.808, 3.797, 3.781, 3.772, 3.764, 3.757, 3.752, 3.747, 3.743, 3.737, 3.735, 3.733, 3.733, 3.733, 3.735, 3.737, 3.738, 3.741, 3.746, 3.749, 3.755, 3.766, 3.771, 3.781, 3.789, 3.794, 3.806, 3.818, 3.849, + 3.815, 3.808, 3.799, 3.801, 3.787, 3.775, 3.767, 3.757, 3.751, 3.745, 3.738, 3.734, 3.732, 3.727, 3.725, 3.723, 3.722, 3.722, 3.726, 3.729, 3.734, 3.738, 3.744, 3.749, 3.759, 3.769, 3.781, 3.788, 3.792, 3.799, 3.811, 3.841, + 3.804, 3.799, 3.793, 3.793, 3.783, 3.771, 3.759, 3.751, 3.744, 3.735, 3.732, 3.727, 3.723, 3.721, 3.719, 3.716, 3.716, 3.716, 3.718, 3.722, 3.727, 3.731, 3.737, 3.746, 3.756, 3.767, 3.776, 3.782, 3.788, 3.795, 3.808, 3.831, + 3.802, 3.797, 3.787, 3.787, 3.779, 3.762, 3.753, 3.744, 3.734, 3.727, 3.725, 3.721, 3.716, 3.714, 3.709, 3.709, 3.711, 3.711, 3.712, 3.717, 3.722, 3.725, 3.731, 3.739, 3.752, 3.762, 3.772, 3.778, 3.779, 3.789, 3.798, 3.826, + 3.791, 3.789, 3.784, 3.784, 3.775, 3.759, 3.746, 3.735, 3.729, 3.724, 3.718, 3.714, 3.712, 3.707, 3.704, 3.704, 3.706, 3.708, 3.709, 3.711, 3.716, 3.722, 3.726, 3.735, 3.746, 3.754, 3.767, 3.774, 3.777, 3.781, 3.794, 3.824, + 3.789, 3.784, 3.779, 3.781, 3.771, 3.753, 3.741, 3.732, 3.725, 3.719, 3.715, 3.711, 3.707, 3.704, 3.701, 3.701, 3.702, 3.704, 3.708, 3.709, 3.713, 3.718, 3.724, 3.731, 3.742, 3.749, 3.761, 3.768, 3.772, 3.778, 3.791, 3.822, + 3.789, 3.781, 3.777, 3.777, 3.764, 3.749, 3.739, 3.729, 3.722, 3.718, 3.711, 3.708, 3.705, 3.701, 3.699, 3.699, 3.699, 3.701, 3.705, 3.707, 3.711, 3.715, 3.721, 3.727, 3.738, 3.746, 3.757, 3.763, 3.765, 3.773, 3.788, 3.821, + 3.785, 3.779, 3.774, 3.774, 3.764, 3.747, 3.736, 3.726, 3.719, 3.711, 3.709, 3.706, 3.701, 3.698, 3.696, 3.695, 3.695, 3.698, 3.702, 3.704, 3.707, 3.712, 3.718, 3.725, 3.734, 3.741, 3.753, 3.756, 3.759, 3.764, 3.784, 3.818, + 3.779, 3.776, 3.773, 3.773, 3.759, 3.744, 3.733, 3.724, 3.714, 3.709, 3.706, 3.704, 3.699, 3.696, 3.694, 3.694, 3.694, 3.697, 3.701, 3.703, 3.706, 3.709, 3.714, 3.721, 3.731, 3.737, 3.749, 3.753, 3.758, 3.762, 3.783, 3.819, + 3.779, 3.776, 3.769, 3.769, 3.757, 3.741, 3.729, 3.721, 3.712, 3.708, 3.705, 3.701, 3.697, 3.695, 3.694, 3.694, 3.695, 3.696, 3.698, 3.702, 3.705, 3.709, 3.712, 3.717, 3.728, 3.736, 3.749, 3.752, 3.756, 3.761, 3.781, 3.815, + 3.779, 3.773, 3.768, 3.768, 3.756, 3.738, 3.731, 3.719, 3.711, 3.707, 3.703, 3.698, 3.695, 3.694, 3.694, 3.695, 3.695, 3.695, 3.696, 3.702, 3.705, 3.708, 3.712, 3.717, 3.728, 3.736, 3.747, 3.751, 3.754, 3.761, 3.781, 3.815, + 3.782, 3.773, 3.767, 3.767, 3.755, 3.738, 3.728, 3.721, 3.711, 3.707, 3.701, 3.698, 3.695, 3.693, 3.694, 3.696, 3.695, 3.695, 3.695, 3.701, 3.703, 3.706, 3.711, 3.715, 3.726, 3.735, 3.745, 3.751, 3.754, 3.763, 3.779, 3.815, + 3.781, 3.771, 3.767, 3.767, 3.754, 3.739, 3.726, 3.721, 3.712, 3.706, 3.701, 3.698, 3.695, 3.693, 3.693, 3.695, 3.695, 3.695, 3.696, 3.698, 3.703, 3.705, 3.709, 3.715, 3.725, 3.734, 3.745, 3.751, 3.755, 3.762, 3.783, 3.818, + 3.781, 3.774, 3.767, 3.767, 3.755, 3.741, 3.729, 3.722, 3.712, 3.708, 3.701, 3.699, 3.695, 3.693, 3.693, 3.694, 3.695, 3.695, 3.697, 3.698, 3.702, 3.704, 3.709, 3.713, 3.725, 3.732, 3.746, 3.751, 3.756, 3.763, 3.783, 3.821, + 3.781, 3.774, 3.769, 3.769, 3.756, 3.741, 3.731, 3.724, 3.713, 3.711, 3.707, 3.699, 3.697, 3.694, 3.693, 3.694, 3.695, 3.695, 3.697, 3.698, 3.702, 3.704, 3.709, 3.713, 3.724, 3.734, 3.747, 3.751, 3.756, 3.765, 3.784, 3.821, + 3.784, 3.776, 3.773, 3.773, 3.759, 3.742, 3.733, 3.726, 3.719, 3.711, 3.709, 3.703, 3.698, 3.695, 3.694, 3.695, 3.697, 3.696, 3.698, 3.699, 3.703, 3.706, 3.711, 3.714, 3.727, 3.735, 3.746, 3.751, 3.757, 3.766, 3.787, 3.822, + 3.786, 3.783, 3.774, 3.774, 3.766, 3.747, 3.737, 3.727, 3.722, 3.716, 3.711, 3.706, 3.702, 3.698, 3.697, 3.698, 3.699, 3.699, 3.701, 3.703, 3.706, 3.711, 3.713, 3.719, 3.731, 3.739, 3.748, 3.753, 3.761, 3.769, 3.789, 3.826, + 3.786, 3.784, 3.779, 3.779, 3.769, 3.751, 3.742, 3.732, 3.725, 3.719, 3.715, 3.711, 3.706, 3.704, 3.701, 3.701, 3.702, 3.702, 3.705, 3.707, 3.712, 3.714, 3.717, 3.724, 3.733, 3.743, 3.749, 3.758, 3.764, 3.769, 3.791, 3.826, + 3.793, 3.787, 3.782, 3.782, 3.774, 3.756, 3.747, 3.737, 3.729, 3.725, 3.719, 3.715, 3.712, 3.708, 3.707, 3.706, 3.707, 3.708, 3.709, 3.713, 3.714, 3.717, 3.723, 3.729, 3.736, 3.747, 3.757, 3.764, 3.768, 3.774, 3.794, 3.829, + 3.794, 3.791, 3.786, 3.786, 3.779, 3.762, 3.751, 3.742, 3.735, 3.729, 3.725, 3.719, 3.716, 3.711, 3.709, 3.709, 3.709, 3.711, 3.716, 3.717, 3.721, 3.723, 3.726, 3.732, 3.741, 3.752, 3.761, 3.767, 3.773, 3.779, 3.801, 3.829, + 3.802, 3.798, 3.793, 3.793, 3.779, 3.766, 3.754, 3.746, 3.741, 3.736, 3.731, 3.726, 3.719, 3.717, 3.716, 3.715, 3.716, 3.717, 3.719, 3.721, 3.724, 3.726, 3.731, 3.737, 3.744, 3.756, 3.766, 3.772, 3.776, 3.784, 3.807, 3.839, + 3.805, 3.799, 3.795, 3.795, 3.784, 3.767, 3.757, 3.749, 3.744, 3.739, 3.736, 3.731, 3.726, 3.722, 3.719, 3.719, 3.719, 3.721, 3.723, 3.725, 3.727, 3.732, 3.738, 3.742, 3.751, 3.761, 3.771, 3.775, 3.782, 3.789, 3.811, 3.841, + 3.804, 3.801, 3.799, 3.799, 3.787, 3.772, 3.761, 3.752, 3.746, 3.742, 3.739, 3.735, 3.729, 3.726, 3.723, 3.724, 3.725, 3.726, 3.727, 3.728, 3.732, 3.736, 3.739, 3.745, 3.754, 3.765, 3.775, 3.779, 3.785, 3.795, 3.816, 3.844, + 3.801, 3.799, 3.796, 3.796, 3.787, 3.773, 3.761, 3.753, 3.746, 3.743, 3.739, 3.735, 3.731, 3.726, 3.725, 3.725, 3.725, 3.726, 3.727, 3.729, 3.733, 3.736, 3.741, 3.745, 3.755, 3.766, 3.776, 3.783, 3.786, 3.797, 3.819, 3.851, + 3.799, 3.795, 3.788, 3.788, 3.783, 3.772, 3.759, 3.749, 3.744, 3.738, 3.735, 3.733, 3.726, 3.724, 3.722, 3.722, 3.723, 3.724, 3.725, 3.727, 3.729, 3.733, 3.736, 3.742, 3.754, 3.762, 3.772, 3.779, 3.784, 3.796, 3.821, 3.859, + 3.799, 3.789, 3.787, 3.788, 3.779, 3.766, 3.755, 3.749, 3.742, 3.736, 3.733, 3.727, 3.723, 3.722, 3.721, 3.719, 3.719, 3.721, 3.725, 3.726, 3.728, 3.732, 3.734, 3.741, 3.747, 3.758, 3.771, 3.778, 3.785, 3.796, 3.825, 3.862, + 3.824, 3.799, 3.789, 3.789, 3.788, 3.777, 3.761, 3.751, 3.743, 3.739, 3.736, 3.728, 3.726, 3.725, 3.721, 3.719, 3.721, 3.723, 3.727, 3.728, 3.729, 3.733, 3.737, 3.744, 3.755, 3.769, 3.776, 3.784, 3.793, 3.819, 3.863, 3.877, + 3.833, 3.833, 3.833, 3.842, 3.825, 3.815, 3.807, 3.799, 3.792, 3.788, 3.785, 3.782, 3.778, 3.777, 3.773, 3.772, 3.772, 3.774, 3.778, 3.779, 3.779, 3.785, 3.792, 3.798, 3.803, 3.811, 3.822, 3.834, 3.843, 3.846, 3.877, 3.886 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 2.616, 2.616, 2.618, 2.621, 2.619, 2.618, 2.615, 2.615, 2.613, 2.611, 2.609, 2.609, 2.609, 2.611, 2.611, 2.611, 2.611, 2.609, 2.608, 2.608, 2.611, 2.613, 2.613, 2.614, 2.614, 2.615, 2.615, 2.622, 2.624, 2.621, 2.624, 2.641, + 2.616, 2.618, 2.621, 2.623, 2.623, 2.619, 2.618, 2.616, 2.616, 2.613, 2.611, 2.611, 2.611, 2.611, 2.612, 2.612, 2.611, 2.611, 2.611, 2.611, 2.611, 2.612, 2.613, 2.612, 2.613, 2.615, 2.617, 2.621, 2.621, 2.619, 2.621, 2.641, + 2.621, 2.624, 2.627, 2.627, 2.625, 2.623, 2.621, 2.619, 2.618, 2.618, 2.618, 2.617, 2.616, 2.616, 2.615, 2.613, 2.612, 2.613, 2.613, 2.614, 2.614, 2.613, 2.614, 2.613, 2.614, 2.617, 2.619, 2.621, 2.621, 2.619, 2.623, 2.643, + 2.626, 2.627, 2.628, 2.629, 2.628, 2.625, 2.622, 2.621, 2.621, 2.622, 2.621, 2.619, 2.619, 2.618, 2.617, 2.616, 2.616, 2.616, 2.618, 2.618, 2.617, 2.617, 2.618, 2.619, 2.621, 2.623, 2.624, 2.626, 2.625, 2.624, 2.625, 2.654, + 2.627, 2.628, 2.628, 2.628, 2.626, 2.623, 2.622, 2.622, 2.622, 2.622, 2.621, 2.621, 2.619, 2.617, 2.617, 2.616, 2.617, 2.617, 2.618, 2.619, 2.618, 2.618, 2.618, 2.621, 2.622, 2.624, 2.626, 2.627, 2.627, 2.626, 2.628, 2.655, + 2.625, 2.626, 2.627, 2.626, 2.625, 2.623, 2.622, 2.621, 2.622, 2.621, 2.621, 2.619, 2.617, 2.616, 2.615, 2.616, 2.616, 2.616, 2.616, 2.616, 2.617, 2.618, 2.619, 2.621, 2.622, 2.624, 2.626, 2.628, 2.628, 2.629, 2.629, 2.655, + 2.626, 2.625, 2.626, 2.625, 2.625, 2.623, 2.622, 2.622, 2.622, 2.621, 2.619, 2.617, 2.616, 2.614, 2.613, 2.614, 2.614, 2.614, 2.614, 2.614, 2.616, 2.618, 2.619, 2.621, 2.623, 2.624, 2.627, 2.629, 2.631, 2.629, 2.631, 2.651, + 2.625, 2.625, 2.625, 2.624, 2.623, 2.623, 2.622, 2.622, 2.622, 2.621, 2.619, 2.617, 2.614, 2.613, 2.612, 2.611, 2.611, 2.612, 2.612, 2.613, 2.616, 2.618, 2.619, 2.622, 2.624, 2.626, 2.628, 2.631, 2.631, 2.631, 2.631, 2.651, + 2.625, 2.625, 2.624, 2.623, 2.622, 2.622, 2.622, 2.622, 2.622, 2.621, 2.617, 2.615, 2.613, 2.612, 2.611, 2.611, 2.611, 2.611, 2.611, 2.613, 2.615, 2.618, 2.619, 2.622, 2.625, 2.627, 2.631, 2.632, 2.631, 2.629, 2.631, 2.651, + 2.624, 2.624, 2.622, 2.622, 2.621, 2.621, 2.621, 2.621, 2.621, 2.618, 2.616, 2.614, 2.612, 2.611, 2.609, 2.609, 2.608, 2.609, 2.611, 2.611, 2.615, 2.617, 2.619, 2.621, 2.625, 2.628, 2.631, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.622, 2.623, 2.622, 2.622, 2.621, 2.619, 2.619, 2.619, 2.618, 2.616, 2.614, 2.613, 2.611, 2.609, 2.608, 2.606, 2.607, 2.607, 2.609, 2.611, 2.615, 2.617, 2.619, 2.622, 2.626, 2.629, 2.632, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.621, 2.622, 2.622, 2.622, 2.621, 2.619, 2.619, 2.618, 2.617, 2.614, 2.613, 2.611, 2.611, 2.607, 2.606, 2.605, 2.604, 2.605, 2.607, 2.609, 2.613, 2.616, 2.619, 2.622, 2.627, 2.631, 2.632, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.619, 2.621, 2.623, 2.623, 2.621, 2.621, 2.619, 2.617, 2.616, 2.615, 2.613, 2.609, 2.607, 2.604, 2.602, 2.601, 2.602, 2.603, 2.605, 2.609, 2.612, 2.616, 2.619, 2.624, 2.628, 2.631, 2.632, 2.633, 2.629, 2.627, 2.627, 2.651, + 2.619, 2.621, 2.623, 2.623, 2.622, 2.621, 2.618, 2.617, 2.615, 2.614, 2.612, 2.608, 2.603, 2.601, 2.598, 2.597, 2.599, 2.602, 2.605, 2.608, 2.611, 2.615, 2.622, 2.625, 2.629, 2.631, 2.631, 2.633, 2.631, 2.627, 2.627, 2.651, + 2.621, 2.622, 2.623, 2.623, 2.622, 2.621, 2.618, 2.617, 2.616, 2.614, 2.611, 2.606, 2.601, 2.598, 2.595, 2.595, 2.597, 2.601, 2.604, 2.608, 2.612, 2.615, 2.623, 2.627, 2.629, 2.631, 2.631, 2.632, 2.631, 2.628, 2.628, 2.651, + 2.622, 2.623, 2.624, 2.624, 2.622, 2.621, 2.619, 2.617, 2.615, 2.613, 2.609, 2.606, 2.601, 2.596, 2.594, 2.594, 2.596, 2.599, 2.603, 2.609, 2.613, 2.617, 2.623, 2.627, 2.629, 2.631, 2.632, 2.632, 2.631, 2.629, 2.631, 2.651, + 2.623, 2.625, 2.625, 2.624, 2.621, 2.621, 2.619, 2.617, 2.616, 2.613, 2.608, 2.605, 2.601, 2.595, 2.593, 2.593, 2.595, 2.598, 2.604, 2.609, 2.615, 2.619, 2.625, 2.627, 2.629, 2.629, 2.632, 2.633, 2.632, 2.629, 2.631, 2.651, + 2.624, 2.626, 2.626, 2.623, 2.621, 2.619, 2.618, 2.617, 2.615, 2.612, 2.608, 2.605, 2.601, 2.597, 2.595, 2.595, 2.596, 2.598, 2.605, 2.609, 2.616, 2.621, 2.626, 2.627, 2.629, 2.631, 2.633, 2.633, 2.633, 2.631, 2.631, 2.655, + 2.624, 2.625, 2.625, 2.623, 2.621, 2.619, 2.618, 2.617, 2.614, 2.612, 2.609, 2.606, 2.602, 2.599, 2.598, 2.597, 2.598, 2.602, 2.607, 2.612, 2.619, 2.621, 2.626, 2.628, 2.629, 2.632, 2.633, 2.634, 2.633, 2.631, 2.631, 2.655, + 2.624, 2.625, 2.625, 2.623, 2.621, 2.621, 2.618, 2.617, 2.614, 2.612, 2.611, 2.608, 2.604, 2.602, 2.599, 2.599, 2.603, 2.606, 2.611, 2.616, 2.621, 2.624, 2.626, 2.629, 2.631, 2.632, 2.633, 2.634, 2.634, 2.633, 2.633, 2.656, + 2.623, 2.624, 2.625, 2.623, 2.622, 2.621, 2.619, 2.617, 2.615, 2.613, 2.611, 2.611, 2.607, 2.604, 2.604, 2.604, 2.606, 2.609, 2.613, 2.619, 2.622, 2.625, 2.628, 2.631, 2.632, 2.633, 2.633, 2.636, 2.636, 2.634, 2.634, 2.658, + 2.623, 2.624, 2.625, 2.623, 2.622, 2.619, 2.618, 2.616, 2.614, 2.613, 2.612, 2.611, 2.609, 2.608, 2.607, 2.608, 2.609, 2.613, 2.617, 2.621, 2.623, 2.626, 2.629, 2.631, 2.632, 2.633, 2.634, 2.635, 2.636, 2.636, 2.636, 2.661, + 2.623, 2.624, 2.625, 2.625, 2.623, 2.621, 2.619, 2.616, 2.615, 2.614, 2.613, 2.612, 2.612, 2.611, 2.611, 2.611, 2.614, 2.615, 2.619, 2.622, 2.625, 2.627, 2.631, 2.632, 2.633, 2.635, 2.635, 2.637, 2.637, 2.636, 2.637, 2.661, + 2.623, 2.624, 2.625, 2.626, 2.624, 2.621, 2.619, 2.617, 2.616, 2.615, 2.615, 2.614, 2.614, 2.614, 2.614, 2.614, 2.616, 2.619, 2.621, 2.623, 2.626, 2.628, 2.631, 2.632, 2.634, 2.635, 2.636, 2.637, 2.638, 2.637, 2.638, 2.661, + 2.625, 2.626, 2.627, 2.627, 2.626, 2.623, 2.619, 2.619, 2.618, 2.618, 2.618, 2.617, 2.617, 2.616, 2.616, 2.616, 2.619, 2.622, 2.623, 2.625, 2.628, 2.628, 2.631, 2.632, 2.634, 2.636, 2.638, 2.639, 2.639, 2.638, 2.638, 2.661, + 2.625, 2.626, 2.627, 2.628, 2.626, 2.623, 2.621, 2.619, 2.619, 2.619, 2.619, 2.619, 2.619, 2.618, 2.618, 2.619, 2.623, 2.624, 2.625, 2.627, 2.629, 2.629, 2.632, 2.633, 2.635, 2.638, 2.639, 2.639, 2.639, 2.636, 2.636, 2.662, + 2.625, 2.627, 2.628, 2.628, 2.626, 2.624, 2.623, 2.622, 2.621, 2.621, 2.621, 2.621, 2.621, 2.621, 2.621, 2.624, 2.624, 2.625, 2.627, 2.628, 2.631, 2.631, 2.632, 2.634, 2.636, 2.639, 2.639, 2.641, 2.639, 2.635, 2.635, 2.663, + 2.625, 2.626, 2.628, 2.628, 2.627, 2.625, 2.624, 2.623, 2.623, 2.622, 2.623, 2.624, 2.624, 2.625, 2.625, 2.625, 2.625, 2.626, 2.627, 2.629, 2.631, 2.632, 2.633, 2.635, 2.638, 2.641, 2.642, 2.643, 2.642, 2.636, 2.636, 2.665, + 2.624, 2.626, 2.628, 2.628, 2.628, 2.626, 2.624, 2.624, 2.623, 2.623, 2.623, 2.625, 2.627, 2.627, 2.626, 2.626, 2.626, 2.627, 2.628, 2.629, 2.632, 2.633, 2.635, 2.637, 2.639, 2.642, 2.644, 2.644, 2.642, 2.638, 2.638, 2.665, + 2.623, 2.625, 2.626, 2.627, 2.626, 2.626, 2.624, 2.623, 2.623, 2.623, 2.623, 2.623, 2.626, 2.627, 2.626, 2.626, 2.626, 2.626, 2.628, 2.628, 2.629, 2.631, 2.634, 2.636, 2.639, 2.642, 2.644, 2.643, 2.641, 2.637, 2.638, 2.659, + 2.623, 2.627, 2.627, 2.627, 2.627, 2.628, 2.627, 2.624, 2.624, 2.623, 2.624, 2.624, 2.628, 2.628, 2.627, 2.628, 2.628, 2.628, 2.629, 2.629, 2.631, 2.635, 2.637, 2.639, 2.641, 2.643, 2.646, 2.645, 2.643, 2.641, 2.654, 2.659, + 2.642, 2.641, 2.643, 2.645, 2.645, 2.644, 2.644, 2.643, 2.643, 2.642, 2.642, 2.642, 2.643, 2.644, 2.644, 2.644, 2.646, 2.646, 2.647, 2.649, 2.651, 2.652, 2.654, 2.656, 2.658, 2.661, 2.661, 2.661, 2.659, 2.654, 2.659, 2.659 + ] + }, + { + "ct": 5000, + "table": + [ + 1.391, 1.394, 1.395, 1.396, 1.398, 1.398, 1.398, 1.398, 1.398, 1.399, 1.399, 1.398, 1.398, 1.399, 1.399, 1.399, 1.399, 1.398, 1.398, 1.398, 1.399, 1.399, 1.398, 1.397, 1.397, 1.398, 1.399, 1.401, 1.399, 1.397, 1.399, 1.402, + 1.393, 1.395, 1.396, 1.398, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.401, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.398, 1.398, 1.399, 1.401, 1.401, 1.399, 1.398, 1.399, 1.402, + 1.398, 1.401, 1.401, 1.401, 1.401, 1.401, 1.402, 1.402, 1.402, 1.402, 1.403, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.402, 1.401, 1.401, 1.401, 1.401, 1.401, 1.399, 1.399, 1.401, 1.401, 1.401, 1.401, 1.399, 1.401, 1.406, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.405, 1.405, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.402, 1.403, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.403, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.402, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.405, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.405, 1.404, 1.404, 1.404, 1.404, 1.405, 1.404, 1.405, 1.405, 1.405, 1.406, 1.406, 1.404, 1.405, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.406, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.406, 1.407, 1.407, 1.406, 1.405, 1.405, 1.412, + 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.407, 1.407, 1.408, 1.408, 1.407, 1.405, 1.405, 1.412, + 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.405, 1.405, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.407, 1.405, 1.405, 1.413, + 1.402, 1.402, 1.402, 1.402, 1.402, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.403, 1.403, 1.402, 1.402, 1.402, 1.403, 1.403, 1.404, 1.405, 1.406, 1.406, 1.407, 1.408, 1.409, 1.409, 1.408, 1.407, 1.405, 1.405, 1.414, + 1.402, 1.402, 1.402, 1.402, 1.403, 1.403, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.403, 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.403, 1.404, 1.405, 1.406, 1.407, 1.409, 1.409, 1.409, 1.409, 1.407, 1.405, 1.405, 1.413, + 1.402, 1.402, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.401, 1.401, 1.399, 1.399, 1.401, 1.402, 1.403, 1.404, 1.405, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.408, 1.405, 1.405, 1.413, + 1.402, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.402, 1.401, 1.399, 1.398, 1.398, 1.399, 1.399, 1.401, 1.403, 1.404, 1.405, 1.407, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.401, 1.398, 1.397, 1.397, 1.398, 1.399, 1.401, 1.403, 1.404, 1.405, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.399, 1.397, 1.396, 1.396, 1.397, 1.399, 1.401, 1.403, 1.404, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.399, 1.397, 1.396, 1.396, 1.397, 1.398, 1.401, 1.403, 1.406, 1.407, 1.409, 1.409, 1.411, 1.409, 1.409, 1.409, 1.408, 1.407, 1.407, 1.413, + 1.403, 1.404, 1.404, 1.403, 1.403, 1.404, 1.404, 1.405, 1.404, 1.404, 1.403, 1.402, 1.399, 1.398, 1.397, 1.397, 1.398, 1.399, 1.402, 1.404, 1.406, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.407, 1.407, 1.414, + 1.403, 1.403, 1.404, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.403, 1.403, 1.402, 1.401, 1.399, 1.398, 1.398, 1.398, 1.401, 1.403, 1.404, 1.408, 1.408, 1.409, 1.409, 1.409, 1.411, 1.411, 1.409, 1.408, 1.407, 1.407, 1.415, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.403, 1.403, 1.403, 1.401, 1.401, 1.399, 1.399, 1.401, 1.402, 1.404, 1.407, 1.408, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.407, 1.407, 1.415, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.403, 1.403, 1.403, 1.402, 1.401, 1.401, 1.401, 1.402, 1.404, 1.406, 1.407, 1.408, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.409, 1.409, 1.408, 1.408, 1.415, + 1.402, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.406, 1.408, 1.408, 1.409, 1.411, 1.411, 1.411, 1.411, 1.409, 1.409, 1.409, 1.408, 1.408, 1.416, + 1.403, 1.402, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.403, 1.404, 1.404, 1.404, 1.405, 1.406, 1.407, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.416, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.406, 1.407, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.406, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.404, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.407, 1.407, 1.416, + 1.402, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.406, 1.407, 1.407, 1.407, 1.408, 1.409, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.409, 1.407, 1.407, 1.417, + 1.402, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.409, 1.411, 1.411, 1.411, 1.412, 1.411, 1.409, 1.407, 1.407, 1.415, + 1.402, 1.402, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.407, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.412, 1.411, 1.409, 1.407, 1.407, 1.413, + 1.402, 1.402, 1.403, 1.403, 1.405, 1.406, 1.406, 1.406, 1.406, 1.406, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.412, 1.412, 1.413, 1.413, 1.411, 1.408, 1.411, 1.413, + 1.406, 1.406, 1.408, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.411, 1.411, 1.414, 1.414, 1.414, 1.414, 1.415, 1.415, 1.415, 1.415, 1.416, 1.416, 1.416, 1.417, 1.418, 1.418, 1.417, 1.417, 1.414, 1.411, 1.413, 1.413 + ] + } + ], + "luminance_lut": + [ + 1.554, 1.522, 1.466, 1.422, 1.385, 1.351, 1.322, 1.294, 1.269, 1.246, 1.228, 1.214, 1.207, 1.202, 1.199, 1.199, 1.199, 1.199, 1.202, 1.207, 1.218, 1.235, 1.255, 1.279, 1.305, 1.333, 1.365, 1.402, 1.447, 1.508, 1.602, 1.638, + 1.522, 1.478, 1.431, 1.391, 1.355, 1.323, 1.298, 1.271, 1.247, 1.228, 1.212, 1.199, 1.187, 1.179, 1.173, 1.172, 1.172, 1.174, 1.179, 1.189, 1.201, 1.216, 1.235, 1.256, 1.282, 1.308, 1.335, 1.368, 1.411, 1.461, 1.535, 1.602, + 1.479, 1.449, 1.407, 1.367, 1.332, 1.301, 1.271, 1.247, 1.226, 1.208, 1.191, 1.178, 1.166, 1.158, 1.153, 1.151, 1.151, 1.153, 1.159, 1.168, 1.179, 1.194, 1.212, 1.234, 1.256, 1.282, 1.311, 1.343, 1.382, 1.427, 1.489, 1.535, + 1.454, 1.423, 1.383, 1.345, 1.309, 1.278, 1.249, 1.226, 1.206, 1.187, 1.171, 1.158, 1.146, 1.138, 1.132, 1.129, 1.129, 1.133, 1.139, 1.147, 1.159, 1.173, 1.191, 1.212, 1.234, 1.261, 1.288, 1.321, 1.357, 1.401, 1.455, 1.489, + 1.433, 1.401, 1.362, 1.325, 1.289, 1.258, 1.231, 1.206, 1.187, 1.169, 1.153, 1.138, 1.129, 1.121, 1.115, 1.112, 1.112, 1.114, 1.121, 1.129, 1.141, 1.155, 1.172, 1.191, 1.214, 1.241, 1.269, 1.301, 1.337, 1.377, 1.428, 1.457, + 1.415, 1.382, 1.343, 1.306, 1.273, 1.241, 1.213, 1.189, 1.169, 1.153, 1.137, 1.123, 1.112, 1.105, 1.097, 1.095, 1.095, 1.098, 1.103, 1.112, 1.124, 1.139, 1.155, 1.173, 1.197, 1.222, 1.252, 1.282, 1.317, 1.356, 1.405, 1.434, + 1.398, 1.363, 1.325, 1.289, 1.256, 1.224, 1.198, 1.175, 1.155, 1.137, 1.123, 1.108, 1.097, 1.089, 1.083, 1.079, 1.079, 1.083, 1.088, 1.097, 1.109, 1.124, 1.139, 1.158, 1.181, 1.206, 1.234, 1.266, 1.299, 1.339, 1.384, 1.415, + 1.382, 1.347, 1.309, 1.274, 1.242, 1.211, 1.185, 1.162, 1.142, 1.124, 1.108, 1.095, 1.083, 1.075, 1.069, 1.066, 1.066, 1.068, 1.074, 1.083, 1.096, 1.109, 1.125, 1.145, 1.166, 1.191, 1.219, 1.251, 1.285, 1.324, 1.367, 1.399, + 1.369, 1.334, 1.296, 1.261, 1.228, 1.199, 1.173, 1.151, 1.131, 1.112, 1.095, 1.083, 1.071, 1.062, 1.056, 1.053, 1.053, 1.055, 1.061, 1.069, 1.083, 1.096, 1.112, 1.132, 1.153, 1.178, 1.206, 1.237, 1.271, 1.309, 1.353, 1.385, + 1.359, 1.321, 1.284, 1.251, 1.217, 1.189, 1.164, 1.141, 1.121, 1.102, 1.086, 1.071, 1.061, 1.049, 1.045, 1.042, 1.042, 1.043, 1.051, 1.061, 1.069, 1.085, 1.101, 1.121, 1.143, 1.167, 1.195, 1.225, 1.259, 1.298, 1.341, 1.375, + 1.351, 1.312, 1.275, 1.241, 1.209, 1.181, 1.155, 1.133, 1.112, 1.092, 1.076, 1.061, 1.049, 1.041, 1.034, 1.032, 1.032, 1.035, 1.041, 1.051, 1.061, 1.075, 1.092, 1.112, 1.133, 1.158, 1.185, 1.216, 1.249, 1.288, 1.331, 1.364, + 1.344, 1.303, 1.267, 1.233, 1.201, 1.173, 1.147, 1.124, 1.104, 1.085, 1.067, 1.053, 1.041, 1.033, 1.024, 1.022, 1.022, 1.025, 1.034, 1.041, 1.053, 1.066, 1.083, 1.103, 1.126, 1.149, 1.177, 1.207, 1.241, 1.279, 1.321, 1.357, + 1.339, 1.297, 1.261, 1.226, 1.194, 1.166, 1.142, 1.119, 1.098, 1.078, 1.061, 1.046, 1.034, 1.024, 1.017, 1.014, 1.014, 1.017, 1.025, 1.034, 1.046, 1.059, 1.077, 1.096, 1.118, 1.143, 1.169, 1.201, 1.235, 1.273, 1.314, 1.352, + 1.337, 1.293, 1.256, 1.223, 1.191, 1.163, 1.136, 1.114, 1.093, 1.074, 1.056, 1.041, 1.027, 1.017, 1.012, 1.006, 1.006, 1.013, 1.017, 1.028, 1.041, 1.055, 1.072, 1.092, 1.114, 1.138, 1.165, 1.195, 1.229, 1.268, 1.309, 1.348, + 1.337, 1.291, 1.253, 1.219, 1.187, 1.159, 1.133, 1.109, 1.089, 1.071, 1.053, 1.037, 1.023, 1.012, 1.006, 1.002, 1.003, 1.006, 1.013, 1.023, 1.038, 1.052, 1.069, 1.089, 1.111, 1.135, 1.161, 1.192, 1.226, 1.264, 1.306, 1.348, + 1.337, 1.291, 1.253, 1.218, 1.186, 1.157, 1.132, 1.109, 1.088, 1.068, 1.049, 1.035, 1.021, 1.009, 1.001, 1.001, 1.001, 1.003, 1.011, 1.021, 1.035, 1.051, 1.069, 1.087, 1.109, 1.133, 1.161, 1.189, 1.224, 1.262, 1.304, 1.347, + 1.341, 1.292, 1.253, 1.218, 1.186, 1.157, 1.132, 1.109, 1.088, 1.068, 1.049, 1.034, 1.021, 1.009, 1.001, 1.001, 1.001, 1.003, 1.011, 1.021, 1.035, 1.051, 1.069, 1.087, 1.109, 1.133, 1.161, 1.189, 1.224, 1.262, 1.304, 1.347, + 1.348, 1.298, 1.255, 1.219, 1.188, 1.159, 1.134, 1.111, 1.088, 1.069, 1.051, 1.035, 1.021, 1.009, 1.003, 1.001, 1.002, 1.004, 1.011, 1.022, 1.036, 1.053, 1.071, 1.089, 1.111, 1.135, 1.162, 1.191, 1.226, 1.264, 1.306, 1.347, + 1.354, 1.306, 1.258, 1.222, 1.191, 1.162, 1.135, 1.113, 1.092, 1.073, 1.054, 1.038, 1.024, 1.014, 1.008, 1.003, 1.004, 1.008, 1.014, 1.026, 1.039, 1.056, 1.073, 1.093, 1.115, 1.139, 1.165, 1.195, 1.229, 1.267, 1.309, 1.349, + 1.358, 1.312, 1.263, 1.227, 1.195, 1.167, 1.141, 1.117, 1.097, 1.078, 1.061, 1.043, 1.029, 1.021, 1.014, 1.008, 1.008, 1.014, 1.021, 1.032, 1.045, 1.061, 1.078, 1.097, 1.119, 1.144, 1.169, 1.201, 1.234, 1.272, 1.315, 1.353, + 1.364, 1.319, 1.269, 1.234, 1.201, 1.174, 1.148, 1.124, 1.103, 1.084, 1.067, 1.052, 1.038, 1.029, 1.021, 1.016, 1.016, 1.021, 1.029, 1.038, 1.051, 1.067, 1.084, 1.103, 1.126, 1.151, 1.176, 1.207, 1.241, 1.279, 1.321, 1.358, + 1.371, 1.326, 1.277, 1.242, 1.209, 1.181, 1.155, 1.132, 1.111, 1.092, 1.075, 1.061, 1.049, 1.038, 1.029, 1.027, 1.027, 1.029, 1.038, 1.047, 1.061, 1.075, 1.092, 1.111, 1.133, 1.157, 1.185, 1.213, 1.247, 1.286, 1.329, 1.365, + 1.379, 1.334, 1.287, 1.251, 1.219, 1.191, 1.164, 1.141, 1.119, 1.101, 1.085, 1.071, 1.061, 1.049, 1.041, 1.038, 1.038, 1.041, 1.047, 1.059, 1.071, 1.084, 1.101, 1.119, 1.141, 1.165, 1.193, 1.223, 1.257, 1.295, 1.338, 1.374, + 1.389, 1.343, 1.298, 1.262, 1.231, 1.201, 1.174, 1.151, 1.131, 1.111, 1.095, 1.083, 1.071, 1.061, 1.054, 1.051, 1.051, 1.054, 1.059, 1.071, 1.081, 1.094, 1.111, 1.129, 1.152, 1.176, 1.203, 1.235, 1.269, 1.307, 1.351, 1.384, + 1.401, 1.351, 1.311, 1.274, 1.242, 1.214, 1.187, 1.164, 1.142, 1.124, 1.108, 1.095, 1.083, 1.074, 1.068, 1.066, 1.066, 1.068, 1.073, 1.081, 1.094, 1.108, 1.123, 1.141, 1.164, 1.188, 1.215, 1.247, 1.281, 1.321, 1.364, 1.396, + 1.412, 1.366, 1.327, 1.289, 1.257, 1.227, 1.201, 1.176, 1.156, 1.137, 1.122, 1.108, 1.096, 1.088, 1.083, 1.081, 1.081, 1.082, 1.087, 1.095, 1.108, 1.122, 1.136, 1.154, 1.177, 1.201, 1.229, 1.261, 1.296, 1.337, 1.382, 1.409, + 1.421, 1.383, 1.343, 1.306, 1.273, 1.243, 1.216, 1.192, 1.169, 1.152, 1.137, 1.122, 1.111, 1.103, 1.098, 1.095, 1.095, 1.097, 1.102, 1.111, 1.123, 1.136, 1.152, 1.169, 1.191, 1.217, 1.246, 1.278, 1.314, 1.354, 1.399, 1.429, + 1.434, 1.402, 1.362, 1.324, 1.291, 1.261, 1.232, 1.208, 1.187, 1.168, 1.152, 1.138, 1.127, 1.119, 1.114, 1.112, 1.112, 1.115, 1.121, 1.128, 1.139, 1.152, 1.169, 1.186, 1.209, 1.234, 1.262, 1.295, 1.332, 1.372, 1.419, 1.451, + 1.453, 1.422, 1.382, 1.344, 1.309, 1.278, 1.249, 1.226, 1.204, 1.187, 1.168, 1.155, 1.144, 1.135, 1.131, 1.131, 1.131, 1.133, 1.138, 1.146, 1.157, 1.171, 1.186, 1.206, 1.227, 1.252, 1.281, 1.314, 1.351, 1.393, 1.442, 1.473, + 1.475, 1.446, 1.404, 1.366, 1.329, 1.298, 1.269, 1.245, 1.224, 1.204, 1.188, 1.174, 1.163, 1.154, 1.149, 1.148, 1.148, 1.152, 1.156, 1.164, 1.176, 1.189, 1.206, 1.226, 1.247, 1.274, 1.303, 1.336, 1.374, 1.417, 1.471, 1.505, + 1.503, 1.472, 1.428, 1.389, 1.353, 1.321, 1.291, 1.266, 1.245, 1.224, 1.207, 1.192, 1.183, 1.174, 1.169, 1.167, 1.168, 1.169, 1.175, 1.183, 1.195, 1.209, 1.226, 1.247, 1.267, 1.294, 1.325, 1.359, 1.397, 1.445, 1.505, 1.548, + 1.534, 1.503, 1.455, 1.413, 1.378, 1.344, 1.315, 1.289, 1.265, 1.243, 1.224, 1.207, 1.196, 1.192, 1.189, 1.189, 1.189, 1.189, 1.192, 1.198, 1.209, 1.226, 1.244, 1.266, 1.291, 1.318, 1.349, 1.383, 1.425, 1.475, 1.548, 1.591 + ], + "sigma": 0.00095, + "sigma_Cb": 0.00098 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2850, + "ccm": + [ + 1.97469, -0.71439, -0.26031, + -0.43521, 2.09769, -0.66248, + -0.04826, -0.84642, 1.89468 + ] + }, + { + "ct": 2960, + "ccm": + [ + 2.12952, -0.91185, -0.21768, + -0.38018, 1.90789, -0.52771, + 0.03988, -1.10079, 2.06092 + ] + }, + { + "ct": 3580, + "ccm": + [ + 2.03422, -0.80048, -0.23374, + -0.39089, 1.97221, -0.58132, + -0.08969, -0.61439, 1.70408 + ] + }, + { + "ct": 4559, + "ccm": + [ + 2.15423, -0.98143, -0.17279, + -0.38131, 2.14763, -0.76632, + -0.10069, -0.54383, 1.64452 + ] + }, + { + "ct": 5881, + "ccm": + [ + 2.18464, -0.95493, -0.22971, + -0.36826, 2.00298, -0.63471, + -0.15219, -0.38055, 1.53274 + ] + }, + { + "ct": 7600, + "ccm": + [ + 2.30687, -0.97295, -0.33392, + -0.30872, 2.32779, -1.01908, + -0.17761, -0.55891, 1.73651 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.cac": + { + "strength": 1.0, + "lut_rx": + [ + -0.34, -0.26, -0.18, -0.1, -0.02, 0.06, 0.13, 0.22, 0.37, + -0.36, -0.28, -0.19, -0.1, -0.02, 0.06, 0.13, 0.21, 0.36, + -0.37, -0.29, -0.19, -0.1, -0.02, 0.06, 0.13, 0.21, 0.36, + -0.38, -0.27, -0.18, -0.09, -0.01, 0.07, 0.14, 0.22, 0.36, + -0.36, -0.27, -0.18, -0.09, -0.01, 0.07, 0.15, 0.23, 0.38, + -0.35, -0.27, -0.18, -0.09, -0.01, 0.08, 0.15, 0.23, 0.39, + -0.34, -0.26, -0.18, -0.1, -0.01, 0.07, 0.15, 0.22, 0.39, + -0.33, -0.24, -0.17, -0.09, -0.01, 0.08, 0.15, 0.22, 0.37, + -0.3, -0.21, -0.14, -0.07, 0.0, 0.09, 0.16, 0.22, 0.36 + ], + "lut_ry": + [ + -0.22, -0.23, -0.26, -0.27, -0.27, -0.26, -0.24, -0.23, -0.22, + -0.18, -0.19, -0.21, -0.21, -0.22, -0.21, -0.19, -0.18, -0.16, + -0.15, -0.14, -0.16, -0.17, -0.18, -0.17, -0.16, -0.14, -0.11, + -0.09, -0.07, -0.08, -0.09, -0.1, -0.09, -0.08, -0.06, -0.06, + -0.02, 0.0, -0.01, -0.02, -0.03, -0.03, -0.01, 0.01, 0.01, + 0.05, 0.06, 0.04, 0.03, 0.03, 0.03, 0.04, 0.06, 0.07, + 0.09, 0.1, 0.09, 0.08, 0.07, 0.07, 0.09, 0.1, 0.12, + 0.14, 0.16, 0.15, 0.15, 0.15, 0.14, 0.15, 0.16, 0.16, + 0.24, 0.26, 0.25, 0.25, 0.26, 0.26, 0.26, 0.26, 0.25 + ], + "lut_bx": + [ + -0.03, -0.02, -0.0, 0.0, 0.02, 0.03, 0.04, 0.06, 0.11, + -0.03, -0.01, -0.0, -0.0, 0.01, 0.02, 0.04, 0.06, 0.11, + -0.03, -0.01, 0.0, 0.01, 0.01, 0.02, 0.04, 0.06, 0.1, + -0.03, -0.01, 0.0, 0.01, 0.01, 0.02, 0.04, 0.07, 0.12, + -0.03, -0.01, -0.0, 0.01, 0.01, 0.02, 0.04, 0.07, 0.13, + -0.03, -0.01, 0.0, 0.01, 0.02, 0.02, 0.04, 0.07, 0.14, + -0.03, -0.01, 0.0, 0.01, 0.02, 0.02, 0.04, 0.08, 0.15, + -0.03, -0.01, 0.0, 0.0, 0.01, 0.02, 0.04, 0.08, 0.16, + -0.02, -0.0, 0.0, -0.0, -0.01, 0.0, 0.03, 0.08, 0.16 + ], + "lut_by": + [ + -0.1, -0.07, -0.05, -0.04, -0.04, -0.04, -0.05, -0.08, -0.13, + -0.08, -0.06, -0.05, -0.04, -0.04, -0.04, -0.04, -0.06, -0.11, + -0.07, -0.04, -0.03, -0.03, -0.02, -0.02, -0.03, -0.04, -0.08, + -0.06, -0.04, -0.02, -0.02, -0.02, -0.02, -0.02, -0.04, -0.06, + -0.04, -0.01, 0.0, 0.02, 0.02, 0.01, 0.0, -0.01, -0.06, + -0.02, 0.01, 0.02, 0.03, 0.04, 0.04, 0.03, 0.01, -0.04, + -0.0, 0.02, 0.04, 0.05, 0.05, 0.05, 0.05, 0.03, -0.02, + 0.0, 0.02, 0.04, 0.05, 0.06, 0.05, 0.04, 0.04, 0.01, + -0.0, 0.02, 0.03, 0.04, 0.05, 0.04, 0.02, 0.03, 0.01 + ] + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": [ 0.0, 2.5, 0.01, 2.5, 0.06, 1.0, 1.0, 1.0 ], + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": [ 0.0, 2.5, 0.01, 2.5, 0.06, 1.0, 1.0, 1.0 ], + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx477_6mm.json b/src/ipa/rpi/pisp/data/imx477_6mm.json new file mode 100644 index 000000000..27268c233 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx477_6mm.json @@ -0,0 +1,1240 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 12000, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 740, + "reference_Y": 15051 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.809 + } + }, + { + "rpi.geq": + { + "offset": 204, + "slope": 0.0061 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2850.0, 0.4307, 0.3957, + 2960.0, 0.4159, 0.4313, + 3580.0, 0.3771, 0.5176, + 4559.0, 0.3031, 0.6573, + 5881.0, 0.2809, 0.6942, + 7600.0, 0.2263, 0.7762 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.02634, + "transverse_neg": 0.02255 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 2.359, 2.354, 2.351, 2.351, 2.343, 2.337, 2.331, 2.325, 2.323, 2.321, 2.317, 2.315, 2.313, 2.313, 2.311, 2.312, 2.312, 2.313, 2.315, 2.315, 2.316, 2.317, 2.319, 2.323, 2.326, 2.329, 2.332, 2.332, 2.335, 2.337, 2.352, 2.363, + 2.352, 2.351, 2.349, 2.346, 2.342, 2.334, 2.328, 2.324, 2.321, 2.317, 2.315, 2.314, 2.312, 2.311, 2.311, 2.311, 2.311, 2.311, 2.312, 2.314, 2.315, 2.316, 2.317, 2.319, 2.324, 2.326, 2.328, 2.329, 2.331, 2.337, 2.348, 2.355, + 2.346, 2.346, 2.345, 2.344, 2.338, 2.329, 2.325, 2.319, 2.316, 2.314, 2.311, 2.309, 2.308, 2.306, 2.304, 2.304, 2.305, 2.307, 2.308, 2.309, 2.311, 2.311, 2.313, 2.316, 2.319, 2.322, 2.325, 2.326, 2.328, 2.335, 2.343, 2.349, + 2.342, 2.342, 2.341, 2.338, 2.332, 2.326, 2.319, 2.316, 2.312, 2.309, 2.308, 2.305, 2.303, 2.302, 2.301, 2.301, 2.302, 2.303, 2.304, 2.305, 2.305, 2.307, 2.311, 2.313, 2.315, 2.319, 2.321, 2.325, 2.328, 2.333, 2.338, 2.348, + 2.337, 2.337, 2.337, 2.336, 2.331, 2.322, 2.317, 2.312, 2.309, 2.307, 2.304, 2.302, 2.299, 2.299, 2.298, 2.298, 2.299, 2.299, 2.301, 2.302, 2.302, 2.304, 2.305, 2.309, 2.314, 2.316, 2.321, 2.324, 2.326, 2.329, 2.335, 2.343, + 2.335, 2.334, 2.333, 2.333, 2.326, 2.318, 2.313, 2.309, 2.306, 2.302, 2.299, 2.297, 2.297, 2.296, 2.295, 2.295, 2.294, 2.295, 2.296, 2.298, 2.298, 2.301, 2.303, 2.305, 2.311, 2.315, 2.319, 2.323, 2.325, 2.329, 2.333, 2.339, + 2.329, 2.331, 2.329, 2.329, 2.325, 2.315, 2.309, 2.306, 2.302, 2.299, 2.297, 2.295, 2.293, 2.292, 2.291, 2.291, 2.291, 2.291, 2.293, 2.294, 2.296, 2.298, 2.301, 2.304, 2.307, 2.313, 2.317, 2.319, 2.323, 2.327, 2.331, 2.339, + 2.329, 2.328, 2.328, 2.328, 2.321, 2.313, 2.307, 2.303, 2.299, 2.295, 2.294, 2.292, 2.289, 2.289, 2.288, 2.288, 2.288, 2.289, 2.289, 2.292, 2.294, 2.295, 2.297, 2.301, 2.306, 2.311, 2.315, 2.318, 2.319, 2.323, 2.329, 2.335, + 2.326, 2.327, 2.325, 2.325, 2.319, 2.311, 2.305, 2.299, 2.296, 2.293, 2.291, 2.289, 2.288, 2.287, 2.285, 2.285, 2.286, 2.288, 2.288, 2.289, 2.291, 2.294, 2.295, 2.298, 2.304, 2.308, 2.313, 2.315, 2.317, 2.319, 2.327, 2.335, + 2.325, 2.325, 2.323, 2.323, 2.317, 2.309, 2.303, 2.298, 2.294, 2.292, 2.289, 2.287, 2.286, 2.285, 2.284, 2.284, 2.284, 2.285, 2.287, 2.289, 2.291, 2.291, 2.294, 2.297, 2.302, 2.305, 2.309, 2.313, 2.315, 2.317, 2.325, 2.334, + 2.322, 2.324, 2.322, 2.322, 2.316, 2.306, 2.301, 2.296, 2.292, 2.289, 2.287, 2.286, 2.285, 2.284, 2.283, 2.283, 2.283, 2.284, 2.286, 2.288, 2.289, 2.291, 2.293, 2.296, 2.301, 2.304, 2.308, 2.311, 2.312, 2.315, 2.323, 2.333, + 2.321, 2.323, 2.322, 2.322, 2.314, 2.306, 2.299, 2.294, 2.291, 2.288, 2.286, 2.285, 2.284, 2.282, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.289, 2.291, 2.291, 2.294, 2.297, 2.302, 2.306, 2.308, 2.311, 2.312, 2.322, 2.332, + 2.319, 2.321, 2.321, 2.321, 2.314, 2.305, 2.297, 2.293, 2.289, 2.287, 2.285, 2.284, 2.283, 2.281, 2.281, 2.281, 2.282, 2.283, 2.283, 2.285, 2.287, 2.289, 2.291, 2.292, 2.297, 2.301, 2.305, 2.307, 2.309, 2.312, 2.321, 2.333, + 2.319, 2.321, 2.319, 2.319, 2.314, 2.303, 2.296, 2.293, 2.289, 2.286, 2.285, 2.283, 2.282, 2.281, 2.281, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.288, 2.289, 2.291, 2.296, 2.301, 2.305, 2.307, 2.308, 2.312, 2.321, 2.332, + 2.319, 2.321, 2.319, 2.319, 2.313, 2.303, 2.296, 2.291, 2.289, 2.286, 2.284, 2.282, 2.281, 2.281, 2.281, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.287, 2.288, 2.291, 2.295, 2.299, 2.304, 2.306, 2.307, 2.311, 2.321, 2.332, + 2.319, 2.321, 2.319, 2.319, 2.313, 2.303, 2.297, 2.292, 2.289, 2.287, 2.285, 2.282, 2.281, 2.281, 2.282, 2.282, 2.282, 2.282, 2.283, 2.284, 2.285, 2.286, 2.288, 2.291, 2.295, 2.299, 2.303, 2.306, 2.307, 2.312, 2.321, 2.331, + 2.318, 2.319, 2.319, 2.319, 2.313, 2.303, 2.297, 2.292, 2.289, 2.286, 2.285, 2.282, 2.281, 2.281, 2.281, 2.282, 2.282, 2.282, 2.282, 2.283, 2.285, 2.286, 2.287, 2.291, 2.294, 2.298, 2.303, 2.306, 2.307, 2.311, 2.321, 2.331, + 2.319, 2.319, 2.319, 2.319, 2.313, 2.302, 2.297, 2.292, 2.289, 2.287, 2.285, 2.283, 2.282, 2.281, 2.281, 2.282, 2.283, 2.283, 2.283, 2.283, 2.285, 2.286, 2.287, 2.289, 2.294, 2.297, 2.303, 2.305, 2.308, 2.313, 2.321, 2.331, + 2.319, 2.319, 2.319, 2.319, 2.313, 2.303, 2.299, 2.293, 2.291, 2.287, 2.285, 2.283, 2.282, 2.281, 2.281, 2.282, 2.283, 2.283, 2.283, 2.283, 2.285, 2.286, 2.288, 2.291, 2.294, 2.298, 2.304, 2.306, 2.308, 2.312, 2.322, 2.331, + 2.319, 2.321, 2.321, 2.321, 2.315, 2.305, 2.301, 2.295, 2.292, 2.289, 2.286, 2.285, 2.283, 2.282, 2.282, 2.282, 2.284, 2.283, 2.284, 2.284, 2.285, 2.287, 2.288, 2.291, 2.294, 2.299, 2.304, 2.306, 2.309, 2.313, 2.322, 2.334, + 2.321, 2.322, 2.322, 2.322, 2.317, 2.307, 2.301, 2.296, 2.292, 2.291, 2.288, 2.286, 2.285, 2.284, 2.283, 2.284, 2.285, 2.284, 2.285, 2.285, 2.287, 2.288, 2.289, 2.293, 2.297, 2.301, 2.305, 2.308, 2.311, 2.314, 2.323, 2.335, + 2.322, 2.324, 2.324, 2.324, 2.319, 2.309, 2.303, 2.297, 2.295, 2.292, 2.291, 2.288, 2.286, 2.286, 2.285, 2.286, 2.286, 2.286, 2.287, 2.288, 2.289, 2.289, 2.291, 2.294, 2.299, 2.302, 2.307, 2.311, 2.312, 2.316, 2.325, 2.335, + 2.324, 2.326, 2.325, 2.326, 2.321, 2.311, 2.305, 2.301, 2.297, 2.295, 2.293, 2.291, 2.289, 2.289, 2.288, 2.288, 2.287, 2.288, 2.289, 2.291, 2.292, 2.292, 2.295, 2.299, 2.301, 2.304, 2.309, 2.312, 2.315, 2.319, 2.327, 2.337, + 2.329, 2.329, 2.328, 2.328, 2.323, 2.315, 2.308, 2.304, 2.301, 2.298, 2.296, 2.294, 2.291, 2.291, 2.289, 2.291, 2.291, 2.291, 2.292, 2.293, 2.294, 2.295, 2.297, 2.299, 2.303, 2.308, 2.312, 2.315, 2.318, 2.321, 2.329, 2.339, + 2.329, 2.331, 2.332, 2.332, 2.326, 2.318, 2.311, 2.306, 2.304, 2.301, 2.299, 2.297, 2.295, 2.293, 2.292, 2.292, 2.292, 2.293, 2.294, 2.294, 2.296, 2.297, 2.299, 2.302, 2.306, 2.311, 2.315, 2.318, 2.319, 2.324, 2.332, 2.342, + 2.331, 2.333, 2.334, 2.334, 2.328, 2.321, 2.313, 2.308, 2.305, 2.303, 2.301, 2.299, 2.297, 2.295, 2.295, 2.295, 2.294, 2.296, 2.296, 2.297, 2.298, 2.299, 2.302, 2.305, 2.308, 2.314, 2.317, 2.321, 2.323, 2.327, 2.334, 2.346, + 2.331, 2.332, 2.334, 2.334, 2.329, 2.321, 2.314, 2.309, 2.306, 2.304, 2.303, 2.301, 2.299, 2.297, 2.295, 2.295, 2.296, 2.297, 2.298, 2.298, 2.299, 2.301, 2.303, 2.306, 2.309, 2.315, 2.319, 2.321, 2.324, 2.328, 2.337, 2.346, + 2.331, 2.332, 2.334, 2.334, 2.329, 2.321, 2.314, 2.311, 2.306, 2.304, 2.303, 2.302, 2.299, 2.297, 2.295, 2.295, 2.296, 2.297, 2.298, 2.298, 2.299, 2.301, 2.303, 2.306, 2.311, 2.314, 2.319, 2.323, 2.325, 2.329, 2.339, 2.348, + 2.329, 2.329, 2.329, 2.331, 2.326, 2.319, 2.312, 2.309, 2.304, 2.303, 2.302, 2.301, 2.298, 2.295, 2.294, 2.294, 2.295, 2.295, 2.296, 2.297, 2.299, 2.301, 2.302, 2.304, 2.308, 2.313, 2.319, 2.322, 2.325, 2.329, 2.339, 2.351, + 2.329, 2.329, 2.329, 2.329, 2.326, 2.317, 2.311, 2.308, 2.303, 2.302, 2.301, 2.298, 2.296, 2.295, 2.294, 2.294, 2.294, 2.294, 2.296, 2.297, 2.298, 2.299, 2.301, 2.304, 2.307, 2.312, 2.318, 2.322, 2.326, 2.331, 2.341, 2.355, + 2.339, 2.332, 2.331, 2.331, 2.327, 2.323, 2.316, 2.309, 2.306, 2.302, 2.301, 2.299, 2.297, 2.296, 2.295, 2.294, 2.294, 2.296, 2.297, 2.297, 2.299, 2.301, 2.303, 2.306, 2.308, 2.317, 2.322, 2.325, 2.329, 2.341, 2.353, 2.361, + 2.347, 2.347, 2.345, 2.343, 2.338, 2.332, 2.326, 2.322, 2.321, 2.318, 2.316, 2.315, 2.313, 2.312, 2.311, 2.311, 2.311, 2.311, 2.312, 2.315, 2.317, 2.318, 2.319, 2.323, 2.324, 2.329, 2.334, 2.337, 2.344, 2.347, 2.361, 2.364 + ] + }, + { + "ct": 5000, + "table": + [ + 3.869, 3.852, 3.844, 3.842, 3.836, 3.821, 3.807, 3.796, 3.789, 3.784, 3.778, 3.775, 3.769, 3.768, 3.765, 3.765, 3.767, 3.769, 3.772, 3.774, 3.773, 3.775, 3.779, 3.787, 3.793, 3.801, 3.806, 3.804, 3.813, 3.819, 3.855, 3.879, + 3.854, 3.844, 3.837, 3.836, 3.824, 3.811, 3.797, 3.789, 3.784, 3.777, 3.774, 3.769, 3.764, 3.758, 3.757, 3.758, 3.758, 3.761, 3.763, 3.764, 3.765, 3.766, 3.772, 3.778, 3.787, 3.792, 3.794, 3.798, 3.802, 3.815, 3.839, 3.873, + 3.838, 3.831, 3.826, 3.823, 3.813, 3.799, 3.787, 3.781, 3.773, 3.768, 3.763, 3.759, 3.753, 3.749, 3.745, 3.745, 3.745, 3.752, 3.754, 3.757, 3.757, 3.759, 3.763, 3.769, 3.773, 3.781, 3.786, 3.792, 3.798, 3.811, 3.831, 3.861, + 3.833, 3.822, 3.817, 3.816, 3.804, 3.788, 3.779, 3.772, 3.766, 3.759, 3.755, 3.749, 3.744, 3.741, 3.738, 3.739, 3.739, 3.741, 3.743, 3.747, 3.749, 3.751, 3.756, 3.764, 3.769, 3.776, 3.783, 3.789, 3.798, 3.809, 3.821, 3.855, + 3.824, 3.818, 3.808, 3.808, 3.797, 3.781, 3.772, 3.764, 3.757, 3.752, 3.747, 3.743, 3.737, 3.735, 3.733, 3.733, 3.733, 3.735, 3.737, 3.738, 3.741, 3.746, 3.749, 3.755, 3.766, 3.771, 3.781, 3.789, 3.794, 3.806, 3.818, 3.849, + 3.815, 3.808, 3.799, 3.801, 3.787, 3.775, 3.767, 3.757, 3.751, 3.745, 3.738, 3.734, 3.732, 3.727, 3.725, 3.723, 3.722, 3.722, 3.726, 3.729, 3.734, 3.738, 3.744, 3.749, 3.759, 3.769, 3.781, 3.788, 3.792, 3.799, 3.811, 3.841, + 3.804, 3.799, 3.793, 3.793, 3.783, 3.771, 3.759, 3.751, 3.744, 3.735, 3.732, 3.727, 3.723, 3.721, 3.719, 3.716, 3.716, 3.716, 3.718, 3.722, 3.727, 3.731, 3.737, 3.746, 3.756, 3.767, 3.776, 3.782, 3.788, 3.795, 3.808, 3.831, + 3.802, 3.797, 3.787, 3.787, 3.779, 3.762, 3.753, 3.744, 3.734, 3.727, 3.725, 3.721, 3.716, 3.714, 3.709, 3.709, 3.711, 3.711, 3.712, 3.717, 3.722, 3.725, 3.731, 3.739, 3.752, 3.762, 3.772, 3.778, 3.779, 3.789, 3.798, 3.826, + 3.791, 3.789, 3.784, 3.784, 3.775, 3.759, 3.746, 3.735, 3.729, 3.724, 3.718, 3.714, 3.712, 3.707, 3.704, 3.704, 3.706, 3.708, 3.709, 3.711, 3.716, 3.722, 3.726, 3.735, 3.746, 3.754, 3.767, 3.774, 3.777, 3.781, 3.794, 3.824, + 3.789, 3.784, 3.779, 3.781, 3.771, 3.753, 3.741, 3.732, 3.725, 3.719, 3.715, 3.711, 3.707, 3.704, 3.701, 3.701, 3.702, 3.704, 3.708, 3.709, 3.713, 3.718, 3.724, 3.731, 3.742, 3.749, 3.761, 3.768, 3.772, 3.778, 3.791, 3.822, + 3.789, 3.781, 3.777, 3.777, 3.764, 3.749, 3.739, 3.729, 3.722, 3.718, 3.711, 3.708, 3.705, 3.701, 3.699, 3.699, 3.699, 3.701, 3.705, 3.707, 3.711, 3.715, 3.721, 3.727, 3.738, 3.746, 3.757, 3.763, 3.765, 3.773, 3.788, 3.821, + 3.785, 3.779, 3.774, 3.774, 3.764, 3.747, 3.736, 3.726, 3.719, 3.711, 3.709, 3.706, 3.701, 3.698, 3.696, 3.695, 3.695, 3.698, 3.702, 3.704, 3.707, 3.712, 3.718, 3.725, 3.734, 3.741, 3.753, 3.756, 3.759, 3.764, 3.784, 3.818, + 3.779, 3.776, 3.773, 3.773, 3.759, 3.744, 3.733, 3.724, 3.714, 3.709, 3.706, 3.704, 3.699, 3.696, 3.694, 3.694, 3.694, 3.697, 3.701, 3.703, 3.706, 3.709, 3.714, 3.721, 3.731, 3.737, 3.749, 3.753, 3.758, 3.762, 3.783, 3.819, + 3.779, 3.776, 3.769, 3.769, 3.757, 3.741, 3.729, 3.721, 3.712, 3.708, 3.705, 3.701, 3.697, 3.695, 3.694, 3.694, 3.695, 3.696, 3.698, 3.702, 3.705, 3.709, 3.712, 3.717, 3.728, 3.736, 3.749, 3.752, 3.756, 3.761, 3.781, 3.815, + 3.779, 3.773, 3.768, 3.768, 3.756, 3.738, 3.731, 3.719, 3.711, 3.707, 3.703, 3.698, 3.695, 3.694, 3.694, 3.695, 3.695, 3.695, 3.696, 3.702, 3.705, 3.708, 3.712, 3.717, 3.728, 3.736, 3.747, 3.751, 3.754, 3.761, 3.781, 3.815, + 3.782, 3.773, 3.767, 3.767, 3.755, 3.738, 3.728, 3.721, 3.711, 3.707, 3.701, 3.698, 3.695, 3.693, 3.694, 3.696, 3.695, 3.695, 3.695, 3.701, 3.703, 3.706, 3.711, 3.715, 3.726, 3.735, 3.745, 3.751, 3.754, 3.763, 3.779, 3.815, + 3.781, 3.771, 3.767, 3.767, 3.754, 3.739, 3.726, 3.721, 3.712, 3.706, 3.701, 3.698, 3.695, 3.693, 3.693, 3.695, 3.695, 3.695, 3.696, 3.698, 3.703, 3.705, 3.709, 3.715, 3.725, 3.734, 3.745, 3.751, 3.755, 3.762, 3.783, 3.818, + 3.781, 3.774, 3.767, 3.767, 3.755, 3.741, 3.729, 3.722, 3.712, 3.708, 3.701, 3.699, 3.695, 3.693, 3.693, 3.694, 3.695, 3.695, 3.697, 3.698, 3.702, 3.704, 3.709, 3.713, 3.725, 3.732, 3.746, 3.751, 3.756, 3.763, 3.783, 3.821, + 3.781, 3.774, 3.769, 3.769, 3.756, 3.741, 3.731, 3.724, 3.713, 3.711, 3.707, 3.699, 3.697, 3.694, 3.693, 3.694, 3.695, 3.695, 3.697, 3.698, 3.702, 3.704, 3.709, 3.713, 3.724, 3.734, 3.747, 3.751, 3.756, 3.765, 3.784, 3.821, + 3.784, 3.776, 3.773, 3.773, 3.759, 3.742, 3.733, 3.726, 3.719, 3.711, 3.709, 3.703, 3.698, 3.695, 3.694, 3.695, 3.697, 3.696, 3.698, 3.699, 3.703, 3.706, 3.711, 3.714, 3.727, 3.735, 3.746, 3.751, 3.757, 3.766, 3.787, 3.822, + 3.786, 3.783, 3.774, 3.774, 3.766, 3.747, 3.737, 3.727, 3.722, 3.716, 3.711, 3.706, 3.702, 3.698, 3.697, 3.698, 3.699, 3.699, 3.701, 3.703, 3.706, 3.711, 3.713, 3.719, 3.731, 3.739, 3.748, 3.753, 3.761, 3.769, 3.789, 3.826, + 3.786, 3.784, 3.779, 3.779, 3.769, 3.751, 3.742, 3.732, 3.725, 3.719, 3.715, 3.711, 3.706, 3.704, 3.701, 3.701, 3.702, 3.702, 3.705, 3.707, 3.712, 3.714, 3.717, 3.724, 3.733, 3.743, 3.749, 3.758, 3.764, 3.769, 3.791, 3.826, + 3.793, 3.787, 3.782, 3.782, 3.774, 3.756, 3.747, 3.737, 3.729, 3.725, 3.719, 3.715, 3.712, 3.708, 3.707, 3.706, 3.707, 3.708, 3.709, 3.713, 3.714, 3.717, 3.723, 3.729, 3.736, 3.747, 3.757, 3.764, 3.768, 3.774, 3.794, 3.829, + 3.794, 3.791, 3.786, 3.786, 3.779, 3.762, 3.751, 3.742, 3.735, 3.729, 3.725, 3.719, 3.716, 3.711, 3.709, 3.709, 3.709, 3.711, 3.716, 3.717, 3.721, 3.723, 3.726, 3.732, 3.741, 3.752, 3.761, 3.767, 3.773, 3.779, 3.801, 3.829, + 3.802, 3.798, 3.793, 3.793, 3.779, 3.766, 3.754, 3.746, 3.741, 3.736, 3.731, 3.726, 3.719, 3.717, 3.716, 3.715, 3.716, 3.717, 3.719, 3.721, 3.724, 3.726, 3.731, 3.737, 3.744, 3.756, 3.766, 3.772, 3.776, 3.784, 3.807, 3.839, + 3.805, 3.799, 3.795, 3.795, 3.784, 3.767, 3.757, 3.749, 3.744, 3.739, 3.736, 3.731, 3.726, 3.722, 3.719, 3.719, 3.719, 3.721, 3.723, 3.725, 3.727, 3.732, 3.738, 3.742, 3.751, 3.761, 3.771, 3.775, 3.782, 3.789, 3.811, 3.841, + 3.804, 3.801, 3.799, 3.799, 3.787, 3.772, 3.761, 3.752, 3.746, 3.742, 3.739, 3.735, 3.729, 3.726, 3.723, 3.724, 3.725, 3.726, 3.727, 3.728, 3.732, 3.736, 3.739, 3.745, 3.754, 3.765, 3.775, 3.779, 3.785, 3.795, 3.816, 3.844, + 3.801, 3.799, 3.796, 3.796, 3.787, 3.773, 3.761, 3.753, 3.746, 3.743, 3.739, 3.735, 3.731, 3.726, 3.725, 3.725, 3.725, 3.726, 3.727, 3.729, 3.733, 3.736, 3.741, 3.745, 3.755, 3.766, 3.776, 3.783, 3.786, 3.797, 3.819, 3.851, + 3.799, 3.795, 3.788, 3.788, 3.783, 3.772, 3.759, 3.749, 3.744, 3.738, 3.735, 3.733, 3.726, 3.724, 3.722, 3.722, 3.723, 3.724, 3.725, 3.727, 3.729, 3.733, 3.736, 3.742, 3.754, 3.762, 3.772, 3.779, 3.784, 3.796, 3.821, 3.859, + 3.799, 3.789, 3.787, 3.788, 3.779, 3.766, 3.755, 3.749, 3.742, 3.736, 3.733, 3.727, 3.723, 3.722, 3.721, 3.719, 3.719, 3.721, 3.725, 3.726, 3.728, 3.732, 3.734, 3.741, 3.747, 3.758, 3.771, 3.778, 3.785, 3.796, 3.825, 3.862, + 3.824, 3.799, 3.789, 3.789, 3.788, 3.777, 3.761, 3.751, 3.743, 3.739, 3.736, 3.728, 3.726, 3.725, 3.721, 3.719, 3.721, 3.723, 3.727, 3.728, 3.729, 3.733, 3.737, 3.744, 3.755, 3.769, 3.776, 3.784, 3.793, 3.819, 3.863, 3.877, + 3.833, 3.833, 3.833, 3.842, 3.825, 3.815, 3.807, 3.799, 3.792, 3.788, 3.785, 3.782, 3.778, 3.777, 3.773, 3.772, 3.772, 3.774, 3.778, 3.779, 3.779, 3.785, 3.792, 3.798, 3.803, 3.811, 3.822, 3.834, 3.843, 3.846, 3.877, 3.886 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 2.616, 2.616, 2.618, 2.621, 2.619, 2.618, 2.615, 2.615, 2.613, 2.611, 2.609, 2.609, 2.609, 2.611, 2.611, 2.611, 2.611, 2.609, 2.608, 2.608, 2.611, 2.613, 2.613, 2.614, 2.614, 2.615, 2.615, 2.622, 2.624, 2.621, 2.624, 2.641, + 2.616, 2.618, 2.621, 2.623, 2.623, 2.619, 2.618, 2.616, 2.616, 2.613, 2.611, 2.611, 2.611, 2.611, 2.612, 2.612, 2.611, 2.611, 2.611, 2.611, 2.611, 2.612, 2.613, 2.612, 2.613, 2.615, 2.617, 2.621, 2.621, 2.619, 2.621, 2.641, + 2.621, 2.624, 2.627, 2.627, 2.625, 2.623, 2.621, 2.619, 2.618, 2.618, 2.618, 2.617, 2.616, 2.616, 2.615, 2.613, 2.612, 2.613, 2.613, 2.614, 2.614, 2.613, 2.614, 2.613, 2.614, 2.617, 2.619, 2.621, 2.621, 2.619, 2.623, 2.643, + 2.626, 2.627, 2.628, 2.629, 2.628, 2.625, 2.622, 2.621, 2.621, 2.622, 2.621, 2.619, 2.619, 2.618, 2.617, 2.616, 2.616, 2.616, 2.618, 2.618, 2.617, 2.617, 2.618, 2.619, 2.621, 2.623, 2.624, 2.626, 2.625, 2.624, 2.625, 2.654, + 2.627, 2.628, 2.628, 2.628, 2.626, 2.623, 2.622, 2.622, 2.622, 2.622, 2.621, 2.621, 2.619, 2.617, 2.617, 2.616, 2.617, 2.617, 2.618, 2.619, 2.618, 2.618, 2.618, 2.621, 2.622, 2.624, 2.626, 2.627, 2.627, 2.626, 2.628, 2.655, + 2.625, 2.626, 2.627, 2.626, 2.625, 2.623, 2.622, 2.621, 2.622, 2.621, 2.621, 2.619, 2.617, 2.616, 2.615, 2.616, 2.616, 2.616, 2.616, 2.616, 2.617, 2.618, 2.619, 2.621, 2.622, 2.624, 2.626, 2.628, 2.628, 2.629, 2.629, 2.655, + 2.626, 2.625, 2.626, 2.625, 2.625, 2.623, 2.622, 2.622, 2.622, 2.621, 2.619, 2.617, 2.616, 2.614, 2.613, 2.614, 2.614, 2.614, 2.614, 2.614, 2.616, 2.618, 2.619, 2.621, 2.623, 2.624, 2.627, 2.629, 2.631, 2.629, 2.631, 2.651, + 2.625, 2.625, 2.625, 2.624, 2.623, 2.623, 2.622, 2.622, 2.622, 2.621, 2.619, 2.617, 2.614, 2.613, 2.612, 2.611, 2.611, 2.612, 2.612, 2.613, 2.616, 2.618, 2.619, 2.622, 2.624, 2.626, 2.628, 2.631, 2.631, 2.631, 2.631, 2.651, + 2.625, 2.625, 2.624, 2.623, 2.622, 2.622, 2.622, 2.622, 2.622, 2.621, 2.617, 2.615, 2.613, 2.612, 2.611, 2.611, 2.611, 2.611, 2.611, 2.613, 2.615, 2.618, 2.619, 2.622, 2.625, 2.627, 2.631, 2.632, 2.631, 2.629, 2.631, 2.651, + 2.624, 2.624, 2.622, 2.622, 2.621, 2.621, 2.621, 2.621, 2.621, 2.618, 2.616, 2.614, 2.612, 2.611, 2.609, 2.609, 2.608, 2.609, 2.611, 2.611, 2.615, 2.617, 2.619, 2.621, 2.625, 2.628, 2.631, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.622, 2.623, 2.622, 2.622, 2.621, 2.619, 2.619, 2.619, 2.618, 2.616, 2.614, 2.613, 2.611, 2.609, 2.608, 2.606, 2.607, 2.607, 2.609, 2.611, 2.615, 2.617, 2.619, 2.622, 2.626, 2.629, 2.632, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.621, 2.622, 2.622, 2.622, 2.621, 2.619, 2.619, 2.618, 2.617, 2.614, 2.613, 2.611, 2.611, 2.607, 2.606, 2.605, 2.604, 2.605, 2.607, 2.609, 2.613, 2.616, 2.619, 2.622, 2.627, 2.631, 2.632, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.619, 2.621, 2.623, 2.623, 2.621, 2.621, 2.619, 2.617, 2.616, 2.615, 2.613, 2.609, 2.607, 2.604, 2.602, 2.601, 2.602, 2.603, 2.605, 2.609, 2.612, 2.616, 2.619, 2.624, 2.628, 2.631, 2.632, 2.633, 2.629, 2.627, 2.627, 2.651, + 2.619, 2.621, 2.623, 2.623, 2.622, 2.621, 2.618, 2.617, 2.615, 2.614, 2.612, 2.608, 2.603, 2.601, 2.598, 2.597, 2.599, 2.602, 2.605, 2.608, 2.611, 2.615, 2.622, 2.625, 2.629, 2.631, 2.631, 2.633, 2.631, 2.627, 2.627, 2.651, + 2.621, 2.622, 2.623, 2.623, 2.622, 2.621, 2.618, 2.617, 2.616, 2.614, 2.611, 2.606, 2.601, 2.598, 2.595, 2.595, 2.597, 2.601, 2.604, 2.608, 2.612, 2.615, 2.623, 2.627, 2.629, 2.631, 2.631, 2.632, 2.631, 2.628, 2.628, 2.651, + 2.622, 2.623, 2.624, 2.624, 2.622, 2.621, 2.619, 2.617, 2.615, 2.613, 2.609, 2.606, 2.601, 2.596, 2.594, 2.594, 2.596, 2.599, 2.603, 2.609, 2.613, 2.617, 2.623, 2.627, 2.629, 2.631, 2.632, 2.632, 2.631, 2.629, 2.631, 2.651, + 2.623, 2.625, 2.625, 2.624, 2.621, 2.621, 2.619, 2.617, 2.616, 2.613, 2.608, 2.605, 2.601, 2.595, 2.593, 2.593, 2.595, 2.598, 2.604, 2.609, 2.615, 2.619, 2.625, 2.627, 2.629, 2.629, 2.632, 2.633, 2.632, 2.629, 2.631, 2.651, + 2.624, 2.626, 2.626, 2.623, 2.621, 2.619, 2.618, 2.617, 2.615, 2.612, 2.608, 2.605, 2.601, 2.597, 2.595, 2.595, 2.596, 2.598, 2.605, 2.609, 2.616, 2.621, 2.626, 2.627, 2.629, 2.631, 2.633, 2.633, 2.633, 2.631, 2.631, 2.655, + 2.624, 2.625, 2.625, 2.623, 2.621, 2.619, 2.618, 2.617, 2.614, 2.612, 2.609, 2.606, 2.602, 2.599, 2.598, 2.597, 2.598, 2.602, 2.607, 2.612, 2.619, 2.621, 2.626, 2.628, 2.629, 2.632, 2.633, 2.634, 2.633, 2.631, 2.631, 2.655, + 2.624, 2.625, 2.625, 2.623, 2.621, 2.621, 2.618, 2.617, 2.614, 2.612, 2.611, 2.608, 2.604, 2.602, 2.599, 2.599, 2.603, 2.606, 2.611, 2.616, 2.621, 2.624, 2.626, 2.629, 2.631, 2.632, 2.633, 2.634, 2.634, 2.633, 2.633, 2.656, + 2.623, 2.624, 2.625, 2.623, 2.622, 2.621, 2.619, 2.617, 2.615, 2.613, 2.611, 2.611, 2.607, 2.604, 2.604, 2.604, 2.606, 2.609, 2.613, 2.619, 2.622, 2.625, 2.628, 2.631, 2.632, 2.633, 2.633, 2.636, 2.636, 2.634, 2.634, 2.658, + 2.623, 2.624, 2.625, 2.623, 2.622, 2.619, 2.618, 2.616, 2.614, 2.613, 2.612, 2.611, 2.609, 2.608, 2.607, 2.608, 2.609, 2.613, 2.617, 2.621, 2.623, 2.626, 2.629, 2.631, 2.632, 2.633, 2.634, 2.635, 2.636, 2.636, 2.636, 2.661, + 2.623, 2.624, 2.625, 2.625, 2.623, 2.621, 2.619, 2.616, 2.615, 2.614, 2.613, 2.612, 2.612, 2.611, 2.611, 2.611, 2.614, 2.615, 2.619, 2.622, 2.625, 2.627, 2.631, 2.632, 2.633, 2.635, 2.635, 2.637, 2.637, 2.636, 2.637, 2.661, + 2.623, 2.624, 2.625, 2.626, 2.624, 2.621, 2.619, 2.617, 2.616, 2.615, 2.615, 2.614, 2.614, 2.614, 2.614, 2.614, 2.616, 2.619, 2.621, 2.623, 2.626, 2.628, 2.631, 2.632, 2.634, 2.635, 2.636, 2.637, 2.638, 2.637, 2.638, 2.661, + 2.625, 2.626, 2.627, 2.627, 2.626, 2.623, 2.619, 2.619, 2.618, 2.618, 2.618, 2.617, 2.617, 2.616, 2.616, 2.616, 2.619, 2.622, 2.623, 2.625, 2.628, 2.628, 2.631, 2.632, 2.634, 2.636, 2.638, 2.639, 2.639, 2.638, 2.638, 2.661, + 2.625, 2.626, 2.627, 2.628, 2.626, 2.623, 2.621, 2.619, 2.619, 2.619, 2.619, 2.619, 2.619, 2.618, 2.618, 2.619, 2.623, 2.624, 2.625, 2.627, 2.629, 2.629, 2.632, 2.633, 2.635, 2.638, 2.639, 2.639, 2.639, 2.636, 2.636, 2.662, + 2.625, 2.627, 2.628, 2.628, 2.626, 2.624, 2.623, 2.622, 2.621, 2.621, 2.621, 2.621, 2.621, 2.621, 2.621, 2.624, 2.624, 2.625, 2.627, 2.628, 2.631, 2.631, 2.632, 2.634, 2.636, 2.639, 2.639, 2.641, 2.639, 2.635, 2.635, 2.663, + 2.625, 2.626, 2.628, 2.628, 2.627, 2.625, 2.624, 2.623, 2.623, 2.622, 2.623, 2.624, 2.624, 2.625, 2.625, 2.625, 2.625, 2.626, 2.627, 2.629, 2.631, 2.632, 2.633, 2.635, 2.638, 2.641, 2.642, 2.643, 2.642, 2.636, 2.636, 2.665, + 2.624, 2.626, 2.628, 2.628, 2.628, 2.626, 2.624, 2.624, 2.623, 2.623, 2.623, 2.625, 2.627, 2.627, 2.626, 2.626, 2.626, 2.627, 2.628, 2.629, 2.632, 2.633, 2.635, 2.637, 2.639, 2.642, 2.644, 2.644, 2.642, 2.638, 2.638, 2.665, + 2.623, 2.625, 2.626, 2.627, 2.626, 2.626, 2.624, 2.623, 2.623, 2.623, 2.623, 2.623, 2.626, 2.627, 2.626, 2.626, 2.626, 2.626, 2.628, 2.628, 2.629, 2.631, 2.634, 2.636, 2.639, 2.642, 2.644, 2.643, 2.641, 2.637, 2.638, 2.659, + 2.623, 2.627, 2.627, 2.627, 2.627, 2.628, 2.627, 2.624, 2.624, 2.623, 2.624, 2.624, 2.628, 2.628, 2.627, 2.628, 2.628, 2.628, 2.629, 2.629, 2.631, 2.635, 2.637, 2.639, 2.641, 2.643, 2.646, 2.645, 2.643, 2.641, 2.654, 2.659, + 2.642, 2.641, 2.643, 2.645, 2.645, 2.644, 2.644, 2.643, 2.643, 2.642, 2.642, 2.642, 2.643, 2.644, 2.644, 2.644, 2.646, 2.646, 2.647, 2.649, 2.651, 2.652, 2.654, 2.656, 2.658, 2.661, 2.661, 2.661, 2.659, 2.654, 2.659, 2.659 + ] + }, + { + "ct": 5000, + "table": + [ + 1.391, 1.394, 1.395, 1.396, 1.398, 1.398, 1.398, 1.398, 1.398, 1.399, 1.399, 1.398, 1.398, 1.399, 1.399, 1.399, 1.399, 1.398, 1.398, 1.398, 1.399, 1.399, 1.398, 1.397, 1.397, 1.398, 1.399, 1.401, 1.399, 1.397, 1.399, 1.402, + 1.393, 1.395, 1.396, 1.398, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.401, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.398, 1.398, 1.399, 1.401, 1.401, 1.399, 1.398, 1.399, 1.402, + 1.398, 1.401, 1.401, 1.401, 1.401, 1.401, 1.402, 1.402, 1.402, 1.402, 1.403, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.402, 1.401, 1.401, 1.401, 1.401, 1.401, 1.399, 1.399, 1.401, 1.401, 1.401, 1.401, 1.399, 1.401, 1.406, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.405, 1.405, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.402, 1.403, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.403, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.402, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.405, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.405, 1.404, 1.404, 1.404, 1.404, 1.405, 1.404, 1.405, 1.405, 1.405, 1.406, 1.406, 1.404, 1.405, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.406, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.406, 1.407, 1.407, 1.406, 1.405, 1.405, 1.412, + 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.407, 1.407, 1.408, 1.408, 1.407, 1.405, 1.405, 1.412, + 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.405, 1.405, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.407, 1.405, 1.405, 1.413, + 1.402, 1.402, 1.402, 1.402, 1.402, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.403, 1.403, 1.402, 1.402, 1.402, 1.403, 1.403, 1.404, 1.405, 1.406, 1.406, 1.407, 1.408, 1.409, 1.409, 1.408, 1.407, 1.405, 1.405, 1.414, + 1.402, 1.402, 1.402, 1.402, 1.403, 1.403, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.403, 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.403, 1.404, 1.405, 1.406, 1.407, 1.409, 1.409, 1.409, 1.409, 1.407, 1.405, 1.405, 1.413, + 1.402, 1.402, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.401, 1.401, 1.399, 1.399, 1.401, 1.402, 1.403, 1.404, 1.405, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.408, 1.405, 1.405, 1.413, + 1.402, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.402, 1.401, 1.399, 1.398, 1.398, 1.399, 1.399, 1.401, 1.403, 1.404, 1.405, 1.407, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.401, 1.398, 1.397, 1.397, 1.398, 1.399, 1.401, 1.403, 1.404, 1.405, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.399, 1.397, 1.396, 1.396, 1.397, 1.399, 1.401, 1.403, 1.404, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.399, 1.397, 1.396, 1.396, 1.397, 1.398, 1.401, 1.403, 1.406, 1.407, 1.409, 1.409, 1.411, 1.409, 1.409, 1.409, 1.408, 1.407, 1.407, 1.413, + 1.403, 1.404, 1.404, 1.403, 1.403, 1.404, 1.404, 1.405, 1.404, 1.404, 1.403, 1.402, 1.399, 1.398, 1.397, 1.397, 1.398, 1.399, 1.402, 1.404, 1.406, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.407, 1.407, 1.414, + 1.403, 1.403, 1.404, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.403, 1.403, 1.402, 1.401, 1.399, 1.398, 1.398, 1.398, 1.401, 1.403, 1.404, 1.408, 1.408, 1.409, 1.409, 1.409, 1.411, 1.411, 1.409, 1.408, 1.407, 1.407, 1.415, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.403, 1.403, 1.403, 1.401, 1.401, 1.399, 1.399, 1.401, 1.402, 1.404, 1.407, 1.408, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.407, 1.407, 1.415, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.403, 1.403, 1.403, 1.402, 1.401, 1.401, 1.401, 1.402, 1.404, 1.406, 1.407, 1.408, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.409, 1.409, 1.408, 1.408, 1.415, + 1.402, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.406, 1.408, 1.408, 1.409, 1.411, 1.411, 1.411, 1.411, 1.409, 1.409, 1.409, 1.408, 1.408, 1.416, + 1.403, 1.402, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.403, 1.404, 1.404, 1.404, 1.405, 1.406, 1.407, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.416, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.406, 1.407, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.406, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.404, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.407, 1.407, 1.416, + 1.402, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.406, 1.407, 1.407, 1.407, 1.408, 1.409, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.409, 1.407, 1.407, 1.417, + 1.402, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.409, 1.411, 1.411, 1.411, 1.412, 1.411, 1.409, 1.407, 1.407, 1.415, + 1.402, 1.402, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.407, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.412, 1.411, 1.409, 1.407, 1.407, 1.413, + 1.402, 1.402, 1.403, 1.403, 1.405, 1.406, 1.406, 1.406, 1.406, 1.406, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.412, 1.412, 1.413, 1.413, 1.411, 1.408, 1.411, 1.413, + 1.406, 1.406, 1.408, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.411, 1.411, 1.414, 1.414, 1.414, 1.414, 1.415, 1.415, 1.415, 1.415, 1.416, 1.416, 1.416, 1.417, 1.418, 1.418, 1.417, 1.417, 1.414, 1.411, 1.413, 1.413 + ] + } + ], + "luminance_lut": + [ + 1.554, 1.522, 1.466, 1.422, 1.385, 1.351, 1.322, 1.294, 1.269, 1.246, 1.228, 1.214, 1.207, 1.202, 1.199, 1.199, 1.199, 1.199, 1.202, 1.207, 1.218, 1.235, 1.255, 1.279, 1.305, 1.333, 1.365, 1.402, 1.447, 1.508, 1.602, 1.638, + 1.522, 1.478, 1.431, 1.391, 1.355, 1.323, 1.298, 1.271, 1.247, 1.228, 1.212, 1.199, 1.187, 1.179, 1.173, 1.172, 1.172, 1.174, 1.179, 1.189, 1.201, 1.216, 1.235, 1.256, 1.282, 1.308, 1.335, 1.368, 1.411, 1.461, 1.535, 1.602, + 1.479, 1.449, 1.407, 1.367, 1.332, 1.301, 1.271, 1.247, 1.226, 1.208, 1.191, 1.178, 1.166, 1.158, 1.153, 1.151, 1.151, 1.153, 1.159, 1.168, 1.179, 1.194, 1.212, 1.234, 1.256, 1.282, 1.311, 1.343, 1.382, 1.427, 1.489, 1.535, + 1.454, 1.423, 1.383, 1.345, 1.309, 1.278, 1.249, 1.226, 1.206, 1.187, 1.171, 1.158, 1.146, 1.138, 1.132, 1.129, 1.129, 1.133, 1.139, 1.147, 1.159, 1.173, 1.191, 1.212, 1.234, 1.261, 1.288, 1.321, 1.357, 1.401, 1.455, 1.489, + 1.433, 1.401, 1.362, 1.325, 1.289, 1.258, 1.231, 1.206, 1.187, 1.169, 1.153, 1.138, 1.129, 1.121, 1.115, 1.112, 1.112, 1.114, 1.121, 1.129, 1.141, 1.155, 1.172, 1.191, 1.214, 1.241, 1.269, 1.301, 1.337, 1.377, 1.428, 1.457, + 1.415, 1.382, 1.343, 1.306, 1.273, 1.241, 1.213, 1.189, 1.169, 1.153, 1.137, 1.123, 1.112, 1.105, 1.097, 1.095, 1.095, 1.098, 1.103, 1.112, 1.124, 1.139, 1.155, 1.173, 1.197, 1.222, 1.252, 1.282, 1.317, 1.356, 1.405, 1.434, + 1.398, 1.363, 1.325, 1.289, 1.256, 1.224, 1.198, 1.175, 1.155, 1.137, 1.123, 1.108, 1.097, 1.089, 1.083, 1.079, 1.079, 1.083, 1.088, 1.097, 1.109, 1.124, 1.139, 1.158, 1.181, 1.206, 1.234, 1.266, 1.299, 1.339, 1.384, 1.415, + 1.382, 1.347, 1.309, 1.274, 1.242, 1.211, 1.185, 1.162, 1.142, 1.124, 1.108, 1.095, 1.083, 1.075, 1.069, 1.066, 1.066, 1.068, 1.074, 1.083, 1.096, 1.109, 1.125, 1.145, 1.166, 1.191, 1.219, 1.251, 1.285, 1.324, 1.367, 1.399, + 1.369, 1.334, 1.296, 1.261, 1.228, 1.199, 1.173, 1.151, 1.131, 1.112, 1.095, 1.083, 1.071, 1.062, 1.056, 1.053, 1.053, 1.055, 1.061, 1.069, 1.083, 1.096, 1.112, 1.132, 1.153, 1.178, 1.206, 1.237, 1.271, 1.309, 1.353, 1.385, + 1.359, 1.321, 1.284, 1.251, 1.217, 1.189, 1.164, 1.141, 1.121, 1.102, 1.086, 1.071, 1.061, 1.049, 1.045, 1.042, 1.042, 1.043, 1.051, 1.061, 1.069, 1.085, 1.101, 1.121, 1.143, 1.167, 1.195, 1.225, 1.259, 1.298, 1.341, 1.375, + 1.351, 1.312, 1.275, 1.241, 1.209, 1.181, 1.155, 1.133, 1.112, 1.092, 1.076, 1.061, 1.049, 1.041, 1.034, 1.032, 1.032, 1.035, 1.041, 1.051, 1.061, 1.075, 1.092, 1.112, 1.133, 1.158, 1.185, 1.216, 1.249, 1.288, 1.331, 1.364, + 1.344, 1.303, 1.267, 1.233, 1.201, 1.173, 1.147, 1.124, 1.104, 1.085, 1.067, 1.053, 1.041, 1.033, 1.024, 1.022, 1.022, 1.025, 1.034, 1.041, 1.053, 1.066, 1.083, 1.103, 1.126, 1.149, 1.177, 1.207, 1.241, 1.279, 1.321, 1.357, + 1.339, 1.297, 1.261, 1.226, 1.194, 1.166, 1.142, 1.119, 1.098, 1.078, 1.061, 1.046, 1.034, 1.024, 1.017, 1.014, 1.014, 1.017, 1.025, 1.034, 1.046, 1.059, 1.077, 1.096, 1.118, 1.143, 1.169, 1.201, 1.235, 1.273, 1.314, 1.352, + 1.337, 1.293, 1.256, 1.223, 1.191, 1.163, 1.136, 1.114, 1.093, 1.074, 1.056, 1.041, 1.027, 1.017, 1.012, 1.006, 1.006, 1.013, 1.017, 1.028, 1.041, 1.055, 1.072, 1.092, 1.114, 1.138, 1.165, 1.195, 1.229, 1.268, 1.309, 1.348, + 1.337, 1.291, 1.253, 1.219, 1.187, 1.159, 1.133, 1.109, 1.089, 1.071, 1.053, 1.037, 1.023, 1.012, 1.006, 1.002, 1.003, 1.006, 1.013, 1.023, 1.038, 1.052, 1.069, 1.089, 1.111, 1.135, 1.161, 1.192, 1.226, 1.264, 1.306, 1.348, + 1.337, 1.291, 1.253, 1.218, 1.186, 1.157, 1.132, 1.109, 1.088, 1.068, 1.049, 1.035, 1.021, 1.009, 1.001, 1.001, 1.001, 1.003, 1.011, 1.021, 1.035, 1.051, 1.069, 1.087, 1.109, 1.133, 1.161, 1.189, 1.224, 1.262, 1.304, 1.347, + 1.341, 1.292, 1.253, 1.218, 1.186, 1.157, 1.132, 1.109, 1.088, 1.068, 1.049, 1.034, 1.021, 1.009, 1.001, 1.001, 1.001, 1.003, 1.011, 1.021, 1.035, 1.051, 1.069, 1.087, 1.109, 1.133, 1.161, 1.189, 1.224, 1.262, 1.304, 1.347, + 1.348, 1.298, 1.255, 1.219, 1.188, 1.159, 1.134, 1.111, 1.088, 1.069, 1.051, 1.035, 1.021, 1.009, 1.003, 1.001, 1.002, 1.004, 1.011, 1.022, 1.036, 1.053, 1.071, 1.089, 1.111, 1.135, 1.162, 1.191, 1.226, 1.264, 1.306, 1.347, + 1.354, 1.306, 1.258, 1.222, 1.191, 1.162, 1.135, 1.113, 1.092, 1.073, 1.054, 1.038, 1.024, 1.014, 1.008, 1.003, 1.004, 1.008, 1.014, 1.026, 1.039, 1.056, 1.073, 1.093, 1.115, 1.139, 1.165, 1.195, 1.229, 1.267, 1.309, 1.349, + 1.358, 1.312, 1.263, 1.227, 1.195, 1.167, 1.141, 1.117, 1.097, 1.078, 1.061, 1.043, 1.029, 1.021, 1.014, 1.008, 1.008, 1.014, 1.021, 1.032, 1.045, 1.061, 1.078, 1.097, 1.119, 1.144, 1.169, 1.201, 1.234, 1.272, 1.315, 1.353, + 1.364, 1.319, 1.269, 1.234, 1.201, 1.174, 1.148, 1.124, 1.103, 1.084, 1.067, 1.052, 1.038, 1.029, 1.021, 1.016, 1.016, 1.021, 1.029, 1.038, 1.051, 1.067, 1.084, 1.103, 1.126, 1.151, 1.176, 1.207, 1.241, 1.279, 1.321, 1.358, + 1.371, 1.326, 1.277, 1.242, 1.209, 1.181, 1.155, 1.132, 1.111, 1.092, 1.075, 1.061, 1.049, 1.038, 1.029, 1.027, 1.027, 1.029, 1.038, 1.047, 1.061, 1.075, 1.092, 1.111, 1.133, 1.157, 1.185, 1.213, 1.247, 1.286, 1.329, 1.365, + 1.379, 1.334, 1.287, 1.251, 1.219, 1.191, 1.164, 1.141, 1.119, 1.101, 1.085, 1.071, 1.061, 1.049, 1.041, 1.038, 1.038, 1.041, 1.047, 1.059, 1.071, 1.084, 1.101, 1.119, 1.141, 1.165, 1.193, 1.223, 1.257, 1.295, 1.338, 1.374, + 1.389, 1.343, 1.298, 1.262, 1.231, 1.201, 1.174, 1.151, 1.131, 1.111, 1.095, 1.083, 1.071, 1.061, 1.054, 1.051, 1.051, 1.054, 1.059, 1.071, 1.081, 1.094, 1.111, 1.129, 1.152, 1.176, 1.203, 1.235, 1.269, 1.307, 1.351, 1.384, + 1.401, 1.351, 1.311, 1.274, 1.242, 1.214, 1.187, 1.164, 1.142, 1.124, 1.108, 1.095, 1.083, 1.074, 1.068, 1.066, 1.066, 1.068, 1.073, 1.081, 1.094, 1.108, 1.123, 1.141, 1.164, 1.188, 1.215, 1.247, 1.281, 1.321, 1.364, 1.396, + 1.412, 1.366, 1.327, 1.289, 1.257, 1.227, 1.201, 1.176, 1.156, 1.137, 1.122, 1.108, 1.096, 1.088, 1.083, 1.081, 1.081, 1.082, 1.087, 1.095, 1.108, 1.122, 1.136, 1.154, 1.177, 1.201, 1.229, 1.261, 1.296, 1.337, 1.382, 1.409, + 1.421, 1.383, 1.343, 1.306, 1.273, 1.243, 1.216, 1.192, 1.169, 1.152, 1.137, 1.122, 1.111, 1.103, 1.098, 1.095, 1.095, 1.097, 1.102, 1.111, 1.123, 1.136, 1.152, 1.169, 1.191, 1.217, 1.246, 1.278, 1.314, 1.354, 1.399, 1.429, + 1.434, 1.402, 1.362, 1.324, 1.291, 1.261, 1.232, 1.208, 1.187, 1.168, 1.152, 1.138, 1.127, 1.119, 1.114, 1.112, 1.112, 1.115, 1.121, 1.128, 1.139, 1.152, 1.169, 1.186, 1.209, 1.234, 1.262, 1.295, 1.332, 1.372, 1.419, 1.451, + 1.453, 1.422, 1.382, 1.344, 1.309, 1.278, 1.249, 1.226, 1.204, 1.187, 1.168, 1.155, 1.144, 1.135, 1.131, 1.131, 1.131, 1.133, 1.138, 1.146, 1.157, 1.171, 1.186, 1.206, 1.227, 1.252, 1.281, 1.314, 1.351, 1.393, 1.442, 1.473, + 1.475, 1.446, 1.404, 1.366, 1.329, 1.298, 1.269, 1.245, 1.224, 1.204, 1.188, 1.174, 1.163, 1.154, 1.149, 1.148, 1.148, 1.152, 1.156, 1.164, 1.176, 1.189, 1.206, 1.226, 1.247, 1.274, 1.303, 1.336, 1.374, 1.417, 1.471, 1.505, + 1.503, 1.472, 1.428, 1.389, 1.353, 1.321, 1.291, 1.266, 1.245, 1.224, 1.207, 1.192, 1.183, 1.174, 1.169, 1.167, 1.168, 1.169, 1.175, 1.183, 1.195, 1.209, 1.226, 1.247, 1.267, 1.294, 1.325, 1.359, 1.397, 1.445, 1.505, 1.548, + 1.534, 1.503, 1.455, 1.413, 1.378, 1.344, 1.315, 1.289, 1.265, 1.243, 1.224, 1.207, 1.196, 1.192, 1.189, 1.189, 1.189, 1.189, 1.192, 1.198, 1.209, 1.226, 1.244, 1.266, 1.291, 1.318, 1.349, 1.383, 1.425, 1.475, 1.548, 1.591 + ], + "sigma": 0.00095, + "sigma_Cb": 0.00098 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2850, + "ccm": + [ + 1.97469, -0.71439, -0.26031, + -0.43521, 2.09769, -0.66248, + -0.04826, -0.84642, 1.89468 + ] + }, + { + "ct": 2960, + "ccm": + [ + 2.12952, -0.91185, -0.21768, + -0.38018, 1.90789, -0.52771, + 0.03988, -1.10079, 2.06092 + ] + }, + { + "ct": 3580, + "ccm": + [ + 2.03422, -0.80048, -0.23374, + -0.39089, 1.97221, -0.58132, + -0.08969, -0.61439, 1.70408 + ] + }, + { + "ct": 4559, + "ccm": + [ + 2.15423, -0.98143, -0.17279, + -0.38131, 2.14763, -0.76632, + -0.10069, -0.54383, 1.64452 + ] + }, + { + "ct": 5881, + "ccm": + [ + 2.18464, -0.95493, -0.22971, + -0.36826, 2.00298, -0.63471, + -0.15219, -0.38055, 1.53274 + ] + }, + { + "ct": 7600, + "ccm": + [ + 2.30687, -0.97295, -0.33392, + -0.30872, 2.32779, -1.01908, + -0.17761, -0.55891, 1.73651 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.cac": + { + "strength": 1.0, + "lut_rx": + [ + -0.46, -0.31, -0.17, -0.05, 0.04, 0.14, 0.28, 0.36, 0.58, + -0.43, -0.28, -0.16, -0.05, 0.05, 0.14, 0.24, 0.36, 0.58, + -0.42, -0.27, -0.15, -0.05, 0.05, 0.14, 0.23, 0.34, 0.58, + -0.39, -0.25, -0.14, -0.04, 0.05, 0.15, 0.24, 0.35, 0.56, + -0.35, -0.24, -0.14, -0.04, 0.05, 0.14, 0.25, 0.35, 0.56, + -0.33, -0.22, -0.13, -0.04, 0.04, 0.13, 0.24, 0.33, 0.54, + -0.33, -0.22, -0.13, -0.04, 0.04, 0.13, 0.23, 0.31, 0.5, + -0.32, -0.23, -0.13, -0.04, 0.04, 0.12, 0.21, 0.29, 0.46, + -0.33, -0.24, -0.15, -0.05, 0.03, 0.11, 0.19, 0.26, 0.43 + ], + "lut_ry": + [ + -0.39, -0.34, -0.31, -0.29, -0.27, -0.29, -0.32, -0.31, -0.32, + -0.29, -0.24, -0.22, -0.21, -0.22, -0.21, -0.21, -0.22, -0.23, + -0.22, -0.17, -0.17, -0.17, -0.17, -0.17, -0.16, -0.16, -0.18, + -0.13, -0.09, -0.09, -0.1, -0.1, -0.1, -0.09, -0.08, -0.11, + -0.04, -0.02, -0.03, -0.03, -0.03, -0.03, -0.02, -0.01, -0.02, + 0.03, 0.05, 0.03, 0.03, 0.02, 0.03, 0.04, 0.06, 0.05, + 0.11, 0.11, 0.09, 0.08, 0.09, 0.09, 0.1, 0.11, 0.11, + 0.17, 0.16, 0.14, 0.13, 0.13, 0.13, 0.14, 0.15, 0.15, + 0.24, 0.23, 0.21, 0.19, 0.18, 0.2, 0.2, 0.2, 0.21 + ], + "lut_bx": + [ + -0.33, -0.22, -0.13, -0.05, 0.01, 0.09, 0.19, 0.25, 0.39, + -0.3, -0.19, -0.12, -0.04, 0.01, 0.06, 0.15, 0.23, 0.38, + -0.28, -0.18, -0.1, -0.04, 0.01, 0.06, 0.14, 0.22, 0.38, + -0.25, -0.16, -0.09, -0.04, 0.01, 0.06, 0.14, 0.23, 0.39, + -0.22, -0.15, -0.09, -0.03, 0.01, 0.06, 0.14, 0.23, 0.42, + -0.21, -0.14, -0.09, -0.04, 0.0, 0.06, 0.13, 0.21, 0.39, + -0.21, -0.14, -0.08, -0.04, 0.0, 0.06, 0.13, 0.2, 0.34, + -0.21, -0.14, -0.08, -0.04, 0.0, 0.06, 0.12, 0.19, 0.31, + -0.21, -0.15, -0.08, -0.03, 0.0, 0.06, 0.12, 0.17, 0.29 + ], + "lut_by": + [ + -0.3, -0.24, -0.21, -0.19, -0.19, -0.19, -0.23, -0.23, -0.27, + -0.23, -0.17, -0.14, -0.12, -0.12, -0.13, -0.15, -0.17, -0.21, + -0.17, -0.11, -0.09, -0.08, -0.08, -0.08, -0.1, -0.11, -0.16, + -0.09, -0.05, -0.04, -0.03, -0.03, -0.03, -0.04, -0.06, -0.11, + -0.03, -0.01, 0.0, 0.01, 0.01, 0.01, 0.0, -0.0, -0.05, + 0.02, 0.04, 0.04, 0.04, 0.05, 0.05, 0.05, 0.05, 0.01, + 0.07, 0.08, 0.09, 0.09, 0.1, 0.1, 0.1, 0.09, 0.06, + 0.11, 0.12, 0.11, 0.12, 0.12, 0.13, 0.13, 0.13, 0.1, + 0.16, 0.17, 0.16, 0.16, 0.16, 0.17, 0.17, 0.17, 0.15 + ] + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx477_noir.json b/src/ipa/rpi/pisp/data/imx477_noir.json new file mode 100644 index 000000000..defc4f4d5 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx477_noir.json @@ -0,0 +1,1148 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 12000, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 740, + "reference_Y": 15051 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.809 + } + }, + { + "rpi.geq": + { + "offset": 204, + "slope": 0.0061 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "bayes": 0 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 2.359, 2.354, 2.351, 2.351, 2.343, 2.337, 2.331, 2.325, 2.323, 2.321, 2.317, 2.315, 2.313, 2.313, 2.311, 2.312, 2.312, 2.313, 2.315, 2.315, 2.316, 2.317, 2.319, 2.323, 2.326, 2.329, 2.332, 2.332, 2.335, 2.337, 2.352, 2.363, + 2.352, 2.351, 2.349, 2.346, 2.342, 2.334, 2.328, 2.324, 2.321, 2.317, 2.315, 2.314, 2.312, 2.311, 2.311, 2.311, 2.311, 2.311, 2.312, 2.314, 2.315, 2.316, 2.317, 2.319, 2.324, 2.326, 2.328, 2.329, 2.331, 2.337, 2.348, 2.355, + 2.346, 2.346, 2.345, 2.344, 2.338, 2.329, 2.325, 2.319, 2.316, 2.314, 2.311, 2.309, 2.308, 2.306, 2.304, 2.304, 2.305, 2.307, 2.308, 2.309, 2.311, 2.311, 2.313, 2.316, 2.319, 2.322, 2.325, 2.326, 2.328, 2.335, 2.343, 2.349, + 2.342, 2.342, 2.341, 2.338, 2.332, 2.326, 2.319, 2.316, 2.312, 2.309, 2.308, 2.305, 2.303, 2.302, 2.301, 2.301, 2.302, 2.303, 2.304, 2.305, 2.305, 2.307, 2.311, 2.313, 2.315, 2.319, 2.321, 2.325, 2.328, 2.333, 2.338, 2.348, + 2.337, 2.337, 2.337, 2.336, 2.331, 2.322, 2.317, 2.312, 2.309, 2.307, 2.304, 2.302, 2.299, 2.299, 2.298, 2.298, 2.299, 2.299, 2.301, 2.302, 2.302, 2.304, 2.305, 2.309, 2.314, 2.316, 2.321, 2.324, 2.326, 2.329, 2.335, 2.343, + 2.335, 2.334, 2.333, 2.333, 2.326, 2.318, 2.313, 2.309, 2.306, 2.302, 2.299, 2.297, 2.297, 2.296, 2.295, 2.295, 2.294, 2.295, 2.296, 2.298, 2.298, 2.301, 2.303, 2.305, 2.311, 2.315, 2.319, 2.323, 2.325, 2.329, 2.333, 2.339, + 2.329, 2.331, 2.329, 2.329, 2.325, 2.315, 2.309, 2.306, 2.302, 2.299, 2.297, 2.295, 2.293, 2.292, 2.291, 2.291, 2.291, 2.291, 2.293, 2.294, 2.296, 2.298, 2.301, 2.304, 2.307, 2.313, 2.317, 2.319, 2.323, 2.327, 2.331, 2.339, + 2.329, 2.328, 2.328, 2.328, 2.321, 2.313, 2.307, 2.303, 2.299, 2.295, 2.294, 2.292, 2.289, 2.289, 2.288, 2.288, 2.288, 2.289, 2.289, 2.292, 2.294, 2.295, 2.297, 2.301, 2.306, 2.311, 2.315, 2.318, 2.319, 2.323, 2.329, 2.335, + 2.326, 2.327, 2.325, 2.325, 2.319, 2.311, 2.305, 2.299, 2.296, 2.293, 2.291, 2.289, 2.288, 2.287, 2.285, 2.285, 2.286, 2.288, 2.288, 2.289, 2.291, 2.294, 2.295, 2.298, 2.304, 2.308, 2.313, 2.315, 2.317, 2.319, 2.327, 2.335, + 2.325, 2.325, 2.323, 2.323, 2.317, 2.309, 2.303, 2.298, 2.294, 2.292, 2.289, 2.287, 2.286, 2.285, 2.284, 2.284, 2.284, 2.285, 2.287, 2.289, 2.291, 2.291, 2.294, 2.297, 2.302, 2.305, 2.309, 2.313, 2.315, 2.317, 2.325, 2.334, + 2.322, 2.324, 2.322, 2.322, 2.316, 2.306, 2.301, 2.296, 2.292, 2.289, 2.287, 2.286, 2.285, 2.284, 2.283, 2.283, 2.283, 2.284, 2.286, 2.288, 2.289, 2.291, 2.293, 2.296, 2.301, 2.304, 2.308, 2.311, 2.312, 2.315, 2.323, 2.333, + 2.321, 2.323, 2.322, 2.322, 2.314, 2.306, 2.299, 2.294, 2.291, 2.288, 2.286, 2.285, 2.284, 2.282, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.289, 2.291, 2.291, 2.294, 2.297, 2.302, 2.306, 2.308, 2.311, 2.312, 2.322, 2.332, + 2.319, 2.321, 2.321, 2.321, 2.314, 2.305, 2.297, 2.293, 2.289, 2.287, 2.285, 2.284, 2.283, 2.281, 2.281, 2.281, 2.282, 2.283, 2.283, 2.285, 2.287, 2.289, 2.291, 2.292, 2.297, 2.301, 2.305, 2.307, 2.309, 2.312, 2.321, 2.333, + 2.319, 2.321, 2.319, 2.319, 2.314, 2.303, 2.296, 2.293, 2.289, 2.286, 2.285, 2.283, 2.282, 2.281, 2.281, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.288, 2.289, 2.291, 2.296, 2.301, 2.305, 2.307, 2.308, 2.312, 2.321, 2.332, + 2.319, 2.321, 2.319, 2.319, 2.313, 2.303, 2.296, 2.291, 2.289, 2.286, 2.284, 2.282, 2.281, 2.281, 2.281, 2.281, 2.282, 2.282, 2.283, 2.284, 2.286, 2.287, 2.288, 2.291, 2.295, 2.299, 2.304, 2.306, 2.307, 2.311, 2.321, 2.332, + 2.319, 2.321, 2.319, 2.319, 2.313, 2.303, 2.297, 2.292, 2.289, 2.287, 2.285, 2.282, 2.281, 2.281, 2.282, 2.282, 2.282, 2.282, 2.283, 2.284, 2.285, 2.286, 2.288, 2.291, 2.295, 2.299, 2.303, 2.306, 2.307, 2.312, 2.321, 2.331, + 2.318, 2.319, 2.319, 2.319, 2.313, 2.303, 2.297, 2.292, 2.289, 2.286, 2.285, 2.282, 2.281, 2.281, 2.281, 2.282, 2.282, 2.282, 2.282, 2.283, 2.285, 2.286, 2.287, 2.291, 2.294, 2.298, 2.303, 2.306, 2.307, 2.311, 2.321, 2.331, + 2.319, 2.319, 2.319, 2.319, 2.313, 2.302, 2.297, 2.292, 2.289, 2.287, 2.285, 2.283, 2.282, 2.281, 2.281, 2.282, 2.283, 2.283, 2.283, 2.283, 2.285, 2.286, 2.287, 2.289, 2.294, 2.297, 2.303, 2.305, 2.308, 2.313, 2.321, 2.331, + 2.319, 2.319, 2.319, 2.319, 2.313, 2.303, 2.299, 2.293, 2.291, 2.287, 2.285, 2.283, 2.282, 2.281, 2.281, 2.282, 2.283, 2.283, 2.283, 2.283, 2.285, 2.286, 2.288, 2.291, 2.294, 2.298, 2.304, 2.306, 2.308, 2.312, 2.322, 2.331, + 2.319, 2.321, 2.321, 2.321, 2.315, 2.305, 2.301, 2.295, 2.292, 2.289, 2.286, 2.285, 2.283, 2.282, 2.282, 2.282, 2.284, 2.283, 2.284, 2.284, 2.285, 2.287, 2.288, 2.291, 2.294, 2.299, 2.304, 2.306, 2.309, 2.313, 2.322, 2.334, + 2.321, 2.322, 2.322, 2.322, 2.317, 2.307, 2.301, 2.296, 2.292, 2.291, 2.288, 2.286, 2.285, 2.284, 2.283, 2.284, 2.285, 2.284, 2.285, 2.285, 2.287, 2.288, 2.289, 2.293, 2.297, 2.301, 2.305, 2.308, 2.311, 2.314, 2.323, 2.335, + 2.322, 2.324, 2.324, 2.324, 2.319, 2.309, 2.303, 2.297, 2.295, 2.292, 2.291, 2.288, 2.286, 2.286, 2.285, 2.286, 2.286, 2.286, 2.287, 2.288, 2.289, 2.289, 2.291, 2.294, 2.299, 2.302, 2.307, 2.311, 2.312, 2.316, 2.325, 2.335, + 2.324, 2.326, 2.325, 2.326, 2.321, 2.311, 2.305, 2.301, 2.297, 2.295, 2.293, 2.291, 2.289, 2.289, 2.288, 2.288, 2.287, 2.288, 2.289, 2.291, 2.292, 2.292, 2.295, 2.299, 2.301, 2.304, 2.309, 2.312, 2.315, 2.319, 2.327, 2.337, + 2.329, 2.329, 2.328, 2.328, 2.323, 2.315, 2.308, 2.304, 2.301, 2.298, 2.296, 2.294, 2.291, 2.291, 2.289, 2.291, 2.291, 2.291, 2.292, 2.293, 2.294, 2.295, 2.297, 2.299, 2.303, 2.308, 2.312, 2.315, 2.318, 2.321, 2.329, 2.339, + 2.329, 2.331, 2.332, 2.332, 2.326, 2.318, 2.311, 2.306, 2.304, 2.301, 2.299, 2.297, 2.295, 2.293, 2.292, 2.292, 2.292, 2.293, 2.294, 2.294, 2.296, 2.297, 2.299, 2.302, 2.306, 2.311, 2.315, 2.318, 2.319, 2.324, 2.332, 2.342, + 2.331, 2.333, 2.334, 2.334, 2.328, 2.321, 2.313, 2.308, 2.305, 2.303, 2.301, 2.299, 2.297, 2.295, 2.295, 2.295, 2.294, 2.296, 2.296, 2.297, 2.298, 2.299, 2.302, 2.305, 2.308, 2.314, 2.317, 2.321, 2.323, 2.327, 2.334, 2.346, + 2.331, 2.332, 2.334, 2.334, 2.329, 2.321, 2.314, 2.309, 2.306, 2.304, 2.303, 2.301, 2.299, 2.297, 2.295, 2.295, 2.296, 2.297, 2.298, 2.298, 2.299, 2.301, 2.303, 2.306, 2.309, 2.315, 2.319, 2.321, 2.324, 2.328, 2.337, 2.346, + 2.331, 2.332, 2.334, 2.334, 2.329, 2.321, 2.314, 2.311, 2.306, 2.304, 2.303, 2.302, 2.299, 2.297, 2.295, 2.295, 2.296, 2.297, 2.298, 2.298, 2.299, 2.301, 2.303, 2.306, 2.311, 2.314, 2.319, 2.323, 2.325, 2.329, 2.339, 2.348, + 2.329, 2.329, 2.329, 2.331, 2.326, 2.319, 2.312, 2.309, 2.304, 2.303, 2.302, 2.301, 2.298, 2.295, 2.294, 2.294, 2.295, 2.295, 2.296, 2.297, 2.299, 2.301, 2.302, 2.304, 2.308, 2.313, 2.319, 2.322, 2.325, 2.329, 2.339, 2.351, + 2.329, 2.329, 2.329, 2.329, 2.326, 2.317, 2.311, 2.308, 2.303, 2.302, 2.301, 2.298, 2.296, 2.295, 2.294, 2.294, 2.294, 2.294, 2.296, 2.297, 2.298, 2.299, 2.301, 2.304, 2.307, 2.312, 2.318, 2.322, 2.326, 2.331, 2.341, 2.355, + 2.339, 2.332, 2.331, 2.331, 2.327, 2.323, 2.316, 2.309, 2.306, 2.302, 2.301, 2.299, 2.297, 2.296, 2.295, 2.294, 2.294, 2.296, 2.297, 2.297, 2.299, 2.301, 2.303, 2.306, 2.308, 2.317, 2.322, 2.325, 2.329, 2.341, 2.353, 2.361, + 2.347, 2.347, 2.345, 2.343, 2.338, 2.332, 2.326, 2.322, 2.321, 2.318, 2.316, 2.315, 2.313, 2.312, 2.311, 2.311, 2.311, 2.311, 2.312, 2.315, 2.317, 2.318, 2.319, 2.323, 2.324, 2.329, 2.334, 2.337, 2.344, 2.347, 2.361, 2.364 + ] + }, + { + "ct": 5000, + "table": + [ + 3.869, 3.852, 3.844, 3.842, 3.836, 3.821, 3.807, 3.796, 3.789, 3.784, 3.778, 3.775, 3.769, 3.768, 3.765, 3.765, 3.767, 3.769, 3.772, 3.774, 3.773, 3.775, 3.779, 3.787, 3.793, 3.801, 3.806, 3.804, 3.813, 3.819, 3.855, 3.879, + 3.854, 3.844, 3.837, 3.836, 3.824, 3.811, 3.797, 3.789, 3.784, 3.777, 3.774, 3.769, 3.764, 3.758, 3.757, 3.758, 3.758, 3.761, 3.763, 3.764, 3.765, 3.766, 3.772, 3.778, 3.787, 3.792, 3.794, 3.798, 3.802, 3.815, 3.839, 3.873, + 3.838, 3.831, 3.826, 3.823, 3.813, 3.799, 3.787, 3.781, 3.773, 3.768, 3.763, 3.759, 3.753, 3.749, 3.745, 3.745, 3.745, 3.752, 3.754, 3.757, 3.757, 3.759, 3.763, 3.769, 3.773, 3.781, 3.786, 3.792, 3.798, 3.811, 3.831, 3.861, + 3.833, 3.822, 3.817, 3.816, 3.804, 3.788, 3.779, 3.772, 3.766, 3.759, 3.755, 3.749, 3.744, 3.741, 3.738, 3.739, 3.739, 3.741, 3.743, 3.747, 3.749, 3.751, 3.756, 3.764, 3.769, 3.776, 3.783, 3.789, 3.798, 3.809, 3.821, 3.855, + 3.824, 3.818, 3.808, 3.808, 3.797, 3.781, 3.772, 3.764, 3.757, 3.752, 3.747, 3.743, 3.737, 3.735, 3.733, 3.733, 3.733, 3.735, 3.737, 3.738, 3.741, 3.746, 3.749, 3.755, 3.766, 3.771, 3.781, 3.789, 3.794, 3.806, 3.818, 3.849, + 3.815, 3.808, 3.799, 3.801, 3.787, 3.775, 3.767, 3.757, 3.751, 3.745, 3.738, 3.734, 3.732, 3.727, 3.725, 3.723, 3.722, 3.722, 3.726, 3.729, 3.734, 3.738, 3.744, 3.749, 3.759, 3.769, 3.781, 3.788, 3.792, 3.799, 3.811, 3.841, + 3.804, 3.799, 3.793, 3.793, 3.783, 3.771, 3.759, 3.751, 3.744, 3.735, 3.732, 3.727, 3.723, 3.721, 3.719, 3.716, 3.716, 3.716, 3.718, 3.722, 3.727, 3.731, 3.737, 3.746, 3.756, 3.767, 3.776, 3.782, 3.788, 3.795, 3.808, 3.831, + 3.802, 3.797, 3.787, 3.787, 3.779, 3.762, 3.753, 3.744, 3.734, 3.727, 3.725, 3.721, 3.716, 3.714, 3.709, 3.709, 3.711, 3.711, 3.712, 3.717, 3.722, 3.725, 3.731, 3.739, 3.752, 3.762, 3.772, 3.778, 3.779, 3.789, 3.798, 3.826, + 3.791, 3.789, 3.784, 3.784, 3.775, 3.759, 3.746, 3.735, 3.729, 3.724, 3.718, 3.714, 3.712, 3.707, 3.704, 3.704, 3.706, 3.708, 3.709, 3.711, 3.716, 3.722, 3.726, 3.735, 3.746, 3.754, 3.767, 3.774, 3.777, 3.781, 3.794, 3.824, + 3.789, 3.784, 3.779, 3.781, 3.771, 3.753, 3.741, 3.732, 3.725, 3.719, 3.715, 3.711, 3.707, 3.704, 3.701, 3.701, 3.702, 3.704, 3.708, 3.709, 3.713, 3.718, 3.724, 3.731, 3.742, 3.749, 3.761, 3.768, 3.772, 3.778, 3.791, 3.822, + 3.789, 3.781, 3.777, 3.777, 3.764, 3.749, 3.739, 3.729, 3.722, 3.718, 3.711, 3.708, 3.705, 3.701, 3.699, 3.699, 3.699, 3.701, 3.705, 3.707, 3.711, 3.715, 3.721, 3.727, 3.738, 3.746, 3.757, 3.763, 3.765, 3.773, 3.788, 3.821, + 3.785, 3.779, 3.774, 3.774, 3.764, 3.747, 3.736, 3.726, 3.719, 3.711, 3.709, 3.706, 3.701, 3.698, 3.696, 3.695, 3.695, 3.698, 3.702, 3.704, 3.707, 3.712, 3.718, 3.725, 3.734, 3.741, 3.753, 3.756, 3.759, 3.764, 3.784, 3.818, + 3.779, 3.776, 3.773, 3.773, 3.759, 3.744, 3.733, 3.724, 3.714, 3.709, 3.706, 3.704, 3.699, 3.696, 3.694, 3.694, 3.694, 3.697, 3.701, 3.703, 3.706, 3.709, 3.714, 3.721, 3.731, 3.737, 3.749, 3.753, 3.758, 3.762, 3.783, 3.819, + 3.779, 3.776, 3.769, 3.769, 3.757, 3.741, 3.729, 3.721, 3.712, 3.708, 3.705, 3.701, 3.697, 3.695, 3.694, 3.694, 3.695, 3.696, 3.698, 3.702, 3.705, 3.709, 3.712, 3.717, 3.728, 3.736, 3.749, 3.752, 3.756, 3.761, 3.781, 3.815, + 3.779, 3.773, 3.768, 3.768, 3.756, 3.738, 3.731, 3.719, 3.711, 3.707, 3.703, 3.698, 3.695, 3.694, 3.694, 3.695, 3.695, 3.695, 3.696, 3.702, 3.705, 3.708, 3.712, 3.717, 3.728, 3.736, 3.747, 3.751, 3.754, 3.761, 3.781, 3.815, + 3.782, 3.773, 3.767, 3.767, 3.755, 3.738, 3.728, 3.721, 3.711, 3.707, 3.701, 3.698, 3.695, 3.693, 3.694, 3.696, 3.695, 3.695, 3.695, 3.701, 3.703, 3.706, 3.711, 3.715, 3.726, 3.735, 3.745, 3.751, 3.754, 3.763, 3.779, 3.815, + 3.781, 3.771, 3.767, 3.767, 3.754, 3.739, 3.726, 3.721, 3.712, 3.706, 3.701, 3.698, 3.695, 3.693, 3.693, 3.695, 3.695, 3.695, 3.696, 3.698, 3.703, 3.705, 3.709, 3.715, 3.725, 3.734, 3.745, 3.751, 3.755, 3.762, 3.783, 3.818, + 3.781, 3.774, 3.767, 3.767, 3.755, 3.741, 3.729, 3.722, 3.712, 3.708, 3.701, 3.699, 3.695, 3.693, 3.693, 3.694, 3.695, 3.695, 3.697, 3.698, 3.702, 3.704, 3.709, 3.713, 3.725, 3.732, 3.746, 3.751, 3.756, 3.763, 3.783, 3.821, + 3.781, 3.774, 3.769, 3.769, 3.756, 3.741, 3.731, 3.724, 3.713, 3.711, 3.707, 3.699, 3.697, 3.694, 3.693, 3.694, 3.695, 3.695, 3.697, 3.698, 3.702, 3.704, 3.709, 3.713, 3.724, 3.734, 3.747, 3.751, 3.756, 3.765, 3.784, 3.821, + 3.784, 3.776, 3.773, 3.773, 3.759, 3.742, 3.733, 3.726, 3.719, 3.711, 3.709, 3.703, 3.698, 3.695, 3.694, 3.695, 3.697, 3.696, 3.698, 3.699, 3.703, 3.706, 3.711, 3.714, 3.727, 3.735, 3.746, 3.751, 3.757, 3.766, 3.787, 3.822, + 3.786, 3.783, 3.774, 3.774, 3.766, 3.747, 3.737, 3.727, 3.722, 3.716, 3.711, 3.706, 3.702, 3.698, 3.697, 3.698, 3.699, 3.699, 3.701, 3.703, 3.706, 3.711, 3.713, 3.719, 3.731, 3.739, 3.748, 3.753, 3.761, 3.769, 3.789, 3.826, + 3.786, 3.784, 3.779, 3.779, 3.769, 3.751, 3.742, 3.732, 3.725, 3.719, 3.715, 3.711, 3.706, 3.704, 3.701, 3.701, 3.702, 3.702, 3.705, 3.707, 3.712, 3.714, 3.717, 3.724, 3.733, 3.743, 3.749, 3.758, 3.764, 3.769, 3.791, 3.826, + 3.793, 3.787, 3.782, 3.782, 3.774, 3.756, 3.747, 3.737, 3.729, 3.725, 3.719, 3.715, 3.712, 3.708, 3.707, 3.706, 3.707, 3.708, 3.709, 3.713, 3.714, 3.717, 3.723, 3.729, 3.736, 3.747, 3.757, 3.764, 3.768, 3.774, 3.794, 3.829, + 3.794, 3.791, 3.786, 3.786, 3.779, 3.762, 3.751, 3.742, 3.735, 3.729, 3.725, 3.719, 3.716, 3.711, 3.709, 3.709, 3.709, 3.711, 3.716, 3.717, 3.721, 3.723, 3.726, 3.732, 3.741, 3.752, 3.761, 3.767, 3.773, 3.779, 3.801, 3.829, + 3.802, 3.798, 3.793, 3.793, 3.779, 3.766, 3.754, 3.746, 3.741, 3.736, 3.731, 3.726, 3.719, 3.717, 3.716, 3.715, 3.716, 3.717, 3.719, 3.721, 3.724, 3.726, 3.731, 3.737, 3.744, 3.756, 3.766, 3.772, 3.776, 3.784, 3.807, 3.839, + 3.805, 3.799, 3.795, 3.795, 3.784, 3.767, 3.757, 3.749, 3.744, 3.739, 3.736, 3.731, 3.726, 3.722, 3.719, 3.719, 3.719, 3.721, 3.723, 3.725, 3.727, 3.732, 3.738, 3.742, 3.751, 3.761, 3.771, 3.775, 3.782, 3.789, 3.811, 3.841, + 3.804, 3.801, 3.799, 3.799, 3.787, 3.772, 3.761, 3.752, 3.746, 3.742, 3.739, 3.735, 3.729, 3.726, 3.723, 3.724, 3.725, 3.726, 3.727, 3.728, 3.732, 3.736, 3.739, 3.745, 3.754, 3.765, 3.775, 3.779, 3.785, 3.795, 3.816, 3.844, + 3.801, 3.799, 3.796, 3.796, 3.787, 3.773, 3.761, 3.753, 3.746, 3.743, 3.739, 3.735, 3.731, 3.726, 3.725, 3.725, 3.725, 3.726, 3.727, 3.729, 3.733, 3.736, 3.741, 3.745, 3.755, 3.766, 3.776, 3.783, 3.786, 3.797, 3.819, 3.851, + 3.799, 3.795, 3.788, 3.788, 3.783, 3.772, 3.759, 3.749, 3.744, 3.738, 3.735, 3.733, 3.726, 3.724, 3.722, 3.722, 3.723, 3.724, 3.725, 3.727, 3.729, 3.733, 3.736, 3.742, 3.754, 3.762, 3.772, 3.779, 3.784, 3.796, 3.821, 3.859, + 3.799, 3.789, 3.787, 3.788, 3.779, 3.766, 3.755, 3.749, 3.742, 3.736, 3.733, 3.727, 3.723, 3.722, 3.721, 3.719, 3.719, 3.721, 3.725, 3.726, 3.728, 3.732, 3.734, 3.741, 3.747, 3.758, 3.771, 3.778, 3.785, 3.796, 3.825, 3.862, + 3.824, 3.799, 3.789, 3.789, 3.788, 3.777, 3.761, 3.751, 3.743, 3.739, 3.736, 3.728, 3.726, 3.725, 3.721, 3.719, 3.721, 3.723, 3.727, 3.728, 3.729, 3.733, 3.737, 3.744, 3.755, 3.769, 3.776, 3.784, 3.793, 3.819, 3.863, 3.877, + 3.833, 3.833, 3.833, 3.842, 3.825, 3.815, 3.807, 3.799, 3.792, 3.788, 3.785, 3.782, 3.778, 3.777, 3.773, 3.772, 3.772, 3.774, 3.778, 3.779, 3.779, 3.785, 3.792, 3.798, 3.803, 3.811, 3.822, 3.834, 3.843, 3.846, 3.877, 3.886 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 2.616, 2.616, 2.618, 2.621, 2.619, 2.618, 2.615, 2.615, 2.613, 2.611, 2.609, 2.609, 2.609, 2.611, 2.611, 2.611, 2.611, 2.609, 2.608, 2.608, 2.611, 2.613, 2.613, 2.614, 2.614, 2.615, 2.615, 2.622, 2.624, 2.621, 2.624, 2.641, + 2.616, 2.618, 2.621, 2.623, 2.623, 2.619, 2.618, 2.616, 2.616, 2.613, 2.611, 2.611, 2.611, 2.611, 2.612, 2.612, 2.611, 2.611, 2.611, 2.611, 2.611, 2.612, 2.613, 2.612, 2.613, 2.615, 2.617, 2.621, 2.621, 2.619, 2.621, 2.641, + 2.621, 2.624, 2.627, 2.627, 2.625, 2.623, 2.621, 2.619, 2.618, 2.618, 2.618, 2.617, 2.616, 2.616, 2.615, 2.613, 2.612, 2.613, 2.613, 2.614, 2.614, 2.613, 2.614, 2.613, 2.614, 2.617, 2.619, 2.621, 2.621, 2.619, 2.623, 2.643, + 2.626, 2.627, 2.628, 2.629, 2.628, 2.625, 2.622, 2.621, 2.621, 2.622, 2.621, 2.619, 2.619, 2.618, 2.617, 2.616, 2.616, 2.616, 2.618, 2.618, 2.617, 2.617, 2.618, 2.619, 2.621, 2.623, 2.624, 2.626, 2.625, 2.624, 2.625, 2.654, + 2.627, 2.628, 2.628, 2.628, 2.626, 2.623, 2.622, 2.622, 2.622, 2.622, 2.621, 2.621, 2.619, 2.617, 2.617, 2.616, 2.617, 2.617, 2.618, 2.619, 2.618, 2.618, 2.618, 2.621, 2.622, 2.624, 2.626, 2.627, 2.627, 2.626, 2.628, 2.655, + 2.625, 2.626, 2.627, 2.626, 2.625, 2.623, 2.622, 2.621, 2.622, 2.621, 2.621, 2.619, 2.617, 2.616, 2.615, 2.616, 2.616, 2.616, 2.616, 2.616, 2.617, 2.618, 2.619, 2.621, 2.622, 2.624, 2.626, 2.628, 2.628, 2.629, 2.629, 2.655, + 2.626, 2.625, 2.626, 2.625, 2.625, 2.623, 2.622, 2.622, 2.622, 2.621, 2.619, 2.617, 2.616, 2.614, 2.613, 2.614, 2.614, 2.614, 2.614, 2.614, 2.616, 2.618, 2.619, 2.621, 2.623, 2.624, 2.627, 2.629, 2.631, 2.629, 2.631, 2.651, + 2.625, 2.625, 2.625, 2.624, 2.623, 2.623, 2.622, 2.622, 2.622, 2.621, 2.619, 2.617, 2.614, 2.613, 2.612, 2.611, 2.611, 2.612, 2.612, 2.613, 2.616, 2.618, 2.619, 2.622, 2.624, 2.626, 2.628, 2.631, 2.631, 2.631, 2.631, 2.651, + 2.625, 2.625, 2.624, 2.623, 2.622, 2.622, 2.622, 2.622, 2.622, 2.621, 2.617, 2.615, 2.613, 2.612, 2.611, 2.611, 2.611, 2.611, 2.611, 2.613, 2.615, 2.618, 2.619, 2.622, 2.625, 2.627, 2.631, 2.632, 2.631, 2.629, 2.631, 2.651, + 2.624, 2.624, 2.622, 2.622, 2.621, 2.621, 2.621, 2.621, 2.621, 2.618, 2.616, 2.614, 2.612, 2.611, 2.609, 2.609, 2.608, 2.609, 2.611, 2.611, 2.615, 2.617, 2.619, 2.621, 2.625, 2.628, 2.631, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.622, 2.623, 2.622, 2.622, 2.621, 2.619, 2.619, 2.619, 2.618, 2.616, 2.614, 2.613, 2.611, 2.609, 2.608, 2.606, 2.607, 2.607, 2.609, 2.611, 2.615, 2.617, 2.619, 2.622, 2.626, 2.629, 2.632, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.621, 2.622, 2.622, 2.622, 2.621, 2.619, 2.619, 2.618, 2.617, 2.614, 2.613, 2.611, 2.611, 2.607, 2.606, 2.605, 2.604, 2.605, 2.607, 2.609, 2.613, 2.616, 2.619, 2.622, 2.627, 2.631, 2.632, 2.632, 2.631, 2.627, 2.627, 2.651, + 2.619, 2.621, 2.623, 2.623, 2.621, 2.621, 2.619, 2.617, 2.616, 2.615, 2.613, 2.609, 2.607, 2.604, 2.602, 2.601, 2.602, 2.603, 2.605, 2.609, 2.612, 2.616, 2.619, 2.624, 2.628, 2.631, 2.632, 2.633, 2.629, 2.627, 2.627, 2.651, + 2.619, 2.621, 2.623, 2.623, 2.622, 2.621, 2.618, 2.617, 2.615, 2.614, 2.612, 2.608, 2.603, 2.601, 2.598, 2.597, 2.599, 2.602, 2.605, 2.608, 2.611, 2.615, 2.622, 2.625, 2.629, 2.631, 2.631, 2.633, 2.631, 2.627, 2.627, 2.651, + 2.621, 2.622, 2.623, 2.623, 2.622, 2.621, 2.618, 2.617, 2.616, 2.614, 2.611, 2.606, 2.601, 2.598, 2.595, 2.595, 2.597, 2.601, 2.604, 2.608, 2.612, 2.615, 2.623, 2.627, 2.629, 2.631, 2.631, 2.632, 2.631, 2.628, 2.628, 2.651, + 2.622, 2.623, 2.624, 2.624, 2.622, 2.621, 2.619, 2.617, 2.615, 2.613, 2.609, 2.606, 2.601, 2.596, 2.594, 2.594, 2.596, 2.599, 2.603, 2.609, 2.613, 2.617, 2.623, 2.627, 2.629, 2.631, 2.632, 2.632, 2.631, 2.629, 2.631, 2.651, + 2.623, 2.625, 2.625, 2.624, 2.621, 2.621, 2.619, 2.617, 2.616, 2.613, 2.608, 2.605, 2.601, 2.595, 2.593, 2.593, 2.595, 2.598, 2.604, 2.609, 2.615, 2.619, 2.625, 2.627, 2.629, 2.629, 2.632, 2.633, 2.632, 2.629, 2.631, 2.651, + 2.624, 2.626, 2.626, 2.623, 2.621, 2.619, 2.618, 2.617, 2.615, 2.612, 2.608, 2.605, 2.601, 2.597, 2.595, 2.595, 2.596, 2.598, 2.605, 2.609, 2.616, 2.621, 2.626, 2.627, 2.629, 2.631, 2.633, 2.633, 2.633, 2.631, 2.631, 2.655, + 2.624, 2.625, 2.625, 2.623, 2.621, 2.619, 2.618, 2.617, 2.614, 2.612, 2.609, 2.606, 2.602, 2.599, 2.598, 2.597, 2.598, 2.602, 2.607, 2.612, 2.619, 2.621, 2.626, 2.628, 2.629, 2.632, 2.633, 2.634, 2.633, 2.631, 2.631, 2.655, + 2.624, 2.625, 2.625, 2.623, 2.621, 2.621, 2.618, 2.617, 2.614, 2.612, 2.611, 2.608, 2.604, 2.602, 2.599, 2.599, 2.603, 2.606, 2.611, 2.616, 2.621, 2.624, 2.626, 2.629, 2.631, 2.632, 2.633, 2.634, 2.634, 2.633, 2.633, 2.656, + 2.623, 2.624, 2.625, 2.623, 2.622, 2.621, 2.619, 2.617, 2.615, 2.613, 2.611, 2.611, 2.607, 2.604, 2.604, 2.604, 2.606, 2.609, 2.613, 2.619, 2.622, 2.625, 2.628, 2.631, 2.632, 2.633, 2.633, 2.636, 2.636, 2.634, 2.634, 2.658, + 2.623, 2.624, 2.625, 2.623, 2.622, 2.619, 2.618, 2.616, 2.614, 2.613, 2.612, 2.611, 2.609, 2.608, 2.607, 2.608, 2.609, 2.613, 2.617, 2.621, 2.623, 2.626, 2.629, 2.631, 2.632, 2.633, 2.634, 2.635, 2.636, 2.636, 2.636, 2.661, + 2.623, 2.624, 2.625, 2.625, 2.623, 2.621, 2.619, 2.616, 2.615, 2.614, 2.613, 2.612, 2.612, 2.611, 2.611, 2.611, 2.614, 2.615, 2.619, 2.622, 2.625, 2.627, 2.631, 2.632, 2.633, 2.635, 2.635, 2.637, 2.637, 2.636, 2.637, 2.661, + 2.623, 2.624, 2.625, 2.626, 2.624, 2.621, 2.619, 2.617, 2.616, 2.615, 2.615, 2.614, 2.614, 2.614, 2.614, 2.614, 2.616, 2.619, 2.621, 2.623, 2.626, 2.628, 2.631, 2.632, 2.634, 2.635, 2.636, 2.637, 2.638, 2.637, 2.638, 2.661, + 2.625, 2.626, 2.627, 2.627, 2.626, 2.623, 2.619, 2.619, 2.618, 2.618, 2.618, 2.617, 2.617, 2.616, 2.616, 2.616, 2.619, 2.622, 2.623, 2.625, 2.628, 2.628, 2.631, 2.632, 2.634, 2.636, 2.638, 2.639, 2.639, 2.638, 2.638, 2.661, + 2.625, 2.626, 2.627, 2.628, 2.626, 2.623, 2.621, 2.619, 2.619, 2.619, 2.619, 2.619, 2.619, 2.618, 2.618, 2.619, 2.623, 2.624, 2.625, 2.627, 2.629, 2.629, 2.632, 2.633, 2.635, 2.638, 2.639, 2.639, 2.639, 2.636, 2.636, 2.662, + 2.625, 2.627, 2.628, 2.628, 2.626, 2.624, 2.623, 2.622, 2.621, 2.621, 2.621, 2.621, 2.621, 2.621, 2.621, 2.624, 2.624, 2.625, 2.627, 2.628, 2.631, 2.631, 2.632, 2.634, 2.636, 2.639, 2.639, 2.641, 2.639, 2.635, 2.635, 2.663, + 2.625, 2.626, 2.628, 2.628, 2.627, 2.625, 2.624, 2.623, 2.623, 2.622, 2.623, 2.624, 2.624, 2.625, 2.625, 2.625, 2.625, 2.626, 2.627, 2.629, 2.631, 2.632, 2.633, 2.635, 2.638, 2.641, 2.642, 2.643, 2.642, 2.636, 2.636, 2.665, + 2.624, 2.626, 2.628, 2.628, 2.628, 2.626, 2.624, 2.624, 2.623, 2.623, 2.623, 2.625, 2.627, 2.627, 2.626, 2.626, 2.626, 2.627, 2.628, 2.629, 2.632, 2.633, 2.635, 2.637, 2.639, 2.642, 2.644, 2.644, 2.642, 2.638, 2.638, 2.665, + 2.623, 2.625, 2.626, 2.627, 2.626, 2.626, 2.624, 2.623, 2.623, 2.623, 2.623, 2.623, 2.626, 2.627, 2.626, 2.626, 2.626, 2.626, 2.628, 2.628, 2.629, 2.631, 2.634, 2.636, 2.639, 2.642, 2.644, 2.643, 2.641, 2.637, 2.638, 2.659, + 2.623, 2.627, 2.627, 2.627, 2.627, 2.628, 2.627, 2.624, 2.624, 2.623, 2.624, 2.624, 2.628, 2.628, 2.627, 2.628, 2.628, 2.628, 2.629, 2.629, 2.631, 2.635, 2.637, 2.639, 2.641, 2.643, 2.646, 2.645, 2.643, 2.641, 2.654, 2.659, + 2.642, 2.641, 2.643, 2.645, 2.645, 2.644, 2.644, 2.643, 2.643, 2.642, 2.642, 2.642, 2.643, 2.644, 2.644, 2.644, 2.646, 2.646, 2.647, 2.649, 2.651, 2.652, 2.654, 2.656, 2.658, 2.661, 2.661, 2.661, 2.659, 2.654, 2.659, 2.659 + ] + }, + { + "ct": 5000, + "table": + [ + 1.391, 1.394, 1.395, 1.396, 1.398, 1.398, 1.398, 1.398, 1.398, 1.399, 1.399, 1.398, 1.398, 1.399, 1.399, 1.399, 1.399, 1.398, 1.398, 1.398, 1.399, 1.399, 1.398, 1.397, 1.397, 1.398, 1.399, 1.401, 1.399, 1.397, 1.399, 1.402, + 1.393, 1.395, 1.396, 1.398, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.401, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.399, 1.398, 1.398, 1.399, 1.401, 1.401, 1.399, 1.398, 1.399, 1.402, + 1.398, 1.401, 1.401, 1.401, 1.401, 1.401, 1.402, 1.402, 1.402, 1.402, 1.403, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.402, 1.401, 1.401, 1.401, 1.401, 1.401, 1.399, 1.399, 1.401, 1.401, 1.401, 1.401, 1.399, 1.401, 1.406, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.405, 1.405, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.402, 1.403, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.403, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.402, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.405, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.403, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.405, 1.404, 1.404, 1.404, 1.404, 1.405, 1.404, 1.405, 1.405, 1.405, 1.406, 1.406, 1.404, 1.405, 1.412, + 1.401, 1.401, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.406, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.406, 1.407, 1.407, 1.406, 1.405, 1.405, 1.412, + 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.405, 1.405, 1.405, 1.404, 1.404, 1.404, 1.404, 1.404, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.407, 1.407, 1.408, 1.408, 1.407, 1.405, 1.405, 1.412, + 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.404, 1.405, 1.406, 1.405, 1.405, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.407, 1.405, 1.405, 1.413, + 1.402, 1.402, 1.402, 1.402, 1.402, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.403, 1.403, 1.402, 1.402, 1.402, 1.403, 1.403, 1.404, 1.405, 1.406, 1.406, 1.407, 1.408, 1.409, 1.409, 1.408, 1.407, 1.405, 1.405, 1.414, + 1.402, 1.402, 1.402, 1.402, 1.403, 1.403, 1.405, 1.405, 1.405, 1.405, 1.404, 1.404, 1.403, 1.402, 1.402, 1.401, 1.401, 1.402, 1.403, 1.403, 1.404, 1.405, 1.406, 1.407, 1.409, 1.409, 1.409, 1.409, 1.407, 1.405, 1.405, 1.413, + 1.402, 1.402, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.401, 1.401, 1.399, 1.399, 1.401, 1.402, 1.403, 1.404, 1.405, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.408, 1.405, 1.405, 1.413, + 1.402, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.405, 1.404, 1.402, 1.401, 1.399, 1.398, 1.398, 1.399, 1.399, 1.401, 1.403, 1.404, 1.405, 1.407, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.401, 1.398, 1.397, 1.397, 1.398, 1.399, 1.401, 1.403, 1.404, 1.405, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.399, 1.397, 1.396, 1.396, 1.397, 1.399, 1.401, 1.403, 1.404, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.408, 1.406, 1.406, 1.413, + 1.403, 1.404, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.404, 1.403, 1.402, 1.399, 1.397, 1.396, 1.396, 1.397, 1.398, 1.401, 1.403, 1.406, 1.407, 1.409, 1.409, 1.411, 1.409, 1.409, 1.409, 1.408, 1.407, 1.407, 1.413, + 1.403, 1.404, 1.404, 1.403, 1.403, 1.404, 1.404, 1.405, 1.404, 1.404, 1.403, 1.402, 1.399, 1.398, 1.397, 1.397, 1.398, 1.399, 1.402, 1.404, 1.406, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.407, 1.407, 1.414, + 1.403, 1.403, 1.404, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.403, 1.403, 1.402, 1.401, 1.399, 1.398, 1.398, 1.398, 1.401, 1.403, 1.404, 1.408, 1.408, 1.409, 1.409, 1.409, 1.411, 1.411, 1.409, 1.408, 1.407, 1.407, 1.415, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.403, 1.403, 1.403, 1.401, 1.401, 1.399, 1.399, 1.401, 1.402, 1.404, 1.407, 1.408, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.407, 1.407, 1.415, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.403, 1.403, 1.403, 1.402, 1.401, 1.401, 1.401, 1.402, 1.404, 1.406, 1.407, 1.408, 1.409, 1.411, 1.411, 1.411, 1.409, 1.409, 1.409, 1.409, 1.408, 1.408, 1.415, + 1.402, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.405, 1.406, 1.408, 1.408, 1.409, 1.411, 1.411, 1.411, 1.411, 1.409, 1.409, 1.409, 1.408, 1.408, 1.416, + 1.403, 1.402, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.403, 1.404, 1.404, 1.404, 1.405, 1.406, 1.407, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.416, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.406, 1.407, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.405, 1.406, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.409, 1.408, 1.408, 1.417, + 1.403, 1.403, 1.403, 1.403, 1.404, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.406, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.409, 1.407, 1.407, 1.416, + 1.402, 1.403, 1.403, 1.403, 1.404, 1.404, 1.404, 1.404, 1.405, 1.405, 1.406, 1.407, 1.407, 1.407, 1.408, 1.409, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.409, 1.407, 1.407, 1.417, + 1.402, 1.403, 1.403, 1.404, 1.404, 1.404, 1.405, 1.405, 1.405, 1.406, 1.406, 1.407, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.409, 1.411, 1.411, 1.411, 1.412, 1.411, 1.409, 1.407, 1.407, 1.415, + 1.402, 1.402, 1.403, 1.403, 1.404, 1.404, 1.405, 1.405, 1.405, 1.405, 1.406, 1.407, 1.408, 1.408, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.412, 1.411, 1.409, 1.407, 1.407, 1.413, + 1.402, 1.402, 1.403, 1.403, 1.405, 1.406, 1.406, 1.406, 1.406, 1.406, 1.407, 1.408, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.412, 1.412, 1.413, 1.413, 1.411, 1.408, 1.411, 1.413, + 1.406, 1.406, 1.408, 1.408, 1.409, 1.409, 1.411, 1.411, 1.411, 1.411, 1.411, 1.411, 1.414, 1.414, 1.414, 1.414, 1.415, 1.415, 1.415, 1.415, 1.416, 1.416, 1.416, 1.417, 1.418, 1.418, 1.417, 1.417, 1.414, 1.411, 1.413, 1.413 + ] + } + ], + "luminance_lut": + [ + 1.554, 1.522, 1.466, 1.422, 1.385, 1.351, 1.322, 1.294, 1.269, 1.246, 1.228, 1.214, 1.207, 1.202, 1.199, 1.199, 1.199, 1.199, 1.202, 1.207, 1.218, 1.235, 1.255, 1.279, 1.305, 1.333, 1.365, 1.402, 1.447, 1.508, 1.602, 1.638, + 1.522, 1.478, 1.431, 1.391, 1.355, 1.323, 1.298, 1.271, 1.247, 1.228, 1.212, 1.199, 1.187, 1.179, 1.173, 1.172, 1.172, 1.174, 1.179, 1.189, 1.201, 1.216, 1.235, 1.256, 1.282, 1.308, 1.335, 1.368, 1.411, 1.461, 1.535, 1.602, + 1.479, 1.449, 1.407, 1.367, 1.332, 1.301, 1.271, 1.247, 1.226, 1.208, 1.191, 1.178, 1.166, 1.158, 1.153, 1.151, 1.151, 1.153, 1.159, 1.168, 1.179, 1.194, 1.212, 1.234, 1.256, 1.282, 1.311, 1.343, 1.382, 1.427, 1.489, 1.535, + 1.454, 1.423, 1.383, 1.345, 1.309, 1.278, 1.249, 1.226, 1.206, 1.187, 1.171, 1.158, 1.146, 1.138, 1.132, 1.129, 1.129, 1.133, 1.139, 1.147, 1.159, 1.173, 1.191, 1.212, 1.234, 1.261, 1.288, 1.321, 1.357, 1.401, 1.455, 1.489, + 1.433, 1.401, 1.362, 1.325, 1.289, 1.258, 1.231, 1.206, 1.187, 1.169, 1.153, 1.138, 1.129, 1.121, 1.115, 1.112, 1.112, 1.114, 1.121, 1.129, 1.141, 1.155, 1.172, 1.191, 1.214, 1.241, 1.269, 1.301, 1.337, 1.377, 1.428, 1.457, + 1.415, 1.382, 1.343, 1.306, 1.273, 1.241, 1.213, 1.189, 1.169, 1.153, 1.137, 1.123, 1.112, 1.105, 1.097, 1.095, 1.095, 1.098, 1.103, 1.112, 1.124, 1.139, 1.155, 1.173, 1.197, 1.222, 1.252, 1.282, 1.317, 1.356, 1.405, 1.434, + 1.398, 1.363, 1.325, 1.289, 1.256, 1.224, 1.198, 1.175, 1.155, 1.137, 1.123, 1.108, 1.097, 1.089, 1.083, 1.079, 1.079, 1.083, 1.088, 1.097, 1.109, 1.124, 1.139, 1.158, 1.181, 1.206, 1.234, 1.266, 1.299, 1.339, 1.384, 1.415, + 1.382, 1.347, 1.309, 1.274, 1.242, 1.211, 1.185, 1.162, 1.142, 1.124, 1.108, 1.095, 1.083, 1.075, 1.069, 1.066, 1.066, 1.068, 1.074, 1.083, 1.096, 1.109, 1.125, 1.145, 1.166, 1.191, 1.219, 1.251, 1.285, 1.324, 1.367, 1.399, + 1.369, 1.334, 1.296, 1.261, 1.228, 1.199, 1.173, 1.151, 1.131, 1.112, 1.095, 1.083, 1.071, 1.062, 1.056, 1.053, 1.053, 1.055, 1.061, 1.069, 1.083, 1.096, 1.112, 1.132, 1.153, 1.178, 1.206, 1.237, 1.271, 1.309, 1.353, 1.385, + 1.359, 1.321, 1.284, 1.251, 1.217, 1.189, 1.164, 1.141, 1.121, 1.102, 1.086, 1.071, 1.061, 1.049, 1.045, 1.042, 1.042, 1.043, 1.051, 1.061, 1.069, 1.085, 1.101, 1.121, 1.143, 1.167, 1.195, 1.225, 1.259, 1.298, 1.341, 1.375, + 1.351, 1.312, 1.275, 1.241, 1.209, 1.181, 1.155, 1.133, 1.112, 1.092, 1.076, 1.061, 1.049, 1.041, 1.034, 1.032, 1.032, 1.035, 1.041, 1.051, 1.061, 1.075, 1.092, 1.112, 1.133, 1.158, 1.185, 1.216, 1.249, 1.288, 1.331, 1.364, + 1.344, 1.303, 1.267, 1.233, 1.201, 1.173, 1.147, 1.124, 1.104, 1.085, 1.067, 1.053, 1.041, 1.033, 1.024, 1.022, 1.022, 1.025, 1.034, 1.041, 1.053, 1.066, 1.083, 1.103, 1.126, 1.149, 1.177, 1.207, 1.241, 1.279, 1.321, 1.357, + 1.339, 1.297, 1.261, 1.226, 1.194, 1.166, 1.142, 1.119, 1.098, 1.078, 1.061, 1.046, 1.034, 1.024, 1.017, 1.014, 1.014, 1.017, 1.025, 1.034, 1.046, 1.059, 1.077, 1.096, 1.118, 1.143, 1.169, 1.201, 1.235, 1.273, 1.314, 1.352, + 1.337, 1.293, 1.256, 1.223, 1.191, 1.163, 1.136, 1.114, 1.093, 1.074, 1.056, 1.041, 1.027, 1.017, 1.012, 1.006, 1.006, 1.013, 1.017, 1.028, 1.041, 1.055, 1.072, 1.092, 1.114, 1.138, 1.165, 1.195, 1.229, 1.268, 1.309, 1.348, + 1.337, 1.291, 1.253, 1.219, 1.187, 1.159, 1.133, 1.109, 1.089, 1.071, 1.053, 1.037, 1.023, 1.012, 1.006, 1.002, 1.003, 1.006, 1.013, 1.023, 1.038, 1.052, 1.069, 1.089, 1.111, 1.135, 1.161, 1.192, 1.226, 1.264, 1.306, 1.348, + 1.337, 1.291, 1.253, 1.218, 1.186, 1.157, 1.132, 1.109, 1.088, 1.068, 1.049, 1.035, 1.021, 1.009, 1.001, 1.001, 1.001, 1.003, 1.011, 1.021, 1.035, 1.051, 1.069, 1.087, 1.109, 1.133, 1.161, 1.189, 1.224, 1.262, 1.304, 1.347, + 1.341, 1.292, 1.253, 1.218, 1.186, 1.157, 1.132, 1.109, 1.088, 1.068, 1.049, 1.034, 1.021, 1.009, 1.001, 1.001, 1.001, 1.003, 1.011, 1.021, 1.035, 1.051, 1.069, 1.087, 1.109, 1.133, 1.161, 1.189, 1.224, 1.262, 1.304, 1.347, + 1.348, 1.298, 1.255, 1.219, 1.188, 1.159, 1.134, 1.111, 1.088, 1.069, 1.051, 1.035, 1.021, 1.009, 1.003, 1.001, 1.002, 1.004, 1.011, 1.022, 1.036, 1.053, 1.071, 1.089, 1.111, 1.135, 1.162, 1.191, 1.226, 1.264, 1.306, 1.347, + 1.354, 1.306, 1.258, 1.222, 1.191, 1.162, 1.135, 1.113, 1.092, 1.073, 1.054, 1.038, 1.024, 1.014, 1.008, 1.003, 1.004, 1.008, 1.014, 1.026, 1.039, 1.056, 1.073, 1.093, 1.115, 1.139, 1.165, 1.195, 1.229, 1.267, 1.309, 1.349, + 1.358, 1.312, 1.263, 1.227, 1.195, 1.167, 1.141, 1.117, 1.097, 1.078, 1.061, 1.043, 1.029, 1.021, 1.014, 1.008, 1.008, 1.014, 1.021, 1.032, 1.045, 1.061, 1.078, 1.097, 1.119, 1.144, 1.169, 1.201, 1.234, 1.272, 1.315, 1.353, + 1.364, 1.319, 1.269, 1.234, 1.201, 1.174, 1.148, 1.124, 1.103, 1.084, 1.067, 1.052, 1.038, 1.029, 1.021, 1.016, 1.016, 1.021, 1.029, 1.038, 1.051, 1.067, 1.084, 1.103, 1.126, 1.151, 1.176, 1.207, 1.241, 1.279, 1.321, 1.358, + 1.371, 1.326, 1.277, 1.242, 1.209, 1.181, 1.155, 1.132, 1.111, 1.092, 1.075, 1.061, 1.049, 1.038, 1.029, 1.027, 1.027, 1.029, 1.038, 1.047, 1.061, 1.075, 1.092, 1.111, 1.133, 1.157, 1.185, 1.213, 1.247, 1.286, 1.329, 1.365, + 1.379, 1.334, 1.287, 1.251, 1.219, 1.191, 1.164, 1.141, 1.119, 1.101, 1.085, 1.071, 1.061, 1.049, 1.041, 1.038, 1.038, 1.041, 1.047, 1.059, 1.071, 1.084, 1.101, 1.119, 1.141, 1.165, 1.193, 1.223, 1.257, 1.295, 1.338, 1.374, + 1.389, 1.343, 1.298, 1.262, 1.231, 1.201, 1.174, 1.151, 1.131, 1.111, 1.095, 1.083, 1.071, 1.061, 1.054, 1.051, 1.051, 1.054, 1.059, 1.071, 1.081, 1.094, 1.111, 1.129, 1.152, 1.176, 1.203, 1.235, 1.269, 1.307, 1.351, 1.384, + 1.401, 1.351, 1.311, 1.274, 1.242, 1.214, 1.187, 1.164, 1.142, 1.124, 1.108, 1.095, 1.083, 1.074, 1.068, 1.066, 1.066, 1.068, 1.073, 1.081, 1.094, 1.108, 1.123, 1.141, 1.164, 1.188, 1.215, 1.247, 1.281, 1.321, 1.364, 1.396, + 1.412, 1.366, 1.327, 1.289, 1.257, 1.227, 1.201, 1.176, 1.156, 1.137, 1.122, 1.108, 1.096, 1.088, 1.083, 1.081, 1.081, 1.082, 1.087, 1.095, 1.108, 1.122, 1.136, 1.154, 1.177, 1.201, 1.229, 1.261, 1.296, 1.337, 1.382, 1.409, + 1.421, 1.383, 1.343, 1.306, 1.273, 1.243, 1.216, 1.192, 1.169, 1.152, 1.137, 1.122, 1.111, 1.103, 1.098, 1.095, 1.095, 1.097, 1.102, 1.111, 1.123, 1.136, 1.152, 1.169, 1.191, 1.217, 1.246, 1.278, 1.314, 1.354, 1.399, 1.429, + 1.434, 1.402, 1.362, 1.324, 1.291, 1.261, 1.232, 1.208, 1.187, 1.168, 1.152, 1.138, 1.127, 1.119, 1.114, 1.112, 1.112, 1.115, 1.121, 1.128, 1.139, 1.152, 1.169, 1.186, 1.209, 1.234, 1.262, 1.295, 1.332, 1.372, 1.419, 1.451, + 1.453, 1.422, 1.382, 1.344, 1.309, 1.278, 1.249, 1.226, 1.204, 1.187, 1.168, 1.155, 1.144, 1.135, 1.131, 1.131, 1.131, 1.133, 1.138, 1.146, 1.157, 1.171, 1.186, 1.206, 1.227, 1.252, 1.281, 1.314, 1.351, 1.393, 1.442, 1.473, + 1.475, 1.446, 1.404, 1.366, 1.329, 1.298, 1.269, 1.245, 1.224, 1.204, 1.188, 1.174, 1.163, 1.154, 1.149, 1.148, 1.148, 1.152, 1.156, 1.164, 1.176, 1.189, 1.206, 1.226, 1.247, 1.274, 1.303, 1.336, 1.374, 1.417, 1.471, 1.505, + 1.503, 1.472, 1.428, 1.389, 1.353, 1.321, 1.291, 1.266, 1.245, 1.224, 1.207, 1.192, 1.183, 1.174, 1.169, 1.167, 1.168, 1.169, 1.175, 1.183, 1.195, 1.209, 1.226, 1.247, 1.267, 1.294, 1.325, 1.359, 1.397, 1.445, 1.505, 1.548, + 1.534, 1.503, 1.455, 1.413, 1.378, 1.344, 1.315, 1.289, 1.265, 1.243, 1.224, 1.207, 1.196, 1.192, 1.189, 1.189, 1.189, 1.189, 1.192, 1.198, 1.209, 1.226, 1.244, 1.266, 1.291, 1.318, 1.349, 1.383, 1.425, 1.475, 1.548, 1.591 + ], + "sigma": 0.00095, + "sigma_Cb": 0.00098 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2360, + "ccm": + [ + 1.66078, -0.23588, -0.42491, + -0.47456, 1.82763, -0.35307, + -0.00545, -1.44729, 2.45273 + ] + }, + { + "ct": 2870, + "ccm": + [ + 1.78373, -0.55344, -0.23029, + -0.39951, 1.69701, -0.29751, + 0.01986, -1.06525, 2.04539 + ] + }, + { + "ct": 2970, + "ccm": + [ + 1.73511, -0.56973, -0.16537, + -0.36338, 1.69878, -0.33539, + -0.02354, -0.76813, 1.79168 + ] + }, + { + "ct": 3000, + "ccm": + [ + 2.06374, -0.92218, -0.14156, + -0.41721, 1.69289, -0.27568, + -0.00554, -0.92741, 1.93295 + ] + }, + { + "ct": 3700, + "ccm": + [ + 2.13792, -1.08136, -0.05655, + -0.34739, 1.58989, -0.24249, + -0.00349, -0.76789, 1.77138 + ] + }, + { + "ct": 3870, + "ccm": + [ + 1.83834, -0.70528, -0.13307, + -0.30499, 1.60523, -0.30024, + -0.05701, -0.58313, 1.64014 + ] + }, + { + "ct": 4000, + "ccm": + [ + 2.15741, -1.10295, -0.05447, + -0.34631, 1.61158, -0.26528, + -0.02723, -0.70288, 1.73011 + ] + }, + { + "ct": 4400, + "ccm": + [ + 2.05729, -0.95007, -0.10723, + -0.41712, 1.78606, -0.36894, + -0.11899, -0.55727, 1.67626 + ] + }, + { + "ct": 4715, + "ccm": + [ + 1.90255, -0.77478, -0.12777, + -0.31338, 1.88197, -0.56858, + -0.06001, -0.61785, 1.67786 + ] + }, + { + "ct": 5920, + "ccm": + [ + 1.98691, -0.84671, -0.14019, + -0.26581, 1.70615, -0.44035, + -0.09532, -0.47332, 1.56864 + ] + }, + { + "ct": 9050, + "ccm": + [ + 2.09255, -0.76541, -0.32714, + -0.28973, 2.27462, -0.98489, + -0.17299, -0.61275, 1.78574 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx477_scientific.json b/src/ipa/rpi/pisp/data/imx477_scientific.json new file mode 100644 index 000000000..4ec5a15be --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx477_scientific.json @@ -0,0 +1,546 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 12000, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 740, + "reference_Y": 15051 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.809 + } + }, + { + "rpi.geq": + { + "offset": 204, + "slope": 0.0061 + } + }, + { + "rpi.denoise": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2000.0, 0.6331025775790707, 0.27424225990946915, + 2200.0, 0.5696117366212947, 0.3116091368689487, + 2400.0, 0.5204264653110015, 0.34892179554105873, + 2600.0, 0.48148675531667223, 0.38565229719076793, + 2800.0, 0.450085403501908, 0.42145684622485047, + 3000.0, 0.42436130159169017, 0.45611835670028816, + 3200.0, 0.40300023695527337, 0.48950766215198593, + 3400.0, 0.3850520052612984, 0.5215567075837261, + 3600.0, 0.36981508088230314, 0.5522397906415475, + 4100.0, 0.333468007836758, 0.5909770465167908, + 4600.0, 0.31196097364221376, 0.6515706327327178, + 5100.0, 0.2961860409294588, 0.7068178946570284, + 5600.0, 0.2842607232745885, 0.7564837749584288, + 6100.0, 0.2750265787051251, 0.8006183524920533, + 6600.0, 0.2677057225584924, 0.8398879225373039, + 7100.0, 0.2617955199757274, 0.8746456080032436, + 7600.0, 0.25693714288250125, 0.905569559506562, + 8100.0, 0.25287531441063316, 0.9331696750390895, + 8600.0, 0.24946601483331993, 0.9576820904825795 + ], + "sensitivity_r": 1.05, + "sensitivity_b": 1.05, + "transverse_pos": 0.0238, + "transverse_neg": 0.04429, + "coarse_step": 0.1 + } + }, + { + "rpi.agc": + { + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 33333 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.3, + 1000, 0.3 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.3, + 1000, 0.3 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + }, + { + "rpi.contrast": + { + "ce_enable": 0, + "gamma_curve": + [ + 0, 0, + 512, 2304, + 1024, 4608, + 1536, 6573, + 2048, 8401, + 2560, 9992, + 3072, 11418, + 3584, 12719, + 4096, 13922, + 4608, 15045, + 5120, 16103, + 5632, 17104, + 6144, 18056, + 6656, 18967, + 7168, 19839, + 7680, 20679, + 8192, 21488, + 9216, 23028, + 10240, 24477, + 11264, 25849, + 12288, 27154, + 13312, 28401, + 14336, 29597, + 15360, 30747, + 16384, 31856, + 17408, 32928, + 18432, 33966, + 19456, 34973, + 20480, 35952, + 22528, 37832, + 24576, 39621, + 26624, 41330, + 28672, 42969, + 30720, 44545, + 32768, 46065, + 34816, 47534, + 36864, 48956, + 38912, 50336, + 40960, 51677, + 43008, 52982, + 45056, 54253, + 47104, 55493, + 49152, 56704, + 51200, 57888, + 53248, 59046, + 55296, 60181, + 57344, 61292, + 59392, 62382, + 61440, 63452, + 63488, 64503, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2000, + "ccm": + [ + 1.5813882365848004, -0.35293683714581114, -0.27378771561617715, + -0.4347297185453639, 1.5792631087746074, -0.12102601986382337, + 0.2322290578987574, -1.4382672640468128, 2.1386425781770755 + ] + }, + { + "ct": 2200, + "ccm": + [ + 1.6322048484088305, -0.45932286857238486, -0.21373542690252198, + -0.3970719209901105, 1.5877868651467202, -0.17249380832122455, + 0.20753774825903412, -1.2660673594740142, 2.005654261091916 + ] + }, + { + "ct": 2400, + "ccm": + [ + 1.6766610071470398, -0.5447101051688111, -0.16838641107407676, + -0.3659845183388154, 1.592223692670396, -0.2127091997471162, + 0.1833964516767549, -1.1339155942419321, 1.9089342978542396 + ] + }, + { + "ct": 2600, + "ccm": + [ + 1.7161984340622154, -0.6152585785678794, -0.1331100845092582, + -0.33972082628066275, 1.5944888273736966, -0.2453979465898787, + 0.1615577497676328, -1.0298684958833109, 1.8357854177422053 + ] + }, + { + "ct": 2800, + "ccm": + [ + 1.7519307259815728, -0.6748682080165339, -0.10515169074540848, + -0.3171703484479931, 1.5955820297498486, -0.2727395854813966, + 0.14230870739974305, -0.9460976023551511, 1.778709391659538 + ] + }, + { + "ct": 3000, + "ccm": + [ + 1.7846716625128374, -0.7261240476375332, -0.08274697420358428, + -0.2975654035173307, 1.5960425637021738, -0.2961043416505157, + 0.12546426281675097, -0.8773434727076518, 1.7330356805246685 + ] + }, + { + "ct": 3200, + "ccm": + [ + 1.8150085872943436, -0.7708109672515514, -0.06469468211419174, + -0.2803468940646277, 1.596168842967451, -0.3164044170681625, + 0.11071494533513807, -0.8199772290209191, 1.69572135046367 + ] + }, + { + "ct": 3400, + "ccm": + [ + 1.8433668304932087, -0.8102060605062592, -0.05013485852801454, + -0.2650934036324084, 1.5961288492969294, -0.33427554893845535, + 0.0977478941863518, -0.7714303112098978, 1.6647070820146963 + ] + }, + { + "ct": 3600, + "ccm": + [ + 1.8700575831917468, -0.8452518300291346, -0.03842644337477299, + -0.2514794528347016, 1.5960178299141876, -0.3501774949366156, + 0.08628520830733245, -0.729841503339915, 1.638553343939267 + ] + }, + { + "ct": 4100, + "ccm": + [ + 1.8988700903560716, -0.8911278803351247, -0.018848644425650693, + -0.21487101487384094, 1.599236541382614, -0.39405450457918206, + 0.08251488056482173, -0.7178919368326191, 1.6267009056502704 + ] + }, + { + "ct": 4600, + "ccm": + [ + 1.960355191764125, -0.9624344812121991, -0.0017122408632169205, + -0.19444620905212898, 1.5978493736948447, -0.416727638296156, + 0.06310261513271084, -0.6483790952487849, 1.5834605477213093 + ] + }, + { + "ct": 5100, + "ccm": + [ + 2.014680536961399, -1.0195930302148566, 0.007728256612638915, + -0.17751999660735496, 1.5977081555831, -0.4366085498741474, + 0.04741267583041334, -0.5950327902073489, 1.5512919847321853 + ] + }, + { + "ct": 5600, + "ccm": + [ + 2.062652337917251, -1.0658386679125478, 0.011886354256281267, + -0.16319197721451495, 1.598363237584736, -0.45422061523742235, + 0.03465810928795378, -0.5535454108047286, 1.5269025836946852 + ] + }, + { + "ct": 6100, + "ccm": + [ + 2.104985902038069, -1.103597868736314, 0.012503517136539277, + -0.15090797064906178, 1.5994703078166095, -0.4698414300864995, + 0.02421766063474242, -0.5208922818196823, 1.5081270847783788 + ] + }, + { + "ct": 6600, + "ccm": + [ + 2.1424988751299714, -1.134760232367728, 0.010730356010435522, + -0.14021846798466234, 1.600822462230719, -0.48379204794526487, + 0.015521315410496622, -0.49463630325832275, 1.4933313534840327 + ] + }, + { + "ct": 7100, + "ccm": + [ + 2.1758034100130925, -1.1607558481037359, 0.007452724895469076, + -0.13085694672641826, 1.6022648614493245, -0.4962330524084075, + 0.008226943206113427, -0.4733077192319791, 1.4815336120437468 + ] + }, + { + "ct": 7600, + "ccm": + [ + 2.205529206931895, -1.1826662383072108, 0.0032019529917605167, + -0.122572009780486, 1.6037258133595753, -0.5073973734282445, + 0.0020132587619863425, -0.4556590236414181, 1.471939788496745 + ] + }, + { + "ct": 8100, + "ccm": + [ + 2.232224969223067, -1.2013672897252885, -0.0016234598095482985, + -0.11518026734442414, 1.6051544769439803, -0.5174558699422255, + -0.0033378143542219835, -0.4408590373867774, 1.4640252230667452 + ] + }, + { + "ct": 8600, + "ccm": + [ + 2.256082295891265, -1.2173210549996634, -0.0067231350481711675, + -0.10860272839843167, 1.6065150139140594, -0.5264728573611493, + -0.007952618707984149, -0.4284003574050791, 1.4574646927117558 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx519.json b/src/ipa/rpi/pisp/data/imx519.json new file mode 100644 index 000000000..9bc4d9a3d --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx519.json @@ -0,0 +1,634 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.dpc": { } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 13841, + "reference_gain": 2.0, + "reference_aperture": 1.0, + "reference_lux": 900, + "reference_Y": 12064 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.776 + } + }, + { + "rpi.geq": + { + "offset": 189, + "slope": 0.01495 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7900 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2890.0, 0.7328, 0.3734, + 3550.0, 0.6228, 0.4763, + 4500.0, 0.5208, 0.5825, + 5700.0, 0.4467, 0.6671, + 7900.0, 0.3858, 0.7411 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.02027, + "transverse_neg": 0.01935 + } + }, + { + "rpi.agc": + { + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ] + }, + "long": + { + "shutter": [ 1000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.5, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 1.527, 1.524, 1.521, 1.515, 1.509, 1.502, 1.494, 1.486, 1.478, 1.469, 1.458, 1.451, 1.445, 1.442, 1.441, 1.441, 1.441, 1.441, 1.441, 1.442, 1.446, 1.451, 1.46, 1.469, 1.477, 1.484, 1.489, 1.495, 1.499, 1.503, 1.504, 1.504, + 1.526, 1.522, 1.518, 1.512, 1.505, 1.497, 1.489, 1.481, 1.473, 1.462, 1.451, 1.443, 1.436, 1.432, 1.431, 1.43, 1.43, 1.43, 1.431, 1.434, 1.438, 1.444, 1.454, 1.463, 1.471, 1.479, 1.485, 1.491, 1.496, 1.5, 1.502, 1.504, + 1.526, 1.521, 1.516, 1.508, 1.501, 1.492, 1.483, 1.475, 1.467, 1.456, 1.444, 1.435, 1.428, 1.423, 1.42, 1.418, 1.418, 1.419, 1.422, 1.425, 1.431, 1.438, 1.447, 1.457, 1.466, 1.474, 1.482, 1.488, 1.493, 1.498, 1.5, 1.503, + 1.524, 1.519, 1.513, 1.505, 1.496, 1.487, 1.478, 1.469, 1.461, 1.45, 1.437, 1.427, 1.419, 1.413, 1.409, 1.407, 1.407, 1.408, 1.412, 1.417, 1.423, 1.431, 1.441, 1.45, 1.46, 1.469, 1.477, 1.485, 1.49, 1.495, 1.499, 1.502, + 1.522, 1.516, 1.51, 1.502, 1.493, 1.483, 1.472, 1.462, 1.452, 1.441, 1.429, 1.419, 1.409, 1.402, 1.397, 1.395, 1.395, 1.397, 1.401, 1.406, 1.414, 1.422, 1.433, 1.443, 1.453, 1.462, 1.471, 1.48, 1.486, 1.492, 1.496, 1.5, + 1.519, 1.513, 1.508, 1.499, 1.489, 1.478, 1.467, 1.455, 1.443, 1.432, 1.421, 1.41, 1.399, 1.391, 1.386, 1.383, 1.383, 1.386, 1.39, 1.396, 1.405, 1.414, 1.425, 1.436, 1.446, 1.456, 1.466, 1.475, 1.483, 1.49, 1.493, 1.497, + 1.516, 1.511, 1.505, 1.495, 1.485, 1.473, 1.461, 1.448, 1.435, 1.423, 1.412, 1.401, 1.389, 1.381, 1.375, 1.372, 1.372, 1.374, 1.379, 1.386, 1.396, 1.406, 1.418, 1.429, 1.439, 1.449, 1.46, 1.47, 1.479, 1.487, 1.491, 1.494, + 1.515, 1.508, 1.502, 1.491, 1.48, 1.467, 1.454, 1.441, 1.427, 1.415, 1.404, 1.392, 1.38, 1.371, 1.364, 1.361, 1.361, 1.363, 1.369, 1.377, 1.388, 1.398, 1.409, 1.42, 1.431, 1.443, 1.454, 1.465, 1.475, 1.484, 1.488, 1.492, + 1.513, 1.505, 1.498, 1.487, 1.475, 1.461, 1.448, 1.434, 1.419, 1.407, 1.396, 1.383, 1.37, 1.361, 1.353, 1.349, 1.349, 1.352, 1.359, 1.367, 1.379, 1.391, 1.401, 1.412, 1.424, 1.436, 1.448, 1.46, 1.471, 1.481, 1.485, 1.49, + 1.511, 1.503, 1.495, 1.483, 1.47, 1.456, 1.442, 1.427, 1.412, 1.399, 1.387, 1.375, 1.362, 1.352, 1.344, 1.34, 1.34, 1.343, 1.35, 1.36, 1.371, 1.383, 1.393, 1.405, 1.418, 1.431, 1.443, 1.455, 1.467, 1.478, 1.483, 1.488, + 1.51, 1.501, 1.492, 1.479, 1.466, 1.451, 1.436, 1.421, 1.406, 1.392, 1.378, 1.366, 1.355, 1.346, 1.336, 1.332, 1.332, 1.335, 1.344, 1.353, 1.363, 1.374, 1.385, 1.398, 1.412, 1.425, 1.439, 1.452, 1.463, 1.475, 1.481, 1.486, + 1.508, 1.499, 1.489, 1.475, 1.461, 1.446, 1.43, 1.414, 1.399, 1.384, 1.369, 1.358, 1.348, 1.339, 1.329, 1.324, 1.323, 1.328, 1.338, 1.347, 1.355, 1.365, 1.378, 1.391, 1.406, 1.42, 1.434, 1.448, 1.46, 1.472, 1.478, 1.484, + 1.508, 1.497, 1.487, 1.473, 1.459, 1.443, 1.426, 1.41, 1.394, 1.379, 1.363, 1.351, 1.342, 1.333, 1.325, 1.321, 1.32, 1.324, 1.332, 1.34, 1.349, 1.359, 1.372, 1.386, 1.401, 1.416, 1.43, 1.445, 1.457, 1.47, 1.477, 1.484, + 1.507, 1.496, 1.485, 1.471, 1.457, 1.441, 1.424, 1.407, 1.391, 1.375, 1.359, 1.346, 1.335, 1.327, 1.322, 1.319, 1.319, 1.321, 1.326, 1.333, 1.343, 1.354, 1.368, 1.382, 1.397, 1.412, 1.427, 1.442, 1.455, 1.468, 1.476, 1.483, + 1.507, 1.495, 1.483, 1.469, 1.455, 1.439, 1.422, 1.404, 1.387, 1.371, 1.355, 1.341, 1.328, 1.321, 1.319, 1.318, 1.318, 1.319, 1.321, 1.326, 1.338, 1.35, 1.363, 1.378, 1.393, 1.408, 1.424, 1.439, 1.453, 1.466, 1.474, 1.483, + 1.507, 1.495, 1.483, 1.469, 1.455, 1.438, 1.421, 1.404, 1.387, 1.37, 1.354, 1.34, 1.327, 1.32, 1.318, 1.316, 1.316, 1.317, 1.32, 1.326, 1.337, 1.35, 1.363, 1.377, 1.393, 1.408, 1.424, 1.439, 1.452, 1.466, 1.474, 1.483, + 1.507, 1.495, 1.483, 1.469, 1.455, 1.438, 1.421, 1.404, 1.387, 1.37, 1.354, 1.34, 1.327, 1.32, 1.316, 1.315, 1.315, 1.316, 1.319, 1.326, 1.337, 1.35, 1.363, 1.377, 1.393, 1.408, 1.424, 1.439, 1.452, 1.466, 1.474, 1.483, + 1.507, 1.495, 1.483, 1.469, 1.455, 1.438, 1.422, 1.404, 1.387, 1.37, 1.355, 1.341, 1.328, 1.32, 1.315, 1.313, 1.313, 1.315, 1.319, 1.326, 1.338, 1.35, 1.363, 1.377, 1.393, 1.408, 1.424, 1.439, 1.452, 1.466, 1.474, 1.483, + 1.507, 1.495, 1.484, 1.47, 1.456, 1.439, 1.423, 1.406, 1.389, 1.372, 1.357, 1.343, 1.331, 1.323, 1.318, 1.316, 1.316, 1.318, 1.323, 1.33, 1.34, 1.352, 1.366, 1.38, 1.395, 1.41, 1.425, 1.44, 1.453, 1.466, 1.475, 1.483, + 1.507, 1.496, 1.485, 1.471, 1.456, 1.44, 1.424, 1.407, 1.39, 1.374, 1.359, 1.346, 1.335, 1.326, 1.32, 1.318, 1.319, 1.321, 1.327, 1.334, 1.343, 1.354, 1.368, 1.383, 1.398, 1.412, 1.427, 1.442, 1.455, 1.467, 1.475, 1.483, + 1.507, 1.497, 1.486, 1.472, 1.458, 1.442, 1.426, 1.41, 1.393, 1.377, 1.362, 1.35, 1.339, 1.331, 1.324, 1.321, 1.322, 1.325, 1.331, 1.338, 1.347, 1.357, 1.372, 1.386, 1.4, 1.415, 1.429, 1.443, 1.456, 1.468, 1.475, 1.483, + 1.507, 1.497, 1.487, 1.474, 1.46, 1.445, 1.43, 1.414, 1.398, 1.382, 1.368, 1.356, 1.347, 1.338, 1.329, 1.326, 1.326, 1.33, 1.337, 1.345, 1.353, 1.364, 1.377, 1.39, 1.405, 1.419, 1.432, 1.446, 1.458, 1.469, 1.476, 1.483, + 1.508, 1.498, 1.489, 1.476, 1.463, 1.448, 1.433, 1.418, 1.402, 1.388, 1.373, 1.363, 1.354, 1.345, 1.335, 1.33, 1.331, 1.334, 1.343, 1.351, 1.36, 1.37, 1.382, 1.394, 1.409, 1.422, 1.435, 1.448, 1.46, 1.471, 1.477, 1.484, + 1.508, 1.499, 1.49, 1.478, 1.466, 1.452, 1.437, 1.422, 1.407, 1.394, 1.381, 1.37, 1.361, 1.352, 1.342, 1.338, 1.338, 1.341, 1.349, 1.358, 1.367, 1.377, 1.388, 1.4, 1.413, 1.427, 1.439, 1.451, 1.462, 1.472, 1.478, 1.484, + 1.51, 1.501, 1.492, 1.481, 1.469, 1.455, 1.441, 1.427, 1.413, 1.4, 1.389, 1.378, 1.368, 1.359, 1.351, 1.347, 1.347, 1.35, 1.357, 1.364, 1.375, 1.385, 1.395, 1.406, 1.419, 1.432, 1.443, 1.455, 1.465, 1.474, 1.48, 1.486, + 1.511, 1.502, 1.494, 1.483, 1.472, 1.459, 1.445, 1.431, 1.418, 1.407, 1.398, 1.387, 1.375, 1.366, 1.36, 1.357, 1.357, 1.359, 1.364, 1.371, 1.382, 1.393, 1.402, 1.412, 1.424, 1.436, 1.447, 1.458, 1.467, 1.477, 1.482, 1.487, + 1.511, 1.503, 1.495, 1.485, 1.475, 1.462, 1.449, 1.436, 1.424, 1.414, 1.405, 1.394, 1.383, 1.375, 1.37, 1.368, 1.368, 1.369, 1.373, 1.38, 1.39, 1.4, 1.409, 1.418, 1.43, 1.441, 1.451, 1.461, 1.469, 1.478, 1.482, 1.487, + 1.511, 1.503, 1.496, 1.486, 1.477, 1.465, 1.453, 1.442, 1.431, 1.421, 1.412, 1.402, 1.392, 1.385, 1.381, 1.378, 1.378, 1.38, 1.383, 1.389, 1.398, 1.406, 1.415, 1.424, 1.436, 1.446, 1.455, 1.464, 1.471, 1.478, 1.483, 1.487, + 1.511, 1.504, 1.496, 1.488, 1.479, 1.468, 1.457, 1.447, 1.437, 1.428, 1.418, 1.409, 1.401, 1.395, 1.391, 1.389, 1.389, 1.39, 1.393, 1.398, 1.405, 1.413, 1.421, 1.431, 1.441, 1.452, 1.459, 1.466, 1.473, 1.479, 1.483, 1.487, + 1.511, 1.504, 1.496, 1.488, 1.479, 1.469, 1.459, 1.45, 1.442, 1.433, 1.424, 1.416, 1.408, 1.403, 1.4, 1.399, 1.399, 1.4, 1.402, 1.406, 1.412, 1.419, 1.427, 1.436, 1.446, 1.455, 1.462, 1.468, 1.474, 1.48, 1.484, 1.487, + 1.511, 1.503, 1.496, 1.488, 1.479, 1.47, 1.461, 1.453, 1.446, 1.438, 1.429, 1.422, 1.415, 1.411, 1.41, 1.409, 1.409, 1.41, 1.411, 1.413, 1.419, 1.425, 1.433, 1.441, 1.45, 1.457, 1.464, 1.47, 1.476, 1.481, 1.484, 1.487, + 1.511, 1.503, 1.496, 1.487, 1.479, 1.471, 1.464, 1.457, 1.45, 1.442, 1.435, 1.428, 1.422, 1.419, 1.419, 1.419, 1.419, 1.419, 1.419, 1.421, 1.426, 1.432, 1.439, 1.447, 1.454, 1.46, 1.466, 1.472, 1.477, 1.482, 1.485, 1.487 + ] + }, + { + "ct": 6000, + "table": + [ + 2.581, 2.577, 2.573, 2.566, 2.559, 2.55, 2.541, 2.529, 2.517, 2.504, 2.491, 2.482, 2.476, 2.472, 2.471, 2.471, 2.471, 2.471, 2.471, 2.473, 2.476, 2.482, 2.492, 2.501, 2.51, 2.518, 2.526, 2.533, 2.538, 2.543, 2.544, 2.544, + 2.579, 2.574, 2.568, 2.56, 2.552, 2.543, 2.534, 2.522, 2.509, 2.496, 2.481, 2.471, 2.463, 2.458, 2.455, 2.453, 2.453, 2.454, 2.455, 2.458, 2.464, 2.472, 2.483, 2.494, 2.503, 2.512, 2.52, 2.528, 2.534, 2.54, 2.542, 2.544, + 2.577, 2.57, 2.564, 2.555, 2.546, 2.537, 2.528, 2.515, 2.501, 2.487, 2.471, 2.46, 2.45, 2.443, 2.438, 2.436, 2.436, 2.437, 2.44, 2.444, 2.452, 2.462, 2.474, 2.486, 2.496, 2.506, 2.515, 2.524, 2.53, 2.537, 2.54, 2.543, + 2.574, 2.566, 2.559, 2.549, 2.539, 2.53, 2.521, 2.507, 2.493, 2.477, 2.461, 2.448, 2.437, 2.428, 2.421, 2.418, 2.418, 2.42, 2.424, 2.43, 2.44, 2.451, 2.465, 2.478, 2.489, 2.499, 2.509, 2.519, 2.526, 2.533, 2.538, 2.542, + 2.569, 2.562, 2.555, 2.544, 2.533, 2.522, 2.511, 2.496, 2.481, 2.465, 2.449, 2.435, 2.422, 2.413, 2.405, 2.402, 2.402, 2.404, 2.409, 2.416, 2.426, 2.438, 2.453, 2.466, 2.479, 2.491, 2.502, 2.512, 2.52, 2.528, 2.533, 2.538, + 2.564, 2.558, 2.552, 2.539, 2.527, 2.514, 2.5, 2.485, 2.469, 2.453, 2.436, 2.422, 2.408, 2.398, 2.389, 2.385, 2.385, 2.388, 2.393, 2.401, 2.413, 2.425, 2.44, 2.455, 2.469, 2.483, 2.494, 2.505, 2.514, 2.523, 2.529, 2.534, + 2.56, 2.553, 2.547, 2.534, 2.52, 2.505, 2.49, 2.474, 2.457, 2.441, 2.424, 2.409, 2.393, 2.382, 2.373, 2.369, 2.369, 2.371, 2.378, 2.386, 2.399, 2.412, 2.428, 2.444, 2.459, 2.473, 2.486, 2.497, 2.508, 2.518, 2.524, 2.53, + 2.557, 2.549, 2.541, 2.527, 2.512, 2.495, 2.479, 2.462, 2.445, 2.429, 2.413, 2.396, 2.379, 2.366, 2.356, 2.351, 2.351, 2.354, 2.362, 2.372, 2.385, 2.399, 2.416, 2.433, 2.448, 2.463, 2.476, 2.489, 2.501, 2.513, 2.519, 2.526, + 2.553, 2.544, 2.535, 2.519, 2.504, 2.486, 2.468, 2.45, 2.433, 2.417, 2.401, 2.383, 2.364, 2.349, 2.338, 2.333, 2.333, 2.337, 2.346, 2.357, 2.371, 2.386, 2.404, 2.421, 2.437, 2.452, 2.467, 2.481, 2.495, 2.508, 2.514, 2.521, + 2.55, 2.54, 2.529, 2.513, 2.497, 2.478, 2.458, 2.44, 2.422, 2.405, 2.388, 2.37, 2.352, 2.336, 2.323, 2.317, 2.317, 2.322, 2.332, 2.344, 2.358, 2.374, 2.392, 2.409, 2.426, 2.442, 2.458, 2.474, 2.489, 2.502, 2.509, 2.516, + 2.547, 2.536, 2.525, 2.507, 2.49, 2.47, 2.45, 2.43, 2.411, 2.393, 2.374, 2.357, 2.342, 2.326, 2.31, 2.303, 2.302, 2.308, 2.32, 2.333, 2.348, 2.363, 2.379, 2.396, 2.414, 2.433, 2.45, 2.468, 2.482, 2.497, 2.504, 2.512, + 2.544, 2.532, 2.52, 2.502, 2.483, 2.463, 2.442, 2.421, 2.4, 2.38, 2.36, 2.344, 2.332, 2.316, 2.297, 2.288, 2.288, 2.294, 2.308, 2.322, 2.337, 2.352, 2.367, 2.383, 2.403, 2.423, 2.442, 2.461, 2.476, 2.491, 2.499, 2.507, + 2.542, 2.53, 2.517, 2.498, 2.479, 2.458, 2.436, 2.414, 2.393, 2.371, 2.35, 2.334, 2.319, 2.305, 2.29, 2.283, 2.282, 2.287, 2.298, 2.311, 2.326, 2.341, 2.358, 2.375, 2.396, 2.417, 2.436, 2.456, 2.472, 2.487, 2.496, 2.505, + 2.542, 2.528, 2.515, 2.495, 2.476, 2.453, 2.431, 2.408, 2.386, 2.364, 2.342, 2.323, 2.306, 2.294, 2.284, 2.28, 2.28, 2.284, 2.291, 2.3, 2.315, 2.331, 2.35, 2.369, 2.39, 2.411, 2.431, 2.451, 2.467, 2.484, 2.494, 2.505, + 2.541, 2.527, 2.512, 2.492, 2.472, 2.449, 2.426, 2.403, 2.379, 2.356, 2.334, 2.313, 2.293, 2.283, 2.279, 2.278, 2.279, 2.28, 2.283, 2.29, 2.304, 2.321, 2.342, 2.363, 2.384, 2.406, 2.426, 2.446, 2.463, 2.48, 2.492, 2.504, + 2.541, 2.526, 2.512, 2.492, 2.472, 2.449, 2.426, 2.402, 2.378, 2.356, 2.333, 2.312, 2.292, 2.281, 2.276, 2.274, 2.275, 2.277, 2.28, 2.288, 2.303, 2.32, 2.341, 2.363, 2.384, 2.405, 2.425, 2.445, 2.463, 2.48, 2.492, 2.504, + 2.541, 2.526, 2.512, 2.492, 2.472, 2.449, 2.426, 2.402, 2.378, 2.356, 2.333, 2.312, 2.292, 2.28, 2.273, 2.27, 2.271, 2.273, 2.279, 2.288, 2.303, 2.32, 2.341, 2.363, 2.384, 2.405, 2.425, 2.445, 2.463, 2.48, 2.492, 2.504, + 2.541, 2.526, 2.512, 2.492, 2.472, 2.449, 2.426, 2.402, 2.379, 2.356, 2.334, 2.313, 2.293, 2.28, 2.271, 2.267, 2.267, 2.271, 2.278, 2.288, 2.303, 2.32, 2.342, 2.363, 2.384, 2.405, 2.426, 2.445, 2.463, 2.48, 2.492, 2.504, + 2.541, 2.527, 2.512, 2.493, 2.473, 2.45, 2.427, 2.404, 2.382, 2.36, 2.338, 2.318, 2.299, 2.285, 2.276, 2.271, 2.272, 2.276, 2.284, 2.294, 2.308, 2.324, 2.345, 2.365, 2.386, 2.407, 2.427, 2.447, 2.464, 2.481, 2.492, 2.504, + 2.541, 2.527, 2.513, 2.493, 2.474, 2.451, 2.429, 2.406, 2.385, 2.363, 2.342, 2.323, 2.305, 2.291, 2.28, 2.275, 2.276, 2.28, 2.29, 2.301, 2.313, 2.328, 2.348, 2.368, 2.389, 2.409, 2.429, 2.448, 2.465, 2.481, 2.493, 2.504, + 2.541, 2.527, 2.514, 2.495, 2.476, 2.454, 2.431, 2.41, 2.389, 2.368, 2.347, 2.329, 2.312, 2.298, 2.286, 2.281, 2.281, 2.286, 2.297, 2.308, 2.319, 2.333, 2.352, 2.372, 2.392, 2.412, 2.432, 2.45, 2.467, 2.482, 2.493, 2.504, + 2.542, 2.529, 2.516, 2.498, 2.479, 2.458, 2.437, 2.416, 2.395, 2.376, 2.356, 2.339, 2.324, 2.31, 2.295, 2.289, 2.289, 2.294, 2.305, 2.317, 2.329, 2.344, 2.361, 2.379, 2.398, 2.418, 2.436, 2.454, 2.47, 2.485, 2.495, 2.505, + 2.543, 2.531, 2.518, 2.501, 2.483, 2.463, 2.442, 2.422, 2.402, 2.383, 2.364, 2.349, 2.336, 2.321, 2.305, 2.297, 2.297, 2.303, 2.313, 2.325, 2.339, 2.354, 2.37, 2.386, 2.405, 2.423, 2.441, 2.459, 2.473, 2.487, 2.496, 2.506, + 2.545, 2.533, 2.521, 2.504, 2.488, 2.468, 2.448, 2.429, 2.41, 2.392, 2.375, 2.36, 2.347, 2.332, 2.316, 2.309, 2.309, 2.313, 2.323, 2.335, 2.35, 2.365, 2.379, 2.394, 2.412, 2.43, 2.447, 2.463, 2.477, 2.49, 2.498, 2.506, + 2.547, 2.535, 2.524, 2.508, 2.492, 2.474, 2.456, 2.438, 2.419, 2.403, 2.388, 2.372, 2.357, 2.343, 2.33, 2.324, 2.324, 2.328, 2.335, 2.346, 2.361, 2.375, 2.389, 2.403, 2.42, 2.437, 2.453, 2.468, 2.481, 2.493, 2.5, 2.508, + 2.548, 2.538, 2.527, 2.512, 2.497, 2.481, 2.464, 2.446, 2.428, 2.414, 2.401, 2.384, 2.367, 2.354, 2.344, 2.339, 2.339, 2.342, 2.348, 2.357, 2.371, 2.386, 2.399, 2.413, 2.429, 2.444, 2.459, 2.473, 2.485, 2.496, 2.502, 2.509, + 2.55, 2.539, 2.529, 2.515, 2.501, 2.486, 2.47, 2.454, 2.438, 2.425, 2.411, 2.396, 2.379, 2.367, 2.359, 2.355, 2.355, 2.357, 2.361, 2.369, 2.382, 2.396, 2.409, 2.423, 2.437, 2.451, 2.464, 2.476, 2.487, 2.498, 2.504, 2.509, + 2.551, 2.541, 2.531, 2.518, 2.505, 2.49, 2.476, 2.463, 2.449, 2.435, 2.421, 2.406, 2.392, 2.381, 2.374, 2.371, 2.371, 2.372, 2.376, 2.382, 2.393, 2.406, 2.42, 2.434, 2.446, 2.458, 2.469, 2.479, 2.489, 2.499, 2.504, 2.51, + 2.552, 2.542, 2.532, 2.52, 2.508, 2.495, 2.482, 2.471, 2.46, 2.446, 2.43, 2.417, 2.404, 2.396, 2.389, 2.386, 2.386, 2.387, 2.39, 2.395, 2.404, 2.415, 2.431, 2.445, 2.455, 2.465, 2.473, 2.482, 2.491, 2.499, 2.505, 2.511, + 2.552, 2.543, 2.533, 2.521, 2.509, 2.497, 2.486, 2.476, 2.466, 2.453, 2.439, 2.427, 2.415, 2.407, 2.403, 2.401, 2.401, 2.401, 2.403, 2.407, 2.415, 2.425, 2.439, 2.452, 2.462, 2.471, 2.478, 2.485, 2.493, 2.501, 2.506, 2.511, + 2.553, 2.543, 2.533, 2.521, 2.509, 2.499, 2.488, 2.48, 2.471, 2.46, 2.448, 2.436, 2.424, 2.418, 2.416, 2.415, 2.415, 2.415, 2.416, 2.419, 2.425, 2.434, 2.447, 2.459, 2.468, 2.477, 2.483, 2.489, 2.496, 2.503, 2.507, 2.511, + 2.553, 2.543, 2.534, 2.522, 2.51, 2.5, 2.491, 2.484, 2.477, 2.468, 2.457, 2.446, 2.434, 2.429, 2.429, 2.429, 2.429, 2.429, 2.429, 2.431, 2.436, 2.443, 2.454, 2.465, 2.474, 2.482, 2.487, 2.493, 2.499, 2.504, 2.508, 2.511 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 3.132, 3.129, 3.126, 3.121, 3.117, 3.111, 3.104, 3.101, 3.098, 3.095, 3.092, 3.09, 3.088, 3.087, 3.086, 3.087, 3.087, 3.089, 3.09, 3.091, 3.092, 3.094, 3.098, 3.103, 3.109, 3.114, 3.118, 3.122, 3.132, 3.141, 3.143, 3.144, + 3.138, 3.133, 3.128, 3.124, 3.119, 3.113, 3.106, 3.102, 3.099, 3.096, 3.094, 3.091, 3.089, 3.088, 3.087, 3.088, 3.089, 3.09, 3.091, 3.092, 3.094, 3.097, 3.101, 3.105, 3.11, 3.115, 3.12, 3.125, 3.134, 3.142, 3.145, 3.147, + 3.144, 3.137, 3.131, 3.126, 3.122, 3.115, 3.108, 3.104, 3.101, 3.098, 3.095, 3.093, 3.091, 3.089, 3.089, 3.089, 3.09, 3.09, 3.091, 3.093, 3.096, 3.1, 3.103, 3.107, 3.111, 3.116, 3.122, 3.128, 3.136, 3.143, 3.147, 3.15, + 3.15, 3.142, 3.134, 3.129, 3.124, 3.117, 3.11, 3.106, 3.102, 3.1, 3.097, 3.095, 3.093, 3.091, 3.09, 3.09, 3.091, 3.092, 3.092, 3.094, 3.099, 3.102, 3.105, 3.109, 3.113, 3.118, 3.124, 3.13, 3.138, 3.145, 3.149, 3.153, + 3.154, 3.147, 3.14, 3.133, 3.126, 3.12, 3.115, 3.11, 3.105, 3.102, 3.1, 3.098, 3.096, 3.095, 3.094, 3.094, 3.095, 3.096, 3.096, 3.098, 3.101, 3.105, 3.108, 3.112, 3.116, 3.121, 3.126, 3.132, 3.14, 3.148, 3.152, 3.156, + 3.158, 3.152, 3.146, 3.137, 3.129, 3.124, 3.119, 3.114, 3.108, 3.105, 3.102, 3.101, 3.099, 3.099, 3.098, 3.098, 3.099, 3.099, 3.1, 3.102, 3.104, 3.107, 3.111, 3.115, 3.119, 3.124, 3.129, 3.134, 3.143, 3.151, 3.154, 3.158, + 3.163, 3.157, 3.151, 3.142, 3.132, 3.127, 3.123, 3.117, 3.112, 3.108, 3.106, 3.105, 3.104, 3.103, 3.103, 3.103, 3.103, 3.104, 3.105, 3.106, 3.108, 3.11, 3.114, 3.118, 3.123, 3.127, 3.132, 3.137, 3.146, 3.154, 3.157, 3.161, + 3.168, 3.162, 3.155, 3.146, 3.137, 3.131, 3.126, 3.121, 3.117, 3.114, 3.112, 3.111, 3.109, 3.109, 3.109, 3.109, 3.109, 3.11, 3.11, 3.111, 3.113, 3.115, 3.118, 3.122, 3.126, 3.13, 3.135, 3.141, 3.149, 3.156, 3.16, 3.165, + 3.174, 3.167, 3.16, 3.151, 3.143, 3.136, 3.129, 3.125, 3.122, 3.12, 3.119, 3.117, 3.115, 3.115, 3.115, 3.115, 3.115, 3.116, 3.116, 3.117, 3.119, 3.12, 3.122, 3.125, 3.129, 3.134, 3.139, 3.145, 3.152, 3.158, 3.164, 3.169, + 3.177, 3.171, 3.164, 3.156, 3.148, 3.14, 3.133, 3.13, 3.128, 3.127, 3.126, 3.124, 3.122, 3.122, 3.122, 3.122, 3.122, 3.123, 3.123, 3.124, 3.125, 3.126, 3.127, 3.129, 3.133, 3.138, 3.144, 3.15, 3.156, 3.162, 3.167, 3.173, + 3.18, 3.175, 3.17, 3.161, 3.152, 3.145, 3.139, 3.136, 3.135, 3.134, 3.133, 3.132, 3.13, 3.13, 3.13, 3.131, 3.131, 3.131, 3.131, 3.131, 3.132, 3.133, 3.133, 3.135, 3.138, 3.142, 3.149, 3.155, 3.16, 3.166, 3.171, 3.175, + 3.182, 3.179, 3.175, 3.166, 3.157, 3.15, 3.144, 3.142, 3.141, 3.141, 3.141, 3.14, 3.138, 3.137, 3.138, 3.139, 3.139, 3.139, 3.139, 3.139, 3.139, 3.139, 3.139, 3.14, 3.143, 3.146, 3.153, 3.16, 3.165, 3.17, 3.174, 3.178, + 3.185, 3.181, 3.178, 3.169, 3.16, 3.154, 3.148, 3.147, 3.146, 3.146, 3.147, 3.146, 3.145, 3.145, 3.146, 3.147, 3.147, 3.147, 3.147, 3.147, 3.147, 3.147, 3.146, 3.147, 3.149, 3.152, 3.158, 3.164, 3.169, 3.173, 3.177, 3.181, + 3.187, 3.184, 3.18, 3.172, 3.163, 3.158, 3.153, 3.152, 3.151, 3.151, 3.151, 3.151, 3.151, 3.152, 3.154, 3.154, 3.154, 3.154, 3.154, 3.154, 3.154, 3.154, 3.154, 3.154, 3.155, 3.157, 3.162, 3.167, 3.171, 3.176, 3.18, 3.184, + 3.189, 3.186, 3.183, 3.175, 3.166, 3.161, 3.157, 3.156, 3.156, 3.156, 3.156, 3.157, 3.158, 3.159, 3.161, 3.162, 3.162, 3.162, 3.162, 3.162, 3.162, 3.162, 3.161, 3.161, 3.162, 3.163, 3.166, 3.169, 3.174, 3.179, 3.183, 3.187, + 3.192, 3.189, 3.185, 3.177, 3.168, 3.164, 3.16, 3.159, 3.159, 3.159, 3.16, 3.161, 3.162, 3.164, 3.165, 3.166, 3.166, 3.166, 3.166, 3.166, 3.166, 3.165, 3.164, 3.164, 3.164, 3.166, 3.168, 3.172, 3.177, 3.182, 3.185, 3.188, + 3.196, 3.192, 3.187, 3.179, 3.17, 3.166, 3.163, 3.162, 3.162, 3.162, 3.163, 3.165, 3.166, 3.168, 3.169, 3.17, 3.17, 3.17, 3.169, 3.169, 3.169, 3.168, 3.167, 3.167, 3.167, 3.168, 3.171, 3.174, 3.179, 3.185, 3.186, 3.188, + 3.199, 3.194, 3.19, 3.181, 3.172, 3.169, 3.166, 3.165, 3.164, 3.165, 3.167, 3.168, 3.17, 3.172, 3.173, 3.173, 3.173, 3.173, 3.172, 3.172, 3.171, 3.171, 3.17, 3.169, 3.169, 3.17, 3.173, 3.176, 3.182, 3.187, 3.188, 3.189, + 3.202, 3.197, 3.192, 3.183, 3.175, 3.171, 3.168, 3.166, 3.165, 3.165, 3.167, 3.168, 3.17, 3.172, 3.173, 3.173, 3.173, 3.173, 3.172, 3.172, 3.171, 3.171, 3.17, 3.17, 3.17, 3.171, 3.174, 3.177, 3.183, 3.189, 3.19, 3.191, + 3.204, 3.199, 3.195, 3.186, 3.177, 3.173, 3.17, 3.168, 3.165, 3.166, 3.167, 3.168, 3.17, 3.172, 3.173, 3.173, 3.173, 3.173, 3.172, 3.172, 3.171, 3.171, 3.171, 3.171, 3.171, 3.172, 3.175, 3.177, 3.184, 3.191, 3.192, 3.193, + 3.206, 3.201, 3.196, 3.188, 3.178, 3.175, 3.172, 3.169, 3.166, 3.165, 3.166, 3.168, 3.169, 3.17, 3.171, 3.172, 3.172, 3.172, 3.171, 3.171, 3.171, 3.171, 3.171, 3.171, 3.172, 3.173, 3.176, 3.178, 3.185, 3.192, 3.193, 3.194, + 3.207, 3.202, 3.197, 3.188, 3.179, 3.175, 3.172, 3.169, 3.165, 3.164, 3.164, 3.165, 3.165, 3.166, 3.167, 3.168, 3.168, 3.168, 3.168, 3.169, 3.169, 3.169, 3.17, 3.171, 3.172, 3.174, 3.176, 3.18, 3.186, 3.193, 3.194, 3.196, + 3.208, 3.203, 3.197, 3.188, 3.179, 3.175, 3.172, 3.168, 3.165, 3.163, 3.162, 3.162, 3.161, 3.162, 3.163, 3.164, 3.164, 3.164, 3.165, 3.166, 3.167, 3.168, 3.17, 3.171, 3.172, 3.174, 3.177, 3.181, 3.187, 3.193, 3.195, 3.197, + 3.208, 3.203, 3.197, 3.188, 3.179, 3.174, 3.171, 3.168, 3.164, 3.162, 3.161, 3.16, 3.159, 3.159, 3.159, 3.16, 3.161, 3.162, 3.163, 3.164, 3.166, 3.167, 3.169, 3.171, 3.172, 3.174, 3.178, 3.182, 3.188, 3.194, 3.196, 3.198, + 3.206, 3.201, 3.196, 3.187, 3.178, 3.173, 3.169, 3.166, 3.163, 3.161, 3.159, 3.158, 3.157, 3.157, 3.157, 3.158, 3.16, 3.161, 3.162, 3.163, 3.164, 3.166, 3.168, 3.17, 3.172, 3.174, 3.178, 3.182, 3.189, 3.196, 3.197, 3.199, + 3.205, 3.2, 3.195, 3.186, 3.177, 3.172, 3.167, 3.164, 3.162, 3.16, 3.157, 3.156, 3.155, 3.155, 3.155, 3.156, 3.158, 3.16, 3.161, 3.162, 3.163, 3.165, 3.167, 3.169, 3.171, 3.174, 3.178, 3.183, 3.19, 3.197, 3.198, 3.199, + 3.203, 3.198, 3.194, 3.185, 3.177, 3.172, 3.167, 3.164, 3.162, 3.159, 3.157, 3.155, 3.154, 3.154, 3.154, 3.155, 3.157, 3.159, 3.16, 3.162, 3.163, 3.165, 3.167, 3.169, 3.171, 3.174, 3.179, 3.184, 3.191, 3.198, 3.198, 3.199, + 3.201, 3.197, 3.193, 3.185, 3.177, 3.172, 3.168, 3.165, 3.162, 3.159, 3.157, 3.156, 3.154, 3.153, 3.153, 3.154, 3.156, 3.158, 3.16, 3.162, 3.163, 3.165, 3.167, 3.169, 3.171, 3.174, 3.18, 3.185, 3.191, 3.197, 3.198, 3.199, + 3.199, 3.195, 3.191, 3.184, 3.177, 3.173, 3.169, 3.166, 3.162, 3.16, 3.158, 3.156, 3.154, 3.153, 3.153, 3.154, 3.155, 3.157, 3.16, 3.162, 3.163, 3.165, 3.167, 3.169, 3.171, 3.174, 3.18, 3.186, 3.191, 3.196, 3.198, 3.199, + 3.199, 3.195, 3.19, 3.184, 3.178, 3.174, 3.171, 3.167, 3.163, 3.16, 3.158, 3.156, 3.154, 3.153, 3.153, 3.154, 3.155, 3.157, 3.159, 3.161, 3.163, 3.166, 3.167, 3.17, 3.172, 3.175, 3.181, 3.186, 3.191, 3.195, 3.197, 3.199, + 3.199, 3.194, 3.189, 3.184, 3.179, 3.175, 3.172, 3.168, 3.165, 3.161, 3.158, 3.156, 3.154, 3.153, 3.153, 3.154, 3.155, 3.157, 3.159, 3.161, 3.164, 3.167, 3.169, 3.171, 3.173, 3.176, 3.181, 3.186, 3.19, 3.194, 3.196, 3.198, + 3.199, 3.194, 3.188, 3.184, 3.18, 3.176, 3.174, 3.17, 3.166, 3.162, 3.158, 3.156, 3.154, 3.153, 3.154, 3.155, 3.155, 3.157, 3.158, 3.161, 3.164, 3.168, 3.17, 3.172, 3.174, 3.177, 3.181, 3.186, 3.189, 3.193, 3.196, 3.198 + ] + }, + { + "ct": 6000, + "table": + [ + 1.579, 1.579, 1.579, 1.578, 1.577, 1.576, 1.574, 1.574, 1.573, 1.572, 1.571, 1.571, 1.571, 1.571, 1.571, 1.571, 1.571, 1.571, 1.57, 1.569, 1.569, 1.569, 1.57, 1.571, 1.572, 1.572, 1.573, 1.574, 1.576, 1.577, 1.578, 1.578, + 1.581, 1.58, 1.579, 1.578, 1.577, 1.576, 1.575, 1.574, 1.573, 1.572, 1.572, 1.571, 1.571, 1.571, 1.571, 1.571, 1.571, 1.571, 1.57, 1.57, 1.57, 1.57, 1.571, 1.571, 1.572, 1.573, 1.574, 1.575, 1.576, 1.577, 1.578, 1.578, + 1.583, 1.581, 1.579, 1.578, 1.578, 1.576, 1.575, 1.574, 1.573, 1.573, 1.572, 1.571, 1.571, 1.571, 1.572, 1.572, 1.572, 1.571, 1.571, 1.57, 1.57, 1.571, 1.571, 1.572, 1.572, 1.573, 1.574, 1.576, 1.577, 1.578, 1.578, 1.579, + 1.584, 1.582, 1.579, 1.579, 1.578, 1.577, 1.575, 1.574, 1.573, 1.573, 1.572, 1.572, 1.571, 1.571, 1.572, 1.572, 1.572, 1.572, 1.571, 1.571, 1.571, 1.571, 1.572, 1.572, 1.573, 1.573, 1.575, 1.576, 1.577, 1.578, 1.579, 1.579, + 1.585, 1.583, 1.581, 1.58, 1.579, 1.578, 1.576, 1.575, 1.574, 1.573, 1.573, 1.572, 1.572, 1.572, 1.573, 1.573, 1.573, 1.573, 1.573, 1.572, 1.572, 1.572, 1.572, 1.573, 1.574, 1.575, 1.576, 1.577, 1.578, 1.579, 1.58, 1.58, + 1.586, 1.585, 1.583, 1.581, 1.579, 1.578, 1.577, 1.576, 1.575, 1.574, 1.573, 1.573, 1.573, 1.573, 1.574, 1.574, 1.574, 1.574, 1.574, 1.573, 1.573, 1.573, 1.573, 1.574, 1.575, 1.576, 1.577, 1.578, 1.579, 1.58, 1.58, 1.581, + 1.588, 1.586, 1.584, 1.582, 1.58, 1.579, 1.578, 1.577, 1.576, 1.575, 1.574, 1.574, 1.574, 1.574, 1.575, 1.576, 1.576, 1.576, 1.575, 1.575, 1.574, 1.574, 1.574, 1.575, 1.576, 1.576, 1.577, 1.579, 1.58, 1.582, 1.582, 1.582, + 1.589, 1.587, 1.586, 1.584, 1.582, 1.58, 1.579, 1.578, 1.577, 1.576, 1.576, 1.576, 1.576, 1.576, 1.577, 1.578, 1.578, 1.578, 1.578, 1.577, 1.576, 1.575, 1.575, 1.576, 1.576, 1.577, 1.578, 1.58, 1.581, 1.583, 1.583, 1.583, + 1.59, 1.588, 1.587, 1.585, 1.583, 1.581, 1.579, 1.578, 1.578, 1.578, 1.578, 1.578, 1.578, 1.579, 1.58, 1.58, 1.58, 1.58, 1.58, 1.579, 1.578, 1.577, 1.577, 1.577, 1.577, 1.578, 1.579, 1.581, 1.583, 1.584, 1.585, 1.585, + 1.592, 1.59, 1.588, 1.586, 1.585, 1.583, 1.581, 1.58, 1.579, 1.58, 1.58, 1.58, 1.581, 1.581, 1.582, 1.582, 1.582, 1.582, 1.582, 1.582, 1.58, 1.579, 1.579, 1.578, 1.579, 1.579, 1.581, 1.582, 1.584, 1.586, 1.586, 1.587, + 1.593, 1.591, 1.589, 1.588, 1.586, 1.584, 1.583, 1.582, 1.582, 1.582, 1.583, 1.583, 1.583, 1.584, 1.584, 1.584, 1.585, 1.585, 1.585, 1.584, 1.583, 1.582, 1.581, 1.581, 1.581, 1.582, 1.583, 1.584, 1.586, 1.587, 1.587, 1.588, + 1.595, 1.593, 1.591, 1.589, 1.587, 1.586, 1.585, 1.584, 1.584, 1.585, 1.585, 1.586, 1.586, 1.586, 1.586, 1.587, 1.587, 1.587, 1.587, 1.587, 1.585, 1.584, 1.584, 1.583, 1.583, 1.584, 1.585, 1.586, 1.587, 1.589, 1.589, 1.589, + 1.596, 1.594, 1.592, 1.59, 1.588, 1.587, 1.586, 1.586, 1.586, 1.587, 1.588, 1.588, 1.589, 1.589, 1.589, 1.59, 1.59, 1.59, 1.59, 1.59, 1.588, 1.587, 1.587, 1.587, 1.586, 1.586, 1.587, 1.588, 1.589, 1.59, 1.59, 1.59, + 1.596, 1.595, 1.594, 1.592, 1.59, 1.589, 1.588, 1.588, 1.589, 1.589, 1.59, 1.591, 1.592, 1.592, 1.592, 1.593, 1.593, 1.594, 1.594, 1.593, 1.592, 1.591, 1.59, 1.59, 1.589, 1.589, 1.589, 1.59, 1.591, 1.591, 1.591, 1.591, + 1.597, 1.596, 1.595, 1.593, 1.591, 1.59, 1.589, 1.59, 1.591, 1.592, 1.592, 1.593, 1.594, 1.595, 1.595, 1.596, 1.596, 1.597, 1.597, 1.596, 1.595, 1.595, 1.594, 1.593, 1.592, 1.592, 1.592, 1.592, 1.592, 1.593, 1.593, 1.593, + 1.598, 1.597, 1.596, 1.594, 1.592, 1.591, 1.59, 1.591, 1.591, 1.592, 1.593, 1.594, 1.596, 1.596, 1.597, 1.597, 1.598, 1.599, 1.598, 1.598, 1.597, 1.596, 1.595, 1.594, 1.594, 1.593, 1.593, 1.593, 1.593, 1.594, 1.594, 1.594, + 1.6, 1.598, 1.596, 1.595, 1.593, 1.592, 1.591, 1.592, 1.592, 1.593, 1.594, 1.595, 1.597, 1.597, 1.598, 1.599, 1.6, 1.6, 1.6, 1.599, 1.598, 1.597, 1.596, 1.595, 1.595, 1.594, 1.594, 1.595, 1.595, 1.594, 1.594, 1.594, + 1.601, 1.599, 1.597, 1.595, 1.593, 1.593, 1.592, 1.592, 1.593, 1.594, 1.595, 1.596, 1.597, 1.598, 1.599, 1.6, 1.601, 1.602, 1.601, 1.6, 1.599, 1.598, 1.597, 1.596, 1.595, 1.595, 1.596, 1.596, 1.596, 1.595, 1.595, 1.595, + 1.601, 1.599, 1.598, 1.596, 1.594, 1.593, 1.592, 1.593, 1.593, 1.594, 1.595, 1.596, 1.597, 1.598, 1.599, 1.6, 1.601, 1.602, 1.601, 1.6, 1.599, 1.598, 1.597, 1.596, 1.596, 1.596, 1.596, 1.596, 1.596, 1.596, 1.596, 1.596, + 1.601, 1.6, 1.599, 1.596, 1.594, 1.593, 1.593, 1.593, 1.593, 1.594, 1.595, 1.596, 1.597, 1.598, 1.599, 1.6, 1.601, 1.602, 1.601, 1.6, 1.599, 1.598, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.596, 1.596, 1.596, + 1.601, 1.6, 1.599, 1.597, 1.594, 1.594, 1.593, 1.593, 1.593, 1.594, 1.594, 1.596, 1.597, 1.598, 1.599, 1.6, 1.601, 1.601, 1.601, 1.6, 1.599, 1.598, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, + 1.601, 1.6, 1.599, 1.597, 1.594, 1.594, 1.593, 1.593, 1.593, 1.593, 1.594, 1.595, 1.596, 1.597, 1.598, 1.599, 1.599, 1.6, 1.6, 1.599, 1.599, 1.598, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, + 1.602, 1.6, 1.599, 1.597, 1.594, 1.594, 1.593, 1.593, 1.592, 1.593, 1.593, 1.594, 1.595, 1.596, 1.597, 1.598, 1.598, 1.598, 1.598, 1.598, 1.598, 1.598, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.598, 1.598, 1.598, + 1.602, 1.6, 1.599, 1.597, 1.594, 1.594, 1.593, 1.592, 1.592, 1.592, 1.593, 1.593, 1.594, 1.595, 1.596, 1.597, 1.597, 1.597, 1.598, 1.598, 1.598, 1.598, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.598, 1.598, 1.598, 1.598, + 1.6, 1.599, 1.599, 1.596, 1.594, 1.593, 1.593, 1.592, 1.592, 1.592, 1.592, 1.592, 1.593, 1.594, 1.595, 1.596, 1.596, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.598, 1.598, 1.598, 1.599, 1.599, 1.599, + 1.599, 1.599, 1.598, 1.596, 1.594, 1.593, 1.592, 1.592, 1.591, 1.591, 1.591, 1.592, 1.592, 1.593, 1.595, 1.595, 1.596, 1.596, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.598, 1.599, 1.599, 1.599, 1.599, 1.599, + 1.599, 1.598, 1.598, 1.596, 1.594, 1.593, 1.592, 1.592, 1.591, 1.591, 1.591, 1.591, 1.592, 1.593, 1.594, 1.595, 1.596, 1.596, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.598, 1.599, 1.599, 1.599, 1.599, 1.599, + 1.598, 1.598, 1.597, 1.596, 1.594, 1.593, 1.593, 1.592, 1.592, 1.592, 1.592, 1.592, 1.592, 1.593, 1.594, 1.595, 1.595, 1.596, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.597, 1.598, 1.598, 1.599, 1.599, 1.599, 1.599, 1.599, + 1.598, 1.597, 1.596, 1.595, 1.594, 1.594, 1.593, 1.593, 1.592, 1.592, 1.592, 1.592, 1.592, 1.593, 1.594, 1.594, 1.595, 1.596, 1.596, 1.597, 1.597, 1.597, 1.597, 1.597, 1.598, 1.598, 1.599, 1.599, 1.599, 1.599, 1.599, 1.599, + 1.598, 1.597, 1.596, 1.595, 1.594, 1.594, 1.593, 1.593, 1.592, 1.592, 1.592, 1.592, 1.592, 1.593, 1.594, 1.594, 1.595, 1.595, 1.596, 1.597, 1.597, 1.597, 1.597, 1.597, 1.598, 1.598, 1.599, 1.599, 1.599, 1.599, 1.599, 1.599, + 1.597, 1.596, 1.595, 1.595, 1.594, 1.594, 1.594, 1.593, 1.593, 1.592, 1.592, 1.592, 1.593, 1.593, 1.594, 1.595, 1.595, 1.595, 1.596, 1.597, 1.597, 1.598, 1.598, 1.598, 1.598, 1.598, 1.599, 1.599, 1.599, 1.599, 1.599, 1.599, + 1.597, 1.596, 1.595, 1.595, 1.594, 1.594, 1.594, 1.594, 1.593, 1.593, 1.592, 1.592, 1.593, 1.594, 1.595, 1.595, 1.595, 1.595, 1.596, 1.597, 1.598, 1.598, 1.598, 1.598, 1.598, 1.598, 1.599, 1.599, 1.599, 1.599, 1.599, 1.599 + ] + } + ], + "luminance_lut": + [ + 2.887, 2.823, 2.758, 2.586, 2.405, 2.265, 2.132, 2.01, 1.891, 1.795, 1.707, 1.661, 1.635, 1.624, 1.623, 1.623, 1.623, 1.623, 1.624, 1.633, 1.654, 1.698, 1.785, 1.88, 1.998, 2.118, 2.249, 2.385, 2.56, 2.727, 2.782, 2.838, + 2.84, 2.745, 2.65, 2.482, 2.308, 2.18, 2.058, 1.941, 1.826, 1.736, 1.656, 1.609, 1.577, 1.56, 1.552, 1.548, 1.548, 1.551, 1.559, 1.574, 1.603, 1.648, 1.726, 1.814, 1.929, 2.045, 2.164, 2.29, 2.457, 2.619, 2.708, 2.797, + 2.793, 2.667, 2.542, 2.378, 2.212, 2.094, 1.985, 1.873, 1.761, 1.678, 1.606, 1.557, 1.519, 1.495, 1.48, 1.473, 1.473, 1.48, 1.494, 1.516, 1.551, 1.597, 1.667, 1.748, 1.861, 1.972, 2.08, 2.195, 2.354, 2.511, 2.634, 2.756, + 2.734, 2.586, 2.438, 2.279, 2.119, 2.011, 1.91, 1.805, 1.697, 1.62, 1.553, 1.503, 1.461, 1.432, 1.411, 1.401, 1.401, 1.41, 1.43, 1.457, 1.497, 1.545, 1.609, 1.685, 1.792, 1.898, 1.997, 2.103, 2.256, 2.409, 2.556, 2.703, + 2.624, 2.49, 2.357, 2.203, 2.048, 1.936, 1.831, 1.736, 1.644, 1.566, 1.495, 1.443, 1.402, 1.372, 1.352, 1.342, 1.342, 1.351, 1.37, 1.397, 1.437, 1.486, 1.556, 1.632, 1.724, 1.818, 1.922, 2.032, 2.181, 2.33, 2.461, 2.593, + 2.513, 2.394, 2.275, 2.127, 1.976, 1.861, 1.751, 1.667, 1.59, 1.513, 1.436, 1.383, 1.342, 1.313, 1.292, 1.283, 1.283, 1.291, 1.31, 1.337, 1.376, 1.427, 1.503, 1.579, 1.655, 1.738, 1.846, 1.96, 2.106, 2.25, 2.367, 2.483, + 2.427, 2.315, 2.203, 2.058, 1.912, 1.795, 1.683, 1.604, 1.534, 1.461, 1.385, 1.332, 1.289, 1.259, 1.238, 1.228, 1.228, 1.237, 1.255, 1.282, 1.323, 1.376, 1.451, 1.524, 1.592, 1.669, 1.78, 1.895, 2.039, 2.18, 2.288, 2.396, + 2.383, 2.265, 2.147, 2.004, 1.859, 1.744, 1.634, 1.552, 1.477, 1.411, 1.349, 1.295, 1.245, 1.213, 1.191, 1.181, 1.181, 1.19, 1.208, 1.238, 1.286, 1.339, 1.401, 1.467, 1.54, 1.62, 1.73, 1.843, 1.984, 2.124, 2.236, 2.348, + 2.338, 2.215, 2.091, 1.949, 1.807, 1.694, 1.585, 1.499, 1.42, 1.362, 1.313, 1.259, 1.202, 1.167, 1.145, 1.134, 1.134, 1.143, 1.161, 1.194, 1.248, 1.301, 1.352, 1.41, 1.487, 1.571, 1.679, 1.791, 1.93, 2.067, 2.184, 2.3, + 2.307, 2.176, 2.046, 1.906, 1.765, 1.653, 1.545, 1.458, 1.377, 1.321, 1.274, 1.223, 1.17, 1.133, 1.107, 1.095, 1.094, 1.105, 1.127, 1.161, 1.212, 1.262, 1.31, 1.366, 1.446, 1.531, 1.638, 1.749, 1.886, 2.022, 2.145, 2.267, + 2.286, 2.147, 2.009, 1.87, 1.732, 1.62, 1.514, 1.427, 1.345, 1.285, 1.232, 1.187, 1.147, 1.11, 1.077, 1.061, 1.06, 1.074, 1.104, 1.137, 1.178, 1.222, 1.273, 1.333, 1.413, 1.499, 1.605, 1.716, 1.851, 1.986, 2.117, 2.247, + 2.265, 2.119, 1.973, 1.835, 1.698, 1.588, 1.482, 1.395, 1.313, 1.249, 1.19, 1.152, 1.123, 1.087, 1.046, 1.027, 1.027, 1.043, 1.08, 1.114, 1.143, 1.181, 1.237, 1.3, 1.381, 1.467, 1.573, 1.682, 1.816, 1.95, 2.089, 2.227, + 2.258, 2.104, 1.95, 1.813, 1.677, 1.567, 1.462, 1.375, 1.293, 1.227, 1.167, 1.127, 1.096, 1.065, 1.032, 1.016, 1.014, 1.028, 1.058, 1.088, 1.117, 1.157, 1.215, 1.28, 1.361, 1.447, 1.552, 1.661, 1.794, 1.928, 2.075, 2.222, + 2.258, 2.095, 1.933, 1.795, 1.66, 1.551, 1.446, 1.36, 1.278, 1.211, 1.15, 1.105, 1.068, 1.042, 1.023, 1.013, 1.011, 1.018, 1.036, 1.06, 1.095, 1.139, 1.199, 1.265, 1.346, 1.432, 1.536, 1.644, 1.777, 1.912, 2.067, 2.222, + 2.257, 2.086, 1.915, 1.778, 1.643, 1.535, 1.43, 1.344, 1.262, 1.195, 1.133, 1.083, 1.039, 1.019, 1.014, 1.01, 1.007, 1.008, 1.013, 1.033, 1.073, 1.12, 1.183, 1.25, 1.331, 1.417, 1.52, 1.627, 1.76, 1.895, 2.059, 2.222, + 2.257, 2.085, 1.913, 1.776, 1.642, 1.533, 1.429, 1.343, 1.261, 1.194, 1.132, 1.081, 1.036, 1.015, 1.01, 1.007, 1.005, 1.006, 1.009, 1.028, 1.07, 1.119, 1.181, 1.249, 1.33, 1.416, 1.519, 1.626, 1.759, 1.894, 2.058, 2.222, + 2.257, 2.085, 1.913, 1.776, 1.642, 1.533, 1.429, 1.343, 1.261, 1.194, 1.132, 1.081, 1.035, 1.013, 1.007, 1.004, 1.003, 1.004, 1.007, 1.026, 1.069, 1.119, 1.181, 1.249, 1.33, 1.416, 1.519, 1.626, 1.759, 1.894, 2.058, 2.222, + 2.257, 2.086, 1.915, 1.778, 1.643, 1.535, 1.43, 1.344, 1.262, 1.195, 1.133, 1.082, 1.037, 1.014, 1.005, 1.001, 1.001, 1.003, 1.007, 1.027, 1.07, 1.12, 1.183, 1.25, 1.331, 1.417, 1.52, 1.627, 1.76, 1.896, 2.059, 2.222, + 2.257, 2.093, 1.93, 1.793, 1.658, 1.549, 1.444, 1.358, 1.277, 1.21, 1.148, 1.101, 1.062, 1.034, 1.015, 1.005, 1.004, 1.012, 1.029, 1.054, 1.091, 1.136, 1.198, 1.265, 1.346, 1.432, 1.536, 1.644, 1.778, 1.913, 2.068, 2.224, + 2.257, 2.101, 1.945, 1.808, 1.673, 1.564, 1.459, 1.373, 1.292, 1.225, 1.163, 1.12, 1.086, 1.055, 1.024, 1.009, 1.007, 1.02, 1.05, 1.08, 1.111, 1.152, 1.213, 1.28, 1.361, 1.447, 1.552, 1.66, 1.795, 1.931, 2.078, 2.225, + 2.262, 2.114, 1.965, 1.829, 1.693, 1.583, 1.477, 1.391, 1.311, 1.244, 1.184, 1.142, 1.111, 1.076, 1.038, 1.02, 1.017, 1.034, 1.072, 1.106, 1.135, 1.174, 1.234, 1.299, 1.38, 1.466, 1.572, 1.681, 1.817, 1.953, 2.092, 2.232, + 2.28, 2.14, 2.0, 1.862, 1.725, 1.614, 1.507, 1.421, 1.34, 1.276, 1.22, 1.175, 1.136, 1.099, 1.065, 1.048, 1.047, 1.062, 1.094, 1.13, 1.17, 1.215, 1.268, 1.329, 1.411, 1.498, 1.604, 1.714, 1.851, 1.988, 2.12, 2.252, + 2.299, 2.166, 2.034, 1.896, 1.757, 1.645, 1.537, 1.45, 1.369, 1.309, 1.256, 1.207, 1.16, 1.123, 1.092, 1.077, 1.077, 1.089, 1.116, 1.153, 1.206, 1.256, 1.303, 1.359, 1.442, 1.529, 1.636, 1.747, 1.886, 2.024, 2.148, 2.273, + 2.328, 2.203, 2.078, 1.938, 1.797, 1.684, 1.575, 1.489, 1.409, 1.348, 1.294, 1.242, 1.191, 1.153, 1.126, 1.113, 1.113, 1.124, 1.148, 1.185, 1.241, 1.295, 1.344, 1.402, 1.481, 1.567, 1.675, 1.788, 1.929, 2.068, 2.186, 2.305, + 2.369, 2.251, 2.133, 1.991, 1.847, 1.732, 1.621, 1.539, 1.464, 1.397, 1.334, 1.279, 1.228, 1.193, 1.167, 1.155, 1.155, 1.167, 1.191, 1.226, 1.277, 1.331, 1.393, 1.459, 1.533, 1.614, 1.724, 1.838, 1.982, 2.123, 2.237, 2.351, + 2.41, 2.299, 2.188, 2.044, 1.897, 1.78, 1.668, 1.589, 1.518, 1.446, 1.374, 1.316, 1.266, 1.232, 1.209, 1.198, 1.198, 1.21, 1.234, 1.267, 1.312, 1.367, 1.443, 1.516, 1.584, 1.661, 1.773, 1.889, 2.035, 2.178, 2.287, 2.396, + 2.493, 2.375, 2.258, 2.11, 1.96, 1.845, 1.735, 1.65, 1.572, 1.497, 1.423, 1.365, 1.315, 1.282, 1.26, 1.25, 1.25, 1.261, 1.286, 1.318, 1.362, 1.417, 1.494, 1.57, 1.646, 1.729, 1.838, 1.953, 2.102, 2.248, 2.365, 2.483, + 2.599, 2.467, 2.335, 2.183, 2.03, 1.919, 1.814, 1.719, 1.627, 1.549, 1.478, 1.421, 1.372, 1.339, 1.317, 1.306, 1.306, 1.318, 1.343, 1.376, 1.421, 1.475, 1.546, 1.623, 1.715, 1.809, 1.914, 2.025, 2.176, 2.326, 2.459, 2.592, + 2.705, 2.559, 2.413, 2.256, 2.099, 1.992, 1.893, 1.788, 1.681, 1.602, 1.532, 1.477, 1.428, 1.395, 1.373, 1.363, 1.363, 1.374, 1.4, 1.433, 1.479, 1.532, 1.598, 1.675, 1.783, 1.89, 1.99, 2.097, 2.251, 2.405, 2.553, 2.702, + 2.763, 2.639, 2.514, 2.353, 2.19, 2.075, 1.967, 1.856, 1.744, 1.659, 1.584, 1.529, 1.484, 1.456, 1.44, 1.432, 1.432, 1.441, 1.459, 1.487, 1.53, 1.583, 1.655, 1.738, 1.852, 1.965, 2.073, 2.189, 2.35, 2.508, 2.632, 2.757, + 2.81, 2.716, 2.621, 2.456, 2.285, 2.158, 2.039, 1.923, 1.809, 1.718, 1.636, 1.581, 1.54, 1.518, 1.509, 1.505, 1.505, 1.509, 1.519, 1.54, 1.58, 1.633, 1.714, 1.804, 1.92, 2.038, 2.158, 2.286, 2.454, 2.617, 2.708, 2.799, + 2.858, 2.793, 2.728, 2.558, 2.38, 2.242, 2.111, 1.991, 1.873, 1.777, 1.688, 1.633, 1.596, 1.58, 1.578, 1.577, 1.577, 1.577, 1.578, 1.593, 1.629, 1.683, 1.772, 1.87, 1.989, 2.111, 2.244, 2.382, 2.558, 2.726, 2.784, 2.842 + ], + "sigma": 0.00372, + "sigma_Cb": 0.00244 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2890, + "ccm": + [ + 1.36754, -0.18448, -0.18306, + -0.32356, 1.44826, -0.12471, + -0.00412, -0.69936, 1.70348 + ] + }, + { + "ct": 2920, + "ccm": + [ + 1.26704, 0.01624, -0.28328, + -0.28516, 1.38934, -0.10419, + -0.04854, -0.82211, 1.87066 + ] + }, + { + "ct": 3550, + "ccm": + [ + 1.42836, -0.27235, -0.15601, + -0.28751, 1.41075, -0.12325, + -0.01812, -0.54849, 1.56661 + ] + }, + { + "ct": 4500, + "ccm": + [ + 1.36328, -0.19569, -0.16759, + -0.25254, 1.52248, -0.26994, + -0.01575, -0.53155, 1.54729 + ] + }, + { + "ct": 5700, + "ccm": + [ + 1.49207, -0.37245, -0.11963, + -0.21493, 1.40005, -0.18512, + -0.03781, -0.38779, 1.42561 + ] + }, + { + "ct": 7900, + "ccm": + [ + 1.34849, -0.05425, -0.29424, + -0.22182, 1.77684, -0.55502, + -0.07403, -0.55336, 1.62739 + ] + } + ] + } + }, + { + "rpi.sharpen": { } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx708.json b/src/ipa/rpi/pisp/data/imx708.json new file mode 100644 index 000000000..e8d25c216 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx708.json @@ -0,0 +1,1270 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 20716, + "reference_gain": 1.12, + "reference_aperture": 1.0, + "reference_lux": 810, + "reference_Y": 13994 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 1.856 + } + }, + { + "rpi.geq": + { + "offset": 221, + "slope": 0.00226 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 3.2, + "strength": 0.75, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2964.0, 0.7451, 0.3213, + 3610.0, 0.6119, 0.4443, + 4640.0, 0.5168, 0.5419, + 5910.0, 0.4436, 0.6229, + 7590.0, 0.3847, 0.6921 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.01752, + "transverse_neg": 0.01831 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 1.532, 1.534, 1.535, 1.538, 1.538, 1.533, 1.529, 1.515, 1.506, 1.492, 1.477, 1.465, 1.453, 1.444, 1.437, 1.433, 1.433, 1.435, 1.441, 1.449, 1.461, 1.474, 1.485, 1.499, 1.511, 1.519, 1.525, 1.526, 1.526, 1.523, 1.517, 1.516, + 1.532, 1.534, 1.537, 1.538, 1.537, 1.534, 1.525, 1.515, 1.502, 1.486, 1.474, 1.458, 1.449, 1.438, 1.429, 1.427, 1.426, 1.429, 1.436, 1.444, 1.456, 1.468, 1.483, 1.497, 1.509, 1.518, 1.524, 1.526, 1.526, 1.523, 1.521, 1.516, + 1.532, 1.534, 1.537, 1.538, 1.536, 1.533, 1.524, 1.512, 1.499, 1.483, 1.468, 1.453, 1.439, 1.429, 1.421, 1.419, 1.419, 1.419, 1.427, 1.438, 1.451, 1.464, 1.479, 1.494, 1.506, 1.516, 1.523, 1.526, 1.526, 1.524, 1.521, 1.518, + 1.533, 1.536, 1.537, 1.537, 1.535, 1.532, 1.521, 1.507, 1.491, 1.474, 1.456, 1.441, 1.429, 1.418, 1.409, 1.406, 1.406, 1.408, 1.415, 1.426, 1.439, 1.453, 1.471, 1.485, 1.501, 1.511, 1.522, 1.524, 1.526, 1.525, 1.522, 1.519, + 1.537, 1.538, 1.539, 1.538, 1.534, 1.525, 1.513, 1.495, 1.477, 1.459, 1.443, 1.427, 1.413, 1.402, 1.394, 1.391, 1.391, 1.393, 1.399, 1.409, 1.424, 1.439, 1.455, 1.472, 1.489, 1.503, 1.515, 1.523, 1.526, 1.527, 1.525, 1.523, + 1.538, 1.539, 1.541, 1.539, 1.531, 1.519, 1.503, 1.484, 1.466, 1.445, 1.427, 1.413, 1.401, 1.386, 1.378, 1.373, 1.373, 1.376, 1.386, 1.398, 1.409, 1.424, 1.441, 1.459, 1.477, 1.495, 1.509, 1.519, 1.526, 1.528, 1.528, 1.526, + 1.539, 1.541, 1.541, 1.539, 1.529, 1.516, 1.498, 1.479, 1.456, 1.437, 1.417, 1.401, 1.386, 1.378, 1.369, 1.363, 1.363, 1.367, 1.376, 1.386, 1.399, 1.413, 1.432, 1.451, 1.472, 1.491, 1.507, 1.517, 1.525, 1.527, 1.527, 1.527, + 1.539, 1.539, 1.539, 1.538, 1.529, 1.515, 1.497, 1.476, 1.454, 1.433, 1.411, 1.395, 1.381, 1.368, 1.361, 1.356, 1.356, 1.359, 1.367, 1.379, 1.393, 1.409, 1.428, 1.448, 1.471, 1.489, 1.505, 1.516, 1.524, 1.527, 1.527, 1.527, + 1.539, 1.539, 1.539, 1.537, 1.528, 1.513, 1.493, 1.471, 1.449, 1.426, 1.406, 1.387, 1.373, 1.361, 1.352, 1.348, 1.348, 1.351, 1.359, 1.372, 1.387, 1.403, 1.422, 1.443, 1.465, 1.484, 1.503, 1.516, 1.525, 1.527, 1.528, 1.526, + 1.541, 1.542, 1.539, 1.537, 1.524, 1.506, 1.485, 1.461, 1.438, 1.416, 1.395, 1.377, 1.362, 1.352, 1.344, 1.339, 1.339, 1.342, 1.351, 1.362, 1.376, 1.393, 1.412, 1.434, 1.455, 1.477, 1.495, 1.514, 1.524, 1.528, 1.529, 1.529, + 1.543, 1.544, 1.543, 1.534, 1.518, 1.499, 1.476, 1.452, 1.427, 1.405, 1.386, 1.367, 1.354, 1.344, 1.338, 1.329, 1.329, 1.335, 1.342, 1.352, 1.367, 1.382, 1.402, 1.424, 1.445, 1.469, 1.491, 1.507, 1.522, 1.528, 1.529, 1.532, + 1.544, 1.544, 1.542, 1.534, 1.518, 1.499, 1.474, 1.449, 1.425, 1.401, 1.379, 1.362, 1.348, 1.338, 1.329, 1.324, 1.325, 1.329, 1.335, 1.347, 1.361, 1.378, 1.397, 1.421, 1.443, 1.467, 1.489, 1.507, 1.521, 1.529, 1.532, 1.533, + 1.543, 1.543, 1.541, 1.534, 1.519, 1.499, 1.474, 1.448, 1.424, 1.399, 1.377, 1.359, 1.346, 1.333, 1.324, 1.322, 1.321, 1.324, 1.332, 1.344, 1.359, 1.376, 1.397, 1.419, 1.443, 1.467, 1.489, 1.508, 1.521, 1.528, 1.531, 1.532, + 1.543, 1.542, 1.541, 1.533, 1.519, 1.499, 1.474, 1.448, 1.422, 1.399, 1.376, 1.358, 1.344, 1.331, 1.322, 1.319, 1.319, 1.321, 1.331, 1.342, 1.357, 1.375, 1.396, 1.419, 1.443, 1.467, 1.489, 1.508, 1.521, 1.529, 1.531, 1.532, + 1.543, 1.542, 1.541, 1.532, 1.518, 1.496, 1.471, 1.445, 1.418, 1.393, 1.373, 1.354, 1.341, 1.329, 1.319, 1.317, 1.316, 1.319, 1.327, 1.338, 1.353, 1.371, 1.392, 1.415, 1.439, 1.465, 1.485, 1.507, 1.519, 1.529, 1.531, 1.531, + 1.545, 1.544, 1.542, 1.531, 1.515, 1.493, 1.467, 1.441, 1.414, 1.391, 1.369, 1.351, 1.337, 1.326, 1.318, 1.314, 1.314, 1.317, 1.325, 1.335, 1.351, 1.367, 1.388, 1.411, 1.436, 1.461, 1.483, 1.505, 1.519, 1.531, 1.533, 1.533, + 1.545, 1.544, 1.541, 1.531, 1.515, 1.493, 1.467, 1.441, 1.414, 1.391, 1.369, 1.351, 1.337, 1.326, 1.318, 1.314, 1.314, 1.317, 1.325, 1.335, 1.351, 1.367, 1.388, 1.411, 1.436, 1.461, 1.483, 1.505, 1.521, 1.531, 1.534, 1.534, + 1.545, 1.544, 1.541, 1.534, 1.519, 1.496, 1.471, 1.446, 1.419, 1.392, 1.372, 1.354, 1.338, 1.328, 1.319, 1.316, 1.315, 1.319, 1.327, 1.338, 1.353, 1.371, 1.392, 1.416, 1.441, 1.465, 1.489, 1.511, 1.522, 1.531, 1.534, 1.535, + 1.544, 1.544, 1.542, 1.537, 1.524, 1.501, 1.476, 1.449, 1.424, 1.399, 1.377, 1.359, 1.344, 1.332, 1.324, 1.319, 1.319, 1.323, 1.331, 1.343, 1.358, 1.374, 1.396, 1.419, 1.445, 1.471, 1.493, 1.512, 1.525, 1.532, 1.534, 1.534, + 1.545, 1.545, 1.543, 1.538, 1.524, 1.503, 1.479, 1.452, 1.426, 1.402, 1.381, 1.362, 1.348, 1.337, 1.329, 1.324, 1.324, 1.328, 1.335, 1.347, 1.361, 1.379, 1.399, 1.423, 1.447, 1.471, 1.493, 1.513, 1.526, 1.533, 1.534, 1.535, + 1.546, 1.546, 1.544, 1.539, 1.525, 1.504, 1.479, 1.453, 1.428, 1.404, 1.383, 1.365, 1.352, 1.339, 1.333, 1.329, 1.329, 1.333, 1.339, 1.349, 1.363, 1.381, 1.402, 1.424, 1.448, 1.472, 1.494, 1.514, 1.526, 1.534, 1.534, 1.534, + 1.546, 1.546, 1.544, 1.539, 1.526, 1.505, 1.483, 1.457, 1.432, 1.407, 1.389, 1.371, 1.357, 1.347, 1.339, 1.333, 1.333, 1.339, 1.345, 1.354, 1.368, 1.386, 1.406, 1.428, 1.453, 1.475, 1.496, 1.515, 1.527, 1.535, 1.535, 1.535, + 1.545, 1.545, 1.545, 1.541, 1.529, 1.513, 1.491, 1.467, 1.441, 1.418, 1.399, 1.379, 1.366, 1.355, 1.347, 1.341, 1.341, 1.345, 1.354, 1.364, 1.378, 1.395, 1.415, 1.436, 1.459, 1.483, 1.503, 1.519, 1.531, 1.534, 1.535, 1.534, + 1.544, 1.545, 1.545, 1.544, 1.535, 1.519, 1.499, 1.476, 1.451, 1.428, 1.409, 1.391, 1.377, 1.366, 1.356, 1.352, 1.352, 1.355, 1.364, 1.374, 1.388, 1.405, 1.426, 1.447, 1.469, 1.492, 1.509, 1.523, 1.532, 1.535, 1.535, 1.533, + 1.544, 1.545, 1.546, 1.545, 1.537, 1.523, 1.504, 1.482, 1.458, 1.436, 1.418, 1.401, 1.385, 1.377, 1.367, 1.362, 1.362, 1.365, 1.373, 1.385, 1.398, 1.415, 1.434, 1.455, 1.477, 1.495, 1.514, 1.525, 1.533, 1.536, 1.535, 1.533, + 1.545, 1.546, 1.547, 1.545, 1.538, 1.525, 1.508, 1.486, 1.465, 1.444, 1.424, 1.408, 1.394, 1.385, 1.377, 1.371, 1.371, 1.373, 1.384, 1.392, 1.405, 1.421, 1.441, 1.459, 1.481, 1.499, 1.516, 1.528, 1.534, 1.536, 1.536, 1.533, + 1.544, 1.546, 1.547, 1.547, 1.541, 1.531, 1.514, 1.494, 1.474, 1.454, 1.434, 1.421, 1.408, 1.394, 1.386, 1.382, 1.382, 1.385, 1.392, 1.405, 1.416, 1.432, 1.449, 1.468, 1.488, 1.505, 1.519, 1.531, 1.536, 1.537, 1.536, 1.533, + 1.544, 1.546, 1.548, 1.548, 1.545, 1.536, 1.522, 1.506, 1.486, 1.467, 1.451, 1.434, 1.421, 1.408, 1.401, 1.396, 1.396, 1.399, 1.407, 1.416, 1.431, 1.447, 1.463, 1.481, 1.499, 1.513, 1.526, 1.534, 1.537, 1.537, 1.534, 1.531, + 1.543, 1.545, 1.547, 1.549, 1.549, 1.543, 1.531, 1.517, 1.501, 1.483, 1.465, 1.451, 1.438, 1.425, 1.417, 1.412, 1.412, 1.418, 1.423, 1.433, 1.447, 1.462, 1.479, 1.493, 1.511, 1.524, 1.531, 1.536, 1.538, 1.537, 1.533, 1.531, + 1.542, 1.545, 1.548, 1.551, 1.551, 1.546, 1.539, 1.524, 1.511, 1.493, 1.479, 1.464, 1.451, 1.442, 1.433, 1.429, 1.429, 1.434, 1.439, 1.449, 1.462, 1.474, 1.491, 1.505, 1.519, 1.529, 1.536, 1.539, 1.539, 1.537, 1.533, 1.531, + 1.541, 1.546, 1.549, 1.552, 1.553, 1.551, 1.544, 1.533, 1.521, 1.505, 1.489, 1.477, 1.464, 1.455, 1.447, 1.443, 1.443, 1.446, 1.451, 1.462, 1.472, 1.487, 1.499, 1.514, 1.525, 1.535, 1.541, 1.541, 1.541, 1.539, 1.533, 1.531, + 1.541, 1.546, 1.549, 1.553, 1.554, 1.552, 1.546, 1.537, 1.524, 1.512, 1.499, 1.485, 1.474, 1.464, 1.455, 1.451, 1.451, 1.452, 1.461, 1.469, 1.481, 1.495, 1.506, 1.518, 1.529, 1.539, 1.541, 1.542, 1.541, 1.539, 1.533, 1.529 + ] + }, + { + "ct": 5000, + "table": + [ + 2.586, 2.591, 2.597, 2.601, 2.601, 2.599, 2.592, 2.576, 2.561, 2.541, 2.523, 2.503, 2.486, 2.471, 2.459, 2.452, 2.452, 2.454, 2.462, 2.478, 2.495, 2.512, 2.531, 2.555, 2.568, 2.579, 2.587, 2.588, 2.585, 2.579, 2.573, 2.566, + 2.587, 2.592, 2.598, 2.601, 2.601, 2.599, 2.587, 2.574, 2.556, 2.532, 2.512, 2.491, 2.474, 2.462, 2.449, 2.443, 2.439, 2.443, 2.454, 2.464, 2.485, 2.505, 2.525, 2.548, 2.566, 2.578, 2.585, 2.588, 2.586, 2.579, 2.575, 2.567, + 2.587, 2.593, 2.598, 2.602, 2.601, 2.597, 2.584, 2.569, 2.551, 2.527, 2.503, 2.482, 2.464, 2.448, 2.434, 2.428, 2.427, 2.431, 2.439, 2.455, 2.474, 2.498, 2.521, 2.541, 2.564, 2.577, 2.585, 2.588, 2.589, 2.581, 2.576, 2.569, + 2.593, 2.596, 2.601, 2.603, 2.601, 2.594, 2.583, 2.563, 2.539, 2.514, 2.491, 2.466, 2.445, 2.429, 2.417, 2.409, 2.408, 2.411, 2.421, 2.437, 2.457, 2.481, 2.507, 2.531, 2.555, 2.572, 2.583, 2.588, 2.588, 2.585, 2.579, 2.575, + 2.597, 2.599, 2.604, 2.603, 2.599, 2.587, 2.567, 2.548, 2.522, 2.493, 2.467, 2.443, 2.419, 2.406, 2.391, 2.385, 2.385, 2.387, 2.397, 2.413, 2.435, 2.459, 2.486, 2.509, 2.538, 2.559, 2.574, 2.586, 2.588, 2.586, 2.582, 2.579, + 2.601, 2.603, 2.606, 2.604, 2.596, 2.578, 2.556, 2.531, 2.501, 2.471, 2.444, 2.419, 2.402, 2.381, 2.365, 2.359, 2.359, 2.361, 2.374, 2.396, 2.413, 2.435, 2.465, 2.493, 2.517, 2.542, 2.562, 2.582, 2.588, 2.587, 2.586, 2.584, + 2.601, 2.604, 2.605, 2.604, 2.593, 2.575, 2.547, 2.522, 2.488, 2.458, 2.432, 2.402, 2.381, 2.364, 2.349, 2.338, 2.338, 2.345, 2.359, 2.374, 2.396, 2.423, 2.453, 2.481, 2.511, 2.539, 2.561, 2.581, 2.586, 2.588, 2.588, 2.586, + 2.599, 2.602, 2.604, 2.602, 2.592, 2.572, 2.546, 2.516, 2.485, 2.451, 2.422, 2.393, 2.368, 2.349, 2.336, 2.328, 2.328, 2.333, 2.345, 2.365, 2.389, 2.417, 2.447, 2.478, 2.509, 2.537, 2.561, 2.577, 2.585, 2.588, 2.588, 2.587, + 2.601, 2.602, 2.604, 2.601, 2.589, 2.569, 2.539, 2.509, 2.473, 2.442, 2.409, 2.379, 2.357, 2.336, 2.323, 2.315, 2.315, 2.322, 2.334, 2.354, 2.377, 2.406, 2.436, 2.469, 2.503, 2.529, 2.558, 2.574, 2.585, 2.588, 2.589, 2.587, + 2.601, 2.606, 2.606, 2.601, 2.581, 2.557, 2.525, 2.493, 2.459, 2.426, 2.394, 2.365, 2.339, 2.322, 2.308, 2.301, 2.301, 2.305, 2.322, 2.337, 2.361, 2.389, 2.422, 2.454, 2.485, 2.519, 2.546, 2.568, 2.584, 2.589, 2.589, 2.589, + 2.608, 2.608, 2.606, 2.597, 2.576, 2.548, 2.515, 2.481, 2.444, 2.409, 2.376, 2.346, 2.323, 2.308, 2.293, 2.282, 2.281, 2.291, 2.305, 2.322, 2.348, 2.371, 2.403, 2.439, 2.472, 2.508, 2.538, 2.565, 2.582, 2.589, 2.592, 2.593, + 2.608, 2.608, 2.605, 2.596, 2.575, 2.547, 2.511, 2.474, 2.435, 2.401, 2.366, 2.339, 2.312, 2.293, 2.281, 2.274, 2.274, 2.281, 2.291, 2.311, 2.334, 2.364, 2.399, 2.433, 2.471, 2.506, 2.538, 2.564, 2.581, 2.591, 2.594, 2.595, + 2.605, 2.606, 2.605, 2.595, 2.575, 2.547, 2.511, 2.474, 2.433, 2.397, 2.363, 2.333, 2.309, 2.291, 2.274, 2.267, 2.265, 2.272, 2.284, 2.307, 2.331, 2.361, 2.395, 2.431, 2.469, 2.503, 2.539, 2.567, 2.584, 2.591, 2.595, 2.595, + 2.605, 2.606, 2.605, 2.595, 2.575, 2.547, 2.509, 2.473, 2.431, 2.395, 2.361, 2.332, 2.306, 2.285, 2.267, 2.261, 2.262, 2.265, 2.281, 2.302, 2.329, 2.359, 2.395, 2.429, 2.468, 2.503, 2.539, 2.567, 2.583, 2.593, 2.595, 2.595, + 2.608, 2.607, 2.606, 2.592, 2.572, 2.543, 2.506, 2.468, 2.426, 2.389, 2.354, 2.327, 2.299, 2.279, 2.262, 2.258, 2.257, 2.262, 2.276, 2.297, 2.321, 2.352, 2.387, 2.425, 2.464, 2.498, 2.532, 2.565, 2.582, 2.592, 2.595, 2.596, + 2.611, 2.609, 2.605, 2.592, 2.571, 2.538, 2.499, 2.463, 2.421, 2.384, 2.351, 2.322, 2.295, 2.276, 2.259, 2.254, 2.254, 2.256, 2.273, 2.292, 2.318, 2.347, 2.383, 2.418, 2.456, 2.491, 2.529, 2.562, 2.581, 2.593, 2.597, 2.598, + 2.609, 2.609, 2.606, 2.593, 2.571, 2.538, 2.499, 2.463, 2.421, 2.384, 2.351, 2.321, 2.295, 2.276, 2.259, 2.251, 2.251, 2.256, 2.273, 2.292, 2.318, 2.347, 2.383, 2.418, 2.456, 2.491, 2.529, 2.559, 2.582, 2.595, 2.597, 2.599, + 2.609, 2.609, 2.607, 2.597, 2.576, 2.543, 2.507, 2.467, 2.427, 2.388, 2.356, 2.323, 2.297, 2.278, 2.262, 2.256, 2.255, 2.262, 2.275, 2.296, 2.321, 2.351, 2.388, 2.425, 2.464, 2.502, 2.534, 2.563, 2.586, 2.595, 2.598, 2.599, + 2.609, 2.609, 2.608, 2.601, 2.581, 2.547, 2.513, 2.475, 2.434, 2.398, 2.362, 2.332, 2.307, 2.287, 2.269, 2.263, 2.263, 2.269, 2.281, 2.304, 2.328, 2.358, 2.394, 2.429, 2.469, 2.508, 2.538, 2.568, 2.589, 2.597, 2.598, 2.598, + 2.609, 2.611, 2.609, 2.601, 2.583, 2.549, 2.518, 2.478, 2.439, 2.402, 2.367, 2.337, 2.313, 2.293, 2.279, 2.271, 2.269, 2.277, 2.291, 2.311, 2.336, 2.363, 2.399, 2.435, 2.473, 2.509, 2.541, 2.571, 2.591, 2.598, 2.599, 2.599, + 2.611, 2.611, 2.609, 2.602, 2.585, 2.551, 2.519, 2.481, 2.442, 2.406, 2.374, 2.342, 2.318, 2.297, 2.287, 2.279, 2.278, 2.287, 2.297, 2.315, 2.339, 2.368, 2.402, 2.438, 2.476, 2.511, 2.545, 2.571, 2.591, 2.599, 2.601, 2.599, + 2.611, 2.611, 2.609, 2.604, 2.587, 2.557, 2.521, 2.485, 2.447, 2.412, 2.379, 2.352, 2.328, 2.309, 2.297, 2.288, 2.287, 2.297, 2.308, 2.327, 2.349, 2.377, 2.408, 2.446, 2.481, 2.517, 2.547, 2.573, 2.591, 2.599, 2.601, 2.599, + 2.608, 2.609, 2.609, 2.606, 2.592, 2.564, 2.533, 2.498, 2.462, 2.427, 2.394, 2.364, 2.343, 2.326, 2.309, 2.302, 2.302, 2.308, 2.324, 2.341, 2.362, 2.391, 2.425, 2.458, 2.494, 2.526, 2.555, 2.584, 2.593, 2.599, 2.599, 2.599, + 2.608, 2.609, 2.609, 2.609, 2.597, 2.574, 2.547, 2.511, 2.475, 2.438, 2.411, 2.381, 2.359, 2.342, 2.327, 2.318, 2.318, 2.325, 2.341, 2.358, 2.377, 2.404, 2.439, 2.469, 2.507, 2.537, 2.564, 2.587, 2.596, 2.598, 2.598, 2.597, + 2.609, 2.609, 2.611, 2.609, 2.599, 2.579, 2.551, 2.519, 2.486, 2.453, 2.425, 2.397, 2.375, 2.358, 2.345, 2.336, 2.336, 2.341, 2.355, 2.372, 2.393, 2.419, 2.452, 2.481, 2.516, 2.542, 2.571, 2.591, 2.597, 2.599, 2.598, 2.595, + 2.607, 2.611, 2.613, 2.611, 2.605, 2.586, 2.561, 2.529, 2.495, 2.462, 2.435, 2.409, 2.387, 2.374, 2.359, 2.351, 2.351, 2.356, 2.372, 2.385, 2.406, 2.431, 2.462, 2.488, 2.524, 2.551, 2.573, 2.591, 2.598, 2.599, 2.598, 2.596, + 2.606, 2.609, 2.613, 2.613, 2.607, 2.591, 2.565, 2.539, 2.507, 2.477, 2.449, 2.425, 2.409, 2.387, 2.376, 2.369, 2.369, 2.374, 2.385, 2.406, 2.422, 2.446, 2.473, 2.502, 2.534, 2.557, 2.578, 2.595, 2.599, 2.601, 2.598, 2.595, + 2.606, 2.611, 2.613, 2.614, 2.611, 2.598, 2.581, 2.553, 2.523, 2.496, 2.471, 2.449, 2.425, 2.409, 2.398, 2.391, 2.391, 2.395, 2.408, 2.422, 2.445, 2.468, 2.493, 2.522, 2.549, 2.569, 2.589, 2.601, 2.603, 2.602, 2.596, 2.593, + 2.605, 2.609, 2.613, 2.616, 2.614, 2.607, 2.591, 2.571, 2.545, 2.518, 2.494, 2.471, 2.452, 2.435, 2.423, 2.417, 2.417, 2.421, 2.431, 2.449, 2.467, 2.493, 2.516, 2.542, 2.566, 2.585, 2.596, 2.606, 2.605, 2.602, 2.595, 2.593, + 2.604, 2.608, 2.616, 2.617, 2.618, 2.613, 2.602, 2.584, 2.559, 2.536, 2.514, 2.493, 2.476, 2.459, 2.445, 2.439, 2.439, 2.445, 2.456, 2.471, 2.493, 2.511, 2.534, 2.559, 2.579, 2.592, 2.607, 2.608, 2.607, 2.604, 2.595, 2.592, + 2.603, 2.609, 2.615, 2.619, 2.623, 2.619, 2.608, 2.594, 2.573, 2.551, 2.532, 2.512, 2.493, 2.477, 2.468, 2.462, 2.462, 2.468, 2.476, 2.494, 2.509, 2.528, 2.551, 2.574, 2.589, 2.604, 2.611, 2.611, 2.611, 2.604, 2.598, 2.592, + 2.602, 2.607, 2.613, 2.621, 2.624, 2.621, 2.617, 2.601, 2.585, 2.567, 2.544, 2.521, 2.507, 2.493, 2.478, 2.474, 2.475, 2.477, 2.489, 2.505, 2.523, 2.544, 2.563, 2.584, 2.598, 2.609, 2.612, 2.613, 2.613, 2.608, 2.599, 2.591 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 3.263, 3.263, 3.264, 3.269, 3.274, 3.275, 3.277, 3.281, 3.283, 3.285, 3.289, 3.292, 3.291, 3.291, 3.294, 3.298, 3.302, 3.305, 3.303, 3.301, 3.296, 3.294, 3.293, 3.293, 3.295, 3.295, 3.295, 3.287, 3.285, 3.279, 3.282, 3.285, + 3.259, 3.259, 3.262, 3.268, 3.271, 3.273, 3.273, 3.274, 3.277, 3.278, 3.282, 3.285, 3.286, 3.286, 3.288, 3.289, 3.292, 3.291, 3.293, 3.291, 3.288, 3.288, 3.288, 3.288, 3.288, 3.287, 3.287, 3.283, 3.281, 3.276, 3.277, 3.281, + 3.259, 3.259, 3.262, 3.269, 3.272, 3.274, 3.273, 3.273, 3.273, 3.276, 3.278, 3.279, 3.281, 3.282, 3.283, 3.283, 3.285, 3.286, 3.286, 3.285, 3.283, 3.282, 3.282, 3.286, 3.285, 3.285, 3.285, 3.282, 3.281, 3.276, 3.275, 3.279, + 3.267, 3.266, 3.269, 3.273, 3.274, 3.277, 3.276, 3.275, 3.274, 3.277, 3.277, 3.278, 3.279, 3.279, 3.279, 3.279, 3.281, 3.283, 3.283, 3.281, 3.281, 3.281, 3.282, 3.287, 3.287, 3.288, 3.287, 3.286, 3.283, 3.277, 3.278, 3.281, + 3.268, 3.271, 3.274, 3.277, 3.283, 3.286, 3.284, 3.281, 3.278, 3.278, 3.279, 3.279, 3.281, 3.281, 3.281, 3.281, 3.282, 3.283, 3.284, 3.283, 3.282, 3.282, 3.284, 3.288, 3.289, 3.291, 3.291, 3.288, 3.288, 3.283, 3.286, 3.288, + 3.272, 3.275, 3.279, 3.283, 3.288, 3.289, 3.289, 3.287, 3.282, 3.284, 3.282, 3.284, 3.284, 3.285, 3.284, 3.285, 3.285, 3.288, 3.287, 3.286, 3.283, 3.283, 3.285, 3.289, 3.292, 3.292, 3.293, 3.292, 3.291, 3.288, 3.289, 3.293, + 3.276, 3.278, 3.282, 3.289, 3.293, 3.293, 3.291, 3.289, 3.287, 3.286, 3.285, 3.285, 3.286, 3.286, 3.287, 3.288, 3.289, 3.289, 3.289, 3.288, 3.285, 3.283, 3.286, 3.289, 3.292, 3.294, 3.294, 3.294, 3.293, 3.289, 3.292, 3.293, + 3.279, 3.281, 3.286, 3.293, 3.297, 3.298, 3.295, 3.292, 3.288, 3.287, 3.285, 3.287, 3.288, 3.288, 3.289, 3.291, 3.292, 3.293, 3.291, 3.288, 3.286, 3.285, 3.285, 3.291, 3.294, 3.295, 3.297, 3.297, 3.298, 3.293, 3.294, 3.294, + 3.281, 3.286, 3.291, 3.298, 3.301, 3.301, 3.299, 3.295, 3.289, 3.288, 3.286, 3.288, 3.289, 3.292, 3.293, 3.292, 3.295, 3.296, 3.295, 3.291, 3.287, 3.286, 3.286, 3.289, 3.295, 3.297, 3.298, 3.301, 3.301, 3.298, 3.297, 3.297, + 3.284, 3.289, 3.295, 3.302, 3.303, 3.303, 3.301, 3.298, 3.294, 3.292, 3.289, 3.293, 3.296, 3.297, 3.297, 3.297, 3.297, 3.298, 3.298, 3.296, 3.289, 3.288, 3.287, 3.294, 3.298, 3.301, 3.304, 3.305, 3.304, 3.299, 3.299, 3.302, + 3.291, 3.292, 3.299, 3.305, 3.308, 3.305, 3.304, 3.302, 3.298, 3.295, 3.295, 3.298, 3.299, 3.302, 3.303, 3.302, 3.301, 3.301, 3.301, 3.299, 3.296, 3.291, 3.292, 3.297, 3.301, 3.304, 3.306, 3.309, 3.308, 3.302, 3.301, 3.304, + 3.292, 3.297, 3.303, 3.309, 3.312, 3.311, 3.308, 3.304, 3.301, 3.299, 3.298, 3.299, 3.303, 3.305, 3.306, 3.305, 3.305, 3.303, 3.303, 3.301, 3.299, 3.294, 3.294, 3.297, 3.302, 3.305, 3.309, 3.311, 3.311, 3.305, 3.305, 3.306, + 3.295, 3.298, 3.305, 3.309, 3.313, 3.313, 3.312, 3.307, 3.303, 3.301, 3.299, 3.301, 3.304, 3.307, 3.308, 3.306, 3.306, 3.306, 3.306, 3.302, 3.299, 3.296, 3.295, 3.298, 3.303, 3.306, 3.311, 3.312, 3.312, 3.307, 3.308, 3.309, + 3.297, 3.298, 3.303, 3.309, 3.313, 3.313, 3.311, 3.307, 3.303, 3.301, 3.299, 3.299, 3.305, 3.307, 3.307, 3.306, 3.306, 3.306, 3.305, 3.299, 3.297, 3.294, 3.294, 3.298, 3.303, 3.305, 3.311, 3.312, 3.313, 3.308, 3.311, 3.309, + 3.297, 3.298, 3.304, 3.309, 3.312, 3.313, 3.311, 3.308, 3.304, 3.302, 3.301, 3.301, 3.306, 3.307, 3.308, 3.306, 3.306, 3.307, 3.306, 3.302, 3.297, 3.294, 3.294, 3.299, 3.305, 3.306, 3.309, 3.312, 3.311, 3.306, 3.308, 3.309, + 3.298, 3.299, 3.306, 3.311, 3.315, 3.314, 3.311, 3.308, 3.305, 3.303, 3.303, 3.304, 3.307, 3.309, 3.309, 3.308, 3.308, 3.307, 3.306, 3.302, 3.298, 3.296, 3.296, 3.298, 3.304, 3.306, 3.308, 3.309, 3.314, 3.308, 3.309, 3.308, + 3.299, 3.301, 3.307, 3.313, 3.316, 3.316, 3.313, 3.311, 3.307, 3.305, 3.305, 3.307, 3.309, 3.311, 3.312, 3.311, 3.309, 3.309, 3.308, 3.306, 3.301, 3.298, 3.297, 3.301, 3.305, 3.309, 3.309, 3.311, 3.313, 3.306, 3.308, 3.307, + 3.301, 3.301, 3.307, 3.314, 3.317, 3.318, 3.314, 3.311, 3.308, 3.306, 3.306, 3.308, 3.311, 3.311, 3.312, 3.311, 3.309, 3.309, 3.309, 3.306, 3.302, 3.298, 3.298, 3.301, 3.305, 3.309, 3.311, 3.311, 3.312, 3.309, 3.308, 3.308, + 3.301, 3.302, 3.307, 3.316, 3.319, 3.319, 3.315, 3.312, 3.309, 3.306, 3.307, 3.309, 3.311, 3.312, 3.311, 3.311, 3.309, 3.309, 3.309, 3.306, 3.303, 3.299, 3.298, 3.302, 3.305, 3.308, 3.309, 3.309, 3.309, 3.303, 3.306, 3.307, + 3.301, 3.303, 3.308, 3.315, 3.318, 3.318, 3.316, 3.313, 3.311, 3.307, 3.307, 3.308, 3.311, 3.311, 3.311, 3.308, 3.308, 3.307, 3.307, 3.306, 3.303, 3.299, 3.297, 3.301, 3.303, 3.306, 3.309, 3.308, 3.306, 3.303, 3.304, 3.306, + 3.302, 3.304, 3.306, 3.316, 3.318, 3.318, 3.317, 3.315, 3.311, 3.308, 3.309, 3.311, 3.311, 3.312, 3.311, 3.307, 3.306, 3.307, 3.308, 3.307, 3.304, 3.299, 3.298, 3.301, 3.303, 3.305, 3.306, 3.305, 3.304, 3.302, 3.303, 3.306, + 3.302, 3.304, 3.306, 3.312, 3.316, 3.317, 3.317, 3.313, 3.311, 3.309, 3.309, 3.311, 3.311, 3.312, 3.309, 3.307, 3.306, 3.306, 3.308, 3.307, 3.304, 3.298, 3.297, 3.302, 3.304, 3.305, 3.306, 3.305, 3.304, 3.299, 3.302, 3.303, + 3.299, 3.299, 3.306, 3.309, 3.315, 3.316, 3.316, 3.312, 3.309, 3.308, 3.308, 3.309, 3.311, 3.311, 3.307, 3.305, 3.305, 3.305, 3.306, 3.304, 3.299, 3.297, 3.296, 3.301, 3.302, 3.304, 3.303, 3.302, 3.301, 3.298, 3.299, 3.301, + 3.295, 3.297, 3.305, 3.309, 3.311, 3.311, 3.311, 3.309, 3.307, 3.306, 3.305, 3.305, 3.305, 3.305, 3.304, 3.301, 3.301, 3.301, 3.302, 3.299, 3.296, 3.295, 3.295, 3.298, 3.301, 3.302, 3.303, 3.301, 3.299, 3.295, 3.297, 3.299, + 3.294, 3.296, 3.299, 3.306, 3.308, 3.309, 3.309, 3.307, 3.307, 3.303, 3.302, 3.301, 3.302, 3.303, 3.302, 3.299, 3.298, 3.299, 3.299, 3.298, 3.295, 3.292, 3.292, 3.293, 3.297, 3.299, 3.299, 3.299, 3.297, 3.294, 3.295, 3.299, + 3.291, 3.292, 3.296, 3.302, 3.306, 3.306, 3.307, 3.306, 3.305, 3.303, 3.302, 3.301, 3.301, 3.303, 3.301, 3.299, 3.298, 3.298, 3.298, 3.297, 3.295, 3.292, 3.291, 3.291, 3.295, 3.295, 3.297, 3.298, 3.296, 3.293, 3.292, 3.291, + 3.293, 3.292, 3.294, 3.301, 3.303, 3.305, 3.308, 3.306, 3.306, 3.304, 3.304, 3.303, 3.303, 3.303, 3.302, 3.301, 3.299, 3.299, 3.299, 3.299, 3.294, 3.291, 3.289, 3.291, 3.293, 3.294, 3.294, 3.294, 3.294, 3.289, 3.291, 3.291, + 3.288, 3.289, 3.291, 3.299, 3.303, 3.304, 3.304, 3.304, 3.304, 3.303, 3.303, 3.304, 3.306, 3.305, 3.303, 3.301, 3.301, 3.298, 3.299, 3.298, 3.293, 3.291, 3.289, 3.291, 3.291, 3.292, 3.291, 3.291, 3.291, 3.285, 3.288, 3.291, + 3.285, 3.284, 3.287, 3.291, 3.299, 3.299, 3.299, 3.299, 3.299, 3.301, 3.302, 3.303, 3.303, 3.302, 3.299, 3.298, 3.298, 3.298, 3.298, 3.293, 3.288, 3.286, 3.285, 3.288, 3.288, 3.288, 3.287, 3.285, 3.284, 3.279, 3.281, 3.284, + 3.281, 3.282, 3.282, 3.286, 3.291, 3.294, 3.294, 3.295, 3.295, 3.299, 3.301, 3.304, 3.305, 3.299, 3.299, 3.297, 3.298, 3.298, 3.297, 3.292, 3.288, 3.285, 3.283, 3.284, 3.284, 3.286, 3.284, 3.282, 3.279, 3.275, 3.275, 3.278, + 3.282, 3.282, 3.284, 3.286, 3.291, 3.294, 3.295, 3.295, 3.298, 3.301, 3.304, 3.306, 3.306, 3.304, 3.303, 3.301, 3.302, 3.299, 3.299, 3.295, 3.289, 3.287, 3.284, 3.288, 3.287, 3.287, 3.285, 3.283, 3.282, 3.278, 3.281, 3.286, + 3.292, 3.291, 3.292, 3.298, 3.307, 3.309, 3.308, 3.312, 3.313, 3.317, 3.324, 3.327, 3.327, 3.325, 3.326, 3.322, 3.319, 3.317, 3.317, 3.315, 3.312, 3.305, 3.303, 3.301, 3.299, 3.297, 3.299, 3.293, 3.289, 3.285, 3.287, 3.293 + ] + }, + { + "ct": 5000, + "table": + [ + 1.602, 1.603, 1.605, 1.608, 1.611, 1.612, 1.612, 1.614, 1.615, 1.616, 1.619, 1.621, 1.621, 1.622, 1.622, 1.624, 1.624, 1.626, 1.625, 1.625, 1.623, 1.622, 1.621, 1.619, 1.618, 1.617, 1.616, 1.614, 1.612, 1.609, 1.609, 1.611, + 1.601, 1.602, 1.605, 1.608, 1.611, 1.612, 1.612, 1.613, 1.614, 1.615, 1.617, 1.619, 1.621, 1.621, 1.621, 1.621, 1.622, 1.624, 1.624, 1.624, 1.622, 1.621, 1.619, 1.618, 1.617, 1.616, 1.615, 1.614, 1.612, 1.609, 1.609, 1.609, + 1.602, 1.603, 1.605, 1.609, 1.611, 1.613, 1.613, 1.613, 1.613, 1.615, 1.616, 1.618, 1.618, 1.619, 1.619, 1.619, 1.621, 1.621, 1.622, 1.622, 1.619, 1.618, 1.617, 1.617, 1.616, 1.615, 1.615, 1.615, 1.612, 1.609, 1.609, 1.609, + 1.604, 1.605, 1.608, 1.612, 1.613, 1.614, 1.614, 1.614, 1.614, 1.614, 1.616, 1.617, 1.618, 1.618, 1.618, 1.619, 1.619, 1.621, 1.622, 1.621, 1.619, 1.618, 1.617, 1.616, 1.616, 1.616, 1.616, 1.615, 1.615, 1.612, 1.611, 1.611, + 1.606, 1.608, 1.611, 1.614, 1.615, 1.615, 1.616, 1.616, 1.615, 1.615, 1.617, 1.618, 1.619, 1.619, 1.618, 1.619, 1.621, 1.622, 1.623, 1.622, 1.619, 1.619, 1.617, 1.617, 1.617, 1.618, 1.618, 1.617, 1.617, 1.614, 1.613, 1.613, + 1.608, 1.611, 1.614, 1.617, 1.618, 1.618, 1.618, 1.618, 1.618, 1.618, 1.619, 1.621, 1.621, 1.621, 1.621, 1.621, 1.622, 1.623, 1.624, 1.623, 1.622, 1.619, 1.619, 1.618, 1.618, 1.618, 1.618, 1.618, 1.618, 1.617, 1.615, 1.614, + 1.611, 1.613, 1.616, 1.618, 1.621, 1.621, 1.619, 1.619, 1.619, 1.619, 1.619, 1.621, 1.622, 1.623, 1.623, 1.623, 1.623, 1.624, 1.626, 1.624, 1.623, 1.621, 1.619, 1.619, 1.619, 1.619, 1.621, 1.621, 1.619, 1.617, 1.616, 1.616, + 1.611, 1.613, 1.617, 1.621, 1.622, 1.622, 1.621, 1.619, 1.619, 1.619, 1.621, 1.622, 1.624, 1.624, 1.624, 1.624, 1.625, 1.626, 1.626, 1.624, 1.623, 1.621, 1.621, 1.619, 1.619, 1.619, 1.621, 1.621, 1.621, 1.619, 1.618, 1.617, + 1.613, 1.615, 1.618, 1.621, 1.623, 1.623, 1.622, 1.621, 1.619, 1.619, 1.621, 1.622, 1.625, 1.625, 1.626, 1.626, 1.625, 1.626, 1.626, 1.624, 1.622, 1.621, 1.619, 1.619, 1.619, 1.621, 1.622, 1.622, 1.621, 1.621, 1.619, 1.618, + 1.614, 1.617, 1.621, 1.623, 1.624, 1.624, 1.623, 1.621, 1.621, 1.621, 1.622, 1.625, 1.627, 1.627, 1.628, 1.628, 1.628, 1.628, 1.627, 1.626, 1.623, 1.621, 1.621, 1.621, 1.621, 1.623, 1.623, 1.623, 1.623, 1.621, 1.619, 1.619, + 1.616, 1.617, 1.622, 1.624, 1.625, 1.625, 1.624, 1.623, 1.622, 1.623, 1.624, 1.627, 1.629, 1.631, 1.631, 1.631, 1.631, 1.631, 1.631, 1.628, 1.626, 1.623, 1.622, 1.622, 1.623, 1.623, 1.624, 1.624, 1.624, 1.622, 1.621, 1.621, + 1.617, 1.618, 1.623, 1.625, 1.626, 1.626, 1.625, 1.624, 1.623, 1.624, 1.625, 1.629, 1.631, 1.633, 1.634, 1.634, 1.634, 1.633, 1.633, 1.631, 1.628, 1.624, 1.623, 1.623, 1.623, 1.625, 1.625, 1.625, 1.625, 1.623, 1.622, 1.622, + 1.617, 1.619, 1.623, 1.626, 1.627, 1.627, 1.626, 1.625, 1.624, 1.624, 1.625, 1.628, 1.632, 1.634, 1.635, 1.635, 1.635, 1.634, 1.633, 1.631, 1.627, 1.624, 1.623, 1.623, 1.623, 1.624, 1.625, 1.626, 1.625, 1.624, 1.623, 1.623, + 1.618, 1.619, 1.623, 1.626, 1.627, 1.626, 1.626, 1.625, 1.624, 1.624, 1.625, 1.628, 1.631, 1.634, 1.634, 1.634, 1.634, 1.634, 1.633, 1.631, 1.628, 1.623, 1.622, 1.622, 1.623, 1.624, 1.625, 1.626, 1.626, 1.624, 1.624, 1.623, + 1.618, 1.619, 1.623, 1.626, 1.627, 1.627, 1.625, 1.624, 1.624, 1.624, 1.625, 1.628, 1.632, 1.633, 1.634, 1.634, 1.634, 1.633, 1.633, 1.631, 1.627, 1.623, 1.622, 1.622, 1.623, 1.624, 1.624, 1.625, 1.625, 1.624, 1.623, 1.623, + 1.619, 1.621, 1.623, 1.626, 1.627, 1.627, 1.626, 1.625, 1.624, 1.624, 1.626, 1.628, 1.632, 1.634, 1.635, 1.634, 1.634, 1.633, 1.633, 1.631, 1.628, 1.625, 1.622, 1.622, 1.622, 1.623, 1.624, 1.625, 1.625, 1.624, 1.623, 1.623, + 1.619, 1.621, 1.623, 1.626, 1.627, 1.627, 1.626, 1.625, 1.624, 1.625, 1.627, 1.629, 1.633, 1.635, 1.635, 1.635, 1.635, 1.634, 1.633, 1.631, 1.628, 1.625, 1.623, 1.622, 1.622, 1.623, 1.624, 1.624, 1.624, 1.623, 1.623, 1.622, + 1.619, 1.621, 1.624, 1.626, 1.628, 1.628, 1.627, 1.626, 1.625, 1.626, 1.627, 1.629, 1.633, 1.635, 1.635, 1.635, 1.635, 1.634, 1.633, 1.631, 1.628, 1.625, 1.623, 1.623, 1.623, 1.623, 1.624, 1.624, 1.624, 1.622, 1.622, 1.622, + 1.619, 1.621, 1.623, 1.626, 1.628, 1.628, 1.627, 1.626, 1.625, 1.626, 1.627, 1.629, 1.632, 1.634, 1.635, 1.635, 1.634, 1.634, 1.632, 1.631, 1.628, 1.624, 1.622, 1.622, 1.622, 1.623, 1.624, 1.624, 1.624, 1.622, 1.621, 1.621, + 1.619, 1.621, 1.623, 1.627, 1.628, 1.628, 1.627, 1.627, 1.626, 1.627, 1.628, 1.629, 1.631, 1.633, 1.634, 1.633, 1.633, 1.632, 1.631, 1.631, 1.627, 1.624, 1.622, 1.622, 1.622, 1.622, 1.623, 1.623, 1.623, 1.621, 1.621, 1.621, + 1.621, 1.621, 1.624, 1.627, 1.628, 1.628, 1.627, 1.627, 1.627, 1.627, 1.628, 1.631, 1.632, 1.633, 1.633, 1.632, 1.632, 1.632, 1.631, 1.631, 1.628, 1.625, 1.623, 1.622, 1.622, 1.622, 1.623, 1.623, 1.623, 1.621, 1.621, 1.621, + 1.621, 1.621, 1.623, 1.627, 1.628, 1.628, 1.628, 1.627, 1.627, 1.628, 1.628, 1.629, 1.631, 1.632, 1.633, 1.632, 1.631, 1.631, 1.631, 1.629, 1.628, 1.625, 1.624, 1.623, 1.623, 1.623, 1.623, 1.623, 1.623, 1.621, 1.621, 1.619, + 1.619, 1.621, 1.623, 1.626, 1.628, 1.629, 1.627, 1.627, 1.627, 1.627, 1.628, 1.629, 1.631, 1.631, 1.631, 1.631, 1.631, 1.629, 1.629, 1.628, 1.626, 1.624, 1.623, 1.623, 1.623, 1.622, 1.623, 1.623, 1.622, 1.621, 1.619, 1.619, + 1.618, 1.619, 1.623, 1.625, 1.627, 1.627, 1.627, 1.627, 1.626, 1.627, 1.627, 1.628, 1.628, 1.629, 1.628, 1.628, 1.628, 1.628, 1.628, 1.627, 1.625, 1.623, 1.621, 1.621, 1.621, 1.622, 1.622, 1.622, 1.621, 1.619, 1.618, 1.618, + 1.618, 1.619, 1.622, 1.624, 1.626, 1.626, 1.626, 1.626, 1.626, 1.626, 1.626, 1.626, 1.627, 1.627, 1.627, 1.626, 1.626, 1.626, 1.626, 1.626, 1.624, 1.622, 1.621, 1.621, 1.619, 1.621, 1.621, 1.621, 1.621, 1.618, 1.617, 1.617, + 1.616, 1.618, 1.621, 1.623, 1.624, 1.625, 1.625, 1.625, 1.625, 1.625, 1.626, 1.626, 1.627, 1.627, 1.625, 1.624, 1.624, 1.625, 1.626, 1.625, 1.623, 1.621, 1.619, 1.619, 1.619, 1.619, 1.621, 1.621, 1.619, 1.616, 1.616, 1.616, + 1.615, 1.616, 1.619, 1.621, 1.623, 1.624, 1.625, 1.624, 1.624, 1.625, 1.626, 1.627, 1.627, 1.626, 1.626, 1.625, 1.624, 1.625, 1.625, 1.625, 1.623, 1.621, 1.619, 1.619, 1.619, 1.619, 1.619, 1.619, 1.618, 1.616, 1.615, 1.614, + 1.614, 1.615, 1.616, 1.621, 1.621, 1.623, 1.624, 1.623, 1.624, 1.624, 1.625, 1.627, 1.627, 1.627, 1.626, 1.625, 1.625, 1.625, 1.625, 1.624, 1.622, 1.621, 1.619, 1.618, 1.617, 1.617, 1.617, 1.617, 1.616, 1.613, 1.612, 1.612, + 1.612, 1.612, 1.615, 1.617, 1.621, 1.621, 1.622, 1.622, 1.622, 1.624, 1.625, 1.626, 1.626, 1.626, 1.625, 1.624, 1.624, 1.624, 1.624, 1.623, 1.621, 1.619, 1.618, 1.616, 1.615, 1.615, 1.615, 1.615, 1.613, 1.611, 1.609, 1.609, + 1.611, 1.611, 1.612, 1.615, 1.618, 1.619, 1.621, 1.621, 1.622, 1.623, 1.624, 1.626, 1.626, 1.626, 1.625, 1.624, 1.624, 1.624, 1.623, 1.622, 1.621, 1.618, 1.617, 1.615, 1.615, 1.614, 1.614, 1.613, 1.611, 1.609, 1.609, 1.609, + 1.611, 1.611, 1.612, 1.615, 1.618, 1.619, 1.621, 1.622, 1.623, 1.625, 1.625, 1.627, 1.627, 1.627, 1.626, 1.626, 1.626, 1.626, 1.624, 1.622, 1.621, 1.618, 1.617, 1.617, 1.616, 1.615, 1.614, 1.613, 1.612, 1.609, 1.609, 1.609, + 1.612, 1.612, 1.614, 1.617, 1.619, 1.621, 1.623, 1.624, 1.625, 1.626, 1.627, 1.629, 1.631, 1.629, 1.629, 1.629, 1.628, 1.629, 1.628, 1.626, 1.624, 1.621, 1.621, 1.619, 1.619, 1.618, 1.616, 1.616, 1.613, 1.611, 1.612, 1.612 + ] + } + ], + "luminance_lut": + [ + 2.977, 2.794, 2.572, 2.375, 2.218, 2.098, 1.995, 1.903, 1.815, 1.731, 1.647, 1.571, 1.516, 1.493, 1.483, 1.481, 1.481, 1.481, 1.489, 1.511, 1.571, 1.643, 1.729, 1.813, 1.901, 1.993, 2.091, 2.208, 2.364, 2.563, 2.785, 2.971, + 2.951, 2.736, 2.512, 2.312, 2.153, 2.031, 1.926, 1.824, 1.736, 1.649, 1.571, 1.506, 1.456, 1.419, 1.396, 1.386, 1.386, 1.392, 1.414, 1.451, 1.505, 1.571, 1.648, 1.733, 1.824, 1.922, 2.025, 2.144, 2.301, 2.499, 2.725, 2.939, + 2.883, 2.701, 2.471, 2.266, 2.102, 1.974, 1.861, 1.753, 1.649, 1.571, 1.502, 1.425, 1.361, 1.322, 1.298, 1.286, 1.286, 1.294, 1.317, 1.359, 1.424, 1.501, 1.571, 1.648, 1.751, 1.857, 1.968, 2.095, 2.254, 2.458, 2.688, 2.872, + 2.788, 2.632, 2.408, 2.209, 2.056, 1.931, 1.816, 1.704, 1.598, 1.503, 1.425, 1.361, 1.322, 1.298, 1.269, 1.245, 1.243, 1.264, 1.293, 1.317, 1.359, 1.424, 1.501, 1.596, 1.702, 1.812, 1.924, 2.046, 2.197, 2.392, 2.619, 2.777, + 2.712, 2.541, 2.327, 2.155, 2.023, 1.908, 1.796, 1.684, 1.578, 1.488, 1.412, 1.351, 1.304, 1.269, 1.245, 1.235, 1.235, 1.243, 1.264, 1.301, 1.349, 1.411, 1.485, 1.577, 1.683, 1.791, 1.902, 2.016, 2.143, 2.312, 2.528, 2.702, + 2.678, 2.469, 2.269, 2.117, 1.998, 1.885, 1.773, 1.661, 1.556, 1.469, 1.397, 1.336, 1.277, 1.245, 1.234, 1.226, 1.226, 1.232, 1.244, 1.273, 1.332, 1.392, 1.465, 1.555, 1.659, 1.768, 1.879, 1.991, 2.109, 2.256, 2.454, 2.665, + 2.659, 2.433, 2.232, 2.081, 1.957, 1.841, 1.722, 1.606, 1.499, 1.409, 1.337, 1.277, 1.232, 1.198, 1.175, 1.166, 1.166, 1.172, 1.193, 1.228, 1.272, 1.334, 1.408, 1.499, 1.608, 1.717, 1.834, 1.951, 2.073, 2.222, 2.419, 2.648, + 2.624, 2.411, 2.204, 2.041, 1.909, 1.784, 1.661, 1.539, 1.431, 1.337, 1.277, 1.219, 1.159, 1.118, 1.096, 1.085, 1.085, 1.092, 1.114, 1.156, 1.219, 1.272, 1.337, 1.429, 1.539, 1.658, 1.779, 1.904, 2.033, 2.193, 2.397, 2.613, + 2.564, 2.377, 2.169, 2.012, 1.879, 1.749, 1.623, 1.501, 1.392, 1.299, 1.227, 1.169, 1.125, 1.097, 1.079, 1.063, 1.063, 1.076, 1.093, 1.124, 1.168, 1.227, 1.302, 1.392, 1.501, 1.622, 1.746, 1.875, 2.005, 2.161, 2.362, 2.554, + 2.515, 2.325, 2.138, 1.997, 1.869, 1.742, 1.617, 1.501, 1.392, 1.299, 1.227, 1.169, 1.125, 1.095, 1.079, 1.063, 1.063, 1.076, 1.093, 1.124, 1.168, 1.227, 1.302, 1.392, 1.499, 1.615, 1.741, 1.867, 1.991, 2.132, 2.316, 2.505, + 2.498, 2.289, 2.121, 1.988, 1.867, 1.741, 1.616, 1.499, 1.391, 1.299, 1.227, 1.169, 1.125, 1.095, 1.082, 1.065, 1.064, 1.079, 1.093, 1.124, 1.168, 1.227, 1.302, 1.392, 1.498, 1.614, 1.738, 1.864, 1.985, 2.116, 2.281, 2.486, + 2.498, 2.272, 2.105, 1.971, 1.846, 1.718, 1.592, 1.475, 1.371, 1.279, 1.211, 1.156, 1.112, 1.083, 1.064, 1.055, 1.055, 1.062, 1.081, 1.109, 1.154, 1.212, 1.285, 1.372, 1.473, 1.589, 1.712, 1.843, 1.967, 2.101, 2.263, 2.486, + 2.497, 2.267, 2.088, 1.946, 1.813, 1.679, 1.549, 1.431, 1.324, 1.231, 1.159, 1.114, 1.079, 1.035, 1.008, 1.001, 1.001, 1.008, 1.032, 1.076, 1.111, 1.161, 1.235, 1.324, 1.429, 1.547, 1.677, 1.811, 1.941, 2.082, 2.257, 2.484, + 2.476, 2.262, 2.077, 1.933, 1.802, 1.671, 1.541, 1.421, 1.317, 1.227, 1.157, 1.101, 1.059, 1.027, 1.004, 1.001, 1.001, 1.004, 1.024, 1.054, 1.098, 1.157, 1.229, 1.317, 1.419, 1.537, 1.667, 1.799, 1.931, 2.071, 2.251, 2.463, + 2.455, 2.246, 2.076, 1.933, 1.802, 1.671, 1.541, 1.421, 1.317, 1.227, 1.157, 1.103, 1.064, 1.035, 1.011, 1.003, 1.003, 1.009, 1.032, 1.062, 1.099, 1.157, 1.229, 1.317, 1.419, 1.537, 1.667, 1.799, 1.931, 2.071, 2.236, 2.446, + 2.454, 2.239, 2.077, 1.946, 1.817, 1.686, 1.561, 1.444, 1.342, 1.255, 1.189, 1.136, 1.093, 1.059, 1.039, 1.038, 1.038, 1.039, 1.056, 1.091, 1.131, 1.187, 1.258, 1.341, 1.441, 1.556, 1.683, 1.813, 1.939, 2.071, 2.229, 2.445, + 2.454, 2.239, 2.079, 1.946, 1.817, 1.686, 1.561, 1.444, 1.342, 1.255, 1.189, 1.136, 1.093, 1.062, 1.039, 1.038, 1.038, 1.039, 1.059, 1.091, 1.131, 1.187, 1.258, 1.341, 1.441, 1.556, 1.683, 1.813, 1.939, 2.071, 2.229, 2.445, + 2.458, 2.251, 2.079, 1.941, 1.807, 1.672, 1.543, 1.424, 1.319, 1.231, 1.162, 1.107, 1.065, 1.045, 1.018, 1.003, 1.003, 1.017, 1.044, 1.062, 1.103, 1.159, 1.232, 1.317, 1.419, 1.539, 1.669, 1.802, 1.933, 2.072, 2.239, 2.445, + 2.479, 2.265, 2.085, 1.941, 1.807, 1.672, 1.543, 1.424, 1.319, 1.231, 1.162, 1.107, 1.064, 1.031, 1.017, 1.003, 1.003, 1.017, 1.031, 1.059, 1.103, 1.159, 1.232, 1.317, 1.419, 1.539, 1.669, 1.802, 1.933, 2.076, 2.252, 2.468, + 2.504, 2.277, 2.099, 1.958, 1.826, 1.695, 1.565, 1.445, 1.338, 1.249, 1.181, 1.129, 1.095, 1.051, 1.027, 1.018, 1.018, 1.028, 1.049, 1.092, 1.127, 1.179, 1.252, 1.339, 1.442, 1.561, 1.691, 1.822, 1.949, 2.089, 2.263, 2.492, + 2.509, 2.288, 2.118, 1.982, 1.858, 1.728, 1.604, 1.486, 1.381, 1.293, 1.227, 1.173, 1.127, 1.098, 1.076, 1.067, 1.067, 1.077, 1.097, 1.121, 1.168, 1.225, 1.296, 1.382, 1.483, 1.598, 1.723, 1.852, 1.975, 2.107, 2.274, 2.496, + 2.515, 2.312, 2.139, 2.002, 1.877, 1.751, 1.629, 1.512, 1.405, 1.318, 1.248, 1.193, 1.149, 1.118, 1.096, 1.085, 1.085, 1.095, 1.114, 1.145, 1.188, 1.246, 1.319, 1.405, 1.508, 1.623, 1.747, 1.873, 1.995, 2.127, 2.297, 2.501, + 2.541, 2.351, 2.161, 2.016, 1.888, 1.762, 1.638, 1.519, 1.411, 1.319, 1.251, 1.197, 1.154, 1.121, 1.099, 1.091, 1.091, 1.099, 1.119, 1.148, 1.192, 1.248, 1.321, 1.411, 1.515, 1.633, 1.758, 1.884, 2.009, 2.149, 2.334, 2.526, + 2.588, 2.394, 2.193, 2.036, 1.905, 1.779, 1.656, 1.537, 1.426, 1.329, 1.255, 1.198, 1.161, 1.139, 1.118, 1.096, 1.095, 1.114, 1.138, 1.158, 1.195, 1.256, 1.333, 1.425, 1.533, 1.651, 1.777, 1.902, 2.028, 2.181, 2.378, 2.571, + 2.639, 2.431, 2.226, 2.067, 1.937, 1.816, 1.695, 1.577, 1.467, 1.368, 1.298, 1.253, 1.198, 1.161, 1.139, 1.129, 1.129, 1.138, 1.158, 1.195, 1.245, 1.296, 1.374, 1.468, 1.574, 1.692, 1.812, 1.934, 2.059, 2.216, 2.418, 2.626, + 2.679, 2.465, 2.261, 2.104, 1.979, 1.862, 1.746, 1.631, 1.522, 1.426, 1.352, 1.297, 1.254, 1.221, 1.201, 1.189, 1.189, 1.198, 1.217, 1.246, 1.293, 1.354, 1.433, 1.526, 1.631, 1.744, 1.859, 1.975, 2.097, 2.252, 2.452, 2.667, + 2.711, 2.511, 2.302, 2.141, 2.018, 1.903, 1.791, 1.678, 1.571, 1.475, 1.401, 1.343, 1.297, 1.268, 1.247, 1.236, 1.236, 1.244, 1.263, 1.291, 1.341, 1.403, 1.484, 1.575, 1.679, 1.791, 1.902, 2.012, 2.136, 2.295, 2.501, 2.698, + 2.759, 2.582, 2.363, 2.184, 2.049, 1.935, 1.824, 1.714, 1.608, 1.511, 1.431, 1.371, 1.325, 1.295, 1.271, 1.259, 1.259, 1.266, 1.291, 1.318, 1.369, 1.436, 1.517, 1.611, 1.716, 1.825, 1.933, 2.047, 2.179, 2.351, 2.571, 2.748, + 2.833, 2.662, 2.433, 2.239, 2.089, 1.968, 1.859, 1.752, 1.646, 1.549, 1.468, 1.411, 1.369, 1.325, 1.296, 1.283, 1.283, 1.292, 1.318, 1.366, 1.411, 1.472, 1.555, 1.651, 1.755, 1.861, 1.969, 2.086, 2.231, 2.422, 2.648, 2.821, + 2.909, 2.729, 2.499, 2.298, 2.141, 2.016, 1.907, 1.805, 1.703, 1.611, 1.539, 1.468, 1.411, 1.375, 1.351, 1.339, 1.339, 1.348, 1.372, 1.411, 1.472, 1.543, 1.613, 1.708, 1.807, 1.909, 2.014, 2.135, 2.288, 2.487, 2.716, 2.897, + 2.981, 2.789, 2.563, 2.358, 2.197, 2.071, 1.968, 1.868, 1.774, 1.684, 1.607, 1.541, 1.489, 1.453, 1.428, 1.417, 1.417, 1.427, 1.451, 1.489, 1.543, 1.611, 1.686, 1.776, 1.871, 1.966, 2.069, 2.191, 2.349, 2.551, 2.775, 2.964, + 3.041, 2.856, 2.629, 2.422, 2.252, 2.127, 2.021, 1.927, 1.834, 1.748, 1.672, 1.604, 1.541, 1.495, 1.483, 1.483, 1.483, 1.483, 1.496, 1.543, 1.608, 1.673, 1.749, 1.835, 1.926, 2.019, 2.122, 2.249, 2.411, 2.614, 2.839, 3.026 + ], + "sigma": 0.00163, + "sigma_Cb": 0.0011 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2964, + "ccm": + [ + 1.72129, -0.45961, -0.26169, + -0.30042, 1.56924, -0.26882, + 0.15133, -1.13293, 1.98161 + ] + }, + { + "ct": 3610, + "ccm": + [ + 1.54474, -0.35082, -0.19391, + -0.36989, 1.67926, -0.30936, + -0.00524, -0.55197, 1.55722 + ] + }, + { + "ct": 4640, + "ccm": + [ + 1.52972, -0.35168, -0.17804, + -0.28309, 1.67098, -0.38788, + 0.01695, -0.57209, 1.55515 + ] + }, + { + "ct": 5910, + "ccm": + [ + 1.56879, -0.42159, -0.14719, + -0.27275, 1.59354, -0.32079, + -0.02862, -0.40662, 1.43525 + ] + }, + { + "ct": 7590, + "ccm": + [ + 1.41424, -0.21092, -0.20332, + -0.17646, 1.71734, -0.54087, + 0.01297, -0.63111, 1.61814 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.af": + { + "ranges": + { + "normal": + { + "min": 0.0, + "max": 12.0, + "default": 1.0 + }, + "macro": + { + "min": 3.0, + "max": 15.0, + "default": 4.0 + } + }, + "speeds": + { + "normal": + { + "step_coarse": 1.0, + "step_fine": 0.25, + "contrast_ratio": 0.75, + "pdaf_gain": -0.02, + "pdaf_squelch": 0.125, + "max_slew": 2.0, + "pdaf_frames": 20, + "dropout_frames": 6, + "step_frames": 4 + } + }, + "conf_epsilon": 8, + "conf_thresh": 16, + "conf_clip": 512, + "skip_frames": 5, + "map": [ 0.0, 445, 15.0, 925 ] + } + }, + { + "rpi.cac": + { + "strength": 1.0, + "lut_rx": + [ + -0.21, -0.12, -0.06, -0.04, -0.03, -0.0, 0.02, 0.08, 0.21, + -0.2, -0.12, -0.07, -0.05, -0.01, 0.02, 0.02, 0.06, 0.19, + -0.18, -0.12, -0.09, -0.07, -0.01, 0.03, 0.03, 0.04, 0.13, + -0.15, -0.11, -0.1, -0.09, -0.01, 0.04, 0.04, 0.04, 0.09, + -0.15, -0.11, -0.1, -0.09, -0.02, 0.05, 0.05, 0.05, 0.08, + -0.16, -0.11, -0.08, -0.07, -0.02, 0.05, 0.06, 0.07, 0.1, + -0.18, -0.1, -0.07, -0.05, -0.01, 0.03, 0.05, 0.08, 0.15, + -0.21, -0.11, -0.06, -0.04, -0.01, 0.02, 0.04, 0.09, 0.22, + -0.23, -0.14, -0.05, -0.03, -0.01, 0.01, 0.03, 0.1, 0.23 + ], + "lut_ry": + [ + -0.13, -0.08, -0.06, -0.08, -0.08, -0.06, -0.04, -0.06, -0.08, + -0.09, -0.05, -0.05, -0.09, -0.1, -0.08, -0.05, -0.04, -0.06, + -0.04, -0.05, -0.06, -0.1, -0.13, -0.1, -0.06, -0.04, -0.02, + -0.03, -0.04, -0.06, -0.09, -0.11, -0.1, -0.06, -0.03, 0.01, + -0.01, -0.01, -0.03, -0.03, -0.03, -0.04, -0.03, -0.01, 0.02, + 0.03, 0.01, -0.01, 0.0, 0.01, 0.01, -0.0, 0.01, 0.03, + 0.05, 0.02, 0.01, 0.02, 0.03, 0.02, 0.01, 0.03, 0.07, + 0.08, 0.03, 0.01, 0.01, 0.02, 0.02, 0.02, 0.05, 0.12, + 0.11, 0.07, 0.01, 0.0, -0.0, 0.01, 0.03, 0.07, 0.14 + ], + "lut_bx": + [ + 0.27, 0.13, 0.03, -0.01, -0.01, -0.0, -0.04, -0.11, -0.29, + 0.23, 0.1, 0.02, -0.01, -0.02, -0.01, -0.03, -0.1, -0.28, + 0.22, 0.08, 0.0, -0.01, -0.02, -0.02, -0.02, -0.08, -0.25, + 0.2, 0.08, 0.01, 0.0, -0.01, -0.02, -0.01, -0.07, -0.22, + 0.19, 0.08, 0.01, 0.0, -0.01, -0.02, -0.02, -0.06, -0.21, + 0.2, 0.08, 0.01, 0.0, -0.01, -0.02, -0.02, -0.07, -0.22, + 0.21, 0.09, 0.01, -0.01, -0.02, -0.02, -0.03, -0.09, -0.26, + 0.21, 0.11, 0.02, -0.01, -0.01, -0.02, -0.04, -0.11, -0.28, + 0.23, 0.13, 0.04, -0.01, -0.01, -0.01, -0.06, -0.13, -0.31 + ], + "lut_by": + [ + 0.17, 0.11, 0.07, 0.05, 0.04, 0.05, 0.07, 0.12, 0.19, + 0.11, 0.06, 0.04, 0.04, 0.04, 0.03, 0.04, 0.06, 0.13, + 0.06, 0.03, 0.02, 0.04, 0.05, 0.04, 0.03, 0.03, 0.06, + 0.02, 0.02, 0.03, 0.04, 0.06, 0.05, 0.03, 0.02, 0.01, + -0.0, 0.01, 0.03, 0.04, 0.04, 0.04, 0.02, -0.0, -0.03, + -0.04, -0.01, 0.02, 0.02, 0.02, 0.02, 0.01, -0.02, -0.09, + -0.08, -0.01, 0.04, 0.06, 0.06, 0.05, 0.03, -0.03, -0.14, + -0.1, -0.04, 0.04, 0.08, 0.08, 0.06, 0.02, -0.05, -0.18, + -0.15, -0.08, 0.02, 0.09, 0.11, 0.08, 0.01, -0.09, -0.22 + ] + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx708_noir.json b/src/ipa/rpi/pisp/data/imx708_noir.json new file mode 100644 index 000000000..e69afb0c6 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx708_noir.json @@ -0,0 +1,1233 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 20716, + "reference_gain": 1.12, + "reference_aperture": 1.0, + "reference_lux": 810, + "reference_Y": 13994 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 1.856 + } + }, + { + "rpi.geq": + { + "offset": 221, + "slope": 0.00226 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "bayes": 0 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 1.532, 1.534, 1.535, 1.538, 1.538, 1.533, 1.529, 1.515, 1.506, 1.492, 1.477, 1.465, 1.453, 1.444, 1.437, 1.433, 1.433, 1.435, 1.441, 1.449, 1.461, 1.474, 1.485, 1.499, 1.511, 1.519, 1.525, 1.526, 1.526, 1.523, 1.517, 1.516, + 1.532, 1.534, 1.537, 1.538, 1.537, 1.534, 1.525, 1.515, 1.502, 1.486, 1.474, 1.458, 1.449, 1.438, 1.429, 1.427, 1.426, 1.429, 1.436, 1.444, 1.456, 1.468, 1.483, 1.497, 1.509, 1.518, 1.524, 1.526, 1.526, 1.523, 1.521, 1.516, + 1.532, 1.534, 1.537, 1.538, 1.536, 1.533, 1.524, 1.512, 1.499, 1.483, 1.468, 1.453, 1.439, 1.429, 1.421, 1.419, 1.419, 1.419, 1.427, 1.438, 1.451, 1.464, 1.479, 1.494, 1.506, 1.516, 1.523, 1.526, 1.526, 1.524, 1.521, 1.518, + 1.533, 1.536, 1.537, 1.537, 1.535, 1.532, 1.521, 1.507, 1.491, 1.474, 1.456, 1.441, 1.429, 1.418, 1.409, 1.406, 1.406, 1.408, 1.415, 1.426, 1.439, 1.453, 1.471, 1.485, 1.501, 1.511, 1.522, 1.524, 1.526, 1.525, 1.522, 1.519, + 1.537, 1.538, 1.539, 1.538, 1.534, 1.525, 1.513, 1.495, 1.477, 1.459, 1.443, 1.427, 1.413, 1.402, 1.394, 1.391, 1.391, 1.393, 1.399, 1.409, 1.424, 1.439, 1.455, 1.472, 1.489, 1.503, 1.515, 1.523, 1.526, 1.527, 1.525, 1.523, + 1.538, 1.539, 1.541, 1.539, 1.531, 1.519, 1.503, 1.484, 1.466, 1.445, 1.427, 1.413, 1.401, 1.386, 1.378, 1.373, 1.373, 1.376, 1.386, 1.398, 1.409, 1.424, 1.441, 1.459, 1.477, 1.495, 1.509, 1.519, 1.526, 1.528, 1.528, 1.526, + 1.539, 1.541, 1.541, 1.539, 1.529, 1.516, 1.498, 1.479, 1.456, 1.437, 1.417, 1.401, 1.386, 1.378, 1.369, 1.363, 1.363, 1.367, 1.376, 1.386, 1.399, 1.413, 1.432, 1.451, 1.472, 1.491, 1.507, 1.517, 1.525, 1.527, 1.527, 1.527, + 1.539, 1.539, 1.539, 1.538, 1.529, 1.515, 1.497, 1.476, 1.454, 1.433, 1.411, 1.395, 1.381, 1.368, 1.361, 1.356, 1.356, 1.359, 1.367, 1.379, 1.393, 1.409, 1.428, 1.448, 1.471, 1.489, 1.505, 1.516, 1.524, 1.527, 1.527, 1.527, + 1.539, 1.539, 1.539, 1.537, 1.528, 1.513, 1.493, 1.471, 1.449, 1.426, 1.406, 1.387, 1.373, 1.361, 1.352, 1.348, 1.348, 1.351, 1.359, 1.372, 1.387, 1.403, 1.422, 1.443, 1.465, 1.484, 1.503, 1.516, 1.525, 1.527, 1.528, 1.526, + 1.541, 1.542, 1.539, 1.537, 1.524, 1.506, 1.485, 1.461, 1.438, 1.416, 1.395, 1.377, 1.362, 1.352, 1.344, 1.339, 1.339, 1.342, 1.351, 1.362, 1.376, 1.393, 1.412, 1.434, 1.455, 1.477, 1.495, 1.514, 1.524, 1.528, 1.529, 1.529, + 1.543, 1.544, 1.543, 1.534, 1.518, 1.499, 1.476, 1.452, 1.427, 1.405, 1.386, 1.367, 1.354, 1.344, 1.338, 1.329, 1.329, 1.335, 1.342, 1.352, 1.367, 1.382, 1.402, 1.424, 1.445, 1.469, 1.491, 1.507, 1.522, 1.528, 1.529, 1.532, + 1.544, 1.544, 1.542, 1.534, 1.518, 1.499, 1.474, 1.449, 1.425, 1.401, 1.379, 1.362, 1.348, 1.338, 1.329, 1.324, 1.325, 1.329, 1.335, 1.347, 1.361, 1.378, 1.397, 1.421, 1.443, 1.467, 1.489, 1.507, 1.521, 1.529, 1.532, 1.533, + 1.543, 1.543, 1.541, 1.534, 1.519, 1.499, 1.474, 1.448, 1.424, 1.399, 1.377, 1.359, 1.346, 1.333, 1.324, 1.322, 1.321, 1.324, 1.332, 1.344, 1.359, 1.376, 1.397, 1.419, 1.443, 1.467, 1.489, 1.508, 1.521, 1.528, 1.531, 1.532, + 1.543, 1.542, 1.541, 1.533, 1.519, 1.499, 1.474, 1.448, 1.422, 1.399, 1.376, 1.358, 1.344, 1.331, 1.322, 1.319, 1.319, 1.321, 1.331, 1.342, 1.357, 1.375, 1.396, 1.419, 1.443, 1.467, 1.489, 1.508, 1.521, 1.529, 1.531, 1.532, + 1.543, 1.542, 1.541, 1.532, 1.518, 1.496, 1.471, 1.445, 1.418, 1.393, 1.373, 1.354, 1.341, 1.329, 1.319, 1.317, 1.316, 1.319, 1.327, 1.338, 1.353, 1.371, 1.392, 1.415, 1.439, 1.465, 1.485, 1.507, 1.519, 1.529, 1.531, 1.531, + 1.545, 1.544, 1.542, 1.531, 1.515, 1.493, 1.467, 1.441, 1.414, 1.391, 1.369, 1.351, 1.337, 1.326, 1.318, 1.314, 1.314, 1.317, 1.325, 1.335, 1.351, 1.367, 1.388, 1.411, 1.436, 1.461, 1.483, 1.505, 1.519, 1.531, 1.533, 1.533, + 1.545, 1.544, 1.541, 1.531, 1.515, 1.493, 1.467, 1.441, 1.414, 1.391, 1.369, 1.351, 1.337, 1.326, 1.318, 1.314, 1.314, 1.317, 1.325, 1.335, 1.351, 1.367, 1.388, 1.411, 1.436, 1.461, 1.483, 1.505, 1.521, 1.531, 1.534, 1.534, + 1.545, 1.544, 1.541, 1.534, 1.519, 1.496, 1.471, 1.446, 1.419, 1.392, 1.372, 1.354, 1.338, 1.328, 1.319, 1.316, 1.315, 1.319, 1.327, 1.338, 1.353, 1.371, 1.392, 1.416, 1.441, 1.465, 1.489, 1.511, 1.522, 1.531, 1.534, 1.535, + 1.544, 1.544, 1.542, 1.537, 1.524, 1.501, 1.476, 1.449, 1.424, 1.399, 1.377, 1.359, 1.344, 1.332, 1.324, 1.319, 1.319, 1.323, 1.331, 1.343, 1.358, 1.374, 1.396, 1.419, 1.445, 1.471, 1.493, 1.512, 1.525, 1.532, 1.534, 1.534, + 1.545, 1.545, 1.543, 1.538, 1.524, 1.503, 1.479, 1.452, 1.426, 1.402, 1.381, 1.362, 1.348, 1.337, 1.329, 1.324, 1.324, 1.328, 1.335, 1.347, 1.361, 1.379, 1.399, 1.423, 1.447, 1.471, 1.493, 1.513, 1.526, 1.533, 1.534, 1.535, + 1.546, 1.546, 1.544, 1.539, 1.525, 1.504, 1.479, 1.453, 1.428, 1.404, 1.383, 1.365, 1.352, 1.339, 1.333, 1.329, 1.329, 1.333, 1.339, 1.349, 1.363, 1.381, 1.402, 1.424, 1.448, 1.472, 1.494, 1.514, 1.526, 1.534, 1.534, 1.534, + 1.546, 1.546, 1.544, 1.539, 1.526, 1.505, 1.483, 1.457, 1.432, 1.407, 1.389, 1.371, 1.357, 1.347, 1.339, 1.333, 1.333, 1.339, 1.345, 1.354, 1.368, 1.386, 1.406, 1.428, 1.453, 1.475, 1.496, 1.515, 1.527, 1.535, 1.535, 1.535, + 1.545, 1.545, 1.545, 1.541, 1.529, 1.513, 1.491, 1.467, 1.441, 1.418, 1.399, 1.379, 1.366, 1.355, 1.347, 1.341, 1.341, 1.345, 1.354, 1.364, 1.378, 1.395, 1.415, 1.436, 1.459, 1.483, 1.503, 1.519, 1.531, 1.534, 1.535, 1.534, + 1.544, 1.545, 1.545, 1.544, 1.535, 1.519, 1.499, 1.476, 1.451, 1.428, 1.409, 1.391, 1.377, 1.366, 1.356, 1.352, 1.352, 1.355, 1.364, 1.374, 1.388, 1.405, 1.426, 1.447, 1.469, 1.492, 1.509, 1.523, 1.532, 1.535, 1.535, 1.533, + 1.544, 1.545, 1.546, 1.545, 1.537, 1.523, 1.504, 1.482, 1.458, 1.436, 1.418, 1.401, 1.385, 1.377, 1.367, 1.362, 1.362, 1.365, 1.373, 1.385, 1.398, 1.415, 1.434, 1.455, 1.477, 1.495, 1.514, 1.525, 1.533, 1.536, 1.535, 1.533, + 1.545, 1.546, 1.547, 1.545, 1.538, 1.525, 1.508, 1.486, 1.465, 1.444, 1.424, 1.408, 1.394, 1.385, 1.377, 1.371, 1.371, 1.373, 1.384, 1.392, 1.405, 1.421, 1.441, 1.459, 1.481, 1.499, 1.516, 1.528, 1.534, 1.536, 1.536, 1.533, + 1.544, 1.546, 1.547, 1.547, 1.541, 1.531, 1.514, 1.494, 1.474, 1.454, 1.434, 1.421, 1.408, 1.394, 1.386, 1.382, 1.382, 1.385, 1.392, 1.405, 1.416, 1.432, 1.449, 1.468, 1.488, 1.505, 1.519, 1.531, 1.536, 1.537, 1.536, 1.533, + 1.544, 1.546, 1.548, 1.548, 1.545, 1.536, 1.522, 1.506, 1.486, 1.467, 1.451, 1.434, 1.421, 1.408, 1.401, 1.396, 1.396, 1.399, 1.407, 1.416, 1.431, 1.447, 1.463, 1.481, 1.499, 1.513, 1.526, 1.534, 1.537, 1.537, 1.534, 1.531, + 1.543, 1.545, 1.547, 1.549, 1.549, 1.543, 1.531, 1.517, 1.501, 1.483, 1.465, 1.451, 1.438, 1.425, 1.417, 1.412, 1.412, 1.418, 1.423, 1.433, 1.447, 1.462, 1.479, 1.493, 1.511, 1.524, 1.531, 1.536, 1.538, 1.537, 1.533, 1.531, + 1.542, 1.545, 1.548, 1.551, 1.551, 1.546, 1.539, 1.524, 1.511, 1.493, 1.479, 1.464, 1.451, 1.442, 1.433, 1.429, 1.429, 1.434, 1.439, 1.449, 1.462, 1.474, 1.491, 1.505, 1.519, 1.529, 1.536, 1.539, 1.539, 1.537, 1.533, 1.531, + 1.541, 1.546, 1.549, 1.552, 1.553, 1.551, 1.544, 1.533, 1.521, 1.505, 1.489, 1.477, 1.464, 1.455, 1.447, 1.443, 1.443, 1.446, 1.451, 1.462, 1.472, 1.487, 1.499, 1.514, 1.525, 1.535, 1.541, 1.541, 1.541, 1.539, 1.533, 1.531, + 1.541, 1.546, 1.549, 1.553, 1.554, 1.552, 1.546, 1.537, 1.524, 1.512, 1.499, 1.485, 1.474, 1.464, 1.455, 1.451, 1.451, 1.452, 1.461, 1.469, 1.481, 1.495, 1.506, 1.518, 1.529, 1.539, 1.541, 1.542, 1.541, 1.539, 1.533, 1.529 + ] + }, + { + "ct": 5000, + "table": + [ + 2.586, 2.591, 2.597, 2.601, 2.601, 2.599, 2.592, 2.576, 2.561, 2.541, 2.523, 2.503, 2.486, 2.471, 2.459, 2.452, 2.452, 2.454, 2.462, 2.478, 2.495, 2.512, 2.531, 2.555, 2.568, 2.579, 2.587, 2.588, 2.585, 2.579, 2.573, 2.566, + 2.587, 2.592, 2.598, 2.601, 2.601, 2.599, 2.587, 2.574, 2.556, 2.532, 2.512, 2.491, 2.474, 2.462, 2.449, 2.443, 2.439, 2.443, 2.454, 2.464, 2.485, 2.505, 2.525, 2.548, 2.566, 2.578, 2.585, 2.588, 2.586, 2.579, 2.575, 2.567, + 2.587, 2.593, 2.598, 2.602, 2.601, 2.597, 2.584, 2.569, 2.551, 2.527, 2.503, 2.482, 2.464, 2.448, 2.434, 2.428, 2.427, 2.431, 2.439, 2.455, 2.474, 2.498, 2.521, 2.541, 2.564, 2.577, 2.585, 2.588, 2.589, 2.581, 2.576, 2.569, + 2.593, 2.596, 2.601, 2.603, 2.601, 2.594, 2.583, 2.563, 2.539, 2.514, 2.491, 2.466, 2.445, 2.429, 2.417, 2.409, 2.408, 2.411, 2.421, 2.437, 2.457, 2.481, 2.507, 2.531, 2.555, 2.572, 2.583, 2.588, 2.588, 2.585, 2.579, 2.575, + 2.597, 2.599, 2.604, 2.603, 2.599, 2.587, 2.567, 2.548, 2.522, 2.493, 2.467, 2.443, 2.419, 2.406, 2.391, 2.385, 2.385, 2.387, 2.397, 2.413, 2.435, 2.459, 2.486, 2.509, 2.538, 2.559, 2.574, 2.586, 2.588, 2.586, 2.582, 2.579, + 2.601, 2.603, 2.606, 2.604, 2.596, 2.578, 2.556, 2.531, 2.501, 2.471, 2.444, 2.419, 2.402, 2.381, 2.365, 2.359, 2.359, 2.361, 2.374, 2.396, 2.413, 2.435, 2.465, 2.493, 2.517, 2.542, 2.562, 2.582, 2.588, 2.587, 2.586, 2.584, + 2.601, 2.604, 2.605, 2.604, 2.593, 2.575, 2.547, 2.522, 2.488, 2.458, 2.432, 2.402, 2.381, 2.364, 2.349, 2.338, 2.338, 2.345, 2.359, 2.374, 2.396, 2.423, 2.453, 2.481, 2.511, 2.539, 2.561, 2.581, 2.586, 2.588, 2.588, 2.586, + 2.599, 2.602, 2.604, 2.602, 2.592, 2.572, 2.546, 2.516, 2.485, 2.451, 2.422, 2.393, 2.368, 2.349, 2.336, 2.328, 2.328, 2.333, 2.345, 2.365, 2.389, 2.417, 2.447, 2.478, 2.509, 2.537, 2.561, 2.577, 2.585, 2.588, 2.588, 2.587, + 2.601, 2.602, 2.604, 2.601, 2.589, 2.569, 2.539, 2.509, 2.473, 2.442, 2.409, 2.379, 2.357, 2.336, 2.323, 2.315, 2.315, 2.322, 2.334, 2.354, 2.377, 2.406, 2.436, 2.469, 2.503, 2.529, 2.558, 2.574, 2.585, 2.588, 2.589, 2.587, + 2.601, 2.606, 2.606, 2.601, 2.581, 2.557, 2.525, 2.493, 2.459, 2.426, 2.394, 2.365, 2.339, 2.322, 2.308, 2.301, 2.301, 2.305, 2.322, 2.337, 2.361, 2.389, 2.422, 2.454, 2.485, 2.519, 2.546, 2.568, 2.584, 2.589, 2.589, 2.589, + 2.608, 2.608, 2.606, 2.597, 2.576, 2.548, 2.515, 2.481, 2.444, 2.409, 2.376, 2.346, 2.323, 2.308, 2.293, 2.282, 2.281, 2.291, 2.305, 2.322, 2.348, 2.371, 2.403, 2.439, 2.472, 2.508, 2.538, 2.565, 2.582, 2.589, 2.592, 2.593, + 2.608, 2.608, 2.605, 2.596, 2.575, 2.547, 2.511, 2.474, 2.435, 2.401, 2.366, 2.339, 2.312, 2.293, 2.281, 2.274, 2.274, 2.281, 2.291, 2.311, 2.334, 2.364, 2.399, 2.433, 2.471, 2.506, 2.538, 2.564, 2.581, 2.591, 2.594, 2.595, + 2.605, 2.606, 2.605, 2.595, 2.575, 2.547, 2.511, 2.474, 2.433, 2.397, 2.363, 2.333, 2.309, 2.291, 2.274, 2.267, 2.265, 2.272, 2.284, 2.307, 2.331, 2.361, 2.395, 2.431, 2.469, 2.503, 2.539, 2.567, 2.584, 2.591, 2.595, 2.595, + 2.605, 2.606, 2.605, 2.595, 2.575, 2.547, 2.509, 2.473, 2.431, 2.395, 2.361, 2.332, 2.306, 2.285, 2.267, 2.261, 2.262, 2.265, 2.281, 2.302, 2.329, 2.359, 2.395, 2.429, 2.468, 2.503, 2.539, 2.567, 2.583, 2.593, 2.595, 2.595, + 2.608, 2.607, 2.606, 2.592, 2.572, 2.543, 2.506, 2.468, 2.426, 2.389, 2.354, 2.327, 2.299, 2.279, 2.262, 2.258, 2.257, 2.262, 2.276, 2.297, 2.321, 2.352, 2.387, 2.425, 2.464, 2.498, 2.532, 2.565, 2.582, 2.592, 2.595, 2.596, + 2.611, 2.609, 2.605, 2.592, 2.571, 2.538, 2.499, 2.463, 2.421, 2.384, 2.351, 2.322, 2.295, 2.276, 2.259, 2.254, 2.254, 2.256, 2.273, 2.292, 2.318, 2.347, 2.383, 2.418, 2.456, 2.491, 2.529, 2.562, 2.581, 2.593, 2.597, 2.598, + 2.609, 2.609, 2.606, 2.593, 2.571, 2.538, 2.499, 2.463, 2.421, 2.384, 2.351, 2.321, 2.295, 2.276, 2.259, 2.251, 2.251, 2.256, 2.273, 2.292, 2.318, 2.347, 2.383, 2.418, 2.456, 2.491, 2.529, 2.559, 2.582, 2.595, 2.597, 2.599, + 2.609, 2.609, 2.607, 2.597, 2.576, 2.543, 2.507, 2.467, 2.427, 2.388, 2.356, 2.323, 2.297, 2.278, 2.262, 2.256, 2.255, 2.262, 2.275, 2.296, 2.321, 2.351, 2.388, 2.425, 2.464, 2.502, 2.534, 2.563, 2.586, 2.595, 2.598, 2.599, + 2.609, 2.609, 2.608, 2.601, 2.581, 2.547, 2.513, 2.475, 2.434, 2.398, 2.362, 2.332, 2.307, 2.287, 2.269, 2.263, 2.263, 2.269, 2.281, 2.304, 2.328, 2.358, 2.394, 2.429, 2.469, 2.508, 2.538, 2.568, 2.589, 2.597, 2.598, 2.598, + 2.609, 2.611, 2.609, 2.601, 2.583, 2.549, 2.518, 2.478, 2.439, 2.402, 2.367, 2.337, 2.313, 2.293, 2.279, 2.271, 2.269, 2.277, 2.291, 2.311, 2.336, 2.363, 2.399, 2.435, 2.473, 2.509, 2.541, 2.571, 2.591, 2.598, 2.599, 2.599, + 2.611, 2.611, 2.609, 2.602, 2.585, 2.551, 2.519, 2.481, 2.442, 2.406, 2.374, 2.342, 2.318, 2.297, 2.287, 2.279, 2.278, 2.287, 2.297, 2.315, 2.339, 2.368, 2.402, 2.438, 2.476, 2.511, 2.545, 2.571, 2.591, 2.599, 2.601, 2.599, + 2.611, 2.611, 2.609, 2.604, 2.587, 2.557, 2.521, 2.485, 2.447, 2.412, 2.379, 2.352, 2.328, 2.309, 2.297, 2.288, 2.287, 2.297, 2.308, 2.327, 2.349, 2.377, 2.408, 2.446, 2.481, 2.517, 2.547, 2.573, 2.591, 2.599, 2.601, 2.599, + 2.608, 2.609, 2.609, 2.606, 2.592, 2.564, 2.533, 2.498, 2.462, 2.427, 2.394, 2.364, 2.343, 2.326, 2.309, 2.302, 2.302, 2.308, 2.324, 2.341, 2.362, 2.391, 2.425, 2.458, 2.494, 2.526, 2.555, 2.584, 2.593, 2.599, 2.599, 2.599, + 2.608, 2.609, 2.609, 2.609, 2.597, 2.574, 2.547, 2.511, 2.475, 2.438, 2.411, 2.381, 2.359, 2.342, 2.327, 2.318, 2.318, 2.325, 2.341, 2.358, 2.377, 2.404, 2.439, 2.469, 2.507, 2.537, 2.564, 2.587, 2.596, 2.598, 2.598, 2.597, + 2.609, 2.609, 2.611, 2.609, 2.599, 2.579, 2.551, 2.519, 2.486, 2.453, 2.425, 2.397, 2.375, 2.358, 2.345, 2.336, 2.336, 2.341, 2.355, 2.372, 2.393, 2.419, 2.452, 2.481, 2.516, 2.542, 2.571, 2.591, 2.597, 2.599, 2.598, 2.595, + 2.607, 2.611, 2.613, 2.611, 2.605, 2.586, 2.561, 2.529, 2.495, 2.462, 2.435, 2.409, 2.387, 2.374, 2.359, 2.351, 2.351, 2.356, 2.372, 2.385, 2.406, 2.431, 2.462, 2.488, 2.524, 2.551, 2.573, 2.591, 2.598, 2.599, 2.598, 2.596, + 2.606, 2.609, 2.613, 2.613, 2.607, 2.591, 2.565, 2.539, 2.507, 2.477, 2.449, 2.425, 2.409, 2.387, 2.376, 2.369, 2.369, 2.374, 2.385, 2.406, 2.422, 2.446, 2.473, 2.502, 2.534, 2.557, 2.578, 2.595, 2.599, 2.601, 2.598, 2.595, + 2.606, 2.611, 2.613, 2.614, 2.611, 2.598, 2.581, 2.553, 2.523, 2.496, 2.471, 2.449, 2.425, 2.409, 2.398, 2.391, 2.391, 2.395, 2.408, 2.422, 2.445, 2.468, 2.493, 2.522, 2.549, 2.569, 2.589, 2.601, 2.603, 2.602, 2.596, 2.593, + 2.605, 2.609, 2.613, 2.616, 2.614, 2.607, 2.591, 2.571, 2.545, 2.518, 2.494, 2.471, 2.452, 2.435, 2.423, 2.417, 2.417, 2.421, 2.431, 2.449, 2.467, 2.493, 2.516, 2.542, 2.566, 2.585, 2.596, 2.606, 2.605, 2.602, 2.595, 2.593, + 2.604, 2.608, 2.616, 2.617, 2.618, 2.613, 2.602, 2.584, 2.559, 2.536, 2.514, 2.493, 2.476, 2.459, 2.445, 2.439, 2.439, 2.445, 2.456, 2.471, 2.493, 2.511, 2.534, 2.559, 2.579, 2.592, 2.607, 2.608, 2.607, 2.604, 2.595, 2.592, + 2.603, 2.609, 2.615, 2.619, 2.623, 2.619, 2.608, 2.594, 2.573, 2.551, 2.532, 2.512, 2.493, 2.477, 2.468, 2.462, 2.462, 2.468, 2.476, 2.494, 2.509, 2.528, 2.551, 2.574, 2.589, 2.604, 2.611, 2.611, 2.611, 2.604, 2.598, 2.592, + 2.602, 2.607, 2.613, 2.621, 2.624, 2.621, 2.617, 2.601, 2.585, 2.567, 2.544, 2.521, 2.507, 2.493, 2.478, 2.474, 2.475, 2.477, 2.489, 2.505, 2.523, 2.544, 2.563, 2.584, 2.598, 2.609, 2.612, 2.613, 2.613, 2.608, 2.599, 2.591 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 3.263, 3.263, 3.264, 3.269, 3.274, 3.275, 3.277, 3.281, 3.283, 3.285, 3.289, 3.292, 3.291, 3.291, 3.294, 3.298, 3.302, 3.305, 3.303, 3.301, 3.296, 3.294, 3.293, 3.293, 3.295, 3.295, 3.295, 3.287, 3.285, 3.279, 3.282, 3.285, + 3.259, 3.259, 3.262, 3.268, 3.271, 3.273, 3.273, 3.274, 3.277, 3.278, 3.282, 3.285, 3.286, 3.286, 3.288, 3.289, 3.292, 3.291, 3.293, 3.291, 3.288, 3.288, 3.288, 3.288, 3.288, 3.287, 3.287, 3.283, 3.281, 3.276, 3.277, 3.281, + 3.259, 3.259, 3.262, 3.269, 3.272, 3.274, 3.273, 3.273, 3.273, 3.276, 3.278, 3.279, 3.281, 3.282, 3.283, 3.283, 3.285, 3.286, 3.286, 3.285, 3.283, 3.282, 3.282, 3.286, 3.285, 3.285, 3.285, 3.282, 3.281, 3.276, 3.275, 3.279, + 3.267, 3.266, 3.269, 3.273, 3.274, 3.277, 3.276, 3.275, 3.274, 3.277, 3.277, 3.278, 3.279, 3.279, 3.279, 3.279, 3.281, 3.283, 3.283, 3.281, 3.281, 3.281, 3.282, 3.287, 3.287, 3.288, 3.287, 3.286, 3.283, 3.277, 3.278, 3.281, + 3.268, 3.271, 3.274, 3.277, 3.283, 3.286, 3.284, 3.281, 3.278, 3.278, 3.279, 3.279, 3.281, 3.281, 3.281, 3.281, 3.282, 3.283, 3.284, 3.283, 3.282, 3.282, 3.284, 3.288, 3.289, 3.291, 3.291, 3.288, 3.288, 3.283, 3.286, 3.288, + 3.272, 3.275, 3.279, 3.283, 3.288, 3.289, 3.289, 3.287, 3.282, 3.284, 3.282, 3.284, 3.284, 3.285, 3.284, 3.285, 3.285, 3.288, 3.287, 3.286, 3.283, 3.283, 3.285, 3.289, 3.292, 3.292, 3.293, 3.292, 3.291, 3.288, 3.289, 3.293, + 3.276, 3.278, 3.282, 3.289, 3.293, 3.293, 3.291, 3.289, 3.287, 3.286, 3.285, 3.285, 3.286, 3.286, 3.287, 3.288, 3.289, 3.289, 3.289, 3.288, 3.285, 3.283, 3.286, 3.289, 3.292, 3.294, 3.294, 3.294, 3.293, 3.289, 3.292, 3.293, + 3.279, 3.281, 3.286, 3.293, 3.297, 3.298, 3.295, 3.292, 3.288, 3.287, 3.285, 3.287, 3.288, 3.288, 3.289, 3.291, 3.292, 3.293, 3.291, 3.288, 3.286, 3.285, 3.285, 3.291, 3.294, 3.295, 3.297, 3.297, 3.298, 3.293, 3.294, 3.294, + 3.281, 3.286, 3.291, 3.298, 3.301, 3.301, 3.299, 3.295, 3.289, 3.288, 3.286, 3.288, 3.289, 3.292, 3.293, 3.292, 3.295, 3.296, 3.295, 3.291, 3.287, 3.286, 3.286, 3.289, 3.295, 3.297, 3.298, 3.301, 3.301, 3.298, 3.297, 3.297, + 3.284, 3.289, 3.295, 3.302, 3.303, 3.303, 3.301, 3.298, 3.294, 3.292, 3.289, 3.293, 3.296, 3.297, 3.297, 3.297, 3.297, 3.298, 3.298, 3.296, 3.289, 3.288, 3.287, 3.294, 3.298, 3.301, 3.304, 3.305, 3.304, 3.299, 3.299, 3.302, + 3.291, 3.292, 3.299, 3.305, 3.308, 3.305, 3.304, 3.302, 3.298, 3.295, 3.295, 3.298, 3.299, 3.302, 3.303, 3.302, 3.301, 3.301, 3.301, 3.299, 3.296, 3.291, 3.292, 3.297, 3.301, 3.304, 3.306, 3.309, 3.308, 3.302, 3.301, 3.304, + 3.292, 3.297, 3.303, 3.309, 3.312, 3.311, 3.308, 3.304, 3.301, 3.299, 3.298, 3.299, 3.303, 3.305, 3.306, 3.305, 3.305, 3.303, 3.303, 3.301, 3.299, 3.294, 3.294, 3.297, 3.302, 3.305, 3.309, 3.311, 3.311, 3.305, 3.305, 3.306, + 3.295, 3.298, 3.305, 3.309, 3.313, 3.313, 3.312, 3.307, 3.303, 3.301, 3.299, 3.301, 3.304, 3.307, 3.308, 3.306, 3.306, 3.306, 3.306, 3.302, 3.299, 3.296, 3.295, 3.298, 3.303, 3.306, 3.311, 3.312, 3.312, 3.307, 3.308, 3.309, + 3.297, 3.298, 3.303, 3.309, 3.313, 3.313, 3.311, 3.307, 3.303, 3.301, 3.299, 3.299, 3.305, 3.307, 3.307, 3.306, 3.306, 3.306, 3.305, 3.299, 3.297, 3.294, 3.294, 3.298, 3.303, 3.305, 3.311, 3.312, 3.313, 3.308, 3.311, 3.309, + 3.297, 3.298, 3.304, 3.309, 3.312, 3.313, 3.311, 3.308, 3.304, 3.302, 3.301, 3.301, 3.306, 3.307, 3.308, 3.306, 3.306, 3.307, 3.306, 3.302, 3.297, 3.294, 3.294, 3.299, 3.305, 3.306, 3.309, 3.312, 3.311, 3.306, 3.308, 3.309, + 3.298, 3.299, 3.306, 3.311, 3.315, 3.314, 3.311, 3.308, 3.305, 3.303, 3.303, 3.304, 3.307, 3.309, 3.309, 3.308, 3.308, 3.307, 3.306, 3.302, 3.298, 3.296, 3.296, 3.298, 3.304, 3.306, 3.308, 3.309, 3.314, 3.308, 3.309, 3.308, + 3.299, 3.301, 3.307, 3.313, 3.316, 3.316, 3.313, 3.311, 3.307, 3.305, 3.305, 3.307, 3.309, 3.311, 3.312, 3.311, 3.309, 3.309, 3.308, 3.306, 3.301, 3.298, 3.297, 3.301, 3.305, 3.309, 3.309, 3.311, 3.313, 3.306, 3.308, 3.307, + 3.301, 3.301, 3.307, 3.314, 3.317, 3.318, 3.314, 3.311, 3.308, 3.306, 3.306, 3.308, 3.311, 3.311, 3.312, 3.311, 3.309, 3.309, 3.309, 3.306, 3.302, 3.298, 3.298, 3.301, 3.305, 3.309, 3.311, 3.311, 3.312, 3.309, 3.308, 3.308, + 3.301, 3.302, 3.307, 3.316, 3.319, 3.319, 3.315, 3.312, 3.309, 3.306, 3.307, 3.309, 3.311, 3.312, 3.311, 3.311, 3.309, 3.309, 3.309, 3.306, 3.303, 3.299, 3.298, 3.302, 3.305, 3.308, 3.309, 3.309, 3.309, 3.303, 3.306, 3.307, + 3.301, 3.303, 3.308, 3.315, 3.318, 3.318, 3.316, 3.313, 3.311, 3.307, 3.307, 3.308, 3.311, 3.311, 3.311, 3.308, 3.308, 3.307, 3.307, 3.306, 3.303, 3.299, 3.297, 3.301, 3.303, 3.306, 3.309, 3.308, 3.306, 3.303, 3.304, 3.306, + 3.302, 3.304, 3.306, 3.316, 3.318, 3.318, 3.317, 3.315, 3.311, 3.308, 3.309, 3.311, 3.311, 3.312, 3.311, 3.307, 3.306, 3.307, 3.308, 3.307, 3.304, 3.299, 3.298, 3.301, 3.303, 3.305, 3.306, 3.305, 3.304, 3.302, 3.303, 3.306, + 3.302, 3.304, 3.306, 3.312, 3.316, 3.317, 3.317, 3.313, 3.311, 3.309, 3.309, 3.311, 3.311, 3.312, 3.309, 3.307, 3.306, 3.306, 3.308, 3.307, 3.304, 3.298, 3.297, 3.302, 3.304, 3.305, 3.306, 3.305, 3.304, 3.299, 3.302, 3.303, + 3.299, 3.299, 3.306, 3.309, 3.315, 3.316, 3.316, 3.312, 3.309, 3.308, 3.308, 3.309, 3.311, 3.311, 3.307, 3.305, 3.305, 3.305, 3.306, 3.304, 3.299, 3.297, 3.296, 3.301, 3.302, 3.304, 3.303, 3.302, 3.301, 3.298, 3.299, 3.301, + 3.295, 3.297, 3.305, 3.309, 3.311, 3.311, 3.311, 3.309, 3.307, 3.306, 3.305, 3.305, 3.305, 3.305, 3.304, 3.301, 3.301, 3.301, 3.302, 3.299, 3.296, 3.295, 3.295, 3.298, 3.301, 3.302, 3.303, 3.301, 3.299, 3.295, 3.297, 3.299, + 3.294, 3.296, 3.299, 3.306, 3.308, 3.309, 3.309, 3.307, 3.307, 3.303, 3.302, 3.301, 3.302, 3.303, 3.302, 3.299, 3.298, 3.299, 3.299, 3.298, 3.295, 3.292, 3.292, 3.293, 3.297, 3.299, 3.299, 3.299, 3.297, 3.294, 3.295, 3.299, + 3.291, 3.292, 3.296, 3.302, 3.306, 3.306, 3.307, 3.306, 3.305, 3.303, 3.302, 3.301, 3.301, 3.303, 3.301, 3.299, 3.298, 3.298, 3.298, 3.297, 3.295, 3.292, 3.291, 3.291, 3.295, 3.295, 3.297, 3.298, 3.296, 3.293, 3.292, 3.291, + 3.293, 3.292, 3.294, 3.301, 3.303, 3.305, 3.308, 3.306, 3.306, 3.304, 3.304, 3.303, 3.303, 3.303, 3.302, 3.301, 3.299, 3.299, 3.299, 3.299, 3.294, 3.291, 3.289, 3.291, 3.293, 3.294, 3.294, 3.294, 3.294, 3.289, 3.291, 3.291, + 3.288, 3.289, 3.291, 3.299, 3.303, 3.304, 3.304, 3.304, 3.304, 3.303, 3.303, 3.304, 3.306, 3.305, 3.303, 3.301, 3.301, 3.298, 3.299, 3.298, 3.293, 3.291, 3.289, 3.291, 3.291, 3.292, 3.291, 3.291, 3.291, 3.285, 3.288, 3.291, + 3.285, 3.284, 3.287, 3.291, 3.299, 3.299, 3.299, 3.299, 3.299, 3.301, 3.302, 3.303, 3.303, 3.302, 3.299, 3.298, 3.298, 3.298, 3.298, 3.293, 3.288, 3.286, 3.285, 3.288, 3.288, 3.288, 3.287, 3.285, 3.284, 3.279, 3.281, 3.284, + 3.281, 3.282, 3.282, 3.286, 3.291, 3.294, 3.294, 3.295, 3.295, 3.299, 3.301, 3.304, 3.305, 3.299, 3.299, 3.297, 3.298, 3.298, 3.297, 3.292, 3.288, 3.285, 3.283, 3.284, 3.284, 3.286, 3.284, 3.282, 3.279, 3.275, 3.275, 3.278, + 3.282, 3.282, 3.284, 3.286, 3.291, 3.294, 3.295, 3.295, 3.298, 3.301, 3.304, 3.306, 3.306, 3.304, 3.303, 3.301, 3.302, 3.299, 3.299, 3.295, 3.289, 3.287, 3.284, 3.288, 3.287, 3.287, 3.285, 3.283, 3.282, 3.278, 3.281, 3.286, + 3.292, 3.291, 3.292, 3.298, 3.307, 3.309, 3.308, 3.312, 3.313, 3.317, 3.324, 3.327, 3.327, 3.325, 3.326, 3.322, 3.319, 3.317, 3.317, 3.315, 3.312, 3.305, 3.303, 3.301, 3.299, 3.297, 3.299, 3.293, 3.289, 3.285, 3.287, 3.293 + ] + }, + { + "ct": 5000, + "table": + [ + 1.602, 1.603, 1.605, 1.608, 1.611, 1.612, 1.612, 1.614, 1.615, 1.616, 1.619, 1.621, 1.621, 1.622, 1.622, 1.624, 1.624, 1.626, 1.625, 1.625, 1.623, 1.622, 1.621, 1.619, 1.618, 1.617, 1.616, 1.614, 1.612, 1.609, 1.609, 1.611, + 1.601, 1.602, 1.605, 1.608, 1.611, 1.612, 1.612, 1.613, 1.614, 1.615, 1.617, 1.619, 1.621, 1.621, 1.621, 1.621, 1.622, 1.624, 1.624, 1.624, 1.622, 1.621, 1.619, 1.618, 1.617, 1.616, 1.615, 1.614, 1.612, 1.609, 1.609, 1.609, + 1.602, 1.603, 1.605, 1.609, 1.611, 1.613, 1.613, 1.613, 1.613, 1.615, 1.616, 1.618, 1.618, 1.619, 1.619, 1.619, 1.621, 1.621, 1.622, 1.622, 1.619, 1.618, 1.617, 1.617, 1.616, 1.615, 1.615, 1.615, 1.612, 1.609, 1.609, 1.609, + 1.604, 1.605, 1.608, 1.612, 1.613, 1.614, 1.614, 1.614, 1.614, 1.614, 1.616, 1.617, 1.618, 1.618, 1.618, 1.619, 1.619, 1.621, 1.622, 1.621, 1.619, 1.618, 1.617, 1.616, 1.616, 1.616, 1.616, 1.615, 1.615, 1.612, 1.611, 1.611, + 1.606, 1.608, 1.611, 1.614, 1.615, 1.615, 1.616, 1.616, 1.615, 1.615, 1.617, 1.618, 1.619, 1.619, 1.618, 1.619, 1.621, 1.622, 1.623, 1.622, 1.619, 1.619, 1.617, 1.617, 1.617, 1.618, 1.618, 1.617, 1.617, 1.614, 1.613, 1.613, + 1.608, 1.611, 1.614, 1.617, 1.618, 1.618, 1.618, 1.618, 1.618, 1.618, 1.619, 1.621, 1.621, 1.621, 1.621, 1.621, 1.622, 1.623, 1.624, 1.623, 1.622, 1.619, 1.619, 1.618, 1.618, 1.618, 1.618, 1.618, 1.618, 1.617, 1.615, 1.614, + 1.611, 1.613, 1.616, 1.618, 1.621, 1.621, 1.619, 1.619, 1.619, 1.619, 1.619, 1.621, 1.622, 1.623, 1.623, 1.623, 1.623, 1.624, 1.626, 1.624, 1.623, 1.621, 1.619, 1.619, 1.619, 1.619, 1.621, 1.621, 1.619, 1.617, 1.616, 1.616, + 1.611, 1.613, 1.617, 1.621, 1.622, 1.622, 1.621, 1.619, 1.619, 1.619, 1.621, 1.622, 1.624, 1.624, 1.624, 1.624, 1.625, 1.626, 1.626, 1.624, 1.623, 1.621, 1.621, 1.619, 1.619, 1.619, 1.621, 1.621, 1.621, 1.619, 1.618, 1.617, + 1.613, 1.615, 1.618, 1.621, 1.623, 1.623, 1.622, 1.621, 1.619, 1.619, 1.621, 1.622, 1.625, 1.625, 1.626, 1.626, 1.625, 1.626, 1.626, 1.624, 1.622, 1.621, 1.619, 1.619, 1.619, 1.621, 1.622, 1.622, 1.621, 1.621, 1.619, 1.618, + 1.614, 1.617, 1.621, 1.623, 1.624, 1.624, 1.623, 1.621, 1.621, 1.621, 1.622, 1.625, 1.627, 1.627, 1.628, 1.628, 1.628, 1.628, 1.627, 1.626, 1.623, 1.621, 1.621, 1.621, 1.621, 1.623, 1.623, 1.623, 1.623, 1.621, 1.619, 1.619, + 1.616, 1.617, 1.622, 1.624, 1.625, 1.625, 1.624, 1.623, 1.622, 1.623, 1.624, 1.627, 1.629, 1.631, 1.631, 1.631, 1.631, 1.631, 1.631, 1.628, 1.626, 1.623, 1.622, 1.622, 1.623, 1.623, 1.624, 1.624, 1.624, 1.622, 1.621, 1.621, + 1.617, 1.618, 1.623, 1.625, 1.626, 1.626, 1.625, 1.624, 1.623, 1.624, 1.625, 1.629, 1.631, 1.633, 1.634, 1.634, 1.634, 1.633, 1.633, 1.631, 1.628, 1.624, 1.623, 1.623, 1.623, 1.625, 1.625, 1.625, 1.625, 1.623, 1.622, 1.622, + 1.617, 1.619, 1.623, 1.626, 1.627, 1.627, 1.626, 1.625, 1.624, 1.624, 1.625, 1.628, 1.632, 1.634, 1.635, 1.635, 1.635, 1.634, 1.633, 1.631, 1.627, 1.624, 1.623, 1.623, 1.623, 1.624, 1.625, 1.626, 1.625, 1.624, 1.623, 1.623, + 1.618, 1.619, 1.623, 1.626, 1.627, 1.626, 1.626, 1.625, 1.624, 1.624, 1.625, 1.628, 1.631, 1.634, 1.634, 1.634, 1.634, 1.634, 1.633, 1.631, 1.628, 1.623, 1.622, 1.622, 1.623, 1.624, 1.625, 1.626, 1.626, 1.624, 1.624, 1.623, + 1.618, 1.619, 1.623, 1.626, 1.627, 1.627, 1.625, 1.624, 1.624, 1.624, 1.625, 1.628, 1.632, 1.633, 1.634, 1.634, 1.634, 1.633, 1.633, 1.631, 1.627, 1.623, 1.622, 1.622, 1.623, 1.624, 1.624, 1.625, 1.625, 1.624, 1.623, 1.623, + 1.619, 1.621, 1.623, 1.626, 1.627, 1.627, 1.626, 1.625, 1.624, 1.624, 1.626, 1.628, 1.632, 1.634, 1.635, 1.634, 1.634, 1.633, 1.633, 1.631, 1.628, 1.625, 1.622, 1.622, 1.622, 1.623, 1.624, 1.625, 1.625, 1.624, 1.623, 1.623, + 1.619, 1.621, 1.623, 1.626, 1.627, 1.627, 1.626, 1.625, 1.624, 1.625, 1.627, 1.629, 1.633, 1.635, 1.635, 1.635, 1.635, 1.634, 1.633, 1.631, 1.628, 1.625, 1.623, 1.622, 1.622, 1.623, 1.624, 1.624, 1.624, 1.623, 1.623, 1.622, + 1.619, 1.621, 1.624, 1.626, 1.628, 1.628, 1.627, 1.626, 1.625, 1.626, 1.627, 1.629, 1.633, 1.635, 1.635, 1.635, 1.635, 1.634, 1.633, 1.631, 1.628, 1.625, 1.623, 1.623, 1.623, 1.623, 1.624, 1.624, 1.624, 1.622, 1.622, 1.622, + 1.619, 1.621, 1.623, 1.626, 1.628, 1.628, 1.627, 1.626, 1.625, 1.626, 1.627, 1.629, 1.632, 1.634, 1.635, 1.635, 1.634, 1.634, 1.632, 1.631, 1.628, 1.624, 1.622, 1.622, 1.622, 1.623, 1.624, 1.624, 1.624, 1.622, 1.621, 1.621, + 1.619, 1.621, 1.623, 1.627, 1.628, 1.628, 1.627, 1.627, 1.626, 1.627, 1.628, 1.629, 1.631, 1.633, 1.634, 1.633, 1.633, 1.632, 1.631, 1.631, 1.627, 1.624, 1.622, 1.622, 1.622, 1.622, 1.623, 1.623, 1.623, 1.621, 1.621, 1.621, + 1.621, 1.621, 1.624, 1.627, 1.628, 1.628, 1.627, 1.627, 1.627, 1.627, 1.628, 1.631, 1.632, 1.633, 1.633, 1.632, 1.632, 1.632, 1.631, 1.631, 1.628, 1.625, 1.623, 1.622, 1.622, 1.622, 1.623, 1.623, 1.623, 1.621, 1.621, 1.621, + 1.621, 1.621, 1.623, 1.627, 1.628, 1.628, 1.628, 1.627, 1.627, 1.628, 1.628, 1.629, 1.631, 1.632, 1.633, 1.632, 1.631, 1.631, 1.631, 1.629, 1.628, 1.625, 1.624, 1.623, 1.623, 1.623, 1.623, 1.623, 1.623, 1.621, 1.621, 1.619, + 1.619, 1.621, 1.623, 1.626, 1.628, 1.629, 1.627, 1.627, 1.627, 1.627, 1.628, 1.629, 1.631, 1.631, 1.631, 1.631, 1.631, 1.629, 1.629, 1.628, 1.626, 1.624, 1.623, 1.623, 1.623, 1.622, 1.623, 1.623, 1.622, 1.621, 1.619, 1.619, + 1.618, 1.619, 1.623, 1.625, 1.627, 1.627, 1.627, 1.627, 1.626, 1.627, 1.627, 1.628, 1.628, 1.629, 1.628, 1.628, 1.628, 1.628, 1.628, 1.627, 1.625, 1.623, 1.621, 1.621, 1.621, 1.622, 1.622, 1.622, 1.621, 1.619, 1.618, 1.618, + 1.618, 1.619, 1.622, 1.624, 1.626, 1.626, 1.626, 1.626, 1.626, 1.626, 1.626, 1.626, 1.627, 1.627, 1.627, 1.626, 1.626, 1.626, 1.626, 1.626, 1.624, 1.622, 1.621, 1.621, 1.619, 1.621, 1.621, 1.621, 1.621, 1.618, 1.617, 1.617, + 1.616, 1.618, 1.621, 1.623, 1.624, 1.625, 1.625, 1.625, 1.625, 1.625, 1.626, 1.626, 1.627, 1.627, 1.625, 1.624, 1.624, 1.625, 1.626, 1.625, 1.623, 1.621, 1.619, 1.619, 1.619, 1.619, 1.621, 1.621, 1.619, 1.616, 1.616, 1.616, + 1.615, 1.616, 1.619, 1.621, 1.623, 1.624, 1.625, 1.624, 1.624, 1.625, 1.626, 1.627, 1.627, 1.626, 1.626, 1.625, 1.624, 1.625, 1.625, 1.625, 1.623, 1.621, 1.619, 1.619, 1.619, 1.619, 1.619, 1.619, 1.618, 1.616, 1.615, 1.614, + 1.614, 1.615, 1.616, 1.621, 1.621, 1.623, 1.624, 1.623, 1.624, 1.624, 1.625, 1.627, 1.627, 1.627, 1.626, 1.625, 1.625, 1.625, 1.625, 1.624, 1.622, 1.621, 1.619, 1.618, 1.617, 1.617, 1.617, 1.617, 1.616, 1.613, 1.612, 1.612, + 1.612, 1.612, 1.615, 1.617, 1.621, 1.621, 1.622, 1.622, 1.622, 1.624, 1.625, 1.626, 1.626, 1.626, 1.625, 1.624, 1.624, 1.624, 1.624, 1.623, 1.621, 1.619, 1.618, 1.616, 1.615, 1.615, 1.615, 1.615, 1.613, 1.611, 1.609, 1.609, + 1.611, 1.611, 1.612, 1.615, 1.618, 1.619, 1.621, 1.621, 1.622, 1.623, 1.624, 1.626, 1.626, 1.626, 1.625, 1.624, 1.624, 1.624, 1.623, 1.622, 1.621, 1.618, 1.617, 1.615, 1.615, 1.614, 1.614, 1.613, 1.611, 1.609, 1.609, 1.609, + 1.611, 1.611, 1.612, 1.615, 1.618, 1.619, 1.621, 1.622, 1.623, 1.625, 1.625, 1.627, 1.627, 1.627, 1.626, 1.626, 1.626, 1.626, 1.624, 1.622, 1.621, 1.618, 1.617, 1.617, 1.616, 1.615, 1.614, 1.613, 1.612, 1.609, 1.609, 1.609, + 1.612, 1.612, 1.614, 1.617, 1.619, 1.621, 1.623, 1.624, 1.625, 1.626, 1.627, 1.629, 1.631, 1.629, 1.629, 1.629, 1.628, 1.629, 1.628, 1.626, 1.624, 1.621, 1.621, 1.619, 1.619, 1.618, 1.616, 1.616, 1.613, 1.611, 1.612, 1.612 + ] + } + ], + "luminance_lut": + [ + 2.977, 2.794, 2.572, 2.375, 2.218, 2.098, 1.995, 1.903, 1.815, 1.731, 1.647, 1.571, 1.516, 1.493, 1.483, 1.481, 1.481, 1.481, 1.489, 1.511, 1.571, 1.643, 1.729, 1.813, 1.901, 1.993, 2.091, 2.208, 2.364, 2.563, 2.785, 2.971, + 2.951, 2.736, 2.512, 2.312, 2.153, 2.031, 1.926, 1.824, 1.736, 1.649, 1.571, 1.506, 1.456, 1.419, 1.396, 1.386, 1.386, 1.392, 1.414, 1.451, 1.505, 1.571, 1.648, 1.733, 1.824, 1.922, 2.025, 2.144, 2.301, 2.499, 2.725, 2.939, + 2.883, 2.701, 2.471, 2.266, 2.102, 1.974, 1.861, 1.753, 1.649, 1.571, 1.502, 1.425, 1.361, 1.322, 1.298, 1.286, 1.286, 1.294, 1.317, 1.359, 1.424, 1.501, 1.571, 1.648, 1.751, 1.857, 1.968, 2.095, 2.254, 2.458, 2.688, 2.872, + 2.788, 2.632, 2.408, 2.209, 2.056, 1.931, 1.816, 1.704, 1.598, 1.503, 1.425, 1.361, 1.322, 1.298, 1.269, 1.245, 1.243, 1.264, 1.293, 1.317, 1.359, 1.424, 1.501, 1.596, 1.702, 1.812, 1.924, 2.046, 2.197, 2.392, 2.619, 2.777, + 2.712, 2.541, 2.327, 2.155, 2.023, 1.908, 1.796, 1.684, 1.578, 1.488, 1.412, 1.351, 1.304, 1.269, 1.245, 1.235, 1.235, 1.243, 1.264, 1.301, 1.349, 1.411, 1.485, 1.577, 1.683, 1.791, 1.902, 2.016, 2.143, 2.312, 2.528, 2.702, + 2.678, 2.469, 2.269, 2.117, 1.998, 1.885, 1.773, 1.661, 1.556, 1.469, 1.397, 1.336, 1.277, 1.245, 1.234, 1.226, 1.226, 1.232, 1.244, 1.273, 1.332, 1.392, 1.465, 1.555, 1.659, 1.768, 1.879, 1.991, 2.109, 2.256, 2.454, 2.665, + 2.659, 2.433, 2.232, 2.081, 1.957, 1.841, 1.722, 1.606, 1.499, 1.409, 1.337, 1.277, 1.232, 1.198, 1.175, 1.166, 1.166, 1.172, 1.193, 1.228, 1.272, 1.334, 1.408, 1.499, 1.608, 1.717, 1.834, 1.951, 2.073, 2.222, 2.419, 2.648, + 2.624, 2.411, 2.204, 2.041, 1.909, 1.784, 1.661, 1.539, 1.431, 1.337, 1.277, 1.219, 1.159, 1.118, 1.096, 1.085, 1.085, 1.092, 1.114, 1.156, 1.219, 1.272, 1.337, 1.429, 1.539, 1.658, 1.779, 1.904, 2.033, 2.193, 2.397, 2.613, + 2.564, 2.377, 2.169, 2.012, 1.879, 1.749, 1.623, 1.501, 1.392, 1.299, 1.227, 1.169, 1.125, 1.097, 1.079, 1.063, 1.063, 1.076, 1.093, 1.124, 1.168, 1.227, 1.302, 1.392, 1.501, 1.622, 1.746, 1.875, 2.005, 2.161, 2.362, 2.554, + 2.515, 2.325, 2.138, 1.997, 1.869, 1.742, 1.617, 1.501, 1.392, 1.299, 1.227, 1.169, 1.125, 1.095, 1.079, 1.063, 1.063, 1.076, 1.093, 1.124, 1.168, 1.227, 1.302, 1.392, 1.499, 1.615, 1.741, 1.867, 1.991, 2.132, 2.316, 2.505, + 2.498, 2.289, 2.121, 1.988, 1.867, 1.741, 1.616, 1.499, 1.391, 1.299, 1.227, 1.169, 1.125, 1.095, 1.082, 1.065, 1.064, 1.079, 1.093, 1.124, 1.168, 1.227, 1.302, 1.392, 1.498, 1.614, 1.738, 1.864, 1.985, 2.116, 2.281, 2.486, + 2.498, 2.272, 2.105, 1.971, 1.846, 1.718, 1.592, 1.475, 1.371, 1.279, 1.211, 1.156, 1.112, 1.083, 1.064, 1.055, 1.055, 1.062, 1.081, 1.109, 1.154, 1.212, 1.285, 1.372, 1.473, 1.589, 1.712, 1.843, 1.967, 2.101, 2.263, 2.486, + 2.497, 2.267, 2.088, 1.946, 1.813, 1.679, 1.549, 1.431, 1.324, 1.231, 1.159, 1.114, 1.079, 1.035, 1.008, 1.001, 1.001, 1.008, 1.032, 1.076, 1.111, 1.161, 1.235, 1.324, 1.429, 1.547, 1.677, 1.811, 1.941, 2.082, 2.257, 2.484, + 2.476, 2.262, 2.077, 1.933, 1.802, 1.671, 1.541, 1.421, 1.317, 1.227, 1.157, 1.101, 1.059, 1.027, 1.004, 1.001, 1.001, 1.004, 1.024, 1.054, 1.098, 1.157, 1.229, 1.317, 1.419, 1.537, 1.667, 1.799, 1.931, 2.071, 2.251, 2.463, + 2.455, 2.246, 2.076, 1.933, 1.802, 1.671, 1.541, 1.421, 1.317, 1.227, 1.157, 1.103, 1.064, 1.035, 1.011, 1.003, 1.003, 1.009, 1.032, 1.062, 1.099, 1.157, 1.229, 1.317, 1.419, 1.537, 1.667, 1.799, 1.931, 2.071, 2.236, 2.446, + 2.454, 2.239, 2.077, 1.946, 1.817, 1.686, 1.561, 1.444, 1.342, 1.255, 1.189, 1.136, 1.093, 1.059, 1.039, 1.038, 1.038, 1.039, 1.056, 1.091, 1.131, 1.187, 1.258, 1.341, 1.441, 1.556, 1.683, 1.813, 1.939, 2.071, 2.229, 2.445, + 2.454, 2.239, 2.079, 1.946, 1.817, 1.686, 1.561, 1.444, 1.342, 1.255, 1.189, 1.136, 1.093, 1.062, 1.039, 1.038, 1.038, 1.039, 1.059, 1.091, 1.131, 1.187, 1.258, 1.341, 1.441, 1.556, 1.683, 1.813, 1.939, 2.071, 2.229, 2.445, + 2.458, 2.251, 2.079, 1.941, 1.807, 1.672, 1.543, 1.424, 1.319, 1.231, 1.162, 1.107, 1.065, 1.045, 1.018, 1.003, 1.003, 1.017, 1.044, 1.062, 1.103, 1.159, 1.232, 1.317, 1.419, 1.539, 1.669, 1.802, 1.933, 2.072, 2.239, 2.445, + 2.479, 2.265, 2.085, 1.941, 1.807, 1.672, 1.543, 1.424, 1.319, 1.231, 1.162, 1.107, 1.064, 1.031, 1.017, 1.003, 1.003, 1.017, 1.031, 1.059, 1.103, 1.159, 1.232, 1.317, 1.419, 1.539, 1.669, 1.802, 1.933, 2.076, 2.252, 2.468, + 2.504, 2.277, 2.099, 1.958, 1.826, 1.695, 1.565, 1.445, 1.338, 1.249, 1.181, 1.129, 1.095, 1.051, 1.027, 1.018, 1.018, 1.028, 1.049, 1.092, 1.127, 1.179, 1.252, 1.339, 1.442, 1.561, 1.691, 1.822, 1.949, 2.089, 2.263, 2.492, + 2.509, 2.288, 2.118, 1.982, 1.858, 1.728, 1.604, 1.486, 1.381, 1.293, 1.227, 1.173, 1.127, 1.098, 1.076, 1.067, 1.067, 1.077, 1.097, 1.121, 1.168, 1.225, 1.296, 1.382, 1.483, 1.598, 1.723, 1.852, 1.975, 2.107, 2.274, 2.496, + 2.515, 2.312, 2.139, 2.002, 1.877, 1.751, 1.629, 1.512, 1.405, 1.318, 1.248, 1.193, 1.149, 1.118, 1.096, 1.085, 1.085, 1.095, 1.114, 1.145, 1.188, 1.246, 1.319, 1.405, 1.508, 1.623, 1.747, 1.873, 1.995, 2.127, 2.297, 2.501, + 2.541, 2.351, 2.161, 2.016, 1.888, 1.762, 1.638, 1.519, 1.411, 1.319, 1.251, 1.197, 1.154, 1.121, 1.099, 1.091, 1.091, 1.099, 1.119, 1.148, 1.192, 1.248, 1.321, 1.411, 1.515, 1.633, 1.758, 1.884, 2.009, 2.149, 2.334, 2.526, + 2.588, 2.394, 2.193, 2.036, 1.905, 1.779, 1.656, 1.537, 1.426, 1.329, 1.255, 1.198, 1.161, 1.139, 1.118, 1.096, 1.095, 1.114, 1.138, 1.158, 1.195, 1.256, 1.333, 1.425, 1.533, 1.651, 1.777, 1.902, 2.028, 2.181, 2.378, 2.571, + 2.639, 2.431, 2.226, 2.067, 1.937, 1.816, 1.695, 1.577, 1.467, 1.368, 1.298, 1.253, 1.198, 1.161, 1.139, 1.129, 1.129, 1.138, 1.158, 1.195, 1.245, 1.296, 1.374, 1.468, 1.574, 1.692, 1.812, 1.934, 2.059, 2.216, 2.418, 2.626, + 2.679, 2.465, 2.261, 2.104, 1.979, 1.862, 1.746, 1.631, 1.522, 1.426, 1.352, 1.297, 1.254, 1.221, 1.201, 1.189, 1.189, 1.198, 1.217, 1.246, 1.293, 1.354, 1.433, 1.526, 1.631, 1.744, 1.859, 1.975, 2.097, 2.252, 2.452, 2.667, + 2.711, 2.511, 2.302, 2.141, 2.018, 1.903, 1.791, 1.678, 1.571, 1.475, 1.401, 1.343, 1.297, 1.268, 1.247, 1.236, 1.236, 1.244, 1.263, 1.291, 1.341, 1.403, 1.484, 1.575, 1.679, 1.791, 1.902, 2.012, 2.136, 2.295, 2.501, 2.698, + 2.759, 2.582, 2.363, 2.184, 2.049, 1.935, 1.824, 1.714, 1.608, 1.511, 1.431, 1.371, 1.325, 1.295, 1.271, 1.259, 1.259, 1.266, 1.291, 1.318, 1.369, 1.436, 1.517, 1.611, 1.716, 1.825, 1.933, 2.047, 2.179, 2.351, 2.571, 2.748, + 2.833, 2.662, 2.433, 2.239, 2.089, 1.968, 1.859, 1.752, 1.646, 1.549, 1.468, 1.411, 1.369, 1.325, 1.296, 1.283, 1.283, 1.292, 1.318, 1.366, 1.411, 1.472, 1.555, 1.651, 1.755, 1.861, 1.969, 2.086, 2.231, 2.422, 2.648, 2.821, + 2.909, 2.729, 2.499, 2.298, 2.141, 2.016, 1.907, 1.805, 1.703, 1.611, 1.539, 1.468, 1.411, 1.375, 1.351, 1.339, 1.339, 1.348, 1.372, 1.411, 1.472, 1.543, 1.613, 1.708, 1.807, 1.909, 2.014, 2.135, 2.288, 2.487, 2.716, 2.897, + 2.981, 2.789, 2.563, 2.358, 2.197, 2.071, 1.968, 1.868, 1.774, 1.684, 1.607, 1.541, 1.489, 1.453, 1.428, 1.417, 1.417, 1.427, 1.451, 1.489, 1.543, 1.611, 1.686, 1.776, 1.871, 1.966, 2.069, 2.191, 2.349, 2.551, 2.775, 2.964, + 3.041, 2.856, 2.629, 2.422, 2.252, 2.127, 2.021, 1.927, 1.834, 1.748, 1.672, 1.604, 1.541, 1.495, 1.483, 1.483, 1.483, 1.483, 1.496, 1.543, 1.608, 1.673, 1.749, 1.835, 1.926, 2.019, 2.122, 2.249, 2.411, 2.614, 2.839, 3.026 + ], + "sigma": 0.00163, + "sigma_Cb": 0.0011 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2498, + "ccm": + [ + 1.14912, 0.28638, -0.43551, + -0.49691, 1.60391, -0.10701, + -0.10513, -1.09534, 2.20047 + ] + }, + { + "ct": 2821, + "ccm": + [ + 1.18251, 0.15501, -0.33752, + -0.44304, 1.58495, -0.14191, + -0.05077, -0.96422, 2.01498 + ] + }, + { + "ct": 2925, + "ccm": + [ + 1.18668, 0.00195, -0.18864, + -0.41617, 1.50514, -0.08897, + -0.02675, -0.91143, 1.93818 + ] + }, + { + "ct": 2926, + "ccm": + [ + 1.50948, -0.44421, -0.06527, + -0.37241, 1.41726, -0.04486, + 0.07098, -0.84694, 1.77596 + ] + }, + { + "ct": 2951, + "ccm": + [ + 1.52743, -0.47333, -0.05411, + -0.36485, 1.40764, -0.04279, + 0.08672, -0.90479, 1.81807 + ] + }, + { + "ct": 2954, + "ccm": + [ + 1.51683, -0.46841, -0.04841, + -0.36288, 1.39914, -0.03625, + 0.06421, -0.82034, 1.75613 + ] + }, + { + "ct": 3578, + "ccm": + [ + 1.59888, -0.59105, -0.00784, + -0.29366, 1.32037, -0.02671, + 0.06627, -0.76465, 1.69838 + ] + }, + { + "ct": 3717, + "ccm": + [ + 1.59063, -0.58059, -0.01003, + -0.29583, 1.32715, -0.03132, + 0.03613, -0.67431, 1.63817 + ] + }, + { + "ct": 3784, + "ccm": + [ + 1.59379, -0.58861, -0.00517, + -0.29178, 1.33292, -0.04115, + 0.03541, -0.66162, 1.62622 + ] + }, + { + "ct": 4485, + "ccm": + [ + 1.40761, -0.34561, -0.06201, + -0.32388, 1.57221, -0.24832, + -0.01014, -0.63427, 1.64441 + ] + }, + { + "ct": 4615, + "ccm": + [ + 1.41537, -0.35832, -0.05705, + -0.31429, 1.56019, -0.24591, + -0.01761, -0.61859, 1.63621 + ] + }, + { + "ct": 4671, + "ccm": + [ + 1.42941, -0.38178, -0.04764, + -0.31421, 1.55925, -0.24504, + -0.01141, -0.62987, 1.64129 + ] + }, + { + "ct": 5753, + "ccm": + [ + 1.64549, -0.63329, -0.01221, + -0.22431, 1.36423, -0.13992, + -0.00831, -0.55373, 1.56204 + ] + }, + { + "ct": 5773, + "ccm": + [ + 1.63668, -0.63557, -0.00111, + -0.21919, 1.36234, -0.14315, + -0.00399, -0.57428, 1.57827 + ] + }, + { + "ct": 7433, + "ccm": + [ + 1.36007, -0.09277, -0.26729, + -0.36886, 2.09249, -0.72363, + -0.12573, -0.76761, 1.89334 + ] + }, + { + "ct": 55792, + "ccm": + [ + 1.65091, -0.63689, -0.01401, + -0.22277, 1.35752, -0.13475, + -0.00943, -0.55091, 1.56033 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.af": + { + "ranges": + { + "normal": + { + "min": 0.0, + "max": 12.0, + "default": 1.0 + }, + "macro": + { + "min": 3.0, + "max": 15.0, + "default": 4.0 + } + }, + "speeds": + { + "normal": + { + "step_coarse": 1.0, + "step_fine": 0.25, + "contrast_ratio": 0.75, + "pdaf_gain": -0.02, + "pdaf_squelch": 0.125, + "max_slew": 2.0, + "pdaf_frames": 20, + "dropout_frames": 6, + "step_frames": 4 + } + }, + "conf_epsilon": 8, + "conf_thresh": 16, + "conf_clip": 512, + "skip_frames": 5, + "map": [ 0.0, 445, 15.0, 925 ] + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx708_wide.json b/src/ipa/rpi/pisp/data/imx708_wide.json new file mode 100644 index 000000000..9fff05d93 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx708_wide.json @@ -0,0 +1,1293 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 41985, + "reference_gain": 1.12, + "reference_aperture": 1.0, + "reference_lux": 810, + "reference_Y": 13859 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.9 + } + }, + { + "rpi.geq": + { + "offset": 206, + "slope": 0.00324 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2868.0, 0.6419, 0.3613, + 3603.0, 0.5374, 0.4787, + 4620.0, 0.4482, 0.5813, + 5901.0, 0.3883, 0.6514, + 7610.0, 0.3279, 0.7232 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.01908, + "transverse_neg": 0.01376 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.65, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 1.717, 1.712, 1.703, 1.692, 1.674, 1.653, 1.638, 1.624, 1.613, 1.601, 1.589, 1.579, 1.575, 1.573, 1.571, 1.571, 1.571, 1.571, 1.572, 1.577, 1.583, 1.593, 1.605, 1.618, 1.636, 1.653, 1.677, 1.699, 1.715, 1.722, 1.731, 1.733, + 1.714, 1.706, 1.696, 1.678, 1.658, 1.639, 1.627, 1.614, 1.602, 1.591, 1.579, 1.572, 1.569, 1.566, 1.565, 1.564, 1.564, 1.565, 1.567, 1.571, 1.578, 1.585, 1.595, 1.607, 1.622, 1.641, 1.661, 1.685, 1.706, 1.717, 1.724, 1.732, + 1.708, 1.698, 1.688, 1.667, 1.647, 1.629, 1.619, 1.606, 1.593, 1.581, 1.572, 1.565, 1.561, 1.559, 1.559, 1.559, 1.559, 1.561, 1.562, 1.566, 1.571, 1.577, 1.587, 1.598, 1.612, 1.629, 1.649, 1.674, 1.697, 1.713, 1.721, 1.728, + 1.706, 1.695, 1.681, 1.655, 1.636, 1.622, 1.613, 1.597, 1.585, 1.572, 1.564, 1.559, 1.558, 1.556, 1.555, 1.555, 1.556, 1.556, 1.558, 1.561, 1.566, 1.571, 1.578, 1.591, 1.605, 1.619, 1.638, 1.662, 1.691, 1.708, 1.719, 1.726, + 1.706, 1.692, 1.675, 1.649, 1.629, 1.615, 1.607, 1.592, 1.575, 1.565, 1.559, 1.554, 1.552, 1.551, 1.551, 1.551, 1.551, 1.552, 1.554, 1.557, 1.561, 1.566, 1.573, 1.582, 1.596, 1.611, 1.627, 1.652, 1.681, 1.705, 1.717, 1.724, + 1.703, 1.686, 1.664, 1.639, 1.625, 1.612, 1.599, 1.585, 1.569, 1.559, 1.554, 1.549, 1.548, 1.548, 1.546, 1.546, 1.546, 1.547, 1.549, 1.553, 1.557, 1.563, 1.569, 1.576, 1.591, 1.603, 1.621, 1.644, 1.674, 1.698, 1.714, 1.724, + 1.702, 1.681, 1.659, 1.635, 1.621, 1.607, 1.594, 1.579, 1.565, 1.554, 1.549, 1.546, 1.544, 1.543, 1.543, 1.542, 1.543, 1.543, 1.544, 1.549, 1.553, 1.558, 1.564, 1.572, 1.584, 1.599, 1.614, 1.639, 1.667, 1.695, 1.712, 1.724, + 1.697, 1.678, 1.655, 1.631, 1.616, 1.602, 1.589, 1.575, 1.559, 1.551, 1.545, 1.543, 1.542, 1.542, 1.541, 1.539, 1.539, 1.539, 1.542, 1.544, 1.551, 1.555, 1.562, 1.571, 1.579, 1.594, 1.611, 1.631, 1.661, 1.691, 1.712, 1.724, + 1.695, 1.674, 1.651, 1.629, 1.615, 1.599, 1.584, 1.568, 1.554, 1.545, 1.542, 1.541, 1.539, 1.539, 1.538, 1.538, 1.538, 1.539, 1.539, 1.543, 1.548, 1.554, 1.559, 1.568, 1.576, 1.592, 1.608, 1.629, 1.655, 1.689, 1.709, 1.723, + 1.691, 1.671, 1.648, 1.627, 1.613, 1.597, 1.581, 1.564, 1.551, 1.543, 1.539, 1.538, 1.538, 1.537, 1.536, 1.535, 1.536, 1.538, 1.539, 1.542, 1.546, 1.551, 1.558, 1.564, 1.575, 1.588, 1.604, 1.627, 1.654, 1.686, 1.709, 1.724, + 1.689, 1.667, 1.643, 1.626, 1.612, 1.594, 1.579, 1.559, 1.549, 1.541, 1.536, 1.535, 1.535, 1.535, 1.534, 1.533, 1.534, 1.536, 1.538, 1.541, 1.545, 1.549, 1.555, 1.563, 1.573, 1.585, 1.602, 1.624, 1.651, 1.683, 1.709, 1.725, + 1.686, 1.665, 1.641, 1.623, 1.609, 1.594, 1.576, 1.559, 1.546, 1.538, 1.535, 1.534, 1.533, 1.532, 1.531, 1.531, 1.532, 1.534, 1.537, 1.539, 1.544, 1.549, 1.554, 1.562, 1.572, 1.585, 1.601, 1.622, 1.651, 1.682, 1.711, 1.726, + 1.686, 1.661, 1.639, 1.623, 1.609, 1.592, 1.574, 1.557, 1.545, 1.537, 1.534, 1.533, 1.532, 1.531, 1.529, 1.528, 1.529, 1.532, 1.537, 1.539, 1.542, 1.548, 1.553, 1.562, 1.571, 1.584, 1.601, 1.621, 1.649, 1.682, 1.711, 1.726, + 1.685, 1.661, 1.638, 1.624, 1.609, 1.592, 1.574, 1.557, 1.544, 1.536, 1.533, 1.532, 1.531, 1.529, 1.527, 1.522, 1.526, 1.531, 1.536, 1.539, 1.542, 1.547, 1.553, 1.562, 1.571, 1.583, 1.601, 1.621, 1.648, 1.682, 1.711, 1.726, + 1.684, 1.658, 1.638, 1.624, 1.611, 1.592, 1.573, 1.556, 1.543, 1.536, 1.532, 1.531, 1.529, 1.528, 1.522, 1.517, 1.519, 1.527, 1.535, 1.539, 1.541, 1.547, 1.553, 1.562, 1.571, 1.583, 1.601, 1.622, 1.647, 1.681, 1.711, 1.727, + 1.681, 1.658, 1.641, 1.624, 1.611, 1.593, 1.573, 1.555, 1.541, 1.535, 1.532, 1.529, 1.529, 1.527, 1.517, 1.506, 1.506, 1.522, 1.534, 1.538, 1.541, 1.546, 1.552, 1.562, 1.569, 1.583, 1.601, 1.622, 1.646, 1.679, 1.709, 1.728, + 1.679, 1.656, 1.639, 1.624, 1.611, 1.595, 1.575, 1.556, 1.541, 1.534, 1.531, 1.529, 1.529, 1.527, 1.517, 1.507, 1.507, 1.522, 1.533, 1.538, 1.539, 1.546, 1.552, 1.561, 1.569, 1.584, 1.601, 1.622, 1.647, 1.681, 1.709, 1.726, + 1.678, 1.656, 1.638, 1.625, 1.612, 1.597, 1.577, 1.557, 1.542, 1.534, 1.529, 1.529, 1.528, 1.527, 1.522, 1.516, 1.519, 1.525, 1.533, 1.537, 1.539, 1.545, 1.552, 1.561, 1.571, 1.584, 1.601, 1.623, 1.649, 1.681, 1.709, 1.726, + 1.679, 1.654, 1.639, 1.626, 1.613, 1.598, 1.578, 1.558, 1.543, 1.534, 1.529, 1.529, 1.529, 1.528, 1.527, 1.522, 1.525, 1.528, 1.533, 1.536, 1.539, 1.546, 1.553, 1.561, 1.571, 1.586, 1.602, 1.623, 1.651, 1.683, 1.712, 1.726, + 1.677, 1.655, 1.641, 1.628, 1.615, 1.599, 1.581, 1.562, 1.545, 1.535, 1.531, 1.529, 1.529, 1.528, 1.527, 1.527, 1.528, 1.531, 1.533, 1.536, 1.539, 1.545, 1.552, 1.561, 1.572, 1.588, 1.607, 1.626, 1.654, 1.686, 1.716, 1.729, + 1.676, 1.655, 1.642, 1.629, 1.617, 1.602, 1.586, 1.564, 1.546, 1.536, 1.531, 1.529, 1.529, 1.529, 1.529, 1.529, 1.529, 1.532, 1.534, 1.536, 1.539, 1.547, 1.553, 1.563, 1.576, 1.591, 1.609, 1.627, 1.655, 1.688, 1.716, 1.729, + 1.676, 1.658, 1.641, 1.631, 1.617, 1.605, 1.588, 1.569, 1.553, 1.539, 1.532, 1.531, 1.529, 1.529, 1.529, 1.529, 1.531, 1.532, 1.534, 1.537, 1.541, 1.547, 1.553, 1.564, 1.578, 1.594, 1.613, 1.632, 1.659, 1.691, 1.717, 1.728, + 1.676, 1.658, 1.642, 1.631, 1.619, 1.608, 1.592, 1.575, 1.556, 1.542, 1.533, 1.531, 1.529, 1.529, 1.529, 1.531, 1.531, 1.532, 1.534, 1.537, 1.542, 1.548, 1.556, 1.567, 1.582, 1.598, 1.616, 1.638, 1.661, 1.693, 1.717, 1.729, + 1.678, 1.661, 1.644, 1.632, 1.621, 1.611, 1.596, 1.579, 1.561, 1.546, 1.536, 1.532, 1.531, 1.531, 1.531, 1.531, 1.532, 1.533, 1.535, 1.538, 1.544, 1.549, 1.559, 1.569, 1.587, 1.604, 1.618, 1.639, 1.669, 1.697, 1.718, 1.731, + 1.679, 1.662, 1.648, 1.635, 1.625, 1.615, 1.602, 1.586, 1.569, 1.552, 1.541, 1.535, 1.532, 1.532, 1.531, 1.532, 1.533, 1.534, 1.537, 1.541, 1.546, 1.552, 1.562, 1.576, 1.592, 1.608, 1.622, 1.647, 1.673, 1.703, 1.721, 1.734, + 1.684, 1.664, 1.649, 1.637, 1.627, 1.618, 1.606, 1.593, 1.576, 1.561, 1.547, 1.539, 1.535, 1.533, 1.533, 1.533, 1.534, 1.536, 1.539, 1.543, 1.549, 1.555, 1.568, 1.583, 1.596, 1.612, 1.629, 1.651, 1.681, 1.706, 1.723, 1.734, + 1.689, 1.669, 1.649, 1.639, 1.629, 1.621, 1.609, 1.597, 1.585, 1.567, 1.554, 1.546, 1.539, 1.536, 1.535, 1.535, 1.537, 1.538, 1.542, 1.546, 1.553, 1.562, 1.572, 1.589, 1.603, 1.619, 1.635, 1.658, 1.686, 1.708, 1.726, 1.736, + 1.692, 1.673, 1.655, 1.644, 1.634, 1.624, 1.614, 1.604, 1.592, 1.577, 1.566, 1.554, 1.546, 1.542, 1.538, 1.538, 1.539, 1.542, 1.546, 1.552, 1.559, 1.568, 1.581, 1.596, 1.609, 1.625, 1.642, 1.664, 1.693, 1.714, 1.727, 1.736, + 1.695, 1.679, 1.662, 1.647, 1.638, 1.631, 1.623, 1.612, 1.601, 1.589, 1.577, 1.565, 1.555, 1.549, 1.546, 1.545, 1.546, 1.548, 1.552, 1.559, 1.568, 1.579, 1.593, 1.604, 1.618, 1.632, 1.648, 1.676, 1.701, 1.718, 1.728, 1.739, + 1.699, 1.684, 1.667, 1.654, 1.644, 1.635, 1.629, 1.621, 1.609, 1.599, 1.589, 1.578, 1.568, 1.559, 1.556, 1.554, 1.554, 1.557, 1.563, 1.569, 1.578, 1.589, 1.599, 1.612, 1.625, 1.641, 1.661, 1.685, 1.707, 1.722, 1.734, 1.742, + 1.703, 1.691, 1.672, 1.658, 1.648, 1.639, 1.634, 1.628, 1.618, 1.606, 1.598, 1.589, 1.579, 1.573, 1.568, 1.567, 1.567, 1.568, 1.571, 1.578, 1.587, 1.597, 1.607, 1.618, 1.632, 1.651, 1.672, 1.694, 1.715, 1.728, 1.737, 1.742, + 1.707, 1.691, 1.676, 1.662, 1.651, 1.643, 1.638, 1.631, 1.622, 1.614, 1.604, 1.596, 1.589, 1.579, 1.575, 1.573, 1.573, 1.574, 1.578, 1.586, 1.589, 1.598, 1.609, 1.625, 1.638, 1.657, 1.679, 1.701, 1.719, 1.728, 1.738, 1.742 + ] + }, + { + "ct": 5000, + "table": + [ + 2.939, 2.935, 2.916, 2.895, 2.856, 2.825, 2.797, 2.777, 2.761, 2.741, 2.726, 2.709, 2.707, 2.704, 2.702, 2.702, 2.703, 2.706, 2.708, 2.709, 2.719, 2.735, 2.753, 2.776, 2.801, 2.832, 2.874, 2.915, 2.939, 2.943, 2.953, 2.961, + 2.936, 2.923, 2.901, 2.863, 2.829, 2.801, 2.781, 2.763, 2.743, 2.732, 2.712, 2.701, 2.696, 2.692, 2.691, 2.691, 2.693, 2.694, 2.696, 2.701, 2.709, 2.725, 2.741, 2.758, 2.779, 2.811, 2.838, 2.879, 2.919, 2.939, 2.948, 2.959, + 2.929, 2.909, 2.887, 2.847, 2.808, 2.783, 2.765, 2.748, 2.732, 2.713, 2.699, 2.691, 2.687, 2.686, 2.685, 2.685, 2.687, 2.689, 2.691, 2.694, 2.701, 2.709, 2.725, 2.745, 2.763, 2.786, 2.818, 2.863, 2.907, 2.933, 2.941, 2.955, + 2.929, 2.903, 2.875, 2.825, 2.791, 2.769, 2.755, 2.737, 2.718, 2.701, 2.688, 2.683, 2.681, 2.679, 2.681, 2.679, 2.681, 2.682, 2.685, 2.689, 2.694, 2.701, 2.711, 2.737, 2.754, 2.772, 2.803, 2.844, 2.894, 2.931, 2.939, 2.953, + 2.926, 2.895, 2.862, 2.816, 2.782, 2.759, 2.744, 2.727, 2.709, 2.691, 2.679, 2.673, 2.671, 2.669, 2.669, 2.669, 2.671, 2.674, 2.678, 2.681, 2.685, 2.694, 2.707, 2.725, 2.739, 2.762, 2.786, 2.829, 2.879, 2.919, 2.942, 2.952, + 2.919, 2.886, 2.846, 2.797, 2.772, 2.751, 2.737, 2.719, 2.694, 2.679, 2.672, 2.666, 2.664, 2.661, 2.659, 2.658, 2.661, 2.664, 2.669, 2.673, 2.678, 2.685, 2.696, 2.715, 2.728, 2.749, 2.774, 2.808, 2.866, 2.909, 2.936, 2.951, + 2.904, 2.877, 2.835, 2.789, 2.763, 2.744, 2.728, 2.712, 2.686, 2.672, 2.664, 2.657, 2.654, 2.654, 2.652, 2.653, 2.654, 2.657, 2.661, 2.666, 2.672, 2.678, 2.688, 2.703, 2.721, 2.742, 2.762, 2.797, 2.851, 2.902, 2.928, 2.949, + 2.901, 2.869, 2.825, 2.781, 2.756, 2.738, 2.721, 2.698, 2.679, 2.665, 2.656, 2.652, 2.649, 2.648, 2.648, 2.648, 2.649, 2.651, 2.654, 2.659, 2.667, 2.675, 2.683, 2.699, 2.711, 2.736, 2.754, 2.789, 2.838, 2.896, 2.926, 2.948, + 2.899, 2.862, 2.815, 2.774, 2.752, 2.734, 2.717, 2.689, 2.669, 2.658, 2.651, 2.646, 2.645, 2.643, 2.643, 2.644, 2.645, 2.646, 2.649, 2.654, 2.661, 2.669, 2.681, 2.693, 2.707, 2.729, 2.751, 2.782, 2.834, 2.887, 2.924, 2.947, + 2.898, 2.853, 2.812, 2.771, 2.751, 2.731, 2.711, 2.686, 2.663, 2.653, 2.646, 2.642, 2.641, 2.642, 2.642, 2.641, 2.641, 2.641, 2.646, 2.651, 2.657, 2.667, 2.678, 2.693, 2.705, 2.728, 2.746, 2.781, 2.829, 2.885, 2.924, 2.951, + 2.896, 2.851, 2.807, 2.771, 2.752, 2.729, 2.709, 2.681, 2.661, 2.649, 2.643, 2.641, 2.639, 2.639, 2.638, 2.636, 2.637, 2.638, 2.644, 2.649, 2.657, 2.666, 2.676, 2.688, 2.705, 2.725, 2.745, 2.777, 2.827, 2.884, 2.927, 2.951, + 2.891, 2.846, 2.803, 2.771, 2.749, 2.728, 2.706, 2.677, 2.658, 2.647, 2.641, 2.637, 2.637, 2.636, 2.636, 2.633, 2.632, 2.635, 2.643, 2.649, 2.656, 2.665, 2.675, 2.688, 2.704, 2.719, 2.744, 2.776, 2.822, 2.881, 2.927, 2.958, + 2.887, 2.841, 2.797, 2.769, 2.749, 2.729, 2.704, 2.674, 2.655, 2.645, 2.638, 2.635, 2.633, 2.632, 2.631, 2.625, 2.627, 2.631, 2.639, 2.649, 2.654, 2.662, 2.673, 2.686, 2.701, 2.718, 2.742, 2.773, 2.822, 2.881, 2.926, 2.958, + 2.883, 2.837, 2.796, 2.769, 2.749, 2.729, 2.701, 2.673, 2.653, 2.641, 2.636, 2.632, 2.631, 2.629, 2.623, 2.612, 2.619, 2.627, 2.637, 2.648, 2.652, 2.659, 2.671, 2.688, 2.699, 2.719, 2.742, 2.774, 2.821, 2.882, 2.927, 2.961, + 2.881, 2.832, 2.795, 2.769, 2.751, 2.729, 2.701, 2.672, 2.652, 2.639, 2.633, 2.631, 2.628, 2.625, 2.611, 2.599, 2.607, 2.619, 2.635, 2.644, 2.652, 2.659, 2.669, 2.686, 2.698, 2.719, 2.743, 2.775, 2.822, 2.881, 2.926, 2.961, + 2.879, 2.829, 2.793, 2.771, 2.751, 2.731, 2.701, 2.672, 2.651, 2.639, 2.632, 2.628, 2.626, 2.621, 2.601, 2.581, 2.581, 2.611, 2.631, 2.642, 2.648, 2.657, 2.669, 2.685, 2.699, 2.721, 2.743, 2.776, 2.819, 2.879, 2.927, 2.961, + 2.876, 2.829, 2.796, 2.773, 2.752, 2.731, 2.705, 2.672, 2.651, 2.637, 2.631, 2.627, 2.625, 2.619, 2.601, 2.581, 2.581, 2.611, 2.629, 2.641, 2.647, 2.658, 2.669, 2.685, 2.697, 2.721, 2.746, 2.777, 2.822, 2.881, 2.929, 2.964, + 2.874, 2.827, 2.796, 2.775, 2.755, 2.733, 2.708, 2.674, 2.649, 2.635, 2.629, 2.626, 2.624, 2.621, 2.609, 2.601, 2.606, 2.615, 2.629, 2.638, 2.645, 2.657, 2.669, 2.682, 2.699, 2.722, 2.747, 2.778, 2.822, 2.881, 2.931, 2.964, + 2.871, 2.827, 2.797, 2.776, 2.761, 2.734, 2.711, 2.679, 2.651, 2.636, 2.628, 2.626, 2.624, 2.621, 2.618, 2.611, 2.614, 2.619, 2.628, 2.639, 2.644, 2.657, 2.668, 2.683, 2.698, 2.723, 2.749, 2.782, 2.824, 2.882, 2.933, 2.965, + 2.869, 2.825, 2.797, 2.777, 2.765, 2.741, 2.718, 2.683, 2.655, 2.638, 2.627, 2.625, 2.624, 2.623, 2.621, 2.618, 2.618, 2.624, 2.629, 2.639, 2.644, 2.657, 2.669, 2.684, 2.701, 2.725, 2.755, 2.782, 2.829, 2.887, 2.937, 2.965, + 2.871, 2.826, 2.799, 2.776, 2.765, 2.744, 2.723, 2.689, 2.659, 2.639, 2.629, 2.626, 2.626, 2.624, 2.624, 2.622, 2.624, 2.627, 2.632, 2.639, 2.646, 2.657, 2.671, 2.687, 2.706, 2.732, 2.757, 2.789, 2.836, 2.893, 2.941, 2.965, + 2.869, 2.831, 2.803, 2.778, 2.766, 2.748, 2.729, 2.697, 2.667, 2.645, 2.632, 2.628, 2.625, 2.625, 2.625, 2.625, 2.627, 2.629, 2.634, 2.638, 2.648, 2.661, 2.673, 2.688, 2.711, 2.741, 2.762, 2.797, 2.843, 2.901, 2.943, 2.964, + 2.872, 2.837, 2.802, 2.781, 2.768, 2.753, 2.734, 2.702, 2.674, 2.647, 2.634, 2.629, 2.626, 2.625, 2.625, 2.627, 2.629, 2.632, 2.635, 2.639, 2.649, 2.663, 2.676, 2.694, 2.719, 2.746, 2.771, 2.799, 2.851, 2.905, 2.947, 2.969, + 2.871, 2.837, 2.805, 2.786, 2.771, 2.755, 2.739, 2.714, 2.685, 2.655, 2.639, 2.631, 2.626, 2.625, 2.626, 2.628, 2.629, 2.632, 2.634, 2.642, 2.651, 2.663, 2.679, 2.701, 2.726, 2.756, 2.773, 2.809, 2.861, 2.913, 2.949, 2.968, + 2.876, 2.841, 2.808, 2.789, 2.775, 2.759, 2.744, 2.719, 2.693, 2.664, 2.648, 2.636, 2.629, 2.627, 2.627, 2.629, 2.631, 2.633, 2.637, 2.645, 2.653, 2.666, 2.682, 2.708, 2.734, 2.759, 2.779, 2.815, 2.868, 2.918, 2.951, 2.971, + 2.882, 2.845, 2.816, 2.791, 2.778, 2.766, 2.748, 2.733, 2.707, 2.681, 2.656, 2.643, 2.636, 2.632, 2.631, 2.632, 2.633, 2.637, 2.643, 2.648, 2.659, 2.672, 2.691, 2.719, 2.747, 2.765, 2.791, 2.829, 2.881, 2.931, 2.952, 2.969, + 2.889, 2.855, 2.819, 2.799, 2.782, 2.769, 2.755, 2.741, 2.717, 2.691, 2.672, 2.652, 2.643, 2.639, 2.636, 2.636, 2.638, 2.642, 2.646, 2.655, 2.665, 2.682, 2.703, 2.729, 2.752, 2.774, 2.798, 2.839, 2.891, 2.933, 2.959, 2.975, + 2.897, 2.862, 2.829, 2.804, 2.789, 2.776, 2.764, 2.749, 2.734, 2.709, 2.689, 2.669, 2.652, 2.644, 2.642, 2.642, 2.644, 2.647, 2.654, 2.664, 2.677, 2.694, 2.714, 2.742, 2.764, 2.782, 2.809, 2.852, 2.899, 2.936, 2.961, 2.976, + 2.902, 2.869, 2.841, 2.811, 2.797, 2.785, 2.776, 2.761, 2.748, 2.727, 2.708, 2.689, 2.671, 2.659, 2.655, 2.654, 2.653, 2.656, 2.666, 2.678, 2.693, 2.713, 2.737, 2.756, 2.775, 2.798, 2.825, 2.871, 2.913, 2.944, 2.966, 2.979, + 2.911, 2.885, 2.848, 2.821, 2.804, 2.793, 2.784, 2.774, 2.759, 2.747, 2.726, 2.709, 2.692, 2.679, 2.673, 2.672, 2.671, 2.672, 2.681, 2.694, 2.712, 2.729, 2.749, 2.768, 2.789, 2.811, 2.844, 2.886, 2.928, 2.956, 2.971, 2.984, + 2.925, 2.893, 2.861, 2.831, 2.813, 2.802, 2.795, 2.783, 2.773, 2.759, 2.744, 2.729, 2.715, 2.701, 2.698, 2.694, 2.693, 2.694, 2.702, 2.714, 2.729, 2.747, 2.761, 2.781, 2.802, 2.828, 2.864, 2.907, 2.942, 2.967, 2.978, 2.989, + 2.932, 2.898, 2.871, 2.843, 2.823, 2.811, 2.802, 2.794, 2.779, 2.772, 2.757, 2.742, 2.729, 2.716, 2.705, 2.704, 2.704, 2.707, 2.715, 2.727, 2.737, 2.754, 2.769, 2.788, 2.812, 2.845, 2.878, 2.923, 2.962, 2.973, 2.979, 2.994 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 3.018, 3.021, 3.026, 3.052, 3.092, 3.143, 3.181, 3.202, 3.209, 3.212, 3.211, 3.209, 3.197, 3.193, 3.185, 3.184, 3.185, 3.187, 3.191, 3.202, 3.211, 3.213, 3.212, 3.203, 3.189, 3.147, 3.099, 3.051, 3.032, 3.031, 3.048, 3.054, + 3.019, 3.023, 3.033, 3.066, 3.123, 3.163, 3.196, 3.206, 3.212, 3.212, 3.211, 3.203, 3.193, 3.179, 3.168, 3.159, 3.159, 3.163, 3.174, 3.188, 3.203, 3.208, 3.211, 3.209, 3.195, 3.168, 3.114, 3.064, 3.035, 3.033, 3.044, 3.051, + 3.021, 3.028, 3.046, 3.099, 3.156, 3.192, 3.209, 3.215, 3.216, 3.213, 3.203, 3.193, 3.176, 3.159, 3.153, 3.151, 3.149, 3.152, 3.159, 3.171, 3.188, 3.201, 3.209, 3.211, 3.207, 3.189, 3.142, 3.083, 3.042, 3.038, 3.043, 3.046, + 3.022, 3.037, 3.065, 3.124, 3.178, 3.206, 3.215, 3.221, 3.218, 3.217, 3.198, 3.179, 3.162, 3.149, 3.138, 3.133, 3.133, 3.136, 3.145, 3.156, 3.174, 3.192, 3.206, 3.215, 3.214, 3.202, 3.159, 3.105, 3.058, 3.042, 3.043, 3.049, + 3.024, 3.047, 3.084, 3.151, 3.195, 3.211, 3.219, 3.223, 3.218, 3.208, 3.182, 3.164, 3.149, 3.137, 3.127, 3.119, 3.119, 3.124, 3.134, 3.144, 3.157, 3.178, 3.194, 3.213, 3.215, 3.208, 3.166, 3.124, 3.074, 3.044, 3.044, 3.049, + 3.023, 3.058, 3.102, 3.161, 3.201, 3.217, 3.224, 3.223, 3.217, 3.195, 3.174, 3.156, 3.137, 3.125, 3.115, 3.109, 3.109, 3.115, 3.121, 3.131, 3.146, 3.159, 3.186, 3.208, 3.213, 3.211, 3.181, 3.138, 3.084, 3.047, 3.047, 3.049, + 3.031, 3.063, 3.126, 3.183, 3.212, 3.224, 3.225, 3.224, 3.216, 3.191, 3.167, 3.143, 3.129, 3.115, 3.105, 3.103, 3.103, 3.107, 3.114, 3.121, 3.131, 3.148, 3.169, 3.199, 3.211, 3.209, 3.186, 3.151, 3.089, 3.051, 3.049, 3.052, + 3.033, 3.083, 3.141, 3.201, 3.221, 3.226, 3.226, 3.224, 3.212, 3.187, 3.159, 3.138, 3.119, 3.107, 3.101, 3.098, 3.098, 3.102, 3.107, 3.115, 3.124, 3.138, 3.161, 3.185, 3.207, 3.209, 3.197, 3.162, 3.112, 3.059, 3.056, 3.057, + 3.038, 3.092, 3.159, 3.212, 3.225, 3.231, 3.228, 3.224, 3.209, 3.181, 3.152, 3.129, 3.112, 3.103, 3.095, 3.092, 3.093, 3.095, 3.101, 3.108, 3.118, 3.133, 3.152, 3.179, 3.203, 3.209, 3.205, 3.174, 3.124, 3.069, 3.059, 3.058, + 3.049, 3.105, 3.176, 3.223, 3.229, 3.231, 3.229, 3.223, 3.206, 3.171, 3.147, 3.125, 3.109, 3.097, 3.091, 3.089, 3.088, 3.091, 3.094, 3.102, 3.111, 3.124, 3.143, 3.169, 3.196, 3.208, 3.207, 3.181, 3.132, 3.079, 3.064, 3.063, + 3.055, 3.123, 3.189, 3.226, 3.232, 3.232, 3.229, 3.225, 3.204, 3.169, 3.143, 3.122, 3.108, 3.095, 3.092, 3.089, 3.088, 3.088, 3.092, 3.095, 3.105, 3.117, 3.135, 3.159, 3.191, 3.208, 3.208, 3.189, 3.141, 3.084, 3.064, 3.062, + 3.057, 3.127, 3.198, 3.228, 3.233, 3.233, 3.229, 3.225, 3.201, 3.166, 3.139, 3.119, 3.106, 3.096, 3.093, 3.092, 3.088, 3.088, 3.089, 3.093, 3.099, 3.114, 3.129, 3.156, 3.186, 3.208, 3.208, 3.195, 3.143, 3.089, 3.065, 3.064, + 3.066, 3.142, 3.209, 3.232, 3.234, 3.233, 3.231, 3.226, 3.198, 3.166, 3.138, 3.117, 3.103, 3.097, 3.095, 3.095, 3.094, 3.089, 3.089, 3.092, 3.097, 3.109, 3.126, 3.155, 3.183, 3.207, 3.207, 3.198, 3.147, 3.091, 3.069, 3.065, + 3.072, 3.153, 3.216, 3.231, 3.234, 3.234, 3.229, 3.226, 3.194, 3.165, 3.136, 3.114, 3.101, 3.098, 3.098, 3.104, 3.098, 3.091, 3.088, 3.089, 3.093, 3.103, 3.123, 3.151, 3.181, 3.204, 3.204, 3.197, 3.156, 3.095, 3.069, 3.068, + 3.079, 3.159, 3.222, 3.233, 3.236, 3.235, 3.231, 3.226, 3.194, 3.165, 3.133, 3.112, 3.102, 3.099, 3.107, 3.114, 3.111, 3.097, 3.089, 3.089, 3.091, 3.099, 3.121, 3.149, 3.182, 3.202, 3.202, 3.195, 3.156, 3.096, 3.069, 3.068, + 3.081, 3.164, 3.226, 3.233, 3.236, 3.235, 3.233, 3.229, 3.199, 3.165, 3.137, 3.113, 3.102, 3.102, 3.111, 3.134, 3.134, 3.103, 3.091, 3.089, 3.092, 3.101, 3.119, 3.147, 3.182, 3.202, 3.202, 3.194, 3.155, 3.095, 3.069, 3.067, + 3.085, 3.163, 3.225, 3.236, 3.239, 3.235, 3.234, 3.231, 3.203, 3.169, 3.141, 3.115, 3.103, 3.103, 3.111, 3.134, 3.134, 3.106, 3.092, 3.091, 3.093, 3.103, 3.119, 3.149, 3.185, 3.203, 3.203, 3.193, 3.152, 3.095, 3.068, 3.066, + 3.083, 3.168, 3.226, 3.236, 3.241, 3.235, 3.235, 3.231, 3.205, 3.174, 3.144, 3.117, 3.107, 3.103, 3.107, 3.116, 3.109, 3.103, 3.091, 3.091, 3.095, 3.107, 3.123, 3.152, 3.188, 3.204, 3.204, 3.193, 3.151, 3.095, 3.069, 3.066, + 3.082, 3.171, 3.228, 3.237, 3.239, 3.235, 3.234, 3.233, 3.217, 3.184, 3.147, 3.119, 3.108, 3.104, 3.103, 3.105, 3.102, 3.095, 3.091, 3.091, 3.097, 3.111, 3.128, 3.157, 3.191, 3.204, 3.204, 3.185, 3.149, 3.094, 3.069, 3.065, + 3.086, 3.173, 3.226, 3.237, 3.239, 3.235, 3.234, 3.232, 3.221, 3.185, 3.155, 3.124, 3.112, 3.105, 3.102, 3.099, 3.096, 3.094, 3.092, 3.094, 3.102, 3.114, 3.133, 3.163, 3.197, 3.205, 3.204, 3.183, 3.144, 3.089, 3.068, 3.065, + 3.086, 3.166, 3.225, 3.239, 3.239, 3.237, 3.233, 3.231, 3.223, 3.193, 3.165, 3.135, 3.118, 3.108, 3.101, 3.098, 3.095, 3.093, 3.093, 3.099, 3.109, 3.124, 3.145, 3.174, 3.199, 3.204, 3.203, 3.181, 3.132, 3.085, 3.067, 3.062, + 3.086, 3.162, 3.224, 3.239, 3.241, 3.236, 3.232, 3.229, 3.224, 3.201, 3.174, 3.147, 3.128, 3.114, 3.103, 3.099, 3.096, 3.095, 3.097, 3.106, 3.116, 3.134, 3.151, 3.182, 3.201, 3.203, 3.201, 3.176, 3.125, 3.078, 3.065, 3.061, + 3.077, 3.162, 3.221, 3.239, 3.241, 3.234, 3.229, 3.227, 3.225, 3.207, 3.186, 3.161, 3.137, 3.122, 3.112, 3.102, 3.099, 3.098, 3.106, 3.113, 3.127, 3.139, 3.159, 3.192, 3.204, 3.205, 3.198, 3.167, 3.119, 3.073, 3.062, 3.061, + 3.077, 3.161, 3.216, 3.234, 3.236, 3.232, 3.225, 3.225, 3.222, 3.209, 3.194, 3.172, 3.148, 3.132, 3.121, 3.113, 3.107, 3.107, 3.112, 3.124, 3.135, 3.151, 3.175, 3.196, 3.201, 3.201, 3.191, 3.161, 3.114, 3.062, 3.058, 3.057, + 3.073, 3.139, 3.201, 3.227, 3.232, 3.227, 3.223, 3.219, 3.216, 3.212, 3.203, 3.181, 3.161, 3.142, 3.129, 3.121, 3.114, 3.114, 3.124, 3.134, 3.145, 3.161, 3.179, 3.196, 3.199, 3.195, 3.182, 3.145, 3.093, 3.052, 3.051, 3.052, + 3.066, 3.126, 3.192, 3.218, 3.224, 3.221, 3.218, 3.214, 3.214, 3.209, 3.204, 3.191, 3.174, 3.155, 3.142, 3.129, 3.127, 3.127, 3.136, 3.145, 3.157, 3.175, 3.187, 3.194, 3.196, 3.192, 3.171, 3.134, 3.082, 3.043, 3.042, 3.044, + 3.056, 3.114, 3.176, 3.212, 3.219, 3.219, 3.214, 3.209, 3.208, 3.206, 3.203, 3.198, 3.182, 3.171, 3.155, 3.146, 3.144, 3.144, 3.148, 3.156, 3.171, 3.181, 3.188, 3.194, 3.194, 3.187, 3.161, 3.117, 3.066, 3.037, 3.037, 3.044, + 3.054, 3.101, 3.162, 3.203, 3.216, 3.215, 3.211, 3.206, 3.203, 3.201, 3.199, 3.197, 3.191, 3.179, 3.171, 3.161, 3.156, 3.156, 3.161, 3.171, 3.179, 3.184, 3.189, 3.192, 3.191, 3.181, 3.142, 3.097, 3.045, 3.032, 3.033, 3.039, + 3.041, 3.093, 3.149, 3.194, 3.208, 3.211, 3.208, 3.202, 3.197, 3.197, 3.197, 3.195, 3.191, 3.189, 3.181, 3.176, 3.172, 3.173, 3.178, 3.181, 3.185, 3.187, 3.189, 3.191, 3.189, 3.173, 3.133, 3.085, 3.034, 3.029, 3.031, 3.038, + 3.032, 3.079, 3.133, 3.181, 3.197, 3.207, 3.204, 3.198, 3.193, 3.192, 3.189, 3.191, 3.189, 3.187, 3.185, 3.183, 3.183, 3.183, 3.185, 3.188, 3.187, 3.188, 3.189, 3.188, 3.184, 3.164, 3.118, 3.075, 3.031, 3.026, 3.028, 3.039, + 3.025, 3.051, 3.099, 3.149, 3.182, 3.193, 3.193, 3.187, 3.181, 3.178, 3.177, 3.177, 3.182, 3.183, 3.183, 3.183, 3.183, 3.184, 3.187, 3.188, 3.186, 3.184, 3.184, 3.181, 3.167, 3.139, 3.098, 3.053, 3.026, 3.024, 3.029, 3.043, + 3.016, 3.025, 3.081, 3.122, 3.167, 3.182, 3.185, 3.181, 3.176, 3.171, 3.169, 3.171, 3.174, 3.175, 3.178, 3.178, 3.179, 3.181, 3.185, 3.185, 3.181, 3.179, 3.177, 3.173, 3.151, 3.119, 3.076, 3.031, 3.021, 3.018, 3.024, 3.046 + ] + }, + { + "ct": 5000, + "table": + [ + 1.503, 1.503, 1.504, 1.515, 1.541, 1.566, 1.587, 1.599, 1.602, 1.603, 1.602, 1.599, 1.595, 1.589, 1.587, 1.586, 1.586, 1.587, 1.589, 1.594, 1.601, 1.604, 1.604, 1.601, 1.589, 1.571, 1.541, 1.517, 1.512, 1.512, 1.522, 1.526, + 1.501, 1.502, 1.506, 1.523, 1.557, 1.579, 1.596, 1.603, 1.603, 1.603, 1.601, 1.597, 1.591, 1.582, 1.576, 1.575, 1.574, 1.577, 1.581, 1.588, 1.595, 1.601, 1.603, 1.602, 1.597, 1.578, 1.553, 1.526, 1.512, 1.512, 1.519, 1.526, + 1.499, 1.503, 1.512, 1.539, 1.571, 1.593, 1.603, 1.604, 1.604, 1.602, 1.597, 1.591, 1.581, 1.573, 1.568, 1.566, 1.566, 1.568, 1.572, 1.579, 1.587, 1.594, 1.602, 1.603, 1.601, 1.589, 1.566, 1.536, 1.517, 1.516, 1.519, 1.525, + 1.499, 1.505, 1.521, 1.553, 1.582, 1.597, 1.604, 1.604, 1.604, 1.601, 1.592, 1.582, 1.573, 1.564, 1.561, 1.558, 1.557, 1.559, 1.564, 1.571, 1.579, 1.588, 1.597, 1.603, 1.603, 1.596, 1.576, 1.545, 1.519, 1.517, 1.518, 1.526, + 1.499, 1.509, 1.529, 1.565, 1.591, 1.601, 1.605, 1.604, 1.602, 1.597, 1.586, 1.573, 1.565, 1.558, 1.553, 1.551, 1.551, 1.552, 1.555, 1.563, 1.571, 1.581, 1.592, 1.601, 1.602, 1.599, 1.582, 1.556, 1.528, 1.517, 1.517, 1.526, + 1.501, 1.512, 1.539, 1.576, 1.595, 1.603, 1.605, 1.604, 1.601, 1.591, 1.579, 1.567, 1.559, 1.552, 1.548, 1.545, 1.546, 1.548, 1.551, 1.555, 1.563, 1.574, 1.585, 1.598, 1.602, 1.601, 1.589, 1.562, 1.535, 1.519, 1.519, 1.528, + 1.501, 1.517, 1.552, 1.587, 1.601, 1.605, 1.605, 1.605, 1.599, 1.588, 1.574, 1.562, 1.553, 1.548, 1.544, 1.543, 1.543, 1.545, 1.547, 1.551, 1.557, 1.567, 1.578, 1.593, 1.601, 1.601, 1.592, 1.571, 1.539, 1.521, 1.521, 1.529, + 1.503, 1.524, 1.561, 1.593, 1.605, 1.606, 1.605, 1.603, 1.598, 1.585, 1.569, 1.558, 1.551, 1.545, 1.542, 1.541, 1.541, 1.542, 1.545, 1.547, 1.555, 1.561, 1.573, 1.587, 1.598, 1.601, 1.596, 1.577, 1.546, 1.523, 1.523, 1.529, + 1.503, 1.532, 1.568, 1.597, 1.605, 1.606, 1.605, 1.603, 1.596, 1.581, 1.565, 1.555, 1.548, 1.544, 1.541, 1.539, 1.541, 1.541, 1.543, 1.546, 1.549, 1.558, 1.568, 1.583, 1.595, 1.601, 1.599, 1.582, 1.555, 1.525, 1.525, 1.531, + 1.508, 1.539, 1.575, 1.601, 1.605, 1.606, 1.605, 1.602, 1.593, 1.577, 1.563, 1.552, 1.546, 1.543, 1.541, 1.539, 1.539, 1.541, 1.542, 1.544, 1.548, 1.553, 1.564, 1.579, 1.592, 1.599, 1.599, 1.585, 1.559, 1.532, 1.531, 1.531, + 1.511, 1.544, 1.581, 1.603, 1.606, 1.606, 1.604, 1.603, 1.591, 1.574, 1.561, 1.549, 1.545, 1.542, 1.541, 1.541, 1.541, 1.541, 1.542, 1.543, 1.545, 1.551, 1.561, 1.573, 1.591, 1.599, 1.599, 1.588, 1.563, 1.535, 1.531, 1.531, + 1.515, 1.548, 1.589, 1.605, 1.607, 1.607, 1.604, 1.602, 1.591, 1.573, 1.559, 1.549, 1.543, 1.542, 1.541, 1.542, 1.542, 1.542, 1.541, 1.542, 1.543, 1.549, 1.558, 1.571, 1.588, 1.599, 1.599, 1.591, 1.566, 1.537, 1.532, 1.531, + 1.517, 1.558, 1.593, 1.606, 1.607, 1.607, 1.605, 1.602, 1.589, 1.572, 1.557, 1.548, 1.543, 1.543, 1.542, 1.544, 1.543, 1.543, 1.541, 1.541, 1.542, 1.546, 1.554, 1.569, 1.585, 1.599, 1.599, 1.593, 1.568, 1.538, 1.533, 1.531, + 1.521, 1.563, 1.596, 1.607, 1.608, 1.607, 1.606, 1.603, 1.589, 1.572, 1.557, 1.548, 1.543, 1.543, 1.544, 1.549, 1.546, 1.544, 1.541, 1.541, 1.542, 1.545, 1.553, 1.568, 1.585, 1.598, 1.598, 1.594, 1.571, 1.541, 1.534, 1.531, + 1.521, 1.566, 1.599, 1.607, 1.608, 1.607, 1.605, 1.603, 1.591, 1.571, 1.556, 1.547, 1.544, 1.544, 1.551, 1.554, 1.552, 1.546, 1.541, 1.541, 1.541, 1.544, 1.553, 1.567, 1.585, 1.597, 1.598, 1.595, 1.571, 1.541, 1.534, 1.531, + 1.523, 1.568, 1.601, 1.607, 1.608, 1.607, 1.606, 1.604, 1.591, 1.572, 1.557, 1.547, 1.545, 1.545, 1.552, 1.566, 1.566, 1.551, 1.542, 1.541, 1.541, 1.544, 1.553, 1.567, 1.586, 1.596, 1.596, 1.593, 1.571, 1.541, 1.533, 1.531, + 1.524, 1.569, 1.602, 1.607, 1.608, 1.607, 1.606, 1.604, 1.591, 1.573, 1.559, 1.548, 1.545, 1.546, 1.552, 1.565, 1.565, 1.551, 1.542, 1.541, 1.541, 1.545, 1.553, 1.568, 1.586, 1.597, 1.597, 1.593, 1.571, 1.541, 1.532, 1.532, + 1.526, 1.571, 1.602, 1.607, 1.608, 1.606, 1.605, 1.604, 1.593, 1.575, 1.559, 1.549, 1.546, 1.546, 1.549, 1.552, 1.552, 1.546, 1.542, 1.541, 1.542, 1.546, 1.555, 1.569, 1.587, 1.597, 1.597, 1.591, 1.569, 1.539, 1.532, 1.531, + 1.526, 1.571, 1.601, 1.608, 1.609, 1.605, 1.605, 1.603, 1.597, 1.579, 1.562, 1.551, 1.546, 1.545, 1.545, 1.549, 1.546, 1.543, 1.542, 1.541, 1.542, 1.547, 1.557, 1.573, 1.588, 1.597, 1.597, 1.589, 1.566, 1.537, 1.531, 1.529, + 1.526, 1.569, 1.602, 1.609, 1.609, 1.606, 1.605, 1.604, 1.598, 1.582, 1.567, 1.553, 1.547, 1.545, 1.544, 1.544, 1.544, 1.542, 1.542, 1.542, 1.544, 1.552, 1.559, 1.576, 1.591, 1.597, 1.597, 1.588, 1.563, 1.535, 1.531, 1.529, + 1.523, 1.567, 1.601, 1.609, 1.609, 1.606, 1.605, 1.603, 1.599, 1.587, 1.571, 1.558, 1.549, 1.545, 1.544, 1.543, 1.543, 1.542, 1.542, 1.544, 1.548, 1.555, 1.566, 1.581, 1.593, 1.597, 1.597, 1.586, 1.558, 1.534, 1.529, 1.529, + 1.523, 1.564, 1.599, 1.609, 1.609, 1.605, 1.604, 1.603, 1.601, 1.592, 1.576, 1.564, 1.553, 1.547, 1.544, 1.543, 1.542, 1.542, 1.544, 1.548, 1.551, 1.561, 1.572, 1.585, 1.594, 1.596, 1.595, 1.581, 1.555, 1.528, 1.527, 1.528, + 1.522, 1.561, 1.595, 1.608, 1.608, 1.604, 1.602, 1.601, 1.601, 1.595, 1.582, 1.569, 1.559, 1.552, 1.547, 1.545, 1.543, 1.544, 1.546, 1.551, 1.556, 1.563, 1.576, 1.589, 1.595, 1.596, 1.593, 1.576, 1.551, 1.524, 1.524, 1.528, + 1.519, 1.559, 1.591, 1.605, 1.606, 1.603, 1.601, 1.599, 1.601, 1.597, 1.587, 1.576, 1.565, 1.558, 1.552, 1.549, 1.546, 1.547, 1.552, 1.556, 1.561, 1.571, 1.582, 1.593, 1.596, 1.596, 1.591, 1.569, 1.546, 1.521, 1.521, 1.527, + 1.516, 1.553, 1.589, 1.602, 1.604, 1.602, 1.599, 1.598, 1.599, 1.598, 1.594, 1.583, 1.572, 1.564, 1.559, 1.553, 1.552, 1.553, 1.556, 1.561, 1.567, 1.578, 1.588, 1.594, 1.596, 1.594, 1.588, 1.567, 1.539, 1.517, 1.517, 1.525, + 1.511, 1.548, 1.581, 1.599, 1.602, 1.602, 1.598, 1.597, 1.597, 1.597, 1.595, 1.589, 1.581, 1.571, 1.564, 1.559, 1.559, 1.558, 1.561, 1.567, 1.575, 1.583, 1.591, 1.593, 1.594, 1.591, 1.581, 1.557, 1.529, 1.514, 1.514, 1.521, + 1.508, 1.541, 1.576, 1.596, 1.601, 1.601, 1.597, 1.595, 1.594, 1.595, 1.595, 1.592, 1.585, 1.579, 1.571, 1.566, 1.566, 1.566, 1.568, 1.575, 1.582, 1.589, 1.592, 1.593, 1.593, 1.589, 1.575, 1.553, 1.523, 1.511, 1.511, 1.517, + 1.505, 1.535, 1.566, 1.591, 1.599, 1.598, 1.596, 1.594, 1.592, 1.592, 1.593, 1.592, 1.589, 1.585, 1.579, 1.575, 1.574, 1.574, 1.577, 1.582, 1.587, 1.591, 1.592, 1.593, 1.592, 1.585, 1.568, 1.541, 1.516, 1.509, 1.509, 1.517, + 1.501, 1.528, 1.559, 1.585, 1.595, 1.597, 1.595, 1.593, 1.589, 1.588, 1.591, 1.591, 1.591, 1.589, 1.586, 1.583, 1.582, 1.582, 1.585, 1.588, 1.589, 1.591, 1.592, 1.593, 1.592, 1.582, 1.561, 1.536, 1.512, 1.509, 1.511, 1.517, + 1.496, 1.521, 1.549, 1.576, 1.588, 1.594, 1.593, 1.589, 1.586, 1.585, 1.586, 1.588, 1.589, 1.588, 1.588, 1.587, 1.587, 1.587, 1.589, 1.589, 1.591, 1.591, 1.592, 1.592, 1.591, 1.575, 1.555, 1.527, 1.508, 1.507, 1.511, 1.519, + 1.495, 1.505, 1.536, 1.563, 1.581, 1.587, 1.588, 1.584, 1.582, 1.578, 1.578, 1.581, 1.583, 1.584, 1.586, 1.587, 1.587, 1.587, 1.588, 1.589, 1.589, 1.591, 1.591, 1.591, 1.584, 1.566, 1.544, 1.518, 1.505, 1.505, 1.509, 1.519, + 1.493, 1.496, 1.522, 1.547, 1.569, 1.581, 1.582, 1.581, 1.577, 1.575, 1.573, 1.575, 1.579, 1.581, 1.583, 1.584, 1.584, 1.585, 1.587, 1.587, 1.588, 1.588, 1.588, 1.585, 1.573, 1.556, 1.532, 1.511, 1.504, 1.504, 1.508, 1.523 + ] + } + ], + "luminance_lut": + [ + 4.461, 4.088, 3.793, 3.651, 3.557, 3.439, 3.248, 2.999, 2.751, 2.527, 2.341, 2.191, 2.069, 1.956, 1.907, 1.907, 1.907, 1.908, 1.946, 2.056, 2.179, 2.328, 2.517, 2.747, 2.998, 3.219, 3.359, 3.436, 3.494, 3.621, 3.906, 4.251, + 4.297, 3.982, 3.747, 3.634, 3.531, 3.373, 3.136, 2.863, 2.608, 2.386, 2.209, 2.075, 1.957, 1.873, 1.817, 1.789, 1.789, 1.813, 1.865, 1.947, 2.066, 2.198, 2.378, 2.605, 2.872, 3.132, 3.322, 3.431, 3.485, 3.577, 3.802, 4.079, + 4.152, 3.905, 3.717, 3.623, 3.499, 3.296, 3.022, 2.735, 2.478, 2.265, 2.094, 1.957, 1.849, 1.763, 1.709, 1.679, 1.679, 1.703, 1.753, 1.837, 1.947, 2.081, 2.253, 2.472, 2.742, 3.032, 3.271, 3.414, 3.479, 3.545, 3.719, 3.937, + 4.039, 3.835, 3.688, 3.596, 3.442, 3.196, 2.899, 2.609, 2.356, 2.153, 1.987, 1.849, 1.748, 1.659, 1.605, 1.577, 1.577, 1.599, 1.649, 1.734, 1.837, 1.973, 2.139, 2.348, 2.612, 2.911, 3.192, 3.379, 3.467, 3.516, 3.649, 3.815, + 3.952, 3.784, 3.669, 3.562, 3.369, 3.088, 2.778, 2.491, 2.246, 2.049, 1.888, 1.748, 1.657, 1.561, 1.509, 1.481, 1.481, 1.504, 1.552, 1.642, 1.734, 1.869, 2.033, 2.233, 2.489, 2.792, 3.105, 3.331, 3.445, 3.493, 3.591, 3.721, + 3.883, 3.741, 3.648, 3.519, 3.287, 2.977, 2.665, 2.382, 2.148, 1.957, 1.796, 1.659, 1.561, 1.474, 1.422, 1.396, 1.396, 1.415, 1.465, 1.552, 1.643, 1.776, 1.936, 2.131, 2.375, 2.678, 3.004, 3.275, 3.416, 3.469, 3.541, 3.643, + 3.829, 3.716, 3.617, 3.466, 3.202, 2.876, 2.558, 2.282, 2.059, 1.872, 1.713, 1.577, 1.474, 1.399, 1.345, 1.319, 1.319, 1.338, 1.389, 1.465, 1.559, 1.689, 1.849, 2.042, 2.275, 2.568, 2.903, 3.204, 3.383, 3.446, 3.496, 3.579, + 3.793, 3.685, 3.589, 3.411, 3.119, 2.781, 2.466, 2.199, 1.983, 1.798, 1.639, 1.505, 1.399, 1.339, 1.276, 1.253, 1.253, 1.271, 1.327, 1.389, 1.487, 1.612, 1.769, 1.961, 2.189, 2.471, 2.806, 3.133, 3.342, 3.425, 3.459, 3.527, + 3.763, 3.666, 3.561, 3.357, 3.042, 2.698, 2.384, 2.129, 1.918, 1.734, 1.575, 1.443, 1.339, 1.276, 1.217, 1.194, 1.194, 1.214, 1.271, 1.327, 1.423, 1.546, 1.702, 1.891, 2.112, 2.386, 2.718, 3.061, 3.301, 3.402, 3.433, 3.486, + 3.745, 3.647, 3.529, 3.302, 2.971, 2.627, 2.318, 2.067, 1.859, 1.677, 1.521, 1.389, 1.287, 1.217, 1.171, 1.145, 1.145, 1.165, 1.214, 1.276, 1.369, 1.491, 1.643, 1.831, 2.048, 2.313, 2.644, 2.995, 3.262, 3.381, 3.412, 3.453, + 3.731, 3.635, 3.503, 3.249, 2.911, 2.566, 2.259, 2.017, 1.811, 1.629, 1.475, 1.347, 1.246, 1.171, 1.138, 1.103, 1.103, 1.129, 1.165, 1.231, 1.322, 1.443, 1.595, 1.779, 1.993, 2.251, 2.576, 2.936, 3.223, 3.359, 3.392, 3.425, + 3.721, 3.625, 3.481, 3.208, 2.861, 2.515, 2.213, 1.976, 1.773, 1.593, 1.439, 1.313, 1.213, 1.138, 1.103, 1.071, 1.071, 1.101, 1.129, 1.194, 1.286, 1.405, 1.555, 1.736, 1.949, 2.202, 2.521, 2.886, 3.189, 3.338, 3.375, 3.406, + 3.716, 3.616, 3.458, 3.171, 2.819, 2.472, 2.176, 1.942, 1.741, 1.563, 1.411, 1.285, 1.186, 1.112, 1.071, 1.051, 1.049, 1.069, 1.103, 1.165, 1.256, 1.376, 1.523, 1.702, 1.913, 2.163, 2.477, 2.843, 3.155, 3.318, 3.358, 3.389, + 3.712, 3.609, 3.439, 3.142, 2.787, 2.443, 2.147, 1.918, 1.721, 1.541, 1.391, 1.266, 1.167, 1.094, 1.051, 1.035, 1.035, 1.049, 1.085, 1.145, 1.236, 1.355, 1.499, 1.676, 1.886, 2.136, 2.449, 2.814, 3.135, 3.307, 3.351, 3.378, + 3.709, 3.604, 3.422, 3.123, 2.768, 2.419, 2.129, 1.903, 1.706, 1.527, 1.377, 1.253, 1.155, 1.083, 1.035, 1.023, 1.023, 1.035, 1.074, 1.134, 1.224, 1.341, 1.484, 1.661, 1.868, 2.117, 2.429, 2.797, 3.122, 3.301, 3.346, 3.374, + 3.711, 3.597, 3.412, 3.114, 2.758, 2.409, 2.119, 1.895, 1.701, 1.523, 1.373, 1.251, 1.153, 1.081, 1.033, 1.001, 1.001, 1.032, 1.073, 1.133, 1.222, 1.338, 1.479, 1.655, 1.861, 2.107, 2.418, 2.787, 3.115, 3.297, 3.343, 3.373, + 3.713, 3.597, 3.412, 3.113, 2.758, 2.409, 2.119, 1.893, 1.698, 1.523, 1.373, 1.251, 1.153, 1.081, 1.034, 1.011, 1.011, 1.032, 1.074, 1.134, 1.222, 1.338, 1.479, 1.655, 1.861, 2.107, 2.418, 2.787, 3.116, 3.294, 3.341, 3.371, + 3.721, 3.599, 3.414, 3.116, 2.763, 2.418, 2.124, 1.895, 1.704, 1.531, 1.382, 1.259, 1.162, 1.091, 1.048, 1.034, 1.032, 1.046, 1.083, 1.145, 1.232, 1.348, 1.491, 1.664, 1.869, 2.115, 2.428, 2.798, 3.123, 3.294, 3.339, 3.372, + 3.727, 3.604, 3.421, 3.132, 2.784, 2.438, 2.141, 1.908, 1.716, 1.547, 1.399, 1.276, 1.178, 1.107, 1.069, 1.048, 1.046, 1.067, 1.101, 1.162, 1.249, 1.366, 1.509, 1.684, 1.886, 2.134, 2.449, 2.821, 3.135, 3.299, 3.341, 3.375, + 3.739, 3.613, 3.431, 3.154, 2.813, 2.468, 2.166, 1.931, 1.739, 1.569, 1.424, 1.302, 1.203, 1.129, 1.098, 1.069, 1.069, 1.096, 1.123, 1.185, 1.274, 1.391, 1.536, 1.709, 1.914, 2.162, 2.481, 2.851, 3.156, 3.311, 3.342, 3.378, + 3.751, 3.626, 3.449, 3.186, 2.855, 2.509, 2.201, 1.961, 1.768, 1.601, 1.454, 1.333, 1.235, 1.159, 1.129, 1.098, 1.098, 1.123, 1.152, 1.216, 1.307, 1.424, 1.569, 1.744, 1.947, 2.202, 2.526, 2.891, 3.182, 3.322, 3.351, 3.387, + 3.772, 3.641, 3.473, 3.221, 2.902, 2.559, 2.248, 1.999, 1.804, 1.639, 1.496, 1.373, 1.274, 1.201, 1.159, 1.133, 1.133, 1.152, 1.191, 1.254, 1.347, 1.466, 1.611, 1.785, 1.989, 2.253, 2.582, 2.939, 3.209, 3.334, 3.361, 3.402, + 3.797, 3.663, 3.496, 3.263, 2.959, 2.624, 2.308, 2.049, 1.847, 1.684, 1.542, 1.422, 1.321, 1.252, 1.201, 1.175, 1.175, 1.191, 1.239, 1.298, 1.394, 1.516, 1.658, 1.831, 2.041, 2.313, 2.651, 2.998, 3.244, 3.351, 3.375, 3.422, + 3.831, 3.686, 3.523, 3.307, 3.023, 2.698, 2.379, 2.112, 1.902, 1.737, 1.596, 1.476, 1.378, 1.315, 1.252, 1.227, 1.227, 1.239, 1.296, 1.355, 1.451, 1.572, 1.715, 1.888, 2.103, 2.386, 2.731, 3.063, 3.279, 3.367, 3.393, 3.456, + 3.871, 3.714, 3.551, 3.355, 3.091, 2.781, 2.465, 2.186, 1.965, 1.795, 1.654, 1.538, 1.442, 1.378, 1.318, 1.291, 1.291, 1.304, 1.355, 1.424, 1.515, 1.634, 1.778, 1.952, 2.178, 2.479, 2.821, 3.129, 3.314, 3.381, 3.419, 3.491, + 3.925, 3.749, 3.582, 3.401, 3.156, 2.866, 2.559, 2.274, 2.039, 1.859, 1.718, 1.604, 1.513, 1.442, 1.389, 1.363, 1.363, 1.379, 1.424, 1.501, 1.586, 1.702, 1.847, 2.028, 2.269, 2.579, 2.913, 3.193, 3.343, 3.396, 3.447, 3.539, + 3.994, 3.794, 3.619, 3.442, 3.231, 2.961, 2.662, 2.375, 2.129, 1.938, 1.789, 1.675, 1.591, 1.513, 1.465, 1.439, 1.439, 1.457, 1.501, 1.582, 1.661, 1.777, 1.925, 2.118, 2.375, 2.691, 3.008, 3.251, 3.371, 3.414, 3.479, 3.598, + 4.082, 3.845, 3.656, 3.489, 3.298, 3.053, 2.771, 2.485, 2.232, 2.028, 1.871, 1.751, 1.672, 1.591, 1.544, 1.521, 1.521, 1.539, 1.582, 1.661, 1.741, 1.859, 2.014, 2.224, 2.495, 2.806, 3.098, 3.301, 3.392, 3.431, 3.518, 3.677, + 4.196, 3.911, 3.698, 3.534, 3.363, 3.146, 2.881, 2.604, 2.348, 2.132, 1.964, 1.836, 1.751, 1.672, 1.628, 1.606, 1.606, 1.624, 1.665, 1.741, 1.827, 1.951, 2.121, 2.344, 2.624, 2.923, 3.177, 3.336, 3.405, 3.447, 3.567, 3.776, + 4.341, 4.002, 3.744, 3.575, 3.415, 3.229, 2.989, 2.729, 2.475, 2.251, 2.071, 1.936, 1.836, 1.759, 1.713, 1.693, 1.693, 1.711, 1.753, 1.827, 1.925, 2.058, 2.243, 2.481, 2.758, 3.027, 3.238, 3.361, 3.409, 3.466, 3.637, 3.896, + 4.516, 4.123, 3.804, 3.621, 3.468, 3.308, 3.096, 2.855, 2.609, 2.385, 2.194, 2.045, 1.936, 1.857, 1.807, 1.784, 1.784, 1.803, 1.852, 1.925, 2.033, 2.183, 2.382, 2.623, 2.886, 3.121, 3.284, 3.372, 3.413, 3.494, 3.727, 4.048, + 4.716, 4.264, 3.875, 3.674, 3.523, 3.376, 3.189, 2.966, 2.733, 2.511, 2.315, 2.158, 2.039, 1.936, 1.875, 1.872, 1.872, 1.872, 1.925, 2.028, 2.148, 2.308, 2.513, 2.751, 2.994, 3.191, 3.319, 3.384, 3.427, 3.541, 3.838, 4.221 + ], + "sigma": 0.00152, + "sigma_Cb": 0.00172 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2868, + "ccm": + [ + 1.58923, -0.36649, -0.22273, + -0.43591, 1.84858, -0.41268, + 0.02948, -0.77666, 1.74718 + ] + }, + { + "ct": 2965, + "ccm": + [ + 1.73397, -0.42794, -0.30603, + -0.36504, 1.72431, -0.35926, + 0.12765, -1.10933, 1.98168 + ] + }, + { + "ct": 3603, + "ccm": + [ + 1.61787, -0.42704, -0.19084, + -0.37819, 1.74588, -0.36769, + 0.00961, -0.59807, 1.58847 + ] + }, + { + "ct": 4620, + "ccm": + [ + 1.55581, -0.35422, -0.20158, + -0.31805, 1.79309, -0.47505, + -0.01256, -0.54489, 1.55746 + ] + }, + { + "ct": 5901, + "ccm": + [ + 1.64439, -0.48855, -0.15585, + -0.29149, 1.67122, -0.37972, + -0.03111, -0.44052, 1.47163 + ] + }, + { + "ct": 7610, + "ccm": + [ + 1.48667, -0.26072, -0.22595, + -0.21815, 1.86724, -0.64909, + -0.00985, -0.64485, 1.65471 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.af": + { + "ranges": + { + "normal": + { + "min": 0.0, + "max": 12.0, + "default": 1.0 + }, + "macro": + { + "min": 4.0, + "max": 32.0, + "default": 6.0 + } + }, + "speeds": + { + "normal": + { + "step_coarse": 2.0, + "step_fine": 0.5, + "contrast_ratio": 0.75, + "pdaf_gain": -0.03, + "pdaf_squelch": 0.2, + "max_slew": 4.0, + "pdaf_frames": 20, + "dropout_frames": 6, + "step_frames": 4 + }, + "fast": + { + "step_coarse": 2.0, + "step_fine": 0.5, + "contrast_ratio": 0.75, + "pdaf_gain": -0.05, + "pdaf_squelch": 0.2, + "max_slew": 5.0, + "pdaf_frames": 16, + "dropout_frames": 6, + "step_frames": 4 + } + }, + "conf_epsilon": 8, + "conf_thresh": 12, + "conf_clip": 512, + "skip_frames": 5, + "map": [ 0.0, 420, 35.0, 920 ] + } + }, + { + "rpi.cac": + { + "strength": 1.0, + "lut_rx": + [ + -0.11, -0.11, -0.17, -0.11, -0.0, 0.08, 0.13, 0.1, 0.1, + -0.07, -0.17, -0.16, -0.08, -0.02, 0.06, 0.15, 0.15, 0.07, + -0.11, -0.21, -0.17, -0.07, -0.02, 0.03, 0.14, 0.17, 0.14, + -0.19, -0.22, -0.16, -0.07, -0.01, 0.03, 0.12, 0.19, 0.21, + -0.19, -0.23, -0.16, -0.06, -0.01, 0.04, 0.13, 0.19, 0.24, + -0.18, -0.22, -0.17, -0.05, -0.01, 0.05, 0.15, 0.2, 0.21, + -0.14, -0.19, -0.17, -0.06, 0.0, 0.07, 0.15, 0.18, 0.15, + -0.09, -0.14, -0.17, -0.08, 0.0, 0.09, 0.15, 0.14, 0.06, + -0.09, -0.08, -0.15, -0.12, -0.0, 0.12, 0.16, 0.07, 0.06 + ], + "lut_ry": + [ + -0.11, -0.11, -0.21, -0.21, -0.19, -0.21, -0.19, -0.11, 0.11, + -0.02, -0.1, -0.14, -0.14, -0.13, -0.14, -0.15, -0.11, 0.03, + -0.03, -0.09, -0.12, -0.12, -0.12, -0.11, -0.12, -0.1, -0.02, + -0.05, -0.07, -0.1, -0.11, -0.11, -0.09, -0.08, -0.07, -0.03, + -0.03, -0.02, -0.04, -0.05, -0.05, -0.05, -0.02, -0.01, -0.02, + 0.01, 0.03, 0.0, -0.02, -0.02, -0.01, 0.02, 0.03, 0.01, + 0.01, 0.06, 0.06, 0.0, -0.01, 0.02, 0.06, 0.06, 0.01, + -0.0, 0.08, 0.12, 0.08, 0.05, 0.08, 0.1, 0.08, -0.0, + 0.11, 0.09, 0.19, 0.19, 0.15, 0.19, 0.18, 0.12, 0.11 + ], + "lut_bx": + [ + -0.3, -0.28, -0.34, -0.19, -0.01, 0.13, 0.27, 0.21, 0.2, + -0.24, -0.38, -0.38, -0.24, -0.02, 0.19, 0.31, 0.34, 0.2, + -0.4, -0.47, -0.44, -0.26, -0.03, 0.21, 0.35, 0.39, 0.38, + -0.52, -0.49, -0.46, -0.27, -0.02, 0.22, 0.38, 0.46, 0.54, + -0.56, -0.51, -0.44, -0.27, -0.02, 0.23, 0.39, 0.47, 0.64, + -0.52, -0.49, -0.43, -0.27, -0.02, 0.21, 0.39, 0.45, 0.59, + -0.39, -0.41, -0.39, -0.26, -0.02, 0.2, 0.37, 0.39, 0.47, + -0.2, -0.34, -0.36, -0.23, -0.03, 0.18, 0.33, 0.28, 0.19, + -0.2, -0.21, -0.32, -0.18, -0.04, 0.14, 0.28, 0.17, 0.2 + ], + "lut_by": + [ + -0.25, -0.23, -0.31, -0.36, -0.41, -0.36, -0.32, -0.19, -0.2, + -0.09, -0.18, -0.27, -0.32, -0.35, -0.31, -0.23, -0.17, 0.01, + -0.13, -0.14, -0.19, -0.2, -0.2, -0.21, -0.17, -0.12, -0.04, + -0.1, -0.06, -0.06, -0.07, -0.05, -0.05, -0.05, -0.04, -0.07, + -0.03, 0.05, 0.06, 0.07, 0.07, 0.08, 0.06, 0.03, -0.05, + 0.03, 0.12, 0.18, 0.19, 0.19, 0.2, 0.17, 0.11, -0.03, + 0.04, 0.22, 0.3, 0.37, 0.42, 0.37, 0.3, 0.21, -0.02, + 0.05, 0.27, 0.39, 0.5, 0.57, 0.51, 0.41, 0.25, -0.09, + 0.25, 0.33, 0.52, 0.65, 0.8, 0.72, 0.56, 0.33, -0.25 + ] + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "power_min": 0.7, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "power_min": 0.7, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/imx708_wide_noir.json b/src/ipa/rpi/pisp/data/imx708_wide_noir.json new file mode 100644 index 000000000..75d1149b6 --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx708_wide_noir.json @@ -0,0 +1,1148 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 41985, + "reference_gain": 1.12, + "reference_aperture": 1.0, + "reference_lux": 810, + "reference_Y": 13859 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.9 + } + }, + { + "rpi.geq": + { + "offset": 206, + "slope": 0.00324 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "bayes": 0 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.65, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 1.717, 1.712, 1.703, 1.692, 1.674, 1.653, 1.638, 1.624, 1.613, 1.601, 1.589, 1.579, 1.575, 1.573, 1.571, 1.571, 1.571, 1.571, 1.572, 1.577, 1.583, 1.593, 1.605, 1.618, 1.636, 1.653, 1.677, 1.699, 1.715, 1.722, 1.731, 1.733, + 1.714, 1.706, 1.696, 1.678, 1.658, 1.639, 1.627, 1.614, 1.602, 1.591, 1.579, 1.572, 1.569, 1.566, 1.565, 1.564, 1.564, 1.565, 1.567, 1.571, 1.578, 1.585, 1.595, 1.607, 1.622, 1.641, 1.661, 1.685, 1.706, 1.717, 1.724, 1.732, + 1.708, 1.698, 1.688, 1.667, 1.647, 1.629, 1.619, 1.606, 1.593, 1.581, 1.572, 1.565, 1.561, 1.559, 1.559, 1.559, 1.559, 1.561, 1.562, 1.566, 1.571, 1.577, 1.587, 1.598, 1.612, 1.629, 1.649, 1.674, 1.697, 1.713, 1.721, 1.728, + 1.706, 1.695, 1.681, 1.655, 1.636, 1.622, 1.613, 1.597, 1.585, 1.572, 1.564, 1.559, 1.558, 1.556, 1.555, 1.555, 1.556, 1.556, 1.558, 1.561, 1.566, 1.571, 1.578, 1.591, 1.605, 1.619, 1.638, 1.662, 1.691, 1.708, 1.719, 1.726, + 1.706, 1.692, 1.675, 1.649, 1.629, 1.615, 1.607, 1.592, 1.575, 1.565, 1.559, 1.554, 1.552, 1.551, 1.551, 1.551, 1.551, 1.552, 1.554, 1.557, 1.561, 1.566, 1.573, 1.582, 1.596, 1.611, 1.627, 1.652, 1.681, 1.705, 1.717, 1.724, + 1.703, 1.686, 1.664, 1.639, 1.625, 1.612, 1.599, 1.585, 1.569, 1.559, 1.554, 1.549, 1.548, 1.548, 1.546, 1.546, 1.546, 1.547, 1.549, 1.553, 1.557, 1.563, 1.569, 1.576, 1.591, 1.603, 1.621, 1.644, 1.674, 1.698, 1.714, 1.724, + 1.702, 1.681, 1.659, 1.635, 1.621, 1.607, 1.594, 1.579, 1.565, 1.554, 1.549, 1.546, 1.544, 1.543, 1.543, 1.542, 1.543, 1.543, 1.544, 1.549, 1.553, 1.558, 1.564, 1.572, 1.584, 1.599, 1.614, 1.639, 1.667, 1.695, 1.712, 1.724, + 1.697, 1.678, 1.655, 1.631, 1.616, 1.602, 1.589, 1.575, 1.559, 1.551, 1.545, 1.543, 1.542, 1.542, 1.541, 1.539, 1.539, 1.539, 1.542, 1.544, 1.551, 1.555, 1.562, 1.571, 1.579, 1.594, 1.611, 1.631, 1.661, 1.691, 1.712, 1.724, + 1.695, 1.674, 1.651, 1.629, 1.615, 1.599, 1.584, 1.568, 1.554, 1.545, 1.542, 1.541, 1.539, 1.539, 1.538, 1.538, 1.538, 1.539, 1.539, 1.543, 1.548, 1.554, 1.559, 1.568, 1.576, 1.592, 1.608, 1.629, 1.655, 1.689, 1.709, 1.723, + 1.691, 1.671, 1.648, 1.627, 1.613, 1.597, 1.581, 1.564, 1.551, 1.543, 1.539, 1.538, 1.538, 1.537, 1.536, 1.535, 1.536, 1.538, 1.539, 1.542, 1.546, 1.551, 1.558, 1.564, 1.575, 1.588, 1.604, 1.627, 1.654, 1.686, 1.709, 1.724, + 1.689, 1.667, 1.643, 1.626, 1.612, 1.594, 1.579, 1.559, 1.549, 1.541, 1.536, 1.535, 1.535, 1.535, 1.534, 1.533, 1.534, 1.536, 1.538, 1.541, 1.545, 1.549, 1.555, 1.563, 1.573, 1.585, 1.602, 1.624, 1.651, 1.683, 1.709, 1.725, + 1.686, 1.665, 1.641, 1.623, 1.609, 1.594, 1.576, 1.559, 1.546, 1.538, 1.535, 1.534, 1.533, 1.532, 1.531, 1.531, 1.532, 1.534, 1.537, 1.539, 1.544, 1.549, 1.554, 1.562, 1.572, 1.585, 1.601, 1.622, 1.651, 1.682, 1.711, 1.726, + 1.686, 1.661, 1.639, 1.623, 1.609, 1.592, 1.574, 1.557, 1.545, 1.537, 1.534, 1.533, 1.532, 1.531, 1.529, 1.528, 1.529, 1.532, 1.537, 1.539, 1.542, 1.548, 1.553, 1.562, 1.571, 1.584, 1.601, 1.621, 1.649, 1.682, 1.711, 1.726, + 1.685, 1.661, 1.638, 1.624, 1.609, 1.592, 1.574, 1.557, 1.544, 1.536, 1.533, 1.532, 1.531, 1.529, 1.527, 1.522, 1.526, 1.531, 1.536, 1.539, 1.542, 1.547, 1.553, 1.562, 1.571, 1.583, 1.601, 1.621, 1.648, 1.682, 1.711, 1.726, + 1.684, 1.658, 1.638, 1.624, 1.611, 1.592, 1.573, 1.556, 1.543, 1.536, 1.532, 1.531, 1.529, 1.528, 1.522, 1.517, 1.519, 1.527, 1.535, 1.539, 1.541, 1.547, 1.553, 1.562, 1.571, 1.583, 1.601, 1.622, 1.647, 1.681, 1.711, 1.727, + 1.681, 1.658, 1.641, 1.624, 1.611, 1.593, 1.573, 1.555, 1.541, 1.535, 1.532, 1.529, 1.529, 1.527, 1.517, 1.506, 1.506, 1.522, 1.534, 1.538, 1.541, 1.546, 1.552, 1.562, 1.569, 1.583, 1.601, 1.622, 1.646, 1.679, 1.709, 1.728, + 1.679, 1.656, 1.639, 1.624, 1.611, 1.595, 1.575, 1.556, 1.541, 1.534, 1.531, 1.529, 1.529, 1.527, 1.517, 1.507, 1.507, 1.522, 1.533, 1.538, 1.539, 1.546, 1.552, 1.561, 1.569, 1.584, 1.601, 1.622, 1.647, 1.681, 1.709, 1.726, + 1.678, 1.656, 1.638, 1.625, 1.612, 1.597, 1.577, 1.557, 1.542, 1.534, 1.529, 1.529, 1.528, 1.527, 1.522, 1.516, 1.519, 1.525, 1.533, 1.537, 1.539, 1.545, 1.552, 1.561, 1.571, 1.584, 1.601, 1.623, 1.649, 1.681, 1.709, 1.726, + 1.679, 1.654, 1.639, 1.626, 1.613, 1.598, 1.578, 1.558, 1.543, 1.534, 1.529, 1.529, 1.529, 1.528, 1.527, 1.522, 1.525, 1.528, 1.533, 1.536, 1.539, 1.546, 1.553, 1.561, 1.571, 1.586, 1.602, 1.623, 1.651, 1.683, 1.712, 1.726, + 1.677, 1.655, 1.641, 1.628, 1.615, 1.599, 1.581, 1.562, 1.545, 1.535, 1.531, 1.529, 1.529, 1.528, 1.527, 1.527, 1.528, 1.531, 1.533, 1.536, 1.539, 1.545, 1.552, 1.561, 1.572, 1.588, 1.607, 1.626, 1.654, 1.686, 1.716, 1.729, + 1.676, 1.655, 1.642, 1.629, 1.617, 1.602, 1.586, 1.564, 1.546, 1.536, 1.531, 1.529, 1.529, 1.529, 1.529, 1.529, 1.529, 1.532, 1.534, 1.536, 1.539, 1.547, 1.553, 1.563, 1.576, 1.591, 1.609, 1.627, 1.655, 1.688, 1.716, 1.729, + 1.676, 1.658, 1.641, 1.631, 1.617, 1.605, 1.588, 1.569, 1.553, 1.539, 1.532, 1.531, 1.529, 1.529, 1.529, 1.529, 1.531, 1.532, 1.534, 1.537, 1.541, 1.547, 1.553, 1.564, 1.578, 1.594, 1.613, 1.632, 1.659, 1.691, 1.717, 1.728, + 1.676, 1.658, 1.642, 1.631, 1.619, 1.608, 1.592, 1.575, 1.556, 1.542, 1.533, 1.531, 1.529, 1.529, 1.529, 1.531, 1.531, 1.532, 1.534, 1.537, 1.542, 1.548, 1.556, 1.567, 1.582, 1.598, 1.616, 1.638, 1.661, 1.693, 1.717, 1.729, + 1.678, 1.661, 1.644, 1.632, 1.621, 1.611, 1.596, 1.579, 1.561, 1.546, 1.536, 1.532, 1.531, 1.531, 1.531, 1.531, 1.532, 1.533, 1.535, 1.538, 1.544, 1.549, 1.559, 1.569, 1.587, 1.604, 1.618, 1.639, 1.669, 1.697, 1.718, 1.731, + 1.679, 1.662, 1.648, 1.635, 1.625, 1.615, 1.602, 1.586, 1.569, 1.552, 1.541, 1.535, 1.532, 1.532, 1.531, 1.532, 1.533, 1.534, 1.537, 1.541, 1.546, 1.552, 1.562, 1.576, 1.592, 1.608, 1.622, 1.647, 1.673, 1.703, 1.721, 1.734, + 1.684, 1.664, 1.649, 1.637, 1.627, 1.618, 1.606, 1.593, 1.576, 1.561, 1.547, 1.539, 1.535, 1.533, 1.533, 1.533, 1.534, 1.536, 1.539, 1.543, 1.549, 1.555, 1.568, 1.583, 1.596, 1.612, 1.629, 1.651, 1.681, 1.706, 1.723, 1.734, + 1.689, 1.669, 1.649, 1.639, 1.629, 1.621, 1.609, 1.597, 1.585, 1.567, 1.554, 1.546, 1.539, 1.536, 1.535, 1.535, 1.537, 1.538, 1.542, 1.546, 1.553, 1.562, 1.572, 1.589, 1.603, 1.619, 1.635, 1.658, 1.686, 1.708, 1.726, 1.736, + 1.692, 1.673, 1.655, 1.644, 1.634, 1.624, 1.614, 1.604, 1.592, 1.577, 1.566, 1.554, 1.546, 1.542, 1.538, 1.538, 1.539, 1.542, 1.546, 1.552, 1.559, 1.568, 1.581, 1.596, 1.609, 1.625, 1.642, 1.664, 1.693, 1.714, 1.727, 1.736, + 1.695, 1.679, 1.662, 1.647, 1.638, 1.631, 1.623, 1.612, 1.601, 1.589, 1.577, 1.565, 1.555, 1.549, 1.546, 1.545, 1.546, 1.548, 1.552, 1.559, 1.568, 1.579, 1.593, 1.604, 1.618, 1.632, 1.648, 1.676, 1.701, 1.718, 1.728, 1.739, + 1.699, 1.684, 1.667, 1.654, 1.644, 1.635, 1.629, 1.621, 1.609, 1.599, 1.589, 1.578, 1.568, 1.559, 1.556, 1.554, 1.554, 1.557, 1.563, 1.569, 1.578, 1.589, 1.599, 1.612, 1.625, 1.641, 1.661, 1.685, 1.707, 1.722, 1.734, 1.742, + 1.703, 1.691, 1.672, 1.658, 1.648, 1.639, 1.634, 1.628, 1.618, 1.606, 1.598, 1.589, 1.579, 1.573, 1.568, 1.567, 1.567, 1.568, 1.571, 1.578, 1.587, 1.597, 1.607, 1.618, 1.632, 1.651, 1.672, 1.694, 1.715, 1.728, 1.737, 1.742, + 1.707, 1.691, 1.676, 1.662, 1.651, 1.643, 1.638, 1.631, 1.622, 1.614, 1.604, 1.596, 1.589, 1.579, 1.575, 1.573, 1.573, 1.574, 1.578, 1.586, 1.589, 1.598, 1.609, 1.625, 1.638, 1.657, 1.679, 1.701, 1.719, 1.728, 1.738, 1.742 + ] + }, + { + "ct": 5000, + "table": + [ + 2.939, 2.935, 2.916, 2.895, 2.856, 2.825, 2.797, 2.777, 2.761, 2.741, 2.726, 2.709, 2.707, 2.704, 2.702, 2.702, 2.703, 2.706, 2.708, 2.709, 2.719, 2.735, 2.753, 2.776, 2.801, 2.832, 2.874, 2.915, 2.939, 2.943, 2.953, 2.961, + 2.936, 2.923, 2.901, 2.863, 2.829, 2.801, 2.781, 2.763, 2.743, 2.732, 2.712, 2.701, 2.696, 2.692, 2.691, 2.691, 2.693, 2.694, 2.696, 2.701, 2.709, 2.725, 2.741, 2.758, 2.779, 2.811, 2.838, 2.879, 2.919, 2.939, 2.948, 2.959, + 2.929, 2.909, 2.887, 2.847, 2.808, 2.783, 2.765, 2.748, 2.732, 2.713, 2.699, 2.691, 2.687, 2.686, 2.685, 2.685, 2.687, 2.689, 2.691, 2.694, 2.701, 2.709, 2.725, 2.745, 2.763, 2.786, 2.818, 2.863, 2.907, 2.933, 2.941, 2.955, + 2.929, 2.903, 2.875, 2.825, 2.791, 2.769, 2.755, 2.737, 2.718, 2.701, 2.688, 2.683, 2.681, 2.679, 2.681, 2.679, 2.681, 2.682, 2.685, 2.689, 2.694, 2.701, 2.711, 2.737, 2.754, 2.772, 2.803, 2.844, 2.894, 2.931, 2.939, 2.953, + 2.926, 2.895, 2.862, 2.816, 2.782, 2.759, 2.744, 2.727, 2.709, 2.691, 2.679, 2.673, 2.671, 2.669, 2.669, 2.669, 2.671, 2.674, 2.678, 2.681, 2.685, 2.694, 2.707, 2.725, 2.739, 2.762, 2.786, 2.829, 2.879, 2.919, 2.942, 2.952, + 2.919, 2.886, 2.846, 2.797, 2.772, 2.751, 2.737, 2.719, 2.694, 2.679, 2.672, 2.666, 2.664, 2.661, 2.659, 2.658, 2.661, 2.664, 2.669, 2.673, 2.678, 2.685, 2.696, 2.715, 2.728, 2.749, 2.774, 2.808, 2.866, 2.909, 2.936, 2.951, + 2.904, 2.877, 2.835, 2.789, 2.763, 2.744, 2.728, 2.712, 2.686, 2.672, 2.664, 2.657, 2.654, 2.654, 2.652, 2.653, 2.654, 2.657, 2.661, 2.666, 2.672, 2.678, 2.688, 2.703, 2.721, 2.742, 2.762, 2.797, 2.851, 2.902, 2.928, 2.949, + 2.901, 2.869, 2.825, 2.781, 2.756, 2.738, 2.721, 2.698, 2.679, 2.665, 2.656, 2.652, 2.649, 2.648, 2.648, 2.648, 2.649, 2.651, 2.654, 2.659, 2.667, 2.675, 2.683, 2.699, 2.711, 2.736, 2.754, 2.789, 2.838, 2.896, 2.926, 2.948, + 2.899, 2.862, 2.815, 2.774, 2.752, 2.734, 2.717, 2.689, 2.669, 2.658, 2.651, 2.646, 2.645, 2.643, 2.643, 2.644, 2.645, 2.646, 2.649, 2.654, 2.661, 2.669, 2.681, 2.693, 2.707, 2.729, 2.751, 2.782, 2.834, 2.887, 2.924, 2.947, + 2.898, 2.853, 2.812, 2.771, 2.751, 2.731, 2.711, 2.686, 2.663, 2.653, 2.646, 2.642, 2.641, 2.642, 2.642, 2.641, 2.641, 2.641, 2.646, 2.651, 2.657, 2.667, 2.678, 2.693, 2.705, 2.728, 2.746, 2.781, 2.829, 2.885, 2.924, 2.951, + 2.896, 2.851, 2.807, 2.771, 2.752, 2.729, 2.709, 2.681, 2.661, 2.649, 2.643, 2.641, 2.639, 2.639, 2.638, 2.636, 2.637, 2.638, 2.644, 2.649, 2.657, 2.666, 2.676, 2.688, 2.705, 2.725, 2.745, 2.777, 2.827, 2.884, 2.927, 2.951, + 2.891, 2.846, 2.803, 2.771, 2.749, 2.728, 2.706, 2.677, 2.658, 2.647, 2.641, 2.637, 2.637, 2.636, 2.636, 2.633, 2.632, 2.635, 2.643, 2.649, 2.656, 2.665, 2.675, 2.688, 2.704, 2.719, 2.744, 2.776, 2.822, 2.881, 2.927, 2.958, + 2.887, 2.841, 2.797, 2.769, 2.749, 2.729, 2.704, 2.674, 2.655, 2.645, 2.638, 2.635, 2.633, 2.632, 2.631, 2.625, 2.627, 2.631, 2.639, 2.649, 2.654, 2.662, 2.673, 2.686, 2.701, 2.718, 2.742, 2.773, 2.822, 2.881, 2.926, 2.958, + 2.883, 2.837, 2.796, 2.769, 2.749, 2.729, 2.701, 2.673, 2.653, 2.641, 2.636, 2.632, 2.631, 2.629, 2.623, 2.612, 2.619, 2.627, 2.637, 2.648, 2.652, 2.659, 2.671, 2.688, 2.699, 2.719, 2.742, 2.774, 2.821, 2.882, 2.927, 2.961, + 2.881, 2.832, 2.795, 2.769, 2.751, 2.729, 2.701, 2.672, 2.652, 2.639, 2.633, 2.631, 2.628, 2.625, 2.611, 2.599, 2.607, 2.619, 2.635, 2.644, 2.652, 2.659, 2.669, 2.686, 2.698, 2.719, 2.743, 2.775, 2.822, 2.881, 2.926, 2.961, + 2.879, 2.829, 2.793, 2.771, 2.751, 2.731, 2.701, 2.672, 2.651, 2.639, 2.632, 2.628, 2.626, 2.621, 2.601, 2.581, 2.581, 2.611, 2.631, 2.642, 2.648, 2.657, 2.669, 2.685, 2.699, 2.721, 2.743, 2.776, 2.819, 2.879, 2.927, 2.961, + 2.876, 2.829, 2.796, 2.773, 2.752, 2.731, 2.705, 2.672, 2.651, 2.637, 2.631, 2.627, 2.625, 2.619, 2.601, 2.581, 2.581, 2.611, 2.629, 2.641, 2.647, 2.658, 2.669, 2.685, 2.697, 2.721, 2.746, 2.777, 2.822, 2.881, 2.929, 2.964, + 2.874, 2.827, 2.796, 2.775, 2.755, 2.733, 2.708, 2.674, 2.649, 2.635, 2.629, 2.626, 2.624, 2.621, 2.609, 2.601, 2.606, 2.615, 2.629, 2.638, 2.645, 2.657, 2.669, 2.682, 2.699, 2.722, 2.747, 2.778, 2.822, 2.881, 2.931, 2.964, + 2.871, 2.827, 2.797, 2.776, 2.761, 2.734, 2.711, 2.679, 2.651, 2.636, 2.628, 2.626, 2.624, 2.621, 2.618, 2.611, 2.614, 2.619, 2.628, 2.639, 2.644, 2.657, 2.668, 2.683, 2.698, 2.723, 2.749, 2.782, 2.824, 2.882, 2.933, 2.965, + 2.869, 2.825, 2.797, 2.777, 2.765, 2.741, 2.718, 2.683, 2.655, 2.638, 2.627, 2.625, 2.624, 2.623, 2.621, 2.618, 2.618, 2.624, 2.629, 2.639, 2.644, 2.657, 2.669, 2.684, 2.701, 2.725, 2.755, 2.782, 2.829, 2.887, 2.937, 2.965, + 2.871, 2.826, 2.799, 2.776, 2.765, 2.744, 2.723, 2.689, 2.659, 2.639, 2.629, 2.626, 2.626, 2.624, 2.624, 2.622, 2.624, 2.627, 2.632, 2.639, 2.646, 2.657, 2.671, 2.687, 2.706, 2.732, 2.757, 2.789, 2.836, 2.893, 2.941, 2.965, + 2.869, 2.831, 2.803, 2.778, 2.766, 2.748, 2.729, 2.697, 2.667, 2.645, 2.632, 2.628, 2.625, 2.625, 2.625, 2.625, 2.627, 2.629, 2.634, 2.638, 2.648, 2.661, 2.673, 2.688, 2.711, 2.741, 2.762, 2.797, 2.843, 2.901, 2.943, 2.964, + 2.872, 2.837, 2.802, 2.781, 2.768, 2.753, 2.734, 2.702, 2.674, 2.647, 2.634, 2.629, 2.626, 2.625, 2.625, 2.627, 2.629, 2.632, 2.635, 2.639, 2.649, 2.663, 2.676, 2.694, 2.719, 2.746, 2.771, 2.799, 2.851, 2.905, 2.947, 2.969, + 2.871, 2.837, 2.805, 2.786, 2.771, 2.755, 2.739, 2.714, 2.685, 2.655, 2.639, 2.631, 2.626, 2.625, 2.626, 2.628, 2.629, 2.632, 2.634, 2.642, 2.651, 2.663, 2.679, 2.701, 2.726, 2.756, 2.773, 2.809, 2.861, 2.913, 2.949, 2.968, + 2.876, 2.841, 2.808, 2.789, 2.775, 2.759, 2.744, 2.719, 2.693, 2.664, 2.648, 2.636, 2.629, 2.627, 2.627, 2.629, 2.631, 2.633, 2.637, 2.645, 2.653, 2.666, 2.682, 2.708, 2.734, 2.759, 2.779, 2.815, 2.868, 2.918, 2.951, 2.971, + 2.882, 2.845, 2.816, 2.791, 2.778, 2.766, 2.748, 2.733, 2.707, 2.681, 2.656, 2.643, 2.636, 2.632, 2.631, 2.632, 2.633, 2.637, 2.643, 2.648, 2.659, 2.672, 2.691, 2.719, 2.747, 2.765, 2.791, 2.829, 2.881, 2.931, 2.952, 2.969, + 2.889, 2.855, 2.819, 2.799, 2.782, 2.769, 2.755, 2.741, 2.717, 2.691, 2.672, 2.652, 2.643, 2.639, 2.636, 2.636, 2.638, 2.642, 2.646, 2.655, 2.665, 2.682, 2.703, 2.729, 2.752, 2.774, 2.798, 2.839, 2.891, 2.933, 2.959, 2.975, + 2.897, 2.862, 2.829, 2.804, 2.789, 2.776, 2.764, 2.749, 2.734, 2.709, 2.689, 2.669, 2.652, 2.644, 2.642, 2.642, 2.644, 2.647, 2.654, 2.664, 2.677, 2.694, 2.714, 2.742, 2.764, 2.782, 2.809, 2.852, 2.899, 2.936, 2.961, 2.976, + 2.902, 2.869, 2.841, 2.811, 2.797, 2.785, 2.776, 2.761, 2.748, 2.727, 2.708, 2.689, 2.671, 2.659, 2.655, 2.654, 2.653, 2.656, 2.666, 2.678, 2.693, 2.713, 2.737, 2.756, 2.775, 2.798, 2.825, 2.871, 2.913, 2.944, 2.966, 2.979, + 2.911, 2.885, 2.848, 2.821, 2.804, 2.793, 2.784, 2.774, 2.759, 2.747, 2.726, 2.709, 2.692, 2.679, 2.673, 2.672, 2.671, 2.672, 2.681, 2.694, 2.712, 2.729, 2.749, 2.768, 2.789, 2.811, 2.844, 2.886, 2.928, 2.956, 2.971, 2.984, + 2.925, 2.893, 2.861, 2.831, 2.813, 2.802, 2.795, 2.783, 2.773, 2.759, 2.744, 2.729, 2.715, 2.701, 2.698, 2.694, 2.693, 2.694, 2.702, 2.714, 2.729, 2.747, 2.761, 2.781, 2.802, 2.828, 2.864, 2.907, 2.942, 2.967, 2.978, 2.989, + 2.932, 2.898, 2.871, 2.843, 2.823, 2.811, 2.802, 2.794, 2.779, 2.772, 2.757, 2.742, 2.729, 2.716, 2.705, 2.704, 2.704, 2.707, 2.715, 2.727, 2.737, 2.754, 2.769, 2.788, 2.812, 2.845, 2.878, 2.923, 2.962, 2.973, 2.979, 2.994 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 3.018, 3.021, 3.026, 3.052, 3.092, 3.143, 3.181, 3.202, 3.209, 3.212, 3.211, 3.209, 3.197, 3.193, 3.185, 3.184, 3.185, 3.187, 3.191, 3.202, 3.211, 3.213, 3.212, 3.203, 3.189, 3.147, 3.099, 3.051, 3.032, 3.031, 3.048, 3.054, + 3.019, 3.023, 3.033, 3.066, 3.123, 3.163, 3.196, 3.206, 3.212, 3.212, 3.211, 3.203, 3.193, 3.179, 3.168, 3.159, 3.159, 3.163, 3.174, 3.188, 3.203, 3.208, 3.211, 3.209, 3.195, 3.168, 3.114, 3.064, 3.035, 3.033, 3.044, 3.051, + 3.021, 3.028, 3.046, 3.099, 3.156, 3.192, 3.209, 3.215, 3.216, 3.213, 3.203, 3.193, 3.176, 3.159, 3.153, 3.151, 3.149, 3.152, 3.159, 3.171, 3.188, 3.201, 3.209, 3.211, 3.207, 3.189, 3.142, 3.083, 3.042, 3.038, 3.043, 3.046, + 3.022, 3.037, 3.065, 3.124, 3.178, 3.206, 3.215, 3.221, 3.218, 3.217, 3.198, 3.179, 3.162, 3.149, 3.138, 3.133, 3.133, 3.136, 3.145, 3.156, 3.174, 3.192, 3.206, 3.215, 3.214, 3.202, 3.159, 3.105, 3.058, 3.042, 3.043, 3.049, + 3.024, 3.047, 3.084, 3.151, 3.195, 3.211, 3.219, 3.223, 3.218, 3.208, 3.182, 3.164, 3.149, 3.137, 3.127, 3.119, 3.119, 3.124, 3.134, 3.144, 3.157, 3.178, 3.194, 3.213, 3.215, 3.208, 3.166, 3.124, 3.074, 3.044, 3.044, 3.049, + 3.023, 3.058, 3.102, 3.161, 3.201, 3.217, 3.224, 3.223, 3.217, 3.195, 3.174, 3.156, 3.137, 3.125, 3.115, 3.109, 3.109, 3.115, 3.121, 3.131, 3.146, 3.159, 3.186, 3.208, 3.213, 3.211, 3.181, 3.138, 3.084, 3.047, 3.047, 3.049, + 3.031, 3.063, 3.126, 3.183, 3.212, 3.224, 3.225, 3.224, 3.216, 3.191, 3.167, 3.143, 3.129, 3.115, 3.105, 3.103, 3.103, 3.107, 3.114, 3.121, 3.131, 3.148, 3.169, 3.199, 3.211, 3.209, 3.186, 3.151, 3.089, 3.051, 3.049, 3.052, + 3.033, 3.083, 3.141, 3.201, 3.221, 3.226, 3.226, 3.224, 3.212, 3.187, 3.159, 3.138, 3.119, 3.107, 3.101, 3.098, 3.098, 3.102, 3.107, 3.115, 3.124, 3.138, 3.161, 3.185, 3.207, 3.209, 3.197, 3.162, 3.112, 3.059, 3.056, 3.057, + 3.038, 3.092, 3.159, 3.212, 3.225, 3.231, 3.228, 3.224, 3.209, 3.181, 3.152, 3.129, 3.112, 3.103, 3.095, 3.092, 3.093, 3.095, 3.101, 3.108, 3.118, 3.133, 3.152, 3.179, 3.203, 3.209, 3.205, 3.174, 3.124, 3.069, 3.059, 3.058, + 3.049, 3.105, 3.176, 3.223, 3.229, 3.231, 3.229, 3.223, 3.206, 3.171, 3.147, 3.125, 3.109, 3.097, 3.091, 3.089, 3.088, 3.091, 3.094, 3.102, 3.111, 3.124, 3.143, 3.169, 3.196, 3.208, 3.207, 3.181, 3.132, 3.079, 3.064, 3.063, + 3.055, 3.123, 3.189, 3.226, 3.232, 3.232, 3.229, 3.225, 3.204, 3.169, 3.143, 3.122, 3.108, 3.095, 3.092, 3.089, 3.088, 3.088, 3.092, 3.095, 3.105, 3.117, 3.135, 3.159, 3.191, 3.208, 3.208, 3.189, 3.141, 3.084, 3.064, 3.062, + 3.057, 3.127, 3.198, 3.228, 3.233, 3.233, 3.229, 3.225, 3.201, 3.166, 3.139, 3.119, 3.106, 3.096, 3.093, 3.092, 3.088, 3.088, 3.089, 3.093, 3.099, 3.114, 3.129, 3.156, 3.186, 3.208, 3.208, 3.195, 3.143, 3.089, 3.065, 3.064, + 3.066, 3.142, 3.209, 3.232, 3.234, 3.233, 3.231, 3.226, 3.198, 3.166, 3.138, 3.117, 3.103, 3.097, 3.095, 3.095, 3.094, 3.089, 3.089, 3.092, 3.097, 3.109, 3.126, 3.155, 3.183, 3.207, 3.207, 3.198, 3.147, 3.091, 3.069, 3.065, + 3.072, 3.153, 3.216, 3.231, 3.234, 3.234, 3.229, 3.226, 3.194, 3.165, 3.136, 3.114, 3.101, 3.098, 3.098, 3.104, 3.098, 3.091, 3.088, 3.089, 3.093, 3.103, 3.123, 3.151, 3.181, 3.204, 3.204, 3.197, 3.156, 3.095, 3.069, 3.068, + 3.079, 3.159, 3.222, 3.233, 3.236, 3.235, 3.231, 3.226, 3.194, 3.165, 3.133, 3.112, 3.102, 3.099, 3.107, 3.114, 3.111, 3.097, 3.089, 3.089, 3.091, 3.099, 3.121, 3.149, 3.182, 3.202, 3.202, 3.195, 3.156, 3.096, 3.069, 3.068, + 3.081, 3.164, 3.226, 3.233, 3.236, 3.235, 3.233, 3.229, 3.199, 3.165, 3.137, 3.113, 3.102, 3.102, 3.111, 3.134, 3.134, 3.103, 3.091, 3.089, 3.092, 3.101, 3.119, 3.147, 3.182, 3.202, 3.202, 3.194, 3.155, 3.095, 3.069, 3.067, + 3.085, 3.163, 3.225, 3.236, 3.239, 3.235, 3.234, 3.231, 3.203, 3.169, 3.141, 3.115, 3.103, 3.103, 3.111, 3.134, 3.134, 3.106, 3.092, 3.091, 3.093, 3.103, 3.119, 3.149, 3.185, 3.203, 3.203, 3.193, 3.152, 3.095, 3.068, 3.066, + 3.083, 3.168, 3.226, 3.236, 3.241, 3.235, 3.235, 3.231, 3.205, 3.174, 3.144, 3.117, 3.107, 3.103, 3.107, 3.116, 3.109, 3.103, 3.091, 3.091, 3.095, 3.107, 3.123, 3.152, 3.188, 3.204, 3.204, 3.193, 3.151, 3.095, 3.069, 3.066, + 3.082, 3.171, 3.228, 3.237, 3.239, 3.235, 3.234, 3.233, 3.217, 3.184, 3.147, 3.119, 3.108, 3.104, 3.103, 3.105, 3.102, 3.095, 3.091, 3.091, 3.097, 3.111, 3.128, 3.157, 3.191, 3.204, 3.204, 3.185, 3.149, 3.094, 3.069, 3.065, + 3.086, 3.173, 3.226, 3.237, 3.239, 3.235, 3.234, 3.232, 3.221, 3.185, 3.155, 3.124, 3.112, 3.105, 3.102, 3.099, 3.096, 3.094, 3.092, 3.094, 3.102, 3.114, 3.133, 3.163, 3.197, 3.205, 3.204, 3.183, 3.144, 3.089, 3.068, 3.065, + 3.086, 3.166, 3.225, 3.239, 3.239, 3.237, 3.233, 3.231, 3.223, 3.193, 3.165, 3.135, 3.118, 3.108, 3.101, 3.098, 3.095, 3.093, 3.093, 3.099, 3.109, 3.124, 3.145, 3.174, 3.199, 3.204, 3.203, 3.181, 3.132, 3.085, 3.067, 3.062, + 3.086, 3.162, 3.224, 3.239, 3.241, 3.236, 3.232, 3.229, 3.224, 3.201, 3.174, 3.147, 3.128, 3.114, 3.103, 3.099, 3.096, 3.095, 3.097, 3.106, 3.116, 3.134, 3.151, 3.182, 3.201, 3.203, 3.201, 3.176, 3.125, 3.078, 3.065, 3.061, + 3.077, 3.162, 3.221, 3.239, 3.241, 3.234, 3.229, 3.227, 3.225, 3.207, 3.186, 3.161, 3.137, 3.122, 3.112, 3.102, 3.099, 3.098, 3.106, 3.113, 3.127, 3.139, 3.159, 3.192, 3.204, 3.205, 3.198, 3.167, 3.119, 3.073, 3.062, 3.061, + 3.077, 3.161, 3.216, 3.234, 3.236, 3.232, 3.225, 3.225, 3.222, 3.209, 3.194, 3.172, 3.148, 3.132, 3.121, 3.113, 3.107, 3.107, 3.112, 3.124, 3.135, 3.151, 3.175, 3.196, 3.201, 3.201, 3.191, 3.161, 3.114, 3.062, 3.058, 3.057, + 3.073, 3.139, 3.201, 3.227, 3.232, 3.227, 3.223, 3.219, 3.216, 3.212, 3.203, 3.181, 3.161, 3.142, 3.129, 3.121, 3.114, 3.114, 3.124, 3.134, 3.145, 3.161, 3.179, 3.196, 3.199, 3.195, 3.182, 3.145, 3.093, 3.052, 3.051, 3.052, + 3.066, 3.126, 3.192, 3.218, 3.224, 3.221, 3.218, 3.214, 3.214, 3.209, 3.204, 3.191, 3.174, 3.155, 3.142, 3.129, 3.127, 3.127, 3.136, 3.145, 3.157, 3.175, 3.187, 3.194, 3.196, 3.192, 3.171, 3.134, 3.082, 3.043, 3.042, 3.044, + 3.056, 3.114, 3.176, 3.212, 3.219, 3.219, 3.214, 3.209, 3.208, 3.206, 3.203, 3.198, 3.182, 3.171, 3.155, 3.146, 3.144, 3.144, 3.148, 3.156, 3.171, 3.181, 3.188, 3.194, 3.194, 3.187, 3.161, 3.117, 3.066, 3.037, 3.037, 3.044, + 3.054, 3.101, 3.162, 3.203, 3.216, 3.215, 3.211, 3.206, 3.203, 3.201, 3.199, 3.197, 3.191, 3.179, 3.171, 3.161, 3.156, 3.156, 3.161, 3.171, 3.179, 3.184, 3.189, 3.192, 3.191, 3.181, 3.142, 3.097, 3.045, 3.032, 3.033, 3.039, + 3.041, 3.093, 3.149, 3.194, 3.208, 3.211, 3.208, 3.202, 3.197, 3.197, 3.197, 3.195, 3.191, 3.189, 3.181, 3.176, 3.172, 3.173, 3.178, 3.181, 3.185, 3.187, 3.189, 3.191, 3.189, 3.173, 3.133, 3.085, 3.034, 3.029, 3.031, 3.038, + 3.032, 3.079, 3.133, 3.181, 3.197, 3.207, 3.204, 3.198, 3.193, 3.192, 3.189, 3.191, 3.189, 3.187, 3.185, 3.183, 3.183, 3.183, 3.185, 3.188, 3.187, 3.188, 3.189, 3.188, 3.184, 3.164, 3.118, 3.075, 3.031, 3.026, 3.028, 3.039, + 3.025, 3.051, 3.099, 3.149, 3.182, 3.193, 3.193, 3.187, 3.181, 3.178, 3.177, 3.177, 3.182, 3.183, 3.183, 3.183, 3.183, 3.184, 3.187, 3.188, 3.186, 3.184, 3.184, 3.181, 3.167, 3.139, 3.098, 3.053, 3.026, 3.024, 3.029, 3.043, + 3.016, 3.025, 3.081, 3.122, 3.167, 3.182, 3.185, 3.181, 3.176, 3.171, 3.169, 3.171, 3.174, 3.175, 3.178, 3.178, 3.179, 3.181, 3.185, 3.185, 3.181, 3.179, 3.177, 3.173, 3.151, 3.119, 3.076, 3.031, 3.021, 3.018, 3.024, 3.046 + ] + }, + { + "ct": 5000, + "table": + [ + 1.503, 1.503, 1.504, 1.515, 1.541, 1.566, 1.587, 1.599, 1.602, 1.603, 1.602, 1.599, 1.595, 1.589, 1.587, 1.586, 1.586, 1.587, 1.589, 1.594, 1.601, 1.604, 1.604, 1.601, 1.589, 1.571, 1.541, 1.517, 1.512, 1.512, 1.522, 1.526, + 1.501, 1.502, 1.506, 1.523, 1.557, 1.579, 1.596, 1.603, 1.603, 1.603, 1.601, 1.597, 1.591, 1.582, 1.576, 1.575, 1.574, 1.577, 1.581, 1.588, 1.595, 1.601, 1.603, 1.602, 1.597, 1.578, 1.553, 1.526, 1.512, 1.512, 1.519, 1.526, + 1.499, 1.503, 1.512, 1.539, 1.571, 1.593, 1.603, 1.604, 1.604, 1.602, 1.597, 1.591, 1.581, 1.573, 1.568, 1.566, 1.566, 1.568, 1.572, 1.579, 1.587, 1.594, 1.602, 1.603, 1.601, 1.589, 1.566, 1.536, 1.517, 1.516, 1.519, 1.525, + 1.499, 1.505, 1.521, 1.553, 1.582, 1.597, 1.604, 1.604, 1.604, 1.601, 1.592, 1.582, 1.573, 1.564, 1.561, 1.558, 1.557, 1.559, 1.564, 1.571, 1.579, 1.588, 1.597, 1.603, 1.603, 1.596, 1.576, 1.545, 1.519, 1.517, 1.518, 1.526, + 1.499, 1.509, 1.529, 1.565, 1.591, 1.601, 1.605, 1.604, 1.602, 1.597, 1.586, 1.573, 1.565, 1.558, 1.553, 1.551, 1.551, 1.552, 1.555, 1.563, 1.571, 1.581, 1.592, 1.601, 1.602, 1.599, 1.582, 1.556, 1.528, 1.517, 1.517, 1.526, + 1.501, 1.512, 1.539, 1.576, 1.595, 1.603, 1.605, 1.604, 1.601, 1.591, 1.579, 1.567, 1.559, 1.552, 1.548, 1.545, 1.546, 1.548, 1.551, 1.555, 1.563, 1.574, 1.585, 1.598, 1.602, 1.601, 1.589, 1.562, 1.535, 1.519, 1.519, 1.528, + 1.501, 1.517, 1.552, 1.587, 1.601, 1.605, 1.605, 1.605, 1.599, 1.588, 1.574, 1.562, 1.553, 1.548, 1.544, 1.543, 1.543, 1.545, 1.547, 1.551, 1.557, 1.567, 1.578, 1.593, 1.601, 1.601, 1.592, 1.571, 1.539, 1.521, 1.521, 1.529, + 1.503, 1.524, 1.561, 1.593, 1.605, 1.606, 1.605, 1.603, 1.598, 1.585, 1.569, 1.558, 1.551, 1.545, 1.542, 1.541, 1.541, 1.542, 1.545, 1.547, 1.555, 1.561, 1.573, 1.587, 1.598, 1.601, 1.596, 1.577, 1.546, 1.523, 1.523, 1.529, + 1.503, 1.532, 1.568, 1.597, 1.605, 1.606, 1.605, 1.603, 1.596, 1.581, 1.565, 1.555, 1.548, 1.544, 1.541, 1.539, 1.541, 1.541, 1.543, 1.546, 1.549, 1.558, 1.568, 1.583, 1.595, 1.601, 1.599, 1.582, 1.555, 1.525, 1.525, 1.531, + 1.508, 1.539, 1.575, 1.601, 1.605, 1.606, 1.605, 1.602, 1.593, 1.577, 1.563, 1.552, 1.546, 1.543, 1.541, 1.539, 1.539, 1.541, 1.542, 1.544, 1.548, 1.553, 1.564, 1.579, 1.592, 1.599, 1.599, 1.585, 1.559, 1.532, 1.531, 1.531, + 1.511, 1.544, 1.581, 1.603, 1.606, 1.606, 1.604, 1.603, 1.591, 1.574, 1.561, 1.549, 1.545, 1.542, 1.541, 1.541, 1.541, 1.541, 1.542, 1.543, 1.545, 1.551, 1.561, 1.573, 1.591, 1.599, 1.599, 1.588, 1.563, 1.535, 1.531, 1.531, + 1.515, 1.548, 1.589, 1.605, 1.607, 1.607, 1.604, 1.602, 1.591, 1.573, 1.559, 1.549, 1.543, 1.542, 1.541, 1.542, 1.542, 1.542, 1.541, 1.542, 1.543, 1.549, 1.558, 1.571, 1.588, 1.599, 1.599, 1.591, 1.566, 1.537, 1.532, 1.531, + 1.517, 1.558, 1.593, 1.606, 1.607, 1.607, 1.605, 1.602, 1.589, 1.572, 1.557, 1.548, 1.543, 1.543, 1.542, 1.544, 1.543, 1.543, 1.541, 1.541, 1.542, 1.546, 1.554, 1.569, 1.585, 1.599, 1.599, 1.593, 1.568, 1.538, 1.533, 1.531, + 1.521, 1.563, 1.596, 1.607, 1.608, 1.607, 1.606, 1.603, 1.589, 1.572, 1.557, 1.548, 1.543, 1.543, 1.544, 1.549, 1.546, 1.544, 1.541, 1.541, 1.542, 1.545, 1.553, 1.568, 1.585, 1.598, 1.598, 1.594, 1.571, 1.541, 1.534, 1.531, + 1.521, 1.566, 1.599, 1.607, 1.608, 1.607, 1.605, 1.603, 1.591, 1.571, 1.556, 1.547, 1.544, 1.544, 1.551, 1.554, 1.552, 1.546, 1.541, 1.541, 1.541, 1.544, 1.553, 1.567, 1.585, 1.597, 1.598, 1.595, 1.571, 1.541, 1.534, 1.531, + 1.523, 1.568, 1.601, 1.607, 1.608, 1.607, 1.606, 1.604, 1.591, 1.572, 1.557, 1.547, 1.545, 1.545, 1.552, 1.566, 1.566, 1.551, 1.542, 1.541, 1.541, 1.544, 1.553, 1.567, 1.586, 1.596, 1.596, 1.593, 1.571, 1.541, 1.533, 1.531, + 1.524, 1.569, 1.602, 1.607, 1.608, 1.607, 1.606, 1.604, 1.591, 1.573, 1.559, 1.548, 1.545, 1.546, 1.552, 1.565, 1.565, 1.551, 1.542, 1.541, 1.541, 1.545, 1.553, 1.568, 1.586, 1.597, 1.597, 1.593, 1.571, 1.541, 1.532, 1.532, + 1.526, 1.571, 1.602, 1.607, 1.608, 1.606, 1.605, 1.604, 1.593, 1.575, 1.559, 1.549, 1.546, 1.546, 1.549, 1.552, 1.552, 1.546, 1.542, 1.541, 1.542, 1.546, 1.555, 1.569, 1.587, 1.597, 1.597, 1.591, 1.569, 1.539, 1.532, 1.531, + 1.526, 1.571, 1.601, 1.608, 1.609, 1.605, 1.605, 1.603, 1.597, 1.579, 1.562, 1.551, 1.546, 1.545, 1.545, 1.549, 1.546, 1.543, 1.542, 1.541, 1.542, 1.547, 1.557, 1.573, 1.588, 1.597, 1.597, 1.589, 1.566, 1.537, 1.531, 1.529, + 1.526, 1.569, 1.602, 1.609, 1.609, 1.606, 1.605, 1.604, 1.598, 1.582, 1.567, 1.553, 1.547, 1.545, 1.544, 1.544, 1.544, 1.542, 1.542, 1.542, 1.544, 1.552, 1.559, 1.576, 1.591, 1.597, 1.597, 1.588, 1.563, 1.535, 1.531, 1.529, + 1.523, 1.567, 1.601, 1.609, 1.609, 1.606, 1.605, 1.603, 1.599, 1.587, 1.571, 1.558, 1.549, 1.545, 1.544, 1.543, 1.543, 1.542, 1.542, 1.544, 1.548, 1.555, 1.566, 1.581, 1.593, 1.597, 1.597, 1.586, 1.558, 1.534, 1.529, 1.529, + 1.523, 1.564, 1.599, 1.609, 1.609, 1.605, 1.604, 1.603, 1.601, 1.592, 1.576, 1.564, 1.553, 1.547, 1.544, 1.543, 1.542, 1.542, 1.544, 1.548, 1.551, 1.561, 1.572, 1.585, 1.594, 1.596, 1.595, 1.581, 1.555, 1.528, 1.527, 1.528, + 1.522, 1.561, 1.595, 1.608, 1.608, 1.604, 1.602, 1.601, 1.601, 1.595, 1.582, 1.569, 1.559, 1.552, 1.547, 1.545, 1.543, 1.544, 1.546, 1.551, 1.556, 1.563, 1.576, 1.589, 1.595, 1.596, 1.593, 1.576, 1.551, 1.524, 1.524, 1.528, + 1.519, 1.559, 1.591, 1.605, 1.606, 1.603, 1.601, 1.599, 1.601, 1.597, 1.587, 1.576, 1.565, 1.558, 1.552, 1.549, 1.546, 1.547, 1.552, 1.556, 1.561, 1.571, 1.582, 1.593, 1.596, 1.596, 1.591, 1.569, 1.546, 1.521, 1.521, 1.527, + 1.516, 1.553, 1.589, 1.602, 1.604, 1.602, 1.599, 1.598, 1.599, 1.598, 1.594, 1.583, 1.572, 1.564, 1.559, 1.553, 1.552, 1.553, 1.556, 1.561, 1.567, 1.578, 1.588, 1.594, 1.596, 1.594, 1.588, 1.567, 1.539, 1.517, 1.517, 1.525, + 1.511, 1.548, 1.581, 1.599, 1.602, 1.602, 1.598, 1.597, 1.597, 1.597, 1.595, 1.589, 1.581, 1.571, 1.564, 1.559, 1.559, 1.558, 1.561, 1.567, 1.575, 1.583, 1.591, 1.593, 1.594, 1.591, 1.581, 1.557, 1.529, 1.514, 1.514, 1.521, + 1.508, 1.541, 1.576, 1.596, 1.601, 1.601, 1.597, 1.595, 1.594, 1.595, 1.595, 1.592, 1.585, 1.579, 1.571, 1.566, 1.566, 1.566, 1.568, 1.575, 1.582, 1.589, 1.592, 1.593, 1.593, 1.589, 1.575, 1.553, 1.523, 1.511, 1.511, 1.517, + 1.505, 1.535, 1.566, 1.591, 1.599, 1.598, 1.596, 1.594, 1.592, 1.592, 1.593, 1.592, 1.589, 1.585, 1.579, 1.575, 1.574, 1.574, 1.577, 1.582, 1.587, 1.591, 1.592, 1.593, 1.592, 1.585, 1.568, 1.541, 1.516, 1.509, 1.509, 1.517, + 1.501, 1.528, 1.559, 1.585, 1.595, 1.597, 1.595, 1.593, 1.589, 1.588, 1.591, 1.591, 1.591, 1.589, 1.586, 1.583, 1.582, 1.582, 1.585, 1.588, 1.589, 1.591, 1.592, 1.593, 1.592, 1.582, 1.561, 1.536, 1.512, 1.509, 1.511, 1.517, + 1.496, 1.521, 1.549, 1.576, 1.588, 1.594, 1.593, 1.589, 1.586, 1.585, 1.586, 1.588, 1.589, 1.588, 1.588, 1.587, 1.587, 1.587, 1.589, 1.589, 1.591, 1.591, 1.592, 1.592, 1.591, 1.575, 1.555, 1.527, 1.508, 1.507, 1.511, 1.519, + 1.495, 1.505, 1.536, 1.563, 1.581, 1.587, 1.588, 1.584, 1.582, 1.578, 1.578, 1.581, 1.583, 1.584, 1.586, 1.587, 1.587, 1.587, 1.588, 1.589, 1.589, 1.591, 1.591, 1.591, 1.584, 1.566, 1.544, 1.518, 1.505, 1.505, 1.509, 1.519, + 1.493, 1.496, 1.522, 1.547, 1.569, 1.581, 1.582, 1.581, 1.577, 1.575, 1.573, 1.575, 1.579, 1.581, 1.583, 1.584, 1.584, 1.585, 1.587, 1.587, 1.588, 1.588, 1.588, 1.585, 1.573, 1.556, 1.532, 1.511, 1.504, 1.504, 1.508, 1.523 + ] + } + ], + "luminance_lut": + [ + 4.461, 4.088, 3.793, 3.651, 3.557, 3.439, 3.248, 2.999, 2.751, 2.527, 2.341, 2.191, 2.069, 1.956, 1.907, 1.907, 1.907, 1.908, 1.946, 2.056, 2.179, 2.328, 2.517, 2.747, 2.998, 3.219, 3.359, 3.436, 3.494, 3.621, 3.906, 4.251, + 4.297, 3.982, 3.747, 3.634, 3.531, 3.373, 3.136, 2.863, 2.608, 2.386, 2.209, 2.075, 1.957, 1.873, 1.817, 1.789, 1.789, 1.813, 1.865, 1.947, 2.066, 2.198, 2.378, 2.605, 2.872, 3.132, 3.322, 3.431, 3.485, 3.577, 3.802, 4.079, + 4.152, 3.905, 3.717, 3.623, 3.499, 3.296, 3.022, 2.735, 2.478, 2.265, 2.094, 1.957, 1.849, 1.763, 1.709, 1.679, 1.679, 1.703, 1.753, 1.837, 1.947, 2.081, 2.253, 2.472, 2.742, 3.032, 3.271, 3.414, 3.479, 3.545, 3.719, 3.937, + 4.039, 3.835, 3.688, 3.596, 3.442, 3.196, 2.899, 2.609, 2.356, 2.153, 1.987, 1.849, 1.748, 1.659, 1.605, 1.577, 1.577, 1.599, 1.649, 1.734, 1.837, 1.973, 2.139, 2.348, 2.612, 2.911, 3.192, 3.379, 3.467, 3.516, 3.649, 3.815, + 3.952, 3.784, 3.669, 3.562, 3.369, 3.088, 2.778, 2.491, 2.246, 2.049, 1.888, 1.748, 1.657, 1.561, 1.509, 1.481, 1.481, 1.504, 1.552, 1.642, 1.734, 1.869, 2.033, 2.233, 2.489, 2.792, 3.105, 3.331, 3.445, 3.493, 3.591, 3.721, + 3.883, 3.741, 3.648, 3.519, 3.287, 2.977, 2.665, 2.382, 2.148, 1.957, 1.796, 1.659, 1.561, 1.474, 1.422, 1.396, 1.396, 1.415, 1.465, 1.552, 1.643, 1.776, 1.936, 2.131, 2.375, 2.678, 3.004, 3.275, 3.416, 3.469, 3.541, 3.643, + 3.829, 3.716, 3.617, 3.466, 3.202, 2.876, 2.558, 2.282, 2.059, 1.872, 1.713, 1.577, 1.474, 1.399, 1.345, 1.319, 1.319, 1.338, 1.389, 1.465, 1.559, 1.689, 1.849, 2.042, 2.275, 2.568, 2.903, 3.204, 3.383, 3.446, 3.496, 3.579, + 3.793, 3.685, 3.589, 3.411, 3.119, 2.781, 2.466, 2.199, 1.983, 1.798, 1.639, 1.505, 1.399, 1.339, 1.276, 1.253, 1.253, 1.271, 1.327, 1.389, 1.487, 1.612, 1.769, 1.961, 2.189, 2.471, 2.806, 3.133, 3.342, 3.425, 3.459, 3.527, + 3.763, 3.666, 3.561, 3.357, 3.042, 2.698, 2.384, 2.129, 1.918, 1.734, 1.575, 1.443, 1.339, 1.276, 1.217, 1.194, 1.194, 1.214, 1.271, 1.327, 1.423, 1.546, 1.702, 1.891, 2.112, 2.386, 2.718, 3.061, 3.301, 3.402, 3.433, 3.486, + 3.745, 3.647, 3.529, 3.302, 2.971, 2.627, 2.318, 2.067, 1.859, 1.677, 1.521, 1.389, 1.287, 1.217, 1.171, 1.145, 1.145, 1.165, 1.214, 1.276, 1.369, 1.491, 1.643, 1.831, 2.048, 2.313, 2.644, 2.995, 3.262, 3.381, 3.412, 3.453, + 3.731, 3.635, 3.503, 3.249, 2.911, 2.566, 2.259, 2.017, 1.811, 1.629, 1.475, 1.347, 1.246, 1.171, 1.138, 1.103, 1.103, 1.129, 1.165, 1.231, 1.322, 1.443, 1.595, 1.779, 1.993, 2.251, 2.576, 2.936, 3.223, 3.359, 3.392, 3.425, + 3.721, 3.625, 3.481, 3.208, 2.861, 2.515, 2.213, 1.976, 1.773, 1.593, 1.439, 1.313, 1.213, 1.138, 1.103, 1.071, 1.071, 1.101, 1.129, 1.194, 1.286, 1.405, 1.555, 1.736, 1.949, 2.202, 2.521, 2.886, 3.189, 3.338, 3.375, 3.406, + 3.716, 3.616, 3.458, 3.171, 2.819, 2.472, 2.176, 1.942, 1.741, 1.563, 1.411, 1.285, 1.186, 1.112, 1.071, 1.051, 1.049, 1.069, 1.103, 1.165, 1.256, 1.376, 1.523, 1.702, 1.913, 2.163, 2.477, 2.843, 3.155, 3.318, 3.358, 3.389, + 3.712, 3.609, 3.439, 3.142, 2.787, 2.443, 2.147, 1.918, 1.721, 1.541, 1.391, 1.266, 1.167, 1.094, 1.051, 1.035, 1.035, 1.049, 1.085, 1.145, 1.236, 1.355, 1.499, 1.676, 1.886, 2.136, 2.449, 2.814, 3.135, 3.307, 3.351, 3.378, + 3.709, 3.604, 3.422, 3.123, 2.768, 2.419, 2.129, 1.903, 1.706, 1.527, 1.377, 1.253, 1.155, 1.083, 1.035, 1.023, 1.023, 1.035, 1.074, 1.134, 1.224, 1.341, 1.484, 1.661, 1.868, 2.117, 2.429, 2.797, 3.122, 3.301, 3.346, 3.374, + 3.711, 3.597, 3.412, 3.114, 2.758, 2.409, 2.119, 1.895, 1.701, 1.523, 1.373, 1.251, 1.153, 1.081, 1.033, 1.001, 1.001, 1.032, 1.073, 1.133, 1.222, 1.338, 1.479, 1.655, 1.861, 2.107, 2.418, 2.787, 3.115, 3.297, 3.343, 3.373, + 3.713, 3.597, 3.412, 3.113, 2.758, 2.409, 2.119, 1.893, 1.698, 1.523, 1.373, 1.251, 1.153, 1.081, 1.034, 1.011, 1.011, 1.032, 1.074, 1.134, 1.222, 1.338, 1.479, 1.655, 1.861, 2.107, 2.418, 2.787, 3.116, 3.294, 3.341, 3.371, + 3.721, 3.599, 3.414, 3.116, 2.763, 2.418, 2.124, 1.895, 1.704, 1.531, 1.382, 1.259, 1.162, 1.091, 1.048, 1.034, 1.032, 1.046, 1.083, 1.145, 1.232, 1.348, 1.491, 1.664, 1.869, 2.115, 2.428, 2.798, 3.123, 3.294, 3.339, 3.372, + 3.727, 3.604, 3.421, 3.132, 2.784, 2.438, 2.141, 1.908, 1.716, 1.547, 1.399, 1.276, 1.178, 1.107, 1.069, 1.048, 1.046, 1.067, 1.101, 1.162, 1.249, 1.366, 1.509, 1.684, 1.886, 2.134, 2.449, 2.821, 3.135, 3.299, 3.341, 3.375, + 3.739, 3.613, 3.431, 3.154, 2.813, 2.468, 2.166, 1.931, 1.739, 1.569, 1.424, 1.302, 1.203, 1.129, 1.098, 1.069, 1.069, 1.096, 1.123, 1.185, 1.274, 1.391, 1.536, 1.709, 1.914, 2.162, 2.481, 2.851, 3.156, 3.311, 3.342, 3.378, + 3.751, 3.626, 3.449, 3.186, 2.855, 2.509, 2.201, 1.961, 1.768, 1.601, 1.454, 1.333, 1.235, 1.159, 1.129, 1.098, 1.098, 1.123, 1.152, 1.216, 1.307, 1.424, 1.569, 1.744, 1.947, 2.202, 2.526, 2.891, 3.182, 3.322, 3.351, 3.387, + 3.772, 3.641, 3.473, 3.221, 2.902, 2.559, 2.248, 1.999, 1.804, 1.639, 1.496, 1.373, 1.274, 1.201, 1.159, 1.133, 1.133, 1.152, 1.191, 1.254, 1.347, 1.466, 1.611, 1.785, 1.989, 2.253, 2.582, 2.939, 3.209, 3.334, 3.361, 3.402, + 3.797, 3.663, 3.496, 3.263, 2.959, 2.624, 2.308, 2.049, 1.847, 1.684, 1.542, 1.422, 1.321, 1.252, 1.201, 1.175, 1.175, 1.191, 1.239, 1.298, 1.394, 1.516, 1.658, 1.831, 2.041, 2.313, 2.651, 2.998, 3.244, 3.351, 3.375, 3.422, + 3.831, 3.686, 3.523, 3.307, 3.023, 2.698, 2.379, 2.112, 1.902, 1.737, 1.596, 1.476, 1.378, 1.315, 1.252, 1.227, 1.227, 1.239, 1.296, 1.355, 1.451, 1.572, 1.715, 1.888, 2.103, 2.386, 2.731, 3.063, 3.279, 3.367, 3.393, 3.456, + 3.871, 3.714, 3.551, 3.355, 3.091, 2.781, 2.465, 2.186, 1.965, 1.795, 1.654, 1.538, 1.442, 1.378, 1.318, 1.291, 1.291, 1.304, 1.355, 1.424, 1.515, 1.634, 1.778, 1.952, 2.178, 2.479, 2.821, 3.129, 3.314, 3.381, 3.419, 3.491, + 3.925, 3.749, 3.582, 3.401, 3.156, 2.866, 2.559, 2.274, 2.039, 1.859, 1.718, 1.604, 1.513, 1.442, 1.389, 1.363, 1.363, 1.379, 1.424, 1.501, 1.586, 1.702, 1.847, 2.028, 2.269, 2.579, 2.913, 3.193, 3.343, 3.396, 3.447, 3.539, + 3.994, 3.794, 3.619, 3.442, 3.231, 2.961, 2.662, 2.375, 2.129, 1.938, 1.789, 1.675, 1.591, 1.513, 1.465, 1.439, 1.439, 1.457, 1.501, 1.582, 1.661, 1.777, 1.925, 2.118, 2.375, 2.691, 3.008, 3.251, 3.371, 3.414, 3.479, 3.598, + 4.082, 3.845, 3.656, 3.489, 3.298, 3.053, 2.771, 2.485, 2.232, 2.028, 1.871, 1.751, 1.672, 1.591, 1.544, 1.521, 1.521, 1.539, 1.582, 1.661, 1.741, 1.859, 2.014, 2.224, 2.495, 2.806, 3.098, 3.301, 3.392, 3.431, 3.518, 3.677, + 4.196, 3.911, 3.698, 3.534, 3.363, 3.146, 2.881, 2.604, 2.348, 2.132, 1.964, 1.836, 1.751, 1.672, 1.628, 1.606, 1.606, 1.624, 1.665, 1.741, 1.827, 1.951, 2.121, 2.344, 2.624, 2.923, 3.177, 3.336, 3.405, 3.447, 3.567, 3.776, + 4.341, 4.002, 3.744, 3.575, 3.415, 3.229, 2.989, 2.729, 2.475, 2.251, 2.071, 1.936, 1.836, 1.759, 1.713, 1.693, 1.693, 1.711, 1.753, 1.827, 1.925, 2.058, 2.243, 2.481, 2.758, 3.027, 3.238, 3.361, 3.409, 3.466, 3.637, 3.896, + 4.516, 4.123, 3.804, 3.621, 3.468, 3.308, 3.096, 2.855, 2.609, 2.385, 2.194, 2.045, 1.936, 1.857, 1.807, 1.784, 1.784, 1.803, 1.852, 1.925, 2.033, 2.183, 2.382, 2.623, 2.886, 3.121, 3.284, 3.372, 3.413, 3.494, 3.727, 4.048, + 4.716, 4.264, 3.875, 3.674, 3.523, 3.376, 3.189, 2.966, 2.733, 2.511, 2.315, 2.158, 2.039, 1.936, 1.875, 1.872, 1.872, 1.872, 1.925, 2.028, 2.148, 2.308, 2.513, 2.751, 2.994, 3.191, 3.319, 3.384, 3.427, 3.541, 3.838, 4.221 + ], + "sigma": 0.00152, + "sigma_Cb": 0.00172 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2750, + "ccm": + [ + 1.13004, 0.36392, -0.49396, + -0.45885, 1.68171, -0.22286, + -0.06473, -0.86962, 1.93435 + ] + }, + { + "ct": 2940, + "ccm": + [ + 1.29876, 0.09627, -0.39503, + -0.43085, 1.60258, -0.17172, + -0.02638, -0.92581, 1.95218 + ] + }, + { + "ct": 3650, + "ccm": + [ + 1.57729, -0.29734, -0.27995, + -0.42965, 1.66231, -0.23265, + -0.02183, -0.62331, 1.64514 + ] + }, + { + "ct": 4625, + "ccm": + [ + 1.52145, -0.22382, -0.29763, + -0.40445, 1.82186, -0.41742, + -0.05732, -0.56222, 1.61954 + ] + }, + { + "ct": 5715, + "ccm": + [ + 1.67851, -0.39193, -0.28658, + -0.37169, 1.72949, -0.35781, + -0.09556, -0.41951, 1.51508 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.af": + { + "ranges": + { + "normal": + { + "min": 0.0, + "max": 12.0, + "default": 1.0 + }, + "macro": + { + "min": 4.0, + "max": 32.0, + "default": 6.0 + } + }, + "speeds": + { + "normal": + { + "step_coarse": 2.0, + "step_fine": 0.5, + "contrast_ratio": 0.75, + "pdaf_gain": -0.03, + "pdaf_squelch": 0.2, + "max_slew": 4.0, + "pdaf_frames": 20, + "dropout_frames": 6, + "step_frames": 4 + }, + "fast": + { + "step_coarse": 2.0, + "step_fine": 0.5, + "contrast_ratio": 0.75, + "pdaf_gain": -0.05, + "pdaf_squelch": 0.2, + "max_slew": 5.0, + "pdaf_frames": 16, + "dropout_frames": 6, + "step_frames": 4 + } + }, + "conf_epsilon": 8, + "conf_thresh": 12, + "conf_clip": 512, + "skip_frames": 5, + "map": [ 0.0, 420, 35.0, 920 ] + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "power_min": 0.7, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "power_min": 0.7, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/meson.build b/src/ipa/rpi/pisp/data/meson.build new file mode 100644 index 000000000..76c182d12 --- /dev/null +++ b/src/ipa/rpi/pisp/data/meson.build @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: CC0-1.0 + +conf_files = files([ + 'imx219.json', + 'imx219_noir.json', + 'imx296.json', + 'imx296_mono.json', + 'imx378.json', + 'imx477.json', + 'imx477_noir.json', + 'imx477_scientific.json', + 'imx519.json', + 'imx708.json', + 'imx708_noir.json', + 'imx708_wide.json', + 'imx708_wide_noir.json', + 'ov5647.json', + 'ov5647_noir.json', + 'ov64a40.json', + 'ov9281_mono.json', + 'se327m12.json', + 'uncalibrated.json', +]) + +install_data(conf_files, + install_dir : ipa_data_dir / 'rpi' / 'pisp') diff --git a/src/ipa/rpi/pisp/data/ov5647.json b/src/ipa/rpi/pisp/data/ov5647.json new file mode 100644 index 000000000..d5156767c --- /dev/null +++ b/src/ipa/rpi/pisp/data/ov5647.json @@ -0,0 +1,1186 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 1024 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 29381, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 870, + "reference_Y": 12388 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 4.371 + } + }, + { + "rpi.geq": + { + "offset": 280, + "slope": 0.02153 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2873.0, 1.0463, 0.5142, + 2965.0, 1.0233, 0.5284, + 3606.0, 0.8947, 0.6314, + 4700.0, 0.7665, 0.7897, + 5890.0, 0.7055, 0.8933, + 7600.0, 0.6482, 1.0119 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.04072, + "transverse_neg": 0.03906 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 1.238, 1.238, 1.238, 1.234, 1.227, 1.216, 1.207, 1.198, 1.191, 1.179, 1.169, 1.162, 1.155, 1.153, 1.152, 1.152, 1.152, 1.153, 1.154, 1.157, 1.166, 1.176, 1.183, 1.191, 1.204, 1.216, 1.226, 1.232, 1.239, 1.241, 1.241, 1.242, + 1.235, 1.234, 1.227, 1.222, 1.214, 1.203, 1.193, 1.184, 1.169, 1.161, 1.149, 1.139, 1.131, 1.126, 1.122, 1.121, 1.121, 1.123, 1.129, 1.136, 1.145, 1.157, 1.163, 1.175, 1.189, 1.199, 1.212, 1.221, 1.225, 1.231, 1.241, 1.242, + 1.234, 1.227, 1.222, 1.214, 1.203, 1.193, 1.183, 1.169, 1.158, 1.145, 1.133, 1.123, 1.113, 1.106, 1.101, 1.101, 1.101, 1.105, 1.111, 1.116, 1.128, 1.137, 1.149, 1.163, 1.174, 1.189, 1.199, 1.212, 1.221, 1.226, 1.234, 1.241, + 1.234, 1.226, 1.217, 1.209, 1.195, 1.183, 1.171, 1.158, 1.145, 1.131, 1.119, 1.108, 1.097, 1.088, 1.088, 1.085, 1.085, 1.087, 1.095, 1.102, 1.114, 1.124, 1.137, 1.149, 1.165, 1.176, 1.194, 1.207, 1.214, 1.224, 1.235, 1.247, + 1.238, 1.224, 1.213, 1.202, 1.187, 1.175, 1.161, 1.146, 1.132, 1.117, 1.105, 1.094, 1.082, 1.074, 1.071, 1.071, 1.071, 1.073, 1.079, 1.089, 1.099, 1.112, 1.124, 1.137, 1.152, 1.167, 1.183, 1.198, 1.211, 1.222, 1.235, 1.249, + 1.232, 1.221, 1.209, 1.195, 1.178, 1.163, 1.149, 1.134, 1.118, 1.104, 1.093, 1.079, 1.069, 1.061, 1.057, 1.056, 1.056, 1.059, 1.066, 1.073, 1.086, 1.098, 1.111, 1.124, 1.141, 1.157, 1.173, 1.188, 1.203, 1.219, 1.234, 1.251, + 1.231, 1.213, 1.197, 1.186, 1.169, 1.151, 1.137, 1.121, 1.104, 1.093, 1.079, 1.068, 1.056, 1.048, 1.045, 1.042, 1.042, 1.045, 1.051, 1.061, 1.071, 1.085, 1.098, 1.111, 1.129, 1.145, 1.161, 1.179, 1.197, 1.215, 1.231, 1.249, + 1.224, 1.211, 1.194, 1.178, 1.161, 1.141, 1.127, 1.109, 1.094, 1.081, 1.068, 1.055, 1.047, 1.038, 1.034, 1.032, 1.032, 1.035, 1.039, 1.048, 1.059, 1.071, 1.086, 1.098, 1.116, 1.134, 1.154, 1.172, 1.191, 1.209, 1.228, 1.249, + 1.223, 1.206, 1.187, 1.171, 1.152, 1.132, 1.117, 1.098, 1.082, 1.069, 1.056, 1.045, 1.037, 1.028, 1.024, 1.022, 1.022, 1.025, 1.031, 1.039, 1.048, 1.059, 1.074, 1.091, 1.106, 1.126, 1.144, 1.163, 1.186, 1.205, 1.227, 1.247, + 1.222, 1.199, 1.183, 1.164, 1.143, 1.126, 1.108, 1.091, 1.075, 1.059, 1.045, 1.037, 1.028, 1.019, 1.015, 1.014, 1.014, 1.018, 1.023, 1.031, 1.042, 1.051, 1.065, 1.081, 1.098, 1.118, 1.137, 1.158, 1.181, 1.201, 1.224, 1.245, + 1.221, 1.198, 1.179, 1.163, 1.141, 1.119, 1.101, 1.083, 1.066, 1.051, 1.038, 1.028, 1.019, 1.012, 1.009, 1.008, 1.007, 1.008, 1.015, 1.023, 1.033, 1.044, 1.058, 1.072, 1.089, 1.107, 1.131, 1.152, 1.172, 1.196, 1.216, 1.241, + 1.216, 1.194, 1.174, 1.155, 1.133, 1.112, 1.094, 1.074, 1.059, 1.045, 1.032, 1.021, 1.012, 1.007, 1.003, 1.002, 1.002, 1.003, 1.008, 1.015, 1.025, 1.038, 1.049, 1.067, 1.084, 1.102, 1.126, 1.147, 1.169, 1.191, 1.214, 1.238, + 1.212, 1.188, 1.171, 1.149, 1.127, 1.105, 1.087, 1.069, 1.055, 1.039, 1.027, 1.016, 1.007, 1.003, 0.999, 0.997, 0.998, 1.001, 1.003, 1.011, 1.021, 1.032, 1.043, 1.059, 1.077, 1.101, 1.121, 1.142, 1.164, 1.187, 1.211, 1.236, + 1.208, 1.187, 1.169, 1.149, 1.124, 1.104, 1.085, 1.067, 1.051, 1.036, 1.024, 1.013, 1.005, 0.999, 0.996, 0.994, 0.994, 0.996, 1.001, 1.006, 1.017, 1.025, 1.038, 1.053, 1.072, 1.093, 1.116, 1.138, 1.159, 1.183, 1.207, 1.235, + 1.208, 1.181, 1.164, 1.144, 1.122, 1.098, 1.079, 1.062, 1.046, 1.033, 1.018, 1.009, 1.002, 0.996, 0.992, 0.989, 0.991, 0.994, 0.996, 1.002, 1.012, 1.021, 1.035, 1.051, 1.069, 1.091, 1.113, 1.137, 1.157, 1.182, 1.206, 1.233, + 1.206, 1.179, 1.163, 1.142, 1.119, 1.098, 1.079, 1.061, 1.045, 1.031, 1.017, 1.008, 1.001, 0.995, 0.991, 0.989, 0.989, 0.992, 0.996, 1.001, 1.011, 1.019, 1.034, 1.051, 1.069, 1.089, 1.112, 1.136, 1.157, 1.181, 1.205, 1.233, + 1.206, 1.179, 1.163, 1.139, 1.119, 1.098, 1.079, 1.061, 1.044, 1.031, 1.016, 1.007, 1.001, 0.995, 0.991, 0.989, 0.989, 0.991, 0.996, 1.002, 1.011, 1.019, 1.034, 1.049, 1.069, 1.088, 1.113, 1.136, 1.156, 1.179, 1.204, 1.233, + 1.207, 1.179, 1.163, 1.139, 1.119, 1.099, 1.079, 1.061, 1.044, 1.031, 1.017, 1.007, 1.001, 0.995, 0.991, 0.989, 0.989, 0.992, 0.997, 1.003, 1.011, 1.021, 1.034, 1.051, 1.071, 1.089, 1.112, 1.136, 1.157, 1.179, 1.204, 1.233, + 1.207, 1.179, 1.163, 1.143, 1.121, 1.101, 1.082, 1.063, 1.047, 1.032, 1.019, 1.009, 1.003, 0.998, 0.994, 0.991, 0.991, 0.995, 0.999, 1.004, 1.013, 1.024, 1.038, 1.052, 1.071, 1.091, 1.112, 1.136, 1.159, 1.181, 1.205, 1.233, + 1.207, 1.185, 1.166, 1.148, 1.124, 1.104, 1.087, 1.068, 1.052, 1.037, 1.025, 1.016, 1.006, 1.002, 0.998, 0.995, 0.995, 0.999, 1.003, 1.008, 1.017, 1.029, 1.043, 1.056, 1.076, 1.094, 1.116, 1.138, 1.159, 1.183, 1.205, 1.232, + 1.211, 1.186, 1.167, 1.151, 1.128, 1.108, 1.089, 1.072, 1.057, 1.042, 1.031, 1.021, 1.013, 1.006, 1.002, 0.999, 0.999, 1.003, 1.007, 1.013, 1.021, 1.031, 1.047, 1.062, 1.081, 1.098, 1.121, 1.141, 1.164, 1.185, 1.207, 1.232, + 1.211, 1.188, 1.169, 1.154, 1.134, 1.114, 1.094, 1.078, 1.063, 1.051, 1.039, 1.028, 1.019, 1.013, 1.007, 1.006, 1.006, 1.007, 1.013, 1.019, 1.027, 1.039, 1.051, 1.069, 1.087, 1.105, 1.124, 1.146, 1.165, 1.186, 1.209, 1.232, + 1.214, 1.191, 1.175, 1.159, 1.141, 1.123, 1.105, 1.087, 1.072, 1.058, 1.046, 1.036, 1.028, 1.019, 1.014, 1.013, 1.013, 1.015, 1.019, 1.027, 1.037, 1.048, 1.061, 1.076, 1.094, 1.109, 1.132, 1.149, 1.169, 1.189, 1.209, 1.233, + 1.219, 1.194, 1.179, 1.163, 1.146, 1.129, 1.113, 1.095, 1.081, 1.066, 1.055, 1.045, 1.036, 1.029, 1.023, 1.021, 1.021, 1.026, 1.031, 1.037, 1.048, 1.057, 1.069, 1.085, 1.101, 1.118, 1.137, 1.156, 1.174, 1.193, 1.213, 1.233, + 1.219, 1.199, 1.184, 1.172, 1.155, 1.138, 1.122, 1.104, 1.088, 1.075, 1.065, 1.055, 1.045, 1.038, 1.034, 1.031, 1.031, 1.035, 1.041, 1.048, 1.057, 1.066, 1.081, 1.096, 1.111, 1.125, 1.146, 1.164, 1.178, 1.196, 1.214, 1.233, + 1.222, 1.204, 1.189, 1.178, 1.162, 1.148, 1.132, 1.115, 1.101, 1.087, 1.075, 1.064, 1.055, 1.048, 1.043, 1.042, 1.042, 1.046, 1.049, 1.057, 1.066, 1.076, 1.089, 1.106, 1.121, 1.133, 1.149, 1.167, 1.183, 1.199, 1.215, 1.234, + 1.222, 1.205, 1.191, 1.184, 1.171, 1.155, 1.142, 1.124, 1.109, 1.097, 1.087, 1.077, 1.065, 1.059, 1.055, 1.053, 1.053, 1.057, 1.059, 1.067, 1.076, 1.088, 1.102, 1.116, 1.131, 1.143, 1.157, 1.175, 1.187, 1.202, 1.215, 1.231, + 1.223, 1.211, 1.198, 1.189, 1.178, 1.165, 1.151, 1.136, 1.122, 1.108, 1.097, 1.087, 1.079, 1.073, 1.067, 1.066, 1.066, 1.069, 1.074, 1.079, 1.088, 1.101, 1.114, 1.128, 1.141, 1.152, 1.166, 1.182, 1.194, 1.205, 1.215, 1.229, + 1.223, 1.212, 1.204, 1.197, 1.186, 1.173, 1.161, 1.149, 1.133, 1.121, 1.108, 1.101, 1.092, 1.085, 1.082, 1.082, 1.082, 1.085, 1.091, 1.096, 1.101, 1.113, 1.125, 1.138, 1.151, 1.164, 1.175, 1.188, 1.198, 1.207, 1.215, 1.222, + 1.217, 1.213, 1.211, 1.203, 1.194, 1.181, 1.169, 1.158, 1.145, 1.133, 1.123, 1.113, 1.106, 1.097, 1.096, 1.094, 1.094, 1.098, 1.104, 1.108, 1.114, 1.124, 1.137, 1.149, 1.161, 1.172, 1.182, 1.194, 1.203, 1.209, 1.211, 1.217, + 1.214, 1.211, 1.209, 1.206, 1.201, 1.188, 1.179, 1.168, 1.154, 1.144, 1.136, 1.126, 1.119, 1.112, 1.109, 1.108, 1.108, 1.108, 1.117, 1.119, 1.124, 1.133, 1.147, 1.158, 1.171, 1.178, 1.188, 1.198, 1.205, 1.208, 1.209, 1.211, + 1.207, 1.208, 1.209, 1.206, 1.202, 1.192, 1.182, 1.171, 1.159, 1.146, 1.142, 1.136, 1.126, 1.119, 1.116, 1.114, 1.115, 1.117, 1.119, 1.128, 1.129, 1.136, 1.155, 1.162, 1.176, 1.182, 1.188, 1.198, 1.205, 1.208, 1.207, 1.206 + ] + }, + { + "ct": 5000, + "table": + [ + 1.879, 1.878, 1.872, 1.862, 1.856, 1.842, 1.826, 1.815, 1.811, 1.799, 1.787, 1.777, 1.768, 1.761, 1.761, 1.761, 1.762, 1.763, 1.764, 1.769, 1.776, 1.789, 1.799, 1.807, 1.824, 1.841, 1.853, 1.861, 1.871, 1.874, 1.885, 1.889, + 1.879, 1.875, 1.859, 1.846, 1.835, 1.817, 1.806, 1.794, 1.777, 1.771, 1.755, 1.743, 1.733, 1.726, 1.721, 1.721, 1.721, 1.722, 1.729, 1.734, 1.747, 1.759, 1.771, 1.783, 1.801, 1.813, 1.831, 1.841, 1.849, 1.862, 1.876, 1.888, + 1.876, 1.861, 1.846, 1.835, 1.817, 1.806, 1.793, 1.777, 1.766, 1.752, 1.736, 1.727, 1.713, 1.702, 1.696, 1.695, 1.695, 1.697, 1.704, 1.715, 1.725, 1.739, 1.754, 1.771, 1.783, 1.801, 1.813, 1.831, 1.841, 1.851, 1.866, 1.888, + 1.878, 1.861, 1.843, 1.829, 1.811, 1.794, 1.779, 1.766, 1.751, 1.734, 1.721, 1.711, 1.695, 1.682, 1.679, 1.677, 1.677, 1.678, 1.687, 1.696, 1.713, 1.723, 1.737, 1.754, 1.774, 1.785, 1.811, 1.825, 1.833, 1.849, 1.866, 1.889, + 1.882, 1.859, 1.837, 1.821, 1.803, 1.784, 1.769, 1.752, 1.735, 1.717, 1.701, 1.689, 1.676, 1.664, 1.659, 1.658, 1.658, 1.659, 1.668, 1.679, 1.694, 1.711, 1.723, 1.739, 1.756, 1.777, 1.797, 1.813, 1.827, 1.844, 1.865, 1.889, + 1.869, 1.849, 1.832, 1.811, 1.792, 1.772, 1.755, 1.737, 1.717, 1.699, 1.688, 1.674, 1.661, 1.646, 1.642, 1.638, 1.638, 1.641, 1.651, 1.659, 1.676, 1.693, 1.708, 1.724, 1.744, 1.763, 1.783, 1.801, 1.819, 1.838, 1.864, 1.889, + 1.869, 1.841, 1.817, 1.801, 1.782, 1.758, 1.741, 1.721, 1.699, 1.688, 1.674, 1.658, 1.643, 1.632, 1.627, 1.621, 1.621, 1.622, 1.631, 1.643, 1.658, 1.676, 1.689, 1.708, 1.729, 1.748, 1.767, 1.791, 1.812, 1.836, 1.859, 1.891, + 1.861, 1.836, 1.814, 1.792, 1.772, 1.745, 1.728, 1.707, 1.688, 1.673, 1.658, 1.643, 1.629, 1.618, 1.612, 1.609, 1.609, 1.611, 1.615, 1.629, 1.642, 1.658, 1.676, 1.689, 1.711, 1.734, 1.758, 1.782, 1.804, 1.827, 1.859, 1.891, + 1.861, 1.829, 1.807, 1.784, 1.759, 1.735, 1.717, 1.692, 1.674, 1.659, 1.644, 1.629, 1.617, 1.605, 1.598, 1.595, 1.595, 1.598, 1.607, 1.615, 1.631, 1.642, 1.661, 1.681, 1.701, 1.724, 1.746, 1.771, 1.799, 1.825, 1.857, 1.891, + 1.861, 1.826, 1.804, 1.779, 1.749, 1.729, 1.707, 1.687, 1.665, 1.648, 1.629, 1.617, 1.604, 1.595, 1.589, 1.585, 1.585, 1.592, 1.597, 1.607, 1.623, 1.635, 1.652, 1.674, 1.693, 1.716, 1.739, 1.766, 1.794, 1.822, 1.855, 1.889, + 1.861, 1.824, 1.799, 1.777, 1.748, 1.723, 1.701, 1.678, 1.657, 1.639, 1.619, 1.605, 1.596, 1.586, 1.581, 1.579, 1.577, 1.579, 1.588, 1.597, 1.612, 1.625, 1.641, 1.661, 1.681, 1.702, 1.732, 1.757, 1.785, 1.813, 1.847, 1.882, + 1.856, 1.819, 1.796, 1.767, 1.739, 1.714, 1.693, 1.666, 1.651, 1.629, 1.613, 1.597, 1.586, 1.579, 1.576, 1.572, 1.572, 1.573, 1.579, 1.588, 1.602, 1.619, 1.633, 1.655, 1.674, 1.698, 1.729, 1.754, 1.782, 1.809, 1.842, 1.874, + 1.853, 1.815, 1.792, 1.761, 1.734, 1.707, 1.682, 1.659, 1.639, 1.622, 1.605, 1.591, 1.579, 1.574, 1.569, 1.565, 1.566, 1.569, 1.573, 1.584, 1.597, 1.609, 1.624, 1.645, 1.666, 1.695, 1.722, 1.746, 1.772, 1.799, 1.835, 1.873, + 1.847, 1.811, 1.789, 1.759, 1.732, 1.703, 1.681, 1.657, 1.637, 1.619, 1.603, 1.588, 1.575, 1.569, 1.563, 1.561, 1.561, 1.563, 1.569, 1.576, 1.589, 1.601, 1.616, 1.636, 1.659, 1.686, 1.712, 1.741, 1.767, 1.798, 1.832, 1.873, + 1.847, 1.803, 1.779, 1.756, 1.727, 1.699, 1.674, 1.652, 1.632, 1.616, 1.595, 1.583, 1.572, 1.564, 1.558, 1.556, 1.557, 1.559, 1.563, 1.569, 1.583, 1.593, 1.613, 1.633, 1.657, 1.684, 1.709, 1.741, 1.766, 1.796, 1.831, 1.871, + 1.845, 1.802, 1.779, 1.755, 1.725, 1.696, 1.673, 1.649, 1.629, 1.614, 1.595, 1.582, 1.572, 1.563, 1.557, 1.556, 1.556, 1.558, 1.562, 1.569, 1.581, 1.593, 1.612, 1.633, 1.656, 1.679, 1.709, 1.741, 1.764, 1.796, 1.828, 1.869, + 1.845, 1.801, 1.779, 1.749, 1.723, 1.697, 1.673, 1.649, 1.627, 1.613, 1.593, 1.581, 1.573, 1.563, 1.558, 1.555, 1.555, 1.556, 1.562, 1.573, 1.581, 1.594, 1.611, 1.633, 1.656, 1.679, 1.711, 1.739, 1.764, 1.794, 1.828, 1.869, + 1.844, 1.801, 1.781, 1.749, 1.723, 1.697, 1.673, 1.649, 1.627, 1.614, 1.595, 1.581, 1.574, 1.564, 1.559, 1.557, 1.556, 1.559, 1.564, 1.574, 1.582, 1.595, 1.611, 1.634, 1.659, 1.683, 1.709, 1.739, 1.765, 1.794, 1.829, 1.872, + 1.845, 1.802, 1.781, 1.754, 1.725, 1.701, 1.677, 1.652, 1.632, 1.616, 1.599, 1.586, 1.576, 1.569, 1.563, 1.559, 1.558, 1.562, 1.569, 1.576, 1.587, 1.599, 1.618, 1.635, 1.661, 1.685, 1.709, 1.739, 1.767, 1.796, 1.829, 1.868, + 1.845, 1.809, 1.785, 1.762, 1.731, 1.706, 1.685, 1.659, 1.641, 1.622, 1.606, 1.595, 1.581, 1.575, 1.569, 1.564, 1.564, 1.569, 1.574, 1.582, 1.594, 1.607, 1.625, 1.642, 1.668, 1.687, 1.716, 1.741, 1.769, 1.798, 1.829, 1.868, + 1.849, 1.811, 1.785, 1.765, 1.734, 1.709, 1.688, 1.666, 1.647, 1.628, 1.613, 1.601, 1.592, 1.581, 1.575, 1.572, 1.572, 1.575, 1.581, 1.589, 1.599, 1.611, 1.631, 1.649, 1.673, 1.694, 1.721, 1.747, 1.771, 1.798, 1.829, 1.868, + 1.849, 1.816, 1.787, 1.766, 1.739, 1.716, 1.692, 1.673, 1.657, 1.641, 1.625, 1.612, 1.599, 1.592, 1.584, 1.581, 1.581, 1.581, 1.589, 1.598, 1.608, 1.622, 1.639, 1.659, 1.679, 1.701, 1.724, 1.751, 1.774, 1.802, 1.832, 1.868, + 1.855, 1.816, 1.793, 1.773, 1.748, 1.727, 1.707, 1.686, 1.667, 1.649, 1.636, 1.623, 1.612, 1.599, 1.594, 1.592, 1.591, 1.591, 1.598, 1.608, 1.621, 1.634, 1.649, 1.669, 1.693, 1.705, 1.736, 1.757, 1.778, 1.804, 1.833, 1.867, + 1.858, 1.818, 1.796, 1.778, 1.754, 1.733, 1.716, 1.695, 1.676, 1.661, 1.648, 1.635, 1.624, 1.613, 1.604, 1.601, 1.601, 1.606, 1.613, 1.621, 1.634, 1.646, 1.661, 1.679, 1.699, 1.714, 1.742, 1.761, 1.782, 1.809, 1.835, 1.867, + 1.857, 1.822, 1.801, 1.789, 1.766, 1.744, 1.726, 1.706, 1.688, 1.671, 1.659, 1.647, 1.635, 1.624, 1.621, 1.617, 1.617, 1.621, 1.627, 1.634, 1.645, 1.656, 1.674, 1.694, 1.709, 1.723, 1.751, 1.771, 1.786, 1.811, 1.837, 1.867, + 1.858, 1.824, 1.807, 1.794, 1.774, 1.757, 1.739, 1.716, 1.702, 1.687, 1.671, 1.662, 1.648, 1.636, 1.629, 1.629, 1.629, 1.633, 1.635, 1.646, 1.656, 1.669, 1.684, 1.705, 1.719, 1.732, 1.753, 1.774, 1.793, 1.815, 1.837, 1.871, + 1.858, 1.827, 1.809, 1.798, 1.782, 1.761, 1.749, 1.727, 1.711, 1.698, 1.687, 1.675, 1.663, 1.649, 1.646, 1.643, 1.643, 1.646, 1.649, 1.658, 1.669, 1.683, 1.698, 1.716, 1.731, 1.746, 1.761, 1.783, 1.795, 1.817, 1.836, 1.862, + 1.862, 1.834, 1.816, 1.805, 1.789, 1.774, 1.759, 1.743, 1.725, 1.711, 1.697, 1.688, 1.678, 1.668, 1.661, 1.659, 1.658, 1.659, 1.668, 1.673, 1.684, 1.698, 1.713, 1.728, 1.742, 1.757, 1.771, 1.791, 1.804, 1.821, 1.836, 1.862, + 1.859, 1.835, 1.825, 1.813, 1.794, 1.782, 1.771, 1.757, 1.739, 1.725, 1.711, 1.701, 1.693, 1.683, 1.679, 1.679, 1.679, 1.683, 1.689, 1.693, 1.698, 1.714, 1.726, 1.741, 1.754, 1.769, 1.781, 1.797, 1.808, 1.821, 1.835, 1.856, + 1.848, 1.836, 1.832, 1.822, 1.806, 1.789, 1.778, 1.765, 1.751, 1.739, 1.726, 1.718, 1.709, 1.699, 1.696, 1.695, 1.695, 1.696, 1.704, 1.705, 1.714, 1.724, 1.739, 1.753, 1.765, 1.777, 1.789, 1.803, 1.816, 1.824, 1.829, 1.842, + 1.839, 1.835, 1.834, 1.829, 1.815, 1.801, 1.787, 1.776, 1.759, 1.751, 1.744, 1.736, 1.724, 1.714, 1.711, 1.708, 1.707, 1.707, 1.717, 1.719, 1.724, 1.734, 1.748, 1.762, 1.775, 1.783, 1.796, 1.808, 1.819, 1.825, 1.828, 1.833, + 1.836, 1.833, 1.834, 1.832, 1.821, 1.806, 1.792, 1.785, 1.772, 1.759, 1.751, 1.744, 1.736, 1.725, 1.719, 1.715, 1.715, 1.718, 1.721, 1.728, 1.734, 1.736, 1.757, 1.768, 1.779, 1.787, 1.799, 1.812, 1.821, 1.824, 1.825, 1.833 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 2.189, 2.127, 2.115, 2.106, 2.113, 2.119, 2.131, 2.144, 2.155, 2.168, 2.176, 2.179, 2.181, 2.181, 2.185, 2.187, 2.187, 2.183, 2.179, 2.176, 2.169, 2.167, 2.159, 2.152, 2.145, 2.141, 2.135, 2.128, 2.124, 2.124, 2.139, 2.177, + 2.176, 2.133, 2.116, 2.112, 2.116, 2.125, 2.137, 2.154, 2.168, 2.179, 2.187, 2.194, 2.201, 2.204, 2.208, 2.208, 2.205, 2.202, 2.198, 2.195, 2.183, 2.177, 2.166, 2.159, 2.149, 2.143, 2.138, 2.132, 2.124, 2.125, 2.136, 2.164, + 2.175, 2.133, 2.117, 2.115, 2.121, 2.136, 2.154, 2.165, 2.179, 2.192, 2.198, 2.211, 2.218, 2.219, 2.221, 2.221, 2.217, 2.216, 2.211, 2.202, 2.197, 2.188, 2.181, 2.171, 2.159, 2.151, 2.141, 2.136, 2.125, 2.125, 2.132, 2.155, + 2.172, 2.128, 2.116, 2.116, 2.124, 2.143, 2.161, 2.177, 2.192, 2.204, 2.213, 2.221, 2.227, 2.231, 2.237, 2.237, 2.229, 2.224, 2.221, 2.213, 2.207, 2.197, 2.191, 2.179, 2.169, 2.156, 2.148, 2.138, 2.126, 2.123, 2.124, 2.149, + 2.169, 2.124, 2.119, 2.119, 2.135, 2.152, 2.174, 2.187, 2.204, 2.211, 2.224, 2.233, 2.236, 2.241, 2.246, 2.246, 2.243, 2.237, 2.234, 2.226, 2.218, 2.211, 2.199, 2.191, 2.177, 2.166, 2.155, 2.139, 2.129, 2.121, 2.121, 2.143, + 2.157, 2.124, 2.121, 2.127, 2.145, 2.157, 2.181, 2.197, 2.208, 2.221, 2.238, 2.245, 2.249, 2.249, 2.254, 2.254, 2.249, 2.247, 2.243, 2.237, 2.228, 2.219, 2.209, 2.198, 2.186, 2.172, 2.161, 2.143, 2.129, 2.121, 2.121, 2.141, + 2.157, 2.124, 2.124, 2.131, 2.148, 2.161, 2.188, 2.202, 2.214, 2.238, 2.246, 2.251, 2.255, 2.257, 2.259, 2.259, 2.257, 2.252, 2.251, 2.247, 2.238, 2.231, 2.219, 2.204, 2.193, 2.173, 2.166, 2.152, 2.134, 2.119, 2.119, 2.131, + 2.155, 2.125, 2.125, 2.135, 2.151, 2.169, 2.191, 2.207, 2.219, 2.243, 2.253, 2.258, 2.261, 2.266, 2.266, 2.267, 2.265, 2.262, 2.261, 2.254, 2.244, 2.238, 2.228, 2.212, 2.197, 2.179, 2.167, 2.158, 2.137, 2.122, 2.121, 2.131, + 2.155, 2.127, 2.127, 2.137, 2.153, 2.173, 2.197, 2.213, 2.231, 2.248, 2.257, 2.266, 2.271, 2.272, 2.274, 2.275, 2.275, 2.273, 2.271, 2.266, 2.257, 2.251, 2.238, 2.227, 2.209, 2.195, 2.175, 2.159, 2.141, 2.128, 2.127, 2.131, + 2.155, 2.128, 2.128, 2.139, 2.159, 2.182, 2.206, 2.225, 2.243, 2.252, 2.265, 2.272, 2.277, 2.283, 2.286, 2.284, 2.283, 2.282, 2.274, 2.272, 2.266, 2.256, 2.244, 2.238, 2.221, 2.202, 2.186, 2.169, 2.149, 2.129, 2.129, 2.135, + 2.154, 2.131, 2.131, 2.149, 2.166, 2.189, 2.211, 2.234, 2.248, 2.262, 2.272, 2.277, 2.287, 2.291, 2.293, 2.292, 2.291, 2.285, 2.284, 2.279, 2.272, 2.263, 2.254, 2.243, 2.226, 2.206, 2.193, 2.174, 2.153, 2.133, 2.133, 2.135, + 2.153, 2.135, 2.135, 2.151, 2.172, 2.198, 2.221, 2.238, 2.255, 2.265, 2.274, 2.287, 2.291, 2.296, 2.298, 2.298, 2.301, 2.297, 2.289, 2.285, 2.277, 2.271, 2.261, 2.251, 2.236, 2.216, 2.199, 2.179, 2.158, 2.135, 2.134, 2.135, + 2.152, 2.136, 2.136, 2.154, 2.176, 2.199, 2.224, 2.239, 2.256, 2.267, 2.282, 2.289, 2.295, 2.299, 2.303, 2.303, 2.302, 2.299, 2.297, 2.288, 2.284, 2.274, 2.262, 2.253, 2.238, 2.219, 2.202, 2.181, 2.158, 2.137, 2.135, 2.135, + 2.143, 2.134, 2.134, 2.154, 2.177, 2.201, 2.224, 2.241, 2.256, 2.271, 2.282, 2.289, 2.297, 2.302, 2.306, 2.306, 2.304, 2.301, 2.298, 2.289, 2.287, 2.272, 2.265, 2.255, 2.241, 2.221, 2.203, 2.183, 2.164, 2.141, 2.136, 2.135, + 2.142, 2.133, 2.133, 2.155, 2.178, 2.202, 2.223, 2.243, 2.258, 2.273, 2.283, 2.288, 2.296, 2.299, 2.306, 2.306, 2.301, 2.299, 2.296, 2.289, 2.286, 2.271, 2.267, 2.256, 2.244, 2.219, 2.206, 2.188, 2.163, 2.141, 2.137, 2.134, + 2.141, 2.131, 2.131, 2.153, 2.179, 2.202, 2.224, 2.242, 2.254, 2.274, 2.283, 2.288, 2.295, 2.298, 2.301, 2.301, 2.301, 2.296, 2.295, 2.289, 2.285, 2.271, 2.267, 2.257, 2.246, 2.223, 2.204, 2.188, 2.165, 2.141, 2.136, 2.134, + 2.141, 2.133, 2.133, 2.151, 2.179, 2.201, 2.224, 2.241, 2.254, 2.275, 2.283, 2.288, 2.294, 2.296, 2.298, 2.297, 2.295, 2.295, 2.294, 2.291, 2.284, 2.272, 2.267, 2.256, 2.248, 2.225, 2.208, 2.192, 2.167, 2.141, 2.137, 2.134, + 2.141, 2.132, 2.132, 2.151, 2.177, 2.199, 2.221, 2.238, 2.252, 2.274, 2.281, 2.287, 2.293, 2.295, 2.296, 2.294, 2.295, 2.295, 2.294, 2.291, 2.284, 2.274, 2.266, 2.257, 2.248, 2.226, 2.206, 2.189, 2.167, 2.143, 2.141, 2.141, + 2.141, 2.133, 2.133, 2.153, 2.175, 2.201, 2.221, 2.238, 2.252, 2.271, 2.278, 2.284, 2.288, 2.291, 2.292, 2.291, 2.293, 2.293, 2.293, 2.287, 2.279, 2.275, 2.266, 2.256, 2.243, 2.224, 2.206, 2.189, 2.168, 2.146, 2.142, 2.134, + 2.137, 2.131, 2.131, 2.154, 2.173, 2.199, 2.221, 2.236, 2.251, 2.267, 2.272, 2.278, 2.284, 2.287, 2.288, 2.286, 2.288, 2.288, 2.288, 2.283, 2.277, 2.273, 2.265, 2.256, 2.241, 2.219, 2.205, 2.187, 2.167, 2.144, 2.137, 2.132, + 2.136, 2.131, 2.131, 2.152, 2.169, 2.197, 2.218, 2.233, 2.246, 2.257, 2.269, 2.274, 2.281, 2.284, 2.286, 2.285, 2.286, 2.286, 2.286, 2.279, 2.274, 2.269, 2.263, 2.254, 2.239, 2.217, 2.203, 2.181, 2.162, 2.143, 2.133, 2.131, + 2.136, 2.131, 2.131, 2.151, 2.167, 2.189, 2.205, 2.226, 2.242, 2.253, 2.261, 2.271, 2.275, 2.279, 2.283, 2.283, 2.284, 2.284, 2.281, 2.277, 2.271, 2.264, 2.257, 2.246, 2.232, 2.215, 2.195, 2.176, 2.158, 2.141, 2.131, 2.128, + 2.136, 2.129, 2.131, 2.147, 2.162, 2.181, 2.203, 2.219, 2.236, 2.246, 2.256, 2.263, 2.271, 2.274, 2.278, 2.278, 2.276, 2.277, 2.276, 2.273, 2.266, 2.258, 2.251, 2.241, 2.227, 2.198, 2.191, 2.169, 2.154, 2.136, 2.125, 2.122, + 2.132, 2.126, 2.126, 2.139, 2.153, 2.168, 2.194, 2.212, 2.224, 2.238, 2.251, 2.258, 2.263, 2.266, 2.269, 2.271, 2.269, 2.269, 2.269, 2.267, 2.259, 2.253, 2.245, 2.237, 2.219, 2.196, 2.179, 2.162, 2.149, 2.132, 2.122, 2.121, + 2.124, 2.119, 2.121, 2.137, 2.147, 2.164, 2.183, 2.199, 2.219, 2.231, 2.239, 2.251, 2.257, 2.261, 2.262, 2.262, 2.259, 2.259, 2.261, 2.258, 2.253, 2.245, 2.237, 2.224, 2.209, 2.187, 2.174, 2.157, 2.141, 2.122, 2.121, 2.121, + 2.123, 2.115, 2.115, 2.131, 2.138, 2.157, 2.174, 2.188, 2.207, 2.221, 2.233, 2.239, 2.243, 2.244, 2.244, 2.244, 2.246, 2.245, 2.246, 2.244, 2.241, 2.231, 2.224, 2.212, 2.195, 2.176, 2.159, 2.145, 2.128, 2.117, 2.117, 2.123, + 2.123, 2.113, 2.113, 2.123, 2.132, 2.141, 2.162, 2.177, 2.191, 2.208, 2.221, 2.231, 2.231, 2.232, 2.234, 2.235, 2.235, 2.235, 2.238, 2.237, 2.225, 2.214, 2.209, 2.199, 2.181, 2.164, 2.146, 2.135, 2.123, 2.116, 2.116, 2.115, + 2.129, 2.115, 2.115, 2.121, 2.128, 2.135, 2.149, 2.164, 2.178, 2.193, 2.207, 2.221, 2.222, 2.222, 2.223, 2.224, 2.224, 2.224, 2.224, 2.223, 2.214, 2.205, 2.196, 2.185, 2.171, 2.151, 2.141, 2.129, 2.119, 2.116, 2.116, 2.117, + 2.137, 2.119, 2.119, 2.119, 2.122, 2.129, 2.141, 2.159, 2.167, 2.182, 2.195, 2.206, 2.211, 2.216, 2.218, 2.219, 2.219, 2.219, 2.217, 2.212, 2.202, 2.194, 2.184, 2.174, 2.162, 2.145, 2.134, 2.124, 2.118, 2.117, 2.118, 2.121, + 2.138, 2.131, 2.121, 2.122, 2.125, 2.128, 2.137, 2.154, 2.162, 2.176, 2.187, 2.194, 2.196, 2.198, 2.205, 2.205, 2.202, 2.202, 2.203, 2.201, 2.191, 2.182, 2.174, 2.162, 2.149, 2.136, 2.126, 2.121, 2.119, 2.118, 2.127, 2.133, + 2.157, 2.148, 2.131, 2.129, 2.129, 2.136, 2.148, 2.157, 2.169, 2.177, 2.182, 2.187, 2.188, 2.191, 2.193, 2.193, 2.192, 2.199, 2.201, 2.199, 2.186, 2.178, 2.167, 2.152, 2.146, 2.137, 2.126, 2.124, 2.121, 2.126, 2.133, 2.151, + 2.161, 2.157, 2.148, 2.147, 2.147, 2.147, 2.154, 2.162, 2.174, 2.179, 2.181, 2.184, 2.186, 2.187, 2.189, 2.189, 2.187, 2.188, 2.199, 2.201, 2.187, 2.178, 2.163, 2.148, 2.145, 2.141, 2.131, 2.129, 2.128, 2.135, 2.151, 2.153 + ] + }, + { + "ct": 5000, + "table": + [ + 1.191, 1.165, 1.156, 1.155, 1.157, 1.161, 1.168, 1.176, 1.179, 1.185, 1.187, 1.189, 1.189, 1.189, 1.191, 1.191, 1.191, 1.189, 1.188, 1.188, 1.185, 1.184, 1.182, 1.178, 1.173, 1.171, 1.166, 1.163, 1.159, 1.159, 1.164, 1.187, + 1.188, 1.164, 1.157, 1.156, 1.158, 1.166, 1.173, 1.179, 1.185, 1.193, 1.195, 1.198, 1.199, 1.201, 1.201, 1.202, 1.201, 1.199, 1.199, 1.196, 1.194, 1.189, 1.185, 1.182, 1.177, 1.172, 1.168, 1.164, 1.161, 1.161, 1.162, 1.181, + 1.184, 1.164, 1.157, 1.157, 1.161, 1.171, 1.179, 1.185, 1.193, 1.197, 1.201, 1.206, 1.208, 1.209, 1.209, 1.208, 1.207, 1.207, 1.207, 1.202, 1.199, 1.195, 1.192, 1.189, 1.182, 1.176, 1.171, 1.166, 1.161, 1.159, 1.161, 1.177, + 1.183, 1.162, 1.158, 1.158, 1.163, 1.174, 1.182, 1.191, 1.197, 1.203, 1.208, 1.212, 1.214, 1.214, 1.218, 1.218, 1.214, 1.212, 1.211, 1.208, 1.206, 1.201, 1.197, 1.192, 1.189, 1.179, 1.174, 1.168, 1.162, 1.159, 1.159, 1.173, + 1.181, 1.159, 1.159, 1.159, 1.168, 1.178, 1.189, 1.196, 1.204, 1.208, 1.213, 1.217, 1.219, 1.221, 1.222, 1.222, 1.222, 1.221, 1.219, 1.215, 1.212, 1.208, 1.202, 1.197, 1.189, 1.183, 1.178, 1.169, 1.163, 1.158, 1.158, 1.169, + 1.174, 1.159, 1.159, 1.164, 1.172, 1.179, 1.192, 1.201, 1.208, 1.212, 1.219, 1.224, 1.225, 1.227, 1.228, 1.228, 1.226, 1.225, 1.224, 1.221, 1.217, 1.212, 1.208, 1.202, 1.194, 1.187, 1.181, 1.172, 1.164, 1.157, 1.157, 1.169, + 1.174, 1.159, 1.159, 1.165, 1.174, 1.184, 1.197, 1.205, 1.209, 1.219, 1.224, 1.228, 1.231, 1.231, 1.231, 1.231, 1.229, 1.229, 1.228, 1.226, 1.222, 1.218, 1.212, 1.205, 1.199, 1.188, 1.181, 1.175, 1.165, 1.157, 1.157, 1.163, + 1.173, 1.159, 1.159, 1.165, 1.176, 1.186, 1.198, 1.207, 1.213, 1.223, 1.229, 1.231, 1.235, 1.236, 1.236, 1.236, 1.236, 1.235, 1.234, 1.232, 1.226, 1.223, 1.218, 1.209, 1.201, 1.192, 1.183, 1.178, 1.165, 1.157, 1.157, 1.163, + 1.172, 1.159, 1.159, 1.166, 1.176, 1.188, 1.201, 1.209, 1.217, 1.227, 1.231, 1.236, 1.238, 1.239, 1.241, 1.242, 1.242, 1.241, 1.239, 1.235, 1.232, 1.227, 1.223, 1.215, 1.208, 1.199, 1.187, 1.179, 1.167, 1.159, 1.159, 1.163, + 1.172, 1.159, 1.159, 1.166, 1.177, 1.189, 1.203, 1.212, 1.223, 1.228, 1.236, 1.239, 1.242, 1.245, 1.246, 1.246, 1.247, 1.246, 1.242, 1.241, 1.237, 1.232, 1.226, 1.223, 1.213, 1.202, 1.191, 1.182, 1.172, 1.159, 1.159, 1.163, + 1.168, 1.158, 1.158, 1.167, 1.179, 1.192, 1.204, 1.218, 1.225, 1.233, 1.238, 1.242, 1.246, 1.248, 1.251, 1.251, 1.249, 1.248, 1.247, 1.244, 1.239, 1.237, 1.228, 1.223, 1.214, 1.203, 1.194, 1.183, 1.173, 1.161, 1.161, 1.162, + 1.166, 1.158, 1.158, 1.168, 1.183, 1.195, 1.207, 1.218, 1.226, 1.233, 1.239, 1.246, 1.248, 1.251, 1.254, 1.254, 1.254, 1.251, 1.249, 1.247, 1.242, 1.239, 1.232, 1.227, 1.219, 1.207, 1.195, 1.186, 1.175, 1.162, 1.161, 1.162, + 1.165, 1.158, 1.158, 1.168, 1.183, 1.196, 1.208, 1.219, 1.227, 1.234, 1.241, 1.247, 1.251, 1.254, 1.255, 1.256, 1.256, 1.254, 1.252, 1.249, 1.246, 1.241, 1.234, 1.228, 1.221, 1.211, 1.199, 1.187, 1.175, 1.163, 1.162, 1.162, + 1.161, 1.158, 1.158, 1.169, 1.183, 1.196, 1.208, 1.217, 1.227, 1.234, 1.241, 1.247, 1.253, 1.254, 1.256, 1.257, 1.256, 1.255, 1.253, 1.249, 1.247, 1.241, 1.236, 1.229, 1.221, 1.211, 1.199, 1.189, 1.176, 1.164, 1.163, 1.162, + 1.161, 1.156, 1.156, 1.169, 1.183, 1.196, 1.207, 1.218, 1.227, 1.235, 1.241, 1.246, 1.252, 1.254, 1.256, 1.257, 1.256, 1.254, 1.253, 1.249, 1.247, 1.241, 1.237, 1.231, 1.223, 1.211, 1.201, 1.191, 1.177, 1.164, 1.164, 1.161, + 1.161, 1.155, 1.155, 1.169, 1.182, 1.195, 1.208, 1.216, 1.225, 1.235, 1.241, 1.245, 1.249, 1.252, 1.254, 1.254, 1.254, 1.253, 1.252, 1.249, 1.246, 1.239, 1.237, 1.231, 1.224, 1.211, 1.201, 1.191, 1.178, 1.164, 1.162, 1.161, + 1.159, 1.155, 1.155, 1.168, 1.181, 1.195, 1.208, 1.217, 1.223, 1.235, 1.241, 1.244, 1.248, 1.251, 1.252, 1.252, 1.252, 1.252, 1.251, 1.248, 1.245, 1.241, 1.236, 1.231, 1.224, 1.212, 1.202, 1.191, 1.179, 1.164, 1.162, 1.161, + 1.158, 1.154, 1.154, 1.167, 1.181, 1.194, 1.206, 1.216, 1.222, 1.234, 1.237, 1.242, 1.245, 1.248, 1.251, 1.249, 1.249, 1.249, 1.249, 1.248, 1.244, 1.241, 1.235, 1.229, 1.223, 1.213, 1.202, 1.191, 1.179, 1.167, 1.163, 1.163, + 1.158, 1.154, 1.154, 1.168, 1.181, 1.194, 1.206, 1.215, 1.223, 1.231, 1.236, 1.239, 1.243, 1.245, 1.246, 1.246, 1.248, 1.248, 1.248, 1.245, 1.242, 1.239, 1.235, 1.229, 1.223, 1.213, 1.202, 1.191, 1.179, 1.167, 1.163, 1.162, + 1.157, 1.154, 1.154, 1.168, 1.179, 1.194, 1.205, 1.215, 1.222, 1.229, 1.233, 1.236, 1.239, 1.243, 1.244, 1.244, 1.245, 1.245, 1.244, 1.243, 1.239, 1.236, 1.234, 1.229, 1.222, 1.211, 1.202, 1.191, 1.179, 1.166, 1.163, 1.161, + 1.156, 1.155, 1.155, 1.168, 1.179, 1.193, 1.205, 1.213, 1.219, 1.225, 1.231, 1.234, 1.238, 1.239, 1.241, 1.243, 1.243, 1.243, 1.243, 1.239, 1.237, 1.235, 1.231, 1.228, 1.221, 1.209, 1.199, 1.189, 1.178, 1.166, 1.162, 1.159, + 1.156, 1.156, 1.157, 1.167, 1.178, 1.191, 1.199, 1.209, 1.217, 1.223, 1.226, 1.231, 1.233, 1.236, 1.239, 1.239, 1.241, 1.241, 1.239, 1.237, 1.235, 1.232, 1.229, 1.224, 1.217, 1.209, 1.196, 1.187, 1.176, 1.165, 1.159, 1.157, + 1.157, 1.157, 1.157, 1.166, 1.175, 1.187, 1.198, 1.205, 1.213, 1.219, 1.223, 1.227, 1.231, 1.233, 1.236, 1.236, 1.234, 1.235, 1.235, 1.235, 1.231, 1.229, 1.227, 1.222, 1.216, 1.201, 1.194, 1.184, 1.174, 1.163, 1.157, 1.156, + 1.158, 1.155, 1.155, 1.165, 1.172, 1.181, 1.194, 1.202, 1.208, 1.215, 1.221, 1.223, 1.227, 1.229, 1.231, 1.231, 1.231, 1.232, 1.233, 1.231, 1.228, 1.227, 1.223, 1.219, 1.213, 1.199, 1.189, 1.181, 1.171, 1.161, 1.157, 1.156, + 1.155, 1.154, 1.154, 1.164, 1.169, 1.179, 1.189, 1.196, 1.203, 1.208, 1.215, 1.221, 1.222, 1.224, 1.225, 1.225, 1.226, 1.228, 1.228, 1.227, 1.225, 1.222, 1.219, 1.213, 1.206, 1.196, 1.187, 1.177, 1.168, 1.159, 1.156, 1.156, + 1.155, 1.152, 1.152, 1.162, 1.167, 1.175, 1.185, 1.191, 1.198, 1.205, 1.209, 1.214, 1.216, 1.217, 1.217, 1.217, 1.219, 1.219, 1.219, 1.219, 1.217, 1.215, 1.213, 1.207, 1.199, 1.191, 1.179, 1.172, 1.165, 1.156, 1.155, 1.155, + 1.155, 1.152, 1.152, 1.161, 1.163, 1.169, 1.179, 1.186, 1.192, 1.198, 1.204, 1.208, 1.211, 1.211, 1.211, 1.212, 1.212, 1.213, 1.215, 1.215, 1.211, 1.208, 1.205, 1.199, 1.194, 1.185, 1.175, 1.167, 1.161, 1.156, 1.155, 1.153, + 1.157, 1.152, 1.152, 1.159, 1.162, 1.166, 1.174, 1.181, 1.187, 1.192, 1.197, 1.203, 1.204, 1.205, 1.204, 1.204, 1.204, 1.205, 1.206, 1.206, 1.204, 1.201, 1.198, 1.194, 1.187, 1.176, 1.171, 1.164, 1.159, 1.156, 1.155, 1.154, + 1.159, 1.154, 1.154, 1.158, 1.159, 1.163, 1.171, 1.176, 1.181, 1.187, 1.191, 1.195, 1.198, 1.199, 1.199, 1.201, 1.201, 1.202, 1.202, 1.199, 1.196, 1.193, 1.191, 1.188, 1.182, 1.174, 1.166, 1.162, 1.157, 1.156, 1.156, 1.156, + 1.162, 1.161, 1.158, 1.159, 1.159, 1.162, 1.167, 1.173, 1.178, 1.181, 1.186, 1.189, 1.189, 1.191, 1.193, 1.193, 1.193, 1.194, 1.194, 1.194, 1.189, 1.187, 1.186, 1.182, 1.176, 1.167, 1.163, 1.159, 1.158, 1.157, 1.158, 1.161, + 1.172, 1.165, 1.162, 1.162, 1.163, 1.166, 1.169, 1.173, 1.178, 1.181, 1.182, 1.185, 1.186, 1.186, 1.186, 1.187, 1.187, 1.189, 1.192, 1.191, 1.187, 1.185, 1.181, 1.177, 1.172, 1.167, 1.163, 1.159, 1.159, 1.161, 1.163, 1.166, + 1.173, 1.172, 1.166, 1.165, 1.166, 1.168, 1.171, 1.176, 1.179, 1.182, 1.181, 1.183, 1.185, 1.185, 1.185, 1.185, 1.185, 1.185, 1.191, 1.191, 1.185, 1.181, 1.179, 1.173, 1.169, 1.168, 1.163, 1.162, 1.161, 1.164, 1.166, 1.167 + ] + } + ], + "luminance_lut": + [ + 2.271, 2.218, 2.105, 2.004, 1.909, 1.829, 1.762, 1.705, 1.665, 1.629, 1.592, 1.559, 1.528, 1.516, 1.511, 1.511, 1.511, 1.514, 1.525, 1.553, 1.585, 1.617, 1.655, 1.697, 1.752, 1.816, 1.893, 1.982, 2.084, 2.195, 2.321, 2.342, + 2.218, 2.166, 2.057, 1.959, 1.871, 1.793, 1.726, 1.675, 1.633, 1.592, 1.559, 1.528, 1.503, 1.484, 1.474, 1.472, 1.472, 1.482, 1.499, 1.523, 1.553, 1.585, 1.619, 1.664, 1.715, 1.779, 1.855, 1.938, 2.037, 2.147, 2.259, 2.321, + 2.166, 2.101, 1.997, 1.901, 1.818, 1.743, 1.683, 1.634, 1.588, 1.546, 1.508, 1.476, 1.449, 1.429, 1.418, 1.415, 1.415, 1.425, 1.444, 1.469, 1.501, 1.538, 1.577, 1.622, 1.671, 1.728, 1.799, 1.881, 1.975, 2.078, 2.185, 2.259, + 2.101, 2.039, 1.938, 1.848, 1.768, 1.699, 1.641, 1.588, 1.541, 1.494, 1.455, 1.421, 1.394, 1.374, 1.361, 1.357, 1.357, 1.367, 1.388, 1.414, 1.448, 1.485, 1.528, 1.577, 1.626, 1.682, 1.748, 1.827, 1.917, 2.014, 2.119, 2.185, + 2.039, 1.979, 1.883, 1.795, 1.722, 1.658, 1.596, 1.541, 1.493, 1.443, 1.401, 1.364, 1.336, 1.316, 1.303, 1.301, 1.301, 1.311, 1.331, 1.359, 1.393, 1.432, 1.482, 1.528, 1.582, 1.641, 1.701, 1.775, 1.861, 1.956, 2.056, 2.119, + 1.979, 1.932, 1.836, 1.752, 1.685, 1.621, 1.557, 1.497, 1.443, 1.399, 1.351, 1.314, 1.286, 1.264, 1.253, 1.249, 1.249, 1.259, 1.281, 1.311, 1.344, 1.387, 1.432, 1.484, 1.541, 1.601, 1.662, 1.731, 1.816, 1.908, 2.003, 2.056, + 1.934, 1.888, 1.798, 1.719, 1.651, 1.584, 1.519, 1.457, 1.401, 1.351, 1.307, 1.268, 1.239, 1.217, 1.206, 1.203, 1.203, 1.212, 1.234, 1.263, 1.298, 1.344, 1.387, 1.442, 1.502, 1.565, 1.628, 1.693, 1.774, 1.864, 1.956, 2.003, + 1.901, 1.851, 1.763, 1.688, 1.618, 1.551, 1.483, 1.419, 1.359, 1.307, 1.268, 1.226, 1.195, 1.175, 1.164, 1.161, 1.161, 1.171, 1.192, 1.221, 1.262, 1.298, 1.346, 1.404, 1.466, 1.532, 1.595, 1.661, 1.738, 1.826, 1.917, 1.956, + 1.873, 1.821, 1.734, 1.659, 1.591, 1.519, 1.451, 1.386, 1.324, 1.269, 1.226, 1.192, 1.159, 1.141, 1.127, 1.125, 1.125, 1.135, 1.155, 1.187, 1.221, 1.262, 1.311, 1.368, 1.432, 1.499, 1.566, 1.634, 1.708, 1.793, 1.882, 1.917, + 1.847, 1.797, 1.713, 1.639, 1.565, 1.493, 1.422, 1.355, 1.291, 1.238, 1.192, 1.159, 1.128, 1.108, 1.097, 1.094, 1.094, 1.104, 1.125, 1.155, 1.187, 1.229, 1.279, 1.338, 1.403, 1.471, 1.541, 1.611, 1.684, 1.766, 1.853, 1.885, + 1.828, 1.772, 1.691, 1.614, 1.539, 1.466, 1.394, 1.325, 1.264, 1.209, 1.163, 1.128, 1.104, 1.081, 1.069, 1.067, 1.067, 1.078, 1.101, 1.125, 1.159, 1.201, 1.252, 1.312, 1.379, 1.447, 1.517, 1.591, 1.665, 1.743, 1.831, 1.862, + 1.812, 1.754, 1.677, 1.599, 1.519, 1.445, 1.371, 1.302, 1.239, 1.185, 1.139, 1.104, 1.081, 1.061, 1.048, 1.046, 1.046, 1.058, 1.078, 1.102, 1.136, 1.177, 1.229, 1.289, 1.356, 1.425, 1.497, 1.572, 1.647, 1.724, 1.811, 1.847, + 1.798, 1.741, 1.663, 1.585, 1.506, 1.429, 1.353, 1.284, 1.221, 1.167, 1.121, 1.086, 1.061, 1.046, 1.031, 1.029, 1.029, 1.044, 1.058, 1.083, 1.116, 1.159, 1.209, 1.271, 1.338, 1.407, 1.479, 1.557, 1.633, 1.709, 1.792, 1.832, + 1.792, 1.727, 1.651, 1.572, 1.494, 1.414, 1.339, 1.269, 1.206, 1.152, 1.106, 1.072, 1.046, 1.031, 1.018, 1.016, 1.016, 1.029, 1.044, 1.069, 1.102, 1.145, 1.196, 1.256, 1.324, 1.394, 1.471, 1.545, 1.624, 1.698, 1.782, 1.825, + 1.787, 1.724, 1.647, 1.566, 1.484, 1.407, 1.329, 1.258, 1.196, 1.141, 1.097, 1.062, 1.036, 1.018, 1.012, 1.007, 1.011, 1.016, 1.034, 1.059, 1.093, 1.135, 1.186, 1.246, 1.314, 1.386, 1.461, 1.538, 1.616, 1.691, 1.773, 1.818, + 1.786, 1.721, 1.642, 1.562, 1.481, 1.402, 1.325, 1.254, 1.191, 1.137, 1.092, 1.057, 1.031, 1.013, 1.004, 1.001, 1.004, 1.011, 1.028, 1.054, 1.088, 1.129, 1.181, 1.241, 1.308, 1.382, 1.458, 1.535, 1.613, 1.687, 1.769, 1.818, + 1.786, 1.721, 1.642, 1.562, 1.481, 1.401, 1.325, 1.253, 1.191, 1.136, 1.091, 1.057, 1.031, 1.013, 1.003, 1.001, 1.001, 1.011, 1.028, 1.054, 1.088, 1.129, 1.181, 1.241, 1.308, 1.382, 1.458, 1.535, 1.613, 1.687, 1.769, 1.818, + 1.787, 1.722, 1.643, 1.563, 1.482, 1.402, 1.326, 1.254, 1.192, 1.138, 1.092, 1.057, 1.032, 1.013, 1.006, 1.002, 1.006, 1.012, 1.031, 1.057, 1.092, 1.133, 1.185, 1.243, 1.311, 1.385, 1.461, 1.539, 1.618, 1.691, 1.774, 1.821, + 1.789, 1.729, 1.651, 1.571, 1.489, 1.411, 1.334, 1.263, 1.201, 1.147, 1.101, 1.065, 1.038, 1.021, 1.013, 1.009, 1.012, 1.021, 1.038, 1.064, 1.098, 1.141, 1.193, 1.254, 1.321, 1.395, 1.472, 1.549, 1.626, 1.701, 1.785, 1.825, + 1.799, 1.739, 1.661, 1.581, 1.502, 1.422, 1.347, 1.277, 1.214, 1.159, 1.111, 1.075, 1.049, 1.037, 1.021, 1.019, 1.021, 1.036, 1.049, 1.076, 1.111, 1.154, 1.207, 1.268, 1.334, 1.408, 1.485, 1.562, 1.639, 1.715, 1.799, 1.837, + 1.811, 1.755, 1.676, 1.597, 1.518, 1.439, 1.365, 1.295, 1.231, 1.176, 1.129, 1.093, 1.067, 1.049, 1.038, 1.036, 1.036, 1.049, 1.067, 1.094, 1.129, 1.173, 1.225, 1.286, 1.353, 1.425, 1.501, 1.577, 1.653, 1.729, 1.815, 1.851, + 1.829, 1.774, 1.693, 1.615, 1.537, 1.462, 1.387, 1.316, 1.253, 1.198, 1.153, 1.115, 1.091, 1.067, 1.059, 1.056, 1.056, 1.067, 1.092, 1.115, 1.151, 1.196, 1.249, 1.309, 1.375, 1.446, 1.522, 1.595, 1.672, 1.752, 1.839, 1.871, + 1.851, 1.801, 1.713, 1.636, 1.561, 1.485, 1.411, 1.342, 1.281, 1.226, 1.179, 1.145, 1.115, 1.091, 1.082, 1.081, 1.082, 1.092, 1.115, 1.143, 1.178, 1.223, 1.276, 1.337, 1.402, 1.472, 1.544, 1.618, 1.691, 1.774, 1.865, 1.896, + 1.876, 1.831, 1.739, 1.663, 1.588, 1.513, 1.439, 1.374, 1.312, 1.258, 1.212, 1.179, 1.145, 1.123, 1.113, 1.112, 1.112, 1.122, 1.143, 1.177, 1.211, 1.256, 1.308, 1.368, 1.431, 1.501, 1.572, 1.641, 1.716, 1.802, 1.896, 1.931, + 1.909, 1.867, 1.771, 1.691, 1.617, 1.545, 1.474, 1.411, 1.349, 1.296, 1.252, 1.212, 1.182, 1.159, 1.149, 1.148, 1.149, 1.158, 1.179, 1.211, 1.253, 1.293, 1.344, 1.403, 1.465, 1.533, 1.603, 1.669, 1.747, 1.836, 1.931, 1.974, + 1.952, 1.905, 1.806, 1.722, 1.651, 1.578, 1.511, 1.448, 1.388, 1.338, 1.296, 1.252, 1.223, 1.201, 1.189, 1.189, 1.189, 1.199, 1.224, 1.253, 1.293, 1.338, 1.384, 1.442, 1.504, 1.571, 1.638, 1.704, 1.782, 1.872, 1.974, 2.025, + 2.004, 1.951, 1.849, 1.759, 1.688, 1.619, 1.552, 1.491, 1.435, 1.388, 1.338, 1.301, 1.272, 1.249, 1.238, 1.236, 1.236, 1.248, 1.271, 1.301, 1.338, 1.384, 1.431, 1.484, 1.543, 1.609, 1.675, 1.742, 1.825, 1.919, 2.025, 2.081, + 2.062, 2.004, 1.898, 1.805, 1.729, 1.661, 1.597, 1.539, 1.486, 1.435, 1.391, 1.354, 1.326, 1.303, 1.291, 1.289, 1.289, 1.301, 1.323, 1.353, 1.389, 1.431, 1.483, 1.528, 1.585, 1.649, 1.713, 1.787, 1.875, 1.971, 2.081, 2.145, + 2.129, 2.062, 1.951, 1.854, 1.774, 1.705, 1.642, 1.586, 1.539, 1.486, 1.445, 1.411, 1.383, 1.361, 1.348, 1.347, 1.348, 1.359, 1.379, 1.409, 1.447, 1.484, 1.528, 1.578, 1.631, 1.691, 1.759, 1.836, 1.928, 2.031, 2.145, 2.217, + 2.201, 2.129, 2.013, 1.912, 1.827, 1.752, 1.689, 1.642, 1.586, 1.544, 1.501, 1.468, 1.442, 1.421, 1.409, 1.409, 1.411, 1.421, 1.439, 1.467, 1.504, 1.543, 1.578, 1.629, 1.679, 1.739, 1.815, 1.894, 1.985, 2.098, 2.217, 2.298, + 2.273, 2.201, 2.081, 1.974, 1.886, 1.807, 1.741, 1.689, 1.643, 1.603, 1.562, 1.527, 1.504, 1.485, 1.475, 1.474, 1.475, 1.487, 1.503, 1.531, 1.565, 1.601, 1.634, 1.678, 1.728, 1.795, 1.877, 1.961, 2.052, 2.169, 2.298, 2.365, + 2.317, 2.273, 2.146, 2.039, 1.946, 1.864, 1.792, 1.737, 1.688, 1.643, 1.603, 1.562, 1.533, 1.525, 1.523, 1.523, 1.523, 1.525, 1.534, 1.565, 1.601, 1.634, 1.677, 1.722, 1.772, 1.848, 1.935, 2.023, 2.108, 2.232, 2.365, 2.403 + ], + "sigma": 0.00285, + "sigma_Cb": 0.00166 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2873, + "ccm": + [ + 1.88195, -0.26249, -0.61946, + -0.63842, 2.11535, -0.47693, + -0.13531, -0.99739, 2.13271 + ] + }, + { + "ct": 2965, + "ccm": + [ + 2.15048, -0.51859, -0.63189, + -0.53572, 1.92585, -0.39013, + 0.01831, -1.48576, 2.46744 + ] + }, + { + "ct": 3606, + "ccm": + [ + 1.97522, -0.43847, -0.53675, + -0.56151, 1.99765, -0.43614, + -0.12438, -0.77056, 1.89493 + ] + }, + { + "ct": 4700, + "ccm": + [ + 2.00971, -0.51461, -0.49511, + -0.52109, 2.01003, -0.48894, + -0.09527, -0.67318, 1.76845 + ] + }, + { + "ct": 5890, + "ccm": + [ + 2.13616, -0.65283, -0.48333, + -0.48364, 1.93115, -0.44751, + -0.13465, -0.54831, 1.68295 + ] + }, + { + "ct": 7600, + "ccm": + [ + 2.06599, -0.39161, -0.67439, + -0.50883, 2.27467, -0.76583, + -0.13961, -0.66121, 1.80081 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/ov5647_noir.json b/src/ipa/rpi/pisp/data/ov5647_noir.json new file mode 100644 index 000000000..3e04f21b9 --- /dev/null +++ b/src/ipa/rpi/pisp/data/ov5647_noir.json @@ -0,0 +1,1121 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 1024 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 29381, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 870, + "reference_Y": 12388 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 4.371 + } + }, + { + "rpi.geq": + { + "offset": 280, + "slope": 0.02153 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "bayes": 0 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 1.0, 2.0 ] + }, + "short": + { + "shutter": [ 100, 15000, 30000 ], + "gain": [ 1.0, 2.0, 2.0 ] + }, + "long": + { + "shutter": [ 100, 15000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.02, + 1000, 0.02 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.01, + 1000, 0.01 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.9, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.005, + 1000, 0.005 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.19, + 1000, 0.19, + 10000, 0.19 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 3000, + "table": + [ + 1.238, 1.238, 1.238, 1.234, 1.227, 1.216, 1.207, 1.198, 1.191, 1.179, 1.169, 1.162, 1.155, 1.153, 1.152, 1.152, 1.152, 1.153, 1.154, 1.157, 1.166, 1.176, 1.183, 1.191, 1.204, 1.216, 1.226, 1.232, 1.239, 1.241, 1.241, 1.242, + 1.235, 1.234, 1.227, 1.222, 1.214, 1.203, 1.193, 1.184, 1.169, 1.161, 1.149, 1.139, 1.131, 1.126, 1.122, 1.121, 1.121, 1.123, 1.129, 1.136, 1.145, 1.157, 1.163, 1.175, 1.189, 1.199, 1.212, 1.221, 1.225, 1.231, 1.241, 1.242, + 1.234, 1.227, 1.222, 1.214, 1.203, 1.193, 1.183, 1.169, 1.158, 1.145, 1.133, 1.123, 1.113, 1.106, 1.101, 1.101, 1.101, 1.105, 1.111, 1.116, 1.128, 1.137, 1.149, 1.163, 1.174, 1.189, 1.199, 1.212, 1.221, 1.226, 1.234, 1.241, + 1.234, 1.226, 1.217, 1.209, 1.195, 1.183, 1.171, 1.158, 1.145, 1.131, 1.119, 1.108, 1.097, 1.088, 1.088, 1.085, 1.085, 1.087, 1.095, 1.102, 1.114, 1.124, 1.137, 1.149, 1.165, 1.176, 1.194, 1.207, 1.214, 1.224, 1.235, 1.247, + 1.238, 1.224, 1.213, 1.202, 1.187, 1.175, 1.161, 1.146, 1.132, 1.117, 1.105, 1.094, 1.082, 1.074, 1.071, 1.071, 1.071, 1.073, 1.079, 1.089, 1.099, 1.112, 1.124, 1.137, 1.152, 1.167, 1.183, 1.198, 1.211, 1.222, 1.235, 1.249, + 1.232, 1.221, 1.209, 1.195, 1.178, 1.163, 1.149, 1.134, 1.118, 1.104, 1.093, 1.079, 1.069, 1.061, 1.057, 1.056, 1.056, 1.059, 1.066, 1.073, 1.086, 1.098, 1.111, 1.124, 1.141, 1.157, 1.173, 1.188, 1.203, 1.219, 1.234, 1.251, + 1.231, 1.213, 1.197, 1.186, 1.169, 1.151, 1.137, 1.121, 1.104, 1.093, 1.079, 1.068, 1.056, 1.048, 1.045, 1.042, 1.042, 1.045, 1.051, 1.061, 1.071, 1.085, 1.098, 1.111, 1.129, 1.145, 1.161, 1.179, 1.197, 1.215, 1.231, 1.249, + 1.224, 1.211, 1.194, 1.178, 1.161, 1.141, 1.127, 1.109, 1.094, 1.081, 1.068, 1.055, 1.047, 1.038, 1.034, 1.032, 1.032, 1.035, 1.039, 1.048, 1.059, 1.071, 1.086, 1.098, 1.116, 1.134, 1.154, 1.172, 1.191, 1.209, 1.228, 1.249, + 1.223, 1.206, 1.187, 1.171, 1.152, 1.132, 1.117, 1.098, 1.082, 1.069, 1.056, 1.045, 1.037, 1.028, 1.024, 1.022, 1.022, 1.025, 1.031, 1.039, 1.048, 1.059, 1.074, 1.091, 1.106, 1.126, 1.144, 1.163, 1.186, 1.205, 1.227, 1.247, + 1.222, 1.199, 1.183, 1.164, 1.143, 1.126, 1.108, 1.091, 1.075, 1.059, 1.045, 1.037, 1.028, 1.019, 1.015, 1.014, 1.014, 1.018, 1.023, 1.031, 1.042, 1.051, 1.065, 1.081, 1.098, 1.118, 1.137, 1.158, 1.181, 1.201, 1.224, 1.245, + 1.221, 1.198, 1.179, 1.163, 1.141, 1.119, 1.101, 1.083, 1.066, 1.051, 1.038, 1.028, 1.019, 1.012, 1.009, 1.008, 1.007, 1.008, 1.015, 1.023, 1.033, 1.044, 1.058, 1.072, 1.089, 1.107, 1.131, 1.152, 1.172, 1.196, 1.216, 1.241, + 1.216, 1.194, 1.174, 1.155, 1.133, 1.112, 1.094, 1.074, 1.059, 1.045, 1.032, 1.021, 1.012, 1.007, 1.003, 1.002, 1.002, 1.003, 1.008, 1.015, 1.025, 1.038, 1.049, 1.067, 1.084, 1.102, 1.126, 1.147, 1.169, 1.191, 1.214, 1.238, + 1.212, 1.188, 1.171, 1.149, 1.127, 1.105, 1.087, 1.069, 1.055, 1.039, 1.027, 1.016, 1.007, 1.003, 0.999, 0.997, 0.998, 1.001, 1.003, 1.011, 1.021, 1.032, 1.043, 1.059, 1.077, 1.101, 1.121, 1.142, 1.164, 1.187, 1.211, 1.236, + 1.208, 1.187, 1.169, 1.149, 1.124, 1.104, 1.085, 1.067, 1.051, 1.036, 1.024, 1.013, 1.005, 0.999, 0.996, 0.994, 0.994, 0.996, 1.001, 1.006, 1.017, 1.025, 1.038, 1.053, 1.072, 1.093, 1.116, 1.138, 1.159, 1.183, 1.207, 1.235, + 1.208, 1.181, 1.164, 1.144, 1.122, 1.098, 1.079, 1.062, 1.046, 1.033, 1.018, 1.009, 1.002, 0.996, 0.992, 0.989, 0.991, 0.994, 0.996, 1.002, 1.012, 1.021, 1.035, 1.051, 1.069, 1.091, 1.113, 1.137, 1.157, 1.182, 1.206, 1.233, + 1.206, 1.179, 1.163, 1.142, 1.119, 1.098, 1.079, 1.061, 1.045, 1.031, 1.017, 1.008, 1.001, 0.995, 0.991, 0.989, 0.989, 0.992, 0.996, 1.001, 1.011, 1.019, 1.034, 1.051, 1.069, 1.089, 1.112, 1.136, 1.157, 1.181, 1.205, 1.233, + 1.206, 1.179, 1.163, 1.139, 1.119, 1.098, 1.079, 1.061, 1.044, 1.031, 1.016, 1.007, 1.001, 0.995, 0.991, 0.989, 0.989, 0.991, 0.996, 1.002, 1.011, 1.019, 1.034, 1.049, 1.069, 1.088, 1.113, 1.136, 1.156, 1.179, 1.204, 1.233, + 1.207, 1.179, 1.163, 1.139, 1.119, 1.099, 1.079, 1.061, 1.044, 1.031, 1.017, 1.007, 1.001, 0.995, 0.991, 0.989, 0.989, 0.992, 0.997, 1.003, 1.011, 1.021, 1.034, 1.051, 1.071, 1.089, 1.112, 1.136, 1.157, 1.179, 1.204, 1.233, + 1.207, 1.179, 1.163, 1.143, 1.121, 1.101, 1.082, 1.063, 1.047, 1.032, 1.019, 1.009, 1.003, 0.998, 0.994, 0.991, 0.991, 0.995, 0.999, 1.004, 1.013, 1.024, 1.038, 1.052, 1.071, 1.091, 1.112, 1.136, 1.159, 1.181, 1.205, 1.233, + 1.207, 1.185, 1.166, 1.148, 1.124, 1.104, 1.087, 1.068, 1.052, 1.037, 1.025, 1.016, 1.006, 1.002, 0.998, 0.995, 0.995, 0.999, 1.003, 1.008, 1.017, 1.029, 1.043, 1.056, 1.076, 1.094, 1.116, 1.138, 1.159, 1.183, 1.205, 1.232, + 1.211, 1.186, 1.167, 1.151, 1.128, 1.108, 1.089, 1.072, 1.057, 1.042, 1.031, 1.021, 1.013, 1.006, 1.002, 0.999, 0.999, 1.003, 1.007, 1.013, 1.021, 1.031, 1.047, 1.062, 1.081, 1.098, 1.121, 1.141, 1.164, 1.185, 1.207, 1.232, + 1.211, 1.188, 1.169, 1.154, 1.134, 1.114, 1.094, 1.078, 1.063, 1.051, 1.039, 1.028, 1.019, 1.013, 1.007, 1.006, 1.006, 1.007, 1.013, 1.019, 1.027, 1.039, 1.051, 1.069, 1.087, 1.105, 1.124, 1.146, 1.165, 1.186, 1.209, 1.232, + 1.214, 1.191, 1.175, 1.159, 1.141, 1.123, 1.105, 1.087, 1.072, 1.058, 1.046, 1.036, 1.028, 1.019, 1.014, 1.013, 1.013, 1.015, 1.019, 1.027, 1.037, 1.048, 1.061, 1.076, 1.094, 1.109, 1.132, 1.149, 1.169, 1.189, 1.209, 1.233, + 1.219, 1.194, 1.179, 1.163, 1.146, 1.129, 1.113, 1.095, 1.081, 1.066, 1.055, 1.045, 1.036, 1.029, 1.023, 1.021, 1.021, 1.026, 1.031, 1.037, 1.048, 1.057, 1.069, 1.085, 1.101, 1.118, 1.137, 1.156, 1.174, 1.193, 1.213, 1.233, + 1.219, 1.199, 1.184, 1.172, 1.155, 1.138, 1.122, 1.104, 1.088, 1.075, 1.065, 1.055, 1.045, 1.038, 1.034, 1.031, 1.031, 1.035, 1.041, 1.048, 1.057, 1.066, 1.081, 1.096, 1.111, 1.125, 1.146, 1.164, 1.178, 1.196, 1.214, 1.233, + 1.222, 1.204, 1.189, 1.178, 1.162, 1.148, 1.132, 1.115, 1.101, 1.087, 1.075, 1.064, 1.055, 1.048, 1.043, 1.042, 1.042, 1.046, 1.049, 1.057, 1.066, 1.076, 1.089, 1.106, 1.121, 1.133, 1.149, 1.167, 1.183, 1.199, 1.215, 1.234, + 1.222, 1.205, 1.191, 1.184, 1.171, 1.155, 1.142, 1.124, 1.109, 1.097, 1.087, 1.077, 1.065, 1.059, 1.055, 1.053, 1.053, 1.057, 1.059, 1.067, 1.076, 1.088, 1.102, 1.116, 1.131, 1.143, 1.157, 1.175, 1.187, 1.202, 1.215, 1.231, + 1.223, 1.211, 1.198, 1.189, 1.178, 1.165, 1.151, 1.136, 1.122, 1.108, 1.097, 1.087, 1.079, 1.073, 1.067, 1.066, 1.066, 1.069, 1.074, 1.079, 1.088, 1.101, 1.114, 1.128, 1.141, 1.152, 1.166, 1.182, 1.194, 1.205, 1.215, 1.229, + 1.223, 1.212, 1.204, 1.197, 1.186, 1.173, 1.161, 1.149, 1.133, 1.121, 1.108, 1.101, 1.092, 1.085, 1.082, 1.082, 1.082, 1.085, 1.091, 1.096, 1.101, 1.113, 1.125, 1.138, 1.151, 1.164, 1.175, 1.188, 1.198, 1.207, 1.215, 1.222, + 1.217, 1.213, 1.211, 1.203, 1.194, 1.181, 1.169, 1.158, 1.145, 1.133, 1.123, 1.113, 1.106, 1.097, 1.096, 1.094, 1.094, 1.098, 1.104, 1.108, 1.114, 1.124, 1.137, 1.149, 1.161, 1.172, 1.182, 1.194, 1.203, 1.209, 1.211, 1.217, + 1.214, 1.211, 1.209, 1.206, 1.201, 1.188, 1.179, 1.168, 1.154, 1.144, 1.136, 1.126, 1.119, 1.112, 1.109, 1.108, 1.108, 1.108, 1.117, 1.119, 1.124, 1.133, 1.147, 1.158, 1.171, 1.178, 1.188, 1.198, 1.205, 1.208, 1.209, 1.211, + 1.207, 1.208, 1.209, 1.206, 1.202, 1.192, 1.182, 1.171, 1.159, 1.146, 1.142, 1.136, 1.126, 1.119, 1.116, 1.114, 1.115, 1.117, 1.119, 1.128, 1.129, 1.136, 1.155, 1.162, 1.176, 1.182, 1.188, 1.198, 1.205, 1.208, 1.207, 1.206 + ] + }, + { + "ct": 5000, + "table": + [ + 1.879, 1.878, 1.872, 1.862, 1.856, 1.842, 1.826, 1.815, 1.811, 1.799, 1.787, 1.777, 1.768, 1.761, 1.761, 1.761, 1.762, 1.763, 1.764, 1.769, 1.776, 1.789, 1.799, 1.807, 1.824, 1.841, 1.853, 1.861, 1.871, 1.874, 1.885, 1.889, + 1.879, 1.875, 1.859, 1.846, 1.835, 1.817, 1.806, 1.794, 1.777, 1.771, 1.755, 1.743, 1.733, 1.726, 1.721, 1.721, 1.721, 1.722, 1.729, 1.734, 1.747, 1.759, 1.771, 1.783, 1.801, 1.813, 1.831, 1.841, 1.849, 1.862, 1.876, 1.888, + 1.876, 1.861, 1.846, 1.835, 1.817, 1.806, 1.793, 1.777, 1.766, 1.752, 1.736, 1.727, 1.713, 1.702, 1.696, 1.695, 1.695, 1.697, 1.704, 1.715, 1.725, 1.739, 1.754, 1.771, 1.783, 1.801, 1.813, 1.831, 1.841, 1.851, 1.866, 1.888, + 1.878, 1.861, 1.843, 1.829, 1.811, 1.794, 1.779, 1.766, 1.751, 1.734, 1.721, 1.711, 1.695, 1.682, 1.679, 1.677, 1.677, 1.678, 1.687, 1.696, 1.713, 1.723, 1.737, 1.754, 1.774, 1.785, 1.811, 1.825, 1.833, 1.849, 1.866, 1.889, + 1.882, 1.859, 1.837, 1.821, 1.803, 1.784, 1.769, 1.752, 1.735, 1.717, 1.701, 1.689, 1.676, 1.664, 1.659, 1.658, 1.658, 1.659, 1.668, 1.679, 1.694, 1.711, 1.723, 1.739, 1.756, 1.777, 1.797, 1.813, 1.827, 1.844, 1.865, 1.889, + 1.869, 1.849, 1.832, 1.811, 1.792, 1.772, 1.755, 1.737, 1.717, 1.699, 1.688, 1.674, 1.661, 1.646, 1.642, 1.638, 1.638, 1.641, 1.651, 1.659, 1.676, 1.693, 1.708, 1.724, 1.744, 1.763, 1.783, 1.801, 1.819, 1.838, 1.864, 1.889, + 1.869, 1.841, 1.817, 1.801, 1.782, 1.758, 1.741, 1.721, 1.699, 1.688, 1.674, 1.658, 1.643, 1.632, 1.627, 1.621, 1.621, 1.622, 1.631, 1.643, 1.658, 1.676, 1.689, 1.708, 1.729, 1.748, 1.767, 1.791, 1.812, 1.836, 1.859, 1.891, + 1.861, 1.836, 1.814, 1.792, 1.772, 1.745, 1.728, 1.707, 1.688, 1.673, 1.658, 1.643, 1.629, 1.618, 1.612, 1.609, 1.609, 1.611, 1.615, 1.629, 1.642, 1.658, 1.676, 1.689, 1.711, 1.734, 1.758, 1.782, 1.804, 1.827, 1.859, 1.891, + 1.861, 1.829, 1.807, 1.784, 1.759, 1.735, 1.717, 1.692, 1.674, 1.659, 1.644, 1.629, 1.617, 1.605, 1.598, 1.595, 1.595, 1.598, 1.607, 1.615, 1.631, 1.642, 1.661, 1.681, 1.701, 1.724, 1.746, 1.771, 1.799, 1.825, 1.857, 1.891, + 1.861, 1.826, 1.804, 1.779, 1.749, 1.729, 1.707, 1.687, 1.665, 1.648, 1.629, 1.617, 1.604, 1.595, 1.589, 1.585, 1.585, 1.592, 1.597, 1.607, 1.623, 1.635, 1.652, 1.674, 1.693, 1.716, 1.739, 1.766, 1.794, 1.822, 1.855, 1.889, + 1.861, 1.824, 1.799, 1.777, 1.748, 1.723, 1.701, 1.678, 1.657, 1.639, 1.619, 1.605, 1.596, 1.586, 1.581, 1.579, 1.577, 1.579, 1.588, 1.597, 1.612, 1.625, 1.641, 1.661, 1.681, 1.702, 1.732, 1.757, 1.785, 1.813, 1.847, 1.882, + 1.856, 1.819, 1.796, 1.767, 1.739, 1.714, 1.693, 1.666, 1.651, 1.629, 1.613, 1.597, 1.586, 1.579, 1.576, 1.572, 1.572, 1.573, 1.579, 1.588, 1.602, 1.619, 1.633, 1.655, 1.674, 1.698, 1.729, 1.754, 1.782, 1.809, 1.842, 1.874, + 1.853, 1.815, 1.792, 1.761, 1.734, 1.707, 1.682, 1.659, 1.639, 1.622, 1.605, 1.591, 1.579, 1.574, 1.569, 1.565, 1.566, 1.569, 1.573, 1.584, 1.597, 1.609, 1.624, 1.645, 1.666, 1.695, 1.722, 1.746, 1.772, 1.799, 1.835, 1.873, + 1.847, 1.811, 1.789, 1.759, 1.732, 1.703, 1.681, 1.657, 1.637, 1.619, 1.603, 1.588, 1.575, 1.569, 1.563, 1.561, 1.561, 1.563, 1.569, 1.576, 1.589, 1.601, 1.616, 1.636, 1.659, 1.686, 1.712, 1.741, 1.767, 1.798, 1.832, 1.873, + 1.847, 1.803, 1.779, 1.756, 1.727, 1.699, 1.674, 1.652, 1.632, 1.616, 1.595, 1.583, 1.572, 1.564, 1.558, 1.556, 1.557, 1.559, 1.563, 1.569, 1.583, 1.593, 1.613, 1.633, 1.657, 1.684, 1.709, 1.741, 1.766, 1.796, 1.831, 1.871, + 1.845, 1.802, 1.779, 1.755, 1.725, 1.696, 1.673, 1.649, 1.629, 1.614, 1.595, 1.582, 1.572, 1.563, 1.557, 1.556, 1.556, 1.558, 1.562, 1.569, 1.581, 1.593, 1.612, 1.633, 1.656, 1.679, 1.709, 1.741, 1.764, 1.796, 1.828, 1.869, + 1.845, 1.801, 1.779, 1.749, 1.723, 1.697, 1.673, 1.649, 1.627, 1.613, 1.593, 1.581, 1.573, 1.563, 1.558, 1.555, 1.555, 1.556, 1.562, 1.573, 1.581, 1.594, 1.611, 1.633, 1.656, 1.679, 1.711, 1.739, 1.764, 1.794, 1.828, 1.869, + 1.844, 1.801, 1.781, 1.749, 1.723, 1.697, 1.673, 1.649, 1.627, 1.614, 1.595, 1.581, 1.574, 1.564, 1.559, 1.557, 1.556, 1.559, 1.564, 1.574, 1.582, 1.595, 1.611, 1.634, 1.659, 1.683, 1.709, 1.739, 1.765, 1.794, 1.829, 1.872, + 1.845, 1.802, 1.781, 1.754, 1.725, 1.701, 1.677, 1.652, 1.632, 1.616, 1.599, 1.586, 1.576, 1.569, 1.563, 1.559, 1.558, 1.562, 1.569, 1.576, 1.587, 1.599, 1.618, 1.635, 1.661, 1.685, 1.709, 1.739, 1.767, 1.796, 1.829, 1.868, + 1.845, 1.809, 1.785, 1.762, 1.731, 1.706, 1.685, 1.659, 1.641, 1.622, 1.606, 1.595, 1.581, 1.575, 1.569, 1.564, 1.564, 1.569, 1.574, 1.582, 1.594, 1.607, 1.625, 1.642, 1.668, 1.687, 1.716, 1.741, 1.769, 1.798, 1.829, 1.868, + 1.849, 1.811, 1.785, 1.765, 1.734, 1.709, 1.688, 1.666, 1.647, 1.628, 1.613, 1.601, 1.592, 1.581, 1.575, 1.572, 1.572, 1.575, 1.581, 1.589, 1.599, 1.611, 1.631, 1.649, 1.673, 1.694, 1.721, 1.747, 1.771, 1.798, 1.829, 1.868, + 1.849, 1.816, 1.787, 1.766, 1.739, 1.716, 1.692, 1.673, 1.657, 1.641, 1.625, 1.612, 1.599, 1.592, 1.584, 1.581, 1.581, 1.581, 1.589, 1.598, 1.608, 1.622, 1.639, 1.659, 1.679, 1.701, 1.724, 1.751, 1.774, 1.802, 1.832, 1.868, + 1.855, 1.816, 1.793, 1.773, 1.748, 1.727, 1.707, 1.686, 1.667, 1.649, 1.636, 1.623, 1.612, 1.599, 1.594, 1.592, 1.591, 1.591, 1.598, 1.608, 1.621, 1.634, 1.649, 1.669, 1.693, 1.705, 1.736, 1.757, 1.778, 1.804, 1.833, 1.867, + 1.858, 1.818, 1.796, 1.778, 1.754, 1.733, 1.716, 1.695, 1.676, 1.661, 1.648, 1.635, 1.624, 1.613, 1.604, 1.601, 1.601, 1.606, 1.613, 1.621, 1.634, 1.646, 1.661, 1.679, 1.699, 1.714, 1.742, 1.761, 1.782, 1.809, 1.835, 1.867, + 1.857, 1.822, 1.801, 1.789, 1.766, 1.744, 1.726, 1.706, 1.688, 1.671, 1.659, 1.647, 1.635, 1.624, 1.621, 1.617, 1.617, 1.621, 1.627, 1.634, 1.645, 1.656, 1.674, 1.694, 1.709, 1.723, 1.751, 1.771, 1.786, 1.811, 1.837, 1.867, + 1.858, 1.824, 1.807, 1.794, 1.774, 1.757, 1.739, 1.716, 1.702, 1.687, 1.671, 1.662, 1.648, 1.636, 1.629, 1.629, 1.629, 1.633, 1.635, 1.646, 1.656, 1.669, 1.684, 1.705, 1.719, 1.732, 1.753, 1.774, 1.793, 1.815, 1.837, 1.871, + 1.858, 1.827, 1.809, 1.798, 1.782, 1.761, 1.749, 1.727, 1.711, 1.698, 1.687, 1.675, 1.663, 1.649, 1.646, 1.643, 1.643, 1.646, 1.649, 1.658, 1.669, 1.683, 1.698, 1.716, 1.731, 1.746, 1.761, 1.783, 1.795, 1.817, 1.836, 1.862, + 1.862, 1.834, 1.816, 1.805, 1.789, 1.774, 1.759, 1.743, 1.725, 1.711, 1.697, 1.688, 1.678, 1.668, 1.661, 1.659, 1.658, 1.659, 1.668, 1.673, 1.684, 1.698, 1.713, 1.728, 1.742, 1.757, 1.771, 1.791, 1.804, 1.821, 1.836, 1.862, + 1.859, 1.835, 1.825, 1.813, 1.794, 1.782, 1.771, 1.757, 1.739, 1.725, 1.711, 1.701, 1.693, 1.683, 1.679, 1.679, 1.679, 1.683, 1.689, 1.693, 1.698, 1.714, 1.726, 1.741, 1.754, 1.769, 1.781, 1.797, 1.808, 1.821, 1.835, 1.856, + 1.848, 1.836, 1.832, 1.822, 1.806, 1.789, 1.778, 1.765, 1.751, 1.739, 1.726, 1.718, 1.709, 1.699, 1.696, 1.695, 1.695, 1.696, 1.704, 1.705, 1.714, 1.724, 1.739, 1.753, 1.765, 1.777, 1.789, 1.803, 1.816, 1.824, 1.829, 1.842, + 1.839, 1.835, 1.834, 1.829, 1.815, 1.801, 1.787, 1.776, 1.759, 1.751, 1.744, 1.736, 1.724, 1.714, 1.711, 1.708, 1.707, 1.707, 1.717, 1.719, 1.724, 1.734, 1.748, 1.762, 1.775, 1.783, 1.796, 1.808, 1.819, 1.825, 1.828, 1.833, + 1.836, 1.833, 1.834, 1.832, 1.821, 1.806, 1.792, 1.785, 1.772, 1.759, 1.751, 1.744, 1.736, 1.725, 1.719, 1.715, 1.715, 1.718, 1.721, 1.728, 1.734, 1.736, 1.757, 1.768, 1.779, 1.787, 1.799, 1.812, 1.821, 1.824, 1.825, 1.833 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 3000, + "table": + [ + 2.189, 2.127, 2.115, 2.106, 2.113, 2.119, 2.131, 2.144, 2.155, 2.168, 2.176, 2.179, 2.181, 2.181, 2.185, 2.187, 2.187, 2.183, 2.179, 2.176, 2.169, 2.167, 2.159, 2.152, 2.145, 2.141, 2.135, 2.128, 2.124, 2.124, 2.139, 2.177, + 2.176, 2.133, 2.116, 2.112, 2.116, 2.125, 2.137, 2.154, 2.168, 2.179, 2.187, 2.194, 2.201, 2.204, 2.208, 2.208, 2.205, 2.202, 2.198, 2.195, 2.183, 2.177, 2.166, 2.159, 2.149, 2.143, 2.138, 2.132, 2.124, 2.125, 2.136, 2.164, + 2.175, 2.133, 2.117, 2.115, 2.121, 2.136, 2.154, 2.165, 2.179, 2.192, 2.198, 2.211, 2.218, 2.219, 2.221, 2.221, 2.217, 2.216, 2.211, 2.202, 2.197, 2.188, 2.181, 2.171, 2.159, 2.151, 2.141, 2.136, 2.125, 2.125, 2.132, 2.155, + 2.172, 2.128, 2.116, 2.116, 2.124, 2.143, 2.161, 2.177, 2.192, 2.204, 2.213, 2.221, 2.227, 2.231, 2.237, 2.237, 2.229, 2.224, 2.221, 2.213, 2.207, 2.197, 2.191, 2.179, 2.169, 2.156, 2.148, 2.138, 2.126, 2.123, 2.124, 2.149, + 2.169, 2.124, 2.119, 2.119, 2.135, 2.152, 2.174, 2.187, 2.204, 2.211, 2.224, 2.233, 2.236, 2.241, 2.246, 2.246, 2.243, 2.237, 2.234, 2.226, 2.218, 2.211, 2.199, 2.191, 2.177, 2.166, 2.155, 2.139, 2.129, 2.121, 2.121, 2.143, + 2.157, 2.124, 2.121, 2.127, 2.145, 2.157, 2.181, 2.197, 2.208, 2.221, 2.238, 2.245, 2.249, 2.249, 2.254, 2.254, 2.249, 2.247, 2.243, 2.237, 2.228, 2.219, 2.209, 2.198, 2.186, 2.172, 2.161, 2.143, 2.129, 2.121, 2.121, 2.141, + 2.157, 2.124, 2.124, 2.131, 2.148, 2.161, 2.188, 2.202, 2.214, 2.238, 2.246, 2.251, 2.255, 2.257, 2.259, 2.259, 2.257, 2.252, 2.251, 2.247, 2.238, 2.231, 2.219, 2.204, 2.193, 2.173, 2.166, 2.152, 2.134, 2.119, 2.119, 2.131, + 2.155, 2.125, 2.125, 2.135, 2.151, 2.169, 2.191, 2.207, 2.219, 2.243, 2.253, 2.258, 2.261, 2.266, 2.266, 2.267, 2.265, 2.262, 2.261, 2.254, 2.244, 2.238, 2.228, 2.212, 2.197, 2.179, 2.167, 2.158, 2.137, 2.122, 2.121, 2.131, + 2.155, 2.127, 2.127, 2.137, 2.153, 2.173, 2.197, 2.213, 2.231, 2.248, 2.257, 2.266, 2.271, 2.272, 2.274, 2.275, 2.275, 2.273, 2.271, 2.266, 2.257, 2.251, 2.238, 2.227, 2.209, 2.195, 2.175, 2.159, 2.141, 2.128, 2.127, 2.131, + 2.155, 2.128, 2.128, 2.139, 2.159, 2.182, 2.206, 2.225, 2.243, 2.252, 2.265, 2.272, 2.277, 2.283, 2.286, 2.284, 2.283, 2.282, 2.274, 2.272, 2.266, 2.256, 2.244, 2.238, 2.221, 2.202, 2.186, 2.169, 2.149, 2.129, 2.129, 2.135, + 2.154, 2.131, 2.131, 2.149, 2.166, 2.189, 2.211, 2.234, 2.248, 2.262, 2.272, 2.277, 2.287, 2.291, 2.293, 2.292, 2.291, 2.285, 2.284, 2.279, 2.272, 2.263, 2.254, 2.243, 2.226, 2.206, 2.193, 2.174, 2.153, 2.133, 2.133, 2.135, + 2.153, 2.135, 2.135, 2.151, 2.172, 2.198, 2.221, 2.238, 2.255, 2.265, 2.274, 2.287, 2.291, 2.296, 2.298, 2.298, 2.301, 2.297, 2.289, 2.285, 2.277, 2.271, 2.261, 2.251, 2.236, 2.216, 2.199, 2.179, 2.158, 2.135, 2.134, 2.135, + 2.152, 2.136, 2.136, 2.154, 2.176, 2.199, 2.224, 2.239, 2.256, 2.267, 2.282, 2.289, 2.295, 2.299, 2.303, 2.303, 2.302, 2.299, 2.297, 2.288, 2.284, 2.274, 2.262, 2.253, 2.238, 2.219, 2.202, 2.181, 2.158, 2.137, 2.135, 2.135, + 2.143, 2.134, 2.134, 2.154, 2.177, 2.201, 2.224, 2.241, 2.256, 2.271, 2.282, 2.289, 2.297, 2.302, 2.306, 2.306, 2.304, 2.301, 2.298, 2.289, 2.287, 2.272, 2.265, 2.255, 2.241, 2.221, 2.203, 2.183, 2.164, 2.141, 2.136, 2.135, + 2.142, 2.133, 2.133, 2.155, 2.178, 2.202, 2.223, 2.243, 2.258, 2.273, 2.283, 2.288, 2.296, 2.299, 2.306, 2.306, 2.301, 2.299, 2.296, 2.289, 2.286, 2.271, 2.267, 2.256, 2.244, 2.219, 2.206, 2.188, 2.163, 2.141, 2.137, 2.134, + 2.141, 2.131, 2.131, 2.153, 2.179, 2.202, 2.224, 2.242, 2.254, 2.274, 2.283, 2.288, 2.295, 2.298, 2.301, 2.301, 2.301, 2.296, 2.295, 2.289, 2.285, 2.271, 2.267, 2.257, 2.246, 2.223, 2.204, 2.188, 2.165, 2.141, 2.136, 2.134, + 2.141, 2.133, 2.133, 2.151, 2.179, 2.201, 2.224, 2.241, 2.254, 2.275, 2.283, 2.288, 2.294, 2.296, 2.298, 2.297, 2.295, 2.295, 2.294, 2.291, 2.284, 2.272, 2.267, 2.256, 2.248, 2.225, 2.208, 2.192, 2.167, 2.141, 2.137, 2.134, + 2.141, 2.132, 2.132, 2.151, 2.177, 2.199, 2.221, 2.238, 2.252, 2.274, 2.281, 2.287, 2.293, 2.295, 2.296, 2.294, 2.295, 2.295, 2.294, 2.291, 2.284, 2.274, 2.266, 2.257, 2.248, 2.226, 2.206, 2.189, 2.167, 2.143, 2.141, 2.141, + 2.141, 2.133, 2.133, 2.153, 2.175, 2.201, 2.221, 2.238, 2.252, 2.271, 2.278, 2.284, 2.288, 2.291, 2.292, 2.291, 2.293, 2.293, 2.293, 2.287, 2.279, 2.275, 2.266, 2.256, 2.243, 2.224, 2.206, 2.189, 2.168, 2.146, 2.142, 2.134, + 2.137, 2.131, 2.131, 2.154, 2.173, 2.199, 2.221, 2.236, 2.251, 2.267, 2.272, 2.278, 2.284, 2.287, 2.288, 2.286, 2.288, 2.288, 2.288, 2.283, 2.277, 2.273, 2.265, 2.256, 2.241, 2.219, 2.205, 2.187, 2.167, 2.144, 2.137, 2.132, + 2.136, 2.131, 2.131, 2.152, 2.169, 2.197, 2.218, 2.233, 2.246, 2.257, 2.269, 2.274, 2.281, 2.284, 2.286, 2.285, 2.286, 2.286, 2.286, 2.279, 2.274, 2.269, 2.263, 2.254, 2.239, 2.217, 2.203, 2.181, 2.162, 2.143, 2.133, 2.131, + 2.136, 2.131, 2.131, 2.151, 2.167, 2.189, 2.205, 2.226, 2.242, 2.253, 2.261, 2.271, 2.275, 2.279, 2.283, 2.283, 2.284, 2.284, 2.281, 2.277, 2.271, 2.264, 2.257, 2.246, 2.232, 2.215, 2.195, 2.176, 2.158, 2.141, 2.131, 2.128, + 2.136, 2.129, 2.131, 2.147, 2.162, 2.181, 2.203, 2.219, 2.236, 2.246, 2.256, 2.263, 2.271, 2.274, 2.278, 2.278, 2.276, 2.277, 2.276, 2.273, 2.266, 2.258, 2.251, 2.241, 2.227, 2.198, 2.191, 2.169, 2.154, 2.136, 2.125, 2.122, + 2.132, 2.126, 2.126, 2.139, 2.153, 2.168, 2.194, 2.212, 2.224, 2.238, 2.251, 2.258, 2.263, 2.266, 2.269, 2.271, 2.269, 2.269, 2.269, 2.267, 2.259, 2.253, 2.245, 2.237, 2.219, 2.196, 2.179, 2.162, 2.149, 2.132, 2.122, 2.121, + 2.124, 2.119, 2.121, 2.137, 2.147, 2.164, 2.183, 2.199, 2.219, 2.231, 2.239, 2.251, 2.257, 2.261, 2.262, 2.262, 2.259, 2.259, 2.261, 2.258, 2.253, 2.245, 2.237, 2.224, 2.209, 2.187, 2.174, 2.157, 2.141, 2.122, 2.121, 2.121, + 2.123, 2.115, 2.115, 2.131, 2.138, 2.157, 2.174, 2.188, 2.207, 2.221, 2.233, 2.239, 2.243, 2.244, 2.244, 2.244, 2.246, 2.245, 2.246, 2.244, 2.241, 2.231, 2.224, 2.212, 2.195, 2.176, 2.159, 2.145, 2.128, 2.117, 2.117, 2.123, + 2.123, 2.113, 2.113, 2.123, 2.132, 2.141, 2.162, 2.177, 2.191, 2.208, 2.221, 2.231, 2.231, 2.232, 2.234, 2.235, 2.235, 2.235, 2.238, 2.237, 2.225, 2.214, 2.209, 2.199, 2.181, 2.164, 2.146, 2.135, 2.123, 2.116, 2.116, 2.115, + 2.129, 2.115, 2.115, 2.121, 2.128, 2.135, 2.149, 2.164, 2.178, 2.193, 2.207, 2.221, 2.222, 2.222, 2.223, 2.224, 2.224, 2.224, 2.224, 2.223, 2.214, 2.205, 2.196, 2.185, 2.171, 2.151, 2.141, 2.129, 2.119, 2.116, 2.116, 2.117, + 2.137, 2.119, 2.119, 2.119, 2.122, 2.129, 2.141, 2.159, 2.167, 2.182, 2.195, 2.206, 2.211, 2.216, 2.218, 2.219, 2.219, 2.219, 2.217, 2.212, 2.202, 2.194, 2.184, 2.174, 2.162, 2.145, 2.134, 2.124, 2.118, 2.117, 2.118, 2.121, + 2.138, 2.131, 2.121, 2.122, 2.125, 2.128, 2.137, 2.154, 2.162, 2.176, 2.187, 2.194, 2.196, 2.198, 2.205, 2.205, 2.202, 2.202, 2.203, 2.201, 2.191, 2.182, 2.174, 2.162, 2.149, 2.136, 2.126, 2.121, 2.119, 2.118, 2.127, 2.133, + 2.157, 2.148, 2.131, 2.129, 2.129, 2.136, 2.148, 2.157, 2.169, 2.177, 2.182, 2.187, 2.188, 2.191, 2.193, 2.193, 2.192, 2.199, 2.201, 2.199, 2.186, 2.178, 2.167, 2.152, 2.146, 2.137, 2.126, 2.124, 2.121, 2.126, 2.133, 2.151, + 2.161, 2.157, 2.148, 2.147, 2.147, 2.147, 2.154, 2.162, 2.174, 2.179, 2.181, 2.184, 2.186, 2.187, 2.189, 2.189, 2.187, 2.188, 2.199, 2.201, 2.187, 2.178, 2.163, 2.148, 2.145, 2.141, 2.131, 2.129, 2.128, 2.135, 2.151, 2.153 + ] + }, + { + "ct": 5000, + "table": + [ + 1.191, 1.165, 1.156, 1.155, 1.157, 1.161, 1.168, 1.176, 1.179, 1.185, 1.187, 1.189, 1.189, 1.189, 1.191, 1.191, 1.191, 1.189, 1.188, 1.188, 1.185, 1.184, 1.182, 1.178, 1.173, 1.171, 1.166, 1.163, 1.159, 1.159, 1.164, 1.187, + 1.188, 1.164, 1.157, 1.156, 1.158, 1.166, 1.173, 1.179, 1.185, 1.193, 1.195, 1.198, 1.199, 1.201, 1.201, 1.202, 1.201, 1.199, 1.199, 1.196, 1.194, 1.189, 1.185, 1.182, 1.177, 1.172, 1.168, 1.164, 1.161, 1.161, 1.162, 1.181, + 1.184, 1.164, 1.157, 1.157, 1.161, 1.171, 1.179, 1.185, 1.193, 1.197, 1.201, 1.206, 1.208, 1.209, 1.209, 1.208, 1.207, 1.207, 1.207, 1.202, 1.199, 1.195, 1.192, 1.189, 1.182, 1.176, 1.171, 1.166, 1.161, 1.159, 1.161, 1.177, + 1.183, 1.162, 1.158, 1.158, 1.163, 1.174, 1.182, 1.191, 1.197, 1.203, 1.208, 1.212, 1.214, 1.214, 1.218, 1.218, 1.214, 1.212, 1.211, 1.208, 1.206, 1.201, 1.197, 1.192, 1.189, 1.179, 1.174, 1.168, 1.162, 1.159, 1.159, 1.173, + 1.181, 1.159, 1.159, 1.159, 1.168, 1.178, 1.189, 1.196, 1.204, 1.208, 1.213, 1.217, 1.219, 1.221, 1.222, 1.222, 1.222, 1.221, 1.219, 1.215, 1.212, 1.208, 1.202, 1.197, 1.189, 1.183, 1.178, 1.169, 1.163, 1.158, 1.158, 1.169, + 1.174, 1.159, 1.159, 1.164, 1.172, 1.179, 1.192, 1.201, 1.208, 1.212, 1.219, 1.224, 1.225, 1.227, 1.228, 1.228, 1.226, 1.225, 1.224, 1.221, 1.217, 1.212, 1.208, 1.202, 1.194, 1.187, 1.181, 1.172, 1.164, 1.157, 1.157, 1.169, + 1.174, 1.159, 1.159, 1.165, 1.174, 1.184, 1.197, 1.205, 1.209, 1.219, 1.224, 1.228, 1.231, 1.231, 1.231, 1.231, 1.229, 1.229, 1.228, 1.226, 1.222, 1.218, 1.212, 1.205, 1.199, 1.188, 1.181, 1.175, 1.165, 1.157, 1.157, 1.163, + 1.173, 1.159, 1.159, 1.165, 1.176, 1.186, 1.198, 1.207, 1.213, 1.223, 1.229, 1.231, 1.235, 1.236, 1.236, 1.236, 1.236, 1.235, 1.234, 1.232, 1.226, 1.223, 1.218, 1.209, 1.201, 1.192, 1.183, 1.178, 1.165, 1.157, 1.157, 1.163, + 1.172, 1.159, 1.159, 1.166, 1.176, 1.188, 1.201, 1.209, 1.217, 1.227, 1.231, 1.236, 1.238, 1.239, 1.241, 1.242, 1.242, 1.241, 1.239, 1.235, 1.232, 1.227, 1.223, 1.215, 1.208, 1.199, 1.187, 1.179, 1.167, 1.159, 1.159, 1.163, + 1.172, 1.159, 1.159, 1.166, 1.177, 1.189, 1.203, 1.212, 1.223, 1.228, 1.236, 1.239, 1.242, 1.245, 1.246, 1.246, 1.247, 1.246, 1.242, 1.241, 1.237, 1.232, 1.226, 1.223, 1.213, 1.202, 1.191, 1.182, 1.172, 1.159, 1.159, 1.163, + 1.168, 1.158, 1.158, 1.167, 1.179, 1.192, 1.204, 1.218, 1.225, 1.233, 1.238, 1.242, 1.246, 1.248, 1.251, 1.251, 1.249, 1.248, 1.247, 1.244, 1.239, 1.237, 1.228, 1.223, 1.214, 1.203, 1.194, 1.183, 1.173, 1.161, 1.161, 1.162, + 1.166, 1.158, 1.158, 1.168, 1.183, 1.195, 1.207, 1.218, 1.226, 1.233, 1.239, 1.246, 1.248, 1.251, 1.254, 1.254, 1.254, 1.251, 1.249, 1.247, 1.242, 1.239, 1.232, 1.227, 1.219, 1.207, 1.195, 1.186, 1.175, 1.162, 1.161, 1.162, + 1.165, 1.158, 1.158, 1.168, 1.183, 1.196, 1.208, 1.219, 1.227, 1.234, 1.241, 1.247, 1.251, 1.254, 1.255, 1.256, 1.256, 1.254, 1.252, 1.249, 1.246, 1.241, 1.234, 1.228, 1.221, 1.211, 1.199, 1.187, 1.175, 1.163, 1.162, 1.162, + 1.161, 1.158, 1.158, 1.169, 1.183, 1.196, 1.208, 1.217, 1.227, 1.234, 1.241, 1.247, 1.253, 1.254, 1.256, 1.257, 1.256, 1.255, 1.253, 1.249, 1.247, 1.241, 1.236, 1.229, 1.221, 1.211, 1.199, 1.189, 1.176, 1.164, 1.163, 1.162, + 1.161, 1.156, 1.156, 1.169, 1.183, 1.196, 1.207, 1.218, 1.227, 1.235, 1.241, 1.246, 1.252, 1.254, 1.256, 1.257, 1.256, 1.254, 1.253, 1.249, 1.247, 1.241, 1.237, 1.231, 1.223, 1.211, 1.201, 1.191, 1.177, 1.164, 1.164, 1.161, + 1.161, 1.155, 1.155, 1.169, 1.182, 1.195, 1.208, 1.216, 1.225, 1.235, 1.241, 1.245, 1.249, 1.252, 1.254, 1.254, 1.254, 1.253, 1.252, 1.249, 1.246, 1.239, 1.237, 1.231, 1.224, 1.211, 1.201, 1.191, 1.178, 1.164, 1.162, 1.161, + 1.159, 1.155, 1.155, 1.168, 1.181, 1.195, 1.208, 1.217, 1.223, 1.235, 1.241, 1.244, 1.248, 1.251, 1.252, 1.252, 1.252, 1.252, 1.251, 1.248, 1.245, 1.241, 1.236, 1.231, 1.224, 1.212, 1.202, 1.191, 1.179, 1.164, 1.162, 1.161, + 1.158, 1.154, 1.154, 1.167, 1.181, 1.194, 1.206, 1.216, 1.222, 1.234, 1.237, 1.242, 1.245, 1.248, 1.251, 1.249, 1.249, 1.249, 1.249, 1.248, 1.244, 1.241, 1.235, 1.229, 1.223, 1.213, 1.202, 1.191, 1.179, 1.167, 1.163, 1.163, + 1.158, 1.154, 1.154, 1.168, 1.181, 1.194, 1.206, 1.215, 1.223, 1.231, 1.236, 1.239, 1.243, 1.245, 1.246, 1.246, 1.248, 1.248, 1.248, 1.245, 1.242, 1.239, 1.235, 1.229, 1.223, 1.213, 1.202, 1.191, 1.179, 1.167, 1.163, 1.162, + 1.157, 1.154, 1.154, 1.168, 1.179, 1.194, 1.205, 1.215, 1.222, 1.229, 1.233, 1.236, 1.239, 1.243, 1.244, 1.244, 1.245, 1.245, 1.244, 1.243, 1.239, 1.236, 1.234, 1.229, 1.222, 1.211, 1.202, 1.191, 1.179, 1.166, 1.163, 1.161, + 1.156, 1.155, 1.155, 1.168, 1.179, 1.193, 1.205, 1.213, 1.219, 1.225, 1.231, 1.234, 1.238, 1.239, 1.241, 1.243, 1.243, 1.243, 1.243, 1.239, 1.237, 1.235, 1.231, 1.228, 1.221, 1.209, 1.199, 1.189, 1.178, 1.166, 1.162, 1.159, + 1.156, 1.156, 1.157, 1.167, 1.178, 1.191, 1.199, 1.209, 1.217, 1.223, 1.226, 1.231, 1.233, 1.236, 1.239, 1.239, 1.241, 1.241, 1.239, 1.237, 1.235, 1.232, 1.229, 1.224, 1.217, 1.209, 1.196, 1.187, 1.176, 1.165, 1.159, 1.157, + 1.157, 1.157, 1.157, 1.166, 1.175, 1.187, 1.198, 1.205, 1.213, 1.219, 1.223, 1.227, 1.231, 1.233, 1.236, 1.236, 1.234, 1.235, 1.235, 1.235, 1.231, 1.229, 1.227, 1.222, 1.216, 1.201, 1.194, 1.184, 1.174, 1.163, 1.157, 1.156, + 1.158, 1.155, 1.155, 1.165, 1.172, 1.181, 1.194, 1.202, 1.208, 1.215, 1.221, 1.223, 1.227, 1.229, 1.231, 1.231, 1.231, 1.232, 1.233, 1.231, 1.228, 1.227, 1.223, 1.219, 1.213, 1.199, 1.189, 1.181, 1.171, 1.161, 1.157, 1.156, + 1.155, 1.154, 1.154, 1.164, 1.169, 1.179, 1.189, 1.196, 1.203, 1.208, 1.215, 1.221, 1.222, 1.224, 1.225, 1.225, 1.226, 1.228, 1.228, 1.227, 1.225, 1.222, 1.219, 1.213, 1.206, 1.196, 1.187, 1.177, 1.168, 1.159, 1.156, 1.156, + 1.155, 1.152, 1.152, 1.162, 1.167, 1.175, 1.185, 1.191, 1.198, 1.205, 1.209, 1.214, 1.216, 1.217, 1.217, 1.217, 1.219, 1.219, 1.219, 1.219, 1.217, 1.215, 1.213, 1.207, 1.199, 1.191, 1.179, 1.172, 1.165, 1.156, 1.155, 1.155, + 1.155, 1.152, 1.152, 1.161, 1.163, 1.169, 1.179, 1.186, 1.192, 1.198, 1.204, 1.208, 1.211, 1.211, 1.211, 1.212, 1.212, 1.213, 1.215, 1.215, 1.211, 1.208, 1.205, 1.199, 1.194, 1.185, 1.175, 1.167, 1.161, 1.156, 1.155, 1.153, + 1.157, 1.152, 1.152, 1.159, 1.162, 1.166, 1.174, 1.181, 1.187, 1.192, 1.197, 1.203, 1.204, 1.205, 1.204, 1.204, 1.204, 1.205, 1.206, 1.206, 1.204, 1.201, 1.198, 1.194, 1.187, 1.176, 1.171, 1.164, 1.159, 1.156, 1.155, 1.154, + 1.159, 1.154, 1.154, 1.158, 1.159, 1.163, 1.171, 1.176, 1.181, 1.187, 1.191, 1.195, 1.198, 1.199, 1.199, 1.201, 1.201, 1.202, 1.202, 1.199, 1.196, 1.193, 1.191, 1.188, 1.182, 1.174, 1.166, 1.162, 1.157, 1.156, 1.156, 1.156, + 1.162, 1.161, 1.158, 1.159, 1.159, 1.162, 1.167, 1.173, 1.178, 1.181, 1.186, 1.189, 1.189, 1.191, 1.193, 1.193, 1.193, 1.194, 1.194, 1.194, 1.189, 1.187, 1.186, 1.182, 1.176, 1.167, 1.163, 1.159, 1.158, 1.157, 1.158, 1.161, + 1.172, 1.165, 1.162, 1.162, 1.163, 1.166, 1.169, 1.173, 1.178, 1.181, 1.182, 1.185, 1.186, 1.186, 1.186, 1.187, 1.187, 1.189, 1.192, 1.191, 1.187, 1.185, 1.181, 1.177, 1.172, 1.167, 1.163, 1.159, 1.159, 1.161, 1.163, 1.166, + 1.173, 1.172, 1.166, 1.165, 1.166, 1.168, 1.171, 1.176, 1.179, 1.182, 1.181, 1.183, 1.185, 1.185, 1.185, 1.185, 1.185, 1.185, 1.191, 1.191, 1.185, 1.181, 1.179, 1.173, 1.169, 1.168, 1.163, 1.162, 1.161, 1.164, 1.166, 1.167 + ] + } + ], + "luminance_lut": + [ + 2.271, 2.218, 2.105, 2.004, 1.909, 1.829, 1.762, 1.705, 1.665, 1.629, 1.592, 1.559, 1.528, 1.516, 1.511, 1.511, 1.511, 1.514, 1.525, 1.553, 1.585, 1.617, 1.655, 1.697, 1.752, 1.816, 1.893, 1.982, 2.084, 2.195, 2.321, 2.342, + 2.218, 2.166, 2.057, 1.959, 1.871, 1.793, 1.726, 1.675, 1.633, 1.592, 1.559, 1.528, 1.503, 1.484, 1.474, 1.472, 1.472, 1.482, 1.499, 1.523, 1.553, 1.585, 1.619, 1.664, 1.715, 1.779, 1.855, 1.938, 2.037, 2.147, 2.259, 2.321, + 2.166, 2.101, 1.997, 1.901, 1.818, 1.743, 1.683, 1.634, 1.588, 1.546, 1.508, 1.476, 1.449, 1.429, 1.418, 1.415, 1.415, 1.425, 1.444, 1.469, 1.501, 1.538, 1.577, 1.622, 1.671, 1.728, 1.799, 1.881, 1.975, 2.078, 2.185, 2.259, + 2.101, 2.039, 1.938, 1.848, 1.768, 1.699, 1.641, 1.588, 1.541, 1.494, 1.455, 1.421, 1.394, 1.374, 1.361, 1.357, 1.357, 1.367, 1.388, 1.414, 1.448, 1.485, 1.528, 1.577, 1.626, 1.682, 1.748, 1.827, 1.917, 2.014, 2.119, 2.185, + 2.039, 1.979, 1.883, 1.795, 1.722, 1.658, 1.596, 1.541, 1.493, 1.443, 1.401, 1.364, 1.336, 1.316, 1.303, 1.301, 1.301, 1.311, 1.331, 1.359, 1.393, 1.432, 1.482, 1.528, 1.582, 1.641, 1.701, 1.775, 1.861, 1.956, 2.056, 2.119, + 1.979, 1.932, 1.836, 1.752, 1.685, 1.621, 1.557, 1.497, 1.443, 1.399, 1.351, 1.314, 1.286, 1.264, 1.253, 1.249, 1.249, 1.259, 1.281, 1.311, 1.344, 1.387, 1.432, 1.484, 1.541, 1.601, 1.662, 1.731, 1.816, 1.908, 2.003, 2.056, + 1.934, 1.888, 1.798, 1.719, 1.651, 1.584, 1.519, 1.457, 1.401, 1.351, 1.307, 1.268, 1.239, 1.217, 1.206, 1.203, 1.203, 1.212, 1.234, 1.263, 1.298, 1.344, 1.387, 1.442, 1.502, 1.565, 1.628, 1.693, 1.774, 1.864, 1.956, 2.003, + 1.901, 1.851, 1.763, 1.688, 1.618, 1.551, 1.483, 1.419, 1.359, 1.307, 1.268, 1.226, 1.195, 1.175, 1.164, 1.161, 1.161, 1.171, 1.192, 1.221, 1.262, 1.298, 1.346, 1.404, 1.466, 1.532, 1.595, 1.661, 1.738, 1.826, 1.917, 1.956, + 1.873, 1.821, 1.734, 1.659, 1.591, 1.519, 1.451, 1.386, 1.324, 1.269, 1.226, 1.192, 1.159, 1.141, 1.127, 1.125, 1.125, 1.135, 1.155, 1.187, 1.221, 1.262, 1.311, 1.368, 1.432, 1.499, 1.566, 1.634, 1.708, 1.793, 1.882, 1.917, + 1.847, 1.797, 1.713, 1.639, 1.565, 1.493, 1.422, 1.355, 1.291, 1.238, 1.192, 1.159, 1.128, 1.108, 1.097, 1.094, 1.094, 1.104, 1.125, 1.155, 1.187, 1.229, 1.279, 1.338, 1.403, 1.471, 1.541, 1.611, 1.684, 1.766, 1.853, 1.885, + 1.828, 1.772, 1.691, 1.614, 1.539, 1.466, 1.394, 1.325, 1.264, 1.209, 1.163, 1.128, 1.104, 1.081, 1.069, 1.067, 1.067, 1.078, 1.101, 1.125, 1.159, 1.201, 1.252, 1.312, 1.379, 1.447, 1.517, 1.591, 1.665, 1.743, 1.831, 1.862, + 1.812, 1.754, 1.677, 1.599, 1.519, 1.445, 1.371, 1.302, 1.239, 1.185, 1.139, 1.104, 1.081, 1.061, 1.048, 1.046, 1.046, 1.058, 1.078, 1.102, 1.136, 1.177, 1.229, 1.289, 1.356, 1.425, 1.497, 1.572, 1.647, 1.724, 1.811, 1.847, + 1.798, 1.741, 1.663, 1.585, 1.506, 1.429, 1.353, 1.284, 1.221, 1.167, 1.121, 1.086, 1.061, 1.046, 1.031, 1.029, 1.029, 1.044, 1.058, 1.083, 1.116, 1.159, 1.209, 1.271, 1.338, 1.407, 1.479, 1.557, 1.633, 1.709, 1.792, 1.832, + 1.792, 1.727, 1.651, 1.572, 1.494, 1.414, 1.339, 1.269, 1.206, 1.152, 1.106, 1.072, 1.046, 1.031, 1.018, 1.016, 1.016, 1.029, 1.044, 1.069, 1.102, 1.145, 1.196, 1.256, 1.324, 1.394, 1.471, 1.545, 1.624, 1.698, 1.782, 1.825, + 1.787, 1.724, 1.647, 1.566, 1.484, 1.407, 1.329, 1.258, 1.196, 1.141, 1.097, 1.062, 1.036, 1.018, 1.012, 1.007, 1.011, 1.016, 1.034, 1.059, 1.093, 1.135, 1.186, 1.246, 1.314, 1.386, 1.461, 1.538, 1.616, 1.691, 1.773, 1.818, + 1.786, 1.721, 1.642, 1.562, 1.481, 1.402, 1.325, 1.254, 1.191, 1.137, 1.092, 1.057, 1.031, 1.013, 1.004, 1.001, 1.004, 1.011, 1.028, 1.054, 1.088, 1.129, 1.181, 1.241, 1.308, 1.382, 1.458, 1.535, 1.613, 1.687, 1.769, 1.818, + 1.786, 1.721, 1.642, 1.562, 1.481, 1.401, 1.325, 1.253, 1.191, 1.136, 1.091, 1.057, 1.031, 1.013, 1.003, 1.001, 1.001, 1.011, 1.028, 1.054, 1.088, 1.129, 1.181, 1.241, 1.308, 1.382, 1.458, 1.535, 1.613, 1.687, 1.769, 1.818, + 1.787, 1.722, 1.643, 1.563, 1.482, 1.402, 1.326, 1.254, 1.192, 1.138, 1.092, 1.057, 1.032, 1.013, 1.006, 1.002, 1.006, 1.012, 1.031, 1.057, 1.092, 1.133, 1.185, 1.243, 1.311, 1.385, 1.461, 1.539, 1.618, 1.691, 1.774, 1.821, + 1.789, 1.729, 1.651, 1.571, 1.489, 1.411, 1.334, 1.263, 1.201, 1.147, 1.101, 1.065, 1.038, 1.021, 1.013, 1.009, 1.012, 1.021, 1.038, 1.064, 1.098, 1.141, 1.193, 1.254, 1.321, 1.395, 1.472, 1.549, 1.626, 1.701, 1.785, 1.825, + 1.799, 1.739, 1.661, 1.581, 1.502, 1.422, 1.347, 1.277, 1.214, 1.159, 1.111, 1.075, 1.049, 1.037, 1.021, 1.019, 1.021, 1.036, 1.049, 1.076, 1.111, 1.154, 1.207, 1.268, 1.334, 1.408, 1.485, 1.562, 1.639, 1.715, 1.799, 1.837, + 1.811, 1.755, 1.676, 1.597, 1.518, 1.439, 1.365, 1.295, 1.231, 1.176, 1.129, 1.093, 1.067, 1.049, 1.038, 1.036, 1.036, 1.049, 1.067, 1.094, 1.129, 1.173, 1.225, 1.286, 1.353, 1.425, 1.501, 1.577, 1.653, 1.729, 1.815, 1.851, + 1.829, 1.774, 1.693, 1.615, 1.537, 1.462, 1.387, 1.316, 1.253, 1.198, 1.153, 1.115, 1.091, 1.067, 1.059, 1.056, 1.056, 1.067, 1.092, 1.115, 1.151, 1.196, 1.249, 1.309, 1.375, 1.446, 1.522, 1.595, 1.672, 1.752, 1.839, 1.871, + 1.851, 1.801, 1.713, 1.636, 1.561, 1.485, 1.411, 1.342, 1.281, 1.226, 1.179, 1.145, 1.115, 1.091, 1.082, 1.081, 1.082, 1.092, 1.115, 1.143, 1.178, 1.223, 1.276, 1.337, 1.402, 1.472, 1.544, 1.618, 1.691, 1.774, 1.865, 1.896, + 1.876, 1.831, 1.739, 1.663, 1.588, 1.513, 1.439, 1.374, 1.312, 1.258, 1.212, 1.179, 1.145, 1.123, 1.113, 1.112, 1.112, 1.122, 1.143, 1.177, 1.211, 1.256, 1.308, 1.368, 1.431, 1.501, 1.572, 1.641, 1.716, 1.802, 1.896, 1.931, + 1.909, 1.867, 1.771, 1.691, 1.617, 1.545, 1.474, 1.411, 1.349, 1.296, 1.252, 1.212, 1.182, 1.159, 1.149, 1.148, 1.149, 1.158, 1.179, 1.211, 1.253, 1.293, 1.344, 1.403, 1.465, 1.533, 1.603, 1.669, 1.747, 1.836, 1.931, 1.974, + 1.952, 1.905, 1.806, 1.722, 1.651, 1.578, 1.511, 1.448, 1.388, 1.338, 1.296, 1.252, 1.223, 1.201, 1.189, 1.189, 1.189, 1.199, 1.224, 1.253, 1.293, 1.338, 1.384, 1.442, 1.504, 1.571, 1.638, 1.704, 1.782, 1.872, 1.974, 2.025, + 2.004, 1.951, 1.849, 1.759, 1.688, 1.619, 1.552, 1.491, 1.435, 1.388, 1.338, 1.301, 1.272, 1.249, 1.238, 1.236, 1.236, 1.248, 1.271, 1.301, 1.338, 1.384, 1.431, 1.484, 1.543, 1.609, 1.675, 1.742, 1.825, 1.919, 2.025, 2.081, + 2.062, 2.004, 1.898, 1.805, 1.729, 1.661, 1.597, 1.539, 1.486, 1.435, 1.391, 1.354, 1.326, 1.303, 1.291, 1.289, 1.289, 1.301, 1.323, 1.353, 1.389, 1.431, 1.483, 1.528, 1.585, 1.649, 1.713, 1.787, 1.875, 1.971, 2.081, 2.145, + 2.129, 2.062, 1.951, 1.854, 1.774, 1.705, 1.642, 1.586, 1.539, 1.486, 1.445, 1.411, 1.383, 1.361, 1.348, 1.347, 1.348, 1.359, 1.379, 1.409, 1.447, 1.484, 1.528, 1.578, 1.631, 1.691, 1.759, 1.836, 1.928, 2.031, 2.145, 2.217, + 2.201, 2.129, 2.013, 1.912, 1.827, 1.752, 1.689, 1.642, 1.586, 1.544, 1.501, 1.468, 1.442, 1.421, 1.409, 1.409, 1.411, 1.421, 1.439, 1.467, 1.504, 1.543, 1.578, 1.629, 1.679, 1.739, 1.815, 1.894, 1.985, 2.098, 2.217, 2.298, + 2.273, 2.201, 2.081, 1.974, 1.886, 1.807, 1.741, 1.689, 1.643, 1.603, 1.562, 1.527, 1.504, 1.485, 1.475, 1.474, 1.475, 1.487, 1.503, 1.531, 1.565, 1.601, 1.634, 1.678, 1.728, 1.795, 1.877, 1.961, 2.052, 2.169, 2.298, 2.365, + 2.317, 2.273, 2.146, 2.039, 1.946, 1.864, 1.792, 1.737, 1.688, 1.643, 1.603, 1.562, 1.533, 1.525, 1.523, 1.523, 1.523, 1.525, 1.534, 1.565, 1.601, 1.634, 1.677, 1.722, 1.772, 1.848, 1.935, 2.023, 2.108, 2.232, 2.365, 2.403 + ], + "sigma": 0.00285, + "sigma_Cb": 0.00166 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2500, + "ccm": + [ + 1.70741, -0.05307, -0.65433, + -0.62822, 1.68836, -0.06014, + -0.04452, -1.87628, 2.92079 + ] + }, + { + "ct": 2803, + "ccm": + [ + 1.74383, -0.18731, -0.55652, + -0.56491, 1.67772, -0.11281, + -0.01522, -1.60635, 2.62157 + ] + }, + { + "ct": 2912, + "ccm": + [ + 1.75215, -0.22221, -0.52995, + -0.54568, 1.63522, -0.08954, + 0.02633, -1.56997, 2.54364 + ] + }, + { + "ct": 2914, + "ccm": + [ + 1.72423, -0.28939, -0.43484, + -0.55188, 1.62925, -0.07737, + 0.01959, -1.28661, 2.26702 + ] + }, + { + "ct": 3605, + "ccm": + [ + 1.80381, -0.43646, -0.36735, + -0.46505, 1.56814, -0.10309, + 0.00929, -1.00424, 1.99495 + ] + }, + { + "ct": 4540, + "ccm": + [ + 1.85263, -0.46545, -0.38719, + -0.44136, 1.68443, -0.24307, + 0.04108, -0.85599, 1.81491 + ] + }, + { + "ct": 5699, + "ccm": + [ + 1.98595, -0.63542, -0.35054, + -0.34623, 1.54146, -0.19522, + 0.00411, -0.70936, 1.70525 + ] + }, + { + "ct": 8625, + "ccm": + [ + 2.21637, -0.56663, -0.64974, + -0.41133, 1.96625, -0.55492, + -0.02307, -0.83529, 1.85837 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "short": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/ov64a40.json b/src/ipa/rpi/pisp/data/ov64a40.json new file mode 100755 index 000000000..d9e263ebe --- /dev/null +++ b/src/ipa/rpi/pisp/data/ov64a40.json @@ -0,0 +1,1133 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 17861, + "reference_gain": 2.0, + "reference_aperture": 1.0, + "reference_lux": 1073, + "reference_Y": 9022 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.984 + } + }, + { + "rpi.geq": + { + "offset": 215, + "slope": 0.01121 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 7700 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8000 + } + }, + "bayes": 1, + "ct_curve": + [ + 2300.0, 1.0576, 0.4098, + 2700.0, 0.7924, 0.4334, + 3000.0, 0.7635, 0.4428, + 4000.0, 0.6003, 0.5412, + 4150.0, 0.5627, 0.5789, + 6500.0, 0.4409, 0.7596 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.05597, + "transverse_neg": 0.04295 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.16, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 6500, + "table": + [ + 2.447, 2.441, 2.423, 2.414, 2.401, 2.391, 2.379, 2.376, 2.375, 2.369, 2.364, 2.362, 2.359, 2.356, 2.351, 2.349, 2.349, 2.341, 2.336, 2.334, 2.332, 2.331, 2.331, 2.331, 2.333, 2.338, 2.342, 2.347, 2.359, 2.368, 2.378, 2.391, + 2.447, 2.441, 2.422, 2.408, 2.393, 2.388, 2.382, 2.376, 2.369, 2.365, 2.362, 2.359, 2.353, 2.351, 2.345, 2.345, 2.336, 2.336, 2.334, 2.327, 2.325, 2.326, 2.326, 2.329, 2.329, 2.334, 2.338, 2.347, 2.359, 2.368, 2.378, 2.389, + 2.446, 2.433, 2.414, 2.403, 2.393, 2.387, 2.382, 2.371, 2.369, 2.362, 2.356, 2.351, 2.335, 2.335, 2.329, 2.326, 2.318, 2.314, 2.313, 2.312, 2.312, 2.312, 2.318, 2.321, 2.326, 2.329, 2.334, 2.344, 2.357, 2.368, 2.378, 2.389, + 2.443, 2.431, 2.409, 2.402, 2.393, 2.383, 2.374, 2.369, 2.363, 2.356, 2.343, 2.335, 2.322, 2.317, 2.311, 2.309, 2.302, 2.299, 2.298, 2.295, 2.295, 2.296, 2.309, 2.313, 2.321, 2.326, 2.329, 2.341, 2.352, 2.364, 2.374, 2.385, + 2.442, 2.427, 2.409, 2.399, 2.393, 2.383, 2.371, 2.364, 2.356, 2.343, 2.333, 2.319, 2.313, 2.302, 2.297, 2.295, 2.293, 2.288, 2.285, 2.281, 2.281, 2.285, 2.293, 2.306, 2.313, 2.322, 2.327, 2.337, 2.351, 2.364, 2.374, 2.385, + 2.442, 2.427, 2.411, 2.398, 2.389, 2.381, 2.369, 2.359, 2.351, 2.335, 2.319, 2.312, 2.301, 2.296, 2.289, 2.283, 2.279, 2.277, 2.273, 2.269, 2.267, 2.268, 2.279, 2.293, 2.306, 2.316, 2.325, 2.335, 2.348, 2.361, 2.372, 2.385, + 2.441, 2.428, 2.411, 2.399, 2.389, 2.381, 2.369, 2.356, 2.343, 2.331, 2.312, 2.301, 2.292, 2.286, 2.279, 2.278, 2.273, 2.271, 2.267, 2.259, 2.259, 2.262, 2.268, 2.279, 2.297, 2.311, 2.323, 2.335, 2.347, 2.357, 2.371, 2.388, + 2.441, 2.428, 2.412, 2.397, 2.389, 2.381, 2.369, 2.355, 2.337, 2.318, 2.308, 2.292, 2.286, 2.278, 2.276, 2.268, 2.264, 2.263, 2.257, 2.252, 2.252, 2.255, 2.262, 2.273, 2.284, 2.303, 2.319, 2.336, 2.343, 2.356, 2.365, 2.388, + 2.441, 2.428, 2.412, 2.401, 2.389, 2.381, 2.363, 2.344, 2.323, 2.311, 2.299, 2.287, 2.278, 2.275, 2.267, 2.264, 2.259, 2.256, 2.249, 2.246, 2.246, 2.249, 2.255, 2.262, 2.279, 2.296, 2.313, 2.336, 2.347, 2.355, 2.366, 2.384, + 2.441, 2.427, 2.412, 2.401, 2.391, 2.381, 2.355, 2.339, 2.323, 2.308, 2.297, 2.284, 2.275, 2.267, 2.259, 2.253, 2.251, 2.247, 2.244, 2.239, 2.239, 2.244, 2.249, 2.259, 2.276, 2.288, 2.311, 2.332, 2.348, 2.356, 2.366, 2.384, + 2.442, 2.428, 2.415, 2.402, 2.391, 2.379, 2.354, 2.331, 2.323, 2.302, 2.291, 2.278, 2.267, 2.259, 2.253, 2.246, 2.245, 2.241, 2.236, 2.233, 2.235, 2.239, 2.245, 2.255, 2.271, 2.287, 2.307, 2.331, 2.349, 2.356, 2.367, 2.384, + 2.441, 2.429, 2.419, 2.404, 2.394, 2.375, 2.352, 2.331, 2.318, 2.301, 2.288, 2.273, 2.263, 2.254, 2.246, 2.242, 2.237, 2.232, 2.229, 2.229, 2.232, 2.235, 2.245, 2.255, 2.271, 2.286, 2.307, 2.331, 2.351, 2.359, 2.371, 2.385, + 2.441, 2.432, 2.419, 2.406, 2.395, 2.375, 2.349, 2.332, 2.317, 2.301, 2.288, 2.273, 2.262, 2.249, 2.242, 2.235, 2.226, 2.225, 2.225, 2.227, 2.232, 2.235, 2.246, 2.255, 2.271, 2.286, 2.307, 2.331, 2.351, 2.366, 2.376, 2.388, + 2.441, 2.437, 2.424, 2.406, 2.395, 2.375, 2.352, 2.333, 2.317, 2.304, 2.289, 2.274, 2.261, 2.245, 2.235, 2.226, 2.217, 2.216, 2.219, 2.225, 2.229, 2.237, 2.246, 2.255, 2.272, 2.289, 2.307, 2.334, 2.352, 2.369, 2.376, 2.392, + 2.447, 2.438, 2.425, 2.412, 2.399, 2.378, 2.352, 2.335, 2.317, 2.304, 2.289, 2.275, 2.259, 2.243, 2.227, 2.217, 2.214, 2.209, 2.214, 2.219, 2.229, 2.238, 2.246, 2.258, 2.272, 2.289, 2.309, 2.334, 2.355, 2.369, 2.385, 2.392, + 2.449, 2.441, 2.425, 2.416, 2.399, 2.381, 2.357, 2.336, 2.321, 2.305, 2.289, 2.275, 2.261, 2.242, 2.225, 2.214, 2.207, 2.207, 2.209, 2.218, 2.229, 2.238, 2.249, 2.261, 2.275, 2.291, 2.309, 2.336, 2.354, 2.371, 2.386, 2.396, + 2.451, 2.442, 2.426, 2.419, 2.403, 2.383, 2.361, 2.341, 2.321, 2.305, 2.289, 2.276, 2.259, 2.243, 2.225, 2.213, 2.207, 2.207, 2.209, 2.218, 2.227, 2.241, 2.249, 2.261, 2.277, 2.295, 2.316, 2.338, 2.355, 2.374, 2.387, 2.398, + 2.452, 2.442, 2.427, 2.419, 2.405, 2.384, 2.361, 2.341, 2.321, 2.305, 2.293, 2.277, 2.259, 2.244, 2.226, 2.213, 2.211, 2.208, 2.211, 2.218, 2.229, 2.241, 2.249, 2.263, 2.279, 2.298, 2.319, 2.339, 2.359, 2.374, 2.387, 2.398, + 2.452, 2.442, 2.428, 2.419, 2.405, 2.384, 2.361, 2.341, 2.324, 2.305, 2.293, 2.277, 2.259, 2.245, 2.232, 2.222, 2.213, 2.213, 2.218, 2.223, 2.229, 2.241, 2.249, 2.265, 2.279, 2.298, 2.319, 2.339, 2.363, 2.374, 2.387, 2.406, + 2.452, 2.442, 2.428, 2.419, 2.405, 2.384, 2.361, 2.343, 2.324, 2.305, 2.293, 2.279, 2.265, 2.251, 2.241, 2.232, 2.222, 2.222, 2.223, 2.229, 2.233, 2.241, 2.251, 2.265, 2.279, 2.298, 2.321, 2.341, 2.364, 2.374, 2.387, 2.405, + 2.454, 2.442, 2.429, 2.419, 2.404, 2.386, 2.365, 2.346, 2.327, 2.309, 2.293, 2.281, 2.269, 2.258, 2.251, 2.241, 2.237, 2.231, 2.231, 2.233, 2.238, 2.245, 2.256, 2.267, 2.283, 2.301, 2.323, 2.344, 2.366, 2.379, 2.388, 2.405, + 2.454, 2.439, 2.431, 2.421, 2.404, 2.392, 2.369, 2.348, 2.332, 2.314, 2.299, 2.288, 2.274, 2.268, 2.258, 2.252, 2.249, 2.244, 2.241, 2.241, 2.245, 2.251, 2.259, 2.269, 2.287, 2.301, 2.324, 2.352, 2.366, 2.379, 2.388, 2.405, + 2.453, 2.438, 2.431, 2.418, 2.407, 2.393, 2.374, 2.352, 2.337, 2.321, 2.303, 2.293, 2.284, 2.274, 2.268, 2.261, 2.259, 2.257, 2.251, 2.251, 2.251, 2.258, 2.266, 2.276, 2.297, 2.314, 2.333, 2.354, 2.366, 2.381, 2.391, 2.407, + 2.453, 2.438, 2.431, 2.417, 2.408, 2.396, 2.379, 2.359, 2.344, 2.329, 2.314, 2.301, 2.293, 2.284, 2.277, 2.276, 2.271, 2.266, 2.266, 2.261, 2.261, 2.266, 2.276, 2.285, 2.301, 2.318, 2.339, 2.356, 2.371, 2.383, 2.393, 2.408, + 2.453, 2.441, 2.428, 2.417, 2.409, 2.398, 2.386, 2.371, 2.351, 2.339, 2.324, 2.314, 2.301, 2.296, 2.289, 2.288, 2.281, 2.278, 2.275, 2.271, 2.271, 2.276, 2.285, 2.294, 2.311, 2.327, 2.346, 2.356, 2.373, 2.386, 2.393, 2.409, + 2.457, 2.441, 2.428, 2.417, 2.412, 2.403, 2.389, 2.381, 2.365, 2.349, 2.337, 2.324, 2.314, 2.309, 2.306, 2.303, 2.295, 2.294, 2.291, 2.287, 2.287, 2.289, 2.294, 2.309, 2.319, 2.332, 2.351, 2.359, 2.377, 2.386, 2.398, 2.411, + 2.457, 2.443, 2.427, 2.417, 2.413, 2.405, 2.399, 2.388, 2.373, 2.365, 2.349, 2.337, 2.327, 2.323, 2.318, 2.314, 2.312, 2.309, 2.304, 2.303, 2.302, 2.303, 2.309, 2.319, 2.332, 2.344, 2.355, 2.365, 2.379, 2.392, 2.403, 2.412, + 2.459, 2.449, 2.427, 2.417, 2.413, 2.407, 2.405, 2.399, 2.388, 2.373, 2.366, 2.353, 2.346, 2.338, 2.334, 2.331, 2.328, 2.321, 2.321, 2.317, 2.317, 2.321, 2.321, 2.337, 2.344, 2.355, 2.363, 2.369, 2.383, 2.392, 2.407, 2.418, + 2.465, 2.453, 2.439, 2.427, 2.417, 2.413, 2.407, 2.405, 2.399, 2.391, 2.376, 2.368, 2.359, 2.358, 2.349, 2.347, 2.346, 2.341, 2.341, 2.335, 2.334, 2.334, 2.341, 2.347, 2.355, 2.363, 2.368, 2.377, 2.388, 2.399, 2.418, 2.421, + 2.467, 2.453, 2.441, 2.431, 2.423, 2.417, 2.416, 2.408, 2.405, 2.399, 2.394, 2.386, 2.381, 2.378, 2.371, 2.369, 2.365, 2.361, 2.359, 2.356, 2.356, 2.356, 2.356, 2.361, 2.367, 2.368, 2.374, 2.387, 2.393, 2.407, 2.418, 2.427, + 2.473, 2.456, 2.447, 2.434, 2.431, 2.423, 2.419, 2.419, 2.413, 2.406, 2.404, 2.403, 2.397, 2.395, 2.394, 2.391, 2.386, 2.381, 2.378, 2.371, 2.371, 2.365, 2.365, 2.372, 2.374, 2.376, 2.379, 2.392, 2.401, 2.413, 2.422, 2.431, + 2.473, 2.469, 2.449, 2.441, 2.433, 2.431, 2.423, 2.419, 2.419, 2.413, 2.412, 2.409, 2.403, 2.402, 2.402, 2.399, 2.399, 2.391, 2.387, 2.385, 2.381, 2.379, 2.379, 2.379, 2.379, 2.379, 2.388, 2.395, 2.409, 2.413, 2.426, 2.431 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 6500, + "table": + [ + 1.308, 1.307, 1.301, 1.301, 1.297, 1.295, 1.295, 1.295, 1.295, 1.295, 1.295, 1.295, 1.295, 1.295, 1.295, 1.296, 1.298, 1.299, 1.298, 1.298, 1.298, 1.299, 1.299, 1.299, 1.299, 1.307, 1.308, 1.311, 1.313, 1.317, 1.322, 1.322, + 1.307, 1.304, 1.298, 1.293, 1.292, 1.291, 1.288, 1.288, 1.288, 1.288, 1.289, 1.291, 1.292, 1.292, 1.294, 1.294, 1.294, 1.293, 1.293, 1.292, 1.293, 1.295, 1.296, 1.298, 1.299, 1.299, 1.302, 1.307, 1.309, 1.313, 1.318, 1.322, + 1.303, 1.298, 1.293, 1.291, 1.289, 1.287, 1.286, 1.286, 1.287, 1.287, 1.288, 1.289, 1.291, 1.292, 1.292, 1.294, 1.293, 1.293, 1.293, 1.292, 1.291, 1.292, 1.295, 1.296, 1.297, 1.298, 1.299, 1.302, 1.306, 1.308, 1.313, 1.317, + 1.299, 1.293, 1.291, 1.289, 1.287, 1.286, 1.286, 1.286, 1.287, 1.287, 1.288, 1.289, 1.291, 1.292, 1.293, 1.293, 1.293, 1.293, 1.293, 1.291, 1.291, 1.291, 1.293, 1.295, 1.296, 1.297, 1.298, 1.301, 1.304, 1.306, 1.308, 1.315, + 1.297, 1.291, 1.289, 1.286, 1.286, 1.286, 1.286, 1.287, 1.287, 1.287, 1.288, 1.289, 1.289, 1.292, 1.294, 1.294, 1.293, 1.293, 1.293, 1.291, 1.289, 1.289, 1.292, 1.294, 1.295, 1.296, 1.297, 1.298, 1.301, 1.305, 1.308, 1.313, + 1.295, 1.289, 1.287, 1.285, 1.285, 1.285, 1.285, 1.286, 1.287, 1.287, 1.287, 1.288, 1.289, 1.293, 1.294, 1.295, 1.295, 1.294, 1.294, 1.292, 1.289, 1.289, 1.289, 1.294, 1.294, 1.295, 1.295, 1.296, 1.299, 1.301, 1.307, 1.308, + 1.292, 1.287, 1.285, 1.284, 1.283, 1.283, 1.283, 1.284, 1.284, 1.286, 1.287, 1.288, 1.289, 1.293, 1.294, 1.295, 1.295, 1.295, 1.294, 1.292, 1.291, 1.289, 1.289, 1.291, 1.293, 1.294, 1.294, 1.295, 1.296, 1.299, 1.305, 1.307, + 1.292, 1.285, 1.282, 1.282, 1.282, 1.282, 1.282, 1.283, 1.283, 1.284, 1.286, 1.287, 1.289, 1.293, 1.295, 1.296, 1.296, 1.295, 1.295, 1.292, 1.291, 1.289, 1.288, 1.288, 1.291, 1.292, 1.293, 1.294, 1.296, 1.297, 1.301, 1.306, + 1.291, 1.283, 1.282, 1.281, 1.281, 1.281, 1.281, 1.283, 1.282, 1.283, 1.283, 1.286, 1.287, 1.289, 1.293, 1.295, 1.296, 1.296, 1.294, 1.291, 1.291, 1.289, 1.288, 1.288, 1.289, 1.291, 1.292, 1.293, 1.296, 1.297, 1.299, 1.301, + 1.288, 1.283, 1.281, 1.279, 1.279, 1.279, 1.281, 1.281, 1.281, 1.282, 1.282, 1.283, 1.286, 1.289, 1.292, 1.295, 1.296, 1.296, 1.293, 1.291, 1.289, 1.288, 1.287, 1.287, 1.289, 1.291, 1.292, 1.292, 1.294, 1.296, 1.297, 1.299, + 1.287, 1.282, 1.279, 1.278, 1.279, 1.279, 1.279, 1.279, 1.281, 1.281, 1.282, 1.283, 1.283, 1.288, 1.291, 1.295, 1.295, 1.294, 1.292, 1.289, 1.288, 1.287, 1.287, 1.287, 1.288, 1.289, 1.291, 1.292, 1.293, 1.294, 1.297, 1.298, + 1.284, 1.279, 1.278, 1.278, 1.279, 1.279, 1.279, 1.279, 1.279, 1.281, 1.282, 1.283, 1.283, 1.288, 1.291, 1.294, 1.294, 1.294, 1.292, 1.288, 1.288, 1.288, 1.289, 1.288, 1.288, 1.288, 1.291, 1.292, 1.293, 1.294, 1.296, 1.298, + 1.284, 1.279, 1.277, 1.277, 1.277, 1.278, 1.279, 1.279, 1.279, 1.281, 1.282, 1.283, 1.285, 1.288, 1.291, 1.294, 1.294, 1.294, 1.292, 1.291, 1.289, 1.289, 1.289, 1.289, 1.288, 1.288, 1.289, 1.293, 1.293, 1.295, 1.296, 1.298, + 1.283, 1.279, 1.276, 1.276, 1.276, 1.277, 1.278, 1.279, 1.281, 1.281, 1.282, 1.283, 1.285, 1.289, 1.291, 1.292, 1.293, 1.293, 1.293, 1.292, 1.289, 1.289, 1.291, 1.291, 1.289, 1.288, 1.289, 1.292, 1.293, 1.294, 1.296, 1.299, + 1.283, 1.279, 1.275, 1.276, 1.276, 1.277, 1.278, 1.279, 1.281, 1.282, 1.282, 1.283, 1.285, 1.289, 1.291, 1.291, 1.292, 1.293, 1.293, 1.293, 1.291, 1.291, 1.291, 1.291, 1.289, 1.288, 1.288, 1.289, 1.292, 1.294, 1.295, 1.299, + 1.283, 1.277, 1.275, 1.275, 1.276, 1.276, 1.279, 1.279, 1.281, 1.282, 1.282, 1.283, 1.285, 1.289, 1.291, 1.291, 1.291, 1.292, 1.293, 1.293, 1.292, 1.291, 1.291, 1.291, 1.291, 1.289, 1.288, 1.289, 1.291, 1.293, 1.295, 1.298, + 1.282, 1.277, 1.275, 1.274, 1.275, 1.276, 1.278, 1.279, 1.281, 1.282, 1.282, 1.282, 1.284, 1.287, 1.289, 1.289, 1.289, 1.289, 1.292, 1.292, 1.292, 1.291, 1.291, 1.291, 1.291, 1.289, 1.288, 1.289, 1.291, 1.292, 1.296, 1.298, + 1.282, 1.276, 1.274, 1.274, 1.275, 1.276, 1.277, 1.279, 1.279, 1.281, 1.281, 1.281, 1.282, 1.286, 1.287, 1.289, 1.289, 1.289, 1.289, 1.291, 1.291, 1.291, 1.291, 1.291, 1.291, 1.289, 1.289, 1.289, 1.291, 1.292, 1.297, 1.298, + 1.282, 1.275, 1.274, 1.274, 1.274, 1.275, 1.275, 1.277, 1.279, 1.279, 1.279, 1.279, 1.281, 1.282, 1.286, 1.287, 1.287, 1.288, 1.288, 1.289, 1.289, 1.289, 1.291, 1.291, 1.291, 1.289, 1.289, 1.289, 1.291, 1.292, 1.297, 1.298, + 1.279, 1.274, 1.273, 1.273, 1.274, 1.275, 1.275, 1.276, 1.277, 1.278, 1.278, 1.278, 1.278, 1.281, 1.283, 1.285, 1.286, 1.286, 1.286, 1.286, 1.286, 1.288, 1.289, 1.289, 1.289, 1.289, 1.289, 1.289, 1.291, 1.292, 1.297, 1.298, + 1.279, 1.274, 1.272, 1.272, 1.273, 1.274, 1.275, 1.274, 1.276, 1.276, 1.276, 1.276, 1.277, 1.278, 1.282, 1.283, 1.283, 1.283, 1.283, 1.283, 1.284, 1.286, 1.288, 1.288, 1.288, 1.288, 1.289, 1.291, 1.291, 1.292, 1.296, 1.298, + 1.279, 1.273, 1.272, 1.272, 1.273, 1.273, 1.274, 1.274, 1.275, 1.275, 1.275, 1.275, 1.276, 1.277, 1.279, 1.281, 1.283, 1.283, 1.282, 1.282, 1.283, 1.284, 1.287, 1.288, 1.288, 1.288, 1.289, 1.291, 1.292, 1.292, 1.296, 1.299, + 1.282, 1.272, 1.271, 1.271, 1.272, 1.272, 1.273, 1.274, 1.274, 1.274, 1.274, 1.274, 1.276, 1.277, 1.279, 1.281, 1.282, 1.282, 1.282, 1.281, 1.282, 1.283, 1.286, 1.287, 1.288, 1.288, 1.288, 1.291, 1.292, 1.292, 1.296, 1.297, + 1.281, 1.273, 1.272, 1.271, 1.271, 1.271, 1.272, 1.273, 1.274, 1.274, 1.274, 1.275, 1.276, 1.278, 1.279, 1.281, 1.282, 1.282, 1.282, 1.282, 1.282, 1.284, 1.285, 1.287, 1.288, 1.288, 1.288, 1.289, 1.292, 1.293, 1.296, 1.297, + 1.281, 1.275, 1.272, 1.271, 1.271, 1.271, 1.272, 1.273, 1.273, 1.273, 1.273, 1.275, 1.277, 1.279, 1.282, 1.282, 1.283, 1.283, 1.283, 1.282, 1.282, 1.284, 1.285, 1.286, 1.288, 1.288, 1.288, 1.289, 1.293, 1.296, 1.297, 1.297, + 1.281, 1.276, 1.272, 1.271, 1.269, 1.269, 1.272, 1.273, 1.274, 1.274, 1.275, 1.276, 1.279, 1.282, 1.283, 1.283, 1.284, 1.284, 1.285, 1.285, 1.284, 1.285, 1.285, 1.286, 1.289, 1.289, 1.289, 1.289, 1.293, 1.295, 1.297, 1.301, + 1.286, 1.276, 1.272, 1.271, 1.271, 1.269, 1.272, 1.273, 1.274, 1.276, 1.276, 1.276, 1.279, 1.282, 1.284, 1.285, 1.285, 1.285, 1.286, 1.286, 1.285, 1.285, 1.286, 1.286, 1.289, 1.289, 1.289, 1.291, 1.292, 1.295, 1.301, 1.302, + 1.286, 1.277, 1.272, 1.272, 1.271, 1.271, 1.272, 1.273, 1.276, 1.276, 1.276, 1.277, 1.279, 1.282, 1.284, 1.285, 1.285, 1.285, 1.286, 1.286, 1.286, 1.286, 1.286, 1.286, 1.288, 1.289, 1.289, 1.291, 1.292, 1.294, 1.301, 1.304, + 1.285, 1.276, 1.274, 1.272, 1.271, 1.271, 1.271, 1.273, 1.274, 1.276, 1.276, 1.278, 1.279, 1.282, 1.283, 1.284, 1.285, 1.285, 1.286, 1.286, 1.286, 1.286, 1.286, 1.287, 1.287, 1.288, 1.291, 1.292, 1.292, 1.295, 1.301, 1.307, + 1.285, 1.278, 1.275, 1.273, 1.272, 1.272, 1.271, 1.272, 1.274, 1.275, 1.276, 1.279, 1.279, 1.281, 1.284, 1.284, 1.285, 1.285, 1.285, 1.285, 1.285, 1.285, 1.286, 1.287, 1.287, 1.287, 1.291, 1.292, 1.293, 1.297, 1.301, 1.307, + 1.283, 1.277, 1.275, 1.273, 1.272, 1.271, 1.269, 1.271, 1.272, 1.274, 1.275, 1.276, 1.279, 1.279, 1.279, 1.284, 1.284, 1.284, 1.284, 1.284, 1.284, 1.284, 1.285, 1.285, 1.287, 1.287, 1.291, 1.292, 1.293, 1.298, 1.301, 1.301, + 1.283, 1.277, 1.275, 1.272, 1.271, 1.268, 1.268, 1.269, 1.271, 1.272, 1.273, 1.272, 1.277, 1.279, 1.279, 1.281, 1.281, 1.282, 1.282, 1.282, 1.281, 1.283, 1.285, 1.285, 1.287, 1.287, 1.288, 1.291, 1.293, 1.298, 1.299, 1.299 + ] + } + ], + "luminance_lut": + [ + 4.903, 4.653, 4.193, 3.818, 3.501, 3.239, 3.015, 2.824, 2.666, 2.529, 2.414, 2.316, 2.241, 2.205, 2.184, 2.178, 2.178, 2.178, 2.188, 2.216, 2.269, 2.359, 2.465, 2.597, 2.738, 2.915, 3.125, 3.374, 3.662, 4.011, 4.418, 4.656, + 4.653, 4.392, 3.985, 3.621, 3.323, 3.071, 2.855, 2.678, 2.534, 2.414, 2.316, 2.234, 2.168, 2.116, 2.079, 2.058, 2.058, 2.065, 2.091, 2.135, 2.196, 2.269, 2.359, 2.465, 2.599, 2.761, 2.962, 3.195, 3.472, 3.801, 4.188, 4.418, + 4.392, 4.149, 3.766, 3.423, 3.139, 2.901, 2.697, 2.534, 2.409, 2.286, 2.191, 2.106, 2.034, 1.977, 1.938, 1.914, 1.914, 1.923, 1.952, 1.998, 2.063, 2.139, 2.231, 2.341, 2.465, 2.612, 2.796, 3.019, 3.284, 3.596, 3.963, 4.188, + 4.149, 3.936, 3.566, 3.252, 2.982, 2.749, 2.561, 2.409, 2.286, 2.169, 2.066, 1.976, 1.901, 1.842, 1.801, 1.777, 1.777, 1.785, 1.814, 1.861, 1.929, 2.012, 2.107, 2.227, 2.341, 2.483, 2.651, 2.863, 3.119, 3.415, 3.764, 3.979, + 3.951, 3.743, 3.392, 3.091, 2.831, 2.615, 2.438, 2.297, 2.169, 2.061, 1.942, 1.847, 1.768, 1.711, 1.669, 1.646, 1.646, 1.653, 1.681, 1.729, 1.796, 1.882, 1.987, 2.107, 2.227, 2.367, 2.528, 2.727, 2.968, 3.254, 3.583, 3.805, + 3.785, 3.572, 3.242, 2.952, 2.703, 2.501, 2.336, 2.195, 2.061, 1.942, 1.825, 1.726, 1.651, 1.591, 1.549, 1.527, 1.527, 1.533, 1.562, 1.611, 1.676, 1.763, 1.881, 1.987, 2.119, 2.263, 2.422, 2.608, 2.833, 3.109, 3.428, 3.652, + 3.644, 3.424, 3.107, 2.828, 2.592, 2.401, 2.244, 2.097, 1.954, 1.825, 1.724, 1.614, 1.538, 1.479, 1.441, 1.419, 1.419, 1.424, 1.452, 1.498, 1.564, 1.656, 1.763, 1.881, 2.018, 2.169, 2.325, 2.504, 2.718, 2.979, 3.291, 3.519, + 3.525, 3.297, 2.986, 2.718, 2.495, 2.318, 2.156, 2.004, 1.856, 1.724, 1.614, 1.524, 1.439, 1.384, 1.348, 1.328, 1.328, 1.332, 1.358, 1.402, 1.466, 1.564, 1.656, 1.781, 1.923, 2.076, 2.241, 2.414, 2.616, 2.864, 3.166, 3.411, + 3.413, 3.191, 2.889, 2.631, 2.421, 2.245, 2.082, 1.924, 1.772, 1.637, 1.524, 1.439, 1.359, 1.307, 1.272, 1.252, 1.252, 1.258, 1.283, 1.324, 1.391, 1.466, 1.569, 1.694, 1.838, 1.999, 2.166, 2.341, 2.537, 2.774, 3.069, 3.306, + 3.333, 3.086, 2.793, 2.547, 2.349, 2.174, 2.006, 1.843, 1.689, 1.556, 1.444, 1.359, 1.299, 1.239, 1.207, 1.189, 1.189, 1.194, 1.219, 1.261, 1.324, 1.391, 1.491, 1.614, 1.757, 1.921, 2.092, 2.269, 2.463, 2.687, 2.967, 3.225, + 3.256, 3.016, 2.727, 2.491, 2.295, 2.118, 1.947, 1.779, 1.625, 1.494, 1.383, 1.299, 1.239, 1.189, 1.158, 1.141, 1.141, 1.147, 1.171, 1.217, 1.261, 1.334, 1.429, 1.551, 1.695, 1.857, 2.035, 2.217, 2.409, 2.628, 2.895, 3.153, + 3.211, 2.946, 2.666, 2.433, 2.246, 2.068, 1.891, 1.721, 1.569, 1.437, 1.332, 1.249, 1.189, 1.156, 1.113, 1.096, 1.096, 1.102, 1.133, 1.171, 1.217, 1.286, 1.378, 1.496, 1.638, 1.802, 1.981, 2.166, 2.358, 2.573, 2.832, 3.105, + 3.165, 2.901, 2.625, 2.401, 2.211, 2.031, 1.848, 1.678, 1.528, 1.398, 1.294, 1.216, 1.156, 1.113, 1.085, 1.061, 1.061, 1.067, 1.102, 1.133, 1.185, 1.253, 1.341, 1.456, 1.597, 1.761, 1.942, 2.131, 2.325, 2.534, 2.793, 3.069, + 3.132, 2.862, 2.593, 2.371, 2.182, 1.997, 1.816, 1.646, 1.496, 1.367, 1.267, 1.189, 1.131, 1.085, 1.061, 1.032, 1.032, 1.043, 1.067, 1.108, 1.161, 1.228, 1.313, 1.426, 1.566, 1.728, 1.911, 2.102, 2.297, 2.508, 2.761, 3.039, + 3.118, 2.833, 2.566, 2.344, 2.157, 1.972, 1.786, 1.618, 1.469, 1.343, 1.244, 1.169, 1.111, 1.063, 1.032, 1.018, 1.009, 1.027, 1.043, 1.086, 1.141, 1.207, 1.292, 1.403, 1.541, 1.703, 1.884, 2.077, 2.274, 2.484, 2.735, 3.031, + 3.111, 2.815, 2.553, 2.334, 2.145, 1.959, 1.774, 1.605, 1.455, 1.331, 1.234, 1.159, 1.101, 1.053, 1.018, 1.005, 1.004, 1.006, 1.033, 1.077, 1.132, 1.199, 1.283, 1.393, 1.531, 1.692, 1.873, 2.067, 2.265, 2.477, 2.726, 3.028, + 3.111, 2.815, 2.552, 2.333, 2.145, 1.959, 1.774, 1.605, 1.455, 1.331, 1.234, 1.159, 1.101, 1.053, 1.018, 1.001, 1.001, 1.006, 1.033, 1.077, 1.132, 1.199, 1.283, 1.393, 1.531, 1.692, 1.873, 2.067, 2.265, 2.475, 2.726, 3.028, + 3.111, 2.822, 2.552, 2.333, 2.146, 1.961, 1.775, 1.607, 1.457, 1.333, 1.236, 1.161, 1.103, 1.056, 1.021, 1.015, 1.004, 1.017, 1.037, 1.079, 1.135, 1.201, 1.287, 1.395, 1.533, 1.695, 1.876, 2.067, 2.266, 2.475, 2.727, 3.028, + 3.123, 2.844, 2.579, 2.357, 2.166, 1.983, 1.797, 1.627, 1.477, 1.351, 1.253, 1.177, 1.119, 1.073, 1.046, 1.021, 1.021, 1.037, 1.055, 1.097, 1.151, 1.218, 1.305, 1.416, 1.555, 1.717, 1.898, 2.089, 2.287, 2.499, 2.753, 3.041, + 3.149, 2.881, 2.609, 2.383, 2.191, 2.009, 1.827, 1.658, 1.506, 1.378, 1.277, 1.199, 1.142, 1.099, 1.073, 1.046, 1.046, 1.055, 1.089, 1.121, 1.173, 1.242, 1.331, 1.444, 1.584, 1.747, 1.928, 2.118, 2.315, 2.528, 2.787, 3.071, + 3.187, 2.933, 2.654, 2.422, 2.228, 2.049, 1.871, 1.699, 1.547, 1.417, 1.313, 1.232, 1.173, 1.136, 1.099, 1.081, 1.081, 1.089, 1.121, 1.152, 1.205, 1.275, 1.368, 1.484, 1.626, 1.789, 1.971, 2.159, 2.354, 2.571, 2.834, 3.107, + 3.247, 2.989, 2.703, 2.464, 2.269, 2.091, 1.915, 1.748, 1.595, 1.464, 1.356, 1.272, 1.216, 1.173, 1.136, 1.121, 1.121, 1.128, 1.152, 1.199, 1.242, 1.316, 1.411, 1.532, 1.675, 1.839, 2.019, 2.202, 2.398, 2.618, 2.891, 3.164, + 3.306, 3.068, 2.776, 2.524, 2.324, 2.148, 1.979, 1.814, 1.661, 1.526, 1.416, 1.328, 1.272, 1.216, 1.185, 1.169, 1.169, 1.177, 1.199, 1.242, 1.297, 1.371, 1.473, 1.596, 1.741, 1.904, 2.081, 2.263, 2.459, 2.687, 2.971, 3.221, + 3.394, 3.161, 2.855, 2.598, 2.387, 2.211, 2.047, 1.885, 1.734, 1.599, 1.485, 1.399, 1.328, 1.273, 1.242, 1.224, 1.224, 1.231, 1.256, 1.297, 1.369, 1.438, 1.542, 1.669, 1.813, 1.976, 2.149, 2.331, 2.527, 2.764, 3.057, 3.304, + 3.496, 3.263, 2.949, 2.684, 2.463, 2.279, 2.118, 1.965, 1.817, 1.681, 1.568, 1.485, 1.399, 1.345, 1.309, 1.291, 1.291, 1.299, 1.325, 1.369, 1.438, 1.528, 1.623, 1.751, 1.897, 2.056, 2.225, 2.405, 2.608, 2.858, 3.162, 3.402, + 3.611, 3.397, 3.072, 2.793, 2.558, 2.368, 2.205, 2.057, 1.914, 1.779, 1.673, 1.568, 1.492, 1.435, 1.398, 1.377, 1.377, 1.385, 1.414, 1.461, 1.528, 1.623, 1.722, 1.851, 1.996, 2.152, 2.318, 2.499, 2.712, 2.977, 3.294, 3.519, + 3.764, 3.537, 3.204, 2.908, 2.661, 2.459, 2.294, 2.147, 2.012, 1.885, 1.779, 1.673, 1.595, 1.535, 1.496, 1.476, 1.476, 1.484, 1.515, 1.564, 1.631, 1.722, 1.837, 1.954, 2.096, 2.247, 2.411, 2.599, 2.825, 3.108, 3.431, 3.662, + 3.919, 3.704, 3.353, 3.046, 2.787, 2.571, 2.393, 2.247, 2.117, 2.007, 1.885, 1.789, 1.709, 1.651, 1.613, 1.591, 1.591, 1.599, 1.631, 1.679, 1.749, 1.837, 1.954, 2.069, 2.204, 2.352, 2.518, 2.719, 2.962, 3.257, 3.591, 3.815, + 4.126, 3.894, 3.521, 3.203, 2.931, 2.702, 2.512, 2.358, 2.238, 2.117, 2.007, 1.915, 1.839, 1.779, 1.739, 1.719, 1.719, 1.726, 1.759, 1.808, 1.877, 1.965, 2.069, 2.202, 2.319, 2.467, 2.645, 2.859, 3.122, 3.427, 3.784, 4.019, + 4.391, 4.126, 3.721, 3.389, 3.103, 2.857, 2.655, 2.493, 2.358, 2.238, 2.138, 2.049, 1.976, 1.921, 1.882, 1.859, 1.859, 1.868, 1.899, 1.949, 2.015, 2.102, 2.202, 2.319, 2.456, 2.605, 2.794, 3.026, 3.305, 3.629, 4.019, 4.275, + 4.671, 4.391, 3.966, 3.603, 3.297, 3.041, 2.821, 2.643, 2.493, 2.374, 2.277, 2.191, 2.122, 2.069, 2.031, 2.011, 2.011, 2.021, 2.049, 2.097, 2.163, 2.245, 2.343, 2.456, 2.601, 2.762, 2.972, 3.225, 3.514, 3.867, 4.275, 4.547, + 4.899, 4.671, 4.209, 3.824, 3.501, 3.229, 2.999, 2.805, 2.643, 2.493, 2.374, 2.277, 2.208, 2.172, 2.153, 2.148, 2.148, 2.148, 2.164, 2.192, 2.245, 2.343, 2.456, 2.592, 2.749, 2.935, 3.161, 3.423, 3.736, 4.121, 4.547, 4.751 + ], + "sigma": 0.005, + "sigma_Cb": 0.005 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2300, + "ccm": + [ + 1.77591, -0.16036, -0.61554, + -0.26235, 1.66133, -0.39898, + -0.22474, -1.94117, 3.16591 + ] + }, + { + "ct": 2700, + "ccm": + [ + 1.54016, 0.02018, -0.56034, + -0.27333, 1.78261, -0.50928, + -0.13821, -1.22069, 2.35891 + ] + }, + { + "ct": 3000, + "ccm": + [ + 1.73266, -0.19227, -0.54039, + -0.44685, 2.04704, -0.60018, + -0.13631, -0.94323, 2.07953 + ] + }, + { + "ct": 4000, + "ccm": + [ + 1.70137, -0.23462, -0.46675, + -0.34126, 1.80328, -0.46202, + -0.14242, -0.75105, 1.89347 + ] + }, + { + "ct": 4150, + "ccm": + [ + 2.09386, -0.69875, -0.39511, + -0.38239, 1.78872, -0.40633, + -0.11896, -0.74324, 1.86219 + ] + }, + { + "ct": 6500, + "ccm": + [ + 1.69679, -0.27504, -0.42174, + -0.23619, 1.87692, -0.64073, + -0.07905, -0.61889, 1.69795 + ] + } + ] + } + }, + { + "rpi.cac": { } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "night": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + }, + { + "rpi.af": + { + "ranges": + { + "normal": + { + "min": 0.0, + "max": 12.0, + "default": 1.0 + }, + "macro": + { + "min": 3.0, + "max": 15.0, + "default": 4.0 + } + }, + "speeds": + { + "normal": + { + "step_coarse": 1.0, + "step_fine": 0.25, + "contrast_ratio": 0.75, + "pdaf_gain": -0.02, + "pdaf_squelch": 0.125, + "max_slew": 2.0, + "pdaf_frames": 0, + "dropout_frames": 0, + "step_frames": 4 + } + }, + "conf_epsilon": 8, + "conf_thresh": 16, + "conf_clip": 512, + "skip_frames": 5, + "map": [ 0.0, 0, 15.0, 1023 ] + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/ov9281_mono.json b/src/ipa/rpi/pisp/data/ov9281_mono.json new file mode 100644 index 000000000..54229b835 --- /dev/null +++ b/src/ipa/rpi/pisp/data/ov9281_mono.json @@ -0,0 +1,215 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 2000, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 800, + "reference_Y": 20000 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.5 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.agc": + { + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000, 60000, 120000 ], + "gain": [ 1.0, 2.0, 3.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 30000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ] + }, + "long": + { + "shutter": [ 1000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.4, + 1000, 0.4 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + }, + { + "rpi.alsc": + { + "n_iter": 0, + "luminance_strength": 1.0, + "corner_strength": 1.5 + } + }, + { + "rpi.contrast": + { + "ce_enable": 0, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/se327m12.json b/src/ipa/rpi/pisp/data/se327m12.json new file mode 100644 index 000000000..46f2378cd --- /dev/null +++ b/src/ipa/rpi/pisp/data/se327m12.json @@ -0,0 +1,639 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 3840 + } + }, + { + "rpi.dpc": { } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 6873, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 800, + "reference_Y": 12293 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 1.986 + } + }, + { + "rpi.geq": + { + "offset": 207, + "slope": 0.00539 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2500, + "hi": 8000 + }, + "incandescent": + { + "lo": 2500, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 8600 + } + }, + "bayes": 1, + "ct_curve": + [ + 2900.0, 0.9217, 0.3657, + 3600.0, 0.7876, 0.4651, + 4600.0, 0.6807, 0.5684, + 5800.0, 0.5937, 0.6724, + 8100.0, 0.5447, 0.7403 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.0162, + "transverse_neg": 0.0204 + } + }, + { + "rpi.agc": + { + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ] + }, + "long": + { + "shutter": [ 1000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.5, + "calibrations_Cr": [ + { + "ct": 4000, + "table": + [ + 1.481, 1.476, 1.471, 1.461, 1.45, 1.441, 1.431, 1.424, 1.418, 1.412, 1.406, 1.401, 1.396, 1.393, 1.39, 1.389, 1.389, 1.389, 1.389, 1.39, 1.391, 1.393, 1.395, 1.398, 1.401, 1.405, 1.411, 1.417, 1.423, 1.429, 1.433, 1.437, + 1.478, 1.472, 1.466, 1.456, 1.446, 1.436, 1.427, 1.42, 1.414, 1.408, 1.402, 1.398, 1.394, 1.391, 1.388, 1.387, 1.387, 1.387, 1.387, 1.387, 1.389, 1.391, 1.392, 1.395, 1.399, 1.403, 1.408, 1.414, 1.42, 1.427, 1.43, 1.434, + 1.475, 1.468, 1.461, 1.451, 1.441, 1.432, 1.423, 1.416, 1.41, 1.404, 1.399, 1.395, 1.392, 1.389, 1.387, 1.385, 1.384, 1.384, 1.384, 1.385, 1.387, 1.388, 1.39, 1.392, 1.396, 1.401, 1.405, 1.411, 1.418, 1.424, 1.428, 1.431, + 1.472, 1.464, 1.456, 1.446, 1.437, 1.428, 1.419, 1.412, 1.406, 1.401, 1.395, 1.392, 1.39, 1.387, 1.385, 1.383, 1.382, 1.382, 1.382, 1.382, 1.384, 1.386, 1.387, 1.389, 1.394, 1.398, 1.403, 1.407, 1.415, 1.422, 1.425, 1.429, + 1.469, 1.46, 1.451, 1.442, 1.433, 1.425, 1.417, 1.41, 1.403, 1.398, 1.393, 1.39, 1.388, 1.385, 1.382, 1.381, 1.38, 1.38, 1.38, 1.381, 1.382, 1.384, 1.385, 1.387, 1.391, 1.395, 1.399, 1.404, 1.411, 1.418, 1.422, 1.426, + 1.467, 1.457, 1.447, 1.438, 1.429, 1.422, 1.414, 1.407, 1.401, 1.396, 1.392, 1.388, 1.385, 1.383, 1.38, 1.378, 1.378, 1.378, 1.378, 1.379, 1.38, 1.381, 1.383, 1.386, 1.388, 1.391, 1.396, 1.401, 1.407, 1.414, 1.419, 1.424, + 1.465, 1.454, 1.443, 1.435, 1.427, 1.419, 1.412, 1.405, 1.399, 1.394, 1.39, 1.387, 1.384, 1.381, 1.378, 1.377, 1.377, 1.377, 1.377, 1.377, 1.378, 1.379, 1.382, 1.384, 1.386, 1.388, 1.393, 1.398, 1.405, 1.411, 1.416, 1.421, + 1.464, 1.453, 1.443, 1.434, 1.426, 1.418, 1.411, 1.405, 1.398, 1.393, 1.389, 1.385, 1.382, 1.38, 1.378, 1.376, 1.376, 1.376, 1.376, 1.376, 1.377, 1.378, 1.38, 1.382, 1.384, 1.387, 1.392, 1.397, 1.403, 1.409, 1.415, 1.42, + 1.462, 1.452, 1.442, 1.433, 1.425, 1.418, 1.411, 1.404, 1.397, 1.392, 1.387, 1.384, 1.381, 1.379, 1.377, 1.376, 1.375, 1.374, 1.374, 1.375, 1.375, 1.376, 1.378, 1.38, 1.383, 1.386, 1.39, 1.395, 1.402, 1.408, 1.413, 1.419, + 1.462, 1.452, 1.441, 1.432, 1.424, 1.417, 1.41, 1.403, 1.397, 1.391, 1.387, 1.383, 1.38, 1.378, 1.377, 1.375, 1.374, 1.374, 1.374, 1.374, 1.374, 1.375, 1.377, 1.379, 1.381, 1.384, 1.389, 1.394, 1.4, 1.407, 1.412, 1.417, + 1.461, 1.451, 1.441, 1.432, 1.423, 1.416, 1.409, 1.403, 1.396, 1.391, 1.387, 1.383, 1.381, 1.379, 1.377, 1.375, 1.374, 1.373, 1.373, 1.374, 1.374, 1.374, 1.376, 1.378, 1.38, 1.383, 1.388, 1.392, 1.399, 1.405, 1.411, 1.416, + 1.461, 1.45, 1.44, 1.431, 1.422, 1.415, 1.409, 1.402, 1.396, 1.391, 1.386, 1.384, 1.382, 1.379, 1.377, 1.375, 1.374, 1.373, 1.373, 1.373, 1.373, 1.374, 1.375, 1.377, 1.379, 1.382, 1.386, 1.39, 1.397, 1.404, 1.41, 1.415, + 1.461, 1.45, 1.44, 1.431, 1.422, 1.415, 1.408, 1.401, 1.395, 1.39, 1.386, 1.383, 1.381, 1.379, 1.377, 1.375, 1.374, 1.373, 1.373, 1.373, 1.373, 1.374, 1.375, 1.376, 1.379, 1.381, 1.385, 1.39, 1.396, 1.403, 1.409, 1.414, + 1.461, 1.45, 1.44, 1.43, 1.421, 1.414, 1.407, 1.4, 1.394, 1.39, 1.386, 1.383, 1.381, 1.379, 1.377, 1.375, 1.374, 1.373, 1.373, 1.373, 1.373, 1.374, 1.375, 1.376, 1.378, 1.381, 1.385, 1.39, 1.396, 1.402, 1.408, 1.414, + 1.461, 1.45, 1.44, 1.43, 1.42, 1.413, 1.406, 1.399, 1.394, 1.389, 1.385, 1.382, 1.38, 1.378, 1.377, 1.375, 1.374, 1.373, 1.372, 1.372, 1.373, 1.374, 1.375, 1.376, 1.378, 1.38, 1.385, 1.39, 1.396, 1.401, 1.407, 1.413, + 1.461, 1.45, 1.439, 1.43, 1.42, 1.412, 1.405, 1.399, 1.393, 1.388, 1.385, 1.382, 1.379, 1.378, 1.376, 1.375, 1.374, 1.373, 1.372, 1.372, 1.373, 1.374, 1.374, 1.376, 1.378, 1.381, 1.385, 1.389, 1.395, 1.401, 1.407, 1.413, + 1.461, 1.45, 1.439, 1.43, 1.42, 1.412, 1.404, 1.398, 1.392, 1.388, 1.384, 1.381, 1.379, 1.377, 1.376, 1.375, 1.374, 1.373, 1.372, 1.372, 1.372, 1.373, 1.374, 1.376, 1.378, 1.381, 1.385, 1.389, 1.395, 1.401, 1.408, 1.414, + 1.461, 1.45, 1.439, 1.429, 1.42, 1.412, 1.404, 1.397, 1.391, 1.387, 1.384, 1.381, 1.378, 1.376, 1.375, 1.374, 1.374, 1.373, 1.372, 1.372, 1.372, 1.373, 1.374, 1.376, 1.379, 1.382, 1.385, 1.389, 1.395, 1.401, 1.408, 1.414, + 1.461, 1.45, 1.439, 1.429, 1.42, 1.412, 1.404, 1.398, 1.391, 1.387, 1.383, 1.381, 1.378, 1.376, 1.375, 1.374, 1.373, 1.373, 1.373, 1.372, 1.373, 1.373, 1.374, 1.376, 1.379, 1.382, 1.385, 1.389, 1.395, 1.401, 1.408, 1.414, + 1.462, 1.45, 1.439, 1.429, 1.42, 1.412, 1.404, 1.398, 1.392, 1.387, 1.383, 1.38, 1.378, 1.376, 1.375, 1.374, 1.373, 1.373, 1.373, 1.373, 1.373, 1.374, 1.375, 1.376, 1.379, 1.382, 1.385, 1.39, 1.395, 1.401, 1.408, 1.414, + 1.462, 1.451, 1.439, 1.43, 1.421, 1.413, 1.405, 1.399, 1.393, 1.388, 1.383, 1.38, 1.378, 1.376, 1.375, 1.374, 1.373, 1.373, 1.373, 1.373, 1.374, 1.374, 1.375, 1.377, 1.379, 1.382, 1.386, 1.39, 1.396, 1.402, 1.408, 1.414, + 1.462, 1.451, 1.44, 1.431, 1.422, 1.414, 1.406, 1.399, 1.393, 1.388, 1.383, 1.38, 1.378, 1.376, 1.375, 1.374, 1.373, 1.373, 1.373, 1.373, 1.373, 1.374, 1.375, 1.377, 1.379, 1.382, 1.386, 1.391, 1.396, 1.402, 1.408, 1.414, + 1.462, 1.452, 1.441, 1.432, 1.423, 1.415, 1.406, 1.4, 1.393, 1.389, 1.384, 1.381, 1.378, 1.376, 1.375, 1.374, 1.373, 1.373, 1.372, 1.372, 1.373, 1.374, 1.375, 1.377, 1.38, 1.383, 1.387, 1.391, 1.397, 1.402, 1.408, 1.414, + 1.462, 1.452, 1.442, 1.433, 1.424, 1.416, 1.407, 1.4, 1.394, 1.389, 1.384, 1.381, 1.378, 1.376, 1.375, 1.373, 1.373, 1.372, 1.372, 1.372, 1.372, 1.373, 1.375, 1.377, 1.38, 1.383, 1.387, 1.391, 1.397, 1.402, 1.408, 1.414, + 1.464, 1.453, 1.443, 1.434, 1.425, 1.416, 1.408, 1.401, 1.394, 1.389, 1.384, 1.381, 1.378, 1.376, 1.374, 1.373, 1.372, 1.371, 1.371, 1.371, 1.372, 1.373, 1.374, 1.376, 1.379, 1.382, 1.386, 1.391, 1.397, 1.402, 1.409, 1.416, + 1.465, 1.454, 1.444, 1.435, 1.425, 1.417, 1.408, 1.401, 1.395, 1.389, 1.384, 1.381, 1.379, 1.376, 1.374, 1.372, 1.37, 1.369, 1.369, 1.37, 1.371, 1.373, 1.374, 1.376, 1.379, 1.382, 1.386, 1.39, 1.396, 1.402, 1.41, 1.417, + 1.466, 1.456, 1.446, 1.436, 1.426, 1.418, 1.41, 1.403, 1.396, 1.39, 1.384, 1.381, 1.379, 1.377, 1.375, 1.372, 1.37, 1.369, 1.369, 1.37, 1.371, 1.373, 1.374, 1.376, 1.379, 1.383, 1.387, 1.391, 1.397, 1.404, 1.411, 1.418, + 1.467, 1.457, 1.448, 1.437, 1.427, 1.419, 1.412, 1.404, 1.397, 1.391, 1.385, 1.382, 1.38, 1.378, 1.375, 1.373, 1.371, 1.37, 1.37, 1.371, 1.372, 1.373, 1.375, 1.377, 1.381, 1.384, 1.388, 1.392, 1.399, 1.405, 1.413, 1.42, + 1.469, 1.459, 1.449, 1.439, 1.428, 1.421, 1.414, 1.406, 1.398, 1.392, 1.386, 1.383, 1.381, 1.379, 1.376, 1.374, 1.372, 1.371, 1.371, 1.371, 1.372, 1.374, 1.375, 1.378, 1.382, 1.386, 1.389, 1.394, 1.4, 1.407, 1.414, 1.422, + 1.47, 1.461, 1.452, 1.441, 1.431, 1.423, 1.416, 1.409, 1.401, 1.395, 1.388, 1.385, 1.382, 1.38, 1.377, 1.375, 1.374, 1.373, 1.373, 1.373, 1.374, 1.375, 1.377, 1.379, 1.383, 1.388, 1.392, 1.397, 1.405, 1.412, 1.417, 1.423, + 1.472, 1.463, 1.454, 1.444, 1.434, 1.426, 1.418, 1.412, 1.405, 1.398, 1.391, 1.387, 1.383, 1.381, 1.379, 1.377, 1.376, 1.375, 1.375, 1.375, 1.376, 1.377, 1.378, 1.381, 1.385, 1.39, 1.395, 1.401, 1.409, 1.417, 1.421, 1.425, + 1.474, 1.465, 1.457, 1.447, 1.437, 1.429, 1.421, 1.414, 1.409, 1.401, 1.394, 1.388, 1.385, 1.382, 1.38, 1.378, 1.378, 1.377, 1.377, 1.377, 1.378, 1.378, 1.38, 1.382, 1.387, 1.392, 1.399, 1.405, 1.414, 1.422, 1.424, 1.426 + ] + }, + { + "ct": 5000, + "table": + [ + 1.742, 1.732, 1.722, 1.707, 1.691, 1.677, 1.664, 1.652, 1.642, 1.633, 1.626, 1.62, 1.615, 1.612, 1.61, 1.608, 1.608, 1.607, 1.606, 1.607, 1.608, 1.61, 1.614, 1.618, 1.623, 1.627, 1.635, 1.643, 1.654, 1.666, 1.673, 1.681, + 1.737, 1.726, 1.715, 1.7, 1.685, 1.671, 1.658, 1.648, 1.639, 1.63, 1.622, 1.616, 1.611, 1.608, 1.606, 1.605, 1.604, 1.603, 1.603, 1.603, 1.605, 1.607, 1.611, 1.615, 1.62, 1.625, 1.631, 1.639, 1.65, 1.661, 1.669, 1.677, + 1.732, 1.721, 1.709, 1.694, 1.679, 1.665, 1.652, 1.643, 1.635, 1.627, 1.619, 1.613, 1.607, 1.604, 1.603, 1.601, 1.6, 1.599, 1.599, 1.6, 1.602, 1.604, 1.608, 1.612, 1.617, 1.622, 1.628, 1.635, 1.646, 1.657, 1.665, 1.674, + 1.727, 1.715, 1.703, 1.688, 1.673, 1.66, 1.647, 1.639, 1.632, 1.624, 1.616, 1.61, 1.604, 1.601, 1.599, 1.598, 1.596, 1.596, 1.596, 1.597, 1.599, 1.602, 1.605, 1.609, 1.614, 1.619, 1.625, 1.632, 1.642, 1.653, 1.661, 1.67, + 1.722, 1.71, 1.699, 1.684, 1.668, 1.656, 1.643, 1.635, 1.628, 1.62, 1.613, 1.607, 1.601, 1.598, 1.596, 1.595, 1.593, 1.593, 1.593, 1.594, 1.596, 1.598, 1.602, 1.606, 1.61, 1.615, 1.622, 1.629, 1.639, 1.649, 1.657, 1.666, + 1.716, 1.705, 1.694, 1.679, 1.663, 1.651, 1.64, 1.631, 1.623, 1.616, 1.61, 1.604, 1.599, 1.595, 1.594, 1.592, 1.591, 1.59, 1.59, 1.591, 1.592, 1.595, 1.599, 1.604, 1.607, 1.612, 1.619, 1.627, 1.636, 1.644, 1.653, 1.661, + 1.712, 1.701, 1.69, 1.675, 1.659, 1.647, 1.636, 1.628, 1.619, 1.613, 1.607, 1.602, 1.597, 1.593, 1.591, 1.589, 1.588, 1.587, 1.587, 1.588, 1.59, 1.592, 1.596, 1.601, 1.604, 1.609, 1.616, 1.624, 1.632, 1.641, 1.649, 1.658, + 1.71, 1.699, 1.687, 1.672, 1.657, 1.645, 1.633, 1.625, 1.618, 1.611, 1.605, 1.6, 1.595, 1.592, 1.589, 1.587, 1.586, 1.586, 1.586, 1.587, 1.588, 1.59, 1.594, 1.597, 1.601, 1.606, 1.613, 1.621, 1.629, 1.638, 1.647, 1.657, + 1.708, 1.696, 1.683, 1.669, 1.654, 1.642, 1.631, 1.623, 1.616, 1.609, 1.602, 1.597, 1.593, 1.59, 1.587, 1.585, 1.584, 1.584, 1.584, 1.585, 1.587, 1.588, 1.591, 1.594, 1.598, 1.604, 1.61, 1.618, 1.626, 1.635, 1.645, 1.655, + 1.705, 1.693, 1.68, 1.666, 1.652, 1.64, 1.628, 1.62, 1.614, 1.607, 1.6, 1.595, 1.592, 1.588, 1.586, 1.584, 1.583, 1.582, 1.583, 1.584, 1.585, 1.587, 1.589, 1.592, 1.596, 1.602, 1.608, 1.615, 1.624, 1.633, 1.644, 1.654, + 1.703, 1.69, 1.677, 1.663, 1.649, 1.638, 1.626, 1.618, 1.611, 1.604, 1.598, 1.593, 1.59, 1.587, 1.584, 1.582, 1.581, 1.581, 1.582, 1.583, 1.584, 1.585, 1.587, 1.59, 1.595, 1.6, 1.607, 1.614, 1.623, 1.633, 1.643, 1.653, + 1.7, 1.687, 1.674, 1.66, 1.646, 1.635, 1.625, 1.616, 1.609, 1.602, 1.596, 1.591, 1.588, 1.585, 1.583, 1.581, 1.58, 1.58, 1.581, 1.582, 1.583, 1.584, 1.586, 1.589, 1.594, 1.599, 1.606, 1.613, 1.622, 1.632, 1.642, 1.652, + 1.698, 1.685, 1.671, 1.658, 1.644, 1.633, 1.623, 1.615, 1.607, 1.6, 1.594, 1.59, 1.587, 1.584, 1.582, 1.58, 1.579, 1.579, 1.58, 1.581, 1.582, 1.583, 1.585, 1.588, 1.593, 1.598, 1.605, 1.611, 1.621, 1.631, 1.641, 1.652, + 1.698, 1.683, 1.669, 1.655, 1.642, 1.631, 1.621, 1.613, 1.605, 1.599, 1.593, 1.589, 1.586, 1.583, 1.581, 1.579, 1.578, 1.578, 1.579, 1.58, 1.581, 1.582, 1.584, 1.587, 1.593, 1.598, 1.604, 1.61, 1.62, 1.629, 1.641, 1.652, + 1.697, 1.682, 1.666, 1.653, 1.639, 1.629, 1.619, 1.611, 1.603, 1.597, 1.591, 1.587, 1.585, 1.583, 1.58, 1.579, 1.578, 1.577, 1.578, 1.579, 1.58, 1.582, 1.584, 1.587, 1.592, 1.598, 1.603, 1.608, 1.618, 1.628, 1.64, 1.652, + 1.697, 1.681, 1.665, 1.651, 1.638, 1.628, 1.618, 1.61, 1.602, 1.597, 1.591, 1.588, 1.585, 1.582, 1.58, 1.578, 1.577, 1.577, 1.577, 1.578, 1.579, 1.581, 1.584, 1.587, 1.592, 1.598, 1.603, 1.608, 1.618, 1.628, 1.64, 1.652, + 1.697, 1.681, 1.664, 1.65, 1.637, 1.626, 1.616, 1.609, 1.602, 1.596, 1.592, 1.588, 1.585, 1.582, 1.579, 1.578, 1.577, 1.576, 1.577, 1.577, 1.579, 1.581, 1.584, 1.587, 1.593, 1.598, 1.603, 1.608, 1.618, 1.628, 1.641, 1.653, + 1.697, 1.68, 1.663, 1.649, 1.636, 1.625, 1.615, 1.608, 1.601, 1.596, 1.592, 1.588, 1.585, 1.582, 1.579, 1.577, 1.577, 1.576, 1.576, 1.577, 1.578, 1.58, 1.584, 1.588, 1.593, 1.598, 1.603, 1.608, 1.619, 1.629, 1.641, 1.653, + 1.697, 1.68, 1.663, 1.649, 1.635, 1.625, 1.615, 1.607, 1.6, 1.596, 1.592, 1.588, 1.584, 1.581, 1.579, 1.577, 1.577, 1.576, 1.576, 1.577, 1.579, 1.581, 1.585, 1.588, 1.593, 1.598, 1.604, 1.61, 1.621, 1.631, 1.643, 1.654, + 1.697, 1.68, 1.663, 1.649, 1.635, 1.625, 1.615, 1.607, 1.6, 1.595, 1.591, 1.587, 1.584, 1.581, 1.579, 1.577, 1.577, 1.576, 1.577, 1.578, 1.58, 1.582, 1.586, 1.589, 1.594, 1.599, 1.605, 1.611, 1.623, 1.634, 1.644, 1.654, + 1.697, 1.68, 1.664, 1.649, 1.635, 1.625, 1.615, 1.608, 1.6, 1.595, 1.591, 1.587, 1.583, 1.581, 1.579, 1.578, 1.577, 1.576, 1.577, 1.578, 1.581, 1.583, 1.587, 1.59, 1.595, 1.6, 1.606, 1.613, 1.625, 1.636, 1.646, 1.655, + 1.699, 1.682, 1.665, 1.651, 1.636, 1.626, 1.616, 1.609, 1.602, 1.596, 1.591, 1.587, 1.584, 1.581, 1.579, 1.578, 1.577, 1.577, 1.578, 1.58, 1.581, 1.584, 1.587, 1.591, 1.596, 1.601, 1.608, 1.615, 1.626, 1.637, 1.647, 1.657, + 1.7, 1.683, 1.666, 1.652, 1.637, 1.627, 1.617, 1.61, 1.603, 1.597, 1.591, 1.587, 1.584, 1.581, 1.579, 1.578, 1.577, 1.578, 1.579, 1.581, 1.582, 1.584, 1.588, 1.592, 1.597, 1.602, 1.609, 1.617, 1.628, 1.639, 1.649, 1.658, + 1.702, 1.685, 1.668, 1.653, 1.639, 1.628, 1.618, 1.611, 1.604, 1.598, 1.591, 1.587, 1.584, 1.582, 1.58, 1.578, 1.578, 1.578, 1.58, 1.581, 1.583, 1.585, 1.589, 1.593, 1.598, 1.603, 1.611, 1.619, 1.63, 1.641, 1.65, 1.66, + 1.705, 1.687, 1.67, 1.655, 1.641, 1.63, 1.619, 1.611, 1.604, 1.598, 1.592, 1.588, 1.585, 1.582, 1.58, 1.579, 1.578, 1.578, 1.58, 1.582, 1.583, 1.585, 1.59, 1.594, 1.599, 1.604, 1.612, 1.621, 1.632, 1.643, 1.653, 1.663, + 1.707, 1.689, 1.672, 1.657, 1.642, 1.631, 1.62, 1.612, 1.605, 1.599, 1.593, 1.589, 1.585, 1.583, 1.581, 1.58, 1.579, 1.579, 1.58, 1.582, 1.584, 1.586, 1.59, 1.595, 1.6, 1.605, 1.614, 1.623, 1.634, 1.646, 1.655, 1.665, + 1.709, 1.692, 1.674, 1.659, 1.645, 1.633, 1.621, 1.613, 1.606, 1.6, 1.595, 1.59, 1.587, 1.584, 1.583, 1.581, 1.58, 1.58, 1.581, 1.582, 1.585, 1.587, 1.592, 1.597, 1.602, 1.608, 1.616, 1.625, 1.637, 1.648, 1.658, 1.668, + 1.711, 1.695, 1.678, 1.662, 1.647, 1.635, 1.623, 1.615, 1.608, 1.602, 1.597, 1.593, 1.59, 1.587, 1.584, 1.582, 1.581, 1.581, 1.582, 1.584, 1.586, 1.589, 1.594, 1.599, 1.605, 1.611, 1.619, 1.628, 1.639, 1.651, 1.66, 1.67, + 1.714, 1.698, 1.681, 1.666, 1.65, 1.637, 1.624, 1.616, 1.609, 1.604, 1.6, 1.596, 1.592, 1.589, 1.585, 1.584, 1.583, 1.583, 1.583, 1.585, 1.587, 1.59, 1.595, 1.601, 1.608, 1.615, 1.622, 1.63, 1.642, 1.653, 1.663, 1.673, + 1.715, 1.7, 1.685, 1.669, 1.653, 1.64, 1.627, 1.619, 1.613, 1.607, 1.603, 1.598, 1.594, 1.591, 1.587, 1.586, 1.586, 1.586, 1.586, 1.588, 1.59, 1.593, 1.598, 1.604, 1.611, 1.618, 1.626, 1.634, 1.646, 1.657, 1.666, 1.675, + 1.717, 1.703, 1.688, 1.673, 1.657, 1.644, 1.63, 1.623, 1.616, 1.611, 1.605, 1.601, 1.596, 1.593, 1.59, 1.588, 1.588, 1.589, 1.589, 1.591, 1.594, 1.597, 1.601, 1.607, 1.614, 1.622, 1.63, 1.639, 1.65, 1.661, 1.67, 1.678, + 1.719, 1.705, 1.692, 1.677, 1.661, 1.647, 1.634, 1.626, 1.62, 1.614, 1.608, 1.603, 1.598, 1.595, 1.592, 1.591, 1.591, 1.591, 1.592, 1.594, 1.597, 1.6, 1.605, 1.61, 1.617, 1.625, 1.634, 1.643, 1.655, 1.666, 1.673, 1.681 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 4000, + "table": + [ + 2.253, 2.26, 2.267, 2.277, 2.288, 2.301, 2.314, 2.327, 2.339, 2.348, 2.356, 2.364, 2.37, 2.375, 2.379, 2.381, 2.381, 2.38, 2.379, 2.376, 2.371, 2.367, 2.363, 2.359, 2.351, 2.343, 2.34, 2.336, 2.324, 2.314, 2.307, 2.301, + 2.256, 2.264, 2.272, 2.284, 2.296, 2.309, 2.321, 2.332, 2.343, 2.352, 2.36, 2.368, 2.374, 2.379, 2.383, 2.385, 2.385, 2.385, 2.383, 2.381, 2.376, 2.371, 2.367, 2.362, 2.355, 2.349, 2.343, 2.337, 2.327, 2.316, 2.31, 2.303, + 2.259, 2.269, 2.278, 2.292, 2.305, 2.316, 2.328, 2.337, 2.347, 2.356, 2.365, 2.372, 2.378, 2.382, 2.386, 2.388, 2.389, 2.389, 2.388, 2.385, 2.38, 2.375, 2.37, 2.365, 2.36, 2.355, 2.347, 2.339, 2.329, 2.319, 2.313, 2.306, + 2.263, 2.274, 2.285, 2.298, 2.313, 2.323, 2.334, 2.342, 2.351, 2.359, 2.369, 2.375, 2.381, 2.386, 2.39, 2.392, 2.393, 2.393, 2.392, 2.39, 2.385, 2.38, 2.373, 2.368, 2.364, 2.36, 2.351, 2.341, 2.332, 2.322, 2.316, 2.309, + 2.268, 2.28, 2.291, 2.303, 2.315, 2.326, 2.337, 2.346, 2.355, 2.363, 2.372, 2.379, 2.384, 2.388, 2.391, 2.393, 2.394, 2.394, 2.394, 2.392, 2.389, 2.385, 2.378, 2.372, 2.367, 2.362, 2.354, 2.346, 2.336, 2.326, 2.32, 2.313, + 2.274, 2.286, 2.298, 2.308, 2.318, 2.33, 2.341, 2.35, 2.359, 2.367, 2.376, 2.382, 2.387, 2.391, 2.393, 2.395, 2.396, 2.396, 2.396, 2.395, 2.393, 2.39, 2.383, 2.376, 2.37, 2.364, 2.357, 2.35, 2.339, 2.329, 2.324, 2.318, + 2.277, 2.29, 2.302, 2.312, 2.321, 2.332, 2.344, 2.353, 2.362, 2.371, 2.379, 2.385, 2.389, 2.392, 2.394, 2.396, 2.396, 2.397, 2.397, 2.397, 2.396, 2.393, 2.387, 2.38, 2.374, 2.367, 2.36, 2.353, 2.343, 2.333, 2.327, 2.322, + 2.277, 2.29, 2.303, 2.313, 2.323, 2.334, 2.345, 2.355, 2.364, 2.373, 2.381, 2.387, 2.391, 2.393, 2.395, 2.396, 2.396, 2.397, 2.397, 2.397, 2.396, 2.394, 2.389, 2.384, 2.377, 2.37, 2.363, 2.355, 2.345, 2.335, 2.33, 2.324, + 2.277, 2.29, 2.303, 2.314, 2.325, 2.335, 2.346, 2.356, 2.366, 2.375, 2.384, 2.389, 2.392, 2.394, 2.395, 2.396, 2.396, 2.397, 2.397, 2.397, 2.396, 2.395, 2.392, 2.387, 2.38, 2.373, 2.365, 2.357, 2.347, 2.338, 2.332, 2.327, + 2.277, 2.291, 2.304, 2.315, 2.326, 2.337, 2.348, 2.358, 2.368, 2.377, 2.385, 2.39, 2.392, 2.394, 2.395, 2.396, 2.396, 2.397, 2.397, 2.398, 2.397, 2.395, 2.393, 2.39, 2.383, 2.375, 2.367, 2.358, 2.349, 2.34, 2.334, 2.329, + 2.278, 2.292, 2.307, 2.316, 2.326, 2.337, 2.349, 2.36, 2.371, 2.379, 2.386, 2.39, 2.392, 2.394, 2.396, 2.397, 2.397, 2.397, 2.398, 2.398, 2.396, 2.395, 2.393, 2.39, 2.384, 2.378, 2.369, 2.36, 2.351, 2.341, 2.336, 2.33, + 2.279, 2.294, 2.309, 2.318, 2.326, 2.338, 2.351, 2.362, 2.373, 2.381, 2.387, 2.39, 2.392, 2.394, 2.396, 2.397, 2.397, 2.397, 2.398, 2.397, 2.396, 2.395, 2.394, 2.391, 2.386, 2.38, 2.37, 2.361, 2.352, 2.343, 2.337, 2.332, + 2.28, 2.295, 2.31, 2.318, 2.326, 2.339, 2.351, 2.363, 2.374, 2.381, 2.386, 2.39, 2.393, 2.395, 2.396, 2.397, 2.397, 2.397, 2.397, 2.397, 2.396, 2.395, 2.394, 2.392, 2.387, 2.38, 2.372, 2.363, 2.353, 2.344, 2.338, 2.332, + 2.281, 2.295, 2.31, 2.319, 2.327, 2.339, 2.352, 2.363, 2.374, 2.381, 2.386, 2.39, 2.393, 2.395, 2.396, 2.396, 2.396, 2.396, 2.396, 2.397, 2.396, 2.396, 2.395, 2.392, 2.387, 2.381, 2.373, 2.364, 2.354, 2.345, 2.339, 2.333, + 2.282, 2.296, 2.31, 2.319, 2.328, 2.339, 2.352, 2.363, 2.374, 2.38, 2.385, 2.389, 2.394, 2.396, 2.396, 2.396, 2.395, 2.395, 2.396, 2.396, 2.397, 2.396, 2.395, 2.393, 2.387, 2.381, 2.374, 2.366, 2.355, 2.346, 2.339, 2.333, + 2.282, 2.297, 2.311, 2.32, 2.329, 2.34, 2.351, 2.362, 2.373, 2.38, 2.385, 2.39, 2.394, 2.395, 2.396, 2.396, 2.395, 2.395, 2.395, 2.396, 2.396, 2.396, 2.395, 2.393, 2.388, 2.382, 2.374, 2.366, 2.357, 2.348, 2.341, 2.334, + 2.283, 2.297, 2.312, 2.321, 2.331, 2.341, 2.351, 2.362, 2.373, 2.38, 2.386, 2.39, 2.393, 2.395, 2.395, 2.395, 2.395, 2.395, 2.395, 2.396, 2.396, 2.396, 2.395, 2.393, 2.389, 2.383, 2.375, 2.367, 2.359, 2.351, 2.343, 2.335, + 2.283, 2.298, 2.313, 2.322, 2.332, 2.341, 2.351, 2.361, 2.372, 2.38, 2.387, 2.391, 2.393, 2.394, 2.395, 2.395, 2.395, 2.395, 2.395, 2.395, 2.396, 2.396, 2.395, 2.393, 2.389, 2.384, 2.376, 2.367, 2.36, 2.353, 2.345, 2.336, + 2.285, 2.298, 2.311, 2.321, 2.331, 2.341, 2.351, 2.361, 2.371, 2.379, 2.386, 2.39, 2.393, 2.394, 2.395, 2.395, 2.395, 2.395, 2.395, 2.396, 2.396, 2.396, 2.395, 2.393, 2.389, 2.384, 2.376, 2.368, 2.361, 2.353, 2.345, 2.337, + 2.286, 2.298, 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.371, 2.378, 2.385, 2.389, 2.393, 2.394, 2.395, 2.395, 2.395, 2.395, 2.396, 2.396, 2.396, 2.396, 2.395, 2.393, 2.388, 2.383, 2.376, 2.369, 2.361, 2.353, 2.346, 2.338, + 2.287, 2.298, 2.308, 2.319, 2.329, 2.339, 2.349, 2.36, 2.37, 2.377, 2.384, 2.388, 2.392, 2.394, 2.395, 2.395, 2.395, 2.395, 2.396, 2.396, 2.396, 2.396, 2.395, 2.393, 2.388, 2.383, 2.376, 2.37, 2.361, 2.353, 2.346, 2.339, + 2.288, 2.298, 2.307, 2.317, 2.327, 2.338, 2.348, 2.358, 2.368, 2.376, 2.383, 2.388, 2.392, 2.394, 2.395, 2.396, 2.396, 2.396, 2.397, 2.397, 2.397, 2.396, 2.394, 2.392, 2.387, 2.382, 2.375, 2.368, 2.36, 2.353, 2.345, 2.338, + 2.289, 2.298, 2.307, 2.316, 2.326, 2.336, 2.346, 2.356, 2.367, 2.375, 2.383, 2.388, 2.391, 2.394, 2.396, 2.397, 2.397, 2.397, 2.398, 2.397, 2.397, 2.396, 2.394, 2.391, 2.387, 2.382, 2.374, 2.367, 2.359, 2.352, 2.345, 2.337, + 2.289, 2.297, 2.306, 2.315, 2.324, 2.334, 2.344, 2.355, 2.365, 2.374, 2.381, 2.386, 2.39, 2.393, 2.395, 2.397, 2.397, 2.398, 2.398, 2.398, 2.397, 2.396, 2.393, 2.39, 2.386, 2.381, 2.373, 2.366, 2.358, 2.351, 2.343, 2.336, + 2.287, 2.296, 2.304, 2.314, 2.323, 2.333, 2.342, 2.352, 2.362, 2.371, 2.379, 2.385, 2.389, 2.392, 2.394, 2.396, 2.397, 2.398, 2.398, 2.398, 2.397, 2.396, 2.393, 2.389, 2.385, 2.38, 2.373, 2.365, 2.357, 2.348, 2.341, 2.334, + 2.286, 2.295, 2.303, 2.312, 2.321, 2.331, 2.341, 2.35, 2.36, 2.368, 2.377, 2.383, 2.388, 2.391, 2.393, 2.395, 2.396, 2.397, 2.398, 2.398, 2.397, 2.395, 2.392, 2.388, 2.384, 2.38, 2.372, 2.365, 2.356, 2.346, 2.339, 2.333, + 2.286, 2.293, 2.3, 2.309, 2.318, 2.328, 2.337, 2.347, 2.356, 2.365, 2.374, 2.381, 2.385, 2.389, 2.392, 2.394, 2.395, 2.396, 2.397, 2.397, 2.395, 2.393, 2.39, 2.387, 2.383, 2.378, 2.371, 2.364, 2.354, 2.344, 2.337, 2.33, + 2.285, 2.29, 2.296, 2.305, 2.315, 2.324, 2.333, 2.342, 2.353, 2.362, 2.372, 2.378, 2.383, 2.386, 2.39, 2.392, 2.394, 2.395, 2.395, 2.395, 2.393, 2.391, 2.389, 2.385, 2.381, 2.376, 2.369, 2.362, 2.351, 2.341, 2.334, 2.328, + 2.284, 2.288, 2.292, 2.301, 2.311, 2.32, 2.328, 2.338, 2.349, 2.359, 2.369, 2.375, 2.38, 2.384, 2.388, 2.39, 2.392, 2.393, 2.394, 2.393, 2.391, 2.389, 2.387, 2.384, 2.379, 2.373, 2.367, 2.361, 2.349, 2.338, 2.332, 2.325, + 2.284, 2.287, 2.29, 2.299, 2.309, 2.317, 2.325, 2.334, 2.345, 2.355, 2.366, 2.373, 2.377, 2.381, 2.385, 2.388, 2.389, 2.391, 2.391, 2.391, 2.389, 2.387, 2.385, 2.382, 2.377, 2.371, 2.363, 2.355, 2.344, 2.334, 2.328, 2.323, + 2.283, 2.286, 2.289, 2.297, 2.306, 2.314, 2.321, 2.331, 2.341, 2.352, 2.364, 2.37, 2.375, 2.379, 2.382, 2.385, 2.386, 2.388, 2.388, 2.388, 2.387, 2.386, 2.383, 2.38, 2.374, 2.368, 2.358, 2.348, 2.338, 2.329, 2.325, 2.32, + 2.283, 2.285, 2.288, 2.296, 2.304, 2.311, 2.318, 2.327, 2.336, 2.348, 2.361, 2.368, 2.372, 2.376, 2.379, 2.382, 2.383, 2.384, 2.385, 2.386, 2.385, 2.384, 2.381, 2.378, 2.372, 2.365, 2.353, 2.341, 2.333, 2.325, 2.321, 2.318 + ] + }, + { + "ct": 5000, + "table": + [ + 1.897, 1.908, 1.918, 1.929, 1.94, 1.953, 1.966, 1.977, 1.986, 1.994, 2.001, 2.007, 2.012, 2.015, 2.018, 2.019, 2.019, 2.019, 2.018, 2.016, 2.015, 2.013, 2.01, 2.007, 2.002, 1.998, 1.993, 1.987, 1.977, 1.967, 1.956, 1.944, + 1.903, 1.913, 1.923, 1.934, 1.945, 1.958, 1.971, 1.981, 1.99, 1.997, 2.005, 2.01, 2.015, 2.019, 2.021, 2.023, 2.023, 2.023, 2.022, 2.02, 2.018, 2.016, 2.013, 2.009, 2.005, 2.0, 1.995, 1.989, 1.98, 1.97, 1.959, 1.948, + 1.909, 1.918, 1.928, 1.939, 1.951, 1.963, 1.976, 1.985, 1.993, 2.001, 2.008, 2.014, 2.019, 2.022, 2.025, 2.026, 2.027, 2.027, 2.026, 2.024, 2.022, 2.018, 2.015, 2.011, 2.007, 2.003, 1.998, 1.992, 1.982, 1.973, 1.962, 1.952, + 1.915, 1.924, 1.933, 1.944, 1.956, 1.968, 1.981, 1.989, 1.997, 2.005, 2.012, 2.018, 2.022, 2.025, 2.028, 2.03, 2.031, 2.031, 2.03, 2.028, 2.025, 2.022, 2.018, 2.014, 2.01, 2.006, 2.0, 1.994, 1.985, 1.976, 1.966, 1.956, + 1.919, 1.929, 1.939, 1.951, 1.963, 1.974, 1.986, 1.994, 2.002, 2.01, 2.017, 2.022, 2.026, 2.03, 2.032, 2.033, 2.034, 2.034, 2.033, 2.032, 2.029, 2.026, 2.022, 2.018, 2.013, 2.009, 2.003, 1.997, 1.988, 1.979, 1.969, 1.958, + 1.923, 1.934, 1.946, 1.957, 1.969, 1.98, 1.991, 1.999, 2.007, 2.015, 2.022, 2.027, 2.031, 2.034, 2.036, 2.037, 2.037, 2.037, 2.036, 2.035, 2.033, 2.031, 2.026, 2.022, 2.017, 2.012, 2.006, 1.999, 1.99, 1.982, 1.971, 1.961, + 1.926, 1.938, 1.951, 1.963, 1.974, 1.985, 1.995, 2.004, 2.012, 2.019, 2.026, 2.03, 2.034, 2.037, 2.038, 2.039, 2.04, 2.04, 2.039, 2.038, 2.037, 2.034, 2.03, 2.026, 2.02, 2.015, 2.008, 2.002, 1.993, 1.985, 1.974, 1.964, + 1.928, 1.941, 1.954, 1.966, 1.978, 1.989, 1.999, 2.008, 2.016, 2.023, 2.028, 2.033, 2.036, 2.039, 2.04, 2.04, 2.041, 2.042, 2.042, 2.041, 2.039, 2.037, 2.033, 2.028, 2.023, 2.018, 2.011, 2.004, 1.997, 1.989, 1.978, 1.967, + 1.931, 1.943, 1.956, 1.969, 1.982, 1.993, 2.003, 2.012, 2.02, 2.026, 2.031, 2.035, 2.039, 2.04, 2.041, 2.042, 2.043, 2.044, 2.044, 2.043, 2.042, 2.039, 2.035, 2.031, 2.026, 2.02, 2.014, 2.007, 2.0, 1.992, 1.981, 1.97, + 1.934, 1.946, 1.958, 1.972, 1.986, 1.996, 2.006, 2.015, 2.023, 2.028, 2.033, 2.037, 2.04, 2.042, 2.042, 2.043, 2.045, 2.045, 2.045, 2.045, 2.043, 2.041, 2.037, 2.033, 2.028, 2.023, 2.016, 2.009, 2.002, 1.995, 1.983, 1.972, + 1.937, 1.949, 1.961, 1.974, 1.989, 1.999, 2.008, 2.016, 2.025, 2.03, 2.035, 2.038, 2.041, 2.043, 2.043, 2.044, 2.045, 2.046, 2.046, 2.045, 2.044, 2.042, 2.039, 2.035, 2.03, 2.025, 2.018, 2.011, 2.003, 1.995, 1.985, 1.974, + 1.941, 1.952, 1.963, 1.977, 1.991, 2.001, 2.01, 2.018, 2.026, 2.032, 2.036, 2.039, 2.042, 2.044, 2.045, 2.046, 2.046, 2.047, 2.046, 2.046, 2.045, 2.044, 2.041, 2.037, 2.032, 2.027, 2.02, 2.012, 2.004, 1.996, 1.986, 1.976, + 1.943, 1.954, 1.966, 1.98, 1.993, 2.003, 2.011, 2.019, 2.027, 2.033, 2.037, 2.04, 2.043, 2.044, 2.046, 2.047, 2.047, 2.047, 2.047, 2.046, 2.045, 2.044, 2.041, 2.038, 2.033, 2.028, 2.021, 2.014, 2.006, 1.997, 1.987, 1.977, + 1.944, 1.957, 1.969, 1.982, 1.995, 2.004, 2.012, 2.02, 2.028, 2.034, 2.038, 2.041, 2.044, 2.045, 2.046, 2.047, 2.047, 2.047, 2.047, 2.046, 2.045, 2.044, 2.042, 2.039, 2.034, 2.029, 2.023, 2.016, 2.007, 1.998, 1.988, 1.978, + 1.946, 1.959, 1.973, 1.985, 1.997, 2.006, 2.013, 2.021, 2.029, 2.034, 2.039, 2.043, 2.045, 2.046, 2.047, 2.047, 2.048, 2.048, 2.047, 2.046, 2.045, 2.044, 2.042, 2.04, 2.035, 2.03, 2.024, 2.018, 2.008, 1.998, 1.988, 1.978, + 1.947, 1.96, 1.973, 1.986, 1.998, 2.007, 2.014, 2.022, 2.029, 2.035, 2.039, 2.043, 2.045, 2.046, 2.047, 2.047, 2.048, 2.048, 2.048, 2.047, 2.045, 2.044, 2.042, 2.04, 2.034, 2.029, 2.024, 2.018, 2.008, 1.998, 1.988, 1.978, + 1.947, 1.961, 1.974, 1.987, 1.999, 2.008, 2.015, 2.022, 2.029, 2.035, 2.039, 2.043, 2.045, 2.046, 2.047, 2.047, 2.048, 2.048, 2.048, 2.047, 2.046, 2.044, 2.042, 2.04, 2.034, 2.029, 2.023, 2.018, 2.008, 1.998, 1.988, 1.978, + 1.948, 1.961, 1.974, 1.987, 2.0, 2.009, 2.016, 2.023, 2.029, 2.035, 2.039, 2.043, 2.045, 2.046, 2.047, 2.047, 2.048, 2.048, 2.048, 2.047, 2.046, 2.044, 2.042, 2.039, 2.034, 2.028, 2.023, 2.017, 2.007, 1.997, 1.988, 1.978, + 1.948, 1.961, 1.973, 1.987, 2.0, 2.009, 2.016, 2.023, 2.029, 2.034, 2.04, 2.043, 2.045, 2.046, 2.047, 2.048, 2.048, 2.048, 2.048, 2.047, 2.046, 2.044, 2.041, 2.038, 2.033, 2.027, 2.022, 2.016, 2.006, 1.995, 1.987, 1.978, + 1.948, 1.96, 1.973, 1.986, 2.0, 2.009, 2.016, 2.022, 2.028, 2.034, 2.04, 2.043, 2.045, 2.046, 2.047, 2.048, 2.048, 2.048, 2.048, 2.047, 2.045, 2.043, 2.04, 2.037, 2.032, 2.026, 2.02, 2.014, 2.004, 1.994, 1.986, 1.978, + 1.948, 1.96, 1.972, 1.986, 2.0, 2.008, 2.016, 2.022, 2.027, 2.033, 2.039, 2.043, 2.044, 2.046, 2.047, 2.048, 2.048, 2.048, 2.048, 2.047, 2.045, 2.042, 2.039, 2.035, 2.03, 2.025, 2.019, 2.012, 2.002, 1.992, 1.985, 1.977, + 1.947, 1.959, 1.97, 1.984, 1.998, 2.007, 2.015, 2.021, 2.027, 2.033, 2.038, 2.041, 2.044, 2.046, 2.047, 2.047, 2.047, 2.047, 2.047, 2.045, 2.043, 2.041, 2.038, 2.034, 2.029, 2.023, 2.017, 2.01, 2.0, 1.991, 1.983, 1.975, + 1.946, 1.957, 1.969, 1.983, 1.997, 2.006, 2.014, 2.02, 2.027, 2.032, 2.036, 2.04, 2.044, 2.045, 2.046, 2.047, 2.047, 2.047, 2.045, 2.044, 2.042, 2.039, 2.036, 2.032, 2.027, 2.022, 2.015, 2.008, 1.999, 1.989, 1.981, 1.972, + 1.944, 1.956, 1.967, 1.981, 1.995, 2.004, 2.013, 2.019, 2.026, 2.03, 2.035, 2.039, 2.042, 2.044, 2.045, 2.046, 2.046, 2.046, 2.044, 2.042, 2.04, 2.037, 2.034, 2.03, 2.025, 2.019, 2.012, 2.005, 1.996, 1.987, 1.978, 1.97, + 1.942, 1.954, 1.966, 1.979, 1.993, 2.002, 2.011, 2.018, 2.024, 2.029, 2.033, 2.036, 2.039, 2.041, 2.043, 2.044, 2.044, 2.044, 2.042, 2.041, 2.038, 2.036, 2.031, 2.027, 2.021, 2.015, 2.009, 2.002, 1.992, 1.982, 1.975, 1.967, + 1.94, 1.952, 1.964, 1.977, 1.99, 2.0, 2.01, 2.017, 2.023, 2.027, 2.031, 2.034, 2.036, 2.039, 2.041, 2.043, 2.043, 2.042, 2.041, 2.039, 2.037, 2.034, 2.029, 2.024, 2.018, 2.012, 2.005, 1.998, 1.988, 1.978, 1.972, 1.965, + 1.937, 1.949, 1.961, 1.974, 1.987, 1.998, 2.008, 2.015, 2.021, 2.025, 2.029, 2.031, 2.033, 2.036, 2.038, 2.04, 2.04, 2.04, 2.038, 2.036, 2.034, 2.031, 2.026, 2.02, 2.015, 2.009, 2.002, 1.995, 1.984, 1.974, 1.968, 1.962, + 1.935, 1.946, 1.957, 1.97, 1.983, 1.995, 2.006, 2.012, 2.018, 2.022, 2.026, 2.029, 2.031, 2.033, 2.035, 2.036, 2.037, 2.037, 2.035, 2.033, 2.03, 2.027, 2.022, 2.017, 2.012, 2.006, 1.999, 1.991, 1.981, 1.97, 1.965, 1.959, + 1.932, 1.943, 1.953, 1.966, 1.98, 1.992, 2.004, 2.01, 2.015, 2.019, 2.023, 2.026, 2.028, 2.029, 2.031, 2.032, 2.034, 2.034, 2.032, 2.03, 2.027, 2.023, 2.019, 2.014, 2.009, 2.004, 1.996, 1.988, 1.977, 1.966, 1.961, 1.956, + 1.931, 1.94, 1.95, 1.963, 1.977, 1.989, 2.002, 2.008, 2.012, 2.016, 2.02, 2.023, 2.025, 2.027, 2.028, 2.03, 2.031, 2.031, 2.03, 2.028, 2.024, 2.021, 2.016, 2.012, 2.007, 2.001, 1.992, 1.984, 1.973, 1.963, 1.958, 1.953, + 1.929, 1.938, 1.947, 1.96, 1.974, 1.987, 1.999, 2.005, 2.009, 2.013, 2.017, 2.02, 2.022, 2.024, 2.026, 2.028, 2.028, 2.028, 2.028, 2.026, 2.022, 2.018, 2.014, 2.009, 2.004, 1.998, 1.988, 1.979, 1.969, 1.96, 1.955, 1.95, + 1.928, 1.936, 1.943, 1.957, 1.971, 1.984, 1.996, 2.002, 2.006, 2.01, 2.015, 2.017, 2.018, 2.021, 2.024, 2.025, 2.026, 2.026, 2.025, 2.023, 2.02, 2.016, 2.011, 2.007, 2.001, 1.995, 1.984, 1.974, 1.966, 1.958, 1.952, 1.947 + ] + } + ], + "luminance_lut": + [ + 1.877, 1.742, 1.606, 1.507, 1.41, 1.343, 1.281, 1.239, 1.201, 1.17, 1.141, 1.119, 1.1, 1.089, 1.081, 1.076, 1.073, 1.071, 1.07, 1.072, 1.081, 1.094, 1.118, 1.146, 1.188, 1.232, 1.285, 1.34, 1.409, 1.481, 1.593, 1.704, + 1.832, 1.702, 1.573, 1.479, 1.387, 1.324, 1.266, 1.224, 1.186, 1.155, 1.125, 1.104, 1.087, 1.077, 1.072, 1.068, 1.065, 1.063, 1.062, 1.063, 1.07, 1.082, 1.103, 1.13, 1.169, 1.211, 1.261, 1.314, 1.381, 1.45, 1.556, 1.662, + 1.786, 1.663, 1.541, 1.451, 1.364, 1.305, 1.251, 1.21, 1.171, 1.14, 1.11, 1.09, 1.074, 1.066, 1.062, 1.059, 1.058, 1.056, 1.054, 1.055, 1.059, 1.069, 1.089, 1.114, 1.15, 1.19, 1.238, 1.288, 1.352, 1.419, 1.52, 1.621, + 1.743, 1.627, 1.51, 1.425, 1.343, 1.288, 1.237, 1.196, 1.157, 1.125, 1.096, 1.077, 1.063, 1.056, 1.054, 1.052, 1.051, 1.05, 1.048, 1.047, 1.051, 1.059, 1.076, 1.099, 1.133, 1.17, 1.216, 1.264, 1.326, 1.39, 1.486, 1.582, + 1.712, 1.601, 1.49, 1.408, 1.328, 1.274, 1.225, 1.183, 1.144, 1.114, 1.086, 1.069, 1.059, 1.053, 1.052, 1.05, 1.05, 1.049, 1.048, 1.048, 1.05, 1.056, 1.07, 1.089, 1.121, 1.156, 1.2, 1.247, 1.308, 1.371, 1.463, 1.555, + 1.681, 1.576, 1.47, 1.391, 1.314, 1.261, 1.212, 1.171, 1.132, 1.102, 1.076, 1.062, 1.054, 1.05, 1.05, 1.049, 1.048, 1.048, 1.048, 1.049, 1.049, 1.053, 1.064, 1.08, 1.109, 1.141, 1.185, 1.23, 1.289, 1.351, 1.44, 1.528, + 1.655, 1.554, 1.453, 1.376, 1.301, 1.249, 1.201, 1.16, 1.12, 1.092, 1.068, 1.056, 1.051, 1.048, 1.048, 1.048, 1.047, 1.047, 1.048, 1.049, 1.049, 1.052, 1.059, 1.072, 1.099, 1.129, 1.171, 1.215, 1.274, 1.335, 1.42, 1.506, + 1.639, 1.539, 1.438, 1.364, 1.291, 1.239, 1.19, 1.149, 1.11, 1.085, 1.064, 1.054, 1.05, 1.048, 1.048, 1.047, 1.047, 1.047, 1.048, 1.049, 1.05, 1.052, 1.057, 1.068, 1.092, 1.12, 1.161, 1.204, 1.263, 1.324, 1.408, 1.492, + 1.622, 1.523, 1.424, 1.352, 1.281, 1.229, 1.18, 1.139, 1.101, 1.077, 1.059, 1.051, 1.049, 1.047, 1.047, 1.047, 1.047, 1.047, 1.048, 1.049, 1.051, 1.052, 1.055, 1.063, 1.085, 1.111, 1.151, 1.194, 1.253, 1.313, 1.395, 1.477, + 1.607, 1.51, 1.412, 1.342, 1.273, 1.221, 1.171, 1.131, 1.093, 1.071, 1.056, 1.05, 1.047, 1.046, 1.046, 1.046, 1.047, 1.047, 1.048, 1.05, 1.051, 1.053, 1.054, 1.061, 1.08, 1.104, 1.143, 1.185, 1.244, 1.305, 1.385, 1.466, + 1.594, 1.498, 1.403, 1.334, 1.268, 1.215, 1.164, 1.124, 1.086, 1.067, 1.055, 1.049, 1.046, 1.045, 1.045, 1.045, 1.046, 1.047, 1.048, 1.05, 1.051, 1.053, 1.054, 1.059, 1.077, 1.098, 1.137, 1.179, 1.237, 1.297, 1.378, 1.458, + 1.58, 1.487, 1.394, 1.327, 1.262, 1.208, 1.156, 1.117, 1.08, 1.062, 1.053, 1.048, 1.045, 1.044, 1.044, 1.045, 1.045, 1.046, 1.048, 1.05, 1.052, 1.053, 1.054, 1.058, 1.073, 1.092, 1.131, 1.172, 1.231, 1.29, 1.37, 1.449, + 1.572, 1.48, 1.388, 1.322, 1.259, 1.205, 1.152, 1.113, 1.077, 1.061, 1.052, 1.047, 1.045, 1.044, 1.044, 1.044, 1.045, 1.046, 1.047, 1.049, 1.051, 1.052, 1.053, 1.057, 1.07, 1.088, 1.127, 1.168, 1.226, 1.285, 1.364, 1.443, + 1.567, 1.475, 1.384, 1.319, 1.256, 1.202, 1.149, 1.11, 1.075, 1.06, 1.052, 1.047, 1.045, 1.044, 1.044, 1.044, 1.044, 1.045, 1.046, 1.048, 1.049, 1.051, 1.053, 1.057, 1.068, 1.085, 1.123, 1.165, 1.222, 1.281, 1.359, 1.438, + 1.561, 1.47, 1.379, 1.316, 1.253, 1.199, 1.146, 1.108, 1.073, 1.059, 1.051, 1.047, 1.045, 1.044, 1.044, 1.044, 1.044, 1.044, 1.045, 1.046, 1.047, 1.049, 1.052, 1.056, 1.066, 1.081, 1.12, 1.161, 1.218, 1.277, 1.355, 1.432, + 1.564, 1.472, 1.38, 1.315, 1.252, 1.199, 1.146, 1.108, 1.074, 1.06, 1.053, 1.05, 1.047, 1.046, 1.046, 1.046, 1.046, 1.046, 1.047, 1.047, 1.047, 1.048, 1.051, 1.055, 1.064, 1.079, 1.118, 1.159, 1.217, 1.276, 1.353, 1.43, + 1.568, 1.475, 1.382, 1.316, 1.252, 1.198, 1.147, 1.109, 1.075, 1.061, 1.055, 1.052, 1.05, 1.049, 1.049, 1.049, 1.049, 1.049, 1.048, 1.048, 1.048, 1.048, 1.049, 1.052, 1.062, 1.077, 1.116, 1.157, 1.216, 1.276, 1.352, 1.429, + 1.571, 1.478, 1.384, 1.317, 1.251, 1.199, 1.148, 1.11, 1.076, 1.063, 1.057, 1.054, 1.053, 1.052, 1.051, 1.051, 1.051, 1.05, 1.049, 1.048, 1.047, 1.047, 1.047, 1.05, 1.06, 1.076, 1.115, 1.156, 1.216, 1.276, 1.352, 1.428, + 1.575, 1.483, 1.391, 1.323, 1.257, 1.205, 1.154, 1.117, 1.083, 1.069, 1.062, 1.058, 1.056, 1.054, 1.053, 1.052, 1.051, 1.05, 1.048, 1.047, 1.046, 1.045, 1.046, 1.049, 1.061, 1.078, 1.117, 1.16, 1.22, 1.281, 1.357, 1.434, + 1.579, 1.488, 1.397, 1.329, 1.263, 1.211, 1.161, 1.124, 1.089, 1.075, 1.067, 1.062, 1.059, 1.056, 1.054, 1.052, 1.05, 1.049, 1.047, 1.045, 1.044, 1.043, 1.044, 1.048, 1.062, 1.08, 1.12, 1.163, 1.224, 1.286, 1.363, 1.44, + 1.586, 1.496, 1.405, 1.337, 1.27, 1.218, 1.168, 1.131, 1.096, 1.08, 1.072, 1.066, 1.062, 1.058, 1.056, 1.054, 1.051, 1.049, 1.047, 1.045, 1.043, 1.042, 1.043, 1.048, 1.063, 1.084, 1.124, 1.168, 1.229, 1.292, 1.369, 1.447, + 1.601, 1.509, 1.417, 1.347, 1.279, 1.226, 1.176, 1.138, 1.103, 1.086, 1.074, 1.068, 1.065, 1.062, 1.059, 1.057, 1.054, 1.051, 1.048, 1.046, 1.044, 1.044, 1.045, 1.051, 1.069, 1.091, 1.133, 1.177, 1.238, 1.301, 1.379, 1.457, + 1.615, 1.522, 1.428, 1.357, 1.288, 1.234, 1.184, 1.146, 1.11, 1.091, 1.077, 1.071, 1.068, 1.065, 1.063, 1.06, 1.056, 1.053, 1.05, 1.047, 1.046, 1.046, 1.048, 1.055, 1.074, 1.099, 1.141, 1.185, 1.248, 1.311, 1.389, 1.467, + 1.634, 1.538, 1.441, 1.369, 1.299, 1.245, 1.194, 1.155, 1.119, 1.098, 1.082, 1.074, 1.071, 1.068, 1.065, 1.062, 1.059, 1.055, 1.052, 1.049, 1.048, 1.048, 1.052, 1.06, 1.082, 1.108, 1.151, 1.197, 1.259, 1.323, 1.402, 1.481, + 1.658, 1.557, 1.457, 1.384, 1.312, 1.258, 1.206, 1.167, 1.13, 1.107, 1.088, 1.078, 1.073, 1.07, 1.067, 1.064, 1.061, 1.058, 1.055, 1.053, 1.051, 1.052, 1.057, 1.068, 1.092, 1.121, 1.165, 1.211, 1.273, 1.337, 1.417, 1.498, + 1.682, 1.577, 1.472, 1.398, 1.326, 1.271, 1.219, 1.179, 1.141, 1.115, 1.093, 1.082, 1.075, 1.071, 1.069, 1.067, 1.064, 1.061, 1.059, 1.057, 1.054, 1.055, 1.063, 1.076, 1.103, 1.133, 1.178, 1.225, 1.288, 1.351, 1.433, 1.515, + 1.717, 1.606, 1.495, 1.417, 1.342, 1.286, 1.233, 1.192, 1.154, 1.126, 1.103, 1.089, 1.079, 1.074, 1.071, 1.068, 1.065, 1.063, 1.061, 1.06, 1.058, 1.061, 1.071, 1.087, 1.116, 1.149, 1.194, 1.242, 1.304, 1.367, 1.451, 1.535, + 1.759, 1.64, 1.521, 1.439, 1.361, 1.302, 1.247, 1.206, 1.168, 1.139, 1.114, 1.097, 1.085, 1.077, 1.073, 1.069, 1.067, 1.065, 1.063, 1.062, 1.063, 1.068, 1.081, 1.1, 1.131, 1.166, 1.212, 1.26, 1.321, 1.384, 1.47, 1.556, + 1.8, 1.674, 1.547, 1.461, 1.379, 1.319, 1.262, 1.22, 1.182, 1.152, 1.125, 1.106, 1.09, 1.081, 1.075, 1.07, 1.068, 1.066, 1.065, 1.065, 1.068, 1.075, 1.092, 1.113, 1.146, 1.182, 1.23, 1.279, 1.339, 1.401, 1.489, 1.578, + 1.855, 1.721, 1.588, 1.495, 1.405, 1.342, 1.283, 1.239, 1.199, 1.168, 1.141, 1.12, 1.103, 1.091, 1.082, 1.077, 1.075, 1.073, 1.074, 1.076, 1.081, 1.091, 1.109, 1.132, 1.167, 1.204, 1.251, 1.3, 1.362, 1.425, 1.518, 1.611, + 1.912, 1.772, 1.632, 1.531, 1.433, 1.367, 1.306, 1.26, 1.217, 1.186, 1.158, 1.136, 1.117, 1.103, 1.091, 1.085, 1.082, 1.082, 1.084, 1.088, 1.096, 1.108, 1.128, 1.152, 1.188, 1.226, 1.273, 1.322, 1.386, 1.452, 1.549, 1.646, + 1.969, 1.822, 1.676, 1.567, 1.461, 1.392, 1.329, 1.28, 1.235, 1.203, 1.175, 1.152, 1.131, 1.115, 1.101, 1.093, 1.09, 1.091, 1.095, 1.101, 1.111, 1.125, 1.147, 1.173, 1.21, 1.248, 1.295, 1.345, 1.41, 1.478, 1.579, 1.681 + ], + "sigma": 0.00218, + "sigma_Cb": 0.00194 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2900, + "ccm": + [ + 1.44924, -0.12935, -0.31989, + -0.65839, 1.95441, -0.29602, + 0.18344, -1.22282, 2.03938 + ] + }, + { + "ct": 3000, + "ccm": + [ + 1.38736, 0.07714, -0.46451, + -0.59691, 1.84335, -0.24644, + 0.10092, -1.30441, 2.20349 + ] + }, + { + "ct": 3600, + "ccm": + [ + 1.51261, -0.27921, -0.23339, + -0.55129, 1.83241, -0.28111, + 0.11649, -0.93195, 1.81546 + ] + }, + { + "ct": 4600, + "ccm": + [ + 1.47082, -0.18523, -0.28559, + -0.48923, 1.95126, -0.46203, + 0.07951, -0.83987, 1.76036 + ] + }, + { + "ct": 5800, + "ccm": + [ + 1.57294, -0.36229, -0.21065, + -0.42272, 1.80305, -0.38032, + 0.03671, -0.66862, 1.63191 + ] + }, + { + "ct": 8100, + "ccm": + [ + 1.58803, -0.09912, -0.48891, + -0.42594, 2.22303, -0.79709, + -0.00621, -0.90516, 1.91137 + ] + } + ] + } + }, + { + "rpi.sharpen": + { + "threshold": 2.0, + "strength": 0.5, + "limit": 0.5 + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/uncalibrated.json b/src/ipa/rpi/pisp/data/uncalibrated.json new file mode 100644 index 000000000..ff1e316ee --- /dev/null +++ b/src/ipa/rpi/pisp/data/uncalibrated.json @@ -0,0 +1,135 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.awb": + { + "use_derivatives": 0, + "bayes": 0 + } + }, + { + "rpi.agc": + { + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000, 60000, 120000 ], + "gain": [ 1.0, 2.0, 3.0, 4.0, 6.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.4, + 1000, 0.4 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 4000, + "ccm": + [ + 2.0, -1.0, 0.0, + -0.5, 2.0, -0.5, + 0, -1.0, 2.0 + ] + } + ] + } + }, + { + "rpi.contrast": + { + "ce_enable": 0, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/meson.build b/src/ipa/rpi/pisp/meson.build new file mode 100644 index 000000000..878e3492e --- /dev/null +++ b/src/ipa/rpi/pisp/meson.build @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: CC0-1.0 + +ipa_name = 'ipa_rpi_pisp' + +pisp_ipa_deps = [ + libcamera_private, + libatomic, + libpisp_dep, +] + +pisp_ipa_libs = [ + rpi_ipa_cam_helper_lib, + rpi_ipa_common_lib, + rpi_ipa_controller_lib +] + +pisp_ipa_includes = [ + ipa_includes, + libipa_includes, +] + +pisp_ipa_sources = files([ + 'pisp.cpp', +]) + +pisp_ipa_includes += include_directories('..') + +mod = shared_module(ipa_name, pisp_ipa_sources, + name_prefix : '', + include_directories : pisp_ipa_includes, + dependencies : pisp_ipa_deps, + link_with : libipa, + link_whole : pisp_ipa_libs, + install : true, + cpp_args : '-Wno-address-of-packed-member', + install_dir : ipa_install_dir) + +if ipa_sign_module + custom_target(ipa_name + '.so.sign', + input : mod, + output : ipa_name + '.so.sign', + command : [ipa_sign, ipa_priv_key, '@INPUT@', '@OUTPUT@'], + install : false, + build_by_default : true) +endif + +subdir('data') + +ipa_names += ipa_name diff --git a/src/ipa/rpi/pisp/pisp.cpp b/src/ipa/rpi/pisp/pisp.cpp new file mode 100644 index 000000000..6221f93a1 --- /dev/null +++ b/src/ipa/rpi/pisp/pisp.cpp @@ -0,0 +1,1068 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2023, Raspberry Pi Ltd + * + * pisp.cpp - Raspberry Pi PiSP IPA + */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "libpisp/backend/backend.hpp" +#include "libpisp/frontend/frontend.hpp" + +#include "common/ipa_base.h" +#include "controller/af_status.h" +#include "controller/agc_algorithm.h" +#include "controller/alsc_status.h" +#include "controller/awb_algorithm.h" +#include "controller/awb_status.h" +#include "controller/black_level_algorithm.h" +#include "controller/black_level_status.h" +#include "controller/cac_status.h" +#include "controller/ccm_status.h" +#include "controller/contrast_status.h" +#include "controller/denoise_algorithm.h" +#include "controller/denoise_status.h" +#include "controller/dpc_status.h" +#include "controller/geq_status.h" +#include "controller/hdr_status.h" +#include "controller/lux_status.h" +#include "controller/noise_status.h" +#include "controller/saturation_status.h" +#include "controller/sharpen_status.h" +#include "controller/stitch_status.h" +#include "controller/tonemap_status.h" + +using namespace std::literals::chrono_literals; + +namespace libcamera { + +LOG_DECLARE_CATEGORY(IPARPI) + +namespace { + +constexpr unsigned int NumLscCells = PISP_BE_LSC_GRID_SIZE; +constexpr unsigned int NumLscVertexes = NumLscCells + 1; + +inline int32_t clampField(double value, std::size_t fieldBits, std::size_t fracBits = 0, + bool isSigned = false, const char *desc = nullptr) +{ + ASSERT(fracBits <= fieldBits && fieldBits <= 32); + + int min = -(isSigned << (fieldBits - 1)); + int max = (1 << (fieldBits - isSigned)) - 1; + int32_t val = + std::clamp(std::round(value * (1 << fracBits)), min, max); + + if (desc && val / (1 << fracBits) != value) + LOG(IPARPI, Warning) + << desc << " rounded/clamped to " << val / (1 << fracBits); + + return val; +} + +int generateLut(const ipa::Pwl &pwl, uint32_t *lut, std::size_t lutSize, + unsigned int SlopeBits = 14, unsigned int PosBits = 16) +{ + if (pwl.empty()) + return -EINVAL; + + int lastY = 0; + for (unsigned int i = 0; i < lutSize; i++) { + int x, y; + if (i < 32) + x = i * 512; + else if (i < 48) + x = (i - 32) * 1024 + 16384; + else + x = std::min(65535u, (i - 48) * 2048 + 32768); + + y = pwl.eval(x); + if (y < 0 || (i && y < lastY)) { + LOG(IPARPI, Error) + << "Malformed PWL for Gamma, disabling!"; + return -1; + } + + if (i) { + unsigned int slope = y - lastY; + if (slope >= (1u << SlopeBits)) { + slope = (1u << SlopeBits) - 1; + LOG(IPARPI, Info) + << ("Maximum Gamma slope exceeded, adjusting!"); + y = lastY + slope; + } + lut[i - 1] |= slope << PosBits; + } + + lut[i] = y; + lastY = y; + } + + return 0; +} + +void packLscLut(uint32_t packed[NumLscVertexes][NumLscVertexes], + double const rgb[3][NumLscVertexes][NumLscVertexes]) +{ + for (unsigned int y = 0; y < NumLscVertexes; ++y) { + for (unsigned int x = 0; x < NumLscVertexes; ++x) { + /* Jointly encode RGB gains in one of 4 ranges: [0.5:1.5), [0:2), [0:4), [0:8) */ + double lo = std::min({ rgb[0][y][x], rgb[1][y][x], rgb[2][y][x] }); + double hi = std::max({ rgb[0][y][x], rgb[1][y][x], rgb[2][y][x] }); + uint32_t range; + double scale, offset; + if (lo >= 0.5 && hi < 1.5) { + range = 0; + scale = 1024.0; + offset = -511.5; + } else if (hi < 2.0) { + range = 1; + scale = 512.0; + offset = 0.5; + } else if (hi < 4.0) { + range = 2; + scale = 256.0; + offset = 0.5; + } else { + range = 3; + scale = 128.0; + offset = 0.5; + } + int r = clampField(offset + scale * rgb[0][y][x], 10); + int g = clampField(offset + scale * rgb[1][y][x], 10); + int b = clampField(offset + scale * rgb[2][y][x], 10); + packed[y][x] = (range << 30) | (b << 20) | (g << 10) | r; + } + } +} + +/* + * Resamples a srcW x srcH table with central sampling to destW x destH with + * corner sampling. + */ +void resampleTable(double *dest, int destW, int destH, double const *src, + int srcW, int srcH) +{ + /* + * Precalculate and cache the x sampling locations and phases to + * save recomputing them on every row. + */ + ASSERT(destW > 1 && destH > 1 && destW <= 64); + int xLo[64], xHi[64]; + double xf[64]; + double x = -0.5, xInc = srcW / (destW - 1); + for (int i = 0; i < destW; i++, x += xInc) { + xLo[i] = floor(x); + xf[i] = x - xLo[i]; + xHi[i] = xLo[i] < (srcW - 1) ? (xLo[i] + 1) : (srcW - 1); + xLo[i] = xLo[i] > 0 ? xLo[i] : 0; + } + + /* Now march over the output table generating the new values. */ + double y = -0.5, yInc = srcH / (destH - 1); + for (int j = 0; j < destH; j++, y += yInc) { + int yLo = floor(y); + double yf = y - yLo; + int yHi = yLo < (srcH - 1) ? (yLo + 1) : (srcH - 1); + yLo = yLo > 0 ? yLo : 0; + double const *rowAbove = src + yLo * srcW; + double const *rowBelow = src + yHi * srcW; + for (int i = 0; i < destW; i++) { + double above = rowAbove[xLo[i]] * (1 - xf[i]) + + rowAbove[xHi[i]] * xf[i]; + double below = rowBelow[xLo[i]] * (1 - xf[i]) + + rowBelow[xHi[i]] * xf[i]; + *(dest++) = above * (1 - yf) + below * yf; + } + } +} + +} /* namespace */ + +using ::libpisp::BackEnd; +using ::libpisp::FrontEnd; + +namespace ipa::RPi { + +class IpaPiSP final : public IpaBase +{ +public: + IpaPiSP() + : IpaBase(), fe_(nullptr), be_(nullptr) + { + } + + ~IpaPiSP() + { + if (fe_) + munmap(fe_, sizeof(FrontEnd)); + if (be_) + munmap(be_, sizeof(BackEnd)); + } + +private: + int32_t platformInit(const InitParams ¶ms, InitResult *result) override; + int32_t platformStart(const ControlList &controls, StartResult *result) override; + int32_t platformConfigure(const ConfigParams ¶ms, ConfigResult *result) override; + + void platformPrepareIsp(const PrepareParams ¶ms, + RPiController::Metadata &rpiMetadata) override; + RPiController::StatisticsPtr platformProcessStats(Span mem) override; + + void handleControls(const ControlList &controls) override; + + void applyWBG(const AwbStatus *awbStatus, const AgcPrepareStatus *agcStatus, + pisp_be_global_config &global); + void applyDgOnly(const AgcPrepareStatus *agcPrepareStatus, pisp_be_global_config &global); + void applyCAC(const CacStatus *cacStatus, pisp_be_global_config &global); + void applyContrast(const ContrastStatus *contrastStatus, + pisp_be_global_config &global); + void applyCCM(const CcmStatus *ccmStatus, pisp_be_global_config &global); + void applyBlackLevel(const BlackLevelStatus *blackLevelStatus, + pisp_be_global_config &global); + void applyLensShading(const AlscStatus *alscStatus, + pisp_be_global_config &global); + void applyDPC(const DpcStatus *dpcStatus, pisp_be_global_config &global); + void applySdn(const SdnStatus *sdnStatus, pisp_be_global_config &global); + void applyTdn(const TdnStatus *tdnStatus, const DeviceStatus *deviceStatus, + pisp_be_global_config &global); + void applyCdn(const CdnStatus *cdnStatus, pisp_be_global_config &global); + void applyGeq(const GeqStatus *geqStatus, pisp_be_global_config &global); + void applySaturation(const SaturationStatus *geqStatus, + pisp_be_global_config &global); + void applySharpen(const SharpenStatus *sharpenStatus, + pisp_be_global_config &global); + bool applyStitch(const StitchStatus *stitchStatus, const DeviceStatus *deviceStatus, + const AgcStatus *agcStatus, pisp_be_global_config &global); + void applyTonemap(const TonemapStatus *tonemapStatus, + pisp_be_global_config &global); + void applyFocusStats(const NoiseStatus *noiseStatus); + void applyAF(const struct AfStatus *afStatus, ControlList &lensCtrls); + + void setDefaultConfig(); + void setStatsAndDebin(); + void setHistogramWeights(); + + /* Frontend/Backend objects passed in from the pipeline handler. */ + SharedFD feFD_; + SharedFD beFD_; + FrontEnd *fe_; + BackEnd *be_; + + /* TDN/HDR runtime need the following state. */ + bool tdnReset_; + utils::Duration lastExposure_; + std::map lastStitchExposures_; + HdrStatus lastStitchHdrStatus_; +}; + +int32_t IpaPiSP::platformInit(const InitParams ¶ms, + [[maybe_unused]] InitResult *result) +{ + const std::string &target = controller_.getTarget(); + if (target != "pisp") { + LOG(IPARPI, Error) + << "Tuning data file target returned \"" << target << "\"" + << ", expected \"pisp\""; + return -EINVAL; + } + + /* Acquire the Frontend and Backend objects. */ + feFD_ = std::move(params.fe); + beFD_ = std::move(params.be); + + if (!feFD_.isValid() || !beFD_.isValid()) { + LOG(IPARPI, Error) << "Invalid FE/BE handles!"; + return -ENODEV; + } + + fe_ = static_cast(mmap(nullptr, sizeof(FrontEnd), + PROT_READ | PROT_WRITE, MAP_SHARED, + feFD_.get(), 0)); + be_ = static_cast(mmap(nullptr, sizeof(BackEnd), + PROT_READ | PROT_WRITE, MAP_SHARED, + beFD_.get(), 0)); + + if (!fe_ || !be_) { + LOG(IPARPI, Error) << "Unable to map FE/BE handles!"; + return -ENODEV; + } + + setDefaultConfig(); + + return 0; +} + +int32_t IpaPiSP::platformStart([[maybe_unused]] const ControlList &controls, + [[maybe_unused]] StartResult *result) +{ + tdnReset_ = true; + + /* Cause the stitch block to be reset correctly. */ + lastStitchHdrStatus_ = HdrStatus(); + + return 0; +} + +int32_t IpaPiSP::platformConfigure([[maybe_unused]] const ConfigParams ¶ms, + [[maybe_unused]] ConfigResult *result) +{ + setStatsAndDebin(); + return 0; +} + +void IpaPiSP::platformPrepareIsp([[maybe_unused]] const PrepareParams ¶ms, + RPiController::Metadata &rpiMetadata) +{ + std::scoped_lock l(rpiMetadata); + + pisp_be_global_config global; + be_->GetGlobal(global); + + global.bayer_enables &= ~(PISP_BE_BAYER_ENABLE_BLC + PISP_BE_BAYER_ENABLE_WBG + + PISP_BE_BAYER_ENABLE_GEQ + PISP_BE_BAYER_ENABLE_LSC + + PISP_BE_BAYER_ENABLE_SDN + PISP_BE_BAYER_ENABLE_CDN + + PISP_BE_BAYER_ENABLE_TDN_OUTPUT + PISP_BE_BAYER_ENABLE_TDN_INPUT + + PISP_BE_BAYER_ENABLE_STITCH_INPUT + PISP_BE_BAYER_ENABLE_STITCH_OUTPUT + + PISP_BE_BAYER_ENABLE_STITCH + PISP_BE_BAYER_ENABLE_TONEMAP); + /* We leave the YCbCr and inverse conversion enabled in case of false colour or sharpening. */ + global.rgb_enables &= ~(PISP_BE_RGB_ENABLE_GAMMA + PISP_BE_RGB_ENABLE_CCM + + PISP_BE_RGB_ENABLE_SHARPEN + PISP_BE_RGB_ENABLE_SAT_CONTROL); + + NoiseStatus *noiseStatus = rpiMetadata.getLocked("noise.status"); + AgcPrepareStatus *agcPrepareStatus = rpiMetadata.getLocked("agc.prepare_status"); + + { + /* All Frontend config goes first, we do not want to hold the FE lock for long! */ + std::scoped_lock lf(*fe_); + + if (noiseStatus) + applyFocusStats(noiseStatus); + + BlackLevelStatus *blackLevelStatus = + rpiMetadata.getLocked("black_level.status"); + if (blackLevelStatus) + applyBlackLevel(blackLevelStatus, global); + + AwbStatus *awbStatus = rpiMetadata.getLocked("awb.status"); + if (awbStatus && agcPrepareStatus) { + /* Applies digital gain as well. */ + applyWBG(awbStatus, agcPrepareStatus, global); + } else if (agcPrepareStatus) { + /* Mono sensor fallback for digital gain. */ + applyDgOnly(agcPrepareStatus, global); + } + } + + CacStatus *cacStatus = rpiMetadata.getLocked("cac.status"); + if (cacStatus) + applyCAC(cacStatus, global); + + ContrastStatus *contrastStatus = + rpiMetadata.getLocked("contrast.status"); + if (contrastStatus) + applyContrast(contrastStatus, global); + + CcmStatus *ccmStatus = rpiMetadata.getLocked("ccm.status"); + if (ccmStatus) + applyCCM(ccmStatus, global); + + AlscStatus *alscStatus = rpiMetadata.getLocked("alsc.status"); + if (alscStatus) + applyLensShading(alscStatus, global); + + DpcStatus *dpcStatus = rpiMetadata.getLocked("dpc.status"); + if (dpcStatus) + applyDPC(dpcStatus, global); + + SdnStatus *sdnStatus = rpiMetadata.getLocked("sdn.status"); + if (sdnStatus) + applySdn(sdnStatus, global); + + DeviceStatus *deviceStatus = rpiMetadata.getLocked("device.status"); + TdnStatus *tdnStatus = rpiMetadata.getLocked("tdn.status"); + if (tdnStatus && deviceStatus) + applyTdn(tdnStatus, deviceStatus, global); + + CdnStatus *cdnStatus = rpiMetadata.getLocked("cdn.status"); + if (cdnStatus) + applyCdn(cdnStatus, global); + + GeqStatus *geqStatus = rpiMetadata.getLocked("geq.status"); + if (geqStatus) + applyGeq(geqStatus, global); + + SaturationStatus *saturationStatus = + rpiMetadata.getLocked("saturation.status"); + if (saturationStatus) + applySaturation(saturationStatus, global); + + SharpenStatus *sharpenStatus = rpiMetadata.getLocked("sharpen.status"); + if (sharpenStatus) + applySharpen(sharpenStatus, global); + + StitchStatus *stitchStatus = rpiMetadata.getLocked("stitch.status"); + if (stitchStatus) { + /* + * Note that it's the *delayed* AGC status that contains the HDR mode/channel + * info that pertains to this frame! + */ + AgcStatus *agcStatus = rpiMetadata.getLocked("agc.delayed_status"); + /* prepareIsp() will fetch this value. Maybe pass it back differently? */ + stitchSwapBuffers_ = applyStitch(stitchStatus, deviceStatus, agcStatus, global); + } else + lastStitchHdrStatus_ = HdrStatus(); + + TonemapStatus *tonemapStatus = rpiMetadata.getLocked("tonemap.status"); + if (tonemapStatus) + applyTonemap(tonemapStatus, global); + + be_->SetGlobal(global); + + /* Save this for TDN and HDR on the next frame. */ + lastExposure_ = deviceStatus->shutterSpeed * deviceStatus->analogueGain; + + /* Lens control */ + const AfStatus *afStatus = rpiMetadata.getLocked("af.status"); + if (afStatus) { + ControlList lensctrls(lensCtrls_); + applyAF(afStatus, lensctrls); + if (!lensctrls.empty()) + setLensControls.emit(lensctrls); + } +} + +RPiController::StatisticsPtr IpaPiSP::platformProcessStats(Span mem) +{ + using namespace RPiController; + + const pisp_statistics *stats = reinterpret_cast(mem.data()); + + unsigned int i; + StatisticsPtr statistics = + std::make_unique(Statistics::AgcStatsPos::PostWb, + Statistics::ColourStatsPos::PreLsc); + + /* RGB histograms are not used, so do not populate them. */ + statistics->yHist = RPiController::Histogram(stats->agc.histogram, + PISP_AGC_STATS_NUM_BINS); + + statistics->awbRegions.init({ PISP_AWB_STATS_SIZE, PISP_AWB_STATS_SIZE }); + for (i = 0; i < statistics->awbRegions.numRegions(); i++) + statistics->awbRegions.set(i, { { stats->awb.zones[i].R_sum, + stats->awb.zones[i].G_sum, + stats->awb.zones[i].B_sum }, + stats->awb.zones[i].counted, 0 }); + + /* AGC region sums only get collected on floating zones. */ + statistics->agcRegions.init({ 0, 0 }, PISP_FLOATING_STATS_NUM_ZONES); + for (i = 0; i < statistics->agcRegions.numRegions(); i++) + statistics->agcRegions.setFloating(i, + { { 0, 0, 0, stats->agc.floating[i].Y_sum }, + stats->agc.floating[i].counted, 0 }); + + statistics->focusRegions.init({ PISP_CDAF_STATS_SIZE, PISP_CDAF_STATS_SIZE }); + for (i = 0; i < statistics->focusRegions.numRegions(); i++) + statistics->focusRegions.set(i, { stats->cdaf.foms[i] >> 20, 0, 0 }); + + if (statsMetadataOutput_) { + Span statsSpan(reinterpret_cast(stats), + sizeof(pisp_statistics)); + libcameraMetadata_.set(controls::rpi::PispStatsOutput, statsSpan); + } + + return statistics; +} + +void IpaPiSP::handleControls(const ControlList &controls) +{ + for (auto const &ctrl : controls) { + switch (ctrl.first) { + case controls::HDR_MODE: + case controls::AE_METERING_MODE: + setHistogramWeights(); + break; + + case controls::draft::NOISE_REDUCTION_MODE: { + RPiController::DenoiseAlgorithm *denoise = dynamic_cast( + controller_.getAlgorithm("denoise")); + + if (!denoise) { + LOG(IPARPI, Warning) + << "Could not set NOISE_REDUCTION_MODE - no Denoise algorithm"; + return; + } + + if (ctrl.second.get() == controls::draft::NoiseReductionModeOff) + denoise->setMode(RPiController::DenoiseMode::Off); + else + denoise->setMode(RPiController::DenoiseMode::ColourHighQuality); + + break; + } + } + } +} + +void IpaPiSP::applyWBG(const AwbStatus *awbStatus, const AgcPrepareStatus *agcPrepareStatus, + pisp_be_global_config &global) +{ + pisp_wbg_config wbg; + pisp_fe_rgby_config rgby = {}; + double dg = agcPrepareStatus ? agcPrepareStatus->digitalGain : 1.0; + + wbg.gain_r = clampField(dg * awbStatus->gainR, 14, 10); + wbg.gain_g = clampField(dg * awbStatus->gainG, 14, 10); + wbg.gain_b = clampField(dg * awbStatus->gainB, 14, 10); + + /* + * The YCbCr conversion block should contain the appropriate YCbCr + * matrix. We should not rely on the CSC0 block as that might be + * programmed for RGB outputs. + */ + pisp_be_ccm_config csc; + be_->GetYcbcr(csc); + + /* The CSC coefficients already have the << 10 scaling applied. */ + rgby.gain_r = clampField(csc.coeffs[0] * awbStatus->gainR, 14); + rgby.gain_g = clampField(csc.coeffs[1] * awbStatus->gainG, 14); + rgby.gain_b = clampField(csc.coeffs[2] * awbStatus->gainB, 14); + + LOG(IPARPI, Debug) << "Applying WB R: " << awbStatus->gainR << " B: " + << awbStatus->gainB; + + be_->SetWbg(wbg); + fe_->SetRGBY(rgby); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_WBG; +} + +void IpaPiSP::applyDgOnly(const AgcPrepareStatus *agcPrepareStatus, pisp_be_global_config &global) +{ + pisp_wbg_config wbg; + + wbg.gain_r = clampField(agcPrepareStatus->digitalGain, 14, 10); + wbg.gain_g = clampField(agcPrepareStatus->digitalGain, 14, 10); + wbg.gain_b = clampField(agcPrepareStatus->digitalGain, 14, 10); + + LOG(IPARPI, Debug) << "Applying DG (only) : " << agcPrepareStatus->digitalGain; + + be_->SetWbg(wbg); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_WBG; +} + +void IpaPiSP::applyContrast(const ContrastStatus *contrastStatus, + pisp_be_global_config &global) +{ + pisp_be_gamma_config gamma; + + if (!generateLut(contrastStatus->gammaCurve, gamma.lut, PISP_BE_GAMMA_LUT_SIZE)) { + be_->SetGamma(gamma); + global.rgb_enables |= PISP_BE_RGB_ENABLE_GAMMA; + } +} + +void IpaPiSP::applyCCM(const CcmStatus *ccmStatus, pisp_be_global_config &global) +{ + pisp_be_ccm_config ccm = {}; + + for (unsigned int i = 0; i < 9; i++) + ccm.coeffs[i] = clampField(ccmStatus->matrix[i], 14, 10, true); + + be_->SetCcm(ccm); + global.rgb_enables |= PISP_BE_RGB_ENABLE_CCM; +} + +void IpaPiSP::applyCAC(const CacStatus *cacStatus, pisp_be_global_config &global) +{ + pisp_be_cac_config cac = {}; + + for (int x = 0; x < PISP_BE_CAC_GRID_SIZE + 1; x++) { + for (int y = 0; y < PISP_BE_CAC_GRID_SIZE + 1; y++) { + cac.lut[y][x][0][0] = clampField(cacStatus->lutRx[y * (PISP_BE_CAC_GRID_SIZE + 1) + x], 7, 5, true); + cac.lut[y][x][0][1] = clampField(cacStatus->lutRy[y * (PISP_BE_CAC_GRID_SIZE + 1) + x], 7, 5, true); + cac.lut[y][x][1][0] = clampField(cacStatus->lutBx[y * (PISP_BE_CAC_GRID_SIZE + 1) + x], 7, 5, true); + cac.lut[y][x][1][1] = clampField(cacStatus->lutBy[y * (PISP_BE_CAC_GRID_SIZE + 1) + x], 7, 5, true); + } + } + + be_->SetCac(cac); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_CAC; +} + +void IpaPiSP::applyBlackLevel(const BlackLevelStatus *blackLevelStatus, pisp_be_global_config &global) +{ + uint16_t minBlackLevel = std::min({ blackLevelStatus->blackLevelR, blackLevelStatus->blackLevelG, + blackLevelStatus->blackLevelB }); + pisp_bla_config bla; + + /* + * Set the Frontend to adjust the black level to the smallest black level + * of all channels (in 16-bits). + */ + bla.black_level_r = blackLevelStatus->blackLevelR; + bla.black_level_gr = blackLevelStatus->blackLevelG; + bla.black_level_gb = blackLevelStatus->blackLevelG; + bla.black_level_b = blackLevelStatus->blackLevelB; + bla.output_black_level = minBlackLevel; + fe_->SetBla(bla); + + /* Frontend Stats and Backend black level correction. */ + bla.black_level_r = bla.black_level_gr = + bla.black_level_gb = bla.black_level_b = minBlackLevel; + bla.output_black_level = 0; + fe_->SetBlc(bla); + be_->SetBlc(bla); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_BLC; +} + +void IpaPiSP::applyLensShading(const AlscStatus *alscStatus, + pisp_be_global_config &global) +{ + pisp_be_lsc_extra lscExtra = {}; + pisp_be_lsc_config lsc = {}; + double rgb[3][NumLscVertexes][NumLscVertexes] = {}; + + resampleTable(&rgb[0][0][0], NumLscVertexes, NumLscVertexes, + alscStatus->r.data(), NumLscCells, NumLscCells); + resampleTable(&rgb[1][0][0], NumLscVertexes, NumLscVertexes, + alscStatus->g.data(), NumLscCells, NumLscCells); + resampleTable(&rgb[2][0][0], NumLscVertexes, NumLscVertexes, + alscStatus->b.data(), NumLscCells, NumLscCells); + packLscLut(lsc.lut_packed, rgb); + be_->SetLsc(lsc, lscExtra); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_LSC; +} + +void IpaPiSP::applyDPC(const DpcStatus *dpcStatus, pisp_be_global_config &global) +{ + pisp_be_dpc_config dpc = {}; + + switch (dpcStatus->strength) { + case 0: /* "off" */ + break; + case 1: /* "normal" */ + dpc.coeff_level = 1; + dpc.coeff_range = 8; + global.bayer_enables |= PISP_BE_BAYER_ENABLE_DPC; + break; + case 2: /* "strong" */ + dpc.coeff_level = 0; + dpc.coeff_range = 0; + global.bayer_enables |= PISP_BE_BAYER_ENABLE_DPC; + break; + default: + ASSERT(0); + } + + be_->SetDpc(dpc); +} + +void IpaPiSP::applySdn(const SdnStatus *sdnStatus, pisp_be_global_config &global) +{ + pisp_be_sdn_config sdn = {}; + pisp_bla_config blc; + + be_->GetBlc(blc); + /* All R/G/B black levels are the same value in the BE after FE alignment */ + sdn.black_level = blc.black_level_r; + /* leakage is "amount of the original pixel we let through", thus 1 - strength */ + sdn.leakage = clampField(1.0 - sdnStatus->strength, 8, 8); + sdn.noise_constant = clampField(sdnStatus->noiseConstant, 16); + sdn.noise_slope = clampField(sdnStatus->noiseSlope, 16, 8); + sdn.noise_constant2 = clampField(sdnStatus->noiseConstant2, 16); + sdn.noise_slope2 = clampField(sdnStatus->noiseSlope2, 16, 8); + be_->SetSdn(sdn); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_SDN; +} + +void IpaPiSP::applyTdn(const TdnStatus *tdnStatus, const DeviceStatus *deviceStatus, + pisp_be_global_config &global) +{ + utils::Duration exposure = deviceStatus->shutterSpeed * deviceStatus->analogueGain; + pisp_be_tdn_config tdn = {}; + + double ratio = tdnReset_ ? 1.0 : exposure / lastExposure_; + if (ratio >= 4.0) { + /* If the exposure ratio goes above 4x, we need to reset TDN. */ + ratio = 1; + tdnReset_ = true; + } + + LOG(IPARPI, Debug) << "TDN: exposure: " << exposure + << " last: " << lastExposure_ + << " ratio: " << ratio; + + pisp_bla_config blc; + be_->GetBlc(blc); + /* All R/G/B black levels are the same value in the BE after FE alignment */ + tdn.black_level = blc.black_level_r; + tdn.ratio = clampField(ratio, 16, 14); + tdn.noise_constant = clampField(tdnStatus->noiseConstant, 16); + tdn.noise_slope = clampField(tdnStatus->noiseSlope, 16, 8); + tdn.threshold = clampField(tdnStatus->threshold, 16, 16); + + global.bayer_enables |= PISP_BE_BAYER_ENABLE_TDN + PISP_BE_BAYER_ENABLE_TDN_OUTPUT; + + /* Only enable the TDN Input after a state reset. */ + if (!tdnReset_) { + global.bayer_enables |= PISP_BE_BAYER_ENABLE_TDN_INPUT; + tdn.reset = 0; + } else + tdn.reset = 1; + + be_->SetTdn(tdn); + tdnReset_ = false; +} + +void IpaPiSP::applyCdn(const CdnStatus *cdnStatus, pisp_be_global_config &global) +{ + pisp_be_cdn_config cdn = {}; + + cdn.thresh = clampField(cdnStatus->threshold, 16); + cdn.iir_strength = clampField(cdnStatus->strength, 8, 8); + cdn.g_adjust = clampField(0, 8, 8); + be_->SetCdn(cdn); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_CDN; +} + +void IpaPiSP::applyGeq(const GeqStatus *geqStatus, pisp_be_global_config &global) +{ + pisp_be_geq_config geq = {}; + + geq.min = 0; + geq.max = 0xffff; + geq.offset = clampField(geqStatus->offset, 16); + geq.slope_sharper = clampField(geqStatus->slope, 10, 10); + be_->SetGeq(geq); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_GEQ; +} + +void IpaPiSP::applySaturation(const SaturationStatus *saturationStatus, + pisp_be_global_config &global) +{ + pisp_be_sat_control_config saturation; + pisp_wbg_config wbg; + + saturation.shift_r = std::min(2, saturationStatus->shiftR); + saturation.shift_g = std::min(2, saturationStatus->shiftG); + saturation.shift_b = std::min(2, saturationStatus->shiftB); + be_->SetSatControl(saturation); + + be_->GetWbg(wbg); + wbg.gain_r >>= saturationStatus->shiftR; + wbg.gain_g >>= saturationStatus->shiftG; + wbg.gain_b >>= saturationStatus->shiftB; + be_->SetWbg(wbg); + + global.rgb_enables |= PISP_BE_RGB_ENABLE_SAT_CONTROL; +} + +void IpaPiSP::applySharpen(const SharpenStatus *sharpenStatus, + pisp_be_global_config &global) +{ + /* + * This threshold scaling is to normalise the VC4 and PiSP parameter + * scales in the tuning config. + */ + static constexpr double ThresholdScaling = 0.25; + const double scaling = sharpenStatus->threshold * ThresholdScaling; + + pisp_be_sh_fc_combine_config shfc; + pisp_be_sharpen_config sharpen; + + be_->InitialiseSharpen(sharpen, shfc); + sharpen.threshold_offset0 = clampField(sharpen.threshold_offset0 * scaling, 16); + sharpen.threshold_offset1 = clampField(sharpen.threshold_offset1 * scaling, 16); + sharpen.threshold_offset2 = clampField(sharpen.threshold_offset2 * scaling, 16); + sharpen.threshold_offset3 = clampField(sharpen.threshold_offset3 * scaling, 16); + sharpen.threshold_offset4 = clampField(sharpen.threshold_offset4 * scaling, 16); + sharpen.threshold_slope0 = clampField(sharpen.threshold_slope0 * scaling, 12); + sharpen.threshold_slope1 = clampField(sharpen.threshold_slope1 * scaling, 12); + sharpen.threshold_slope2 = clampField(sharpen.threshold_slope2 * scaling, 12); + sharpen.threshold_slope3 = clampField(sharpen.threshold_slope3 * scaling, 12); + sharpen.threshold_slope4 = clampField(sharpen.threshold_slope4 * scaling, 12); + sharpen.positive_strength = clampField(sharpen.positive_strength * sharpenStatus->strength, 12); + sharpen.negative_strength = clampField(sharpen.negative_strength * sharpenStatus->strength, 12); + sharpen.positive_pre_limit = clampField(sharpen.positive_pre_limit * sharpenStatus->limit, 16); + sharpen.positive_limit = clampField(sharpen.positive_limit * sharpenStatus->limit, 16); + sharpen.negative_pre_limit = clampField(sharpen.negative_pre_limit * sharpenStatus->limit, 16); + sharpen.negative_limit = clampField(sharpen.negative_limit * sharpenStatus->limit, 16); + + be_->SetSharpen(sharpen); + /* The conversion to YCbCr and back is always enabled. */ + global.rgb_enables |= PISP_BE_RGB_ENABLE_SHARPEN; +} + +bool IpaPiSP::applyStitch(const StitchStatus *stitchStatus, const DeviceStatus *deviceStatus, + const AgcStatus *agcStatus, pisp_be_global_config &global) +{ + /* + * Find out what HDR mode/channel this frame is. Normally this will be in the delayed + * HDR status (in the AGC status), though after a mode switch this will be absent and + * the information will have been stored in the hdrStatus_ field. + */ + const HdrStatus *hdrStatus = &hdrStatus_; + if (agcStatus) + hdrStatus = &agcStatus->hdr; + + bool modeChange = hdrStatus->mode != lastStitchHdrStatus_.mode; + bool channelChange = !modeChange && hdrStatus->channel != lastStitchHdrStatus_.channel; + lastStitchHdrStatus_ = *hdrStatus; + + /* Check for a change of HDR mode. That forces us to start over. */ + if (modeChange) + lastStitchExposures_.clear(); + + if (hdrStatus->channel != "short" && hdrStatus->channel != "long") { + /* The channel *must* be long or short, anything else does not make sense. */ + LOG(IPARPI, Warning) << "Stitch channel is not long or short"; + return false; + } + + /* Whatever happens, we're going to output this buffer now. */ + global.bayer_enables |= PISP_BE_BAYER_ENABLE_STITCH_OUTPUT; + + utils::Duration exposure = deviceStatus->shutterSpeed * deviceStatus->analogueGain; + lastStitchExposures_[hdrStatus->channel] = exposure; + + /* If the other channel hasn't been seen there's nothing more we can do. */ + std::string otherChannel = hdrStatus->channel == "short" ? "long" : "short"; + if (lastStitchExposures_.find(otherChannel) == lastStitchExposures_.end()) { + /* The first channel should be "short". */ + if (hdrStatus->channel != "short") + LOG(IPARPI, Warning) << "First frame is not short"; + return false; + } + + /* We have both channels, we need to enable stitching. */ + global.bayer_enables |= PISP_BE_BAYER_ENABLE_STITCH_INPUT + PISP_BE_BAYER_ENABLE_STITCH; + + utils::Duration otherExposure = lastStitchExposures_[otherChannel]; + bool phaseLong = hdrStatus->channel == "long"; + double ratio = phaseLong ? otherExposure / exposure : exposure / otherExposure; + + pisp_be_stitch_config stitch = {}; + stitch.exposure_ratio = clampField(ratio, 15, 15); + if (phaseLong) + stitch.exposure_ratio |= PISP_BE_STITCH_STREAMING_LONG; + /* These will be filled in correctly once we have implemented the HDR algorithm. */ + stitch.threshold_lo = stitchStatus->thresholdLo; + stitch.threshold_diff_power = stitchStatus->diffPower; + stitch.motion_threshold_256 = stitchStatus->motionThreshold; + be_->SetStitch(stitch); + + return channelChange; +} + +void IpaPiSP::applyTonemap(const TonemapStatus *tonemapStatus, pisp_be_global_config &global) +{ + pisp_be_tonemap_config tonemap = {}; + + tonemap.detail_constant = clampField(tonemapStatus->detailConstant, 16); + tonemap.detail_slope = clampField(tonemapStatus->detailSlope, 16, 8); + tonemap.iir_strength = clampField(tonemapStatus->iirStrength, 12, 4); + tonemap.strength = clampField(tonemapStatus->strength, 12, 8); + + if (!generateLut(tonemapStatus->tonemap, tonemap.lut, PISP_BE_TONEMAP_LUT_SIZE)) { + be_->SetTonemap(tonemap); + global.bayer_enables |= PISP_BE_BAYER_ENABLE_TONEMAP; + } +} + +void IpaPiSP::applyFocusStats(const NoiseStatus *noiseStatus) +{ + pisp_fe_cdaf_stats_config cdaf; + fe_->GetCdafStats(cdaf); + + cdaf.noise_constant = noiseStatus->noiseConstant; + cdaf.noise_slope = noiseStatus->noiseSlope; + fe_->SetCdafStats(cdaf); +} + +void IpaPiSP::applyAF(const struct AfStatus *afStatus, ControlList &lensCtrls) +{ + if (afStatus->lensSetting) { + ControlValue v(afStatus->lensSetting.value()); + lensCtrls.set(V4L2_CID_FOCUS_ABSOLUTE, v); + } +} + +void IpaPiSP::setDefaultConfig() +{ + std::scoped_lock l(*fe_); + + pisp_be_global_config beGlobal; + pisp_fe_global_config feGlobal; + + fe_->GetGlobal(feGlobal); + be_->GetGlobal(beGlobal); + /* + * Always go to YCbCr and back. We need them if the false colour block is enabled, + * and even for mono sensors if sharpening is enabled. So we're better off enabling + * them all the time. + */ + beGlobal.rgb_enables |= PISP_BE_RGB_ENABLE_YCBCR + PISP_BE_RGB_ENABLE_YCBCR_INVERSE; + + if (!monoSensor()) { + beGlobal.bayer_enables |= PISP_BE_BAYER_ENABLE_DEMOSAIC; + beGlobal.rgb_enables |= PISP_BE_RGB_ENABLE_FALSE_COLOUR; + } + + /* + * Ask the AWB algorithm for reasonable gain values so that we can program the + * front end stats sensibly. We must also factor in the conversion to luminance. + */ + pisp_fe_rgby_config rgby = {}; + double gainR = 1.5, gainB = 1.5; + RPiController::AwbAlgorithm *awb = dynamic_cast( + controller_.getAlgorithm("awb")); + if (awb) + awb->initialValues(gainR, gainB); + /* The BT.601 RGB -> Y coefficients will do. The precise values are not critical. */ + rgby.gain_r = clampField(gainR * 0.299, 14, 10); + rgby.gain_g = clampField(1.0 * .587, 14, 10); + rgby.gain_b = clampField(gainB * .114, 14, 10); + fe_->SetRGBY(rgby); + feGlobal.enables |= PISP_FE_ENABLE_RGBY; + + /* Also get sensible front end black level defaults, for the same reason. */ + RPiController::BlackLevelAlgorithm *blackLevel = dynamic_cast( + controller_.getAlgorithm("black_level")); + if (blackLevel) { + uint16_t blackLevelR, blackLevelG, blackLevelB; + BlackLevelStatus blackLevelStatus; + + blackLevel->initialValues(blackLevelR, blackLevelG, blackLevelB); + blackLevelStatus.blackLevelR = blackLevelR; + blackLevelStatus.blackLevelG = blackLevelG; + blackLevelStatus.blackLevelB = blackLevelB; + applyBlackLevel(&blackLevelStatus, beGlobal); + feGlobal.enables |= PISP_FE_ENABLE_BLA + PISP_FE_ENABLE_BLC; + } + + fe_->SetGlobal(feGlobal); + be_->SetGlobal(beGlobal); +} + +void IpaPiSP::setStatsAndDebin() +{ + pisp_fe_crop_config crop{ 0, 0, mode_.width, mode_.height }; + + pisp_fe_awb_stats_config awb = {}; + awb.r_lo = awb.g_lo = awb.b_lo = 0; + awb.r_hi = awb.g_hi = awb.b_hi = 65535 * 0.98; + + pisp_fe_cdaf_stats_config cdaf = {}; + cdaf.mode = (1 << 4) + (1 << 2) + 1; /* Gr / Gb count with weights of (1, 1) */ + + { + std::scoped_lock l(*fe_); + pisp_fe_global_config feGlobal; + fe_->GetGlobal(feGlobal); + feGlobal.enables |= PISP_FE_ENABLE_AWB_STATS + PISP_FE_ENABLE_AGC_STATS + + PISP_FE_ENABLE_CDAF_STATS; + + fe_->SetGlobal(feGlobal); + fe_->SetStatsCrop(crop); + fe_->SetAwbStats(awb); + fe_->SetCdafStats(cdaf); + } + + /* + * Apply the correct AGC region weights to the Frontend. Need to do this + * out of the Frontend scoped lock. + */ + setHistogramWeights(); + + pisp_be_global_config beGlobal; + be_->GetGlobal(beGlobal); + + if (mode_.binX > 1 || mode_.binY > 1) { + pisp_be_debin_config debin; + + be_->GetDebin(debin); + debin.h_enable = (mode_.binX > 1); + debin.v_enable = (mode_.binY > 1); + be_->SetDebin(debin); + beGlobal.bayer_enables |= PISP_BE_BAYER_ENABLE_DEBIN; + } else + beGlobal.bayer_enables &= ~PISP_BE_BAYER_ENABLE_DEBIN; + + be_->SetGlobal(beGlobal); +} + +void IpaPiSP::setHistogramWeights() +{ + RPiController::AgcAlgorithm *agc = dynamic_cast( + controller_.getAlgorithm("agc")); + if (!agc) + return; + + const std::vector &weights = agc->getWeights(); + + pisp_fe_agc_stats_config config; + memset(&config, 0, sizeof(config)); + + /* + * The AGC software gives us a 15x15 table of weights which we + * map onto 16x16 in the hardware, ensuring the rightmost column + * and bottom row all have zero weight. We align everything to + * the native 2x2 Bayer pixel blocks. + */ + const Size &size = controller_.getHardwareConfig().agcZoneWeights; + int width = (mode_.width / size.width) & ~1; + int height = (mode_.height / size.height) & ~1; + config.offset_x = ((mode_.width - size.width * width) / 2) & ~1; + config.offset_y = ((mode_.height - size.height * height) / 2) & ~1; + config.size_x = width; + config.size_y = height; + + unsigned int idx = 0; + for (unsigned int row = 0; row < size.height; row++) { + unsigned int col = 0; + for (; col < size.width / 2; col++) { + int wt0 = clampField(weights[idx++], 4, 0, false, "agc weights"); + int wt1 = clampField(weights[idx++], 4, 0, false, "agc weights"); + config.weights[row * 8 + col] = (wt1 << 4) | wt0; + } + if (size.width & 1) + config.weights[row * 8 + col] = + clampField(weights[idx++], 4, 0, false, "agc weights"); + } + + std::scoped_lock l(*fe_); + fe_->SetAgcStats(config); +} + +} /* namespace ipa::RPi */ + +/* + * External IPA module interface + */ +extern "C" { +const IPAModuleInfo ipaModuleInfo = { + IPA_MODULE_API_VERSION, + 1, + "rpi/pisp", + "rpi/pisp", +}; + +IPAInterface *ipaCreate() +{ + return new ipa::RPi::IpaPiSP(); +} + +} /* extern "C" */ + +} /* namespace libcamera */ diff --git a/src/libcamera/control_ids_rpi.yaml b/src/libcamera/control_ids_rpi.yaml index b066b9ff7..276213dc1 100644 --- a/src/libcamera/control_ids_rpi.yaml +++ b/src/libcamera/control_ids_rpi.yaml @@ -45,4 +45,16 @@ controls: applicable on the Pi5/PiSP platform. \sa ScalerCrop + + - PispStatsOutput: + type: uint8_t + size: [n] + description: | + Span of the PiSP Frontend ISP generated statistics for the current + frame. This is sent in the Request metadata if the StatsOutputEnable is + set to true. The statistics struct definition can be found in + https://github.com/raspberrypi/libpisp/blob/main/src/libpisp/frontend/pisp_statistics.h + + \sa StatsOutputEnable + ... From f08b6df9c445b018a5026d915a5f2850be61f8cf Mon Sep 17 00:00:00 2001 From: Nick Hollinghurst Date: Thu, 8 Dec 2022 13:53:16 +0000 Subject: [PATCH 13/46] RASPBERRYPI ONLY: Add Sony IMX708 sensor properties The IMX708 sensor driver advertises its module variants (narrow/wide angle lens, IR block/pass) by modifying the media entity name string. So add duplicate entries for each variant. Signed-off-by: Nick Hollinghurst Signed-off-by: Naushir Patuck Reviewed-by: Naushir Patuck Reviewed-by: David Plowman --- src/libcamera/sensor/camera_sensor_properties.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp index 6d4136d03..1c59eb064 100644 --- a/src/libcamera/sensor/camera_sensor_properties.cpp +++ b/src/libcamera/sensor/camera_sensor_properties.cpp @@ -168,6 +168,18 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen { controls::draft::TestPatternModePn9, 4 }, }, } }, + { "imx708_noir", { + .unitCellSize = { 1400, 1400 }, + .testPatternModes = {}, + } }, + { "imx708_wide", { + .unitCellSize = { 1400, 1400 }, + .testPatternModes = {}, + } }, + { "imx708_wide_noir", { + .unitCellSize = { 1400, 1400 }, + .testPatternModes = {}, + } }, { "ov2685", { .unitCellSize = { 1750, 1750 }, .testPatternModes = { From 62b433ebd8fca626a6faef838553281899e40320 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Tue, 23 May 2023 12:03:37 +0100 Subject: [PATCH 14/46] RASPBERRYPI ONLY: Handle mandatory stream flags Look for the RAW mandatory stream flag in the pipeline handler config file. If this flag is set, it guarantees that the application will provide buffers for Unicam Image, so override the minUnicamBuffers and minTotalUnicamBuffers config parameters in the following way: - If startup drop frames are required, allocate at least 1 internal buffer. - If no startup drop frames are required, do not allocate any internal buffers. Look for the Output 0 mandatory stream flag in in the pipeline handler config file. If this flag is set, it guarantees that the application will provide buffers for the ISP, do not allocate any internal buffers for the device. Add a new rpi_apps.yaml pipeline handler config file that enables both these flags. To use the file, set the following env variable for a custom build: export LIBCAMERA_RPI_CONFIG_FILE=/usr/local/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml or for a packaged install: export LIBCAMERA_RPI_CONFIG_FILE=/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml Signed-off-by: Naushir Patuck --- .../pipeline/rpi/vc4/data/meson.build | 1 + .../pipeline/rpi/vc4/data/rpi_apps.yaml | 45 +++++++++++ src/libcamera/pipeline/rpi/vc4/vc4.cpp | 80 +++++++++++++++---- 3 files changed, 112 insertions(+), 14 deletions(-) create mode 100644 src/libcamera/pipeline/rpi/vc4/data/rpi_apps.yaml diff --git a/src/libcamera/pipeline/rpi/vc4/data/meson.build b/src/libcamera/pipeline/rpi/vc4/data/meson.build index 179feebc1..009ea5670 100644 --- a/src/libcamera/pipeline/rpi/vc4/data/meson.build +++ b/src/libcamera/pipeline/rpi/vc4/data/meson.build @@ -2,6 +2,7 @@ conf_files = files([ 'example.yaml', + 'rpi_apps.yaml', ]) install_data(conf_files, diff --git a/src/libcamera/pipeline/rpi/vc4/data/rpi_apps.yaml b/src/libcamera/pipeline/rpi/vc4/data/rpi_apps.yaml new file mode 100644 index 000000000..f2c849b7e --- /dev/null +++ b/src/libcamera/pipeline/rpi/vc4/data/rpi_apps.yaml @@ -0,0 +1,45 @@ +{ + "version": 1.0, + "target": "bcm2835", + + "pipeline_handler": + { + # The minimum number of internal buffers to be allocated for + # Unicam. This value must be greater than 0, but less than or + # equal to min_total_unicam_buffers. + # + # A larger number of internal buffers can reduce the occurrence + # of frame drops during high CPU loads, but might also cause + # additional latency in the system. + # + # Note that the pipeline handler might override this value and + # not allocate any internal buffers if it knows they will never + # be used. For example if the RAW stream is marked as mandatory + # and there are no dropped frames signalled for algorithm + # convergence. + # + "min_unicam_buffers": 2, + + # The minimum total (internal + external) buffer count used for + # Unicam. The number of internal buffers allocated for Unicam is + # given by: + # + # internal buffer count = max(min_unicam_buffers, + # min_total_unicam_buffers - external buffer count) + # + "min_total_unicam_buffers": 4, + + # Override any request from the IPA to drop a number of startup + # frames. + # + # "disable_startup_frame_drops": false, + + # The application will always provide a request buffer for the + # RAW stream, if it has been configured. + "raw_mandatory_stream": true, + + # The application will always provide a request buffer for the + # Output 0 stream, if it has been configured. + "output0_mandatory_stream": true, + } +} diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index 94bddc90d..4d184674b 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -104,6 +104,16 @@ class Vc4CameraData final : public RPi::CameraData * minTotalUnicamBuffers >= minUnicamBuffers */ unsigned int minTotalUnicamBuffers; + /* + * The application will always provide a request buffer for the + * RAW stream, if it has been configured. + */ + bool rawMandatoryStream; + /* + * The application will always provide a request buffer for the + * Output 0 stream, if it has been configured. + */ + bool output0MandatoryStream; }; Config config_; @@ -219,16 +229,47 @@ bool PipelineHandlerVc4::match(DeviceEnumerator *enumerator) int PipelineHandlerVc4::prepareBuffers(Camera *camera) { Vc4CameraData *data = cameraData(camera); - unsigned int numRawBuffers = 0; + unsigned int minUnicamBuffers = data->config_.minUnicamBuffers; + unsigned int minTotalUnicamBuffers = data->config_.minTotalUnicamBuffers; + unsigned int numRawBuffers = 0, minIspBuffers = 1; int ret; - for (Stream *s : camera->streams()) { - if (BayerFormat::fromPixelFormat(s->configuration().pixelFormat).isValid()) { - numRawBuffers = s->configuration().bufferCount; - break; + if (data->unicam_[Unicam::Image].getFlags() & StreamFlag::External) { + numRawBuffers = data->unicam_[Unicam::Image].getBuffers().size(); + /* + * If the application provides a guarantees that Unicam + * image buffers will always be provided for the RAW stream + * in a Request, we need: + * - at least 1 internal Unicam buffer to handle startup frame drops, + * - no internal Unicam buffers if there are no startup frame drops. + */ + if (data->config_.rawMandatoryStream) { + if (data->dropFrameCount_) { + minUnicamBuffers = 2; + minTotalUnicamBuffers = 2; + } else { + minUnicamBuffers = 0; + minTotalUnicamBuffers = 0; + } } } + if (data->isp_[Isp::Output0].getFlags() & StreamFlag::External) { + /* + * Since the ISP runs synchronous with the IPA and requests, + * we only ever need a maximum of one internal buffer. Any + * buffers the application wants to hold onto will already + * be exported through PipelineHandlerRPi::exportFrameBuffers(). + * + * However, as above, if the application provides a guarantee + * that the buffer will always be provided for the ISP Output0 + * stream in a Request, we don't need any internal buffers + * allocated. + */ + if (!data->dropFrameCount_ && data->config_.output0MandatoryStream) + minIspBuffers = 0; + } + /* Decide how many internal buffers to allocate. */ for (auto const stream : data->streams_) { unsigned int numBuffers; @@ -236,7 +277,6 @@ int PipelineHandlerVc4::prepareBuffers(Camera *camera) * For Unicam, allocate a minimum number of buffers for internal * use as we want to avoid any frame drops. */ - const unsigned int minBuffers = data->config_.minTotalUnicamBuffers; if (stream == &data->unicam_[Unicam::Image]) { /* * If an application has configured a RAW stream, allocate @@ -244,8 +284,9 @@ int PipelineHandlerVc4::prepareBuffers(Camera *camera) * we have at least minUnicamBuffers of internal buffers * to use to minimise frame drops. */ - numBuffers = std::max(data->config_.minUnicamBuffers, - minBuffers - numRawBuffers); + numBuffers = std::max(minUnicamBuffers, + minTotalUnicamBuffers - numRawBuffers); + LOG(RPI, Debug) << "Unicam::Image numBuffers " << numBuffers; } else if (stream == &data->isp_[Isp::Input]) { /* * ISP input buffers are imported from Unicam, so follow @@ -253,8 +294,9 @@ int PipelineHandlerVc4::prepareBuffers(Camera *camera) * available. */ numBuffers = numRawBuffers + - std::max(data->config_.minUnicamBuffers, - minBuffers - numRawBuffers); + std::max(minUnicamBuffers, + minTotalUnicamBuffers - numRawBuffers); + LOG(RPI, Debug) << "Isp::Input numBuffers " << numBuffers; } else if (stream == &data->unicam_[Unicam::Embedded]) { /* @@ -273,14 +315,18 @@ int PipelineHandlerVc4::prepareBuffers(Camera *camera) * buffers, as these will be recycled quicker. */ numBuffers = 12; + } else if (stream == &data->isp_[Isp::Output0]) { + /* Buffer count for this is handled in the earlier loop above. */ + numBuffers = minIspBuffers; + LOG(RPI, Debug) << "Isp::Output0 numBuffers " << numBuffers; } else { /* - * Since the ISP runs synchronous with the IPA and requests, - * we only ever need one set of internal buffers. Any buffers - * the application wants to hold onto will already be exported - * through PipelineHandlerRPi::exportFrameBuffers(). + * Same reasoning as for ISP Output 0, we only ever need + * a maximum of one internal buffer for Output1 (required + * for colour denoise) and ISP statistics. */ numBuffers = 1; + LOG(RPI, Debug) << "Other numBuffers " << numBuffers; } LOG(RPI, Debug) << "Preparing " << numBuffers @@ -498,6 +544,8 @@ int Vc4CameraData::platformPipelineConfigure(const std::unique_ptr & config_ = { .minUnicamBuffers = 2, .minTotalUnicamBuffers = 4, + .rawMandatoryStream = false, + .output0MandatoryStream = false, }; if (!root) @@ -521,6 +569,10 @@ int Vc4CameraData::platformPipelineConfigure(const std::unique_ptr & phConfig["min_unicam_buffers"].get(config_.minUnicamBuffers); config_.minTotalUnicamBuffers = phConfig["min_total_unicam_buffers"].get(config_.minTotalUnicamBuffers); + config_.rawMandatoryStream = + phConfig["raw_mandatory_stream"].get(config_.rawMandatoryStream); + config_.output0MandatoryStream = + phConfig["output0_mandatory_stream"].get(config_.output0MandatoryStream); if (config_.minTotalUnicamBuffers < config_.minUnicamBuffers) { LOG(RPI, Error) << "Invalid configuration: min_total_unicam_buffers must be >= min_unicam_buffers"; From 0c1bf0b977057432f088563b711916ba457977bc Mon Sep 17 00:00:00 2001 From: Serge Schneider Date: Thu, 16 Nov 2023 12:19:14 +0000 Subject: [PATCH 15/46] RASPBERRYPI ONLY: Add a Github workflow to generate release tarballs --- .github/workflows/gen_orig.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/gen_orig.yml diff --git a/.github/workflows/gen_orig.yml b/.github/workflows/gen_orig.yml new file mode 100644 index 000000000..cfc302a86 --- /dev/null +++ b/.github/workflows/gen_orig.yml @@ -0,0 +1,33 @@ +name: Generate source release tarball +run-name: Generating source release tarball +on: + push: + tags: # vX.Y.Z+rptYYYMMDD + - 'v[0-9]+.[0-9]+.[0-9]+\+rpt[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' + workflow_dispatch: +jobs: + publish_tarball: + permissions: + contents: write + runs-on: ubuntu-latest + steps: + - name: Install dependencies + run: | # Local cmake needs to be removed for pybind11 to be detected + sudo rm -rf /usr/local/bin/cmake + sudo apt-get update + sudo apt-get install -y meson pkgconf cmake libgtest-dev libyaml-dev python3 python3-dev pybind11-dev python3-jinja2 python3-ply python3-yaml + - name: Check out repository code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required for 'git describe' to work + - name: Generate tarball + run: | + meson setup build -Dpycamera=enabled + meson dist --no-tests --include-subprojects -C build + mv build/meson-dist/*.tar.xz "build/meson-dist/libcamera-${GITHUB_REF_NAME:1}.tar.xz" + - name: Release tarball + uses: softprops/action-gh-release@v1 + with: + files: build/meson-dist/*.tar.xz + - if: failure() + run: cat build/meson-logs/meson-log.txt From 114c35d5e4b4cb29e223154f102ded30aae2f228 Mon Sep 17 00:00:00 2001 From: mtouzot Date: Sat, 30 Mar 2024 14:52:20 +0100 Subject: [PATCH 16/46] RASPBERRYPI ONLY: Update README to follow Raspberry Pi documentation --- README.rst | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 4068c6cc8..29a017d64 100644 --- a/README.rst +++ b/README.rst @@ -25,15 +25,47 @@ systems, including traditional Linux distributions, ChromeOS and Android. Getting Started --------------- -To fetch the sources, build and install: +Only build ``libcamera`` from scratch if you need custom behaviour or the latest features that have not yet reached ``apt`` repositories. +If you run ``Raspberry Pi OS Lite``, begin by installing the following packages: + .. code:: - git clone https://git.libcamera.org/libcamera/libcamera.git + sudo apt install -y python-pip git python3-jinja2 + +First, install the following ``libcamera`` dependencies: +.. code:: + + sudo apt install -y libboost-dev + sudo apt install -y libgnutls28-dev openssl libtiff-dev pybind11-dev + sudo apt install -y qtbase5-dev libqt5core5a libqt5widgets + sudo apt install -y meson cmake + sudo apt install -y python3-yaml python3-ply + sudo apt install -y libglib2.0-dev libgstreamer-plugins-base1.0-dev + +Now we're ready to build ``libcamera`` itself. + +Download a local copy of Raspberry Pi's fork of ``libcamera`` from GitHub, before building and installing freshly-build binary: + +.. code:: + + git clone https://github.com/raspberrypi/libcamera.git cd libcamera - meson setup build + meson setup build --buildtype=release -Dpipelines=rpi/vc4,rpi/pisp -Dipas=rpi/vc4,rpi/pisp -Dv4l2=true -Dgstreamer=enabled -Dtest=false -Dlc-compliance=disabled -Dcam=disabled -Dqcam=disabled -Ddocumentation=disabled -Dpycamera=enabled ninja -C build install +You can disable the ``gstreamer`` plugin by replacing ``-Dgstreamer=enabled`` with ``-Dgstreamer=disabled`` during the ``meson`` build configuration. +If you disable ``gstreamer``, there is no need to install the ``libglib2.0-dev`` and ``libgstreamer-plugins-base1.0-dev`` dependencies. + +On devices with 1GB of memory or less, the build may exceed available memory. Append the ``-j 1`` flag to ``ninja`` commands to limit the build to a single process. +This should prevent the build from exceeding available memory on devices like the Raspberry Pi Zero and the Raspberry Pi 3. + +``libcamera`` does not yet have a stable binary interface. Always build ``rpicam-apps`` after you build ``libcamera``. + +You can find more informations at `Raspberry Pi libcamera documentation`_ pages. + +.. _Raspberry Pi libcamera documentation: https://www.raspberrypi.com/documentation/computers/camera_software.html + Dependencies ~~~~~~~~~~~~ From 4cb83d3ece917a6e7a81cc662085fab712a1fb70 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Fri, 28 Jun 2024 12:21:26 +0100 Subject: [PATCH 17/46] RASPBERRYPI ONLY: libcamera: v4l2_videodevice: Limit number of queued buffers V4L2 only allows upto VIDEO_MAX_FRAME frames to be queued at a time, so if we reach this limit, store the framebuffers in a pending queue, and try to enqueue once a buffer has been dequeued. Signed-off-by: Naushir Patuck --- include/libcamera/internal/v4l2_videodevice.h | 4 + src/libcamera/v4l2_videodevice.cpp | 335 +++++++++++------- 2 files changed, 203 insertions(+), 136 deletions(-) diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h index 9057be08f..d077f9580 100644 --- a/include/libcamera/internal/v4l2_videodevice.h +++ b/include/libcamera/internal/v4l2_videodevice.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -266,6 +267,8 @@ class V4L2VideoDevice : public V4L2Device void bufferAvailable(); FrameBuffer *dequeueBuffer(); + int queueToDevice(FrameBuffer *buffer); + void watchdogExpired(); template @@ -281,6 +284,7 @@ class V4L2VideoDevice : public V4L2Device V4L2BufferCache *cache_; std::map queuedBuffers_; + std::queue pendingBuffersToQueue_; EventNotifier *fdBufferNotifier_; diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp index 93cb16979..833527aa9 100644 --- a/src/libcamera/v4l2_videodevice.cpp +++ b/src/libcamera/v4l2_videodevice.cpp @@ -1570,7 +1570,7 @@ int V4L2VideoDevice::releaseBuffers() } /** - * \brief Queue a buffer to the video device + * \brief Queue a buffer to the video device if possible * \param[in] buffer The buffer to be queued * * For capture video devices the \a buffer will be filled with data by the @@ -1584,156 +1584,38 @@ int V4L2VideoDevice::releaseBuffers() * Note that queueBuffer() will fail if the device is in the process of being * stopped from a streaming state through streamOff(). * + * V4L2 only allows upto VIDEO_MAX_FRAME frames to be queued at a time, so if + * we reach this limit, store the framebuffers in a pending queue, and try to + * enqueue once a buffer has been dequeued. + * * \return 0 on success or a negative error code otherwise */ int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer) { - struct v4l2_plane v4l2Planes[VIDEO_MAX_PLANES] = {}; - struct v4l2_buffer buf = {}; - int ret; - if (state_ == State::Stopping) { LOG(V4L2, Error) << "Device is in a stopping state."; return -ESHUTDOWN; } - /* - * Pipeline handlers should not requeue buffers after releasing the - * buffers on the device. Any occurence of this error should be fixed - * in the pipeline handler directly. - */ - if (!cache_) { - LOG(V4L2, Fatal) << "No BufferCache available to queue."; - return -ENOENT; - } - - ret = cache_->get(*buffer); - if (ret < 0) - return ret; - - buf.index = ret; - buf.type = bufferType_; - buf.memory = memoryType_; - buf.field = V4L2_FIELD_NONE; - - bool multiPlanar = V4L2_TYPE_IS_MULTIPLANAR(buf.type); - const std::vector &planes = buffer->planes(); - const unsigned int numV4l2Planes = format_.planesCount; - - /* - * Ensure that the frame buffer has enough planes, and that they're - * contiguous if the V4L2 format requires them to be. - */ - if (planes.size() < numV4l2Planes) { - LOG(V4L2, Error) << "Frame buffer has too few planes"; - return -EINVAL; - } - - if (planes.size() != numV4l2Planes && !buffer->_d()->isContiguous()) { - LOG(V4L2, Error) << "Device format requires contiguous buffer"; - return -EINVAL; - } - - if (buf.memory == V4L2_MEMORY_DMABUF) { - if (multiPlanar) { - for (unsigned int p = 0; p < numV4l2Planes; ++p) - v4l2Planes[p].m.fd = planes[p].fd.get(); - } else { - buf.m.fd = planes[0].fd.get(); - } - } - - if (multiPlanar) { - buf.length = numV4l2Planes; - buf.m.planes = v4l2Planes; - } - - if (V4L2_TYPE_IS_OUTPUT(buf.type)) { - const FrameMetadata &metadata = buffer->metadata(); - - for (const auto &plane : metadata.planes()) { - if (!plane.bytesused) - LOG(V4L2, Warning) << "byteused == 0 is deprecated"; - } - - if (numV4l2Planes != planes.size()) { - /* - * If we have a multi-planar buffer with a V4L2 - * single-planar format, coalesce all planes. The length - * and number of bytes used may only differ in the last - * plane as any other situation can't be represented. - */ - unsigned int bytesused = 0; - unsigned int length = 0; - - for (auto [i, plane] : utils::enumerate(planes)) { - bytesused += metadata.planes()[i].bytesused; - length += plane.length; - - if (i != planes.size() - 1 && bytesused != length) { - LOG(V4L2, Error) - << "Holes in multi-planar buffer not supported"; - return -EINVAL; - } - } - - if (multiPlanar) { - v4l2Planes[0].bytesused = bytesused; - v4l2Planes[0].length = length; - } else { - buf.bytesused = bytesused; - buf.length = length; - } - } else if (multiPlanar) { - /* - * If we use the multi-planar API, fill in the planes. - * The number of planes in the frame buffer and in the - * V4L2 buffer is guaranteed to be equal at this point. - */ - for (auto [i, plane] : utils::enumerate(planes)) { - v4l2Planes[i].bytesused = metadata.planes()[i].bytesused; - v4l2Planes[i].length = plane.length; - } - } else { - /* - * Single-planar API with a single plane in the buffer - * is trivial to handle. - */ - buf.bytesused = metadata.planes()[0].bytesused; - buf.length = planes[0].length; - } + if (queuedBuffers_.size() == VIDEO_MAX_FRAME) { + LOG(V4L2, Debug) << "V4L2 queue has " << VIDEO_MAX_FRAME + << " already queued, differing queueing."; - /* - * Timestamps are to be supplied if the device is a mem-to-mem - * device. The drivers will have V4L2_BUF_FLAG_TIMESTAMP_COPY - * set hence these timestamps will be copied from the output - * buffers to capture buffers. If the device is not mem-to-mem, - * there is no harm in setting the timestamps as they will be - * ignored (and over-written). - */ - buf.timestamp.tv_sec = metadata.timestamp / 1000000000; - buf.timestamp.tv_usec = (metadata.timestamp / 1000) % 1000000; + pendingBuffersToQueue_.push(buffer); + return 0; } - LOG(V4L2, Debug) << "Queueing buffer " << buf.index; + if (!pendingBuffersToQueue_.empty()) { + LOG(V4L2, Debug) << "Adding buffer " << buffer + << " to the pending queue and replacing with " + << pendingBuffersToQueue_.front(); - ret = ioctl(VIDIOC_QBUF, &buf); - if (ret < 0) { - LOG(V4L2, Error) - << "Failed to queue buffer " << buf.index << ": " - << strerror(-ret); - return ret; - } - - if (queuedBuffers_.empty()) { - fdBufferNotifier_->setEnabled(true); - if (watchdogDuration_) - watchdog_.start(std::chrono::duration_cast(watchdogDuration_)); + pendingBuffersToQueue_.push(buffer); + buffer = pendingBuffersToQueue_.front(); + pendingBuffersToQueue_.pop(); } - queuedBuffers_[buf.index] = buffer; - - return 0; + return queueToDevice(buffer); } /** @@ -1761,6 +1643,11 @@ void V4L2VideoDevice::bufferAvailable() * This function dequeues the next available buffer from the device. If no * buffer is available to be dequeued it will return nullptr immediately. * + * Once a buffer is dequeued from the device, this function may also enqueue + * a buffer that has been placed in the pending queue (due to reaching the V4L2 + * queue size limit. Note that if this enqueue fails, we log the error, but + * continue running this function to completion. + * * \return A pointer to the dequeued buffer on success, or nullptr otherwise */ FrameBuffer *V4L2VideoDevice::dequeueBuffer() @@ -1813,6 +1700,20 @@ FrameBuffer *V4L2VideoDevice::dequeueBuffer() FrameBuffer *buffer = it->second; queuedBuffers_.erase(it); + if (!pendingBuffersToQueue_.empty()) { + FrameBuffer *pending = pendingBuffersToQueue_.front(); + + pendingBuffersToQueue_.pop(); + /* + * If the pending buffer enqueue fails, we must continue this + * function to completion for the dequeue operation. + */ + if (queueToDevice(pending)) + LOG(V4L2, Error) + << "Failed to re-queue pending buffer " + << pending; + } + if (queuedBuffers_.empty()) { fdBufferNotifier_->setEnabled(false); watchdog_.stop(); @@ -1911,6 +1812,168 @@ FrameBuffer *V4L2VideoDevice::dequeueBuffer() return buffer; } +/** + * \brief Queue a buffer to the video device if possible + * \param[in] buffer The buffer to be queued + * + * For capture video devices the \a buffer will be filled with data by the + * device. For output video devices the \a buffer shall contain valid data and + * will be processed by the device. Once the device has finished processing the + * buffer, it will be available for dequeue. + * + * The best available V4L2 buffer is picked for \a buffer using the V4L2 buffer + * cache. + * + * Note that queueToDevice() will fail if the device is in the process of being + * stopped from a streaming state through streamOff(). + * + * \return 0 on success or a negative error code otherwise + */ +int V4L2VideoDevice::queueToDevice(FrameBuffer *buffer) +{ + struct v4l2_plane v4l2Planes[VIDEO_MAX_PLANES] = {}; + struct v4l2_buffer buf = {}; + int ret; + + /* + * Pipeline handlers should not requeue buffers after releasing the + * buffers on the device. Any occurence of this error should be fixed + * in the pipeline handler directly. + */ + if (!cache_) { + LOG(V4L2, Fatal) << "No BufferCache available to queue."; + return -ENOENT; + } + + ret = cache_->get(*buffer); + if (ret < 0) + return ret; + + buf.index = ret; + buf.type = bufferType_; + buf.memory = memoryType_; + buf.field = V4L2_FIELD_NONE; + + bool multiPlanar = V4L2_TYPE_IS_MULTIPLANAR(buf.type); + const std::vector &planes = buffer->planes(); + const unsigned int numV4l2Planes = format_.planesCount; + + /* + * Ensure that the frame buffer has enough planes, and that they're + * contiguous if the V4L2 format requires them to be. + */ + if (planes.size() < numV4l2Planes) { + LOG(V4L2, Error) << "Frame buffer has too few planes"; + return -EINVAL; + } + + if (planes.size() != numV4l2Planes && !buffer->_d()->isContiguous()) { + LOG(V4L2, Error) << "Device format requires contiguous buffer"; + return -EINVAL; + } + + if (buf.memory == V4L2_MEMORY_DMABUF) { + if (multiPlanar) { + for (unsigned int p = 0; p < numV4l2Planes; ++p) + v4l2Planes[p].m.fd = planes[p].fd.get(); + } else { + buf.m.fd = planes[0].fd.get(); + } + } + + if (multiPlanar) { + buf.length = numV4l2Planes; + buf.m.planes = v4l2Planes; + } + + if (V4L2_TYPE_IS_OUTPUT(buf.type)) { + const FrameMetadata &metadata = buffer->metadata(); + + for (const auto &plane : metadata.planes()) { + if (!plane.bytesused) + LOG(V4L2, Warning) << "byteused == 0 is deprecated"; + } + + if (numV4l2Planes != planes.size()) { + /* + * If we have a multi-planar buffer with a V4L2 + * single-planar format, coalesce all planes. The length + * and number of bytes used may only differ in the last + * plane as any other situation can't be represented. + */ + unsigned int bytesused = 0; + unsigned int length = 0; + + for (auto [i, plane] : utils::enumerate(planes)) { + bytesused += metadata.planes()[i].bytesused; + length += plane.length; + + if (i != planes.size() - 1 && bytesused != length) { + LOG(V4L2, Error) + << "Holes in multi-planar buffer not supported"; + return -EINVAL; + } + } + + if (multiPlanar) { + v4l2Planes[0].bytesused = bytesused; + v4l2Planes[0].length = length; + } else { + buf.bytesused = bytesused; + buf.length = length; + } + } else if (multiPlanar) { + /* + * If we use the multi-planar API, fill in the planes. + * The number of planes in the frame buffer and in the + * V4L2 buffer is guaranteed to be equal at this point. + */ + for (auto [i, plane] : utils::enumerate(planes)) { + v4l2Planes[i].bytesused = metadata.planes()[i].bytesused; + v4l2Planes[i].length = plane.length; + } + } else { + /* + * Single-planar API with a single plane in the buffer + * is trivial to handle. + */ + buf.bytesused = metadata.planes()[0].bytesused; + buf.length = planes[0].length; + } + + /* + * Timestamps are to be supplied if the device is a mem-to-mem + * device. The drivers will have V4L2_BUF_FLAG_TIMESTAMP_COPY + * set hence these timestamps will be copied from the output + * buffers to capture buffers. If the device is not mem-to-mem, + * there is no harm in setting the timestamps as they will be + * ignored (and over-written). + */ + buf.timestamp.tv_sec = metadata.timestamp / 1000000000; + buf.timestamp.tv_usec = (metadata.timestamp / 1000) % 1000000; + } + + LOG(V4L2, Debug) << "Queueing buffer " << buf.index; + + ret = ioctl(VIDIOC_QBUF, &buf); + if (ret < 0) { + LOG(V4L2, Error) + << "Failed to queue buffer " << buf.index << ": " + << strerror(-ret); + return ret; + } + + if (queuedBuffers_.empty()) { + fdBufferNotifier_->setEnabled(true); + if (watchdogDuration_) + watchdog_.start(std::chrono::duration_cast(watchdogDuration_)); + } + + queuedBuffers_[buf.index] = buffer; + + return 0; +} + /** * \var V4L2VideoDevice::bufferReady * \brief A Signal emitted when a framebuffer completes From 26a20d6e6c89fbcc61e5190ecea6708737ce3b5d Mon Sep 17 00:00:00 2001 From: Serge Schneider Date: Thu, 29 Aug 2024 16:03:19 +0100 Subject: [PATCH 18/46] RASPBERRYPI ONLY: Use meson from pip when generating orig tarball --- .github/workflows/gen_orig.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/gen_orig.yml b/.github/workflows/gen_orig.yml index cfc302a86..6c41dc47d 100644 --- a/.github/workflows/gen_orig.yml +++ b/.github/workflows/gen_orig.yml @@ -14,8 +14,9 @@ jobs: - name: Install dependencies run: | # Local cmake needs to be removed for pybind11 to be detected sudo rm -rf /usr/local/bin/cmake + pip3 install --user meson sudo apt-get update - sudo apt-get install -y meson pkgconf cmake libgtest-dev libyaml-dev python3 python3-dev pybind11-dev python3-jinja2 python3-ply python3-yaml + sudo apt-get install -y ninja-build pkgconf cmake libgtest-dev libyaml-dev python3 python3-dev pybind11-dev python3-jinja2 python3-ply python3-yaml - name: Check out repository code uses: actions/checkout@v4 with: From 02928ef1bbed0795987810711eb157a462cd0a87 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Mon, 9 Sep 2024 12:42:33 +0100 Subject: [PATCH 19/46] ipa: rpi: Use r-value references in the set()/setLocked() functions Use an r-value reference in set() and setLocked(), allowing more efficient metadata handling with std::forward and std::move if needed. Signed-off-by: Naushir Patuck --- src/ipa/rpi/controller/metadata.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ipa/rpi/controller/metadata.h b/src/ipa/rpi/controller/metadata.h index b4650d251..eda4b59bc 100644 --- a/src/ipa/rpi/controller/metadata.h +++ b/src/ipa/rpi/controller/metadata.h @@ -36,10 +36,10 @@ class LIBCAMERA_TSA_CAPABILITY("mutex") Metadata } template - void set(std::string const &tag, T const &value) + void set(std::string const &tag, T &&value) { std::scoped_lock lock(mutex_); - data_[tag] = value; + data_[tag] = std::forward(value); } template @@ -104,10 +104,10 @@ class LIBCAMERA_TSA_CAPABILITY("mutex") Metadata } template - void setLocked(std::string const &tag, T const &value) + void setLocked(std::string const &tag, T &&value) { /* Use this only if you're holding the lock yourself. */ - data_[tag] = value; + data_[tag] = std::forward(value); } /* From 31dc9858c494a21feb8ad93eb61095dbb1b330dd Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Mon, 9 Sep 2024 12:47:14 +0100 Subject: [PATCH 20/46] ipa: rpi: Add erase()/eraseLocked() to RPiController::Metadata These function erases a key/value pair from the metadata object. Signed-off-by: Naushir Patuck --- src/ipa/rpi/controller/metadata.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ipa/rpi/controller/metadata.h b/src/ipa/rpi/controller/metadata.h index eda4b59bc..62e54051f 100644 --- a/src/ipa/rpi/controller/metadata.h +++ b/src/ipa/rpi/controller/metadata.h @@ -90,6 +90,12 @@ class LIBCAMERA_TSA_CAPABILITY("mutex") Metadata data_.insert(other.data_.begin(), other.data_.end()); } + void erase(std::string const &tag) + { + std::scoped_lock lock(mutex_); + eraseLocked(tag); + } + template T *getLocked(std::string const &tag) { @@ -110,6 +116,14 @@ class LIBCAMERA_TSA_CAPABILITY("mutex") Metadata data_[tag] = std::forward(value); } + void eraseLocked(std::string const &tag) + { + auto it = data_.find(tag); + if (it == data_.end()) + return; + data_.erase(it); + } + /* * Note: use of (lowercase) lock and unlock means you can create scoped * locks with the standard lock classes. From e21d0a99d07bc084d7ae6e24e1b2e90e8b435816 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Mon, 9 Sep 2024 12:50:53 +0100 Subject: [PATCH 21/46] ipa: rpi: Add a HW property to determine if the data buffer is strided This property (cfeDataBufferStrided) indicates if the CSI-2 hardware writes to the embedded/metadata buffer directly, or if it treats the buffer like an image buffer and strides the metadata lines. Unicam write this buffer strided, while the PiSP Frontend writes to it directly. This information will be relevant to data parsers in the helpers where the data is structured in lines. Signed-off-by: Naushir Patuck --- src/ipa/rpi/controller/controller.cpp | 2 ++ src/ipa/rpi/controller/controller.h | 1 + 2 files changed, 3 insertions(+) diff --git a/src/ipa/rpi/controller/controller.cpp b/src/ipa/rpi/controller/controller.cpp index e0131018e..3bce88b92 100644 --- a/src/ipa/rpi/controller/controller.cpp +++ b/src/ipa/rpi/controller/controller.cpp @@ -39,6 +39,7 @@ static const std::map HardwareConfigMap .pipelineWidth = 13, .statsInline = false, .minPixelProcessingTime = 0s, + .cfeDataBufferStrided = true, } }, { @@ -71,6 +72,7 @@ static const std::map HardwareConfigMap * frames wider than ~16,000 pixels. */ .minPixelProcessingTime = 1.0us / 380, + .cfeDataBufferStrided = false, } }, }; diff --git a/src/ipa/rpi/controller/controller.h b/src/ipa/rpi/controller/controller.h index eff520bd6..64f93f414 100644 --- a/src/ipa/rpi/controller/controller.h +++ b/src/ipa/rpi/controller/controller.h @@ -49,6 +49,7 @@ class Controller unsigned int pipelineWidth; bool statsInline; libcamera::utils::Duration minPixelProcessingTime; + bool cfeDataBufferStrided; }; Controller(); From a401e828201682af4df17d03b4c094fbf87fc480 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Mon, 9 Sep 2024 13:30:26 +0100 Subject: [PATCH 22/46] controls: ipa: rpi: Add CNN controls Add the follwing RPi vendor controls to handle Convolutional Neural Network processing: CnnOutputTensor CnnOutputTensorInfo CnnEnableInputTensor CnnInputTensor CnnInputTensorInfo CnnKpiInfo These controls will be used to support the new Raspberry Pi AI Camera, using an IMX500 sensor with on-board neural network processing. Signed-off-by: Naushir Patuck --- src/ipa/rpi/controller/controller.h | 33 +++++++++ src/libcamera/control_ids_rpi.yaml | 107 ++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+) diff --git a/src/ipa/rpi/controller/controller.h b/src/ipa/rpi/controller/controller.h index 64f93f414..b0b1ce335 100644 --- a/src/ipa/rpi/controller/controller.h +++ b/src/ipa/rpi/controller/controller.h @@ -25,6 +25,39 @@ namespace RPiController { +/* + * The following structures are used to export the CNN input/output tensor information + * through the rpi::CnnOutputTensorInfo and rpi::CnnInputTensorInfo controls. + * Applications must cast the span to these structures exactly. + */ +static constexpr unsigned int NetworkNameLen = 64; +static constexpr unsigned int MaxNumTensors = 8; +static constexpr unsigned int MaxNumDimensions = 8; + +struct OutputTensorInfo { + uint32_t tensorDataNum; + uint32_t numDimensions; + uint16_t size[MaxNumDimensions]; +}; + +struct CnnOutputTensorInfo { + char networkName[NetworkNameLen]; + uint32_t numTensors; + OutputTensorInfo info[MaxNumTensors]; +}; + +struct CnnInputTensorInfo { + char networkName[NetworkNameLen]; + uint32_t width; + uint32_t height; + uint32_t numChannels; +}; + +struct CnnKpiInfo { + uint32_t dnnRuntime; + uint32_t dspRuntime; +}; + class Algorithm; typedef std::unique_ptr AlgorithmPtr; diff --git a/src/libcamera/control_ids_rpi.yaml b/src/libcamera/control_ids_rpi.yaml index 276213dc1..d62d16418 100644 --- a/src/libcamera/control_ids_rpi.yaml +++ b/src/libcamera/control_ids_rpi.yaml @@ -57,4 +57,111 @@ controls: \sa StatsOutputEnable + - CnnOutputTensor: + type: float + size: [n] + description: | + This control returns a span of floating point values that represent the + output tensors from a Convolutional Neural Network (CNN). The size and + format of this array of values is entirely dependent on the neural + network used, and further post-processing may need to be performed at + the application level to generate the final desired output. This control + is agnostic of the hardware or software used to generate the output + tensors. + + The structure of the span is described by the CnnOutputTensorInfo + control. + + \sa CnnOutputTensorInfo + + - CnnOutputTensorInfo: + type: uint8_t + size: [n] + description: | + This control returns the structure of the CnnOutputTensor. This structure + takes the following form: + + constexpr unsigned int NetworkNameLen = 64; + constexpr unsigned int MaxNumTensors = 8; + constexpr unsigned int MaxNumDimensions = 8; + + struct CnnOutputTensorInfo { + char networkName[NetworkNameLen]; + uint32_t numTensors; + OutputTensorInfo info[MaxNumTensors]; + }; + + with + + struct OutputTensorInfo { + uint32_t tensorDataNum; + uint32_t numDimensions; + uint16_t size[MaxNumDimensions]; + }; + + networkName is the name of the CNN used, + numTensors is the number of output tensors returned, + tensorDataNum gives the number of elements in each output tensor, + numDimensions gives the dimensionality of each output tensor, + size gives the size of each dimension in each output tensor. + + \sa CnnOutputTensor + + - CnnEnableInputTensor: + type: bool + description: | + Boolean to control if the IPA returns the input tensor used by the CNN + to generate the output tensors via the CnnInputTensor control. Because + the input tensor may be relatively large, for efficiency reason avoid + enabling input tensor output unless required for debugging purposes. + + \sa CnnInputTensor + + - CnnInputTensor: + type: uint8_t + size: [n] + description: | + This control returns a span of uint8_t pixel values that represent the + input tensor for a Convolutional Neural Network (CNN). The size and + format of this array of values is entirely dependent on the neural + network used, and further post-processing (e.g. pixel normalisations) may + need to be performed at the application level to generate the final input + image. + + The structure of the span is described by the CnnInputTensorInfo + control. + + \sa CnnInputTensorInfo + + - CnnInputTensorInfo: + type: uint8_t + size: [n] + description: | + This control returns the structure of the CnnInputTensor. This structure + takes the following form: + + constexpr unsigned int NetworkNameLen = 64; + + struct CnnInputTensorInfo { + char networkName[NetworkNameLen]; + uint32_t width; + uint32_t height; + uint32_t numChannels; + }; + + where + + networkName is the name of the CNN used, + width and height are the input tensor image width and height in pixels, + numChannels is the number of channels in the input tensor image. + + \sa CnnInputTensor + + - CnnKpiInfo: + type: int32_t + size: [2] + description: | + This control returns performance metrics for the CNN processing stage. + Two values are returned in this span, the runtime of the CNN/DNN stage + and the DSP stage in milliseconds. ... From dc7c297ef13a016222afd77c5ac400b0a5960db0 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Mon, 9 Sep 2024 13:37:07 +0100 Subject: [PATCH 23/46] ipa: rpi: Handle the new CNN controls in the IPA Add code to handle the new CNN vendor controls in the Raspberry Pi IPA. The value of CnnInputTensorInfo is cached as it is the only stateful input control. All other controls are output controls, and the values are copied into directly from the rpiMetadata object if present. The camera helpers populate the rpiMetadata object if the sensor supports on-board CNN processing, such as the IMX500. Signed-off-by: Naushir Patuck --- src/ipa/rpi/common/ipa_base.cpp | 52 ++++++++++++++++++++++++++++++++- src/ipa/rpi/common/ipa_base.h | 2 ++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp index 463f6d384..e7ed560b9 100644 --- a/src/ipa/rpi/common/ipa_base.cpp +++ b/src/ipa/rpi/common/ipa_base.cpp @@ -75,6 +75,7 @@ const ControlInfoMap::Map ipaControls{ { &controls::FrameDurationLimits, ControlInfo(INT64_C(33333), INT64_C(120000)) }, { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) }, { &controls::rpi::StatsOutputEnable, ControlInfo(false, true, false) }, + { &controls::rpi::CnnEnableInputTensor, ControlInfo(false, true, false) }, }; /* IPA controls handled conditionally, if the sensor is not mono */ @@ -106,7 +107,7 @@ namespace ipa::RPi { IpaBase::IpaBase() : controller_(), frameLengths_(FrameLengthsQueueSize, 0s), statsMetadataOutput_(false), stitchSwapBuffers_(false), frameCount_(0), mistrustCount_(0), lastRunTimestamp_(0), - firstStart_(true), flickerState_({ 0, 0s }) + firstStart_(true), flickerState_({ 0, 0s }), cnnEnableInputTensor_(false) { } @@ -1249,6 +1250,10 @@ void IpaBase::applyControls(const ControlList &controls) statsMetadataOutput_ = ctrl.second.get(); break; + case controls::rpi::CNN_ENABLE_INPUT_TENSOR: + cnnEnableInputTensor_ = ctrl.second.get(); + break; + default: LOG(IPARPI, Warning) << "Ctrl " << controls::controls.at(ctrl.first)->name() @@ -1425,6 +1430,51 @@ void IpaBase::reportMetadata(unsigned int ipaContext) libcameraMetadata_.set(controls::HdrChannel, controls::HdrChannelNone); } + const std::shared_ptr *inputTensor = + rpiMetadata.getLocked>("cnn.input_tensor"); + if (cnnEnableInputTensor_ && inputTensor) { + unsigned int size = *rpiMetadata.getLocked("cnn.input_tensor_size"); + Span tensor{ inputTensor->get(), size }; + libcameraMetadata_.set(controls::rpi::CnnInputTensor, tensor); + /* No need to keep these big buffers any more. */ + rpiMetadata.eraseLocked("cnn.input_tensor"); + } + + const RPiController::CnnInputTensorInfo *inputTensorInfo = + rpiMetadata.getLocked("cnn.input_tensor_info"); + if (inputTensorInfo) { + Span tensorInfo{ reinterpret_cast(inputTensorInfo), + sizeof(*inputTensorInfo) }; + libcameraMetadata_.set(controls::rpi::CnnInputTensorInfo, tensorInfo); + } + + const std::shared_ptr *outputTensor = + rpiMetadata.getLocked>("cnn.output_tensor"); + if (outputTensor) { + unsigned int size = *rpiMetadata.getLocked("cnn.output_tensor_size"); + Span tensor{ reinterpret_cast(outputTensor->get()), + size }; + libcameraMetadata_.set(controls::rpi::CnnOutputTensor, tensor); + /* No need to keep these big buffers any more. */ + rpiMetadata.eraseLocked("cnn.output_tensor"); + } + + const RPiController::CnnOutputTensorInfo *outputTensorInfo = + rpiMetadata.getLocked("cnn.output_tensor_info"); + if (outputTensorInfo) { + Span tensorInfo{ reinterpret_cast(outputTensorInfo), + sizeof(*outputTensorInfo) }; + libcameraMetadata_.set(controls::rpi::CnnOutputTensorInfo, tensorInfo); + } + + const RPiController::CnnKpiInfo *kpiInfo = + rpiMetadata.getLocked("cnn.kpi_info"); + if (kpiInfo) { + libcameraMetadata_.set(controls::rpi::CnnKpiInfo, + { static_cast(kpiInfo->dnnRuntime), + static_cast(kpiInfo->dspRuntime) }); + } + metadataReady.emit(libcameraMetadata_); } diff --git a/src/ipa/rpi/common/ipa_base.h b/src/ipa/rpi/common/ipa_base.h index 1a811beb3..a55ce7ca9 100644 --- a/src/ipa/rpi/common/ipa_base.h +++ b/src/ipa/rpi/common/ipa_base.h @@ -136,6 +136,8 @@ class IpaBase : public IPARPiInterface int32_t mode; utils::Duration manualPeriod; } flickerState_; + + bool cnnEnableInputTensor_; }; } /* namespace ipa::RPi */ From 549f80ada7941f64ad03f139e7cfadc7b1971629 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Mon, 9 Sep 2024 13:46:03 +0100 Subject: [PATCH 24/46] ipa: rpi: Provide the camera helper with the hardware configuration Add a CamHelper::setHwConfig() helper used by the IPA to set the hardware configuartion in use by the pipeline. This will be needed by the IMX500 camera helper in a future commit to determine if the metadata buffer is strided. Signed-off-by: Naushir Patuck --- src/ipa/rpi/cam_helper/cam_helper.cpp | 5 +++++ src/ipa/rpi/cam_helper/cam_helper.h | 2 ++ src/ipa/rpi/common/ipa_base.cpp | 1 + 3 files changed, 8 insertions(+) diff --git a/src/ipa/rpi/cam_helper/cam_helper.cpp b/src/ipa/rpi/cam_helper/cam_helper.cpp index ee5d011f1..e857fae8b 100644 --- a/src/ipa/rpi/cam_helper/cam_helper.cpp +++ b/src/ipa/rpi/cam_helper/cam_helper.cpp @@ -156,6 +156,11 @@ void CamHelper::setCameraMode(const CameraMode &mode) } } +void CamHelper::setHwConfig(const Controller::HardwareConfig &hwConfig) +{ + hwConfig_ = hwConfig; +} + void CamHelper::getDelays(int &exposureDelay, int &gainDelay, int &vblankDelay, int &hblankDelay) const { diff --git a/src/ipa/rpi/cam_helper/cam_helper.h b/src/ipa/rpi/cam_helper/cam_helper.h index 4a4ab5e68..fb7eb3202 100644 --- a/src/ipa/rpi/cam_helper/cam_helper.h +++ b/src/ipa/rpi/cam_helper/cam_helper.h @@ -76,6 +76,7 @@ class CamHelper CamHelper(std::unique_ptr parser, unsigned int frameIntegrationDiff); virtual ~CamHelper(); void setCameraMode(const CameraMode &mode); + void setHwConfig(const Controller::HardwareConfig &hwConfig); virtual void prepare(libcamera::Span buffer, Metadata &metadata); virtual void process(StatisticsPtr &stats, Metadata &metadata); @@ -108,6 +109,7 @@ class CamHelper std::unique_ptr parser_; CameraMode mode_; + Controller::HardwareConfig hwConfig_; private: /* diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp index e7ed560b9..44a9e5810 100644 --- a/src/ipa/rpi/common/ipa_base.cpp +++ b/src/ipa/rpi/common/ipa_base.cpp @@ -155,6 +155,7 @@ int32_t IpaBase::init(const IPASettings &settings, const InitParams ¶ms, Ini lensPresent_ = params.lensPresent; controller_.initialise(); + helper_->setHwConfig(controller_.getHardwareConfig()); /* Return the controls handled by the IPA */ ControlInfoMap::Map ctrlMap = ipaControls; From 7330f29b38b7fa32f753297b4d1c8ecbbfcf0df5 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Mon, 9 Sep 2024 13:56:37 +0100 Subject: [PATCH 25/46] ipa: rpi: Add support for the Sony IMX500 camera sensor Add a Sony IMX500 camera helper to the IPA. This also includes support for the on-chip CNN hardware accelerator and parsing of the neural network data stream returned in the metadata buffer. Add tuning files for both VC4 and PiSP platforms. Signed-off-by: Naushir Patuck --- src/ipa/rpi/cam_helper/cam_helper_imx500.cpp | 341 +++ .../apParams.flatbuffers_generated.h | 544 ++++ .../imx500_tensor_parser/flatbuffers/base.h | 379 +++ .../flatbuffers/code_generators.h | 203 ++ .../flatbuffers/flatbuffers.h | 2613 +++++++++++++++++ .../imx500_tensor_parser/flatbuffers/flatc.h | 96 + .../flatbuffers/flexbuffers.h | 1538 ++++++++++ .../imx500_tensor_parser/flatbuffers/grpc.h | 328 +++ .../imx500_tensor_parser/flatbuffers/hash.h | 127 + .../imx500_tensor_parser/flatbuffers/idl.h | 995 +++++++ .../flatbuffers/minireflect.h | 407 +++ .../flatbuffers/reflection.h | 477 +++ .../flatbuffers/reflection_generated.h | 1182 ++++++++ .../flatbuffers/registry.h | 127 + .../flatbuffers/stl_emulation.h | 275 ++ .../imx500_tensor_parser/flatbuffers/util.h | 654 +++++ .../imx500_tensor_parser.cpp | 753 +++++ .../imx500_tensor_parser.h | 63 + .../imx500_tensor_parser/meson.build | 5 + src/ipa/rpi/cam_helper/meson.build | 3 + src/ipa/rpi/pisp/data/imx500.json | 1209 ++++++++ src/ipa/rpi/pisp/data/meson.build | 1 + src/ipa/rpi/vc4/data/imx500.json | 463 +++ src/ipa/rpi/vc4/data/meson.build | 1 + 24 files changed, 12784 insertions(+) create mode 100644 src/ipa/rpi/cam_helper/cam_helper_imx500.cpp create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/apParams.flatbuffers_generated.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/base.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/code_generators.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flatbuffers.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flatc.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flexbuffers.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/grpc.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/hash.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/idl.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/minireflect.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/reflection.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/reflection_generated.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/registry.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/stl_emulation.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/util.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.cpp create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.h create mode 100644 src/ipa/rpi/cam_helper/imx500_tensor_parser/meson.build create mode 100644 src/ipa/rpi/pisp/data/imx500.json create mode 100644 src/ipa/rpi/vc4/data/imx500.json diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx500.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx500.cpp new file mode 100644 index 000000000..01ab6367a --- /dev/null +++ b/src/ipa/rpi/cam_helper/cam_helper_imx500.cpp @@ -0,0 +1,341 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2024, Raspberry Pi Ltd + * + * cam_helper_imx500.cpp - camera helper for imx500 sensor + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include "imx500_tensor_parser/imx500_tensor_parser.h" + +#include "cam_helper.h" +#include "md_parser.h" + +using namespace RPiController; +using namespace libcamera; +using libcamera::utils::Duration; + +namespace libcamera { +LOG_DECLARE_CATEGORY(IPARPI) +} + +/* + * We care about two gain registers and a pair of exposure registers. Their + * I2C addresses from the Sony IMX500 datasheet: + */ +constexpr uint32_t expHiReg = 0x0202; +constexpr uint32_t expLoReg = 0x0203; +constexpr uint32_t gainHiReg = 0x0204; +constexpr uint32_t gainLoReg = 0x0205; +constexpr uint32_t frameLengthHiReg = 0x0340; +constexpr uint32_t frameLengthLoReg = 0x0341; +constexpr uint32_t lineLengthHiReg = 0x0342; +constexpr uint32_t lineLengthLoReg = 0x0343; +constexpr uint32_t temperatureReg = 0x013a; +constexpr std::initializer_list registerList = { expHiReg, expLoReg, gainHiReg, gainLoReg, frameLengthHiReg, frameLengthLoReg, + lineLengthHiReg, lineLengthLoReg, temperatureReg }; + +class CamHelperImx500 : public CamHelper +{ +public: + CamHelperImx500(); + uint32_t gainCode(double gain) const override; + double gain(uint32_t gainCode) const override; + void prepare(libcamera::Span buffer, Metadata &metadata) override; + std::pair getBlanking(Duration &exposure, Duration minFrameDuration, + Duration maxFrameDuration) const override; + void getDelays(int &exposureDelay, int &gainDelay, + int &vblankDelay, int &hblankDelay) const override; + bool sensorEmbeddedDataPresent() const override; + +private: + /* + * Smallest difference between the frame length and integration time, + * in units of lines. + */ + static constexpr int frameIntegrationDiff = 22; + /* Maximum frame length allowable for long exposure calculations. */ + static constexpr int frameLengthMax = 0xffdc; + /* Largest long exposure scale factor given as a left shift on the frame length. */ + static constexpr int longExposureShiftMax = 7; + + void parseInferenceData(libcamera::Span buffer, Metadata &metadata); + void populateMetadata(const MdParser::RegisterMap ®isters, + Metadata &metadata) const override; + + std::unique_ptr savedInputTensor_; +}; + +CamHelperImx500::CamHelperImx500() + : CamHelper(std::make_unique(registerList), frameIntegrationDiff) +{ +} + +uint32_t CamHelperImx500::gainCode(double gain) const +{ + return static_cast(1024 - 1024 / gain); +} + +double CamHelperImx500::gain(uint32_t gainCode) const +{ + return 1024.0 / (1024 - gainCode); +} + +void CamHelperImx500::prepare(libcamera::Span buffer, Metadata &metadata) +{ + MdParser::RegisterMap registers; + DeviceStatus deviceStatus; + + if (metadata.get("device.status", deviceStatus)) { + LOG(IPARPI, Error) << "DeviceStatus not found from DelayedControls"; + return; + } + + parseEmbeddedData(buffer, metadata); + + /* + * The DeviceStatus struct is first populated with values obtained from + * DelayedControls. If this reports frame length is > frameLengthMax, + * it means we are using a long exposure mode. Since the long exposure + * scale factor is not returned back through embedded data, we must rely + * on the existing exposure lines and frame length values returned by + * DelayedControls. + * + * Otherwise, all values are updated with what is reported in the + * embedded data. + */ + if (deviceStatus.frameLength > frameLengthMax) { + DeviceStatus parsedDeviceStatus; + + metadata.get("device.status", parsedDeviceStatus); + parsedDeviceStatus.shutterSpeed = deviceStatus.shutterSpeed; + parsedDeviceStatus.frameLength = deviceStatus.frameLength; + metadata.set("device.status", parsedDeviceStatus); + + LOG(IPARPI, Debug) << "Metadata updated for long exposure: " + << parsedDeviceStatus; + } + + parseInferenceData(buffer, metadata); +} + +std::pair CamHelperImx500::getBlanking(Duration &exposure, + Duration minFrameDuration, + Duration maxFrameDuration) const +{ + uint32_t frameLength, exposureLines; + unsigned int shift = 0; + + auto [vblank, hblank] = CamHelper::getBlanking(exposure, minFrameDuration, + maxFrameDuration); + + frameLength = mode_.height + vblank; + Duration lineLength = hblankToLineLength(hblank); + + /* + * Check if the frame length calculated needs to be setup for long + * exposure mode. This will require us to use a long exposure scale + * factor provided by a shift operation in the sensor. + */ + while (frameLength > frameLengthMax) { + if (++shift > longExposureShiftMax) { + shift = longExposureShiftMax; + frameLength = frameLengthMax; + break; + } + frameLength >>= 1; + } + + if (shift) { + /* Account for any rounding in the scaled frame length value. */ + frameLength <<= shift; + exposureLines = CamHelperImx500::exposureLines(exposure, lineLength); + exposureLines = std::min(exposureLines, frameLength - frameIntegrationDiff); + exposure = CamHelperImx500::exposure(exposureLines, lineLength); + } + + return { frameLength - mode_.height, hblank }; +} + +void CamHelperImx500::getDelays(int &exposureDelay, int &gainDelay, + int &vblankDelay, int &hblankDelay) const +{ + exposureDelay = 2; + gainDelay = 2; + vblankDelay = 3; + hblankDelay = 3; +} + +bool CamHelperImx500::sensorEmbeddedDataPresent() const +{ + return true; +} + +void CamHelperImx500::parseInferenceData(libcamera::Span buffer, + Metadata &metadata) +{ + /* Inference data comes after 2 lines of embedded data. */ + constexpr unsigned int StartLine = 2; + size_t bytesPerLine = (mode_.width * mode_.bitdepth) >> 3; + if (hwConfig_.cfeDataBufferStrided) + bytesPerLine = (bytesPerLine + 15) & ~15; + + if (buffer.size() <= StartLine * bytesPerLine) + return; + + /* Check if an input tensor is needed - this is sticky! */ + bool enableInputTensor = false; + metadata.get("cnn.enable_input_tensor", enableInputTensor); + + /* Cache the DNN metadata for fast parsing. */ + unsigned int tensorBufferSize = buffer.size() - (StartLine * bytesPerLine); + std::unique_ptr cache = std::make_unique(tensorBufferSize); + memcpy(cache.get(), buffer.data() + StartLine * bytesPerLine, tensorBufferSize); + Span tensors(cache.get(), tensorBufferSize); + + std::unordered_map offsets = RPiController::imx500SplitTensors(tensors); + auto itIn = offsets.find(TensorType::InputTensor); + auto itOut = offsets.find(TensorType::OutputTensor); + + if (itIn != offsets.end() && itOut != offsets.end()) { + const unsigned int inputTensorOffset = itIn->second.offset; + const unsigned int outputTensorOffset = itOut->second.offset; + const unsigned int inputTensorSize = outputTensorOffset - inputTensorOffset; + Span inputTensor; + + if (itIn->second.valid) { + if (itOut->second.valid) { + /* Valid input and output tensor, get the span directly from the current cache. */ + inputTensor = Span(cache.get() + inputTensorOffset, + inputTensorSize); + } else { + /* + * Invalid output tensor with valid input tensor. + * This is likely because the DNN takes longer than + * a frame time to generate the output tensor. + * + * In such cases, we don't process the input tensor, + * but simply save it for when the next output + * tensor is valid. This way, we ensure that both + * valid input and output tensors are in lock-step. + */ + savedInputTensor_ = std::make_unique(inputTensorSize); + memcpy(savedInputTensor_.get(), cache.get() + inputTensorOffset, + inputTensorSize); + } + } else if (itOut->second.valid && savedInputTensor_) { + /* + * Invalid input tensor with valid output tensor. This is + * likely because the DNN takes longer than a frame time + * to generate the output tensor. + * + * In such cases, use the previously saved input tensor + * if possible. + */ + inputTensor = Span(savedInputTensor_.get(), inputTensorSize); + } + + if (inputTensor.size()) { + IMX500InputTensorInfo inputTensorInfo; + if (!imx500ParseInputTensor(inputTensorInfo, inputTensor)) { + CnnInputTensorInfo exported{}; + exported.width = inputTensorInfo.width; + exported.height = inputTensorInfo.height; + exported.numChannels = inputTensorInfo.channels; + strncpy(exported.networkName, inputTensorInfo.networkName.c_str(), + sizeof(exported.networkName)); + exported.networkName[sizeof(exported.networkName) - 1] = '\0'; + metadata.set("cnn.input_tensor_info", exported); + metadata.set("cnn.input_tensor", std::move(inputTensorInfo.data)); + metadata.set("cnn.input_tensor_size", inputTensorInfo.size); + } + + /* We can now safely clear the saved input tensor. */ + savedInputTensor_.reset(); + } + } + + if (itOut != offsets.end() && itOut->second.valid) { + unsigned int outputTensorOffset = itOut->second.offset; + Span outputTensor(cache.get() + outputTensorOffset, + tensorBufferSize - outputTensorOffset); + + IMX500OutputTensorInfo outputTensorInfo; + if (!imx500ParseOutputTensor(outputTensorInfo, outputTensor)) { + CnnOutputTensorInfo exported{}; + if (outputTensorInfo.numTensors < MaxNumTensors) { + exported.numTensors = outputTensorInfo.numTensors; + for (unsigned int i = 0; i < exported.numTensors; i++) { + exported.info[i].tensorDataNum = outputTensorInfo.tensorDataNum[i]; + exported.info[i].numDimensions = outputTensorInfo.numDimensions[i]; + for (unsigned int j = 0; j < exported.info[i].numDimensions; j++) + exported.info[i].size[j] = outputTensorInfo.vecDim[i][j].size; + } + } else { + LOG(IPARPI, Debug) + << "IMX500 output tensor info export failed, numTensors > MaxNumTensors"; + } + strncpy(exported.networkName, outputTensorInfo.networkName.c_str(), + sizeof(exported.networkName)); + exported.networkName[sizeof(exported.networkName) - 1] = '\0'; + metadata.set("cnn.output_tensor_info", exported); + metadata.set("cnn.output_tensor", std::move(outputTensorInfo.data)); + metadata.set("cnn.output_tensor_size", outputTensorInfo.totalSize); + + auto itKpi = offsets.find(TensorType::Kpi); + if (itKpi != offsets.end()) { + constexpr unsigned int DnnRuntimeOffset = 9; + constexpr unsigned int DspRuntimeOffset = 10; + CnnKpiInfo kpi; + + uint8_t *k = cache.get() + itKpi->second.offset; + kpi.dnnRuntime = k[4 * DnnRuntimeOffset + 3] << 24 | + k[4 * DnnRuntimeOffset + 2] << 16 | + k[4 * DnnRuntimeOffset + 1] << 8 | + k[4 * DnnRuntimeOffset]; + kpi.dspRuntime = k[4 * DspRuntimeOffset + 3] << 24 | + k[4 * DspRuntimeOffset + 2] << 16 | + k[4 * DspRuntimeOffset + 1] << 8 | + k[4 * DspRuntimeOffset]; + metadata.set("cnn.kpi_info", kpi); + } + } + } +} + +void CamHelperImx500::populateMetadata(const MdParser::RegisterMap ®isters, + Metadata &metadata) const +{ + DeviceStatus deviceStatus; + + deviceStatus.lineLength = lineLengthPckToDuration(registers.at(lineLengthHiReg) * 256 + + registers.at(lineLengthLoReg)); + deviceStatus.shutterSpeed = exposure(registers.at(expHiReg) * 256 + registers.at(expLoReg), + deviceStatus.lineLength); + deviceStatus.analogueGain = gain(registers.at(gainHiReg) * 256 + registers.at(gainLoReg)); + deviceStatus.frameLength = registers.at(frameLengthHiReg) * 256 + registers.at(frameLengthLoReg); + deviceStatus.sensorTemperature = std::clamp(registers.at(temperatureReg), -20, 80); + + metadata.set("device.status", deviceStatus); +} + +static CamHelper *create() +{ + return new CamHelperImx500(); +} + +static RegisterCamHelper reg_imx500("imx500", &create); diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/apParams.flatbuffers_generated.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/apParams.flatbuffers_generated.h new file mode 100644 index 000000000..9c356b152 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/apParams.flatbuffers_generated.h @@ -0,0 +1,544 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +#ifndef FLATBUFFERS_GENERATED_APPARAMSFLATBUFFERS_APPARAMS_FB_H_ +#define FLATBUFFERS_GENERATED_APPARAMSFLATBUFFERS_APPARAMS_FB_H_ + +#include "flatbuffers/flatbuffers.h" + +namespace apParams { +namespace fb { + +struct FBDimension; + +struct FBInputTensor; + +struct FBOutputTensor; + +struct FBNetwork; + +struct FBApParams; + +struct FBDimension FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ID = 4, + VT_SIZE = 6, + VT_SERIALIZATIONINDEX = 8, + VT_PADDING = 10 + }; + uint8_t id() const { + return GetField(VT_ID, 0); + } + uint16_t size() const { + return GetField(VT_SIZE, 0); + } + uint8_t serializationIndex() const { + return GetField(VT_SERIALIZATIONINDEX, 0); + } + uint8_t padding() const { + return GetField(VT_PADDING, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ID) && + VerifyField(verifier, VT_SIZE) && + VerifyField(verifier, VT_SERIALIZATIONINDEX) && + VerifyField(verifier, VT_PADDING) && + verifier.EndTable(); + } +}; + +struct FBDimensionBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_id(uint8_t id) { + fbb_.AddElement(FBDimension::VT_ID, id, 0); + } + void add_size(uint16_t size) { + fbb_.AddElement(FBDimension::VT_SIZE, size, 0); + } + void add_serializationIndex(uint8_t serializationIndex) { + fbb_.AddElement(FBDimension::VT_SERIALIZATIONINDEX, serializationIndex, 0); + } + void add_padding(uint8_t padding) { + fbb_.AddElement(FBDimension::VT_PADDING, padding, 0); + } + explicit FBDimensionBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + FBDimensionBuilder &operator=(const FBDimensionBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateFBDimension( + flatbuffers::FlatBufferBuilder &_fbb, + uint8_t id = 0, + uint16_t size = 0, + uint8_t serializationIndex = 0, + uint8_t padding = 0) { + FBDimensionBuilder builder_(_fbb); + builder_.add_size(size); + builder_.add_padding(padding); + builder_.add_serializationIndex(serializationIndex); + builder_.add_id(id); + return builder_.Finish(); +} + +struct FBInputTensor FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ID = 4, + VT_NAME = 6, + VT_NUMOFDIMENSIONS = 8, + VT_DIMENSIONS = 10, + VT_SHIFT = 12, + VT_SCALE = 14, + VT_FORMAT = 16 + }; + uint8_t id() const { + return GetField(VT_ID, 0); + } + const flatbuffers::String *name() const { + return GetPointer(VT_NAME); + } + uint8_t numOfDimensions() const { + return GetField(VT_NUMOFDIMENSIONS, 0); + } + const flatbuffers::Vector> *dimensions() const { + return GetPointer> *>(VT_DIMENSIONS); + } + uint16_t shift() const { + return GetField(VT_SHIFT, 0); + } + float scale() const { + return GetField(VT_SCALE, 0.0f); + } + uint8_t format() const { + return GetField(VT_FORMAT, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ID) && + VerifyOffset(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyField(verifier, VT_NUMOFDIMENSIONS) && + VerifyOffset(verifier, VT_DIMENSIONS) && + verifier.VerifyVector(dimensions()) && + verifier.VerifyVectorOfTables(dimensions()) && + VerifyField(verifier, VT_SHIFT) && + VerifyField(verifier, VT_SCALE) && + VerifyField(verifier, VT_FORMAT) && + verifier.EndTable(); + } +}; + +struct FBInputTensorBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_id(uint8_t id) { + fbb_.AddElement(FBInputTensor::VT_ID, id, 0); + } + void add_name(flatbuffers::Offset name) { + fbb_.AddOffset(FBInputTensor::VT_NAME, name); + } + void add_numOfDimensions(uint8_t numOfDimensions) { + fbb_.AddElement(FBInputTensor::VT_NUMOFDIMENSIONS, numOfDimensions, 0); + } + void add_dimensions(flatbuffers::Offset>> dimensions) { + fbb_.AddOffset(FBInputTensor::VT_DIMENSIONS, dimensions); + } + void add_shift(uint16_t shift) { + fbb_.AddElement(FBInputTensor::VT_SHIFT, shift, 0); + } + void add_scale(float scale) { + fbb_.AddElement(FBInputTensor::VT_SCALE, scale, 0.0f); + } + void add_format(uint8_t format) { + fbb_.AddElement(FBInputTensor::VT_FORMAT, format, 0); + } + explicit FBInputTensorBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + FBInputTensorBuilder &operator=(const FBInputTensorBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateFBInputTensor( + flatbuffers::FlatBufferBuilder &_fbb, + uint8_t id = 0, + flatbuffers::Offset name = 0, + uint8_t numOfDimensions = 0, + flatbuffers::Offset>> dimensions = 0, + uint16_t shift = 0, + float scale = 0.0f, + uint8_t format = 0) { + FBInputTensorBuilder builder_(_fbb); + builder_.add_scale(scale); + builder_.add_dimensions(dimensions); + builder_.add_name(name); + builder_.add_shift(shift); + builder_.add_format(format); + builder_.add_numOfDimensions(numOfDimensions); + builder_.add_id(id); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateFBInputTensorDirect( + flatbuffers::FlatBufferBuilder &_fbb, + uint8_t id = 0, + const char *name = nullptr, + uint8_t numOfDimensions = 0, + const std::vector> *dimensions = nullptr, + uint16_t shift = 0, + float scale = 0.0f, + uint8_t format = 0) { + auto name__ = name ? _fbb.CreateString(name) : 0; + auto dimensions__ = dimensions ? _fbb.CreateVector>(*dimensions) : 0; + return apParams::fb::CreateFBInputTensor( + _fbb, + id, + name__, + numOfDimensions, + dimensions__, + shift, + scale, + format); +} + +struct FBOutputTensor FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ID = 4, + VT_NAME = 6, + VT_NUMOFDIMENSIONS = 8, + VT_DIMENSIONS = 10, + VT_BITSPERELEMENT = 12, + VT_SHIFT = 14, + VT_SCALE = 16, + VT_FORMAT = 18 + }; + uint8_t id() const { + return GetField(VT_ID, 0); + } + const flatbuffers::String *name() const { + return GetPointer(VT_NAME); + } + uint8_t numOfDimensions() const { + return GetField(VT_NUMOFDIMENSIONS, 0); + } + const flatbuffers::Vector> *dimensions() const { + return GetPointer> *>(VT_DIMENSIONS); + } + uint8_t bitsPerElement() const { + return GetField(VT_BITSPERELEMENT, 0); + } + uint16_t shift() const { + return GetField(VT_SHIFT, 0); + } + float scale() const { + return GetField(VT_SCALE, 0.0f); + } + uint8_t format() const { + return GetField(VT_FORMAT, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ID) && + VerifyOffset(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyField(verifier, VT_NUMOFDIMENSIONS) && + VerifyOffset(verifier, VT_DIMENSIONS) && + verifier.VerifyVector(dimensions()) && + verifier.VerifyVectorOfTables(dimensions()) && + VerifyField(verifier, VT_BITSPERELEMENT) && + VerifyField(verifier, VT_SHIFT) && + VerifyField(verifier, VT_SCALE) && + VerifyField(verifier, VT_FORMAT) && + verifier.EndTable(); + } +}; + +struct FBOutputTensorBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_id(uint8_t id) { + fbb_.AddElement(FBOutputTensor::VT_ID, id, 0); + } + void add_name(flatbuffers::Offset name) { + fbb_.AddOffset(FBOutputTensor::VT_NAME, name); + } + void add_numOfDimensions(uint8_t numOfDimensions) { + fbb_.AddElement(FBOutputTensor::VT_NUMOFDIMENSIONS, numOfDimensions, 0); + } + void add_dimensions(flatbuffers::Offset>> dimensions) { + fbb_.AddOffset(FBOutputTensor::VT_DIMENSIONS, dimensions); + } + void add_bitsPerElement(uint8_t bitsPerElement) { + fbb_.AddElement(FBOutputTensor::VT_BITSPERELEMENT, bitsPerElement, 0); + } + void add_shift(uint16_t shift) { + fbb_.AddElement(FBOutputTensor::VT_SHIFT, shift, 0); + } + void add_scale(float scale) { + fbb_.AddElement(FBOutputTensor::VT_SCALE, scale, 0.0f); + } + void add_format(uint8_t format) { + fbb_.AddElement(FBOutputTensor::VT_FORMAT, format, 0); + } + explicit FBOutputTensorBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + FBOutputTensorBuilder &operator=(const FBOutputTensorBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateFBOutputTensor( + flatbuffers::FlatBufferBuilder &_fbb, + uint8_t id = 0, + flatbuffers::Offset name = 0, + uint8_t numOfDimensions = 0, + flatbuffers::Offset>> dimensions = 0, + uint8_t bitsPerElement = 0, + uint16_t shift = 0, + float scale = 0.0f, + uint8_t format = 0) { + FBOutputTensorBuilder builder_(_fbb); + builder_.add_scale(scale); + builder_.add_dimensions(dimensions); + builder_.add_name(name); + builder_.add_shift(shift); + builder_.add_format(format); + builder_.add_bitsPerElement(bitsPerElement); + builder_.add_numOfDimensions(numOfDimensions); + builder_.add_id(id); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateFBOutputTensorDirect( + flatbuffers::FlatBufferBuilder &_fbb, + uint8_t id = 0, + const char *name = nullptr, + uint8_t numOfDimensions = 0, + const std::vector> *dimensions = nullptr, + uint8_t bitsPerElement = 0, + uint16_t shift = 0, + float scale = 0.0f, + uint8_t format = 0) { + auto name__ = name ? _fbb.CreateString(name) : 0; + auto dimensions__ = dimensions ? _fbb.CreateVector>(*dimensions) : 0; + return apParams::fb::CreateFBOutputTensor( + _fbb, + id, + name__, + numOfDimensions, + dimensions__, + bitsPerElement, + shift, + scale, + format); +} + +struct FBNetwork FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ID = 4, + VT_NAME = 6, + VT_TYPE = 8, + VT_INPUTTENSORS = 10, + VT_OUTPUTTENSORS = 12 + }; + uint16_t id() const { + return GetField(VT_ID, 0); + } + const flatbuffers::String *name() const { + return GetPointer(VT_NAME); + } + const flatbuffers::String *type() const { + return GetPointer(VT_TYPE); + } + const flatbuffers::Vector> *inputTensors() const { + return GetPointer> *>(VT_INPUTTENSORS); + } + const flatbuffers::Vector> *outputTensors() const { + return GetPointer> *>(VT_OUTPUTTENSORS); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ID) && + VerifyOffset(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffset(verifier, VT_TYPE) && + verifier.VerifyString(type()) && + VerifyOffset(verifier, VT_INPUTTENSORS) && + verifier.VerifyVector(inputTensors()) && + verifier.VerifyVectorOfTables(inputTensors()) && + VerifyOffset(verifier, VT_OUTPUTTENSORS) && + verifier.VerifyVector(outputTensors()) && + verifier.VerifyVectorOfTables(outputTensors()) && + verifier.EndTable(); + } +}; + +struct FBNetworkBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_id(uint16_t id) { + fbb_.AddElement(FBNetwork::VT_ID, id, 0); + } + void add_name(flatbuffers::Offset name) { + fbb_.AddOffset(FBNetwork::VT_NAME, name); + } + void add_type(flatbuffers::Offset type) { + fbb_.AddOffset(FBNetwork::VT_TYPE, type); + } + void add_inputTensors(flatbuffers::Offset>> inputTensors) { + fbb_.AddOffset(FBNetwork::VT_INPUTTENSORS, inputTensors); + } + void add_outputTensors(flatbuffers::Offset>> outputTensors) { + fbb_.AddOffset(FBNetwork::VT_OUTPUTTENSORS, outputTensors); + } + explicit FBNetworkBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + FBNetworkBuilder &operator=(const FBNetworkBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateFBNetwork( + flatbuffers::FlatBufferBuilder &_fbb, + uint16_t id = 0, + flatbuffers::Offset name = 0, + flatbuffers::Offset type = 0, + flatbuffers::Offset>> inputTensors = 0, + flatbuffers::Offset>> outputTensors = 0) { + FBNetworkBuilder builder_(_fbb); + builder_.add_outputTensors(outputTensors); + builder_.add_inputTensors(inputTensors); + builder_.add_type(type); + builder_.add_name(name); + builder_.add_id(id); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateFBNetworkDirect( + flatbuffers::FlatBufferBuilder &_fbb, + uint16_t id = 0, + const char *name = nullptr, + const char *type = nullptr, + const std::vector> *inputTensors = nullptr, + const std::vector> *outputTensors = nullptr) { + auto name__ = name ? _fbb.CreateString(name) : 0; + auto type__ = type ? _fbb.CreateString(type) : 0; + auto inputTensors__ = inputTensors ? _fbb.CreateVector>(*inputTensors) : 0; + auto outputTensors__ = outputTensors ? _fbb.CreateVector>(*outputTensors) : 0; + return apParams::fb::CreateFBNetwork( + _fbb, + id, + name__, + type__, + inputTensors__, + outputTensors__); +} + +struct FBApParams FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NETWORKS = 4 + }; + const flatbuffers::Vector> *networks() const { + return GetPointer> *>(VT_NETWORKS); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_NETWORKS) && + verifier.VerifyVector(networks()) && + verifier.VerifyVectorOfTables(networks()) && + verifier.EndTable(); + } +}; + +struct FBApParamsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_networks(flatbuffers::Offset>> networks) { + fbb_.AddOffset(FBApParams::VT_NETWORKS, networks); + } + explicit FBApParamsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + FBApParamsBuilder &operator=(const FBApParamsBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateFBApParams( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset>> networks = 0) { + FBApParamsBuilder builder_(_fbb); + builder_.add_networks(networks); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateFBApParamsDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector> *networks = nullptr) { + auto networks__ = networks ? _fbb.CreateVector>(*networks) : 0; + return apParams::fb::CreateFBApParams( + _fbb, + networks__); +} + +inline const apParams::fb::FBApParams *GetFBApParams(const void *buf) { + return flatbuffers::GetRoot(buf); +} + +inline const apParams::fb::FBApParams *GetSizePrefixedFBApParams(const void *buf) { + return flatbuffers::GetSizePrefixedRoot(buf); +} + +inline bool VerifyFBApParamsBuffer( + flatbuffers::Verifier &verifier) { + return verifier.VerifyBuffer(nullptr); +} + +inline bool VerifySizePrefixedFBApParamsBuffer( + flatbuffers::Verifier &verifier) { + return verifier.VerifySizePrefixedBuffer(nullptr); +} + +inline void FinishFBApParamsBuffer( + flatbuffers::FlatBufferBuilder &fbb, + flatbuffers::Offset root) { + fbb.Finish(root); +} + +inline void FinishSizePrefixedFBApParamsBuffer( + flatbuffers::FlatBufferBuilder &fbb, + flatbuffers::Offset root) { + fbb.FinishSizePrefixed(root); +} + +} // namespace fb +} // namespace apParams + +#endif // FLATBUFFERS_GENERATED_APPARAMSFLATBUFFERS_APPARAMS_FB_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/base.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/base.h new file mode 100644 index 000000000..53244aa30 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/base.h @@ -0,0 +1,379 @@ +#ifndef FLATBUFFERS_BASE_H_ +#define FLATBUFFERS_BASE_H_ + +// clang-format off + +// If activate should be declared and included first. +#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && \ + defined(_MSC_VER) && defined(_DEBUG) + // The _CRTDBG_MAP_ALLOC inside will replace + // calloc/free (etc) to its debug version using #define directives. + #define _CRTDBG_MAP_ALLOC + #include + #include + // Replace operator new by trace-enabled version. + #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) + #define new DEBUG_NEW +#endif + +#if !defined(FLATBUFFERS_ASSERT) +#include +#define FLATBUFFERS_ASSERT assert +#elif defined(FLATBUFFERS_ASSERT_INCLUDE) +// Include file with forward declaration +#include FLATBUFFERS_ASSERT_INCLUDE +#endif + +#ifndef ARDUINO +#include +#endif + +#include +#include +#include + +#if defined(ARDUINO) && !defined(ARDUINOSTL_M_H) + #include +#else + #include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef _STLPORT_VERSION + #define FLATBUFFERS_CPP98_STL +#endif +#ifndef FLATBUFFERS_CPP98_STL + #include +#endif + +#include "stl_emulation.h" + +// Note the __clang__ check is needed, because clang presents itself +// as an older GNUC compiler (4.2). +// Clang 3.3 and later implement all of the ISO C++ 2011 standard. +// Clang 3.4 and later implement all of the ISO C++ 2014 standard. +// http://clang.llvm.org/cxx_status.html + +// Note the MSVC value '__cplusplus' may be incorrect: +// The '__cplusplus' predefined macro in the MSVC stuck at the value 199711L, +// indicating (erroneously!) that the compiler conformed to the C++98 Standard. +// This value should be correct starting from MSVC2017-15.7-Preview-3. +// The '__cplusplus' will be valid only if MSVC2017-15.7-P3 and the `/Zc:__cplusplus` switch is set. +// Workaround (for details see MSDN): +// Use the _MSC_VER and _MSVC_LANG definition instead of the __cplusplus for compatibility. +// The _MSVC_LANG macro reports the Standard version regardless of the '/Zc:__cplusplus' switch. + +#if defined(__GNUC__) && !defined(__clang__) + #define FLATBUFFERS_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#else + #define FLATBUFFERS_GCC 0 +#endif + +#if defined(__clang__) + #define FLATBUFFERS_CLANG (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) +#else + #define FLATBUFFERS_CLANG 0 +#endif + +/// @cond FLATBUFFERS_INTERNAL +#if __cplusplus <= 199711L && \ + (!defined(_MSC_VER) || _MSC_VER < 1600) && \ + (!defined(__GNUC__) || \ + (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40400)) + #error A C++11 compatible compiler with support for the auto typing is \ + required for FlatBuffers. + #error __cplusplus _MSC_VER __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ +#endif + +#if !defined(__clang__) && \ + defined(__GNUC__) && \ + (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40600) + // Backwards compatability for g++ 4.4, and 4.5 which don't have the nullptr + // and constexpr keywords. Note the __clang__ check is needed, because clang + // presents itself as an older GNUC compiler. + #ifndef nullptr_t + const class nullptr_t { + public: + template inline operator T*() const { return 0; } + private: + void operator&() const; + } nullptr = {}; + #endif + #ifndef constexpr + #define constexpr const + #endif +#endif + +// The wire format uses a little endian encoding (since that's efficient for +// the common platforms). +#if defined(__s390x__) + #define FLATBUFFERS_LITTLEENDIAN 0 +#endif // __s390x__ +#if !defined(FLATBUFFERS_LITTLEENDIAN) + #if defined(__GNUC__) || defined(__clang__) + #if (defined(__BIG_ENDIAN__) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) + #define FLATBUFFERS_LITTLEENDIAN 0 + #else + #define FLATBUFFERS_LITTLEENDIAN 1 + #endif // __BIG_ENDIAN__ + #elif defined(_MSC_VER) + #if defined(_M_PPC) + #define FLATBUFFERS_LITTLEENDIAN 0 + #else + #define FLATBUFFERS_LITTLEENDIAN 1 + #endif + #else + #error Unable to determine endianness, define FLATBUFFERS_LITTLEENDIAN. + #endif +#endif // !defined(FLATBUFFERS_LITTLEENDIAN) + +#define FLATBUFFERS_VERSION_MAJOR 1 +#define FLATBUFFERS_VERSION_MINOR 11 +#define FLATBUFFERS_VERSION_REVISION 0 +#define FLATBUFFERS_STRING_EXPAND(X) #X +#define FLATBUFFERS_STRING(X) FLATBUFFERS_STRING_EXPAND(X) + +#if (!defined(_MSC_VER) || _MSC_VER > 1600) && \ + (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 407)) || \ + defined(__clang__) + #define FLATBUFFERS_FINAL_CLASS final + #define FLATBUFFERS_OVERRIDE override + #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE : flatbuffers::voffset_t +#else + #define FLATBUFFERS_FINAL_CLASS + #define FLATBUFFERS_OVERRIDE + #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE +#endif + +#if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \ + (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \ + (defined(__cpp_constexpr) && __cpp_constexpr >= 200704) + #define FLATBUFFERS_CONSTEXPR constexpr +#else + #define FLATBUFFERS_CONSTEXPR const +#endif + +#if (defined(__cplusplus) && __cplusplus >= 201402L) || \ + (defined(__cpp_constexpr) && __cpp_constexpr >= 201304) + #define FLATBUFFERS_CONSTEXPR_CPP14 FLATBUFFERS_CONSTEXPR +#else + #define FLATBUFFERS_CONSTEXPR_CPP14 +#endif + +#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \ + (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190023026)) || \ + defined(__clang__) + #define FLATBUFFERS_NOEXCEPT noexcept +#else + #define FLATBUFFERS_NOEXCEPT +#endif + +// NOTE: the FLATBUFFERS_DELETE_FUNC macro may change the access mode to +// private, so be sure to put it at the end or reset access mode explicitly. +#if (!defined(_MSC_VER) || _MSC_FULL_VER >= 180020827) && \ + (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)) || \ + defined(__clang__) + #define FLATBUFFERS_DELETE_FUNC(func) func = delete; +#else + #define FLATBUFFERS_DELETE_FUNC(func) private: func; +#endif + +#ifndef FLATBUFFERS_HAS_STRING_VIEW + // Only provide flatbuffers::string_view if __has_include can be used + // to detect a header that provides an implementation + #if defined(__has_include) + // Check for std::string_view (in c++17) + #if __has_include() && (__cplusplus >= 201606 || _HAS_CXX17) + #include + namespace flatbuffers { + typedef std::string_view string_view; + } + #define FLATBUFFERS_HAS_STRING_VIEW 1 + // Check for std::experimental::string_view (in c++14, compiler-dependent) + #elif __has_include() && (__cplusplus >= 201411) + #include + namespace flatbuffers { + typedef std::experimental::string_view string_view; + } + #define FLATBUFFERS_HAS_STRING_VIEW 1 + #endif + #endif // __has_include +#endif // !FLATBUFFERS_HAS_STRING_VIEW + +#ifndef FLATBUFFERS_HAS_NEW_STRTOD + // Modern (C++11) strtod and strtof functions are available for use. + // 1) nan/inf strings as argument of strtod; + // 2) hex-float as argument of strtod/strtof. + #if (defined(_MSC_VER) && _MSC_VER >= 1900) || \ + (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || \ + (defined(__clang__)) + #define FLATBUFFERS_HAS_NEW_STRTOD 1 + #endif +#endif // !FLATBUFFERS_HAS_NEW_STRTOD + +#ifndef FLATBUFFERS_LOCALE_INDEPENDENT + // Enable locale independent functions {strtof_l, strtod_l,strtoll_l, strtoull_l}. + // They are part of the POSIX-2008 but not part of the C/C++ standard. + // GCC/Clang have definition (_XOPEN_SOURCE>=700) if POSIX-2008. + #if ((defined(_MSC_VER) && _MSC_VER >= 1800) || \ + (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE>=700))) + #define FLATBUFFERS_LOCALE_INDEPENDENT 1 + #else + #define FLATBUFFERS_LOCALE_INDEPENDENT 0 + #endif +#endif // !FLATBUFFERS_LOCALE_INDEPENDENT + +// Suppress Undefined Behavior Sanitizer (recoverable only). Usage: +// - __supress_ubsan__("undefined") +// - __supress_ubsan__("signed-integer-overflow") +#if defined(__clang__) + #define __supress_ubsan__(type) __attribute__((no_sanitize(type))) +#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409) + #define __supress_ubsan__(type) __attribute__((no_sanitize_undefined)) +#else + #define __supress_ubsan__(type) +#endif + +// This is constexpr function used for checking compile-time constants. +// Avoid `#pragma warning(disable: 4127) // C4127: expression is constant`. +template FLATBUFFERS_CONSTEXPR inline bool IsConstTrue(T t) { + return !!t; +} + +// Enable C++ attribute [[]] if std:c++17 or higher. +#if ((__cplusplus >= 201703L) \ + || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L))) + // All attributes unknown to an implementation are ignored without causing an error. + #define FLATBUFFERS_ATTRIBUTE(attr) [[attr]] + + #define FLATBUFFERS_FALLTHROUGH() [[fallthrough]] +#else + #define FLATBUFFERS_ATTRIBUTE(attr) + + #if FLATBUFFERS_CLANG >= 30800 + #define FLATBUFFERS_FALLTHROUGH() [[clang::fallthrough]] + #elif FLATBUFFERS_GCC >= 70300 + #define FLATBUFFERS_FALLTHROUGH() [[gnu::fallthrough]] + #else + #define FLATBUFFERS_FALLTHROUGH() + #endif +#endif + +/// @endcond + +/// @file +namespace flatbuffers { + +/// @cond FLATBUFFERS_INTERNAL +// Our default offset / size type, 32bit on purpose on 64bit systems. +// Also, using a consistent offset type maintains compatibility of serialized +// offset values between 32bit and 64bit systems. +typedef uint32_t uoffset_t; + +// Signed offsets for references that can go in both directions. +typedef int32_t soffset_t; + +// Offset/index used in v-tables, can be changed to uint8_t in +// format forks to save a bit of space if desired. +typedef uint16_t voffset_t; + +typedef uintmax_t largest_scalar_t; + +// In 32bits, this evaluates to 2GB - 1 +#define FLATBUFFERS_MAX_BUFFER_SIZE ((1ULL << (sizeof(soffset_t) * 8 - 1)) - 1) + +// We support aligning the contents of buffers up to this size. +#define FLATBUFFERS_MAX_ALIGNMENT 16 + +#if defined(_MSC_VER) + #pragma warning(push) + #pragma warning(disable: 4127) // C4127: conditional expression is constant +#endif + +template T EndianSwap(T t) { + #if defined(_MSC_VER) + #define FLATBUFFERS_BYTESWAP16 _byteswap_ushort + #define FLATBUFFERS_BYTESWAP32 _byteswap_ulong + #define FLATBUFFERS_BYTESWAP64 _byteswap_uint64 + #else + #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408 && !defined(__clang__) + // __builtin_bswap16 was missing prior to GCC 4.8. + #define FLATBUFFERS_BYTESWAP16(x) \ + static_cast(__builtin_bswap32(static_cast(x) << 16)) + #else + #define FLATBUFFERS_BYTESWAP16 __builtin_bswap16 + #endif + #define FLATBUFFERS_BYTESWAP32 __builtin_bswap32 + #define FLATBUFFERS_BYTESWAP64 __builtin_bswap64 + #endif + if (sizeof(T) == 1) { // Compile-time if-then's. + return t; + } else if (sizeof(T) == 2) { + union { T t; uint16_t i; } u; + u.t = t; + u.i = FLATBUFFERS_BYTESWAP16(u.i); + return u.t; + } else if (sizeof(T) == 4) { + union { T t; uint32_t i; } u; + u.t = t; + u.i = FLATBUFFERS_BYTESWAP32(u.i); + return u.t; + } else if (sizeof(T) == 8) { + union { T t; uint64_t i; } u; + u.t = t; + u.i = FLATBUFFERS_BYTESWAP64(u.i); + return u.t; + } else { + FLATBUFFERS_ASSERT(0); + } +} + +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + + +template T EndianScalar(T t) { + #if FLATBUFFERS_LITTLEENDIAN + return t; + #else + return EndianSwap(t); + #endif +} + +template +// UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. +__supress_ubsan__("alignment") +T ReadScalar(const void *p) { + return EndianScalar(*reinterpret_cast(p)); +} + +template +// UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. +__supress_ubsan__("alignment") +void WriteScalar(void *p, T t) { + *reinterpret_cast(p) = EndianScalar(t); +} + +template struct Offset; +template __supress_ubsan__("alignment") void WriteScalar(void *p, Offset t) { + *reinterpret_cast(p) = EndianScalar(t.o); +} + +// Computes how many bytes you'd have to pad to be able to write an +// "scalar_size" scalar if the buffer had grown to "buf_size" (downwards in +// memory). +inline size_t PaddingBytes(size_t buf_size, size_t scalar_size) { + return ((~buf_size) + 1) & (scalar_size - 1); +} + +} // namespace flatbuffers +#endif // FLATBUFFERS_BASE_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/code_generators.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/code_generators.h new file mode 100644 index 000000000..c2ed707ae --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/code_generators.h @@ -0,0 +1,203 @@ +/* + * Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_CODE_GENERATORS_H_ +#define FLATBUFFERS_CODE_GENERATORS_H_ + +#include +#include +#include "flatbuffers/idl.h" + +namespace flatbuffers { + +// Utility class to assist in generating code through use of text templates. +// +// Example code: +// CodeWriter code; +// code.SetValue("NAME", "Foo"); +// code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }"; +// code.SetValue("NAME", "Bar"); +// code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }"; +// std::cout << code.ToString() << std::endl; +// +// Output: +// void Foo() { printf("%s", "Foo"); } +// void Bar() { printf("%s", "Bar"); } +class CodeWriter { + public: + CodeWriter() {} + + // Clears the current "written" code. + void Clear() { + stream_.str(""); + stream_.clear(); + } + + // Associates a key with a value. All subsequent calls to operator+=, where + // the specified key is contained in {{ and }} delimiters will be replaced by + // the given value. + void SetValue(const std::string &key, const std::string &value) { + value_map_[key] = value; + } + + // Appends the given text to the generated code as well as a newline + // character. Any text within {{ and }} delimeters is replaced by values + // previously stored in the CodeWriter by calling SetValue above. The newline + // will be suppressed if the text ends with the \\ character. + void operator+=(std::string text); + + // Returns the current contents of the CodeWriter as a std::string. + std::string ToString() const { return stream_.str(); } + + private: + std::map value_map_; + std::stringstream stream_; +}; + +class BaseGenerator { + public: + virtual bool generate() = 0; + + static std::string NamespaceDir(const Parser &parser, const std::string &path, + const Namespace &ns); + + protected: + BaseGenerator(const Parser &parser, const std::string &path, + const std::string &file_name, + const std::string qualifying_start, + const std::string qualifying_separator) + : parser_(parser), + path_(path), + file_name_(file_name), + qualifying_start_(qualifying_start), + qualifying_separator_(qualifying_separator) {} + virtual ~BaseGenerator() {} + + // No copy/assign. + BaseGenerator &operator=(const BaseGenerator &); + BaseGenerator(const BaseGenerator &); + + std::string NamespaceDir(const Namespace &ns) const; + + static const char *FlatBuffersGeneratedWarning(); + + static std::string FullNamespace(const char *separator, const Namespace &ns); + + static std::string LastNamespacePart(const Namespace &ns); + + // tracks the current namespace for early exit in WrapInNameSpace + // c++, java and csharp returns a different namespace from + // the following default (no early exit, always fully qualify), + // which works for js and php + virtual const Namespace *CurrentNameSpace() const { return nullptr; } + + // Ensure that a type is prefixed with its namespace whenever it is used + // outside of its namespace. + std::string WrapInNameSpace(const Namespace *ns, + const std::string &name) const; + + std::string WrapInNameSpace(const Definition &def) const; + + std::string GetNameSpace(const Definition &def) const; + + const Parser &parser_; + const std::string &path_; + const std::string &file_name_; + const std::string qualifying_start_; + const std::string qualifying_separator_; +}; + +struct CommentConfig { + const char *first_line; + const char *content_line_prefix; + const char *last_line; +}; + +extern void GenComment(const std::vector &dc, + std::string *code_ptr, const CommentConfig *config, + const char *prefix = ""); + +class FloatConstantGenerator { + public: + virtual ~FloatConstantGenerator() {} + std::string GenFloatConstant(const FieldDef &field) const; + + private: + virtual std::string Value(double v, const std::string &src) const = 0; + virtual std::string Inf(double v) const = 0; + virtual std::string NaN(double v) const = 0; + + virtual std::string Value(float v, const std::string &src) const = 0; + virtual std::string Inf(float v) const = 0; + virtual std::string NaN(float v) const = 0; + + template + std::string GenFloatConstantImpl(const FieldDef &field) const; +}; + +class SimpleFloatConstantGenerator : public FloatConstantGenerator { + public: + SimpleFloatConstantGenerator(const char *nan_number, + const char *pos_inf_number, + const char *neg_inf_number); + + private: + std::string Value(double v, + const std::string &src) const FLATBUFFERS_OVERRIDE; + std::string Inf(double v) const FLATBUFFERS_OVERRIDE; + std::string NaN(double v) const FLATBUFFERS_OVERRIDE; + + std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE; + std::string Inf(float v) const FLATBUFFERS_OVERRIDE; + std::string NaN(float v) const FLATBUFFERS_OVERRIDE; + + const std::string nan_number_; + const std::string pos_inf_number_; + const std::string neg_inf_number_; +}; + +// C++, C#, Java like generator. +class TypedFloatConstantGenerator : public FloatConstantGenerator { + public: + TypedFloatConstantGenerator(const char *double_prefix, + const char *single_prefix, const char *nan_number, + const char *pos_inf_number, + const char *neg_inf_number = ""); + + private: + std::string Value(double v, + const std::string &src) const FLATBUFFERS_OVERRIDE; + std::string Inf(double v) const FLATBUFFERS_OVERRIDE; + + std::string NaN(double v) const FLATBUFFERS_OVERRIDE; + + std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE; + std::string Inf(float v) const FLATBUFFERS_OVERRIDE; + std::string NaN(float v) const FLATBUFFERS_OVERRIDE; + + std::string MakeNaN(const std::string &prefix) const; + std::string MakeInf(bool neg, const std::string &prefix) const; + + const std::string double_prefix_; + const std::string single_prefix_; + const std::string nan_number_; + const std::string pos_inf_number_; + const std::string neg_inf_number_; +}; + +} // namespace flatbuffers + +#endif // FLATBUFFERS_CODE_GENERATORS_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flatbuffers.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flatbuffers.h new file mode 100644 index 000000000..a373bc470 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flatbuffers.h @@ -0,0 +1,2613 @@ +/* + * Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_H_ +#define FLATBUFFERS_H_ + +#include "base.h" + +#if defined(FLATBUFFERS_NAN_DEFAULTS) +#include +#endif + +namespace flatbuffers { +// Generic 'operator==' with conditional specialisations. +template inline bool IsTheSameAs(T e, T def) { return e == def; } + +#if defined(FLATBUFFERS_NAN_DEFAULTS) && \ + (!defined(_MSC_VER) || _MSC_VER >= 1800) +// Like `operator==(e, def)` with weak NaN if T=(float|double). +template<> inline bool IsTheSameAs(float e, float def) { + return (e == def) || (std::isnan(def) && std::isnan(e)); +} +template<> inline bool IsTheSameAs(double e, double def) { + return (e == def) || (std::isnan(def) && std::isnan(e)); +} +#endif + +// Wrapper for uoffset_t to allow safe template specialization. +// Value is allowed to be 0 to indicate a null object (see e.g. AddOffset). +template struct Offset { + uoffset_t o; + Offset() : o(0) {} + Offset(uoffset_t _o) : o(_o) {} + Offset Union() const { return Offset(o); } + bool IsNull() const { return !o; } +}; + +inline void EndianCheck() { + int endiantest = 1; + // If this fails, see FLATBUFFERS_LITTLEENDIAN above. + FLATBUFFERS_ASSERT(*reinterpret_cast(&endiantest) == + FLATBUFFERS_LITTLEENDIAN); + (void)endiantest; +} + +template FLATBUFFERS_CONSTEXPR size_t AlignOf() { + // clang-format off + #ifdef _MSC_VER + return __alignof(T); + #else + #ifndef alignof + return __alignof__(T); + #else + return alignof(T); + #endif + #endif + // clang-format on +} + +// When we read serialized data from memory, in the case of most scalars, +// we want to just read T, but in the case of Offset, we want to actually +// perform the indirection and return a pointer. +// The template specialization below does just that. +// It is wrapped in a struct since function templates can't overload on the +// return type like this. +// The typedef is for the convenience of callers of this function +// (avoiding the need for a trailing return decltype) +template struct IndirectHelper { + typedef T return_type; + typedef T mutable_return_type; + static const size_t element_stride = sizeof(T); + static return_type Read(const uint8_t *p, uoffset_t i) { + return EndianScalar((reinterpret_cast(p))[i]); + } +}; +template struct IndirectHelper> { + typedef const T *return_type; + typedef T *mutable_return_type; + static const size_t element_stride = sizeof(uoffset_t); + static return_type Read(const uint8_t *p, uoffset_t i) { + p += i * sizeof(uoffset_t); + return reinterpret_cast(p + ReadScalar(p)); + } +}; +template struct IndirectHelper { + typedef const T *return_type; + typedef T *mutable_return_type; + static const size_t element_stride = sizeof(T); + static return_type Read(const uint8_t *p, uoffset_t i) { + return reinterpret_cast(p + i * sizeof(T)); + } +}; + +// An STL compatible iterator implementation for Vector below, effectively +// calling Get() for every element. +template struct VectorIterator { + typedef std::random_access_iterator_tag iterator_category; + typedef IT value_type; + typedef ptrdiff_t difference_type; + typedef IT *pointer; + typedef IT &reference; + + VectorIterator(const uint8_t *data, uoffset_t i) + : data_(data + IndirectHelper::element_stride * i) {} + VectorIterator(const VectorIterator &other) : data_(other.data_) {} + VectorIterator() : data_(nullptr) {} + + VectorIterator &operator=(const VectorIterator &other) { + data_ = other.data_; + return *this; + } + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + VectorIterator &operator=(VectorIterator &&other) { + data_ = other.data_; + return *this; + } + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + bool operator==(const VectorIterator &other) const { + return data_ == other.data_; + } + + bool operator<(const VectorIterator &other) const { + return data_ < other.data_; + } + + bool operator!=(const VectorIterator &other) const { + return data_ != other.data_; + } + + difference_type operator-(const VectorIterator &other) const { + return (data_ - other.data_) / IndirectHelper::element_stride; + } + + IT operator*() const { return IndirectHelper::Read(data_, 0); } + + IT operator->() const { return IndirectHelper::Read(data_, 0); } + + VectorIterator &operator++() { + data_ += IndirectHelper::element_stride; + return *this; + } + + VectorIterator operator++(int) { + VectorIterator temp(data_, 0); + data_ += IndirectHelper::element_stride; + return temp; + } + + VectorIterator operator+(const uoffset_t &offset) const { + return VectorIterator(data_ + offset * IndirectHelper::element_stride, + 0); + } + + VectorIterator &operator+=(const uoffset_t &offset) { + data_ += offset * IndirectHelper::element_stride; + return *this; + } + + VectorIterator &operator--() { + data_ -= IndirectHelper::element_stride; + return *this; + } + + VectorIterator operator--(int) { + VectorIterator temp(data_, 0); + data_ -= IndirectHelper::element_stride; + return temp; + } + + VectorIterator operator-(const uoffset_t &offset) const { + return VectorIterator(data_ - offset * IndirectHelper::element_stride, + 0); + } + + VectorIterator &operator-=(const uoffset_t &offset) { + data_ -= offset * IndirectHelper::element_stride; + return *this; + } + + private: + const uint8_t *data_; +}; + +template struct VectorReverseIterator : + public std::reverse_iterator { + + explicit VectorReverseIterator(Iterator iter) : iter_(iter) {} + + typename Iterator::value_type operator*() const { return *(iter_ - 1); } + + typename Iterator::value_type operator->() const { return *(iter_ - 1); } + + private: + Iterator iter_; +}; + +struct String; + +// This is used as a helper type for accessing vectors. +// Vector::data() assumes the vector elements start after the length field. +template class Vector { + public: + typedef VectorIterator::mutable_return_type> + iterator; + typedef VectorIterator::return_type> + const_iterator; + typedef VectorReverseIterator reverse_iterator; + typedef VectorReverseIterator const_reverse_iterator; + + uoffset_t size() const { return EndianScalar(length_); } + + // Deprecated: use size(). Here for backwards compatibility. + FLATBUFFERS_ATTRIBUTE(deprecated("use size() instead")) + uoffset_t Length() const { return size(); } + + typedef typename IndirectHelper::return_type return_type; + typedef typename IndirectHelper::mutable_return_type mutable_return_type; + + return_type Get(uoffset_t i) const { + FLATBUFFERS_ASSERT(i < size()); + return IndirectHelper::Read(Data(), i); + } + + return_type operator[](uoffset_t i) const { return Get(i); } + + // If this is a Vector of enums, T will be its storage type, not the enum + // type. This function makes it convenient to retrieve value with enum + // type E. + template E GetEnum(uoffset_t i) const { + return static_cast(Get(i)); + } + + // If this a vector of unions, this does the cast for you. There's no check + // to make sure this is the right type! + template const U *GetAs(uoffset_t i) const { + return reinterpret_cast(Get(i)); + } + + // If this a vector of unions, this does the cast for you. There's no check + // to make sure this is actually a string! + const String *GetAsString(uoffset_t i) const { + return reinterpret_cast(Get(i)); + } + + const void *GetStructFromOffset(size_t o) const { + return reinterpret_cast(Data() + o); + } + + iterator begin() { return iterator(Data(), 0); } + const_iterator begin() const { return const_iterator(Data(), 0); } + + iterator end() { return iterator(Data(), size()); } + const_iterator end() const { return const_iterator(Data(), size()); } + + reverse_iterator rbegin() { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + + reverse_iterator rend() { return reverse_iterator(end()); } + const_reverse_iterator rend() const { return const_reverse_iterator(end()); } + + const_iterator cbegin() const { return begin(); } + + const_iterator cend() const { return end(); } + + const_reverse_iterator crbegin() const { return rbegin(); } + + const_reverse_iterator crend() const { return rend(); } + + // Change elements if you have a non-const pointer to this object. + // Scalars only. See reflection.h, and the documentation. + void Mutate(uoffset_t i, const T &val) { + FLATBUFFERS_ASSERT(i < size()); + WriteScalar(data() + i, val); + } + + // Change an element of a vector of tables (or strings). + // "val" points to the new table/string, as you can obtain from + // e.g. reflection::AddFlatBuffer(). + void MutateOffset(uoffset_t i, const uint8_t *val) { + FLATBUFFERS_ASSERT(i < size()); + static_assert(sizeof(T) == sizeof(uoffset_t), "Unrelated types"); + WriteScalar(data() + i, + static_cast(val - (Data() + i * sizeof(uoffset_t)))); + } + + // Get a mutable pointer to tables/strings inside this vector. + mutable_return_type GetMutableObject(uoffset_t i) const { + FLATBUFFERS_ASSERT(i < size()); + return const_cast(IndirectHelper::Read(Data(), i)); + } + + // The raw data in little endian format. Use with care. + const uint8_t *Data() const { + return reinterpret_cast(&length_ + 1); + } + + uint8_t *Data() { return reinterpret_cast(&length_ + 1); } + + // Similarly, but typed, much like std::vector::data + const T *data() const { return reinterpret_cast(Data()); } + T *data() { return reinterpret_cast(Data()); } + + template return_type LookupByKey(K key) const { + void *search_result = std::bsearch( + &key, Data(), size(), IndirectHelper::element_stride, KeyCompare); + + if (!search_result) { + return nullptr; // Key not found. + } + + const uint8_t *element = reinterpret_cast(search_result); + + return IndirectHelper::Read(element, 0); + } + + protected: + // This class is only used to access pre-existing data. Don't ever + // try to construct these manually. + Vector(); + + uoffset_t length_; + + private: + // This class is a pointer. Copying will therefore create an invalid object. + // Private and unimplemented copy constructor. + Vector(const Vector &); + + template static int KeyCompare(const void *ap, const void *bp) { + const K *key = reinterpret_cast(ap); + const uint8_t *data = reinterpret_cast(bp); + auto table = IndirectHelper::Read(data, 0); + + // std::bsearch compares with the operands transposed, so we negate the + // result here. + return -table->KeyCompareWithValue(*key); + } +}; + +// Represent a vector much like the template above, but in this case we +// don't know what the element types are (used with reflection.h). +class VectorOfAny { + public: + uoffset_t size() const { return EndianScalar(length_); } + + const uint8_t *Data() const { + return reinterpret_cast(&length_ + 1); + } + uint8_t *Data() { return reinterpret_cast(&length_ + 1); } + + protected: + VectorOfAny(); + + uoffset_t length_; + + private: + VectorOfAny(const VectorOfAny &); +}; + +#ifndef FLATBUFFERS_CPP98_STL +template +Vector> *VectorCast(Vector> *ptr) { + static_assert(std::is_base_of::value, "Unrelated types"); + return reinterpret_cast> *>(ptr); +} + +template +const Vector> *VectorCast(const Vector> *ptr) { + static_assert(std::is_base_of::value, "Unrelated types"); + return reinterpret_cast> *>(ptr); +} +#endif + +// Convenient helper function to get the length of any vector, regardless +// of whether it is null or not (the field is not set). +template static inline size_t VectorLength(const Vector *v) { + return v ? v->size() : 0; +} + +// Lexicographically compare two strings (possibly containing nulls), and +// return true if the first is less than the second. +static inline bool StringLessThan(const char *a_data, uoffset_t a_size, + const char *b_data, uoffset_t b_size) { + const auto cmp = memcmp(a_data, b_data, (std::min)(a_size, b_size)); + return cmp == 0 ? a_size < b_size : cmp < 0; +} + +struct String : public Vector { + const char *c_str() const { return reinterpret_cast(Data()); } + std::string str() const { return std::string(c_str(), size()); } + + // clang-format off + #ifdef FLATBUFFERS_HAS_STRING_VIEW + flatbuffers::string_view string_view() const { + return flatbuffers::string_view(c_str(), size()); + } + #endif // FLATBUFFERS_HAS_STRING_VIEW + // clang-format on + + bool operator<(const String &o) const { + return StringLessThan(this->data(), this->size(), o.data(), o.size()); + } +}; + +// Convenience function to get std::string from a String returning an empty +// string on null pointer. +static inline std::string GetString(const String * str) { + return str ? str->str() : ""; +} + +// Convenience function to get char* from a String returning an empty string on +// null pointer. +static inline const char * GetCstring(const String * str) { + return str ? str->c_str() : ""; +} + +// Allocator interface. This is flatbuffers-specific and meant only for +// `vector_downward` usage. +class Allocator { + public: + virtual ~Allocator() {} + + // Allocate `size` bytes of memory. + virtual uint8_t *allocate(size_t size) = 0; + + // Deallocate `size` bytes of memory at `p` allocated by this allocator. + virtual void deallocate(uint8_t *p, size_t size) = 0; + + // Reallocate `new_size` bytes of memory, replacing the old region of size + // `old_size` at `p`. In contrast to a normal realloc, this grows downwards, + // and is intended specifcally for `vector_downward` use. + // `in_use_back` and `in_use_front` indicate how much of `old_size` is + // actually in use at each end, and needs to be copied. + virtual uint8_t *reallocate_downward(uint8_t *old_p, size_t old_size, + size_t new_size, size_t in_use_back, + size_t in_use_front) { + FLATBUFFERS_ASSERT(new_size > old_size); // vector_downward only grows + uint8_t *new_p = allocate(new_size); + memcpy_downward(old_p, old_size, new_p, new_size, in_use_back, + in_use_front); + deallocate(old_p, old_size); + return new_p; + } + + protected: + // Called by `reallocate_downward` to copy memory from `old_p` of `old_size` + // to `new_p` of `new_size`. Only memory of size `in_use_front` and + // `in_use_back` will be copied from the front and back of the old memory + // allocation. + void memcpy_downward(uint8_t *old_p, size_t old_size, + uint8_t *new_p, size_t new_size, + size_t in_use_back, size_t in_use_front) { + memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back, + in_use_back); + memcpy(new_p, old_p, in_use_front); + } +}; + +// DefaultAllocator uses new/delete to allocate memory regions +class DefaultAllocator : public Allocator { + public: + uint8_t *allocate(size_t size) FLATBUFFERS_OVERRIDE { + return new uint8_t[size]; + } + + void deallocate(uint8_t *p, size_t) FLATBUFFERS_OVERRIDE { + delete[] p; + } + + static void dealloc(void *p, size_t) { + delete[] static_cast(p); + } +}; + +// These functions allow for a null allocator to mean use the default allocator, +// as used by DetachedBuffer and vector_downward below. +// This is to avoid having a statically or dynamically allocated default +// allocator, or having to move it between the classes that may own it. +inline uint8_t *Allocate(Allocator *allocator, size_t size) { + return allocator ? allocator->allocate(size) + : DefaultAllocator().allocate(size); +} + +inline void Deallocate(Allocator *allocator, uint8_t *p, size_t size) { + if (allocator) allocator->deallocate(p, size); + else DefaultAllocator().deallocate(p, size); +} + +inline uint8_t *ReallocateDownward(Allocator *allocator, uint8_t *old_p, + size_t old_size, size_t new_size, + size_t in_use_back, size_t in_use_front) { + return allocator + ? allocator->reallocate_downward(old_p, old_size, new_size, + in_use_back, in_use_front) + : DefaultAllocator().reallocate_downward(old_p, old_size, new_size, + in_use_back, in_use_front); +} + +// DetachedBuffer is a finished flatbuffer memory region, detached from its +// builder. The original memory region and allocator are also stored so that +// the DetachedBuffer can manage the memory lifetime. +class DetachedBuffer { + public: + DetachedBuffer() + : allocator_(nullptr), + own_allocator_(false), + buf_(nullptr), + reserved_(0), + cur_(nullptr), + size_(0) {} + + DetachedBuffer(Allocator *allocator, bool own_allocator, uint8_t *buf, + size_t reserved, uint8_t *cur, size_t sz) + : allocator_(allocator), + own_allocator_(own_allocator), + buf_(buf), + reserved_(reserved), + cur_(cur), + size_(sz) {} + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + DetachedBuffer(DetachedBuffer &&other) + : allocator_(other.allocator_), + own_allocator_(other.own_allocator_), + buf_(other.buf_), + reserved_(other.reserved_), + cur_(other.cur_), + size_(other.size_) { + other.reset(); + } + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + DetachedBuffer &operator=(DetachedBuffer &&other) { + destroy(); + + allocator_ = other.allocator_; + own_allocator_ = other.own_allocator_; + buf_ = other.buf_; + reserved_ = other.reserved_; + cur_ = other.cur_; + size_ = other.size_; + + other.reset(); + + return *this; + } + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + ~DetachedBuffer() { destroy(); } + + const uint8_t *data() const { return cur_; } + + uint8_t *data() { return cur_; } + + size_t size() const { return size_; } + + // clang-format off + #if 0 // disabled for now due to the ordering of classes in this header + template + bool Verify() const { + Verifier verifier(data(), size()); + return verifier.Verify(nullptr); + } + + template + const T* GetRoot() const { + return flatbuffers::GetRoot(data()); + } + + template + T* GetRoot() { + return flatbuffers::GetRoot(data()); + } + #endif + // clang-format on + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + // These may change access mode, leave these at end of public section + FLATBUFFERS_DELETE_FUNC(DetachedBuffer(const DetachedBuffer &other)) + FLATBUFFERS_DELETE_FUNC( + DetachedBuffer &operator=(const DetachedBuffer &other)) + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + +protected: + Allocator *allocator_; + bool own_allocator_; + uint8_t *buf_; + size_t reserved_; + uint8_t *cur_; + size_t size_; + + inline void destroy() { + if (buf_) Deallocate(allocator_, buf_, reserved_); + if (own_allocator_ && allocator_) { delete allocator_; } + reset(); + } + + inline void reset() { + allocator_ = nullptr; + own_allocator_ = false; + buf_ = nullptr; + reserved_ = 0; + cur_ = nullptr; + size_ = 0; + } +}; + +// This is a minimal replication of std::vector functionality, +// except growing from higher to lower addresses. i.e push_back() inserts data +// in the lowest address in the vector. +// Since this vector leaves the lower part unused, we support a "scratch-pad" +// that can be stored there for temporary data, to share the allocated space. +// Essentially, this supports 2 std::vectors in a single buffer. +class vector_downward { + public: + explicit vector_downward(size_t initial_size, + Allocator *allocator, + bool own_allocator, + size_t buffer_minalign) + : allocator_(allocator), + own_allocator_(own_allocator), + initial_size_(initial_size), + buffer_minalign_(buffer_minalign), + reserved_(0), + buf_(nullptr), + cur_(nullptr), + scratch_(nullptr) {} + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + vector_downward(vector_downward &&other) + #else + vector_downward(vector_downward &other) + #endif // defined(FLATBUFFERS_CPP98_STL) + // clang-format on + : allocator_(other.allocator_), + own_allocator_(other.own_allocator_), + initial_size_(other.initial_size_), + buffer_minalign_(other.buffer_minalign_), + reserved_(other.reserved_), + buf_(other.buf_), + cur_(other.cur_), + scratch_(other.scratch_) { + // No change in other.allocator_ + // No change in other.initial_size_ + // No change in other.buffer_minalign_ + other.own_allocator_ = false; + other.reserved_ = 0; + other.buf_ = nullptr; + other.cur_ = nullptr; + other.scratch_ = nullptr; + } + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + vector_downward &operator=(vector_downward &&other) { + // Move construct a temporary and swap idiom + vector_downward temp(std::move(other)); + swap(temp); + return *this; + } + // clang-format off + #endif // defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + ~vector_downward() { + clear_buffer(); + clear_allocator(); + } + + void reset() { + clear_buffer(); + clear(); + } + + void clear() { + if (buf_) { + cur_ = buf_ + reserved_; + } else { + reserved_ = 0; + cur_ = nullptr; + } + clear_scratch(); + } + + void clear_scratch() { + scratch_ = buf_; + } + + void clear_allocator() { + if (own_allocator_ && allocator_) { delete allocator_; } + allocator_ = nullptr; + own_allocator_ = false; + } + + void clear_buffer() { + if (buf_) Deallocate(allocator_, buf_, reserved_); + buf_ = nullptr; + } + + // Relinquish the pointer to the caller. + uint8_t *release_raw(size_t &allocated_bytes, size_t &offset) { + auto *buf = buf_; + allocated_bytes = reserved_; + offset = static_cast(cur_ - buf_); + + // release_raw only relinquishes the buffer ownership. + // Does not deallocate or reset the allocator. Destructor will do that. + buf_ = nullptr; + clear(); + return buf; + } + + // Relinquish the pointer to the caller. + DetachedBuffer release() { + // allocator ownership (if any) is transferred to DetachedBuffer. + DetachedBuffer fb(allocator_, own_allocator_, buf_, reserved_, cur_, + size()); + if (own_allocator_) { + allocator_ = nullptr; + own_allocator_ = false; + } + buf_ = nullptr; + clear(); + return fb; + } + + size_t ensure_space(size_t len) { + FLATBUFFERS_ASSERT(cur_ >= scratch_ && scratch_ >= buf_); + if (len > static_cast(cur_ - scratch_)) { reallocate(len); } + // Beyond this, signed offsets may not have enough range: + // (FlatBuffers > 2GB not supported). + FLATBUFFERS_ASSERT(size() < FLATBUFFERS_MAX_BUFFER_SIZE); + return len; + } + + inline uint8_t *make_space(size_t len) { + size_t space = ensure_space(len); + cur_ -= space; + return cur_; + } + + // Returns nullptr if using the DefaultAllocator. + Allocator *get_custom_allocator() { return allocator_; } + + uoffset_t size() const { + return static_cast(reserved_ - (cur_ - buf_)); + } + + uoffset_t scratch_size() const { + return static_cast(scratch_ - buf_); + } + + size_t capacity() const { return reserved_; } + + uint8_t *data() const { + FLATBUFFERS_ASSERT(cur_); + return cur_; + } + + uint8_t *scratch_data() const { + FLATBUFFERS_ASSERT(buf_); + return buf_; + } + + uint8_t *scratch_end() const { + FLATBUFFERS_ASSERT(scratch_); + return scratch_; + } + + uint8_t *data_at(size_t offset) const { return buf_ + reserved_ - offset; } + + void push(const uint8_t *bytes, size_t num) { + memcpy(make_space(num), bytes, num); + } + + // Specialized version of push() that avoids memcpy call for small data. + template void push_small(const T &little_endian_t) { + make_space(sizeof(T)); + *reinterpret_cast(cur_) = little_endian_t; + } + + template void scratch_push_small(const T &t) { + ensure_space(sizeof(T)); + *reinterpret_cast(scratch_) = t; + scratch_ += sizeof(T); + } + + // fill() is most frequently called with small byte counts (<= 4), + // which is why we're using loops rather than calling memset. + void fill(size_t zero_pad_bytes) { + make_space(zero_pad_bytes); + for (size_t i = 0; i < zero_pad_bytes; i++) cur_[i] = 0; + } + + // Version for when we know the size is larger. + void fill_big(size_t zero_pad_bytes) { + memset(make_space(zero_pad_bytes), 0, zero_pad_bytes); + } + + void pop(size_t bytes_to_remove) { cur_ += bytes_to_remove; } + void scratch_pop(size_t bytes_to_remove) { scratch_ -= bytes_to_remove; } + + void swap(vector_downward &other) { + using std::swap; + swap(allocator_, other.allocator_); + swap(own_allocator_, other.own_allocator_); + swap(initial_size_, other.initial_size_); + swap(buffer_minalign_, other.buffer_minalign_); + swap(reserved_, other.reserved_); + swap(buf_, other.buf_); + swap(cur_, other.cur_); + swap(scratch_, other.scratch_); + } + + void swap_allocator(vector_downward &other) { + using std::swap; + swap(allocator_, other.allocator_); + swap(own_allocator_, other.own_allocator_); + } + + private: + // You shouldn't really be copying instances of this class. + FLATBUFFERS_DELETE_FUNC(vector_downward(const vector_downward &)) + FLATBUFFERS_DELETE_FUNC(vector_downward &operator=(const vector_downward &)) + + Allocator *allocator_; + bool own_allocator_; + size_t initial_size_; + size_t buffer_minalign_; + size_t reserved_; + uint8_t *buf_; + uint8_t *cur_; // Points at location between empty (below) and used (above). + uint8_t *scratch_; // Points to the end of the scratchpad in use. + + void reallocate(size_t len) { + auto old_reserved = reserved_; + auto old_size = size(); + auto old_scratch_size = scratch_size(); + reserved_ += (std::max)(len, + old_reserved ? old_reserved / 2 : initial_size_); + reserved_ = (reserved_ + buffer_minalign_ - 1) & ~(buffer_minalign_ - 1); + if (buf_) { + buf_ = ReallocateDownward(allocator_, buf_, old_reserved, reserved_, + old_size, old_scratch_size); + } else { + buf_ = Allocate(allocator_, reserved_); + } + cur_ = buf_ + reserved_ - old_size; + scratch_ = buf_ + old_scratch_size; + } +}; + +// Converts a Field ID to a virtual table offset. +inline voffset_t FieldIndexToOffset(voffset_t field_id) { + // Should correspond to what EndTable() below builds up. + const int fixed_fields = 2; // Vtable size and Object Size. + return static_cast((field_id + fixed_fields) * sizeof(voffset_t)); +} + +template +const T *data(const std::vector &v) { + return v.empty() ? nullptr : &v.front(); +} +template T *data(std::vector &v) { + return v.empty() ? nullptr : &v.front(); +} + +/// @endcond + +/// @addtogroup flatbuffers_cpp_api +/// @{ +/// @class FlatBufferBuilder +/// @brief Helper class to hold data needed in creation of a FlatBuffer. +/// To serialize data, you typically call one of the `Create*()` functions in +/// the generated code, which in turn call a sequence of `StartTable`/ +/// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/ +/// `CreateVector` functions. Do this is depth-first order to build up a tree to +/// the root. `Finish()` wraps up the buffer ready for transport. +class FlatBufferBuilder { + public: + /// @brief Default constructor for FlatBufferBuilder. + /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults + /// to `1024`. + /// @param[in] allocator An `Allocator` to use. If null will use + /// `DefaultAllocator`. + /// @param[in] own_allocator Whether the builder/vector should own the + /// allocator. Defaults to / `false`. + /// @param[in] buffer_minalign Force the buffer to be aligned to the given + /// minimum alignment upon reallocation. Only needed if you intend to store + /// types with custom alignment AND you wish to read the buffer in-place + /// directly after creation. + explicit FlatBufferBuilder(size_t initial_size = 1024, + Allocator *allocator = nullptr, + bool own_allocator = false, + size_t buffer_minalign = + AlignOf()) + : buf_(initial_size, allocator, own_allocator, buffer_minalign), + num_field_loc(0), + max_voffset_(0), + nested(false), + finished(false), + minalign_(1), + force_defaults_(false), + dedup_vtables_(true), + string_pool(nullptr) { + EndianCheck(); + } + + // clang-format off + /// @brief Move constructor for FlatBufferBuilder. + #if !defined(FLATBUFFERS_CPP98_STL) + FlatBufferBuilder(FlatBufferBuilder &&other) + #else + FlatBufferBuilder(FlatBufferBuilder &other) + #endif // #if !defined(FLATBUFFERS_CPP98_STL) + : buf_(1024, nullptr, false, AlignOf()), + num_field_loc(0), + max_voffset_(0), + nested(false), + finished(false), + minalign_(1), + force_defaults_(false), + dedup_vtables_(true), + string_pool(nullptr) { + EndianCheck(); + // Default construct and swap idiom. + // Lack of delegating constructors in vs2010 makes it more verbose than needed. + Swap(other); + } + // clang-format on + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + /// @brief Move assignment operator for FlatBufferBuilder. + FlatBufferBuilder &operator=(FlatBufferBuilder &&other) { + // Move construct a temporary and swap idiom + FlatBufferBuilder temp(std::move(other)); + Swap(temp); + return *this; + } + // clang-format off + #endif // defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + void Swap(FlatBufferBuilder &other) { + using std::swap; + buf_.swap(other.buf_); + swap(num_field_loc, other.num_field_loc); + swap(max_voffset_, other.max_voffset_); + swap(nested, other.nested); + swap(finished, other.finished); + swap(minalign_, other.minalign_); + swap(force_defaults_, other.force_defaults_); + swap(dedup_vtables_, other.dedup_vtables_); + swap(string_pool, other.string_pool); + } + + ~FlatBufferBuilder() { + if (string_pool) delete string_pool; + } + + void Reset() { + Clear(); // clear builder state + buf_.reset(); // deallocate buffer + } + + /// @brief Reset all the state in this FlatBufferBuilder so it can be reused + /// to construct another buffer. + void Clear() { + ClearOffsets(); + buf_.clear(); + nested = false; + finished = false; + minalign_ = 1; + if (string_pool) string_pool->clear(); + } + + /// @brief The current size of the serialized buffer, counting from the end. + /// @return Returns an `uoffset_t` with the current size of the buffer. + uoffset_t GetSize() const { return buf_.size(); } + + /// @brief Get the serialized buffer (after you call `Finish()`). + /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the + /// buffer. + uint8_t *GetBufferPointer() const { + Finished(); + return buf_.data(); + } + + /// @brief Get a pointer to an unfinished buffer. + /// @return Returns a `uint8_t` pointer to the unfinished buffer. + uint8_t *GetCurrentBufferPointer() const { return buf_.data(); } + + /// @brief Get the released pointer to the serialized buffer. + /// @warning Do NOT attempt to use this FlatBufferBuilder afterwards! + /// @return A `FlatBuffer` that owns the buffer and its allocator and + /// behaves similar to a `unique_ptr` with a deleter. + FLATBUFFERS_ATTRIBUTE(deprecated("use Release() instead")) DetachedBuffer + ReleaseBufferPointer() { + Finished(); + return buf_.release(); + } + + /// @brief Get the released DetachedBuffer. + /// @return A `DetachedBuffer` that owns the buffer and its allocator. + DetachedBuffer Release() { + Finished(); + return buf_.release(); + } + + /// @brief Get the released pointer to the serialized buffer. + /// @param The size of the memory block containing + /// the serialized `FlatBuffer`. + /// @param The offset from the released pointer where the finished + /// `FlatBuffer` starts. + /// @return A raw pointer to the start of the memory block containing + /// the serialized `FlatBuffer`. + /// @remark If the allocator is owned, it gets deleted when the destructor is called.. + uint8_t *ReleaseRaw(size_t &size, size_t &offset) { + Finished(); + return buf_.release_raw(size, offset); + } + + /// @brief get the minimum alignment this buffer needs to be accessed + /// properly. This is only known once all elements have been written (after + /// you call Finish()). You can use this information if you need to embed + /// a FlatBuffer in some other buffer, such that you can later read it + /// without first having to copy it into its own buffer. + size_t GetBufferMinAlignment() { + Finished(); + return minalign_; + } + + /// @cond FLATBUFFERS_INTERNAL + void Finished() const { + // If you get this assert, you're attempting to get access a buffer + // which hasn't been finished yet. Be sure to call + // FlatBufferBuilder::Finish with your root table. + // If you really need to access an unfinished buffer, call + // GetCurrentBufferPointer instead. + FLATBUFFERS_ASSERT(finished); + } + /// @endcond + + /// @brief In order to save space, fields that are set to their default value + /// don't get serialized into the buffer. + /// @param[in] bool fd When set to `true`, always serializes default values that are set. + /// Optional fields which are not set explicitly, will still not be serialized. + void ForceDefaults(bool fd) { force_defaults_ = fd; } + + /// @brief By default vtables are deduped in order to save space. + /// @param[in] bool dedup When set to `true`, dedup vtables. + void DedupVtables(bool dedup) { dedup_vtables_ = dedup; } + + /// @cond FLATBUFFERS_INTERNAL + void Pad(size_t num_bytes) { buf_.fill(num_bytes); } + + void TrackMinAlign(size_t elem_size) { + if (elem_size > minalign_) minalign_ = elem_size; + } + + void Align(size_t elem_size) { + TrackMinAlign(elem_size); + buf_.fill(PaddingBytes(buf_.size(), elem_size)); + } + + void PushFlatBuffer(const uint8_t *bytes, size_t size) { + PushBytes(bytes, size); + finished = true; + } + + void PushBytes(const uint8_t *bytes, size_t size) { buf_.push(bytes, size); } + + void PopBytes(size_t amount) { buf_.pop(amount); } + + template void AssertScalarT() { + // The code assumes power of 2 sizes and endian-swap-ability. + static_assert(flatbuffers::is_scalar::value, "T must be a scalar type"); + } + + // Write a single aligned scalar to the buffer + template uoffset_t PushElement(T element) { + AssertScalarT(); + T litle_endian_element = EndianScalar(element); + Align(sizeof(T)); + buf_.push_small(litle_endian_element); + return GetSize(); + } + + template uoffset_t PushElement(Offset off) { + // Special case for offsets: see ReferTo below. + return PushElement(ReferTo(off.o)); + } + + // When writing fields, we track where they are, so we can create correct + // vtables later. + void TrackField(voffset_t field, uoffset_t off) { + FieldLoc fl = { off, field }; + buf_.scratch_push_small(fl); + num_field_loc++; + max_voffset_ = (std::max)(max_voffset_, field); + } + + // Like PushElement, but additionally tracks the field this represents. + template void AddElement(voffset_t field, T e, T def) { + // We don't serialize values equal to the default. + if (IsTheSameAs(e, def) && !force_defaults_) return; + auto off = PushElement(e); + TrackField(field, off); + } + + template void AddOffset(voffset_t field, Offset off) { + if (off.IsNull()) return; // Don't store. + AddElement(field, ReferTo(off.o), static_cast(0)); + } + + template void AddStruct(voffset_t field, const T *structptr) { + if (!structptr) return; // Default, don't store. + Align(AlignOf()); + buf_.push_small(*structptr); + TrackField(field, GetSize()); + } + + void AddStructOffset(voffset_t field, uoffset_t off) { + TrackField(field, off); + } + + // Offsets initially are relative to the end of the buffer (downwards). + // This function converts them to be relative to the current location + // in the buffer (when stored here), pointing upwards. + uoffset_t ReferTo(uoffset_t off) { + // Align to ensure GetSize() below is correct. + Align(sizeof(uoffset_t)); + // Offset must refer to something already in buffer. + FLATBUFFERS_ASSERT(off && off <= GetSize()); + return GetSize() - off + static_cast(sizeof(uoffset_t)); + } + + void NotNested() { + // If you hit this, you're trying to construct a Table/Vector/String + // during the construction of its parent table (between the MyTableBuilder + // and table.Finish(). + // Move the creation of these sub-objects to above the MyTableBuilder to + // not get this assert. + // Ignoring this assert may appear to work in simple cases, but the reason + // it is here is that storing objects in-line may cause vtable offsets + // to not fit anymore. It also leads to vtable duplication. + FLATBUFFERS_ASSERT(!nested); + // If you hit this, fields were added outside the scope of a table. + FLATBUFFERS_ASSERT(!num_field_loc); + } + + // From generated code (or from the parser), we call StartTable/EndTable + // with a sequence of AddElement calls in between. + uoffset_t StartTable() { + NotNested(); + nested = true; + return GetSize(); + } + + // This finishes one serialized object by generating the vtable if it's a + // table, comparing it against existing vtables, and writing the + // resulting vtable offset. + uoffset_t EndTable(uoffset_t start) { + // If you get this assert, a corresponding StartTable wasn't called. + FLATBUFFERS_ASSERT(nested); + // Write the vtable offset, which is the start of any Table. + // We fill it's value later. + auto vtableoffsetloc = PushElement(0); + // Write a vtable, which consists entirely of voffset_t elements. + // It starts with the number of offsets, followed by a type id, followed + // by the offsets themselves. In reverse: + // Include space for the last offset and ensure empty tables have a + // minimum size. + max_voffset_ = + (std::max)(static_cast(max_voffset_ + sizeof(voffset_t)), + FieldIndexToOffset(0)); + buf_.fill_big(max_voffset_); + auto table_object_size = vtableoffsetloc - start; + // Vtable use 16bit offsets. + FLATBUFFERS_ASSERT(table_object_size < 0x10000); + WriteScalar(buf_.data() + sizeof(voffset_t), + static_cast(table_object_size)); + WriteScalar(buf_.data(), max_voffset_); + // Write the offsets into the table + for (auto it = buf_.scratch_end() - num_field_loc * sizeof(FieldLoc); + it < buf_.scratch_end(); it += sizeof(FieldLoc)) { + auto field_location = reinterpret_cast(it); + auto pos = static_cast(vtableoffsetloc - field_location->off); + // If this asserts, it means you've set a field twice. + FLATBUFFERS_ASSERT( + !ReadScalar(buf_.data() + field_location->id)); + WriteScalar(buf_.data() + field_location->id, pos); + } + ClearOffsets(); + auto vt1 = reinterpret_cast(buf_.data()); + auto vt1_size = ReadScalar(vt1); + auto vt_use = GetSize(); + // See if we already have generated a vtable with this exact same + // layout before. If so, make it point to the old one, remove this one. + if (dedup_vtables_) { + for (auto it = buf_.scratch_data(); it < buf_.scratch_end(); + it += sizeof(uoffset_t)) { + auto vt_offset_ptr = reinterpret_cast(it); + auto vt2 = reinterpret_cast(buf_.data_at(*vt_offset_ptr)); + auto vt2_size = *vt2; + if (vt1_size != vt2_size || 0 != memcmp(vt2, vt1, vt1_size)) continue; + vt_use = *vt_offset_ptr; + buf_.pop(GetSize() - vtableoffsetloc); + break; + } + } + // If this is a new vtable, remember it. + if (vt_use == GetSize()) { buf_.scratch_push_small(vt_use); } + // Fill the vtable offset we created above. + // The offset points from the beginning of the object to where the + // vtable is stored. + // Offsets default direction is downward in memory for future format + // flexibility (storing all vtables at the start of the file). + WriteScalar(buf_.data_at(vtableoffsetloc), + static_cast(vt_use) - + static_cast(vtableoffsetloc)); + + nested = false; + return vtableoffsetloc; + } + + FLATBUFFERS_ATTRIBUTE(deprecated("call the version above instead")) + uoffset_t EndTable(uoffset_t start, voffset_t /*numfields*/) { + return EndTable(start); + } + + // This checks a required field has been set in a given table that has + // just been constructed. + template void Required(Offset table, voffset_t field); + + uoffset_t StartStruct(size_t alignment) { + Align(alignment); + return GetSize(); + } + + uoffset_t EndStruct() { return GetSize(); } + + void ClearOffsets() { + buf_.scratch_pop(num_field_loc * sizeof(FieldLoc)); + num_field_loc = 0; + max_voffset_ = 0; + } + + // Aligns such that when "len" bytes are written, an object can be written + // after it with "alignment" without padding. + void PreAlign(size_t len, size_t alignment) { + TrackMinAlign(alignment); + buf_.fill(PaddingBytes(GetSize() + len, alignment)); + } + template void PreAlign(size_t len) { + AssertScalarT(); + PreAlign(len, sizeof(T)); + } + /// @endcond + + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const char pointer to the data to be stored as a string. + /// @param[in] len The number of bytes that should be stored from `str`. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateString(const char *str, size_t len) { + NotNested(); + PreAlign(len + 1); // Always 0-terminated. + buf_.fill(1); + PushBytes(reinterpret_cast(str), len); + PushElement(static_cast(len)); + return Offset(GetSize()); + } + + /// @brief Store a string in the buffer, which is null-terminated. + /// @param[in] str A const char pointer to a C-string to add to the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateString(const char *str) { + return CreateString(str, strlen(str)); + } + + /// @brief Store a string in the buffer, which is null-terminated. + /// @param[in] str A char pointer to a C-string to add to the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateString(char *str) { + return CreateString(str, strlen(str)); + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const reference to a std::string to store in the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateString(const std::string &str) { + return CreateString(str.c_str(), str.length()); + } + + // clang-format off + #ifdef FLATBUFFERS_HAS_STRING_VIEW + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const string_view to copy in to the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateString(flatbuffers::string_view str) { + return CreateString(str.data(), str.size()); + } + #endif // FLATBUFFERS_HAS_STRING_VIEW + // clang-format on + + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const pointer to a `String` struct to add to the buffer. + /// @return Returns the offset in the buffer where the string starts + Offset CreateString(const String *str) { + return str ? CreateString(str->c_str(), str->size()) : 0; + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const reference to a std::string like type with support + /// of T::c_str() and T::length() to store in the buffer. + /// @return Returns the offset in the buffer where the string starts. + template Offset CreateString(const T &str) { + return CreateString(str.c_str(), str.length()); + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// If a string with this exact contents has already been serialized before, + /// instead simply returns the offset of the existing string. + /// @param[in] str A const char pointer to the data to be stored as a string. + /// @param[in] len The number of bytes that should be stored from `str`. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateSharedString(const char *str, size_t len) { + if (!string_pool) + string_pool = new StringOffsetMap(StringOffsetCompare(buf_)); + auto size_before_string = buf_.size(); + // Must first serialize the string, since the set is all offsets into + // buffer. + auto off = CreateString(str, len); + auto it = string_pool->find(off); + // If it exists we reuse existing serialized data! + if (it != string_pool->end()) { + // We can remove the string we serialized. + buf_.pop(buf_.size() - size_before_string); + return *it; + } + // Record this string for future use. + string_pool->insert(off); + return off; + } + + /// @brief Store a string in the buffer, which null-terminated. + /// If a string with this exact contents has already been serialized before, + /// instead simply returns the offset of the existing string. + /// @param[in] str A const char pointer to a C-string to add to the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateSharedString(const char *str) { + return CreateSharedString(str, strlen(str)); + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// If a string with this exact contents has already been serialized before, + /// instead simply returns the offset of the existing string. + /// @param[in] str A const reference to a std::string to store in the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateSharedString(const std::string &str) { + return CreateSharedString(str.c_str(), str.length()); + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// If a string with this exact contents has already been serialized before, + /// instead simply returns the offset of the existing string. + /// @param[in] str A const pointer to a `String` struct to add to the buffer. + /// @return Returns the offset in the buffer where the string starts + Offset CreateSharedString(const String *str) { + return CreateSharedString(str->c_str(), str->size()); + } + + /// @cond FLATBUFFERS_INTERNAL + uoffset_t EndVector(size_t len) { + FLATBUFFERS_ASSERT(nested); // Hit if no corresponding StartVector. + nested = false; + return PushElement(static_cast(len)); + } + + void StartVector(size_t len, size_t elemsize) { + NotNested(); + nested = true; + PreAlign(len * elemsize); + PreAlign(len * elemsize, elemsize); // Just in case elemsize > uoffset_t. + } + + // Call this right before StartVector/CreateVector if you want to force the + // alignment to be something different than what the element size would + // normally dictate. + // This is useful when storing a nested_flatbuffer in a vector of bytes, + // or when storing SIMD floats, etc. + void ForceVectorAlignment(size_t len, size_t elemsize, size_t alignment) { + PreAlign(len * elemsize, alignment); + } + + // Similar to ForceVectorAlignment but for String fields. + void ForceStringAlignment(size_t len, size_t alignment) { + PreAlign((len + 1) * sizeof(char), alignment); + } + + /// @endcond + + /// @brief Serialize an array into a FlatBuffer `vector`. + /// @tparam T The data type of the array elements. + /// @param[in] v A pointer to the array of type `T` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template Offset> CreateVector(const T *v, size_t len) { + // If this assert hits, you're specifying a template argument that is + // causing the wrong overload to be selected, remove it. + AssertScalarT(); + StartVector(len, sizeof(T)); + // clang-format off + #if FLATBUFFERS_LITTLEENDIAN + PushBytes(reinterpret_cast(v), len * sizeof(T)); + #else + if (sizeof(T) == 1) { + PushBytes(reinterpret_cast(v), len); + } else { + for (auto i = len; i > 0; ) { + PushElement(v[--i]); + } + } + #endif + // clang-format on + return Offset>(EndVector(len)); + } + + template + Offset>> CreateVector(const Offset *v, size_t len) { + StartVector(len, sizeof(Offset)); + for (auto i = len; i > 0;) { PushElement(v[--i]); } + return Offset>>(EndVector(len)); + } + + /// @brief Serialize a `std::vector` into a FlatBuffer `vector`. + /// @tparam T The data type of the `std::vector` elements. + /// @param v A const reference to the `std::vector` to serialize into the + /// buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template Offset> CreateVector(const std::vector &v) { + return CreateVector(data(v), v.size()); + } + + // vector may be implemented using a bit-set, so we can't access it as + // an array. Instead, read elements manually. + // Background: https://isocpp.org/blog/2012/11/on-vectorbool + Offset> CreateVector(const std::vector &v) { + StartVector(v.size(), sizeof(uint8_t)); + for (auto i = v.size(); i > 0;) { + PushElement(static_cast(v[--i])); + } + return Offset>(EndVector(v.size())); + } + + // clang-format off + #ifndef FLATBUFFERS_CPP98_STL + /// @brief Serialize values returned by a function into a FlatBuffer `vector`. + /// This is a convenience function that takes care of iteration for you. + /// @tparam T The data type of the `std::vector` elements. + /// @param f A function that takes the current iteration 0..vector_size-1 and + /// returns any type that you can construct a FlatBuffers vector out of. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template Offset> CreateVector(size_t vector_size, + const std::function &f) { + std::vector elems(vector_size); + for (size_t i = 0; i < vector_size; i++) elems[i] = f(i); + return CreateVector(elems); + } + #endif + // clang-format on + + /// @brief Serialize values returned by a function into a FlatBuffer `vector`. + /// This is a convenience function that takes care of iteration for you. + /// @tparam T The data type of the `std::vector` elements. + /// @param f A function that takes the current iteration 0..vector_size-1, + /// and the state parameter returning any type that you can construct a + /// FlatBuffers vector out of. + /// @param state State passed to f. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset> CreateVector(size_t vector_size, F f, S *state) { + std::vector elems(vector_size); + for (size_t i = 0; i < vector_size; i++) elems[i] = f(i, state); + return CreateVector(elems); + } + + /// @brief Serialize a `std::vector` into a FlatBuffer `vector`. + /// This is a convenience function for a common case. + /// @param v A const reference to the `std::vector` to serialize into the + /// buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + Offset>> CreateVectorOfStrings( + const std::vector &v) { + std::vector> offsets(v.size()); + for (size_t i = 0; i < v.size(); i++) offsets[i] = CreateString(v[i]); + return CreateVector(offsets); + } + + /// @brief Serialize an array of structs into a FlatBuffer `vector`. + /// @tparam T The data type of the struct array elements. + /// @param[in] v A pointer to the array of type `T` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset> CreateVectorOfStructs(const T *v, size_t len) { + StartVector(len * sizeof(T) / AlignOf(), AlignOf()); + PushBytes(reinterpret_cast(v), sizeof(T) * len); + return Offset>(EndVector(len)); + } + + /// @brief Serialize an array of native structs into a FlatBuffer `vector`. + /// @tparam T The data type of the struct array elements. + /// @tparam S The data type of the native struct array elements. + /// @param[in] v A pointer to the array of type `S` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset> CreateVectorOfNativeStructs(const S *v, + size_t len) { + extern T Pack(const S &); + typedef T (*Pack_t)(const S &); + std::vector vv(len); + std::transform(v, v + len, vv.begin(), static_cast(Pack)); + return CreateVectorOfStructs(vv.data(), vv.size()); + } + + // clang-format off + #ifndef FLATBUFFERS_CPP98_STL + /// @brief Serialize an array of structs into a FlatBuffer `vector`. + /// @tparam T The data type of the struct array elements. + /// @param[in] f A function that takes the current iteration 0..vector_size-1 + /// and a pointer to the struct that must be filled. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + /// This is mostly useful when flatbuffers are generated with mutation + /// accessors. + template Offset> CreateVectorOfStructs( + size_t vector_size, const std::function &filler) { + T* structs = StartVectorOfStructs(vector_size); + for (size_t i = 0; i < vector_size; i++) { + filler(i, structs); + structs++; + } + return EndVectorOfStructs(vector_size); + } + #endif + // clang-format on + + /// @brief Serialize an array of structs into a FlatBuffer `vector`. + /// @tparam T The data type of the struct array elements. + /// @param[in] f A function that takes the current iteration 0..vector_size-1, + /// a pointer to the struct that must be filled and the state argument. + /// @param[in] state Arbitrary state to pass to f. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + /// This is mostly useful when flatbuffers are generated with mutation + /// accessors. + template + Offset> CreateVectorOfStructs(size_t vector_size, F f, + S *state) { + T *structs = StartVectorOfStructs(vector_size); + for (size_t i = 0; i < vector_size; i++) { + f(i, structs, state); + structs++; + } + return EndVectorOfStructs(vector_size); + } + + /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`. + /// @tparam T The data type of the `std::vector` struct elements. + /// @param[in]] v A const reference to the `std::vector` of structs to + /// serialize into the buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset> CreateVectorOfStructs( + const std::vector &v) { + return CreateVectorOfStructs(data(v), v.size()); + } + + /// @brief Serialize a `std::vector` of native structs into a FlatBuffer + /// `vector`. + /// @tparam T The data type of the `std::vector` struct elements. + /// @tparam S The data type of the `std::vector` native struct elements. + /// @param[in]] v A const reference to the `std::vector` of structs to + /// serialize into the buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset> CreateVectorOfNativeStructs( + const std::vector &v) { + return CreateVectorOfNativeStructs(data(v), v.size()); + } + + /// @cond FLATBUFFERS_INTERNAL + template struct StructKeyComparator { + bool operator()(const T &a, const T &b) const { + return a.KeyCompareLessThan(&b); + } + + private: + StructKeyComparator &operator=(const StructKeyComparator &); + }; + /// @endcond + + /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector` + /// in sorted order. + /// @tparam T The data type of the `std::vector` struct elements. + /// @param[in]] v A const reference to the `std::vector` of structs to + /// serialize into the buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset> CreateVectorOfSortedStructs(std::vector *v) { + return CreateVectorOfSortedStructs(data(*v), v->size()); + } + + /// @brief Serialize a `std::vector` of native structs into a FlatBuffer + /// `vector` in sorted order. + /// @tparam T The data type of the `std::vector` struct elements. + /// @tparam S The data type of the `std::vector` native struct elements. + /// @param[in]] v A const reference to the `std::vector` of structs to + /// serialize into the buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset> CreateVectorOfSortedNativeStructs( + std::vector *v) { + return CreateVectorOfSortedNativeStructs(data(*v), v->size()); + } + + /// @brief Serialize an array of structs into a FlatBuffer `vector` in sorted + /// order. + /// @tparam T The data type of the struct array elements. + /// @param[in] v A pointer to the array of type `T` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset> CreateVectorOfSortedStructs(T *v, size_t len) { + std::sort(v, v + len, StructKeyComparator()); + return CreateVectorOfStructs(v, len); + } + + /// @brief Serialize an array of native structs into a FlatBuffer `vector` in + /// sorted order. + /// @tparam T The data type of the struct array elements. + /// @tparam S The data type of the native struct array elements. + /// @param[in] v A pointer to the array of type `S` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset> CreateVectorOfSortedNativeStructs(S *v, + size_t len) { + extern T Pack(const S &); + typedef T (*Pack_t)(const S &); + std::vector vv(len); + std::transform(v, v + len, vv.begin(), static_cast(Pack)); + return CreateVectorOfSortedStructs(vv, len); + } + + /// @cond FLATBUFFERS_INTERNAL + template struct TableKeyComparator { + TableKeyComparator(vector_downward &buf) : buf_(buf) {} + bool operator()(const Offset &a, const Offset &b) const { + auto table_a = reinterpret_cast(buf_.data_at(a.o)); + auto table_b = reinterpret_cast(buf_.data_at(b.o)); + return table_a->KeyCompareLessThan(table_b); + } + vector_downward &buf_; + + private: + TableKeyComparator &operator=(const TableKeyComparator &); + }; + /// @endcond + + /// @brief Serialize an array of `table` offsets as a `vector` in the buffer + /// in sorted order. + /// @tparam T The data type that the offset refers to. + /// @param[in] v An array of type `Offset` that contains the `table` + /// offsets to store in the buffer in sorted order. + /// @param[in] len The number of elements to store in the `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset>> CreateVectorOfSortedTables(Offset *v, + size_t len) { + std::sort(v, v + len, TableKeyComparator(buf_)); + return CreateVector(v, len); + } + + /// @brief Serialize an array of `table` offsets as a `vector` in the buffer + /// in sorted order. + /// @tparam T The data type that the offset refers to. + /// @param[in] v An array of type `Offset` that contains the `table` + /// offsets to store in the buffer in sorted order. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset>> CreateVectorOfSortedTables( + std::vector> *v) { + return CreateVectorOfSortedTables(data(*v), v->size()); + } + + /// @brief Specialized version of `CreateVector` for non-copying use cases. + /// Write the data any time later to the returned buffer pointer `buf`. + /// @param[in] len The number of elements to store in the `vector`. + /// @param[in] elemsize The size of each element in the `vector`. + /// @param[out] buf A pointer to a `uint8_t` pointer that can be + /// written to at a later time to serialize the data into a `vector` + /// in the buffer. + uoffset_t CreateUninitializedVector(size_t len, size_t elemsize, + uint8_t **buf) { + NotNested(); + StartVector(len, elemsize); + buf_.make_space(len * elemsize); + auto vec_start = GetSize(); + auto vec_end = EndVector(len); + *buf = buf_.data_at(vec_start); + return vec_end; + } + + /// @brief Specialized version of `CreateVector` for non-copying use cases. + /// Write the data any time later to the returned buffer pointer `buf`. + /// @tparam T The data type of the data that will be stored in the buffer + /// as a `vector`. + /// @param[in] len The number of elements to store in the `vector`. + /// @param[out] buf A pointer to a pointer of type `T` that can be + /// written to at a later time to serialize the data into a `vector` + /// in the buffer. + template + Offset> CreateUninitializedVector(size_t len, T **buf) { + AssertScalarT(); + return CreateUninitializedVector(len, sizeof(T), + reinterpret_cast(buf)); + } + + template + Offset> CreateUninitializedVectorOfStructs(size_t len, T **buf) { + return CreateUninitializedVector(len, sizeof(T), + reinterpret_cast(buf)); + } + + + // @brief Create a vector of scalar type T given as input a vector of scalar + // type U, useful with e.g. pre "enum class" enums, or any existing scalar + // data of the wrong type. + template + Offset> CreateVectorScalarCast(const U *v, size_t len) { + AssertScalarT(); + AssertScalarT(); + StartVector(len, sizeof(T)); + for (auto i = len; i > 0;) { PushElement(static_cast(v[--i])); } + return Offset>(EndVector(len)); + } + + /// @brief Write a struct by itself, typically to be part of a union. + template Offset CreateStruct(const T &structobj) { + NotNested(); + Align(AlignOf()); + buf_.push_small(structobj); + return Offset(GetSize()); + } + + /// @brief The length of a FlatBuffer file header. + static const size_t kFileIdentifierLength = 4; + + /// @brief Finish serializing a buffer by writing the root offset. + /// @param[in] file_identifier If a `file_identifier` is given, the buffer + /// will be prefixed with a standard FlatBuffers file header. + template + void Finish(Offset root, const char *file_identifier = nullptr) { + Finish(root.o, file_identifier, false); + } + + /// @brief Finish a buffer with a 32 bit size field pre-fixed (size of the + /// buffer following the size field). These buffers are NOT compatible + /// with standard buffers created by Finish, i.e. you can't call GetRoot + /// on them, you have to use GetSizePrefixedRoot instead. + /// All >32 bit quantities in this buffer will be aligned when the whole + /// size pre-fixed buffer is aligned. + /// These kinds of buffers are useful for creating a stream of FlatBuffers. + template + void FinishSizePrefixed(Offset root, + const char *file_identifier = nullptr) { + Finish(root.o, file_identifier, true); + } + + void SwapBufAllocator(FlatBufferBuilder &other) { + buf_.swap_allocator(other.buf_); + } + +protected: + + // You shouldn't really be copying instances of this class. + FlatBufferBuilder(const FlatBufferBuilder &); + FlatBufferBuilder &operator=(const FlatBufferBuilder &); + + void Finish(uoffset_t root, const char *file_identifier, bool size_prefix) { + NotNested(); + buf_.clear_scratch(); + // This will cause the whole buffer to be aligned. + PreAlign((size_prefix ? sizeof(uoffset_t) : 0) + sizeof(uoffset_t) + + (file_identifier ? kFileIdentifierLength : 0), + minalign_); + if (file_identifier) { + FLATBUFFERS_ASSERT(strlen(file_identifier) == kFileIdentifierLength); + PushBytes(reinterpret_cast(file_identifier), + kFileIdentifierLength); + } + PushElement(ReferTo(root)); // Location of root. + if (size_prefix) { PushElement(GetSize()); } + finished = true; + } + + struct FieldLoc { + uoffset_t off; + voffset_t id; + }; + + vector_downward buf_; + + // Accumulating offsets of table members while it is being built. + // We store these in the scratch pad of buf_, after the vtable offsets. + uoffset_t num_field_loc; + // Track how much of the vtable is in use, so we can output the most compact + // possible vtable. + voffset_t max_voffset_; + + // Ensure objects are not nested. + bool nested; + + // Ensure the buffer is finished before it is being accessed. + bool finished; + + size_t minalign_; + + bool force_defaults_; // Serialize values equal to their defaults anyway. + + bool dedup_vtables_; + + struct StringOffsetCompare { + StringOffsetCompare(const vector_downward &buf) : buf_(&buf) {} + bool operator()(const Offset &a, const Offset &b) const { + auto stra = reinterpret_cast(buf_->data_at(a.o)); + auto strb = reinterpret_cast(buf_->data_at(b.o)); + return StringLessThan(stra->data(), stra->size(), + strb->data(), strb->size()); + } + const vector_downward *buf_; + }; + + // For use with CreateSharedString. Instantiated on first use only. + typedef std::set, StringOffsetCompare> StringOffsetMap; + StringOffsetMap *string_pool; + + private: + // Allocates space for a vector of structures. + // Must be completed with EndVectorOfStructs(). + template T *StartVectorOfStructs(size_t vector_size) { + StartVector(vector_size * sizeof(T) / AlignOf(), AlignOf()); + return reinterpret_cast(buf_.make_space(vector_size * sizeof(T))); + } + + // End the vector of structues in the flatbuffers. + // Vector should have previously be started with StartVectorOfStructs(). + template + Offset> EndVectorOfStructs(size_t vector_size) { + return Offset>(EndVector(vector_size)); + } +}; +/// @} + +/// @cond FLATBUFFERS_INTERNAL +// Helpers to get a typed pointer to the root object contained in the buffer. +template T *GetMutableRoot(void *buf) { + EndianCheck(); + return reinterpret_cast( + reinterpret_cast(buf) + + EndianScalar(*reinterpret_cast(buf))); +} + +template const T *GetRoot(const void *buf) { + return GetMutableRoot(const_cast(buf)); +} + +template const T *GetSizePrefixedRoot(const void *buf) { + return GetRoot(reinterpret_cast(buf) + sizeof(uoffset_t)); +} + +/// Helpers to get a typed pointer to objects that are currently being built. +/// @warning Creating new objects will lead to reallocations and invalidates +/// the pointer! +template +T *GetMutableTemporaryPointer(FlatBufferBuilder &fbb, Offset offset) { + return reinterpret_cast(fbb.GetCurrentBufferPointer() + fbb.GetSize() - + offset.o); +} + +template +const T *GetTemporaryPointer(FlatBufferBuilder &fbb, Offset offset) { + return GetMutableTemporaryPointer(fbb, offset); +} + +/// @brief Get a pointer to the the file_identifier section of the buffer. +/// @return Returns a const char pointer to the start of the file_identifier +/// characters in the buffer. The returned char * has length +/// 'flatbuffers::FlatBufferBuilder::kFileIdentifierLength'. +/// This function is UNDEFINED for FlatBuffers whose schema does not include +/// a file_identifier (likely points at padding or the start of a the root +/// vtable). +inline const char *GetBufferIdentifier(const void *buf, bool size_prefixed = false) { + return reinterpret_cast(buf) + + ((size_prefixed) ? 2 * sizeof(uoffset_t) : sizeof(uoffset_t)); +} + +// Helper to see if the identifier in a buffer has the expected value. +inline bool BufferHasIdentifier(const void *buf, const char *identifier, bool size_prefixed = false) { + return strncmp(GetBufferIdentifier(buf, size_prefixed), identifier, + FlatBufferBuilder::kFileIdentifierLength) == 0; +} + +// Helper class to verify the integrity of a FlatBuffer +class Verifier FLATBUFFERS_FINAL_CLASS { + public: + Verifier(const uint8_t *buf, size_t buf_len, uoffset_t _max_depth = 64, + uoffset_t _max_tables = 1000000, bool _check_alignment = true) + : buf_(buf), + size_(buf_len), + depth_(0), + max_depth_(_max_depth), + num_tables_(0), + max_tables_(_max_tables), + upper_bound_(0), + check_alignment_(_check_alignment) + { + FLATBUFFERS_ASSERT(size_ < FLATBUFFERS_MAX_BUFFER_SIZE); + } + + // Central location where any verification failures register. + bool Check(bool ok) const { + // clang-format off + #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE + FLATBUFFERS_ASSERT(ok); + #endif + #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE + if (!ok) + upper_bound_ = 0; + #endif + // clang-format on + return ok; + } + + // Verify any range within the buffer. + bool Verify(size_t elem, size_t elem_len) const { + // clang-format off + #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE + auto upper_bound = elem + elem_len; + if (upper_bound_ < upper_bound) + upper_bound_ = upper_bound; + #endif + // clang-format on + return Check(elem_len < size_ && elem <= size_ - elem_len); + } + + template bool VerifyAlignment(size_t elem) const { + return (elem & (sizeof(T) - 1)) == 0 || !check_alignment_; + } + + // Verify a range indicated by sizeof(T). + template bool Verify(size_t elem) const { + return VerifyAlignment(elem) && Verify(elem, sizeof(T)); + } + + // Verify relative to a known-good base pointer. + bool Verify(const uint8_t *base, voffset_t elem_off, size_t elem_len) const { + return Verify(static_cast(base - buf_) + elem_off, elem_len); + } + + template bool Verify(const uint8_t *base, voffset_t elem_off) + const { + return Verify(static_cast(base - buf_) + elem_off, sizeof(T)); + } + + // Verify a pointer (may be NULL) of a table type. + template bool VerifyTable(const T *table) { + return !table || table->Verify(*this); + } + + // Verify a pointer (may be NULL) of any vector type. + template bool VerifyVector(const Vector *vec) const { + return !vec || VerifyVectorOrString(reinterpret_cast(vec), + sizeof(T)); + } + + // Verify a pointer (may be NULL) of a vector to struct. + template bool VerifyVector(const Vector *vec) const { + return VerifyVector(reinterpret_cast *>(vec)); + } + + // Verify a pointer (may be NULL) to string. + bool VerifyString(const String *str) const { + size_t end; + return !str || + (VerifyVectorOrString(reinterpret_cast(str), + 1, &end) && + Verify(end, 1) && // Must have terminator + Check(buf_[end] == '\0')); // Terminating byte must be 0. + } + + // Common code between vectors and strings. + bool VerifyVectorOrString(const uint8_t *vec, size_t elem_size, + size_t *end = nullptr) const { + auto veco = static_cast(vec - buf_); + // Check we can read the size field. + if (!Verify(veco)) return false; + // Check the whole array. If this is a string, the byte past the array + // must be 0. + auto size = ReadScalar(vec); + auto max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size; + if (!Check(size < max_elems)) + return false; // Protect against byte_size overflowing. + auto byte_size = sizeof(size) + elem_size * size; + if (end) *end = veco + byte_size; + return Verify(veco, byte_size); + } + + // Special case for string contents, after the above has been called. + bool VerifyVectorOfStrings(const Vector> *vec) const { + if (vec) { + for (uoffset_t i = 0; i < vec->size(); i++) { + if (!VerifyString(vec->Get(i))) return false; + } + } + return true; + } + + // Special case for table contents, after the above has been called. + template bool VerifyVectorOfTables(const Vector> *vec) { + if (vec) { + for (uoffset_t i = 0; i < vec->size(); i++) { + if (!vec->Get(i)->Verify(*this)) return false; + } + } + return true; + } + + bool VerifyTableStart(const uint8_t *table) { + // Check the vtable offset. + auto tableo = static_cast(table - buf_); + if (!Verify(tableo)) return false; + // This offset may be signed, but doing the substraction unsigned always + // gives the result we want. + auto vtableo = tableo - static_cast(ReadScalar(table)); + // Check the vtable size field, then check vtable fits in its entirety. + return VerifyComplexity() && Verify(vtableo) && + VerifyAlignment(ReadScalar(buf_ + vtableo)) && + Verify(vtableo, ReadScalar(buf_ + vtableo)); + } + + template + bool VerifyBufferFromStart(const char *identifier, size_t start) { + if (identifier && + (size_ < 2 * sizeof(flatbuffers::uoffset_t) || + !BufferHasIdentifier(buf_ + start, identifier))) { + return false; + } + + // Call T::Verify, which must be in the generated code for this type. + auto o = VerifyOffset(start); + return o && reinterpret_cast(buf_ + start + o)->Verify(*this) + // clang-format off + #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE + && GetComputedSize() + #endif + ; + // clang-format on + } + + // Verify this whole buffer, starting with root type T. + template bool VerifyBuffer() { return VerifyBuffer(nullptr); } + + template bool VerifyBuffer(const char *identifier) { + return VerifyBufferFromStart(identifier, 0); + } + + template bool VerifySizePrefixedBuffer(const char *identifier) { + return Verify(0U) && + ReadScalar(buf_) == size_ - sizeof(uoffset_t) && + VerifyBufferFromStart(identifier, sizeof(uoffset_t)); + } + + uoffset_t VerifyOffset(size_t start) const { + if (!Verify(start)) return 0; + auto o = ReadScalar(buf_ + start); + // May not point to itself. + if (!Check(o != 0)) return 0; + // Can't wrap around / buffers are max 2GB. + if (!Check(static_cast(o) >= 0)) return 0; + // Must be inside the buffer to create a pointer from it (pointer outside + // buffer is UB). + if (!Verify(start + o, 1)) return 0; + return o; + } + + uoffset_t VerifyOffset(const uint8_t *base, voffset_t start) const { + return VerifyOffset(static_cast(base - buf_) + start); + } + + // Called at the start of a table to increase counters measuring data + // structure depth and amount, and possibly bails out with false if + // limits set by the constructor have been hit. Needs to be balanced + // with EndTable(). + bool VerifyComplexity() { + depth_++; + num_tables_++; + return Check(depth_ <= max_depth_ && num_tables_ <= max_tables_); + } + + // Called at the end of a table to pop the depth count. + bool EndTable() { + depth_--; + return true; + } + + // Returns the message size in bytes + size_t GetComputedSize() const { + // clang-format off + #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE + uintptr_t size = upper_bound_; + // Align the size to uoffset_t + size = (size - 1 + sizeof(uoffset_t)) & ~(sizeof(uoffset_t) - 1); + return (size > size_) ? 0 : size; + #else + // Must turn on FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE for this to work. + (void)upper_bound_; + FLATBUFFERS_ASSERT(false); + return 0; + #endif + // clang-format on + } + + private: + const uint8_t *buf_; + size_t size_; + uoffset_t depth_; + uoffset_t max_depth_; + uoffset_t num_tables_; + uoffset_t max_tables_; + mutable size_t upper_bound_; + bool check_alignment_; +}; + +// Convenient way to bundle a buffer and its length, to pass it around +// typed by its root. +// A BufferRef does not own its buffer. +struct BufferRefBase {}; // for std::is_base_of +template struct BufferRef : BufferRefBase { + BufferRef() : buf(nullptr), len(0), must_free(false) {} + BufferRef(uint8_t *_buf, uoffset_t _len) + : buf(_buf), len(_len), must_free(false) {} + + ~BufferRef() { + if (must_free) free(buf); + } + + const T *GetRoot() const { return flatbuffers::GetRoot(buf); } + + bool Verify() { + Verifier verifier(buf, len); + return verifier.VerifyBuffer(nullptr); + } + + uint8_t *buf; + uoffset_t len; + bool must_free; +}; + +// "structs" are flat structures that do not have an offset table, thus +// always have all members present and do not support forwards/backwards +// compatible extensions. + +class Struct FLATBUFFERS_FINAL_CLASS { + public: + template T GetField(uoffset_t o) const { + return ReadScalar(&data_[o]); + } + + template T GetStruct(uoffset_t o) const { + return reinterpret_cast(&data_[o]); + } + + const uint8_t *GetAddressOf(uoffset_t o) const { return &data_[o]; } + uint8_t *GetAddressOf(uoffset_t o) { return &data_[o]; } + + private: + uint8_t data_[1]; +}; + +// "tables" use an offset table (possibly shared) that allows fields to be +// omitted and added at will, but uses an extra indirection to read. +class Table { + public: + const uint8_t *GetVTable() const { + return data_ - ReadScalar(data_); + } + + // This gets the field offset for any of the functions below it, or 0 + // if the field was not present. + voffset_t GetOptionalFieldOffset(voffset_t field) const { + // The vtable offset is always at the start. + auto vtable = GetVTable(); + // The first element is the size of the vtable (fields + type id + itself). + auto vtsize = ReadScalar(vtable); + // If the field we're accessing is outside the vtable, we're reading older + // data, so it's the same as if the offset was 0 (not present). + return field < vtsize ? ReadScalar(vtable + field) : 0; + } + + template T GetField(voffset_t field, T defaultval) const { + auto field_offset = GetOptionalFieldOffset(field); + return field_offset ? ReadScalar(data_ + field_offset) : defaultval; + } + + template P GetPointer(voffset_t field) { + auto field_offset = GetOptionalFieldOffset(field); + auto p = data_ + field_offset; + return field_offset ? reinterpret_cast

(p + ReadScalar(p)) + : nullptr; + } + template P GetPointer(voffset_t field) const { + return const_cast(this)->GetPointer

(field); + } + + template P GetStruct(voffset_t field) const { + auto field_offset = GetOptionalFieldOffset(field); + auto p = const_cast(data_ + field_offset); + return field_offset ? reinterpret_cast

(p) : nullptr; + } + + template bool SetField(voffset_t field, T val, T def) { + auto field_offset = GetOptionalFieldOffset(field); + if (!field_offset) return IsTheSameAs(val, def); + WriteScalar(data_ + field_offset, val); + return true; + } + + bool SetPointer(voffset_t field, const uint8_t *val) { + auto field_offset = GetOptionalFieldOffset(field); + if (!field_offset) return false; + WriteScalar(data_ + field_offset, + static_cast(val - (data_ + field_offset))); + return true; + } + + uint8_t *GetAddressOf(voffset_t field) { + auto field_offset = GetOptionalFieldOffset(field); + return field_offset ? data_ + field_offset : nullptr; + } + const uint8_t *GetAddressOf(voffset_t field) const { + return const_cast

(this)->GetAddressOf(field); + } + + bool CheckField(voffset_t field) const { + return GetOptionalFieldOffset(field) != 0; + } + + // Verify the vtable of this table. + // Call this once per table, followed by VerifyField once per field. + bool VerifyTableStart(Verifier &verifier) const { + return verifier.VerifyTableStart(data_); + } + + // Verify a particular field. + template + bool VerifyField(const Verifier &verifier, voffset_t field) const { + // Calling GetOptionalFieldOffset should be safe now thanks to + // VerifyTable(). + auto field_offset = GetOptionalFieldOffset(field); + // Check the actual field. + return !field_offset || verifier.Verify(data_, field_offset); + } + + // VerifyField for required fields. + template + bool VerifyFieldRequired(const Verifier &verifier, voffset_t field) const { + auto field_offset = GetOptionalFieldOffset(field); + return verifier.Check(field_offset != 0) && + verifier.Verify(data_, field_offset); + } + + // Versions for offsets. + bool VerifyOffset(const Verifier &verifier, voffset_t field) const { + auto field_offset = GetOptionalFieldOffset(field); + return !field_offset || verifier.VerifyOffset(data_, field_offset); + } + + bool VerifyOffsetRequired(const Verifier &verifier, voffset_t field) const { + auto field_offset = GetOptionalFieldOffset(field); + return verifier.Check(field_offset != 0) && + verifier.VerifyOffset(data_, field_offset); + } + + private: + // private constructor & copy constructor: you obtain instances of this + // class by pointing to existing data only + Table(); + Table(const Table &other); + + uint8_t data_[1]; +}; + +template void FlatBufferBuilder::Required(Offset table, + voffset_t field) { + auto table_ptr = reinterpret_cast(buf_.data_at(table.o)); + bool ok = table_ptr->GetOptionalFieldOffset(field) != 0; + // If this fails, the caller will show what field needs to be set. + FLATBUFFERS_ASSERT(ok); + (void)ok; +} + +/// @brief This can compute the start of a FlatBuffer from a root pointer, i.e. +/// it is the opposite transformation of GetRoot(). +/// This may be useful if you want to pass on a root and have the recipient +/// delete the buffer afterwards. +inline const uint8_t *GetBufferStartFromRootPointer(const void *root) { + auto table = reinterpret_cast(root); + auto vtable = table->GetVTable(); + // Either the vtable is before the root or after the root. + auto start = (std::min)(vtable, reinterpret_cast(root)); + // Align to at least sizeof(uoffset_t). + start = reinterpret_cast(reinterpret_cast(start) & + ~(sizeof(uoffset_t) - 1)); + // Additionally, there may be a file_identifier in the buffer, and the root + // offset. The buffer may have been aligned to any size between + // sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see "force_align"). + // Sadly, the exact alignment is only known when constructing the buffer, + // since it depends on the presence of values with said alignment properties. + // So instead, we simply look at the next uoffset_t values (root, + // file_identifier, and alignment padding) to see which points to the root. + // None of the other values can "impersonate" the root since they will either + // be 0 or four ASCII characters. + static_assert(FlatBufferBuilder::kFileIdentifierLength == sizeof(uoffset_t), + "file_identifier is assumed to be the same size as uoffset_t"); + for (auto possible_roots = FLATBUFFERS_MAX_ALIGNMENT / sizeof(uoffset_t) + 1; + possible_roots; possible_roots--) { + start -= sizeof(uoffset_t); + if (ReadScalar(start) + start == + reinterpret_cast(root)) + return start; + } + // We didn't find the root, either the "root" passed isn't really a root, + // or the buffer is corrupt. + // Assert, because calling this function with bad data may cause reads + // outside of buffer boundaries. + FLATBUFFERS_ASSERT(false); + return nullptr; +} + +/// @brief This return the prefixed size of a FlatBuffer. +inline uoffset_t GetPrefixedSize(const uint8_t* buf){ return ReadScalar(buf); } + +// Base class for native objects (FlatBuffer data de-serialized into native +// C++ data structures). +// Contains no functionality, purely documentative. +struct NativeTable {}; + +/// @brief Function types to be used with resolving hashes into objects and +/// back again. The resolver gets a pointer to a field inside an object API +/// object that is of the type specified in the schema using the attribute +/// `cpp_type` (it is thus important whatever you write to this address +/// matches that type). The value of this field is initially null, so you +/// may choose to implement a delayed binding lookup using this function +/// if you wish. The resolver does the opposite lookup, for when the object +/// is being serialized again. +typedef uint64_t hash_value_t; +// clang-format off +#ifdef FLATBUFFERS_CPP98_STL + typedef void (*resolver_function_t)(void **pointer_adr, hash_value_t hash); + typedef hash_value_t (*rehasher_function_t)(void *pointer); +#else + typedef std::function + resolver_function_t; + typedef std::function rehasher_function_t; +#endif +// clang-format on + +// Helper function to test if a field is present, using any of the field +// enums in the generated code. +// `table` must be a generated table type. Since this is a template parameter, +// this is not typechecked to be a subclass of Table, so beware! +// Note: this function will return false for fields equal to the default +// value, since they're not stored in the buffer (unless force_defaults was +// used). +template +bool IsFieldPresent(const T *table, typename T::FlatBuffersVTableOffset field) { + // Cast, since Table is a private baseclass of any table types. + return reinterpret_cast(table)->CheckField( + static_cast(field)); +} + +// Utility function for reverse lookups on the EnumNames*() functions +// (in the generated C++ code) +// names must be NULL terminated. +inline int LookupEnum(const char **names, const char *name) { + for (const char **p = names; *p; p++) + if (!strcmp(*p, name)) return static_cast(p - names); + return -1; +} + +// These macros allow us to layout a struct with a guarantee that they'll end +// up looking the same on different compilers and platforms. +// It does this by disallowing the compiler to do any padding, and then +// does padding itself by inserting extra padding fields that make every +// element aligned to its own size. +// Additionally, it manually sets the alignment of the struct as a whole, +// which is typically its largest element, or a custom size set in the schema +// by the force_align attribute. +// These are used in the generated code only. + +// clang-format off +#if defined(_MSC_VER) + #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \ + __pragma(pack(1)) \ + struct __declspec(align(alignment)) + #define FLATBUFFERS_STRUCT_END(name, size) \ + __pragma(pack()) \ + static_assert(sizeof(name) == size, "compiler breaks packing rules") +#elif defined(__GNUC__) || defined(__clang__) + #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \ + _Pragma("pack(1)") \ + struct __attribute__((aligned(alignment))) + #define FLATBUFFERS_STRUCT_END(name, size) \ + _Pragma("pack()") \ + static_assert(sizeof(name) == size, "compiler breaks packing rules") +#else + #error Unknown compiler, please define structure alignment macros +#endif +// clang-format on + +// Minimal reflection via code generation. +// Besides full-fat reflection (see reflection.h) and parsing/printing by +// loading schemas (see idl.h), we can also have code generation for mimimal +// reflection data which allows pretty-printing and other uses without needing +// a schema or a parser. +// Generate code with --reflect-types (types only) or --reflect-names (names +// also) to enable. +// See minireflect.h for utilities using this functionality. + +// These types are organized slightly differently as the ones in idl.h. +enum SequenceType { ST_TABLE, ST_STRUCT, ST_UNION, ST_ENUM }; + +// Scalars have the same order as in idl.h +// clang-format off +#define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \ + ET(ET_UTYPE) \ + ET(ET_BOOL) \ + ET(ET_CHAR) \ + ET(ET_UCHAR) \ + ET(ET_SHORT) \ + ET(ET_USHORT) \ + ET(ET_INT) \ + ET(ET_UINT) \ + ET(ET_LONG) \ + ET(ET_ULONG) \ + ET(ET_FLOAT) \ + ET(ET_DOUBLE) \ + ET(ET_STRING) \ + ET(ET_SEQUENCE) // See SequenceType. + +enum ElementaryType { + #define FLATBUFFERS_ET(E) E, + FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET) + #undef FLATBUFFERS_ET +}; + +inline const char * const *ElementaryTypeNames() { + static const char * const names[] = { + #define FLATBUFFERS_ET(E) #E, + FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET) + #undef FLATBUFFERS_ET + }; + return names; +} +// clang-format on + +// Basic type info cost just 16bits per field! +struct TypeCode { + uint16_t base_type : 4; // ElementaryType + uint16_t is_vector : 1; + int16_t sequence_ref : 11; // Index into type_refs below, or -1 for none. +}; + +static_assert(sizeof(TypeCode) == 2, "TypeCode"); + +struct TypeTable; + +// Signature of the static method present in each type. +typedef const TypeTable *(*TypeFunction)(); + +struct TypeTable { + SequenceType st; + size_t num_elems; // of type_codes, values, names (but not type_refs). + const TypeCode *type_codes; // num_elems count + const TypeFunction *type_refs; // less than num_elems entries (see TypeCode). + const int64_t *values; // Only set for non-consecutive enum/union or structs. + const char * const *names; // Only set if compiled with --reflect-names. +}; + +// String which identifies the current version of FlatBuffers. +// flatbuffer_version_string is used by Google developers to identify which +// applications uploaded to Google Play are using this library. This allows +// the development team at Google to determine the popularity of the library. +// How it works: Applications that are uploaded to the Google Play Store are +// scanned for this version string. We track which applications are using it +// to measure popularity. You are free to remove it (of course) but we would +// appreciate if you left it in. + +// Weak linkage is culled by VS & doesn't work on cygwin. +// clang-format off +#if !defined(_WIN32) && !defined(__CYGWIN__) + +extern volatile __attribute__((weak)) const char *flatbuffer_version_string; +volatile __attribute__((weak)) const char *flatbuffer_version_string = + "FlatBuffers " + FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) "." + FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) "." + FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION); + +#endif // !defined(_WIN32) && !defined(__CYGWIN__) + +#define FLATBUFFERS_DEFINE_BITMASK_OPERATORS(E, T)\ + inline E operator | (E lhs, E rhs){\ + return E(T(lhs) | T(rhs));\ + }\ + inline E operator & (E lhs, E rhs){\ + return E(T(lhs) & T(rhs));\ + }\ + inline E operator ^ (E lhs, E rhs){\ + return E(T(lhs) ^ T(rhs));\ + }\ + inline E operator ~ (E lhs){\ + return E(~T(lhs));\ + }\ + inline E operator |= (E &lhs, E rhs){\ + lhs = lhs | rhs;\ + return lhs;\ + }\ + inline E operator &= (E &lhs, E rhs){\ + lhs = lhs & rhs;\ + return lhs;\ + }\ + inline E operator ^= (E &lhs, E rhs){\ + lhs = lhs ^ rhs;\ + return lhs;\ + }\ + inline bool operator !(E rhs) \ + {\ + return !bool(T(rhs)); \ + } +/// @endcond +} // namespace flatbuffers + +// clang-format on + +#endif // FLATBUFFERS_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flatc.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flatc.h new file mode 100644 index 000000000..f2765d239 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flatc.h @@ -0,0 +1,96 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "flatbuffers/flatbuffers.h" +#include "flatbuffers/idl.h" +#include "flatbuffers/util.h" + +#ifndef FLATC_H_ +# define FLATC_H_ + +namespace flatbuffers { + +class FlatCompiler { + public: + // Output generator for the various programming languages and formats we + // support. + struct Generator { + typedef bool (*GenerateFn)(const flatbuffers::Parser &parser, + const std::string &path, + const std::string &file_name); + typedef std::string (*MakeRuleFn)(const flatbuffers::Parser &parser, + const std::string &path, + const std::string &file_name); + + GenerateFn generate; + const char *generator_opt_short; + const char *generator_opt_long; + const char *lang_name; + bool schema_only; + GenerateFn generateGRPC; + flatbuffers::IDLOptions::Language lang; + const char *generator_help; + MakeRuleFn make_rule; + }; + + typedef void (*WarnFn)(const FlatCompiler *flatc, const std::string &warn, + bool show_exe_name); + + typedef void (*ErrorFn)(const FlatCompiler *flatc, const std::string &err, + bool usage, bool show_exe_name); + + // Parameters required to initialize the FlatCompiler. + struct InitParams { + InitParams() + : generators(nullptr), + num_generators(0), + warn_fn(nullptr), + error_fn(nullptr) {} + + const Generator *generators; + size_t num_generators; + WarnFn warn_fn; + ErrorFn error_fn; + }; + + explicit FlatCompiler(const InitParams ¶ms) : params_(params) {} + + int Compile(int argc, const char **argv); + + std::string GetUsageString(const char *program_name) const; + + private: + void ParseFile(flatbuffers::Parser &parser, const std::string &filename, + const std::string &contents, + std::vector &include_directories) const; + + void LoadBinarySchema(Parser &parser, const std::string &filename, + const std::string &contents); + + void Warn(const std::string &warn, bool show_exe_name = true) const; + + void Error(const std::string &err, bool usage = true, + bool show_exe_name = true) const; + + InitParams params_; +}; + +} // namespace flatbuffers + +#endif // FLATC_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flexbuffers.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flexbuffers.h new file mode 100644 index 000000000..7cba5b75b --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/flexbuffers.h @@ -0,0 +1,1538 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_FLEXBUFFERS_H_ +#define FLATBUFFERS_FLEXBUFFERS_H_ + +#include +// Used to select STL variant. +#include "flatbuffers/base.h" +// We use the basic binary writing functions from the regular FlatBuffers. +#include "flatbuffers/util.h" + +#ifdef _MSC_VER +# include +#endif + +#if defined(_MSC_VER) +# pragma warning(push) +# pragma warning(disable : 4127) // C4127: conditional expression is constant +#endif + +namespace flexbuffers { + +class Reference; +class Map; + +// These are used in the lower 2 bits of a type field to determine the size of +// the elements (and or size field) of the item pointed to (e.g. vector). +enum BitWidth { + BIT_WIDTH_8 = 0, + BIT_WIDTH_16 = 1, + BIT_WIDTH_32 = 2, + BIT_WIDTH_64 = 3, +}; + +// These are used as the upper 6 bits of a type field to indicate the actual +// type. +enum Type { + FBT_NULL = 0, + FBT_INT = 1, + FBT_UINT = 2, + FBT_FLOAT = 3, + // Types above stored inline, types below store an offset. + FBT_KEY = 4, + FBT_STRING = 5, + FBT_INDIRECT_INT = 6, + FBT_INDIRECT_UINT = 7, + FBT_INDIRECT_FLOAT = 8, + FBT_MAP = 9, + FBT_VECTOR = 10, // Untyped. + FBT_VECTOR_INT = 11, // Typed any size (stores no type table). + FBT_VECTOR_UINT = 12, + FBT_VECTOR_FLOAT = 13, + FBT_VECTOR_KEY = 14, + FBT_VECTOR_STRING = 15, + FBT_VECTOR_INT2 = 16, // Typed tuple (no type table, no size field). + FBT_VECTOR_UINT2 = 17, + FBT_VECTOR_FLOAT2 = 18, + FBT_VECTOR_INT3 = 19, // Typed triple (no type table, no size field). + FBT_VECTOR_UINT3 = 20, + FBT_VECTOR_FLOAT3 = 21, + FBT_VECTOR_INT4 = 22, // Typed quad (no type table, no size field). + FBT_VECTOR_UINT4 = 23, + FBT_VECTOR_FLOAT4 = 24, + FBT_BLOB = 25, + FBT_BOOL = 26, + FBT_VECTOR_BOOL = + 36, // To Allow the same type of conversion of type to vector type +}; + +inline bool IsInline(Type t) { return t <= FBT_FLOAT || t == FBT_BOOL; } + +inline bool IsTypedVectorElementType(Type t) { + return (t >= FBT_INT && t <= FBT_STRING) || t == FBT_BOOL; +} + +inline bool IsTypedVector(Type t) { + return (t >= FBT_VECTOR_INT && t <= FBT_VECTOR_STRING) || + t == FBT_VECTOR_BOOL; +} + +inline bool IsFixedTypedVector(Type t) { + return t >= FBT_VECTOR_INT2 && t <= FBT_VECTOR_FLOAT4; +} + +inline Type ToTypedVector(Type t, size_t fixed_len = 0) { + FLATBUFFERS_ASSERT(IsTypedVectorElementType(t)); + switch (fixed_len) { + case 0: return static_cast(t - FBT_INT + FBT_VECTOR_INT); + case 2: return static_cast(t - FBT_INT + FBT_VECTOR_INT2); + case 3: return static_cast(t - FBT_INT + FBT_VECTOR_INT3); + case 4: return static_cast(t - FBT_INT + FBT_VECTOR_INT4); + default: FLATBUFFERS_ASSERT(0); return FBT_NULL; + } +} + +inline Type ToTypedVectorElementType(Type t) { + FLATBUFFERS_ASSERT(IsTypedVector(t)); + return static_cast(t - FBT_VECTOR_INT + FBT_INT); +} + +inline Type ToFixedTypedVectorElementType(Type t, uint8_t *len) { + FLATBUFFERS_ASSERT(IsFixedTypedVector(t)); + auto fixed_type = t - FBT_VECTOR_INT2; + *len = static_cast(fixed_type / 3 + + 2); // 3 types each, starting from length 2. + return static_cast(fixed_type % 3 + FBT_INT); +} + +// TODO: implement proper support for 8/16bit floats, or decide not to +// support them. +typedef int16_t half; +typedef int8_t quarter; + +// TODO: can we do this without conditionals using intrinsics or inline asm +// on some platforms? Given branch prediction the method below should be +// decently quick, but it is the most frequently executed function. +// We could do an (unaligned) 64-bit read if we ifdef out the platforms for +// which that doesn't work (or where we'd read into un-owned memory). +template +R ReadSizedScalar(const uint8_t *data, uint8_t byte_width) { + return byte_width < 4 + ? (byte_width < 2 + ? static_cast(flatbuffers::ReadScalar(data)) + : static_cast(flatbuffers::ReadScalar(data))) + : (byte_width < 8 + ? static_cast(flatbuffers::ReadScalar(data)) + : static_cast(flatbuffers::ReadScalar(data))); +} + +inline int64_t ReadInt64(const uint8_t *data, uint8_t byte_width) { + return ReadSizedScalar( + data, byte_width); +} + +inline uint64_t ReadUInt64(const uint8_t *data, uint8_t byte_width) { + // This is the "hottest" function (all offset lookups use this), so worth + // optimizing if possible. + // TODO: GCC apparently replaces memcpy by a rep movsb, but only if count is a + // constant, which here it isn't. Test if memcpy is still faster than + // the conditionals in ReadSizedScalar. Can also use inline asm. + // clang-format off + #if defined(_MSC_VER) && (defined(_M_X64) || defined _M_IX86) + uint64_t u = 0; + __movsb(reinterpret_cast(&u), + reinterpret_cast(data), byte_width); + return flatbuffers::EndianScalar(u); + #else + return ReadSizedScalar( + data, byte_width); + #endif + // clang-format on +} + +inline double ReadDouble(const uint8_t *data, uint8_t byte_width) { + return ReadSizedScalar(data, + byte_width); +} + +inline const uint8_t *Indirect(const uint8_t *offset, uint8_t byte_width) { + return offset - ReadUInt64(offset, byte_width); +} + +template const uint8_t *Indirect(const uint8_t *offset) { + return offset - flatbuffers::ReadScalar(offset); +} + +inline BitWidth WidthU(uint64_t u) { +#define FLATBUFFERS_GET_FIELD_BIT_WIDTH(value, width) \ + { \ + if (!((u) & ~((1ULL << (width)) - 1ULL))) return BIT_WIDTH_##width; \ + } + FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 8); + FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 16); + FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 32); +#undef FLATBUFFERS_GET_FIELD_BIT_WIDTH + return BIT_WIDTH_64; +} + +inline BitWidth WidthI(int64_t i) { + auto u = static_cast(i) << 1; + return WidthU(i >= 0 ? u : ~u); +} + +inline BitWidth WidthF(double f) { + return static_cast(static_cast(f)) == f ? BIT_WIDTH_32 + : BIT_WIDTH_64; +} + +// Base class of all types below. +// Points into the data buffer and allows access to one type. +class Object { + public: + Object(const uint8_t *data, uint8_t byte_width) + : data_(data), byte_width_(byte_width) {} + + protected: + const uint8_t *data_; + uint8_t byte_width_; +}; + +// Stores size in `byte_width_` bytes before data_ pointer. +class Sized : public Object { + public: + Sized(const uint8_t *data, uint8_t byte_width) : Object(data, byte_width) {} + size_t size() const { + return static_cast(ReadUInt64(data_ - byte_width_, byte_width_)); + } +}; + +class String : public Sized { + public: + String(const uint8_t *data, uint8_t byte_width) : Sized(data, byte_width) {} + + size_t length() const { return size(); } + const char *c_str() const { return reinterpret_cast(data_); } + std::string str() const { return std::string(c_str(), length()); } + + static String EmptyString() { + static const uint8_t empty_string[] = { 0 /*len*/, 0 /*terminator*/ }; + return String(empty_string + 1, 1); + } + bool IsTheEmptyString() const { return data_ == EmptyString().data_; } +}; + +class Blob : public Sized { + public: + Blob(const uint8_t *data_buf, uint8_t byte_width) + : Sized(data_buf, byte_width) {} + + static Blob EmptyBlob() { + static const uint8_t empty_blob[] = { 0 /*len*/ }; + return Blob(empty_blob + 1, 1); + } + bool IsTheEmptyBlob() const { return data_ == EmptyBlob().data_; } + const uint8_t *data() const { return data_; } +}; + +class Vector : public Sized { + public: + Vector(const uint8_t *data, uint8_t byte_width) : Sized(data, byte_width) {} + + Reference operator[](size_t i) const; + + static Vector EmptyVector() { + static const uint8_t empty_vector[] = { 0 /*len*/ }; + return Vector(empty_vector + 1, 1); + } + bool IsTheEmptyVector() const { return data_ == EmptyVector().data_; } +}; + +class TypedVector : public Sized { + public: + TypedVector(const uint8_t *data, uint8_t byte_width, Type element_type) + : Sized(data, byte_width), type_(element_type) {} + + Reference operator[](size_t i) const; + + static TypedVector EmptyTypedVector() { + static const uint8_t empty_typed_vector[] = { 0 /*len*/ }; + return TypedVector(empty_typed_vector + 1, 1, FBT_INT); + } + bool IsTheEmptyVector() const { + return data_ == TypedVector::EmptyTypedVector().data_; + } + + Type ElementType() { return type_; } + + private: + Type type_; + + friend Map; +}; + +class FixedTypedVector : public Object { + public: + FixedTypedVector(const uint8_t *data, uint8_t byte_width, Type element_type, + uint8_t len) + : Object(data, byte_width), type_(element_type), len_(len) {} + + Reference operator[](size_t i) const; + + static FixedTypedVector EmptyFixedTypedVector() { + static const uint8_t fixed_empty_vector[] = { 0 /* unused */ }; + return FixedTypedVector(fixed_empty_vector, 1, FBT_INT, 0); + } + bool IsTheEmptyFixedTypedVector() const { + return data_ == FixedTypedVector::EmptyFixedTypedVector().data_; + } + + Type ElementType() { return type_; } + uint8_t size() { return len_; } + + private: + Type type_; + uint8_t len_; +}; + +class Map : public Vector { + public: + Map(const uint8_t *data, uint8_t byte_width) : Vector(data, byte_width) {} + + Reference operator[](const char *key) const; + Reference operator[](const std::string &key) const; + + Vector Values() const { return Vector(data_, byte_width_); } + + TypedVector Keys() const { + const size_t num_prefixed_fields = 3; + auto keys_offset = data_ - byte_width_ * num_prefixed_fields; + return TypedVector(Indirect(keys_offset, byte_width_), + static_cast( + ReadUInt64(keys_offset + byte_width_, byte_width_)), + FBT_KEY); + } + + static Map EmptyMap() { + static const uint8_t empty_map[] = { + 0 /*keys_len*/, 0 /*keys_offset*/, 1 /*keys_width*/, 0 /*len*/ + }; + return Map(empty_map + 4, 1); + } + + bool IsTheEmptyMap() const { return data_ == EmptyMap().data_; } +}; + +template +void AppendToString(std::string &s, T &&v, bool keys_quoted) { + s += "[ "; + for (size_t i = 0; i < v.size(); i++) { + if (i) s += ", "; + v[i].ToString(true, keys_quoted, s); + } + s += " ]"; +} + +class Reference { + public: + Reference(const uint8_t *data, uint8_t parent_width, uint8_t byte_width, + Type type) + : data_(data), + parent_width_(parent_width), + byte_width_(byte_width), + type_(type) {} + + Reference(const uint8_t *data, uint8_t parent_width, uint8_t packed_type) + : data_(data), parent_width_(parent_width) { + byte_width_ = 1U << static_cast(packed_type & 3); + type_ = static_cast(packed_type >> 2); + } + + Type GetType() const { return type_; } + + bool IsNull() const { return type_ == FBT_NULL; } + bool IsBool() const { return type_ == FBT_BOOL; } + bool IsInt() const { return type_ == FBT_INT || type_ == FBT_INDIRECT_INT; } + bool IsUInt() const { + return type_ == FBT_UINT || type_ == FBT_INDIRECT_UINT; + } + bool IsIntOrUint() const { return IsInt() || IsUInt(); } + bool IsFloat() const { + return type_ == FBT_FLOAT || type_ == FBT_INDIRECT_FLOAT; + } + bool IsNumeric() const { return IsIntOrUint() || IsFloat(); } + bool IsString() const { return type_ == FBT_STRING; } + bool IsKey() const { return type_ == FBT_KEY; } + bool IsVector() const { return type_ == FBT_VECTOR || type_ == FBT_MAP; } + bool IsTypedVector() const { return flexbuffers::IsTypedVector(type_); } + bool IsFixedTypedVector() const { return flexbuffers::IsFixedTypedVector(type_); } + bool IsAnyVector() const { return (IsTypedVector() || IsFixedTypedVector() || IsVector());} + bool IsMap() const { return type_ == FBT_MAP; } + bool IsBlob() const { return type_ == FBT_BLOB; } + + bool AsBool() const { + return (type_ == FBT_BOOL ? ReadUInt64(data_, parent_width_) + : AsUInt64()) != 0; + } + + // Reads any type as a int64_t. Never fails, does most sensible conversion. + // Truncates floats, strings are attempted to be parsed for a number, + // vectors/maps return their size. Returns 0 if all else fails. + int64_t AsInt64() const { + if (type_ == FBT_INT) { + // A fast path for the common case. + return ReadInt64(data_, parent_width_); + } else + switch (type_) { + case FBT_INDIRECT_INT: return ReadInt64(Indirect(), byte_width_); + case FBT_UINT: return ReadUInt64(data_, parent_width_); + case FBT_INDIRECT_UINT: return ReadUInt64(Indirect(), byte_width_); + case FBT_FLOAT: + return static_cast(ReadDouble(data_, parent_width_)); + case FBT_INDIRECT_FLOAT: + return static_cast(ReadDouble(Indirect(), byte_width_)); + case FBT_NULL: return 0; + case FBT_STRING: return flatbuffers::StringToInt(AsString().c_str()); + case FBT_VECTOR: return static_cast(AsVector().size()); + case FBT_BOOL: return ReadInt64(data_, parent_width_); + default: + // Convert other things to int. + return 0; + } + } + + // TODO: could specialize these to not use AsInt64() if that saves + // extension ops in generated code, and use a faster op than ReadInt64. + int32_t AsInt32() const { return static_cast(AsInt64()); } + int16_t AsInt16() const { return static_cast(AsInt64()); } + int8_t AsInt8() const { return static_cast(AsInt64()); } + + uint64_t AsUInt64() const { + if (type_ == FBT_UINT) { + // A fast path for the common case. + return ReadUInt64(data_, parent_width_); + } else + switch (type_) { + case FBT_INDIRECT_UINT: return ReadUInt64(Indirect(), byte_width_); + case FBT_INT: return ReadInt64(data_, parent_width_); + case FBT_INDIRECT_INT: return ReadInt64(Indirect(), byte_width_); + case FBT_FLOAT: + return static_cast(ReadDouble(data_, parent_width_)); + case FBT_INDIRECT_FLOAT: + return static_cast(ReadDouble(Indirect(), byte_width_)); + case FBT_NULL: return 0; + case FBT_STRING: return flatbuffers::StringToUInt(AsString().c_str()); + case FBT_VECTOR: return static_cast(AsVector().size()); + case FBT_BOOL: return ReadUInt64(data_, parent_width_); + default: + // Convert other things to uint. + return 0; + } + } + + uint32_t AsUInt32() const { return static_cast(AsUInt64()); } + uint16_t AsUInt16() const { return static_cast(AsUInt64()); } + uint8_t AsUInt8() const { return static_cast(AsUInt64()); } + + double AsDouble() const { + if (type_ == FBT_FLOAT) { + // A fast path for the common case. + return ReadDouble(data_, parent_width_); + } else + switch (type_) { + case FBT_INDIRECT_FLOAT: return ReadDouble(Indirect(), byte_width_); + case FBT_INT: + return static_cast(ReadInt64(data_, parent_width_)); + case FBT_UINT: + return static_cast(ReadUInt64(data_, parent_width_)); + case FBT_INDIRECT_INT: + return static_cast(ReadInt64(Indirect(), byte_width_)); + case FBT_INDIRECT_UINT: + return static_cast(ReadUInt64(Indirect(), byte_width_)); + case FBT_NULL: return 0.0; + case FBT_STRING: return strtod(AsString().c_str(), nullptr); + case FBT_VECTOR: return static_cast(AsVector().size()); + case FBT_BOOL: + return static_cast(ReadUInt64(data_, parent_width_)); + default: + // Convert strings and other things to float. + return 0; + } + } + + float AsFloat() const { return static_cast(AsDouble()); } + + const char *AsKey() const { + if (type_ == FBT_KEY) { + return reinterpret_cast(Indirect()); + } else { + return ""; + } + } + + // This function returns the empty string if you try to read a not-string. + String AsString() const { + if (type_ == FBT_STRING) { + return String(Indirect(), byte_width_); + } else { + return String::EmptyString(); + } + } + + // Unlike AsString(), this will convert any type to a std::string. + std::string ToString() const { + std::string s; + ToString(false, false, s); + return s; + } + + // Convert any type to a JSON-like string. strings_quoted determines if + // string values at the top level receive "" quotes (inside other values + // they always do). keys_quoted determines if keys are quoted, at any level. + // TODO(wvo): add further options to have indentation/newlines. + void ToString(bool strings_quoted, bool keys_quoted, std::string &s) const { + if (type_ == FBT_STRING) { + String str(Indirect(), byte_width_); + if (strings_quoted) { + flatbuffers::EscapeString(str.c_str(), str.length(), &s, true, false); + } else { + s.append(str.c_str(), str.length()); + } + } else if (IsKey()) { + auto str = AsKey(); + if (keys_quoted) { + flatbuffers::EscapeString(str, strlen(str), &s, true, false); + } else { + s += str; + } + } else if (IsInt()) { + s += flatbuffers::NumToString(AsInt64()); + } else if (IsUInt()) { + s += flatbuffers::NumToString(AsUInt64()); + } else if (IsFloat()) { + s += flatbuffers::NumToString(AsDouble()); + } else if (IsNull()) { + s += "null"; + } else if (IsBool()) { + s += AsBool() ? "true" : "false"; + } else if (IsMap()) { + s += "{ "; + auto m = AsMap(); + auto keys = m.Keys(); + auto vals = m.Values(); + for (size_t i = 0; i < keys.size(); i++) { + keys[i].ToString(true, keys_quoted, s); + s += ": "; + vals[i].ToString(true, keys_quoted, s); + if (i < keys.size() - 1) s += ", "; + } + s += " }"; + } else if (IsVector()) { + AppendToString(s, AsVector(), keys_quoted); + } else if (IsTypedVector()) { + AppendToString(s, AsTypedVector(), keys_quoted); + } else if (IsFixedTypedVector()) { + AppendToString(s, AsFixedTypedVector(), keys_quoted); + } else if (IsBlob()) { + auto blob = AsBlob(); + flatbuffers::EscapeString(reinterpret_cast(blob.data()), blob.size(), &s, true, false); + } else { + s += "(?)"; + } + } + + // This function returns the empty blob if you try to read a not-blob. + // Strings can be viewed as blobs too. + Blob AsBlob() const { + if (type_ == FBT_BLOB || type_ == FBT_STRING) { + return Blob(Indirect(), byte_width_); + } else { + return Blob::EmptyBlob(); + } + } + + // This function returns the empty vector if you try to read a not-vector. + // Maps can be viewed as vectors too. + Vector AsVector() const { + if (type_ == FBT_VECTOR || type_ == FBT_MAP) { + return Vector(Indirect(), byte_width_); + } else { + return Vector::EmptyVector(); + } + } + + TypedVector AsTypedVector() const { + if (IsTypedVector()) { + return TypedVector(Indirect(), byte_width_, + ToTypedVectorElementType(type_)); + } else { + return TypedVector::EmptyTypedVector(); + } + } + + FixedTypedVector AsFixedTypedVector() const { + if (IsFixedTypedVector()) { + uint8_t len = 0; + auto vtype = ToFixedTypedVectorElementType(type_, &len); + return FixedTypedVector(Indirect(), byte_width_, vtype, len); + } else { + return FixedTypedVector::EmptyFixedTypedVector(); + } + } + + Map AsMap() const { + if (type_ == FBT_MAP) { + return Map(Indirect(), byte_width_); + } else { + return Map::EmptyMap(); + } + } + + template T As() const; + + // Experimental: Mutation functions. + // These allow scalars in an already created buffer to be updated in-place. + // Since by default scalars are stored in the smallest possible space, + // the new value may not fit, in which case these functions return false. + // To avoid this, you can construct the values you intend to mutate using + // Builder::ForceMinimumBitWidth. + bool MutateInt(int64_t i) { + if (type_ == FBT_INT) { + return Mutate(data_, i, parent_width_, WidthI(i)); + } else if (type_ == FBT_INDIRECT_INT) { + return Mutate(Indirect(), i, byte_width_, WidthI(i)); + } else if (type_ == FBT_UINT) { + auto u = static_cast(i); + return Mutate(data_, u, parent_width_, WidthU(u)); + } else if (type_ == FBT_INDIRECT_UINT) { + auto u = static_cast(i); + return Mutate(Indirect(), u, byte_width_, WidthU(u)); + } else { + return false; + } + } + + bool MutateBool(bool b) { + return type_ == FBT_BOOL && Mutate(data_, b, parent_width_, BIT_WIDTH_8); + } + + bool MutateUInt(uint64_t u) { + if (type_ == FBT_UINT) { + return Mutate(data_, u, parent_width_, WidthU(u)); + } else if (type_ == FBT_INDIRECT_UINT) { + return Mutate(Indirect(), u, byte_width_, WidthU(u)); + } else if (type_ == FBT_INT) { + auto i = static_cast(u); + return Mutate(data_, i, parent_width_, WidthI(i)); + } else if (type_ == FBT_INDIRECT_INT) { + auto i = static_cast(u); + return Mutate(Indirect(), i, byte_width_, WidthI(i)); + } else { + return false; + } + } + + bool MutateFloat(float f) { + if (type_ == FBT_FLOAT) { + return MutateF(data_, f, parent_width_, BIT_WIDTH_32); + } else if (type_ == FBT_INDIRECT_FLOAT) { + return MutateF(Indirect(), f, byte_width_, BIT_WIDTH_32); + } else { + return false; + } + } + + bool MutateFloat(double d) { + if (type_ == FBT_FLOAT) { + return MutateF(data_, d, parent_width_, WidthF(d)); + } else if (type_ == FBT_INDIRECT_FLOAT) { + return MutateF(Indirect(), d, byte_width_, WidthF(d)); + } else { + return false; + } + } + + bool MutateString(const char *str, size_t len) { + auto s = AsString(); + if (s.IsTheEmptyString()) return false; + // This is very strict, could allow shorter strings, but that creates + // garbage. + if (s.length() != len) return false; + memcpy(const_cast(s.c_str()), str, len); + return true; + } + bool MutateString(const char *str) { return MutateString(str, strlen(str)); } + bool MutateString(const std::string &str) { + return MutateString(str.data(), str.length()); + } + + private: + const uint8_t *Indirect() const { + return flexbuffers::Indirect(data_, parent_width_); + } + + template + bool Mutate(const uint8_t *dest, T t, size_t byte_width, + BitWidth value_width) { + auto fits = static_cast(static_cast(1U) << value_width) <= + byte_width; + if (fits) { + t = flatbuffers::EndianScalar(t); + memcpy(const_cast(dest), &t, byte_width); + } + return fits; + } + + template + bool MutateF(const uint8_t *dest, T t, size_t byte_width, + BitWidth value_width) { + if (byte_width == sizeof(double)) + return Mutate(dest, static_cast(t), byte_width, value_width); + if (byte_width == sizeof(float)) + return Mutate(dest, static_cast(t), byte_width, value_width); + FLATBUFFERS_ASSERT(false); + return false; + } + + const uint8_t *data_; + uint8_t parent_width_; + uint8_t byte_width_; + Type type_; +}; + +// Template specialization for As(). +template<> inline bool Reference::As() const { return AsBool(); } + +template<> inline int8_t Reference::As() const { return AsInt8(); } +template<> inline int16_t Reference::As() const { return AsInt16(); } +template<> inline int32_t Reference::As() const { return AsInt32(); } +template<> inline int64_t Reference::As() const { return AsInt64(); } + +template<> inline uint8_t Reference::As() const { return AsUInt8(); } +template<> inline uint16_t Reference::As() const { return AsUInt16(); } +template<> inline uint32_t Reference::As() const { return AsUInt32(); } +template<> inline uint64_t Reference::As() const { return AsUInt64(); } + +template<> inline double Reference::As() const { return AsDouble(); } +template<> inline float Reference::As() const { return AsFloat(); } + +template<> inline String Reference::As() const { return AsString(); } +template<> inline std::string Reference::As() const { + return AsString().str(); +} + +template<> inline Blob Reference::As() const { return AsBlob(); } +template<> inline Vector Reference::As() const { return AsVector(); } +template<> inline TypedVector Reference::As() const { + return AsTypedVector(); +} +template<> inline FixedTypedVector Reference::As() const { + return AsFixedTypedVector(); +} +template<> inline Map Reference::As() const { return AsMap(); } + +inline uint8_t PackedType(BitWidth bit_width, Type type) { + return static_cast(bit_width | (type << 2)); +} + +inline uint8_t NullPackedType() { return PackedType(BIT_WIDTH_8, FBT_NULL); } + +// Vector accessors. +// Note: if you try to access outside of bounds, you get a Null value back +// instead. Normally this would be an assert, but since this is "dynamically +// typed" data, you may not want that (someone sends you a 2d vector and you +// wanted 3d). +// The Null converts seamlessly into a default value for any other type. +// TODO(wvo): Could introduce an #ifdef that makes this into an assert? +inline Reference Vector::operator[](size_t i) const { + auto len = size(); + if (i >= len) return Reference(nullptr, 1, NullPackedType()); + auto packed_type = (data_ + len * byte_width_)[i]; + auto elem = data_ + i * byte_width_; + return Reference(elem, byte_width_, packed_type); +} + +inline Reference TypedVector::operator[](size_t i) const { + auto len = size(); + if (i >= len) return Reference(nullptr, 1, NullPackedType()); + auto elem = data_ + i * byte_width_; + return Reference(elem, byte_width_, 1, type_); +} + +inline Reference FixedTypedVector::operator[](size_t i) const { + if (i >= len_) return Reference(nullptr, 1, NullPackedType()); + auto elem = data_ + i * byte_width_; + return Reference(elem, byte_width_, 1, type_); +} + +template int KeyCompare(const void *key, const void *elem) { + auto str_elem = reinterpret_cast( + Indirect(reinterpret_cast(elem))); + auto skey = reinterpret_cast(key); + return strcmp(skey, str_elem); +} + +inline Reference Map::operator[](const char *key) const { + auto keys = Keys(); + // We can't pass keys.byte_width_ to the comparison function, so we have + // to pick the right one ahead of time. + int (*comp)(const void *, const void *) = nullptr; + switch (keys.byte_width_) { + case 1: comp = KeyCompare; break; + case 2: comp = KeyCompare; break; + case 4: comp = KeyCompare; break; + case 8: comp = KeyCompare; break; + } + auto res = std::bsearch(key, keys.data_, keys.size(), keys.byte_width_, comp); + if (!res) return Reference(nullptr, 1, NullPackedType()); + auto i = (reinterpret_cast(res) - keys.data_) / keys.byte_width_; + return (*static_cast(this))[i]; +} + +inline Reference Map::operator[](const std::string &key) const { + return (*this)[key.c_str()]; +} + +inline Reference GetRoot(const uint8_t *buffer, size_t size) { + // See Finish() below for the serialization counterpart of this. + // The root starts at the end of the buffer, so we parse backwards from there. + auto end = buffer + size; + auto byte_width = *--end; + auto packed_type = *--end; + end -= byte_width; // The root data item. + return Reference(end, byte_width, packed_type); +} + +inline Reference GetRoot(const std::vector &buffer) { + return GetRoot(flatbuffers::vector_data(buffer), buffer.size()); +} + +// Flags that configure how the Builder behaves. +// The "Share" flags determine if the Builder automatically tries to pool +// this type. Pooling can reduce the size of serialized data if there are +// multiple maps of the same kind, at the expense of slightly slower +// serialization (the cost of lookups) and more memory use (std::set). +// By default this is on for keys, but off for strings. +// Turn keys off if you have e.g. only one map. +// Turn strings on if you expect many non-unique string values. +// Additionally, sharing key vectors can save space if you have maps with +// identical field populations. +enum BuilderFlag { + BUILDER_FLAG_NONE = 0, + BUILDER_FLAG_SHARE_KEYS = 1, + BUILDER_FLAG_SHARE_STRINGS = 2, + BUILDER_FLAG_SHARE_KEYS_AND_STRINGS = 3, + BUILDER_FLAG_SHARE_KEY_VECTORS = 4, + BUILDER_FLAG_SHARE_ALL = 7, +}; + +class Builder FLATBUFFERS_FINAL_CLASS { + public: + Builder(size_t initial_size = 256, + BuilderFlag flags = BUILDER_FLAG_SHARE_KEYS) + : buf_(initial_size), + finished_(false), + flags_(flags), + force_min_bit_width_(BIT_WIDTH_8), + key_pool(KeyOffsetCompare(buf_)), + string_pool(StringOffsetCompare(buf_)) { + buf_.clear(); + } + + /// @brief Get the serialized buffer (after you call `Finish()`). + /// @return Returns a vector owned by this class. + const std::vector &GetBuffer() const { + Finished(); + return buf_; + } + + // Size of the buffer. Does not include unfinished values. + size_t GetSize() const { return buf_.size(); } + + // Reset all state so we can re-use the buffer. + void Clear() { + buf_.clear(); + stack_.clear(); + finished_ = false; + // flags_ remains as-is; + force_min_bit_width_ = BIT_WIDTH_8; + key_pool.clear(); + string_pool.clear(); + } + + // All value constructing functions below have two versions: one that + // takes a key (for placement inside a map) and one that doesn't (for inside + // vectors and elsewhere). + + void Null() { stack_.push_back(Value()); } + void Null(const char *key) { + Key(key); + Null(); + } + + void Int(int64_t i) { stack_.push_back(Value(i, FBT_INT, WidthI(i))); } + void Int(const char *key, int64_t i) { + Key(key); + Int(i); + } + + void UInt(uint64_t u) { stack_.push_back(Value(u, FBT_UINT, WidthU(u))); } + void UInt(const char *key, uint64_t u) { + Key(key); + UInt(u); + } + + void Float(float f) { stack_.push_back(Value(f)); } + void Float(const char *key, float f) { + Key(key); + Float(f); + } + + void Double(double f) { stack_.push_back(Value(f)); } + void Double(const char *key, double d) { + Key(key); + Double(d); + } + + void Bool(bool b) { stack_.push_back(Value(b)); } + void Bool(const char *key, bool b) { + Key(key); + Bool(b); + } + + void IndirectInt(int64_t i) { PushIndirect(i, FBT_INDIRECT_INT, WidthI(i)); } + void IndirectInt(const char *key, int64_t i) { + Key(key); + IndirectInt(i); + } + + void IndirectUInt(uint64_t u) { + PushIndirect(u, FBT_INDIRECT_UINT, WidthU(u)); + } + void IndirectUInt(const char *key, uint64_t u) { + Key(key); + IndirectUInt(u); + } + + void IndirectFloat(float f) { + PushIndirect(f, FBT_INDIRECT_FLOAT, BIT_WIDTH_32); + } + void IndirectFloat(const char *key, float f) { + Key(key); + IndirectFloat(f); + } + + void IndirectDouble(double f) { + PushIndirect(f, FBT_INDIRECT_FLOAT, WidthF(f)); + } + void IndirectDouble(const char *key, double d) { + Key(key); + IndirectDouble(d); + } + + size_t Key(const char *str, size_t len) { + auto sloc = buf_.size(); + WriteBytes(str, len + 1); + if (flags_ & BUILDER_FLAG_SHARE_KEYS) { + auto it = key_pool.find(sloc); + if (it != key_pool.end()) { + // Already in the buffer. Remove key we just serialized, and use + // existing offset instead. + buf_.resize(sloc); + sloc = *it; + } else { + key_pool.insert(sloc); + } + } + stack_.push_back(Value(static_cast(sloc), FBT_KEY, BIT_WIDTH_8)); + return sloc; + } + + size_t Key(const char *str) { return Key(str, strlen(str)); } + size_t Key(const std::string &str) { return Key(str.c_str(), str.size()); } + + size_t String(const char *str, size_t len) { + auto reset_to = buf_.size(); + auto sloc = CreateBlob(str, len, 1, FBT_STRING); + if (flags_ & BUILDER_FLAG_SHARE_STRINGS) { + StringOffset so(sloc, len); + auto it = string_pool.find(so); + if (it != string_pool.end()) { + // Already in the buffer. Remove string we just serialized, and use + // existing offset instead. + buf_.resize(reset_to); + sloc = it->first; + stack_.back().u_ = sloc; + } else { + string_pool.insert(so); + } + } + return sloc; + } + size_t String(const char *str) { return String(str, strlen(str)); } + size_t String(const std::string &str) { + return String(str.c_str(), str.size()); + } + void String(const flexbuffers::String &str) { + String(str.c_str(), str.length()); + } + + void String(const char *key, const char *str) { + Key(key); + String(str); + } + void String(const char *key, const std::string &str) { + Key(key); + String(str); + } + void String(const char *key, const flexbuffers::String &str) { + Key(key); + String(str); + } + + size_t Blob(const void *data, size_t len) { + return CreateBlob(data, len, 0, FBT_BLOB); + } + size_t Blob(const std::vector &v) { + return CreateBlob(flatbuffers::vector_data(v), v.size(), 0, FBT_BLOB); + } + + // TODO(wvo): support all the FlexBuffer types (like flexbuffers::String), + // e.g. Vector etc. Also in overloaded versions. + // Also some FlatBuffers types? + + size_t StartVector() { return stack_.size(); } + size_t StartVector(const char *key) { + Key(key); + return stack_.size(); + } + size_t StartMap() { return stack_.size(); } + size_t StartMap(const char *key) { + Key(key); + return stack_.size(); + } + + // TODO(wvo): allow this to specify an aligment greater than the natural + // alignment. + size_t EndVector(size_t start, bool typed, bool fixed) { + auto vec = CreateVector(start, stack_.size() - start, 1, typed, fixed); + // Remove temp elements and return vector. + stack_.resize(start); + stack_.push_back(vec); + return static_cast(vec.u_); + } + + size_t EndMap(size_t start) { + // We should have interleaved keys and values on the stack. + // Make sure it is an even number: + auto len = stack_.size() - start; + FLATBUFFERS_ASSERT(!(len & 1)); + len /= 2; + // Make sure keys are all strings: + for (auto key = start; key < stack_.size(); key += 2) { + FLATBUFFERS_ASSERT(stack_[key].type_ == FBT_KEY); + } + // Now sort values, so later we can do a binary seach lookup. + // We want to sort 2 array elements at a time. + struct TwoValue { + Value key; + Value val; + }; + // TODO(wvo): strict aliasing? + // TODO(wvo): allow the caller to indicate the data is already sorted + // for maximum efficiency? With an assert to check sortedness to make sure + // we're not breaking binary search. + // Or, we can track if the map is sorted as keys are added which would be + // be quite cheap (cheaper than checking it here), so we can skip this + // step automatically when appliccable, and encourage people to write in + // sorted fashion. + // std::sort is typically already a lot faster on sorted data though. + auto dict = + reinterpret_cast(flatbuffers::vector_data(stack_) + start); + std::sort(dict, dict + len, + [&](const TwoValue &a, const TwoValue &b) -> bool { + auto as = reinterpret_cast( + flatbuffers::vector_data(buf_) + a.key.u_); + auto bs = reinterpret_cast( + flatbuffers::vector_data(buf_) + b.key.u_); + auto comp = strcmp(as, bs); + // If this assertion hits, you've added two keys with the same + // value to this map. + // TODO: Have to check for pointer equality, as some sort + // implementation apparently call this function with the same + // element?? Why? + FLATBUFFERS_ASSERT(comp || &a == &b); + return comp < 0; + }); + // First create a vector out of all keys. + // TODO(wvo): if kBuilderFlagShareKeyVectors is true, see if we can share + // the first vector. + auto keys = CreateVector(start, len, 2, true, false); + auto vec = CreateVector(start + 1, len, 2, false, false, &keys); + // Remove temp elements and return map. + stack_.resize(start); + stack_.push_back(vec); + return static_cast(vec.u_); + } + + template size_t Vector(F f) { + auto start = StartVector(); + f(); + return EndVector(start, false, false); + } + template size_t Vector(F f, T &state) { + auto start = StartVector(); + f(state); + return EndVector(start, false, false); + } + template size_t Vector(const char *key, F f) { + auto start = StartVector(key); + f(); + return EndVector(start, false, false); + } + template + size_t Vector(const char *key, F f, T &state) { + auto start = StartVector(key); + f(state); + return EndVector(start, false, false); + } + + template void Vector(const T *elems, size_t len) { + if (flatbuffers::is_scalar::value) { + // This path should be a lot quicker and use less space. + ScalarVector(elems, len, false); + } else { + auto start = StartVector(); + for (size_t i = 0; i < len; i++) Add(elems[i]); + EndVector(start, false, false); + } + } + template + void Vector(const char *key, const T *elems, size_t len) { + Key(key); + Vector(elems, len); + } + template void Vector(const std::vector &vec) { + Vector(flatbuffers::vector_data(vec), vec.size()); + } + + template size_t TypedVector(F f) { + auto start = StartVector(); + f(); + return EndVector(start, true, false); + } + template size_t TypedVector(F f, T &state) { + auto start = StartVector(); + f(state); + return EndVector(start, true, false); + } + template size_t TypedVector(const char *key, F f) { + auto start = StartVector(key); + f(); + return EndVector(start, true, false); + } + template + size_t TypedVector(const char *key, F f, T &state) { + auto start = StartVector(key); + f(state); + return EndVector(start, true, false); + } + + template size_t FixedTypedVector(const T *elems, size_t len) { + // We only support a few fixed vector lengths. Anything bigger use a + // regular typed vector. + FLATBUFFERS_ASSERT(len >= 2 && len <= 4); + // And only scalar values. + static_assert(flatbuffers::is_scalar::value, "Unrelated types"); + return ScalarVector(elems, len, true); + } + + template + size_t FixedTypedVector(const char *key, const T *elems, size_t len) { + Key(key); + return FixedTypedVector(elems, len); + } + + template size_t Map(F f) { + auto start = StartMap(); + f(); + return EndMap(start); + } + template size_t Map(F f, T &state) { + auto start = StartMap(); + f(state); + return EndMap(start); + } + template size_t Map(const char *key, F f) { + auto start = StartMap(key); + f(); + return EndMap(start); + } + template size_t Map(const char *key, F f, T &state) { + auto start = StartMap(key); + f(state); + return EndMap(start); + } + template void Map(const std::map &map) { + auto start = StartMap(); + for (auto it = map.begin(); it != map.end(); ++it) + Add(it->first.c_str(), it->second); + EndMap(start); + } + + // Overloaded Add that tries to call the correct function above. + void Add(int8_t i) { Int(i); } + void Add(int16_t i) { Int(i); } + void Add(int32_t i) { Int(i); } + void Add(int64_t i) { Int(i); } + void Add(uint8_t u) { UInt(u); } + void Add(uint16_t u) { UInt(u); } + void Add(uint32_t u) { UInt(u); } + void Add(uint64_t u) { UInt(u); } + void Add(float f) { Float(f); } + void Add(double d) { Double(d); } + void Add(bool b) { Bool(b); } + void Add(const char *str) { String(str); } + void Add(const std::string &str) { String(str); } + void Add(const flexbuffers::String &str) { String(str); } + + template void Add(const std::vector &vec) { Vector(vec); } + + template void Add(const char *key, const T &t) { + Key(key); + Add(t); + } + + template void Add(const std::map &map) { + Map(map); + } + + template void operator+=(const T &t) { Add(t); } + + // This function is useful in combination with the Mutate* functions above. + // It forces elements of vectors and maps to have a minimum size, such that + // they can later be updated without failing. + // Call with no arguments to reset. + void ForceMinimumBitWidth(BitWidth bw = BIT_WIDTH_8) { + force_min_bit_width_ = bw; + } + + void Finish() { + // If you hit this assert, you likely have objects that were never included + // in a parent. You need to have exactly one root to finish a buffer. + // Check your Start/End calls are matched, and all objects are inside + // some other object. + FLATBUFFERS_ASSERT(stack_.size() == 1); + + // Write root value. + auto byte_width = Align(stack_[0].ElemWidth(buf_.size(), 0)); + WriteAny(stack_[0], byte_width); + // Write root type. + Write(stack_[0].StoredPackedType(), 1); + // Write root size. Normally determined by parent, but root has no parent :) + Write(byte_width, 1); + + finished_ = true; + } + + private: + void Finished() const { + // If you get this assert, you're attempting to get access a buffer + // which hasn't been finished yet. Be sure to call + // Builder::Finish with your root object. + FLATBUFFERS_ASSERT(finished_); + } + + // Align to prepare for writing a scalar with a certain size. + uint8_t Align(BitWidth alignment) { + auto byte_width = 1U << alignment; + buf_.insert(buf_.end(), flatbuffers::PaddingBytes(buf_.size(), byte_width), + 0); + return static_cast(byte_width); + } + + void WriteBytes(const void *val, size_t size) { + buf_.insert(buf_.end(), reinterpret_cast(val), + reinterpret_cast(val) + size); + } + + template void Write(T val, size_t byte_width) { + FLATBUFFERS_ASSERT(sizeof(T) >= byte_width); + val = flatbuffers::EndianScalar(val); + WriteBytes(&val, byte_width); + } + + void WriteDouble(double f, uint8_t byte_width) { + switch (byte_width) { + case 8: Write(f, byte_width); break; + case 4: Write(static_cast(f), byte_width); break; + // case 2: Write(static_cast(f), byte_width); break; + // case 1: Write(static_cast(f), byte_width); break; + default: FLATBUFFERS_ASSERT(0); + } + } + + void WriteOffset(uint64_t o, uint8_t byte_width) { + auto reloff = buf_.size() - o; + FLATBUFFERS_ASSERT(byte_width == 8 || reloff < 1ULL << (byte_width * 8)); + Write(reloff, byte_width); + } + + template void PushIndirect(T val, Type type, BitWidth bit_width) { + auto byte_width = Align(bit_width); + auto iloc = buf_.size(); + Write(val, byte_width); + stack_.push_back(Value(static_cast(iloc), type, bit_width)); + } + + static BitWidth WidthB(size_t byte_width) { + switch (byte_width) { + case 1: return BIT_WIDTH_8; + case 2: return BIT_WIDTH_16; + case 4: return BIT_WIDTH_32; + case 8: return BIT_WIDTH_64; + default: FLATBUFFERS_ASSERT(false); return BIT_WIDTH_64; + } + } + + template static Type GetScalarType() { + static_assert(flatbuffers::is_scalar::value, "Unrelated types"); + return flatbuffers::is_floating_point::value + ? FBT_FLOAT + : flatbuffers::is_same::value + ? FBT_BOOL + : (flatbuffers::is_unsigned::value ? FBT_UINT + : FBT_INT); + } + + struct Value { + union { + int64_t i_; + uint64_t u_; + double f_; + }; + + Type type_; + + // For scalars: of itself, for vector: of its elements, for string: length. + BitWidth min_bit_width_; + + Value() : i_(0), type_(FBT_NULL), min_bit_width_(BIT_WIDTH_8) {} + + Value(bool b) + : u_(static_cast(b)), + type_(FBT_BOOL), + min_bit_width_(BIT_WIDTH_8) {} + + Value(int64_t i, Type t, BitWidth bw) + : i_(i), type_(t), min_bit_width_(bw) {} + Value(uint64_t u, Type t, BitWidth bw) + : u_(u), type_(t), min_bit_width_(bw) {} + + Value(float f) : f_(f), type_(FBT_FLOAT), min_bit_width_(BIT_WIDTH_32) {} + Value(double f) : f_(f), type_(FBT_FLOAT), min_bit_width_(WidthF(f)) {} + + uint8_t StoredPackedType(BitWidth parent_bit_width_ = BIT_WIDTH_8) const { + return PackedType(StoredWidth(parent_bit_width_), type_); + } + + BitWidth ElemWidth(size_t buf_size, size_t elem_index) const { + if (IsInline(type_)) { + return min_bit_width_; + } else { + // We have an absolute offset, but want to store a relative offset + // elem_index elements beyond the current buffer end. Since whether + // the relative offset fits in a certain byte_width depends on + // the size of the elements before it (and their alignment), we have + // to test for each size in turn. + for (size_t byte_width = 1; + byte_width <= sizeof(flatbuffers::largest_scalar_t); + byte_width *= 2) { + // Where are we going to write this offset? + auto offset_loc = buf_size + + flatbuffers::PaddingBytes(buf_size, byte_width) + + elem_index * byte_width; + // Compute relative offset. + auto offset = offset_loc - u_; + // Does it fit? + auto bit_width = WidthU(offset); + if (static_cast(static_cast(1U) << bit_width) == + byte_width) + return bit_width; + } + FLATBUFFERS_ASSERT(false); // Must match one of the sizes above. + return BIT_WIDTH_64; + } + } + + BitWidth StoredWidth(BitWidth parent_bit_width_ = BIT_WIDTH_8) const { + if (IsInline(type_)) { + return (std::max)(min_bit_width_, parent_bit_width_); + } else { + return min_bit_width_; + } + } + }; + + void WriteAny(const Value &val, uint8_t byte_width) { + switch (val.type_) { + case FBT_NULL: + case FBT_INT: Write(val.i_, byte_width); break; + case FBT_BOOL: + case FBT_UINT: Write(val.u_, byte_width); break; + case FBT_FLOAT: WriteDouble(val.f_, byte_width); break; + default: WriteOffset(val.u_, byte_width); break; + } + } + + size_t CreateBlob(const void *data, size_t len, size_t trailing, Type type) { + auto bit_width = WidthU(len); + auto byte_width = Align(bit_width); + Write(len, byte_width); + auto sloc = buf_.size(); + WriteBytes(data, len + trailing); + stack_.push_back(Value(static_cast(sloc), type, bit_width)); + return sloc; + } + + template + size_t ScalarVector(const T *elems, size_t len, bool fixed) { + auto vector_type = GetScalarType(); + auto byte_width = sizeof(T); + auto bit_width = WidthB(byte_width); + // If you get this assert, you're trying to write a vector with a size + // field that is bigger than the scalars you're trying to write (e.g. a + // byte vector > 255 elements). For such types, write a "blob" instead. + // TODO: instead of asserting, could write vector with larger elements + // instead, though that would be wasteful. + FLATBUFFERS_ASSERT(WidthU(len) <= bit_width); + if (!fixed) Write(len, byte_width); + auto vloc = buf_.size(); + for (size_t i = 0; i < len; i++) Write(elems[i], byte_width); + stack_.push_back(Value(static_cast(vloc), + ToTypedVector(vector_type, fixed ? len : 0), + bit_width)); + return vloc; + } + + Value CreateVector(size_t start, size_t vec_len, size_t step, bool typed, + bool fixed, const Value *keys = nullptr) { + FLATBUFFERS_ASSERT(!fixed || typed); // typed=false, fixed=true combination is not supported. + // Figure out smallest bit width we can store this vector with. + auto bit_width = (std::max)(force_min_bit_width_, WidthU(vec_len)); + auto prefix_elems = 1; + if (keys) { + // If this vector is part of a map, we will pre-fix an offset to the keys + // to this vector. + bit_width = (std::max)(bit_width, keys->ElemWidth(buf_.size(), 0)); + prefix_elems += 2; + } + Type vector_type = FBT_KEY; + // Check bit widths and types for all elements. + for (size_t i = start; i < stack_.size(); i += step) { + auto elem_width = stack_[i].ElemWidth(buf_.size(), i + prefix_elems); + bit_width = (std::max)(bit_width, elem_width); + if (typed) { + if (i == start) { + vector_type = stack_[i].type_; + } else { + // If you get this assert, you are writing a typed vector with + // elements that are not all the same type. + FLATBUFFERS_ASSERT(vector_type == stack_[i].type_); + } + } + } + // If you get this assert, your fixed types are not one of: + // Int / UInt / Float / Key. + FLATBUFFERS_ASSERT(!fixed || IsTypedVectorElementType(vector_type)); + auto byte_width = Align(bit_width); + // Write vector. First the keys width/offset if available, and size. + if (keys) { + WriteOffset(keys->u_, byte_width); + Write(1ULL << keys->min_bit_width_, byte_width); + } + if (!fixed) Write(vec_len, byte_width); + // Then the actual data. + auto vloc = buf_.size(); + for (size_t i = start; i < stack_.size(); i += step) { + WriteAny(stack_[i], byte_width); + } + // Then the types. + if (!typed) { + for (size_t i = start; i < stack_.size(); i += step) { + buf_.push_back(stack_[i].StoredPackedType(bit_width)); + } + } + return Value(static_cast(vloc), + keys ? FBT_MAP + : (typed ? ToTypedVector(vector_type, fixed ? vec_len : 0) + : FBT_VECTOR), + bit_width); + } + + // You shouldn't really be copying instances of this class. + Builder(const Builder &); + Builder &operator=(const Builder &); + + std::vector buf_; + std::vector stack_; + + bool finished_; + + BuilderFlag flags_; + + BitWidth force_min_bit_width_; + + struct KeyOffsetCompare { + explicit KeyOffsetCompare(const std::vector &buf) : buf_(&buf) {} + bool operator()(size_t a, size_t b) const { + auto stra = + reinterpret_cast(flatbuffers::vector_data(*buf_) + a); + auto strb = + reinterpret_cast(flatbuffers::vector_data(*buf_) + b); + return strcmp(stra, strb) < 0; + } + const std::vector *buf_; + }; + + typedef std::pair StringOffset; + struct StringOffsetCompare { + explicit StringOffsetCompare(const std::vector &buf) : buf_(&buf) {} + bool operator()(const StringOffset &a, const StringOffset &b) const { + auto stra = reinterpret_cast( + flatbuffers::vector_data(*buf_) + a.first); + auto strb = reinterpret_cast( + flatbuffers::vector_data(*buf_) + b.first); + return strncmp(stra, strb, (std::min)(a.second, b.second) + 1) < 0; + } + const std::vector *buf_; + }; + + typedef std::set KeyOffsetMap; + typedef std::set StringOffsetMap; + + KeyOffsetMap key_pool; + StringOffsetMap string_pool; +}; + +} // namespace flexbuffers + +# if defined(_MSC_VER) +# pragma warning(pop) +# endif + +#endif // FLATBUFFERS_FLEXBUFFERS_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/grpc.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/grpc.h new file mode 100644 index 000000000..a75b67c77 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/grpc.h @@ -0,0 +1,328 @@ +/* + * Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_GRPC_H_ +#define FLATBUFFERS_GRPC_H_ + +// Helper functionality to glue FlatBuffers and GRPC. + +#include "flatbuffers/flatbuffers.h" +#include "grpc++/support/byte_buffer.h" +#include "grpc/byte_buffer_reader.h" + +namespace flatbuffers { +namespace grpc { + +// Message is a typed wrapper around a buffer that manages the underlying +// `grpc_slice` and also provides flatbuffers-specific helpers such as `Verify` +// and `GetRoot`. Since it is backed by a `grpc_slice`, the underlying buffer +// is refcounted and ownership is be managed automatically. +template class Message { + public: + Message() : slice_(grpc_empty_slice()) {} + + Message(grpc_slice slice, bool add_ref) + : slice_(add_ref ? grpc_slice_ref(slice) : slice) {} + + Message &operator=(const Message &other) = delete; + + Message(Message &&other) : slice_(other.slice_) { + other.slice_ = grpc_empty_slice(); + } + + Message(const Message &other) = delete; + + Message &operator=(Message &&other) { + grpc_slice_unref(slice_); + slice_ = other.slice_; + other.slice_ = grpc_empty_slice(); + return *this; + } + + ~Message() { grpc_slice_unref(slice_); } + + const uint8_t *mutable_data() const { return GRPC_SLICE_START_PTR(slice_); } + + const uint8_t *data() const { return GRPC_SLICE_START_PTR(slice_); } + + size_t size() const { return GRPC_SLICE_LENGTH(slice_); } + + bool Verify() const { + Verifier verifier(data(), size()); + return verifier.VerifyBuffer(nullptr); + } + + T *GetMutableRoot() { return flatbuffers::GetMutableRoot(mutable_data()); } + + const T *GetRoot() const { return flatbuffers::GetRoot(data()); } + + // This is only intended for serializer use, or if you know what you're doing + const grpc_slice &BorrowSlice() const { return slice_; } + + private: + grpc_slice slice_; +}; + +class MessageBuilder; + +// SliceAllocator is a gRPC-specific allocator that uses the `grpc_slice` +// refcounted slices to manage memory ownership. This makes it easy and +// efficient to transfer buffers to gRPC. +class SliceAllocator : public Allocator { + public: + SliceAllocator() : slice_(grpc_empty_slice()) {} + + SliceAllocator(const SliceAllocator &other) = delete; + SliceAllocator &operator=(const SliceAllocator &other) = delete; + + SliceAllocator(SliceAllocator &&other) + : slice_(grpc_empty_slice()) { + // default-construct and swap idiom + swap(other); + } + + SliceAllocator &operator=(SliceAllocator &&other) { + // move-construct and swap idiom + SliceAllocator temp(std::move(other)); + swap(temp); + return *this; + } + + void swap(SliceAllocator &other) { + using std::swap; + swap(slice_, other.slice_); + } + + virtual ~SliceAllocator() { grpc_slice_unref(slice_); } + + virtual uint8_t *allocate(size_t size) override { + FLATBUFFERS_ASSERT(GRPC_SLICE_IS_EMPTY(slice_)); + slice_ = grpc_slice_malloc(size); + return GRPC_SLICE_START_PTR(slice_); + } + + virtual void deallocate(uint8_t *p, size_t size) override { + FLATBUFFERS_ASSERT(p == GRPC_SLICE_START_PTR(slice_)); + FLATBUFFERS_ASSERT(size == GRPC_SLICE_LENGTH(slice_)); + grpc_slice_unref(slice_); + slice_ = grpc_empty_slice(); + } + + virtual uint8_t *reallocate_downward(uint8_t *old_p, size_t old_size, + size_t new_size, size_t in_use_back, + size_t in_use_front) override { + FLATBUFFERS_ASSERT(old_p == GRPC_SLICE_START_PTR(slice_)); + FLATBUFFERS_ASSERT(old_size == GRPC_SLICE_LENGTH(slice_)); + FLATBUFFERS_ASSERT(new_size > old_size); + grpc_slice old_slice = slice_; + grpc_slice new_slice = grpc_slice_malloc(new_size); + uint8_t *new_p = GRPC_SLICE_START_PTR(new_slice); + memcpy_downward(old_p, old_size, new_p, new_size, in_use_back, + in_use_front); + slice_ = new_slice; + grpc_slice_unref(old_slice); + return new_p; + } + + private: + grpc_slice &get_slice(uint8_t *p, size_t size) { + FLATBUFFERS_ASSERT(p == GRPC_SLICE_START_PTR(slice_)); + FLATBUFFERS_ASSERT(size == GRPC_SLICE_LENGTH(slice_)); + return slice_; + } + + grpc_slice slice_; + + friend class MessageBuilder; +}; + +// SliceAllocatorMember is a hack to ensure that the MessageBuilder's +// slice_allocator_ member is constructed before the FlatBufferBuilder, since +// the allocator is used in the FlatBufferBuilder ctor. +namespace detail { +struct SliceAllocatorMember { + SliceAllocator slice_allocator_; +}; +} // namespace detail + +// MessageBuilder is a gRPC-specific FlatBufferBuilder that uses SliceAllocator +// to allocate gRPC buffers. +class MessageBuilder : private detail::SliceAllocatorMember, + public FlatBufferBuilder { + public: + explicit MessageBuilder(uoffset_t initial_size = 1024) + : FlatBufferBuilder(initial_size, &slice_allocator_, false) {} + + MessageBuilder(const MessageBuilder &other) = delete; + MessageBuilder &operator=(const MessageBuilder &other) = delete; + + MessageBuilder(MessageBuilder &&other) + : FlatBufferBuilder(1024, &slice_allocator_, false) { + // Default construct and swap idiom. + Swap(other); + } + + /// Create a MessageBuilder from a FlatBufferBuilder. + explicit MessageBuilder(FlatBufferBuilder &&src, void (*dealloc)(void*, size_t) = &DefaultAllocator::dealloc) + : FlatBufferBuilder(1024, &slice_allocator_, false) { + src.Swap(*this); + src.SwapBufAllocator(*this); + if (buf_.capacity()) { + uint8_t *buf = buf_.scratch_data(); // pointer to memory + size_t capacity = buf_.capacity(); // size of memory + slice_allocator_.slice_ = grpc_slice_new_with_len(buf, capacity, dealloc); + } + else { + slice_allocator_.slice_ = grpc_empty_slice(); + } + } + + /// Move-assign a FlatBufferBuilder to a MessageBuilder. + /// Only FlatBufferBuilder with default allocator (basically, nullptr) is supported. + MessageBuilder &operator=(FlatBufferBuilder &&src) { + // Move construct a temporary and swap + MessageBuilder temp(std::move(src)); + Swap(temp); + return *this; + } + + MessageBuilder &operator=(MessageBuilder &&other) { + // Move construct a temporary and swap + MessageBuilder temp(std::move(other)); + Swap(temp); + return *this; + } + + void Swap(MessageBuilder &other) { + slice_allocator_.swap(other.slice_allocator_); + FlatBufferBuilder::Swap(other); + // After swapping the FlatBufferBuilder, we swap back the allocator, which restores + // the original allocator back in place. This is necessary because MessageBuilder's + // allocator is its own member (SliceAllocatorMember). The allocator passed to + // FlatBufferBuilder::vector_downward must point to this member. + buf_.swap_allocator(other.buf_); + } + + // Releases the ownership of the buffer pointer. + // Returns the size, offset, and the original grpc_slice that + // allocated the buffer. Also see grpc_slice_unref(). + uint8_t *ReleaseRaw(size_t &size, size_t &offset, grpc_slice &slice) { + uint8_t *buf = FlatBufferBuilder::ReleaseRaw(size, offset); + slice = slice_allocator_.slice_; + slice_allocator_.slice_ = grpc_empty_slice(); + return buf; + } + + ~MessageBuilder() {} + + // GetMessage extracts the subslice of the buffer corresponding to the + // flatbuffers-encoded region and wraps it in a `Message` to handle buffer + // ownership. + template Message GetMessage() { + auto buf_data = buf_.scratch_data(); // pointer to memory + auto buf_size = buf_.capacity(); // size of memory + auto msg_data = buf_.data(); // pointer to msg + auto msg_size = buf_.size(); // size of msg + // Do some sanity checks on data/size + FLATBUFFERS_ASSERT(msg_data); + FLATBUFFERS_ASSERT(msg_size); + FLATBUFFERS_ASSERT(msg_data >= buf_data); + FLATBUFFERS_ASSERT(msg_data + msg_size <= buf_data + buf_size); + // Calculate offsets from the buffer start + auto begin = msg_data - buf_data; + auto end = begin + msg_size; + // Get the slice we are working with (no refcount change) + grpc_slice slice = slice_allocator_.get_slice(buf_data, buf_size); + // Extract a subslice of the existing slice (increment refcount) + grpc_slice subslice = grpc_slice_sub(slice, begin, end); + // Wrap the subslice in a `Message`, but don't increment refcount + Message msg(subslice, false); + return msg; + } + + template Message ReleaseMessage() { + Message msg = GetMessage(); + Reset(); + return msg; + } + + private: + // SliceAllocator slice_allocator_; // part of SliceAllocatorMember +}; + +} // namespace grpc +} // namespace flatbuffers + +namespace grpc { + +template class SerializationTraits> { + public: + static grpc::Status Serialize(const flatbuffers::grpc::Message &msg, + grpc_byte_buffer **buffer, bool *own_buffer) { + // We are passed in a `Message`, which is a wrapper around a + // `grpc_slice`. We extract it here using `BorrowSlice()`. The const cast + // is necesary because the `grpc_raw_byte_buffer_create` func expects + // non-const slices in order to increment their refcounts. + grpc_slice *slice = const_cast(&msg.BorrowSlice()); + // Now use `grpc_raw_byte_buffer_create` to package the single slice into a + // `grpc_byte_buffer`, incrementing the refcount in the process. + *buffer = grpc_raw_byte_buffer_create(slice, 1); + *own_buffer = true; + return grpc::Status::OK; + } + + // Deserialize by pulling the + static grpc::Status Deserialize(grpc_byte_buffer *buffer, + flatbuffers::grpc::Message *msg) { + if (!buffer) { + return ::grpc::Status(::grpc::StatusCode::INTERNAL, "No payload"); + } + // Check if this is a single uncompressed slice. + if ((buffer->type == GRPC_BB_RAW) && + (buffer->data.raw.compression == GRPC_COMPRESS_NONE) && + (buffer->data.raw.slice_buffer.count == 1)) { + // If it is, then we can reference the `grpc_slice` directly. + grpc_slice slice = buffer->data.raw.slice_buffer.slices[0]; + // We wrap a `Message` around the slice, incrementing the refcount. + *msg = flatbuffers::grpc::Message(slice, true); + } else { + // Otherwise, we need to use `grpc_byte_buffer_reader_readall` to read + // `buffer` into a single contiguous `grpc_slice`. The gRPC reader gives + // us back a new slice with the refcount already incremented. + grpc_byte_buffer_reader reader; + grpc_byte_buffer_reader_init(&reader, buffer); + grpc_slice slice = grpc_byte_buffer_reader_readall(&reader); + grpc_byte_buffer_reader_destroy(&reader); + // We wrap a `Message` around the slice, but dont increment refcount + *msg = flatbuffers::grpc::Message(slice, false); + } + grpc_byte_buffer_destroy(buffer); +#if FLATBUFFERS_GRPC_DISABLE_AUTO_VERIFICATION + return ::grpc::Status::OK; +#else + if (msg->Verify()) { + return ::grpc::Status::OK; + } else { + return ::grpc::Status(::grpc::StatusCode::INTERNAL, + "Message verification failed"); + } +#endif + } +}; + +} // namespace grpc + +#endif // FLATBUFFERS_GRPC_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/hash.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/hash.h new file mode 100644 index 000000000..16536cb49 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/hash.h @@ -0,0 +1,127 @@ +/* + * Copyright 2015 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_HASH_H_ +#define FLATBUFFERS_HASH_H_ + +#include +#include + +#include "flatbuffers/flatbuffers.h" + +namespace flatbuffers { + +template struct FnvTraits { + static const T kFnvPrime; + static const T kOffsetBasis; +}; + +template<> struct FnvTraits { + static const uint32_t kFnvPrime = 0x01000193; + static const uint32_t kOffsetBasis = 0x811C9DC5; +}; + +template<> struct FnvTraits { + static const uint64_t kFnvPrime = 0x00000100000001b3ULL; + static const uint64_t kOffsetBasis = 0xcbf29ce484222645ULL; +}; + +template T HashFnv1(const char *input) { + T hash = FnvTraits::kOffsetBasis; + for (const char *c = input; *c; ++c) { + hash *= FnvTraits::kFnvPrime; + hash ^= static_cast(*c); + } + return hash; +} + +template T HashFnv1a(const char *input) { + T hash = FnvTraits::kOffsetBasis; + for (const char *c = input; *c; ++c) { + hash ^= static_cast(*c); + hash *= FnvTraits::kFnvPrime; + } + return hash; +} + +template <> inline uint16_t HashFnv1(const char *input) { + uint32_t hash = HashFnv1(input); + return (hash >> 16) ^ (hash & 0xffff); +} + +template <> inline uint16_t HashFnv1a(const char *input) { + uint32_t hash = HashFnv1a(input); + return (hash >> 16) ^ (hash & 0xffff); +} + +template struct NamedHashFunction { + const char *name; + + typedef T (*HashFunction)(const char *); + HashFunction function; +}; + +const NamedHashFunction kHashFunctions16[] = { + { "fnv1_16", HashFnv1 }, + { "fnv1a_16", HashFnv1a }, +}; + +const NamedHashFunction kHashFunctions32[] = { + { "fnv1_32", HashFnv1 }, + { "fnv1a_32", HashFnv1a }, +}; + +const NamedHashFunction kHashFunctions64[] = { + { "fnv1_64", HashFnv1 }, + { "fnv1a_64", HashFnv1a }, +}; + +inline NamedHashFunction::HashFunction FindHashFunction16( + const char *name) { + std::size_t size = sizeof(kHashFunctions16) / sizeof(kHashFunctions16[0]); + for (std::size_t i = 0; i < size; ++i) { + if (std::strcmp(name, kHashFunctions16[i].name) == 0) { + return kHashFunctions16[i].function; + } + } + return nullptr; +} + +inline NamedHashFunction::HashFunction FindHashFunction32( + const char *name) { + std::size_t size = sizeof(kHashFunctions32) / sizeof(kHashFunctions32[0]); + for (std::size_t i = 0; i < size; ++i) { + if (std::strcmp(name, kHashFunctions32[i].name) == 0) { + return kHashFunctions32[i].function; + } + } + return nullptr; +} + +inline NamedHashFunction::HashFunction FindHashFunction64( + const char *name) { + std::size_t size = sizeof(kHashFunctions64) / sizeof(kHashFunctions64[0]); + for (std::size_t i = 0; i < size; ++i) { + if (std::strcmp(name, kHashFunctions64[i].name) == 0) { + return kHashFunctions64[i].function; + } + } + return nullptr; +} + +} // namespace flatbuffers + +#endif // FLATBUFFERS_HASH_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/idl.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/idl.h new file mode 100644 index 000000000..8299fe0cf --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/idl.h @@ -0,0 +1,995 @@ +/* + * Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_IDL_H_ +#define FLATBUFFERS_IDL_H_ + +#include +#include +#include + +#include "flatbuffers/base.h" +#include "flatbuffers/flatbuffers.h" +#include "flatbuffers/flexbuffers.h" +#include "flatbuffers/hash.h" +#include "flatbuffers/reflection.h" + +#if !defined(FLATBUFFERS_CPP98_STL) +# include +#endif // !defined(FLATBUFFERS_CPP98_STL) + +// This file defines the data types representing a parsed IDL (Interface +// Definition Language) / schema file. + +// Limits maximum depth of nested objects. +// Prevents stack overflow while parse flatbuffers or json. +#if !defined(FLATBUFFERS_MAX_PARSING_DEPTH) +# define FLATBUFFERS_MAX_PARSING_DEPTH 64 +#endif + +namespace flatbuffers { + +// The order of these matters for Is*() functions below. +// Additionally, Parser::ParseType assumes bool..string is a contiguous range +// of type tokens. +// clang-format off +#define FLATBUFFERS_GEN_TYPES_SCALAR(TD) \ + TD(NONE, "", uint8_t, byte, byte, byte, uint8, u8) \ + TD(UTYPE, "", uint8_t, byte, byte, byte, uint8, u8) /* begin scalar/int */ \ + TD(BOOL, "bool", uint8_t, boolean,bool, bool, bool, bool) \ + TD(CHAR, "byte", int8_t, byte, int8, sbyte, int8, i8) \ + TD(UCHAR, "ubyte", uint8_t, byte, byte, byte, uint8, u8) \ + TD(SHORT, "short", int16_t, short, int16, short, int16, i16) \ + TD(USHORT, "ushort", uint16_t, short, uint16, ushort, uint16, u16) \ + TD(INT, "int", int32_t, int, int32, int, int32, i32) \ + TD(UINT, "uint", uint32_t, int, uint32, uint, uint32, u32) \ + TD(LONG, "long", int64_t, long, int64, long, int64, i64) \ + TD(ULONG, "ulong", uint64_t, long, uint64, ulong, uint64, u64) /* end int */ \ + TD(FLOAT, "float", float, float, float32, float, float32, f32) /* begin float */ \ + TD(DOUBLE, "double", double, double, float64, double, float64, f64) /* end float/scalar */ +#define FLATBUFFERS_GEN_TYPES_POINTER(TD) \ + TD(STRING, "string", Offset, int, int, StringOffset, int, unused) \ + TD(VECTOR, "", Offset, int, int, VectorOffset, int, unused) \ + TD(STRUCT, "", Offset, int, int, int, int, unused) \ + TD(UNION, "", Offset, int, int, int, int, unused) + +// The fields are: +// - enum +// - FlatBuffers schema type. +// - C++ type. +// - Java type. +// - Go type. +// - C# / .Net type. +// - Python type. +// - Rust type. + +// using these macros, we can now write code dealing with types just once, e.g. + +/* +switch (type) { + #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \ + RTYPE) \ + case BASE_TYPE_ ## ENUM: \ + // do something specific to CTYPE here + FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) + #undef FLATBUFFERS_TD +} +*/ + +#define FLATBUFFERS_GEN_TYPES(TD) \ + FLATBUFFERS_GEN_TYPES_SCALAR(TD) \ + FLATBUFFERS_GEN_TYPES_POINTER(TD) + +// Create an enum for all the types above. +#ifdef __GNUC__ +__extension__ // Stop GCC complaining about trailing comma with -Wpendantic. +#endif +enum BaseType { + #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \ + RTYPE) \ + BASE_TYPE_ ## ENUM, + FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) + #undef FLATBUFFERS_TD +}; + +#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \ + RTYPE) \ + static_assert(sizeof(CTYPE) <= sizeof(largest_scalar_t), \ + "define largest_scalar_t as " #CTYPE); + FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) +#undef FLATBUFFERS_TD + +inline bool IsScalar (BaseType t) { return t >= BASE_TYPE_UTYPE && + t <= BASE_TYPE_DOUBLE; } +inline bool IsInteger(BaseType t) { return t >= BASE_TYPE_UTYPE && + t <= BASE_TYPE_ULONG; } +inline bool IsFloat (BaseType t) { return t == BASE_TYPE_FLOAT || + t == BASE_TYPE_DOUBLE; } +inline bool IsLong (BaseType t) { return t == BASE_TYPE_LONG || + t == BASE_TYPE_ULONG; } +inline bool IsBool (BaseType t) { return t == BASE_TYPE_BOOL; } +inline bool IsOneByte(BaseType t) { return t >= BASE_TYPE_UTYPE && + t <= BASE_TYPE_UCHAR; } +// clang-format on + +extern const char *const kTypeNames[]; +extern const char kTypeSizes[]; + +inline size_t SizeOf(BaseType t) { return kTypeSizes[t]; } + +struct StructDef; +struct EnumDef; +class Parser; + +// Represents any type in the IDL, which is a combination of the BaseType +// and additional information for vectors/structs_. +struct Type { + explicit Type(BaseType _base_type = BASE_TYPE_NONE, StructDef *_sd = nullptr, + EnumDef *_ed = nullptr) + : base_type(_base_type), + element(BASE_TYPE_NONE), + struct_def(_sd), + enum_def(_ed) {} + + bool operator==(const Type &o) { + return base_type == o.base_type && element == o.element && + struct_def == o.struct_def && enum_def == o.enum_def; + } + + Type VectorType() const { return Type(element, struct_def, enum_def); } + + Offset Serialize(FlatBufferBuilder *builder) const; + + bool Deserialize(const Parser &parser, const reflection::Type *type); + + BaseType base_type; + BaseType element; // only set if t == BASE_TYPE_VECTOR + StructDef *struct_def; // only set if t or element == BASE_TYPE_STRUCT + EnumDef *enum_def; // set if t == BASE_TYPE_UNION / BASE_TYPE_UTYPE, + // or for an integral type derived from an enum. +}; + +// Represents a parsed scalar value, it's type, and field offset. +struct Value { + Value() + : constant("0"), + offset(static_cast(~(static_cast(0U)))) {} + Type type; + std::string constant; + voffset_t offset; +}; + +// Helper class that retains the original order of a set of identifiers and +// also provides quick lookup. +template class SymbolTable { + public: + ~SymbolTable() { + for (auto it = vec.begin(); it != vec.end(); ++it) { delete *it; } + } + + bool Add(const std::string &name, T *e) { + vector_emplace_back(&vec, e); + auto it = dict.find(name); + if (it != dict.end()) return true; + dict[name] = e; + return false; + } + + void Move(const std::string &oldname, const std::string &newname) { + auto it = dict.find(oldname); + if (it != dict.end()) { + auto obj = it->second; + dict.erase(it); + dict[newname] = obj; + } else { + FLATBUFFERS_ASSERT(false); + } + } + + T *Lookup(const std::string &name) const { + auto it = dict.find(name); + return it == dict.end() ? nullptr : it->second; + } + + public: + std::map dict; // quick lookup + std::vector vec; // Used to iterate in order of insertion +}; + +// A name space, as set in the schema. +struct Namespace { + Namespace() : from_table(0) {} + + // Given a (potentally unqualified) name, return the "fully qualified" name + // which has a full namespaced descriptor. + // With max_components you can request less than the number of components + // the current namespace has. + std::string GetFullyQualifiedName(const std::string &name, + size_t max_components = 1000) const; + + std::vector components; + size_t from_table; // Part of the namespace corresponds to a message/table. +}; + +// Base class for all definition types (fields, structs_, enums_). +struct Definition { + Definition() + : generated(false), + defined_namespace(nullptr), + serialized_location(0), + index(-1), + refcount(1) {} + + flatbuffers::Offset< + flatbuffers::Vector>> + SerializeAttributes(FlatBufferBuilder *builder, const Parser &parser) const; + + bool DeserializeAttributes(Parser &parser, + const Vector> *attrs); + + std::string name; + std::string file; + std::vector doc_comment; + SymbolTable attributes; + bool generated; // did we already output code for this definition? + Namespace *defined_namespace; // Where it was defined. + + // For use with Serialize() + uoffset_t serialized_location; + int index; // Inside the vector it is stored. + int refcount; +}; + +struct FieldDef : public Definition { + FieldDef() + : deprecated(false), + required(false), + key(false), + shared(false), + native_inline(false), + flexbuffer(false), + nested_flatbuffer(NULL), + padding(0) {} + + Offset Serialize(FlatBufferBuilder *builder, uint16_t id, + const Parser &parser) const; + + bool Deserialize(Parser &parser, const reflection::Field *field); + + Value value; + bool deprecated; // Field is allowed to be present in old data, but can't be. + // written in new data nor accessed in new code. + bool required; // Field must always be present. + bool key; // Field functions as a key for creating sorted vectors. + bool shared; // Field will be using string pooling (i.e. CreateSharedString) + // as default serialization behavior if field is a string. + bool native_inline; // Field will be defined inline (instead of as a pointer) + // for native tables if field is a struct. + bool flexbuffer; // This field contains FlexBuffer data. + StructDef *nested_flatbuffer; // This field contains nested FlatBuffer data. + size_t padding; // Bytes to always pad after this field. +}; + +struct StructDef : public Definition { + StructDef() + : fixed(false), + predecl(true), + sortbysize(true), + has_key(false), + minalign(1), + bytesize(0) {} + + void PadLastField(size_t min_align) { + auto padding = PaddingBytes(bytesize, min_align); + bytesize += padding; + if (fields.vec.size()) fields.vec.back()->padding = padding; + } + + Offset Serialize(FlatBufferBuilder *builder, + const Parser &parser) const; + + bool Deserialize(Parser &parser, const reflection::Object *object); + + SymbolTable fields; + + bool fixed; // If it's struct, not a table. + bool predecl; // If it's used before it was defined. + bool sortbysize; // Whether fields come in the declaration or size order. + bool has_key; // It has a key field. + size_t minalign; // What the whole object needs to be aligned to. + size_t bytesize; // Size if fixed. + + flatbuffers::unique_ptr original_location; +}; + +inline bool IsStruct(const Type &type) { + return type.base_type == BASE_TYPE_STRUCT && type.struct_def->fixed; +} + +inline size_t InlineSize(const Type &type) { + return IsStruct(type) ? type.struct_def->bytesize : SizeOf(type.base_type); +} + +inline size_t InlineAlignment(const Type &type) { + return IsStruct(type) ? type.struct_def->minalign : SizeOf(type.base_type); +} + +struct EnumVal { + EnumVal(const std::string &_name, int64_t _val) : name(_name), value(_val) {} + EnumVal() : value(0) {} + + Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; + + bool Deserialize(const Parser &parser, const reflection::EnumVal *val); + bool IsZero() const { return 0 == value; } + bool IsNonZero() const { return !IsZero(); } + + std::string name; + std::vector doc_comment; + int64_t value; + Type union_type; +}; + +struct EnumDef : public Definition { + EnumDef() : is_union(false), uses_multiple_type_instances(false) {} + + EnumVal *ReverseLookup(int64_t enum_idx, bool skip_union_default = true) { + for (auto it = Vals().begin() + + static_cast(is_union && skip_union_default); + it != Vals().end(); ++it) { + if ((*it)->value == enum_idx) { return *it; } + } + return nullptr; + } + + Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; + + bool Deserialize(Parser &parser, const reflection::Enum *values); + + size_t size() const { return vals.vec.size(); } + + const std::vector &Vals() const { + return vals.vec; + } + + SymbolTable vals; + bool is_union; + // Type is a union which uses type aliases where at least one type is + // available under two different names. + bool uses_multiple_type_instances; + Type underlying_type; +}; + +inline bool EqualByName(const Type &a, const Type &b) { + return a.base_type == b.base_type && a.element == b.element && + (a.struct_def == b.struct_def || + a.struct_def->name == b.struct_def->name) && + (a.enum_def == b.enum_def || a.enum_def->name == b.enum_def->name); +} + +struct RPCCall : public Definition { + Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; + + bool Deserialize(Parser &parser, const reflection::RPCCall *call); + + StructDef *request, *response; +}; + +struct ServiceDef : public Definition { + Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; + bool Deserialize(Parser &parser, const reflection::Service *service); + + SymbolTable calls; +}; + +// Container of options that may apply to any of the source/text generators. +struct IDLOptions { + bool strict_json; + bool skip_js_exports; + bool use_goog_js_export_format; + bool use_ES6_js_export_format; + bool output_default_scalars_in_json; + int indent_step; + bool output_enum_identifiers; + bool prefixed_enums; + bool scoped_enums; + bool include_dependence_headers; + bool mutable_buffer; + bool one_file; + bool proto_mode; + bool proto_oneof_union; + bool generate_all; + bool skip_unexpected_fields_in_json; + bool generate_name_strings; + bool generate_object_based_api; + bool gen_compare; + std::string cpp_object_api_pointer_type; + std::string cpp_object_api_string_type; + bool cpp_object_api_string_flexible_constructor; + bool gen_nullable; + bool gen_generated; + std::string object_prefix; + std::string object_suffix; + bool union_value_namespacing; + bool allow_non_utf8; + bool natural_utf8; + std::string include_prefix; + bool keep_include_path; + bool binary_schema_comments; + bool binary_schema_builtins; + bool skip_flatbuffers_import; + std::string go_import; + std::string go_namespace; + bool reexport_ts_modules; + bool js_ts_short_names; + bool protobuf_ascii_alike; + bool size_prefixed; + std::string root_type; + bool force_defaults; + + // Possible options for the more general generator below. + enum Language { + kJava = 1 << 0, + kCSharp = 1 << 1, + kGo = 1 << 2, + kCpp = 1 << 3, + kJs = 1 << 4, + kPython = 1 << 5, + kPhp = 1 << 6, + kJson = 1 << 7, + kBinary = 1 << 8, + kTs = 1 << 9, + kJsonSchema = 1 << 10, + kDart = 1 << 11, + kLua = 1 << 12, + kLobster = 1 << 13, + kRust = 1 << 14, + kMAX + }; + + Language lang; + + enum MiniReflect { kNone, kTypes, kTypesAndNames }; + + MiniReflect mini_reflect; + + // The corresponding language bit will be set if a language is included + // for code generation. + unsigned long lang_to_generate; + + // If set (default behavior), empty string and vector fields will be set to + // nullptr to make the flatbuffer more compact. + bool set_empty_to_null; + + IDLOptions() + : strict_json(false), + skip_js_exports(false), + use_goog_js_export_format(false), + use_ES6_js_export_format(false), + output_default_scalars_in_json(false), + indent_step(2), + output_enum_identifiers(true), + prefixed_enums(true), + scoped_enums(false), + include_dependence_headers(true), + mutable_buffer(false), + one_file(false), + proto_mode(false), + proto_oneof_union(false), + generate_all(false), + skip_unexpected_fields_in_json(false), + generate_name_strings(false), + generate_object_based_api(false), + gen_compare(false), + cpp_object_api_pointer_type("std::unique_ptr"), + cpp_object_api_string_flexible_constructor(false), + gen_nullable(false), + gen_generated(false), + object_suffix("T"), + union_value_namespacing(true), + allow_non_utf8(false), + natural_utf8(false), + keep_include_path(false), + binary_schema_comments(false), + binary_schema_builtins(false), + skip_flatbuffers_import(false), + reexport_ts_modules(true), + js_ts_short_names(false), + protobuf_ascii_alike(false), + size_prefixed(false), + force_defaults(false), + lang(IDLOptions::kJava), + mini_reflect(IDLOptions::kNone), + lang_to_generate(0), + set_empty_to_null(true) {} +}; + +// This encapsulates where the parser is in the current source file. +struct ParserState { + ParserState() + : cursor_(nullptr), + line_start_(nullptr), + line_(0), + token_(-1), + attr_is_trivial_ascii_string_(true) {} + + protected: + void ResetState(const char *source) { + cursor_ = source; + line_ = 0; + MarkNewLine(); + } + + void MarkNewLine() { + line_start_ = cursor_; + line_ += 1; + } + + int64_t CursorPosition() const { + FLATBUFFERS_ASSERT(cursor_ && line_start_ && cursor_ >= line_start_); + return static_cast(cursor_ - line_start_); + } + + const char *cursor_; + const char *line_start_; + int line_; // the current line being parsed + int token_; + + // Flag: text in attribute_ is true ASCII string without escape + // sequences. Only printable ASCII (without [\t\r\n]). + // Used for number-in-string (and base64 string in future). + bool attr_is_trivial_ascii_string_; + std::string attribute_; + std::vector doc_comment_; +}; + +// A way to make error propagation less error prone by requiring values to be +// checked. +// Once you create a value of this type you must either: +// - Call Check() on it. +// - Copy or assign it to another value. +// Failure to do so leads to an assert. +// This guarantees that this as return value cannot be ignored. +class CheckedError { + public: + explicit CheckedError(bool error) + : is_error_(error), has_been_checked_(false) {} + + CheckedError &operator=(const CheckedError &other) { + is_error_ = other.is_error_; + has_been_checked_ = false; + other.has_been_checked_ = true; + return *this; + } + + CheckedError(const CheckedError &other) { + *this = other; // Use assignment operator. + } + + ~CheckedError() { FLATBUFFERS_ASSERT(has_been_checked_); } + + bool Check() { + has_been_checked_ = true; + return is_error_; + } + + private: + bool is_error_; + mutable bool has_been_checked_; +}; + +// Additionally, in GCC we can get these errors statically, for additional +// assurance: +// clang-format off +#ifdef __GNUC__ +#define FLATBUFFERS_CHECKED_ERROR CheckedError \ + __attribute__((warn_unused_result)) +#else +#define FLATBUFFERS_CHECKED_ERROR CheckedError +#endif +// clang-format on + +class Parser : public ParserState { + public: + explicit Parser(const IDLOptions &options = IDLOptions()) + : current_namespace_(nullptr), + empty_namespace_(nullptr), + root_struct_def_(nullptr), + opts(options), + uses_flexbuffers_(false), + source_(nullptr), + anonymous_counter(0), + recurse_protection_counter(0) { + if (opts.force_defaults) { + builder_.ForceDefaults(true); + } + // Start out with the empty namespace being current. + empty_namespace_ = new Namespace(); + namespaces_.push_back(empty_namespace_); + current_namespace_ = empty_namespace_; + known_attributes_["deprecated"] = true; + known_attributes_["required"] = true; + known_attributes_["key"] = true; + known_attributes_["shared"] = true; + known_attributes_["hash"] = true; + known_attributes_["id"] = true; + known_attributes_["force_align"] = true; + known_attributes_["bit_flags"] = true; + known_attributes_["original_order"] = true; + known_attributes_["nested_flatbuffer"] = true; + known_attributes_["csharp_partial"] = true; + known_attributes_["streaming"] = true; + known_attributes_["idempotent"] = true; + known_attributes_["cpp_type"] = true; + known_attributes_["cpp_ptr_type"] = true; + known_attributes_["cpp_ptr_type_get"] = true; + known_attributes_["cpp_str_type"] = true; + known_attributes_["cpp_str_flex_ctor"] = true; + known_attributes_["native_inline"] = true; + known_attributes_["native_custom_alloc"] = true; + known_attributes_["native_type"] = true; + known_attributes_["native_default"] = true; + known_attributes_["flexbuffer"] = true; + known_attributes_["private"] = true; + } + + ~Parser() { + for (auto it = namespaces_.begin(); it != namespaces_.end(); ++it) { + delete *it; + } + } + + // Parse the string containing either schema or JSON data, which will + // populate the SymbolTable's or the FlatBufferBuilder above. + // include_paths is used to resolve any include statements, and typically + // should at least include the project path (where you loaded source_ from). + // include_paths must be nullptr terminated if specified. + // If include_paths is nullptr, it will attempt to load from the current + // directory. + // If the source was loaded from a file and isn't an include file, + // supply its name in source_filename. + // All paths specified in this call must be in posix format, if you accept + // paths from user input, please call PosixPath on them first. + bool Parse(const char *_source, const char **include_paths = nullptr, + const char *source_filename = nullptr); + + // Set the root type. May override the one set in the schema. + bool SetRootType(const char *name); + + // Mark all definitions as already having code generated. + void MarkGenerated(); + + // Get the files recursively included by the given file. The returned + // container will have at least the given file. + std::set GetIncludedFilesRecursive( + const std::string &file_name) const; + + // Fills builder_ with a binary version of the schema parsed. + // See reflection/reflection.fbs + void Serialize(); + + // Deserialize a schema buffer + bool Deserialize(const uint8_t *buf, const size_t size); + + // Fills internal structure as if the schema passed had been loaded by parsing + // with Parse except that included filenames will not be populated. + bool Deserialize(const reflection::Schema* schema); + + Type* DeserializeType(const reflection::Type* type); + + // Checks that the schema represented by this parser is a safe evolution + // of the schema provided. Returns non-empty error on any problems. + std::string ConformTo(const Parser &base); + + // Similar to Parse(), but now only accepts JSON to be parsed into a + // FlexBuffer. + bool ParseFlexBuffer(const char *source, const char *source_filename, + flexbuffers::Builder *builder); + + StructDef *LookupStruct(const std::string &id) const; + + std::string UnqualifiedName(std::string fullQualifiedName); + + FLATBUFFERS_CHECKED_ERROR Error(const std::string &msg); + + private: + void Message(const std::string &msg); + void Warning(const std::string &msg); + FLATBUFFERS_CHECKED_ERROR ParseHexNum(int nibbles, uint64_t *val); + FLATBUFFERS_CHECKED_ERROR Next(); + FLATBUFFERS_CHECKED_ERROR SkipByteOrderMark(); + bool Is(int t) const; + bool IsIdent(const char *id) const; + FLATBUFFERS_CHECKED_ERROR Expect(int t); + std::string TokenToStringId(int t) const; + EnumDef *LookupEnum(const std::string &id); + FLATBUFFERS_CHECKED_ERROR ParseNamespacing(std::string *id, + std::string *last); + FLATBUFFERS_CHECKED_ERROR ParseTypeIdent(Type &type); + FLATBUFFERS_CHECKED_ERROR ParseType(Type &type); + FLATBUFFERS_CHECKED_ERROR AddField(StructDef &struct_def, + const std::string &name, const Type &type, + FieldDef **dest); + FLATBUFFERS_CHECKED_ERROR ParseField(StructDef &struct_def); + FLATBUFFERS_CHECKED_ERROR ParseString(Value &val); + FLATBUFFERS_CHECKED_ERROR ParseComma(); + FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field, + size_t parent_fieldn, + const StructDef *parent_struct_def, + uoffset_t count, + bool inside_vector = false); + template + FLATBUFFERS_CHECKED_ERROR ParseTableDelimiters(size_t &fieldn, + const StructDef *struct_def, + F body); + FLATBUFFERS_CHECKED_ERROR ParseTable(const StructDef &struct_def, + std::string *value, uoffset_t *ovalue); + void SerializeStruct(const StructDef &struct_def, const Value &val); + template + FLATBUFFERS_CHECKED_ERROR ParseVectorDelimiters(uoffset_t &count, F body); + FLATBUFFERS_CHECKED_ERROR ParseVector(const Type &type, uoffset_t *ovalue, + FieldDef *field, size_t fieldn); + FLATBUFFERS_CHECKED_ERROR ParseNestedFlatbuffer(Value &val, FieldDef *field, + size_t fieldn, + const StructDef *parent_struct_def); + FLATBUFFERS_CHECKED_ERROR ParseMetaData(SymbolTable *attributes); + FLATBUFFERS_CHECKED_ERROR TryTypedValue(const std::string *name, int dtoken, bool check, Value &e, + BaseType req, bool *destmatch); + FLATBUFFERS_CHECKED_ERROR ParseHash(Value &e, FieldDef* field); + FLATBUFFERS_CHECKED_ERROR TokenError(); + FLATBUFFERS_CHECKED_ERROR ParseSingleValue(const std::string *name, Value &e, bool check_now); + FLATBUFFERS_CHECKED_ERROR ParseEnumFromString(const Type &type, std::string *result); + StructDef *LookupCreateStruct(const std::string &name, + bool create_if_new = true, + bool definition = false); + FLATBUFFERS_CHECKED_ERROR ParseEnum(bool is_union, EnumDef **dest); + FLATBUFFERS_CHECKED_ERROR ParseNamespace(); + FLATBUFFERS_CHECKED_ERROR StartStruct(const std::string &name, + StructDef **dest); + FLATBUFFERS_CHECKED_ERROR StartEnum(const std::string &name, + bool is_union, + EnumDef **dest); + FLATBUFFERS_CHECKED_ERROR ParseDecl(); + FLATBUFFERS_CHECKED_ERROR ParseService(); + FLATBUFFERS_CHECKED_ERROR ParseProtoFields(StructDef *struct_def, + bool isextend, bool inside_oneof); + FLATBUFFERS_CHECKED_ERROR ParseProtoOption(); + FLATBUFFERS_CHECKED_ERROR ParseProtoKey(); + FLATBUFFERS_CHECKED_ERROR ParseProtoDecl(); + FLATBUFFERS_CHECKED_ERROR ParseProtoCurliesOrIdent(); + FLATBUFFERS_CHECKED_ERROR ParseTypeFromProtoType(Type *type); + FLATBUFFERS_CHECKED_ERROR SkipAnyJsonValue(); + FLATBUFFERS_CHECKED_ERROR ParseFlexBufferValue(flexbuffers::Builder *builder); + FLATBUFFERS_CHECKED_ERROR StartParseFile(const char *source, + const char *source_filename); + FLATBUFFERS_CHECKED_ERROR ParseRoot(const char *_source, + const char **include_paths, + const char *source_filename); + FLATBUFFERS_CHECKED_ERROR DoParse(const char *_source, + const char **include_paths, + const char *source_filename, + const char *include_filename); + FLATBUFFERS_CHECKED_ERROR CheckClash(std::vector &fields, + StructDef *struct_def, + const char *suffix, + BaseType baseType); + + bool SupportsAdvancedUnionFeatures() const; + Namespace *UniqueNamespace(Namespace *ns); + + FLATBUFFERS_CHECKED_ERROR RecurseError(); + template CheckedError Recurse(F f); + + public: + SymbolTable types_; + SymbolTable structs_; + SymbolTable enums_; + SymbolTable services_; + std::vector namespaces_; + Namespace *current_namespace_; + Namespace *empty_namespace_; + std::string error_; // User readable error_ if Parse() == false + + FlatBufferBuilder builder_; // any data contained in the file + StructDef *root_struct_def_; + std::string file_identifier_; + std::string file_extension_; + + std::map included_files_; + std::map> files_included_per_file_; + std::vector native_included_files_; + + std::map known_attributes_; + + IDLOptions opts; + bool uses_flexbuffers_; + + private: + const char *source_; + + std::string file_being_parsed_; + + std::vector> field_stack_; + + int anonymous_counter; + int recurse_protection_counter; +}; + +// Utility functions for multiple generators: + +extern std::string MakeCamel(const std::string &in, bool first = true); + +// Generate text (JSON) from a given FlatBuffer, and a given Parser +// object that has been populated with the corresponding schema. +// If ident_step is 0, no indentation will be generated. Additionally, +// if it is less than 0, no linefeeds will be generated either. +// See idl_gen_text.cpp. +// strict_json adds "quotes" around field names if true. +// If the flatbuffer cannot be encoded in JSON (e.g., it contains non-UTF-8 +// byte arrays in String values), returns false. +extern bool GenerateTextFromTable(const Parser &parser, + const void *table, + const std::string &tablename, + std::string *text); +extern bool GenerateText(const Parser &parser, + const void *flatbuffer, + std::string *text); +extern bool GenerateTextFile(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate binary files from a given FlatBuffer, and a given Parser +// object that has been populated with the corresponding schema. +// See idl_gen_general.cpp. +extern bool GenerateBinary(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate a C++ header from the definitions in the Parser object. +// See idl_gen_cpp. +extern bool GenerateCPP(const Parser &parser, + const std::string &path, + const std::string &file_name); + +extern bool GenerateDart(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate JavaScript or TypeScript code from the definitions in the Parser object. +// See idl_gen_js. +extern bool GenerateJSTS(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate Go files from the definitions in the Parser object. +// See idl_gen_go.cpp. +extern bool GenerateGo(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate Php code from the definitions in the Parser object. +// See idl_gen_php. +extern bool GeneratePhp(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate Python files from the definitions in the Parser object. +// See idl_gen_python.cpp. +extern bool GeneratePython(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate Lobster files from the definitions in the Parser object. +// See idl_gen_lobster.cpp. +extern bool GenerateLobster(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate Lua files from the definitions in the Parser object. +// See idl_gen_lua.cpp. +extern bool GenerateLua(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate Rust files from the definitions in the Parser object. +// See idl_gen_rust.cpp. +extern bool GenerateRust(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate Json schema file +// See idl_gen_json_schema.cpp. +extern bool GenerateJsonSchema(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate Java/C#/.. files from the definitions in the Parser object. +// See idl_gen_general.cpp. +extern bool GenerateGeneral(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate a schema file from the internal representation, useful after +// parsing a .proto schema. +extern std::string GenerateFBS(const Parser &parser, + const std::string &file_name); +extern bool GenerateFBS(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated JavaScript or TypeScript code. +// See idl_gen_js.cpp. +extern std::string JSTSMakeRule(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated C++ header. +// See idl_gen_cpp.cpp. +extern std::string CPPMakeRule(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated Dart code +// see idl_gen_dart.cpp +extern std::string DartMakeRule(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated Rust code. +// See idl_gen_rust.cpp. +extern std::string RustMakeRule(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated Java/C#/... files. +// See idl_gen_general.cpp. +extern std::string GeneralMakeRule(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated text (JSON) files. +// See idl_gen_text.cpp. +extern std::string TextMakeRule(const Parser &parser, + const std::string &path, + const std::string &file_names); + +// Generate a make rule for the generated binary files. +// See idl_gen_general.cpp. +extern std::string BinaryMakeRule(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate GRPC Cpp interfaces. +// See idl_gen_grpc.cpp. +bool GenerateCppGRPC(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate GRPC Go interfaces. +// See idl_gen_grpc.cpp. +bool GenerateGoGRPC(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate GRPC Java classes. +// See idl_gen_grpc.cpp +bool GenerateJavaGRPC(const Parser &parser, + const std::string &path, + const std::string &file_name); + +} // namespace flatbuffers + +#endif // FLATBUFFERS_IDL_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/minireflect.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/minireflect.h new file mode 100644 index 000000000..9d648ec08 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/minireflect.h @@ -0,0 +1,407 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_MINIREFLECT_H_ +#define FLATBUFFERS_MINIREFLECT_H_ + +#include "flatbuffers/flatbuffers.h" +#include "flatbuffers/util.h" + +namespace flatbuffers { + +// Utilities that can be used with the "mini reflection" tables present +// in generated code with --reflect-types (only types) or --reflect-names +// (also names). +// This allows basic reflection functionality such as pretty-printing +// that does not require the use of the schema parser or loading of binary +// schema files at runtime (reflection.h). + +// For any of the functions below that take `const TypeTable *`, you pass +// `FooTypeTable()` if the type of the root is `Foo`. + +// First, a generic iterator that can be used by multiple algorithms. + +struct IterationVisitor { + // These mark the scope of a table or struct. + virtual void StartSequence() {} + virtual void EndSequence() {} + // Called for each field regardless of wether it is present or not. + // If not present, val == nullptr. set_idx is the index of all set fields. + virtual void Field(size_t /*field_idx*/, size_t /*set_idx*/, + ElementaryType /*type*/, bool /*is_vector*/, + const TypeTable * /*type_table*/, const char * /*name*/, + const uint8_t * /*val*/) {} + // Called for a value that is actually present, after a field, or as part + // of a vector. + virtual void UType(uint8_t, const char *) {} + virtual void Bool(bool) {} + virtual void Char(int8_t, const char *) {} + virtual void UChar(uint8_t, const char *) {} + virtual void Short(int16_t, const char *) {} + virtual void UShort(uint16_t, const char *) {} + virtual void Int(int32_t, const char *) {} + virtual void UInt(uint32_t, const char *) {} + virtual void Long(int64_t) {} + virtual void ULong(uint64_t) {} + virtual void Float(float) {} + virtual void Double(double) {} + virtual void String(const String *) {} + virtual void Unknown(const uint8_t *) {} // From a future version. + // These mark the scope of a vector. + virtual void StartVector() {} + virtual void EndVector() {} + virtual void Element(size_t /*i*/, ElementaryType /*type*/, + const TypeTable * /*type_table*/, + const uint8_t * /*val*/) {} + virtual ~IterationVisitor() {} +}; + +inline size_t InlineSize(ElementaryType type, const TypeTable *type_table) { + switch (type) { + case ET_UTYPE: + case ET_BOOL: + case ET_CHAR: + case ET_UCHAR: return 1; + case ET_SHORT: + case ET_USHORT: return 2; + case ET_INT: + case ET_UINT: + case ET_FLOAT: + case ET_STRING: return 4; + case ET_LONG: + case ET_ULONG: + case ET_DOUBLE: return 8; + case ET_SEQUENCE: + switch (type_table->st) { + case ST_TABLE: + case ST_UNION: return 4; + case ST_STRUCT: return static_cast(type_table->values[type_table->num_elems]); + default: FLATBUFFERS_ASSERT(false); return 1; + } + default: FLATBUFFERS_ASSERT(false); return 1; + } +} + +inline int64_t LookupEnum(int64_t enum_val, const int64_t *values, + size_t num_values) { + if (!values) return enum_val; + for (size_t i = 0; i < num_values; i++) { + if (enum_val == values[i]) return static_cast(i); + } + return -1; // Unknown enum value. +} + +template const char *EnumName(T tval, const TypeTable *type_table) { + if (!type_table || !type_table->names) return nullptr; + auto i = LookupEnum(static_cast(tval), type_table->values, + type_table->num_elems); + if (i >= 0 && i < static_cast(type_table->num_elems)) { + return type_table->names[i]; + } + return nullptr; +} + +void IterateObject(const uint8_t *obj, const TypeTable *type_table, + IterationVisitor *visitor); + +inline void IterateValue(ElementaryType type, const uint8_t *val, + const TypeTable *type_table, const uint8_t *prev_val, + soffset_t vector_index, IterationVisitor *visitor) { + switch (type) { + case ET_UTYPE: { + auto tval = ReadScalar(val); + visitor->UType(tval, EnumName(tval, type_table)); + break; + } + case ET_BOOL: { + visitor->Bool(ReadScalar(val) != 0); + break; + } + case ET_CHAR: { + auto tval = ReadScalar(val); + visitor->Char(tval, EnumName(tval, type_table)); + break; + } + case ET_UCHAR: { + auto tval = ReadScalar(val); + visitor->UChar(tval, EnumName(tval, type_table)); + break; + } + case ET_SHORT: { + auto tval = ReadScalar(val); + visitor->Short(tval, EnumName(tval, type_table)); + break; + } + case ET_USHORT: { + auto tval = ReadScalar(val); + visitor->UShort(tval, EnumName(tval, type_table)); + break; + } + case ET_INT: { + auto tval = ReadScalar(val); + visitor->Int(tval, EnumName(tval, type_table)); + break; + } + case ET_UINT: { + auto tval = ReadScalar(val); + visitor->UInt(tval, EnumName(tval, type_table)); + break; + } + case ET_LONG: { + visitor->Long(ReadScalar(val)); + break; + } + case ET_ULONG: { + visitor->ULong(ReadScalar(val)); + break; + } + case ET_FLOAT: { + visitor->Float(ReadScalar(val)); + break; + } + case ET_DOUBLE: { + visitor->Double(ReadScalar(val)); + break; + } + case ET_STRING: { + val += ReadScalar(val); + visitor->String(reinterpret_cast(val)); + break; + } + case ET_SEQUENCE: { + switch (type_table->st) { + case ST_TABLE: + val += ReadScalar(val); + IterateObject(val, type_table, visitor); + break; + case ST_STRUCT: IterateObject(val, type_table, visitor); break; + case ST_UNION: { + val += ReadScalar(val); + FLATBUFFERS_ASSERT(prev_val); + auto union_type = *prev_val; // Always a uint8_t. + if (vector_index >= 0) { + auto type_vec = reinterpret_cast *>(prev_val); + union_type = type_vec->Get(static_cast(vector_index)); + } + auto type_code_idx = + LookupEnum(union_type, type_table->values, type_table->num_elems); + if (type_code_idx >= 0 && + type_code_idx < static_cast(type_table->num_elems)) { + auto type_code = type_table->type_codes[type_code_idx]; + switch (type_code.base_type) { + case ET_SEQUENCE: { + auto ref = type_table->type_refs[type_code.sequence_ref](); + IterateObject(val, ref, visitor); + break; + } + case ET_STRING: + visitor->String(reinterpret_cast(val)); + break; + default: visitor->Unknown(val); + } + } else { + visitor->Unknown(val); + } + break; + } + case ST_ENUM: FLATBUFFERS_ASSERT(false); break; + } + break; + } + default: { + visitor->Unknown(val); + break; + } + } +} + +inline void IterateObject(const uint8_t *obj, const TypeTable *type_table, + IterationVisitor *visitor) { + visitor->StartSequence(); + const uint8_t *prev_val = nullptr; + size_t set_idx = 0; + for (size_t i = 0; i < type_table->num_elems; i++) { + auto type_code = type_table->type_codes[i]; + auto type = static_cast(type_code.base_type); + auto is_vector = type_code.is_vector != 0; + auto ref_idx = type_code.sequence_ref; + const TypeTable *ref = nullptr; + if (ref_idx >= 0) { ref = type_table->type_refs[ref_idx](); } + auto name = type_table->names ? type_table->names[i] : nullptr; + const uint8_t *val = nullptr; + if (type_table->st == ST_TABLE) { + val = reinterpret_cast(obj)->GetAddressOf( + FieldIndexToOffset(static_cast(i))); + } else { + val = obj + type_table->values[i]; + } + visitor->Field(i, set_idx, type, is_vector, ref, name, val); + if (val) { + set_idx++; + if (is_vector) { + val += ReadScalar(val); + auto vec = reinterpret_cast *>(val); + visitor->StartVector(); + auto elem_ptr = vec->Data(); + for (size_t j = 0; j < vec->size(); j++) { + visitor->Element(j, type, ref, elem_ptr); + IterateValue(type, elem_ptr, ref, prev_val, static_cast(j), + visitor); + elem_ptr += InlineSize(type, ref); + } + visitor->EndVector(); + } else { + IterateValue(type, val, ref, prev_val, -1, visitor); + } + } + prev_val = val; + } + visitor->EndSequence(); +} + +inline void IterateFlatBuffer(const uint8_t *buffer, + const TypeTable *type_table, + IterationVisitor *callback) { + IterateObject(GetRoot(buffer), type_table, callback); +} + +// Outputting a Flatbuffer to a string. Tries to conform as close to JSON / +// the output generated by idl_gen_text.cpp. + +struct ToStringVisitor : public IterationVisitor { + std::string s; + std::string d; + bool q; + std::string in; + size_t indent_level; + bool vector_delimited; + ToStringVisitor(std::string delimiter, bool quotes, std::string indent, + bool vdelimited = true) + : d(delimiter), + q(quotes), + in(indent), + indent_level(0), + vector_delimited(vdelimited) {} + ToStringVisitor(std::string delimiter) + : d(delimiter), + q(false), + in(""), + indent_level(0), + vector_delimited(true) {} + + void append_indent() { + for (size_t i = 0; i < indent_level; i++) { s += in; } + } + + void StartSequence() { + s += "{"; + s += d; + indent_level++; + } + void EndSequence() { + s += d; + indent_level--; + append_indent(); + s += "}"; + } + void Field(size_t /*field_idx*/, size_t set_idx, ElementaryType /*type*/, + bool /*is_vector*/, const TypeTable * /*type_table*/, + const char *name, const uint8_t *val) { + if (!val) return; + if (set_idx) { + s += ","; + s += d; + } + append_indent(); + if (name) { + if (q) s += "\""; + s += name; + if (q) s += "\""; + s += ": "; + } + } + template void Named(T x, const char *name) { + if (name) { + if (q) s += "\""; + s += name; + if (q) s += "\""; + } else { + s += NumToString(x); + } + } + void UType(uint8_t x, const char *name) { Named(x, name); } + void Bool(bool x) { s += x ? "true" : "false"; } + void Char(int8_t x, const char *name) { Named(x, name); } + void UChar(uint8_t x, const char *name) { Named(x, name); } + void Short(int16_t x, const char *name) { Named(x, name); } + void UShort(uint16_t x, const char *name) { Named(x, name); } + void Int(int32_t x, const char *name) { Named(x, name); } + void UInt(uint32_t x, const char *name) { Named(x, name); } + void Long(int64_t x) { s += NumToString(x); } + void ULong(uint64_t x) { s += NumToString(x); } + void Float(float x) { s += NumToString(x); } + void Double(double x) { s += NumToString(x); } + void String(const struct String *str) { + EscapeString(str->c_str(), str->size(), &s, true, false); + } + void Unknown(const uint8_t *) { s += "(?)"; } + void StartVector() { + s += "["; + if (vector_delimited) { + s += d; + indent_level++; + append_indent(); + } else { + s += " "; + } + } + void EndVector() { + if (vector_delimited) { + s += d; + indent_level--; + append_indent(); + } else { + s += " "; + } + s += "]"; + } + void Element(size_t i, ElementaryType /*type*/, + const TypeTable * /*type_table*/, const uint8_t * /*val*/) { + if (i) { + s += ","; + if (vector_delimited) { + s += d; + append_indent(); + } else { + s += " "; + } + } + } +}; + +inline std::string FlatBufferToString(const uint8_t *buffer, + const TypeTable *type_table, + bool multi_line = false, + bool vector_delimited = true) { + ToStringVisitor tostring_visitor(multi_line ? "\n" : " ", false, "", + vector_delimited); + IterateFlatBuffer(buffer, type_table, &tostring_visitor); + return tostring_visitor.s; +} + +} // namespace flatbuffers + +#endif // FLATBUFFERS_MINIREFLECT_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/reflection.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/reflection.h new file mode 100644 index 000000000..580ae624b --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/reflection.h @@ -0,0 +1,477 @@ +/* + * Copyright 2015 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_REFLECTION_H_ +#define FLATBUFFERS_REFLECTION_H_ + +// This is somewhat of a circular dependency because flatc (and thus this +// file) is needed to generate this header in the first place. +// Should normally not be a problem since it can be generated by the +// previous version of flatc whenever this code needs to change. +// See reflection/generate_code.sh +#include "flatbuffers/reflection_generated.h" + +// Helper functionality for reflection. + +namespace flatbuffers { + +// ------------------------- GETTERS ------------------------- + +inline bool IsScalar(reflection::BaseType t) { + return t >= reflection::UType && t <= reflection::Double; +} +inline bool IsInteger(reflection::BaseType t) { + return t >= reflection::UType && t <= reflection::ULong; +} +inline bool IsFloat(reflection::BaseType t) { + return t == reflection::Float || t == reflection::Double; +} +inline bool IsLong(reflection::BaseType t) { + return t == reflection::Long || t == reflection::ULong; +} + +// Size of a basic type, don't use with structs. +inline size_t GetTypeSize(reflection::BaseType base_type) { + // This needs to correspond to the BaseType enum. + static size_t sizes[] = { 0, 1, 1, 1, 1, 2, 2, 4, 4, 8, 8, 4, 8, 4, 4, 4, 4 }; + return sizes[base_type]; +} + +// Same as above, but now correctly returns the size of a struct if +// the field (or vector element) is a struct. +inline size_t GetTypeSizeInline(reflection::BaseType base_type, int type_index, + const reflection::Schema &schema) { + if (base_type == reflection::Obj && + schema.objects()->Get(type_index)->is_struct()) { + return schema.objects()->Get(type_index)->bytesize(); + } else { + return GetTypeSize(base_type); + } +} + +// Get the root, regardless of what type it is. +inline Table *GetAnyRoot(uint8_t *flatbuf) { + return GetMutableRoot
(flatbuf); +} +inline const Table *GetAnyRoot(const uint8_t *flatbuf) { + return GetRoot
(flatbuf); +} + +// Get a field's default, if you know it's an integer, and its exact type. +template T GetFieldDefaultI(const reflection::Field &field) { + FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); + return static_cast(field.default_integer()); +} + +// Get a field's default, if you know it's floating point and its exact type. +template T GetFieldDefaultF(const reflection::Field &field) { + FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); + return static_cast(field.default_real()); +} + +// Get a field, if you know it's an integer, and its exact type. +template +T GetFieldI(const Table &table, const reflection::Field &field) { + FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); + return table.GetField(field.offset(), + static_cast(field.default_integer())); +} + +// Get a field, if you know it's floating point and its exact type. +template +T GetFieldF(const Table &table, const reflection::Field &field) { + FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); + return table.GetField(field.offset(), + static_cast(field.default_real())); +} + +// Get a field, if you know it's a string. +inline const String *GetFieldS(const Table &table, + const reflection::Field &field) { + FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::String); + return table.GetPointer(field.offset()); +} + +// Get a field, if you know it's a vector. +template +Vector *GetFieldV(const Table &table, const reflection::Field &field) { + FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Vector && + sizeof(T) == GetTypeSize(field.type()->element())); + return table.GetPointer *>(field.offset()); +} + +// Get a field, if you know it's a vector, generically. +// To actually access elements, use the return value together with +// field.type()->element() in any of GetAnyVectorElemI below etc. +inline VectorOfAny *GetFieldAnyV(const Table &table, + const reflection::Field &field) { + return table.GetPointer(field.offset()); +} + +// Get a field, if you know it's a table. +inline Table *GetFieldT(const Table &table, const reflection::Field &field) { + FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj || + field.type()->base_type() == reflection::Union); + return table.GetPointer
(field.offset()); +} + +// Get a field, if you know it's a struct. +inline const Struct *GetFieldStruct(const Table &table, + const reflection::Field &field) { + // TODO: This does NOT check if the field is a table or struct, but we'd need + // access to the schema to check the is_struct flag. + FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj); + return table.GetStruct(field.offset()); +} + +// Get a structure's field, if you know it's a struct. +inline const Struct *GetFieldStruct(const Struct &structure, + const reflection::Field &field) { + FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj); + return structure.GetStruct(field.offset()); +} + +// Raw helper functions used below: get any value in memory as a 64bit int, a +// double or a string. +// All scalars get static_cast to an int64_t, strings use strtoull, every other +// data type returns 0. +int64_t GetAnyValueI(reflection::BaseType type, const uint8_t *data); +// All scalars static cast to double, strings use strtod, every other data +// type is 0.0. +double GetAnyValueF(reflection::BaseType type, const uint8_t *data); +// All scalars converted using stringstream, strings as-is, and all other +// data types provide some level of debug-pretty-printing. +std::string GetAnyValueS(reflection::BaseType type, const uint8_t *data, + const reflection::Schema *schema, int type_index); + +// Get any table field as a 64bit int, regardless of what type it is. +inline int64_t GetAnyFieldI(const Table &table, + const reflection::Field &field) { + auto field_ptr = table.GetAddressOf(field.offset()); + return field_ptr ? GetAnyValueI(field.type()->base_type(), field_ptr) + : field.default_integer(); +} + +// Get any table field as a double, regardless of what type it is. +inline double GetAnyFieldF(const Table &table, const reflection::Field &field) { + auto field_ptr = table.GetAddressOf(field.offset()); + return field_ptr ? GetAnyValueF(field.type()->base_type(), field_ptr) + : field.default_real(); +} + +// Get any table field as a string, regardless of what type it is. +// You may pass nullptr for the schema if you don't care to have fields that +// are of table type pretty-printed. +inline std::string GetAnyFieldS(const Table &table, + const reflection::Field &field, + const reflection::Schema *schema) { + auto field_ptr = table.GetAddressOf(field.offset()); + return field_ptr ? GetAnyValueS(field.type()->base_type(), field_ptr, schema, + field.type()->index()) + : ""; +} + +// Get any struct field as a 64bit int, regardless of what type it is. +inline int64_t GetAnyFieldI(const Struct &st, const reflection::Field &field) { + return GetAnyValueI(field.type()->base_type(), + st.GetAddressOf(field.offset())); +} + +// Get any struct field as a double, regardless of what type it is. +inline double GetAnyFieldF(const Struct &st, const reflection::Field &field) { + return GetAnyValueF(field.type()->base_type(), + st.GetAddressOf(field.offset())); +} + +// Get any struct field as a string, regardless of what type it is. +inline std::string GetAnyFieldS(const Struct &st, + const reflection::Field &field) { + return GetAnyValueS(field.type()->base_type(), + st.GetAddressOf(field.offset()), nullptr, -1); +} + +// Get any vector element as a 64bit int, regardless of what type it is. +inline int64_t GetAnyVectorElemI(const VectorOfAny *vec, + reflection::BaseType elem_type, size_t i) { + return GetAnyValueI(elem_type, vec->Data() + GetTypeSize(elem_type) * i); +} + +// Get any vector element as a double, regardless of what type it is. +inline double GetAnyVectorElemF(const VectorOfAny *vec, + reflection::BaseType elem_type, size_t i) { + return GetAnyValueF(elem_type, vec->Data() + GetTypeSize(elem_type) * i); +} + +// Get any vector element as a string, regardless of what type it is. +inline std::string GetAnyVectorElemS(const VectorOfAny *vec, + reflection::BaseType elem_type, size_t i) { + return GetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, + nullptr, -1); +} + +// Get a vector element that's a table/string/vector from a generic vector. +// Pass Table/String/VectorOfAny as template parameter. +// Warning: does no typechecking. +template +T *GetAnyVectorElemPointer(const VectorOfAny *vec, size_t i) { + auto elem_ptr = vec->Data() + sizeof(uoffset_t) * i; + return reinterpret_cast(elem_ptr + ReadScalar(elem_ptr)); +} + +// Get the inline-address of a vector element. Useful for Structs (pass Struct +// as template arg), or being able to address a range of scalars in-line. +// Get elem_size from GetTypeSizeInline(). +// Note: little-endian data on all platforms, use EndianScalar() instead of +// raw pointer access with scalars). +template +T *GetAnyVectorElemAddressOf(const VectorOfAny *vec, size_t i, + size_t elem_size) { + return reinterpret_cast(vec->Data() + elem_size * i); +} + +// Similarly, for elements of tables. +template +T *GetAnyFieldAddressOf(const Table &table, const reflection::Field &field) { + return reinterpret_cast(table.GetAddressOf(field.offset())); +} + +// Similarly, for elements of structs. +template +T *GetAnyFieldAddressOf(const Struct &st, const reflection::Field &field) { + return reinterpret_cast(st.GetAddressOf(field.offset())); +} + +// ------------------------- SETTERS ------------------------- + +// Set any scalar field, if you know its exact type. +template +bool SetField(Table *table, const reflection::Field &field, T val) { + reflection::BaseType type = field.type()->base_type(); + if (!IsScalar(type)) { return false; } + FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(type)); + T def; + if (IsInteger(type)) { + def = GetFieldDefaultI(field); + } else { + FLATBUFFERS_ASSERT(IsFloat(type)); + def = GetFieldDefaultF(field); + } + return table->SetField(field.offset(), val, def); +} + +// Raw helper functions used below: set any value in memory as a 64bit int, a +// double or a string. +// These work for all scalar values, but do nothing for other data types. +// To set a string, see SetString below. +void SetAnyValueI(reflection::BaseType type, uint8_t *data, int64_t val); +void SetAnyValueF(reflection::BaseType type, uint8_t *data, double val); +void SetAnyValueS(reflection::BaseType type, uint8_t *data, const char *val); + +// Set any table field as a 64bit int, regardless of type what it is. +inline bool SetAnyFieldI(Table *table, const reflection::Field &field, + int64_t val) { + auto field_ptr = table->GetAddressOf(field.offset()); + if (!field_ptr) return val == GetFieldDefaultI(field); + SetAnyValueI(field.type()->base_type(), field_ptr, val); + return true; +} + +// Set any table field as a double, regardless of what type it is. +inline bool SetAnyFieldF(Table *table, const reflection::Field &field, + double val) { + auto field_ptr = table->GetAddressOf(field.offset()); + if (!field_ptr) return val == GetFieldDefaultF(field); + SetAnyValueF(field.type()->base_type(), field_ptr, val); + return true; +} + +// Set any table field as a string, regardless of what type it is. +inline bool SetAnyFieldS(Table *table, const reflection::Field &field, + const char *val) { + auto field_ptr = table->GetAddressOf(field.offset()); + if (!field_ptr) return false; + SetAnyValueS(field.type()->base_type(), field_ptr, val); + return true; +} + +// Set any struct field as a 64bit int, regardless of type what it is. +inline void SetAnyFieldI(Struct *st, const reflection::Field &field, + int64_t val) { + SetAnyValueI(field.type()->base_type(), st->GetAddressOf(field.offset()), + val); +} + +// Set any struct field as a double, regardless of type what it is. +inline void SetAnyFieldF(Struct *st, const reflection::Field &field, + double val) { + SetAnyValueF(field.type()->base_type(), st->GetAddressOf(field.offset()), + val); +} + +// Set any struct field as a string, regardless of type what it is. +inline void SetAnyFieldS(Struct *st, const reflection::Field &field, + const char *val) { + SetAnyValueS(field.type()->base_type(), st->GetAddressOf(field.offset()), + val); +} + +// Set any vector element as a 64bit int, regardless of type what it is. +inline void SetAnyVectorElemI(VectorOfAny *vec, reflection::BaseType elem_type, + size_t i, int64_t val) { + SetAnyValueI(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); +} + +// Set any vector element as a double, regardless of type what it is. +inline void SetAnyVectorElemF(VectorOfAny *vec, reflection::BaseType elem_type, + size_t i, double val) { + SetAnyValueF(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); +} + +// Set any vector element as a string, regardless of type what it is. +inline void SetAnyVectorElemS(VectorOfAny *vec, reflection::BaseType elem_type, + size_t i, const char *val) { + SetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); +} + +// ------------------------- RESIZING SETTERS ------------------------- + +// "smart" pointer for use with resizing vectors: turns a pointer inside +// a vector into a relative offset, such that it is not affected by resizes. +template class pointer_inside_vector { + public: + pointer_inside_vector(T *ptr, std::vector &vec) + : offset_(reinterpret_cast(ptr) - + reinterpret_cast(flatbuffers::vector_data(vec))), + vec_(vec) {} + + T *operator*() const { + return reinterpret_cast( + reinterpret_cast(flatbuffers::vector_data(vec_)) + offset_); + } + T *operator->() const { return operator*(); } + void operator=(const pointer_inside_vector &piv); + + private: + size_t offset_; + std::vector &vec_; +}; + +// Helper to create the above easily without specifying template args. +template +pointer_inside_vector piv(T *ptr, std::vector &vec) { + return pointer_inside_vector(ptr, vec); +} + +inline const char *UnionTypeFieldSuffix() { return "_type"; } + +// Helper to figure out the actual table type a union refers to. +inline const reflection::Object &GetUnionType( + const reflection::Schema &schema, const reflection::Object &parent, + const reflection::Field &unionfield, const Table &table) { + auto enumdef = schema.enums()->Get(unionfield.type()->index()); + // TODO: this is clumsy and slow, but no other way to find it? + auto type_field = parent.fields()->LookupByKey( + (unionfield.name()->str() + UnionTypeFieldSuffix()).c_str()); + FLATBUFFERS_ASSERT(type_field); + auto union_type = GetFieldI(table, *type_field); + auto enumval = enumdef->values()->LookupByKey(union_type); + return *enumval->object(); +} + +// Changes the contents of a string inside a FlatBuffer. FlatBuffer must +// live inside a std::vector so we can resize the buffer if needed. +// "str" must live inside "flatbuf" and may be invalidated after this call. +// If your FlatBuffer's root table is not the schema's root table, you should +// pass in your root_table type as well. +void SetString(const reflection::Schema &schema, const std::string &val, + const String *str, std::vector *flatbuf, + const reflection::Object *root_table = nullptr); + +// Resizes a flatbuffers::Vector inside a FlatBuffer. FlatBuffer must +// live inside a std::vector so we can resize the buffer if needed. +// "vec" must live inside "flatbuf" and may be invalidated after this call. +// If your FlatBuffer's root table is not the schema's root table, you should +// pass in your root_table type as well. +uint8_t *ResizeAnyVector(const reflection::Schema &schema, uoffset_t newsize, + const VectorOfAny *vec, uoffset_t num_elems, + uoffset_t elem_size, std::vector *flatbuf, + const reflection::Object *root_table = nullptr); + +template +void ResizeVector(const reflection::Schema &schema, uoffset_t newsize, T val, + const Vector *vec, std::vector *flatbuf, + const reflection::Object *root_table = nullptr) { + auto delta_elem = static_cast(newsize) - static_cast(vec->size()); + auto newelems = ResizeAnyVector( + schema, newsize, reinterpret_cast(vec), vec->size(), + static_cast(sizeof(T)), flatbuf, root_table); + // Set new elements to "val". + for (int i = 0; i < delta_elem; i++) { + auto loc = newelems + i * sizeof(T); + auto is_scalar = flatbuffers::is_scalar::value; + if (is_scalar) { + WriteScalar(loc, val); + } else { // struct + *reinterpret_cast(loc) = val; + } + } +} + +// Adds any new data (in the form of a new FlatBuffer) to an existing +// FlatBuffer. This can be used when any of the above methods are not +// sufficient, in particular for adding new tables and new fields. +// This is potentially slightly less efficient than a FlatBuffer constructed +// in one piece, since the new FlatBuffer doesn't share any vtables with the +// existing one. +// The return value can now be set using Vector::MutateOffset or SetFieldT +// below. +const uint8_t *AddFlatBuffer(std::vector &flatbuf, + const uint8_t *newbuf, size_t newlen); + +inline bool SetFieldT(Table *table, const reflection::Field &field, + const uint8_t *val) { + FLATBUFFERS_ASSERT(sizeof(uoffset_t) == + GetTypeSize(field.type()->base_type())); + return table->SetPointer(field.offset(), val); +} + +// ------------------------- COPYING ------------------------- + +// Generic copying of tables from a FlatBuffer into a FlatBuffer builder. +// Can be used to do any kind of merging/selecting you may want to do out +// of existing buffers. Also useful to reconstruct a whole buffer if the +// above resizing functionality has introduced garbage in a buffer you want +// to remove. +// Note: this does not deal with DAGs correctly. If the table passed forms a +// DAG, the copy will be a tree instead (with duplicates). Strings can be +// shared however, by passing true for use_string_pooling. + +Offset CopyTable(FlatBufferBuilder &fbb, + const reflection::Schema &schema, + const reflection::Object &objectdef, + const Table &table, + bool use_string_pooling = false); + +// Verifies the provided flatbuffer using reflection. +// root should point to the root type for this flatbuffer. +// buf should point to the start of flatbuffer data. +// length specifies the size of the flatbuffer data. +bool Verify(const reflection::Schema &schema, const reflection::Object &root, + const uint8_t *buf, size_t length); + +} // namespace flatbuffers + +#endif // FLATBUFFERS_REFLECTION_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/reflection_generated.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/reflection_generated.h new file mode 100644 index 000000000..869a9f3f2 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/reflection_generated.h @@ -0,0 +1,1182 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +#ifndef FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ +#define FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ + +#include "flatbuffers/flatbuffers.h" + +namespace reflection { + +struct Type; + +struct KeyValue; + +struct EnumVal; + +struct Enum; + +struct Field; + +struct Object; + +struct RPCCall; + +struct Service; + +struct Schema; + +enum BaseType { + None = 0, + UType = 1, + Bool = 2, + Byte = 3, + UByte = 4, + Short = 5, + UShort = 6, + Int = 7, + UInt = 8, + Long = 9, + ULong = 10, + Float = 11, + Double = 12, + String = 13, + Vector = 14, + Obj = 15, + Union = 16 +}; + +inline const BaseType (&EnumValuesBaseType())[17] { + static const BaseType values[] = { + None, + UType, + Bool, + Byte, + UByte, + Short, + UShort, + Int, + UInt, + Long, + ULong, + Float, + Double, + String, + Vector, + Obj, + Union + }; + return values; +} + +inline const char * const *EnumNamesBaseType() { + static const char * const names[] = { + "None", + "UType", + "Bool", + "Byte", + "UByte", + "Short", + "UShort", + "Int", + "UInt", + "Long", + "ULong", + "Float", + "Double", + "String", + "Vector", + "Obj", + "Union", + nullptr + }; + return names; +} + +inline const char *EnumNameBaseType(BaseType e) { + if (e < None || e > Union) return ""; + const size_t index = static_cast(e); + return EnumNamesBaseType()[index]; +} + +struct Type FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_BASE_TYPE = 4, + VT_ELEMENT = 6, + VT_INDEX = 8 + }; + BaseType base_type() const { + return static_cast(GetField(VT_BASE_TYPE, 0)); + } + BaseType element() const { + return static_cast(GetField(VT_ELEMENT, 0)); + } + int32_t index() const { + return GetField(VT_INDEX, -1); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_BASE_TYPE) && + VerifyField(verifier, VT_ELEMENT) && + VerifyField(verifier, VT_INDEX) && + verifier.EndTable(); + } +}; + +struct TypeBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_base_type(BaseType base_type) { + fbb_.AddElement(Type::VT_BASE_TYPE, static_cast(base_type), 0); + } + void add_element(BaseType element) { + fbb_.AddElement(Type::VT_ELEMENT, static_cast(element), 0); + } + void add_index(int32_t index) { + fbb_.AddElement(Type::VT_INDEX, index, -1); + } + explicit TypeBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + TypeBuilder &operator=(const TypeBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateType( + flatbuffers::FlatBufferBuilder &_fbb, + BaseType base_type = None, + BaseType element = None, + int32_t index = -1) { + TypeBuilder builder_(_fbb); + builder_.add_index(index); + builder_.add_element(element); + builder_.add_base_type(base_type); + return builder_.Finish(); +} + +struct KeyValue FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_KEY = 4, + VT_VALUE = 6 + }; + const flatbuffers::String *key() const { + return GetPointer(VT_KEY); + } + bool KeyCompareLessThan(const KeyValue *o) const { + return *key() < *o->key(); + } + int KeyCompareWithValue(const char *val) const { + return strcmp(key()->c_str(), val); + } + const flatbuffers::String *value() const { + return GetPointer(VT_VALUE); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_KEY) && + verifier.VerifyString(key()) && + VerifyOffset(verifier, VT_VALUE) && + verifier.VerifyString(value()) && + verifier.EndTable(); + } +}; + +struct KeyValueBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_key(flatbuffers::Offset key) { + fbb_.AddOffset(KeyValue::VT_KEY, key); + } + void add_value(flatbuffers::Offset value) { + fbb_.AddOffset(KeyValue::VT_VALUE, value); + } + explicit KeyValueBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + KeyValueBuilder &operator=(const KeyValueBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, KeyValue::VT_KEY); + return o; + } +}; + +inline flatbuffers::Offset CreateKeyValue( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset key = 0, + flatbuffers::Offset value = 0) { + KeyValueBuilder builder_(_fbb); + builder_.add_value(value); + builder_.add_key(key); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateKeyValueDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *key = nullptr, + const char *value = nullptr) { + auto key__ = key ? _fbb.CreateString(key) : 0; + auto value__ = value ? _fbb.CreateString(value) : 0; + return reflection::CreateKeyValue( + _fbb, + key__, + value__); +} + +struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_VALUE = 6, + VT_OBJECT = 8, + VT_UNION_TYPE = 10, + VT_DOCUMENTATION = 12 + }; + const flatbuffers::String *name() const { + return GetPointer(VT_NAME); + } + int64_t value() const { + return GetField(VT_VALUE, 0); + } + bool KeyCompareLessThan(const EnumVal *o) const { + return value() < o->value(); + } + int KeyCompareWithValue(int64_t val) const { + return static_cast(value() > val) - static_cast(value() < val); + } + const Object *object() const { + return GetPointer(VT_OBJECT); + } + const Type *union_type() const { + return GetPointer(VT_UNION_TYPE); + } + const flatbuffers::Vector> *documentation() const { + return GetPointer> *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyField(verifier, VT_VALUE) && + VerifyOffset(verifier, VT_OBJECT) && + verifier.VerifyTable(object()) && + VerifyOffset(verifier, VT_UNION_TYPE) && + verifier.VerifyTable(union_type()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct EnumValBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) { + fbb_.AddOffset(EnumVal::VT_NAME, name); + } + void add_value(int64_t value) { + fbb_.AddElement(EnumVal::VT_VALUE, value, 0); + } + void add_object(flatbuffers::Offset object) { + fbb_.AddOffset(EnumVal::VT_OBJECT, object); + } + void add_union_type(flatbuffers::Offset union_type) { + fbb_.AddOffset(EnumVal::VT_UNION_TYPE, union_type); + } + void add_documentation(flatbuffers::Offset>> documentation) { + fbb_.AddOffset(EnumVal::VT_DOCUMENTATION, documentation); + } + explicit EnumValBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + EnumValBuilder &operator=(const EnumValBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, EnumVal::VT_NAME); + return o; + } +}; + +inline flatbuffers::Offset CreateEnumVal( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + int64_t value = 0, + flatbuffers::Offset object = 0, + flatbuffers::Offset union_type = 0, + flatbuffers::Offset>> documentation = 0) { + EnumValBuilder builder_(_fbb); + builder_.add_value(value); + builder_.add_documentation(documentation); + builder_.add_union_type(union_type); + builder_.add_object(object); + builder_.add_name(name); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateEnumValDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + int64_t value = 0, + flatbuffers::Offset object = 0, + flatbuffers::Offset union_type = 0, + const std::vector> *documentation = nullptr) { + auto name__ = name ? _fbb.CreateString(name) : 0; + auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; + return reflection::CreateEnumVal( + _fbb, + name__, + value, + object, + union_type, + documentation__); +} + +struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_VALUES = 6, + VT_IS_UNION = 8, + VT_UNDERLYING_TYPE = 10, + VT_ATTRIBUTES = 12, + VT_DOCUMENTATION = 14 + }; + const flatbuffers::String *name() const { + return GetPointer(VT_NAME); + } + bool KeyCompareLessThan(const Enum *o) const { + return *name() < *o->name(); + } + int KeyCompareWithValue(const char *val) const { + return strcmp(name()->c_str(), val); + } + const flatbuffers::Vector> *values() const { + return GetPointer> *>(VT_VALUES); + } + bool is_union() const { + return GetField(VT_IS_UNION, 0) != 0; + } + const Type *underlying_type() const { + return GetPointer(VT_UNDERLYING_TYPE); + } + const flatbuffers::Vector> *attributes() const { + return GetPointer> *>(VT_ATTRIBUTES); + } + const flatbuffers::Vector> *documentation() const { + return GetPointer> *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffsetRequired(verifier, VT_VALUES) && + verifier.VerifyVector(values()) && + verifier.VerifyVectorOfTables(values()) && + VerifyField(verifier, VT_IS_UNION) && + VerifyOffsetRequired(verifier, VT_UNDERLYING_TYPE) && + verifier.VerifyTable(underlying_type()) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct EnumBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) { + fbb_.AddOffset(Enum::VT_NAME, name); + } + void add_values(flatbuffers::Offset>> values) { + fbb_.AddOffset(Enum::VT_VALUES, values); + } + void add_is_union(bool is_union) { + fbb_.AddElement(Enum::VT_IS_UNION, static_cast(is_union), 0); + } + void add_underlying_type(flatbuffers::Offset underlying_type) { + fbb_.AddOffset(Enum::VT_UNDERLYING_TYPE, underlying_type); + } + void add_attributes(flatbuffers::Offset>> attributes) { + fbb_.AddOffset(Enum::VT_ATTRIBUTES, attributes); + } + void add_documentation(flatbuffers::Offset>> documentation) { + fbb_.AddOffset(Enum::VT_DOCUMENTATION, documentation); + } + explicit EnumBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + EnumBuilder &operator=(const EnumBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, Enum::VT_NAME); + fbb_.Required(o, Enum::VT_VALUES); + fbb_.Required(o, Enum::VT_UNDERLYING_TYPE); + return o; + } +}; + +inline flatbuffers::Offset CreateEnum( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + flatbuffers::Offset>> values = 0, + bool is_union = false, + flatbuffers::Offset underlying_type = 0, + flatbuffers::Offset>> attributes = 0, + flatbuffers::Offset>> documentation = 0) { + EnumBuilder builder_(_fbb); + builder_.add_documentation(documentation); + builder_.add_attributes(attributes); + builder_.add_underlying_type(underlying_type); + builder_.add_values(values); + builder_.add_name(name); + builder_.add_is_union(is_union); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateEnumDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + const std::vector> *values = nullptr, + bool is_union = false, + flatbuffers::Offset underlying_type = 0, + const std::vector> *attributes = nullptr, + const std::vector> *documentation = nullptr) { + auto name__ = name ? _fbb.CreateString(name) : 0; + auto values__ = values ? _fbb.CreateVector>(*values) : 0; + auto attributes__ = attributes ? _fbb.CreateVector>(*attributes) : 0; + auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; + return reflection::CreateEnum( + _fbb, + name__, + values__, + is_union, + underlying_type, + attributes__, + documentation__); +} + +struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_TYPE = 6, + VT_ID = 8, + VT_OFFSET = 10, + VT_DEFAULT_INTEGER = 12, + VT_DEFAULT_REAL = 14, + VT_DEPRECATED = 16, + VT_REQUIRED = 18, + VT_KEY = 20, + VT_ATTRIBUTES = 22, + VT_DOCUMENTATION = 24 + }; + const flatbuffers::String *name() const { + return GetPointer(VT_NAME); + } + bool KeyCompareLessThan(const Field *o) const { + return *name() < *o->name(); + } + int KeyCompareWithValue(const char *val) const { + return strcmp(name()->c_str(), val); + } + const Type *type() const { + return GetPointer(VT_TYPE); + } + uint16_t id() const { + return GetField(VT_ID, 0); + } + uint16_t offset() const { + return GetField(VT_OFFSET, 0); + } + int64_t default_integer() const { + return GetField(VT_DEFAULT_INTEGER, 0); + } + double default_real() const { + return GetField(VT_DEFAULT_REAL, 0.0); + } + bool deprecated() const { + return GetField(VT_DEPRECATED, 0) != 0; + } + bool required() const { + return GetField(VT_REQUIRED, 0) != 0; + } + bool key() const { + return GetField(VT_KEY, 0) != 0; + } + const flatbuffers::Vector> *attributes() const { + return GetPointer> *>(VT_ATTRIBUTES); + } + const flatbuffers::Vector> *documentation() const { + return GetPointer> *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffsetRequired(verifier, VT_TYPE) && + verifier.VerifyTable(type()) && + VerifyField(verifier, VT_ID) && + VerifyField(verifier, VT_OFFSET) && + VerifyField(verifier, VT_DEFAULT_INTEGER) && + VerifyField(verifier, VT_DEFAULT_REAL) && + VerifyField(verifier, VT_DEPRECATED) && + VerifyField(verifier, VT_REQUIRED) && + VerifyField(verifier, VT_KEY) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct FieldBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) { + fbb_.AddOffset(Field::VT_NAME, name); + } + void add_type(flatbuffers::Offset type) { + fbb_.AddOffset(Field::VT_TYPE, type); + } + void add_id(uint16_t id) { + fbb_.AddElement(Field::VT_ID, id, 0); + } + void add_offset(uint16_t offset) { + fbb_.AddElement(Field::VT_OFFSET, offset, 0); + } + void add_default_integer(int64_t default_integer) { + fbb_.AddElement(Field::VT_DEFAULT_INTEGER, default_integer, 0); + } + void add_default_real(double default_real) { + fbb_.AddElement(Field::VT_DEFAULT_REAL, default_real, 0.0); + } + void add_deprecated(bool deprecated) { + fbb_.AddElement(Field::VT_DEPRECATED, static_cast(deprecated), 0); + } + void add_required(bool required) { + fbb_.AddElement(Field::VT_REQUIRED, static_cast(required), 0); + } + void add_key(bool key) { + fbb_.AddElement(Field::VT_KEY, static_cast(key), 0); + } + void add_attributes(flatbuffers::Offset>> attributes) { + fbb_.AddOffset(Field::VT_ATTRIBUTES, attributes); + } + void add_documentation(flatbuffers::Offset>> documentation) { + fbb_.AddOffset(Field::VT_DOCUMENTATION, documentation); + } + explicit FieldBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + FieldBuilder &operator=(const FieldBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, Field::VT_NAME); + fbb_.Required(o, Field::VT_TYPE); + return o; + } +}; + +inline flatbuffers::Offset CreateField( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + flatbuffers::Offset type = 0, + uint16_t id = 0, + uint16_t offset = 0, + int64_t default_integer = 0, + double default_real = 0.0, + bool deprecated = false, + bool required = false, + bool key = false, + flatbuffers::Offset>> attributes = 0, + flatbuffers::Offset>> documentation = 0) { + FieldBuilder builder_(_fbb); + builder_.add_default_real(default_real); + builder_.add_default_integer(default_integer); + builder_.add_documentation(documentation); + builder_.add_attributes(attributes); + builder_.add_type(type); + builder_.add_name(name); + builder_.add_offset(offset); + builder_.add_id(id); + builder_.add_key(key); + builder_.add_required(required); + builder_.add_deprecated(deprecated); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateFieldDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + flatbuffers::Offset type = 0, + uint16_t id = 0, + uint16_t offset = 0, + int64_t default_integer = 0, + double default_real = 0.0, + bool deprecated = false, + bool required = false, + bool key = false, + const std::vector> *attributes = nullptr, + const std::vector> *documentation = nullptr) { + auto name__ = name ? _fbb.CreateString(name) : 0; + auto attributes__ = attributes ? _fbb.CreateVector>(*attributes) : 0; + auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; + return reflection::CreateField( + _fbb, + name__, + type, + id, + offset, + default_integer, + default_real, + deprecated, + required, + key, + attributes__, + documentation__); +} + +struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_FIELDS = 6, + VT_IS_STRUCT = 8, + VT_MINALIGN = 10, + VT_BYTESIZE = 12, + VT_ATTRIBUTES = 14, + VT_DOCUMENTATION = 16 + }; + const flatbuffers::String *name() const { + return GetPointer(VT_NAME); + } + bool KeyCompareLessThan(const Object *o) const { + return *name() < *o->name(); + } + int KeyCompareWithValue(const char *val) const { + return strcmp(name()->c_str(), val); + } + const flatbuffers::Vector> *fields() const { + return GetPointer> *>(VT_FIELDS); + } + bool is_struct() const { + return GetField(VT_IS_STRUCT, 0) != 0; + } + int32_t minalign() const { + return GetField(VT_MINALIGN, 0); + } + int32_t bytesize() const { + return GetField(VT_BYTESIZE, 0); + } + const flatbuffers::Vector> *attributes() const { + return GetPointer> *>(VT_ATTRIBUTES); + } + const flatbuffers::Vector> *documentation() const { + return GetPointer> *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffsetRequired(verifier, VT_FIELDS) && + verifier.VerifyVector(fields()) && + verifier.VerifyVectorOfTables(fields()) && + VerifyField(verifier, VT_IS_STRUCT) && + VerifyField(verifier, VT_MINALIGN) && + VerifyField(verifier, VT_BYTESIZE) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct ObjectBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) { + fbb_.AddOffset(Object::VT_NAME, name); + } + void add_fields(flatbuffers::Offset>> fields) { + fbb_.AddOffset(Object::VT_FIELDS, fields); + } + void add_is_struct(bool is_struct) { + fbb_.AddElement(Object::VT_IS_STRUCT, static_cast(is_struct), 0); + } + void add_minalign(int32_t minalign) { + fbb_.AddElement(Object::VT_MINALIGN, minalign, 0); + } + void add_bytesize(int32_t bytesize) { + fbb_.AddElement(Object::VT_BYTESIZE, bytesize, 0); + } + void add_attributes(flatbuffers::Offset>> attributes) { + fbb_.AddOffset(Object::VT_ATTRIBUTES, attributes); + } + void add_documentation(flatbuffers::Offset>> documentation) { + fbb_.AddOffset(Object::VT_DOCUMENTATION, documentation); + } + explicit ObjectBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ObjectBuilder &operator=(const ObjectBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, Object::VT_NAME); + fbb_.Required(o, Object::VT_FIELDS); + return o; + } +}; + +inline flatbuffers::Offset CreateObject( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + flatbuffers::Offset>> fields = 0, + bool is_struct = false, + int32_t minalign = 0, + int32_t bytesize = 0, + flatbuffers::Offset>> attributes = 0, + flatbuffers::Offset>> documentation = 0) { + ObjectBuilder builder_(_fbb); + builder_.add_documentation(documentation); + builder_.add_attributes(attributes); + builder_.add_bytesize(bytesize); + builder_.add_minalign(minalign); + builder_.add_fields(fields); + builder_.add_name(name); + builder_.add_is_struct(is_struct); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateObjectDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + const std::vector> *fields = nullptr, + bool is_struct = false, + int32_t minalign = 0, + int32_t bytesize = 0, + const std::vector> *attributes = nullptr, + const std::vector> *documentation = nullptr) { + auto name__ = name ? _fbb.CreateString(name) : 0; + auto fields__ = fields ? _fbb.CreateVector>(*fields) : 0; + auto attributes__ = attributes ? _fbb.CreateVector>(*attributes) : 0; + auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; + return reflection::CreateObject( + _fbb, + name__, + fields__, + is_struct, + minalign, + bytesize, + attributes__, + documentation__); +} + +struct RPCCall FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_REQUEST = 6, + VT_RESPONSE = 8, + VT_ATTRIBUTES = 10, + VT_DOCUMENTATION = 12 + }; + const flatbuffers::String *name() const { + return GetPointer(VT_NAME); + } + bool KeyCompareLessThan(const RPCCall *o) const { + return *name() < *o->name(); + } + int KeyCompareWithValue(const char *val) const { + return strcmp(name()->c_str(), val); + } + const Object *request() const { + return GetPointer(VT_REQUEST); + } + const Object *response() const { + return GetPointer(VT_RESPONSE); + } + const flatbuffers::Vector> *attributes() const { + return GetPointer> *>(VT_ATTRIBUTES); + } + const flatbuffers::Vector> *documentation() const { + return GetPointer> *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffsetRequired(verifier, VT_REQUEST) && + verifier.VerifyTable(request()) && + VerifyOffsetRequired(verifier, VT_RESPONSE) && + verifier.VerifyTable(response()) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct RPCCallBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) { + fbb_.AddOffset(RPCCall::VT_NAME, name); + } + void add_request(flatbuffers::Offset request) { + fbb_.AddOffset(RPCCall::VT_REQUEST, request); + } + void add_response(flatbuffers::Offset response) { + fbb_.AddOffset(RPCCall::VT_RESPONSE, response); + } + void add_attributes(flatbuffers::Offset>> attributes) { + fbb_.AddOffset(RPCCall::VT_ATTRIBUTES, attributes); + } + void add_documentation(flatbuffers::Offset>> documentation) { + fbb_.AddOffset(RPCCall::VT_DOCUMENTATION, documentation); + } + explicit RPCCallBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + RPCCallBuilder &operator=(const RPCCallBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, RPCCall::VT_NAME); + fbb_.Required(o, RPCCall::VT_REQUEST); + fbb_.Required(o, RPCCall::VT_RESPONSE); + return o; + } +}; + +inline flatbuffers::Offset CreateRPCCall( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + flatbuffers::Offset request = 0, + flatbuffers::Offset response = 0, + flatbuffers::Offset>> attributes = 0, + flatbuffers::Offset>> documentation = 0) { + RPCCallBuilder builder_(_fbb); + builder_.add_documentation(documentation); + builder_.add_attributes(attributes); + builder_.add_response(response); + builder_.add_request(request); + builder_.add_name(name); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateRPCCallDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + flatbuffers::Offset request = 0, + flatbuffers::Offset response = 0, + const std::vector> *attributes = nullptr, + const std::vector> *documentation = nullptr) { + auto name__ = name ? _fbb.CreateString(name) : 0; + auto attributes__ = attributes ? _fbb.CreateVector>(*attributes) : 0; + auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; + return reflection::CreateRPCCall( + _fbb, + name__, + request, + response, + attributes__, + documentation__); +} + +struct Service FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_CALLS = 6, + VT_ATTRIBUTES = 8, + VT_DOCUMENTATION = 10 + }; + const flatbuffers::String *name() const { + return GetPointer(VT_NAME); + } + bool KeyCompareLessThan(const Service *o) const { + return *name() < *o->name(); + } + int KeyCompareWithValue(const char *val) const { + return strcmp(name()->c_str(), val); + } + const flatbuffers::Vector> *calls() const { + return GetPointer> *>(VT_CALLS); + } + const flatbuffers::Vector> *attributes() const { + return GetPointer> *>(VT_ATTRIBUTES); + } + const flatbuffers::Vector> *documentation() const { + return GetPointer> *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffset(verifier, VT_CALLS) && + verifier.VerifyVector(calls()) && + verifier.VerifyVectorOfTables(calls()) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct ServiceBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) { + fbb_.AddOffset(Service::VT_NAME, name); + } + void add_calls(flatbuffers::Offset>> calls) { + fbb_.AddOffset(Service::VT_CALLS, calls); + } + void add_attributes(flatbuffers::Offset>> attributes) { + fbb_.AddOffset(Service::VT_ATTRIBUTES, attributes); + } + void add_documentation(flatbuffers::Offset>> documentation) { + fbb_.AddOffset(Service::VT_DOCUMENTATION, documentation); + } + explicit ServiceBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ServiceBuilder &operator=(const ServiceBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, Service::VT_NAME); + return o; + } +}; + +inline flatbuffers::Offset CreateService( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + flatbuffers::Offset>> calls = 0, + flatbuffers::Offset>> attributes = 0, + flatbuffers::Offset>> documentation = 0) { + ServiceBuilder builder_(_fbb); + builder_.add_documentation(documentation); + builder_.add_attributes(attributes); + builder_.add_calls(calls); + builder_.add_name(name); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateServiceDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + const std::vector> *calls = nullptr, + const std::vector> *attributes = nullptr, + const std::vector> *documentation = nullptr) { + auto name__ = name ? _fbb.CreateString(name) : 0; + auto calls__ = calls ? _fbb.CreateVector>(*calls) : 0; + auto attributes__ = attributes ? _fbb.CreateVector>(*attributes) : 0; + auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; + return reflection::CreateService( + _fbb, + name__, + calls__, + attributes__, + documentation__); +} + +struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_OBJECTS = 4, + VT_ENUMS = 6, + VT_FILE_IDENT = 8, + VT_FILE_EXT = 10, + VT_ROOT_TABLE = 12, + VT_SERVICES = 14 + }; + const flatbuffers::Vector> *objects() const { + return GetPointer> *>(VT_OBJECTS); + } + const flatbuffers::Vector> *enums() const { + return GetPointer> *>(VT_ENUMS); + } + const flatbuffers::String *file_ident() const { + return GetPointer(VT_FILE_IDENT); + } + const flatbuffers::String *file_ext() const { + return GetPointer(VT_FILE_EXT); + } + const Object *root_table() const { + return GetPointer(VT_ROOT_TABLE); + } + const flatbuffers::Vector> *services() const { + return GetPointer> *>(VT_SERVICES); + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_OBJECTS) && + verifier.VerifyVector(objects()) && + verifier.VerifyVectorOfTables(objects()) && + VerifyOffsetRequired(verifier, VT_ENUMS) && + verifier.VerifyVector(enums()) && + verifier.VerifyVectorOfTables(enums()) && + VerifyOffset(verifier, VT_FILE_IDENT) && + verifier.VerifyString(file_ident()) && + VerifyOffset(verifier, VT_FILE_EXT) && + verifier.VerifyString(file_ext()) && + VerifyOffset(verifier, VT_ROOT_TABLE) && + verifier.VerifyTable(root_table()) && + VerifyOffset(verifier, VT_SERVICES) && + verifier.VerifyVector(services()) && + verifier.VerifyVectorOfTables(services()) && + verifier.EndTable(); + } +}; + +struct SchemaBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_objects(flatbuffers::Offset>> objects) { + fbb_.AddOffset(Schema::VT_OBJECTS, objects); + } + void add_enums(flatbuffers::Offset>> enums) { + fbb_.AddOffset(Schema::VT_ENUMS, enums); + } + void add_file_ident(flatbuffers::Offset file_ident) { + fbb_.AddOffset(Schema::VT_FILE_IDENT, file_ident); + } + void add_file_ext(flatbuffers::Offset file_ext) { + fbb_.AddOffset(Schema::VT_FILE_EXT, file_ext); + } + void add_root_table(flatbuffers::Offset root_table) { + fbb_.AddOffset(Schema::VT_ROOT_TABLE, root_table); + } + void add_services(flatbuffers::Offset>> services) { + fbb_.AddOffset(Schema::VT_SERVICES, services); + } + explicit SchemaBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + SchemaBuilder &operator=(const SchemaBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, Schema::VT_OBJECTS); + fbb_.Required(o, Schema::VT_ENUMS); + return o; + } +}; + +inline flatbuffers::Offset CreateSchema( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset>> objects = 0, + flatbuffers::Offset>> enums = 0, + flatbuffers::Offset file_ident = 0, + flatbuffers::Offset file_ext = 0, + flatbuffers::Offset root_table = 0, + flatbuffers::Offset>> services = 0) { + SchemaBuilder builder_(_fbb); + builder_.add_services(services); + builder_.add_root_table(root_table); + builder_.add_file_ext(file_ext); + builder_.add_file_ident(file_ident); + builder_.add_enums(enums); + builder_.add_objects(objects); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateSchemaDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector> *objects = nullptr, + const std::vector> *enums = nullptr, + const char *file_ident = nullptr, + const char *file_ext = nullptr, + flatbuffers::Offset root_table = 0, + const std::vector> *services = nullptr) { + auto objects__ = objects ? _fbb.CreateVector>(*objects) : 0; + auto enums__ = enums ? _fbb.CreateVector>(*enums) : 0; + auto file_ident__ = file_ident ? _fbb.CreateString(file_ident) : 0; + auto file_ext__ = file_ext ? _fbb.CreateString(file_ext) : 0; + auto services__ = services ? _fbb.CreateVector>(*services) : 0; + return reflection::CreateSchema( + _fbb, + objects__, + enums__, + file_ident__, + file_ext__, + root_table, + services__); +} + +inline const reflection::Schema *GetSchema(const void *buf) { + return flatbuffers::GetRoot(buf); +} + +inline const reflection::Schema *GetSizePrefixedSchema(const void *buf) { + return flatbuffers::GetSizePrefixedRoot(buf); +} + +inline const char *SchemaIdentifier() { + return "BFBS"; +} + +inline bool SchemaBufferHasIdentifier(const void *buf) { + return flatbuffers::BufferHasIdentifier( + buf, SchemaIdentifier()); +} + +inline bool VerifySchemaBuffer( + flatbuffers::Verifier &verifier) { + return verifier.VerifyBuffer(SchemaIdentifier()); +} + +inline bool VerifySizePrefixedSchemaBuffer( + flatbuffers::Verifier &verifier) { + return verifier.VerifySizePrefixedBuffer(SchemaIdentifier()); +} + +inline const char *SchemaExtension() { + return "bfbs"; +} + +inline void FinishSchemaBuffer( + flatbuffers::FlatBufferBuilder &fbb, + flatbuffers::Offset root) { + fbb.Finish(root, SchemaIdentifier()); +} + +inline void FinishSizePrefixedSchemaBuffer( + flatbuffers::FlatBufferBuilder &fbb, + flatbuffers::Offset root) { + fbb.FinishSizePrefixed(root, SchemaIdentifier()); +} + +} // namespace reflection + +#endif // FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/registry.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/registry.h new file mode 100644 index 000000000..9ea425b39 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/registry.h @@ -0,0 +1,127 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_REGISTRY_H_ +#define FLATBUFFERS_REGISTRY_H_ + +#include "flatbuffers/idl.h" + +namespace flatbuffers { + +// Convenience class to easily parse or generate text for arbitrary FlatBuffers. +// Simply pre-populate it with all schema filenames that may be in use, and +// This class will look them up using the file_identifier declared in the +// schema. +class Registry { + public: + // Call this for all schemas that may be in use. The identifier has + // a function in the generated code, e.g. MonsterIdentifier(). + void Register(const char *file_identifier, const char *schema_path) { + Schema schema; + schema.path_ = schema_path; + schemas_[file_identifier] = schema; + } + + // Generate text from an arbitrary FlatBuffer by looking up its + // file_identifier in the registry. + bool FlatBufferToText(const uint8_t *flatbuf, size_t len, std::string *dest) { + // Get the identifier out of the buffer. + // If the buffer is truncated, exit. + if (len < sizeof(uoffset_t) + FlatBufferBuilder::kFileIdentifierLength) { + lasterror_ = "buffer truncated"; + return false; + } + std::string ident( + reinterpret_cast(flatbuf) + sizeof(uoffset_t), + FlatBufferBuilder::kFileIdentifierLength); + // Load and parse the schema. + Parser parser; + if (!LoadSchema(ident, &parser)) return false; + // Now we're ready to generate text. + if (!GenerateText(parser, flatbuf, dest)) { + lasterror_ = "unable to generate text for FlatBuffer binary"; + return false; + } + return true; + } + + // Converts a binary buffer to text using one of the schemas in the registry, + // use the file_identifier to indicate which. + // If DetachedBuffer::data() is null then parsing failed. + DetachedBuffer TextToFlatBuffer(const char *text, + const char *file_identifier) { + // Load and parse the schema. + Parser parser; + if (!LoadSchema(file_identifier, &parser)) return DetachedBuffer(); + // Parse the text. + if (!parser.Parse(text)) { + lasterror_ = parser.error_; + return DetachedBuffer(); + } + // We have a valid FlatBuffer. Detach it from the builder and return. + return parser.builder_.Release(); + } + + // Modify any parsing / output options used by the other functions. + void SetOptions(const IDLOptions &opts) { opts_ = opts; } + + // If schemas used contain include statements, call this function for every + // directory the parser should search them for. + void AddIncludeDirectory(const char *path) { include_paths_.push_back(path); } + + // Returns a human readable error if any of the above functions fail. + const std::string &GetLastError() { return lasterror_; } + + private: + bool LoadSchema(const std::string &ident, Parser *parser) { + // Find the schema, if not, exit. + auto it = schemas_.find(ident); + if (it == schemas_.end()) { + // Don't attach the identifier, since it may not be human readable. + lasterror_ = "identifier for this buffer not in the registry"; + return false; + } + auto &schema = it->second; + // Load the schema from disk. If not, exit. + std::string schematext; + if (!LoadFile(schema.path_.c_str(), false, &schematext)) { + lasterror_ = "could not load schema: " + schema.path_; + return false; + } + // Parse schema. + parser->opts = opts_; + if (!parser->Parse(schematext.c_str(), vector_data(include_paths_), + schema.path_.c_str())) { + lasterror_ = parser->error_; + return false; + } + return true; + } + + struct Schema { + std::string path_; + // TODO(wvo) optionally cache schema file or parsed schema here. + }; + + std::string lasterror_; + IDLOptions opts_; + std::vector include_paths_; + std::map schemas_; +}; + +} // namespace flatbuffers + +#endif // FLATBUFFERS_REGISTRY_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/stl_emulation.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/stl_emulation.h new file mode 100644 index 000000000..6f6e76642 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/stl_emulation.h @@ -0,0 +1,275 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_STL_EMULATION_H_ +#define FLATBUFFERS_STL_EMULATION_H_ + +// clang-format off + +#include +#include +#include +#include +#include + +#if defined(_STLPORT_VERSION) && !defined(FLATBUFFERS_CPP98_STL) + #define FLATBUFFERS_CPP98_STL +#endif // defined(_STLPORT_VERSION) && !defined(FLATBUFFERS_CPP98_STL) + +#if defined(FLATBUFFERS_CPP98_STL) + #include +#endif // defined(FLATBUFFERS_CPP98_STL) + +// Check if we can use template aliases +// Not possible if Microsoft Compiler before 2012 +// Possible is the language feature __cpp_alias_templates is defined well +// Or possible if the C++ std is C+11 or newer +#if (defined(_MSC_VER) && _MSC_VER > 1700 /* MSVC2012 */) \ + || (defined(__cpp_alias_templates) && __cpp_alias_templates >= 200704) \ + || (defined(__cplusplus) && __cplusplus >= 201103L) + #define FLATBUFFERS_TEMPLATES_ALIASES +#endif + +// This header provides backwards compatibility for C++98 STLs like stlport. +namespace flatbuffers { + +// Retrieve ::back() from a string in a way that is compatible with pre C++11 +// STLs (e.g stlport). +inline char& string_back(std::string &value) { + return value[value.length() - 1]; +} + +inline char string_back(const std::string &value) { + return value[value.length() - 1]; +} + +// Helper method that retrieves ::data() from a vector in a way that is +// compatible with pre C++11 STLs (e.g stlport). +template inline T *vector_data(std::vector &vector) { + // In some debug environments, operator[] does bounds checking, so &vector[0] + // can't be used. + return vector.empty() ? nullptr : &vector[0]; +} + +template inline const T *vector_data( + const std::vector &vector) { + return vector.empty() ? nullptr : &vector[0]; +} + +template +inline void vector_emplace_back(std::vector *vector, V &&data) { + #if defined(FLATBUFFERS_CPP98_STL) + vector->push_back(data); + #else + vector->emplace_back(std::forward(data)); + #endif // defined(FLATBUFFERS_CPP98_STL) +} + +#ifndef FLATBUFFERS_CPP98_STL + #if defined(FLATBUFFERS_TEMPLATES_ALIASES) + template + using numeric_limits = std::numeric_limits; + #else + template class numeric_limits : + public std::numeric_limits {}; + #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) +#else + template class numeric_limits : + public std::numeric_limits { + public: + // Android NDK fix. + static T lowest() { + return std::numeric_limits::min(); + } + }; + + template <> class numeric_limits : + public std::numeric_limits { + public: + static float lowest() { return -FLT_MAX; } + }; + + template <> class numeric_limits : + public std::numeric_limits { + public: + static double lowest() { return -DBL_MAX; } + }; + + template <> class numeric_limits { + public: + static unsigned long long min() { return 0ULL; } + static unsigned long long max() { return ~0ULL; } + static unsigned long long lowest() { + return numeric_limits::min(); + } + }; + + template <> class numeric_limits { + public: + static long long min() { + return static_cast(1ULL << ((sizeof(long long) << 3) - 1)); + } + static long long max() { + return static_cast( + (1ULL << ((sizeof(long long) << 3) - 1)) - 1); + } + static long long lowest() { + return numeric_limits::min(); + } + }; +#endif // FLATBUFFERS_CPP98_STL + +#if defined(FLATBUFFERS_TEMPLATES_ALIASES) + #ifndef FLATBUFFERS_CPP98_STL + template using is_scalar = std::is_scalar; + template using is_same = std::is_same; + template using is_floating_point = std::is_floating_point; + template using is_unsigned = std::is_unsigned; + template using make_unsigned = std::make_unsigned; + #else + // Map C++ TR1 templates defined by stlport. + template using is_scalar = std::tr1::is_scalar; + template using is_same = std::tr1::is_same; + template using is_floating_point = + std::tr1::is_floating_point; + template using is_unsigned = std::tr1::is_unsigned; + // Android NDK doesn't have std::make_unsigned or std::tr1::make_unsigned. + template struct make_unsigned { + static_assert(is_unsigned::value, "Specialization not implemented!"); + using type = T; + }; + template<> struct make_unsigned { using type = unsigned char; }; + template<> struct make_unsigned { using type = unsigned short; }; + template<> struct make_unsigned { using type = unsigned int; }; + template<> struct make_unsigned { using type = unsigned long; }; + template<> + struct make_unsigned { using type = unsigned long long; }; + #endif // !FLATBUFFERS_CPP98_STL +#else + // MSVC 2010 doesn't support C++11 aliases. + template struct is_scalar : public std::is_scalar {}; + template struct is_same : public std::is_same {}; + template struct is_floating_point : + public std::is_floating_point {}; + template struct is_unsigned : public std::is_unsigned {}; + template struct make_unsigned : public std::make_unsigned {}; +#endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) + +#ifndef FLATBUFFERS_CPP98_STL + #if defined(FLATBUFFERS_TEMPLATES_ALIASES) + template using unique_ptr = std::unique_ptr; + #else + // MSVC 2010 doesn't support C++11 aliases. + // We're manually "aliasing" the class here as we want to bring unique_ptr + // into the flatbuffers namespace. We have unique_ptr in the flatbuffers + // namespace we have a completely independent implemenation (see below) + // for C++98 STL implementations. + template class unique_ptr : public std::unique_ptr { + public: + unique_ptr() {} + explicit unique_ptr(T* p) : std::unique_ptr(p) {} + unique_ptr(std::unique_ptr&& u) { *this = std::move(u); } + unique_ptr(unique_ptr&& u) { *this = std::move(u); } + unique_ptr& operator=(std::unique_ptr&& u) { + std::unique_ptr::reset(u.release()); + return *this; + } + unique_ptr& operator=(unique_ptr&& u) { + std::unique_ptr::reset(u.release()); + return *this; + } + unique_ptr& operator=(T* p) { + return std::unique_ptr::operator=(p); + } + }; + #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) +#else + // Very limited implementation of unique_ptr. + // This is provided simply to allow the C++ code generated from the default + // settings to function in C++98 environments with no modifications. + template class unique_ptr { + public: + typedef T element_type; + + unique_ptr() : ptr_(nullptr) {} + explicit unique_ptr(T* p) : ptr_(p) {} + unique_ptr(unique_ptr&& u) : ptr_(nullptr) { reset(u.release()); } + unique_ptr(const unique_ptr& u) : ptr_(nullptr) { + reset(const_cast(&u)->release()); + } + ~unique_ptr() { reset(); } + + unique_ptr& operator=(const unique_ptr& u) { + reset(const_cast(&u)->release()); + return *this; + } + + unique_ptr& operator=(unique_ptr&& u) { + reset(u.release()); + return *this; + } + + unique_ptr& operator=(T* p) { + reset(p); + return *this; + } + + const T& operator*() const { return *ptr_; } + T* operator->() const { return ptr_; } + T* get() const noexcept { return ptr_; } + explicit operator bool() const { return ptr_ != nullptr; } + + // modifiers + T* release() { + T* value = ptr_; + ptr_ = nullptr; + return value; + } + + void reset(T* p = nullptr) { + T* value = ptr_; + ptr_ = p; + if (value) delete value; + } + + void swap(unique_ptr& u) { + T* temp_ptr = ptr_; + ptr_ = u.ptr_; + u.ptr_ = temp_ptr; + } + + private: + T* ptr_; + }; + + template bool operator==(const unique_ptr& x, + const unique_ptr& y) { + return x.get() == y.get(); + } + + template bool operator==(const unique_ptr& x, + const D* y) { + return static_cast(x.get()) == y; + } + + template bool operator==(const unique_ptr& x, intptr_t y) { + return reinterpret_cast(x.get()) == y; + } +#endif // !FLATBUFFERS_CPP98_STL + +} // namespace flatbuffers + +#endif // FLATBUFFERS_STL_EMULATION_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/util.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/util.h new file mode 100644 index 000000000..4367bbecf --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/flatbuffers/util.h @@ -0,0 +1,654 @@ +/* + * Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_UTIL_H_ +#define FLATBUFFERS_UTIL_H_ + +#include "flatbuffers/base.h" + +#include + +#ifndef FLATBUFFERS_PREFER_PRINTF +# include +#else // FLATBUFFERS_PREFER_PRINTF +# include +# include +#endif // FLATBUFFERS_PREFER_PRINTF + +#include +#include + +namespace flatbuffers { + +// @locale-independent functions for ASCII characters set. + +// Fast checking that character lies in closed range: [a <= x <= b] +// using one compare (conditional branch) operator. +inline bool check_ascii_range(char x, char a, char b) { + FLATBUFFERS_ASSERT(a <= b); + // (Hacker's Delight): `a <= x <= b` <=> `(x-a) <={u} (b-a)`. + // The x, a, b will be promoted to int and subtracted without overflow. + return static_cast(x - a) <= static_cast(b - a); +} + +// Case-insensitive isalpha +inline bool is_alpha(char c) { + // ASCII only: alpha to upper case => reset bit 0x20 (~0x20 = 0xDF). + return check_ascii_range(c & 0xDF, 'a' & 0xDF, 'z' & 0xDF); +} + +// Check (case-insensitive) that `c` is equal to alpha. +inline bool is_alpha_char(char c, char alpha) { + FLATBUFFERS_ASSERT(is_alpha(alpha)); + // ASCII only: alpha to upper case => reset bit 0x20 (~0x20 = 0xDF). + return ((c & 0xDF) == (alpha & 0xDF)); +} + +// https://en.cppreference.com/w/cpp/string/byte/isxdigit +// isdigit and isxdigit are the only standard narrow character classification +// functions that are not affected by the currently installed C locale. although +// some implementations (e.g. Microsoft in 1252 codepage) may classify +// additional single-byte characters as digits. +inline bool is_digit(char c) { return check_ascii_range(c, '0', '9'); } + +inline bool is_xdigit(char c) { + // Replace by look-up table. + return is_digit(c) || check_ascii_range(c & 0xDF, 'a' & 0xDF, 'f' & 0xDF); +} + +// Case-insensitive isalnum +inline bool is_alnum(char c) { return is_alpha(c) || is_digit(c); } + +// @end-locale-independent functions for ASCII character set + +#ifdef FLATBUFFERS_PREFER_PRINTF +template size_t IntToDigitCount(T t) { + size_t digit_count = 0; + // Count the sign for negative numbers + if (t < 0) digit_count++; + // Count a single 0 left of the dot for fractional numbers + if (-1 < t && t < 1) digit_count++; + // Count digits until fractional part + T eps = std::numeric_limits::epsilon(); + while (t <= (-1 + eps) || (1 - eps) <= t) { + t /= 10; + digit_count++; + } + return digit_count; +} + +template size_t NumToStringWidth(T t, int precision = 0) { + size_t string_width = IntToDigitCount(t); + // Count the dot for floating point numbers + if (precision) string_width += (precision + 1); + return string_width; +} + +template +std::string NumToStringImplWrapper(T t, const char *fmt, int precision = 0) { + size_t string_width = NumToStringWidth(t, precision); + std::string s(string_width, 0x00); + // Allow snprintf to use std::string trailing null to detect buffer overflow + snprintf(const_cast(s.data()), (s.size() + 1), fmt, precision, t); + return s; +} +#endif // FLATBUFFERS_PREFER_PRINTF + +// Convert an integer or floating point value to a string. +// In contrast to std::stringstream, "char" values are +// converted to a string of digits, and we don't use scientific notation. +template std::string NumToString(T t) { + // clang-format off + + #ifndef FLATBUFFERS_PREFER_PRINTF + std::stringstream ss; + ss << t; + return ss.str(); + #else // FLATBUFFERS_PREFER_PRINTF + auto v = static_cast(t); + return NumToStringImplWrapper(v, "%.*lld"); + #endif // FLATBUFFERS_PREFER_PRINTF + // clang-format on +} +// Avoid char types used as character data. +template<> inline std::string NumToString(signed char t) { + return NumToString(static_cast(t)); +} +template<> inline std::string NumToString(unsigned char t) { + return NumToString(static_cast(t)); +} +template<> inline std::string NumToString(char t) { + return NumToString(static_cast(t)); +} +#if defined(FLATBUFFERS_CPP98_STL) +template<> inline std::string NumToString(long long t) { + char buf[21]; // (log((1 << 63) - 1) / log(10)) + 2 + snprintf(buf, sizeof(buf), "%lld", t); + return std::string(buf); +} + +template<> +inline std::string NumToString(unsigned long long t) { + char buf[22]; // (log((1 << 63) - 1) / log(10)) + 1 + snprintf(buf, sizeof(buf), "%llu", t); + return std::string(buf); +} +#endif // defined(FLATBUFFERS_CPP98_STL) + +// Special versions for floats/doubles. +template std::string FloatToString(T t, int precision) { + // clang-format off + + #ifndef FLATBUFFERS_PREFER_PRINTF + // to_string() prints different numbers of digits for floats depending on + // platform and isn't available on Android, so we use stringstream + std::stringstream ss; + // Use std::fixed to suppress scientific notation. + ss << std::fixed; + // Default precision is 6, we want that to be higher for doubles. + ss << std::setprecision(precision); + ss << t; + auto s = ss.str(); + #else // FLATBUFFERS_PREFER_PRINTF + auto v = static_cast(t); + auto s = NumToStringImplWrapper(v, "%0.*f", precision); + #endif // FLATBUFFERS_PREFER_PRINTF + // clang-format on + // Sadly, std::fixed turns "1" into "1.00000", so here we undo that. + auto p = s.find_last_not_of('0'); + if (p != std::string::npos) { + // Strip trailing zeroes. If it is a whole number, keep one zero. + s.resize(p + (s[p] == '.' ? 2 : 1)); + } + return s; +} + +template<> inline std::string NumToString(double t) { + return FloatToString(t, 12); +} +template<> inline std::string NumToString(float t) { + return FloatToString(t, 6); +} + +// Convert an integer value to a hexadecimal string. +// The returned string length is always xdigits long, prefixed by 0 digits. +// For example, IntToStringHex(0x23, 8) returns the string "00000023". +inline std::string IntToStringHex(int i, int xdigits) { + FLATBUFFERS_ASSERT(i >= 0); + // clang-format off + + #ifndef FLATBUFFERS_PREFER_PRINTF + std::stringstream ss; + ss << std::setw(xdigits) << std::setfill('0') << std::hex << std::uppercase + << i; + return ss.str(); + #else // FLATBUFFERS_PREFER_PRINTF + return NumToStringImplWrapper(i, "%.*X", xdigits); + #endif // FLATBUFFERS_PREFER_PRINTF + // clang-format on +} + +// clang-format off +// Use locale independent functions {strtod_l, strtof_l, strtoll_l, strtoull_l}. +#if defined(FLATBUFFERS_LOCALE_INDEPENDENT) && (FLATBUFFERS_LOCALE_INDEPENDENT > 0) + class ClassicLocale { + #ifdef _MSC_VER + typedef _locale_t locale_type; + #else + typedef locale_t locale_type; // POSIX.1-2008 locale_t type + #endif + ClassicLocale(); + ~ClassicLocale(); + locale_type locale_; + static ClassicLocale instance_; + public: + static locale_type Get() { return instance_.locale_; } + }; + + #ifdef _MSC_VER + #define __strtoull_impl(s, pe, b) _strtoui64_l(s, pe, b, ClassicLocale::Get()) + #define __strtoll_impl(s, pe, b) _strtoi64_l(s, pe, b, ClassicLocale::Get()) + #define __strtod_impl(s, pe) _strtod_l(s, pe, ClassicLocale::Get()) + #define __strtof_impl(s, pe) _strtof_l(s, pe, ClassicLocale::Get()) + #else + #define __strtoull_impl(s, pe, b) strtoull_l(s, pe, b, ClassicLocale::Get()) + #define __strtoll_impl(s, pe, b) strtoll_l(s, pe, b, ClassicLocale::Get()) + #define __strtod_impl(s, pe) strtod_l(s, pe, ClassicLocale::Get()) + #define __strtof_impl(s, pe) strtof_l(s, pe, ClassicLocale::Get()) + #endif +#else + #define __strtod_impl(s, pe) strtod(s, pe) + #define __strtof_impl(s, pe) static_cast(strtod(s, pe)) + #ifdef _MSC_VER + #define __strtoull_impl(s, pe, b) _strtoui64(s, pe, b) + #define __strtoll_impl(s, pe, b) _strtoi64(s, pe, b) + #else + #define __strtoull_impl(s, pe, b) strtoull(s, pe, b) + #define __strtoll_impl(s, pe, b) strtoll(s, pe, b) + #endif +#endif + +inline void strtoval_impl(int64_t *val, const char *str, char **endptr, + int base) { + *val = __strtoll_impl(str, endptr, base); +} + +inline void strtoval_impl(uint64_t *val, const char *str, char **endptr, + int base) { + *val = __strtoull_impl(str, endptr, base); +} + +inline void strtoval_impl(double *val, const char *str, char **endptr) { + *val = __strtod_impl(str, endptr); +} + +// UBSAN: double to float is safe if numeric_limits::is_iec559 is true. +__supress_ubsan__("float-cast-overflow") +inline void strtoval_impl(float *val, const char *str, char **endptr) { + *val = __strtof_impl(str, endptr); +} +#undef __strtoull_impl +#undef __strtoll_impl +#undef __strtod_impl +#undef __strtof_impl +// clang-format on + +// Adaptor for strtoull()/strtoll(). +// Flatbuffers accepts numbers with any count of leading zeros (-009 is -9), +// while strtoll with base=0 interprets first leading zero as octal prefix. +// In future, it is possible to add prefixed 0b0101. +// 1) Checks errno code for overflow condition (out of range). +// 2) If base <= 0, function try to detect base of number by prefix. +// +// Return value (like strtoull and strtoll, but reject partial result): +// - If successful, an integer value corresponding to the str is returned. +// - If full string conversion can't be performed, 0 is returned. +// - If the converted value falls out of range of corresponding return type, a +// range error occurs. In this case value MAX(T)/MIN(T) is returned. +template +inline bool StringToIntegerImpl(T *val, const char *const str, + const int base = 0, + const bool check_errno = true) { + // T is int64_t or uint64_T + FLATBUFFERS_ASSERT(str); + if (base <= 0) { + auto s = str; + while (*s && !is_digit(*s)) s++; + if (s[0] == '0' && is_alpha_char(s[1], 'X')) + return StringToIntegerImpl(val, str, 16, check_errno); + // if a prefix not match, try base=10 + return StringToIntegerImpl(val, str, 10, check_errno); + } else { + if (check_errno) errno = 0; // clear thread-local errno + auto endptr = str; + strtoval_impl(val, str, const_cast(&endptr), base); + if ((*endptr != '\0') || (endptr == str)) { + *val = 0; // erase partial result + return false; // invalid string + } + // errno is out-of-range, return MAX/MIN + if (check_errno && errno) return false; + return true; + } +} + +template +inline bool StringToFloatImpl(T *val, const char *const str) { + // Type T must be either float or double. + FLATBUFFERS_ASSERT(str && val); + auto end = str; + strtoval_impl(val, str, const_cast(&end)); + auto done = (end != str) && (*end == '\0'); + if (!done) *val = 0; // erase partial result + return done; +} + +// Convert a string to an instance of T. +// Return value (matched with StringToInteger64Impl and strtod): +// - If successful, a numeric value corresponding to the str is returned. +// - If full string conversion can't be performed, 0 is returned. +// - If the converted value falls out of range of corresponding return type, a +// range error occurs. In this case value MAX(T)/MIN(T) is returned. +template inline bool StringToNumber(const char *s, T *val) { + FLATBUFFERS_ASSERT(s && val); + int64_t i64; + // The errno check isn't needed, will return MAX/MIN on overflow. + if (StringToIntegerImpl(&i64, s, 0, false)) { + const int64_t max = flatbuffers::numeric_limits::max(); + const int64_t min = flatbuffers::numeric_limits::lowest(); + if (i64 > max) { + *val = static_cast(max); + return false; + } + if (i64 < min) { + // For unsigned types return max to distinguish from + // "no conversion can be performed" when 0 is returned. + *val = static_cast(flatbuffers::is_unsigned::value ? max : min); + return false; + } + *val = static_cast(i64); + return true; + } + *val = 0; + return false; +} + +template<> inline bool StringToNumber(const char *str, int64_t *val) { + return StringToIntegerImpl(val, str); +} + +template<> +inline bool StringToNumber(const char *str, uint64_t *val) { + if (!StringToIntegerImpl(val, str)) return false; + // The strtoull accepts negative numbers: + // If the minus sign was part of the input sequence, the numeric value + // calculated from the sequence of digits is negated as if by unary minus + // in the result type, which applies unsigned integer wraparound rules. + // Fix this behaviour (except -0). + if (*val) { + auto s = str; + while (*s && !is_digit(*s)) s++; + s = (s > str) ? (s - 1) : s; // step back to one symbol + if (*s == '-') { + // For unsigned types return the max to distinguish from + // "no conversion can be performed". + *val = flatbuffers::numeric_limits::max(); + return false; + } + } + return true; +} + +template<> inline bool StringToNumber(const char *s, float *val) { + return StringToFloatImpl(val, s); +} + +template<> inline bool StringToNumber(const char *s, double *val) { + return StringToFloatImpl(val, s); +} + +inline int64_t StringToInt(const char *s, int base = 10) { + int64_t val; + return StringToIntegerImpl(&val, s, base) ? val : 0; +} + +inline uint64_t StringToUInt(const char *s, int base = 10) { + uint64_t val; + return StringToIntegerImpl(&val, s, base) ? val : 0; +} + +typedef bool (*LoadFileFunction)(const char *filename, bool binary, + std::string *dest); +typedef bool (*FileExistsFunction)(const char *filename); + +LoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function); + +FileExistsFunction SetFileExistsFunction( + FileExistsFunction file_exists_function); + +// Check if file "name" exists. +bool FileExists(const char *name); + +// Check if "name" exists and it is also a directory. +bool DirExists(const char *name); + +// Load file "name" into "buf" returning true if successful +// false otherwise. If "binary" is false data is read +// using ifstream's text mode, otherwise data is read with +// no transcoding. +bool LoadFile(const char *name, bool binary, std::string *buf); + +// Save data "buf" of length "len" bytes into a file +// "name" returning true if successful, false otherwise. +// If "binary" is false data is written using ifstream's +// text mode, otherwise data is written with no +// transcoding. +bool SaveFile(const char *name, const char *buf, size_t len, bool binary); + +// Save data "buf" into file "name" returning true if +// successful, false otherwise. If "binary" is false +// data is written using ifstream's text mode, otherwise +// data is written with no transcoding. +inline bool SaveFile(const char *name, const std::string &buf, bool binary) { + return SaveFile(name, buf.c_str(), buf.size(), binary); +} + +// Functionality for minimalistic portable path handling. + +// The functions below behave correctly regardless of whether posix ('/') or +// Windows ('/' or '\\') separators are used. + +// Any new separators inserted are always posix. +FLATBUFFERS_CONSTEXPR char kPathSeparator = '/'; + +// Returns the path with the extension, if any, removed. +std::string StripExtension(const std::string &filepath); + +// Returns the extension, if any. +std::string GetExtension(const std::string &filepath); + +// Return the last component of the path, after the last separator. +std::string StripPath(const std::string &filepath); + +// Strip the last component of the path + separator. +std::string StripFileName(const std::string &filepath); + +// Concatenates a path with a filename, regardless of wether the path +// ends in a separator or not. +std::string ConCatPathFileName(const std::string &path, + const std::string &filename); + +// Replaces any '\\' separators with '/' +std::string PosixPath(const char *path); + +// This function ensure a directory exists, by recursively +// creating dirs for any parts of the path that don't exist yet. +void EnsureDirExists(const std::string &filepath); + +// Obtains the absolute path from any other path. +// Returns the input path if the absolute path couldn't be resolved. +std::string AbsolutePath(const std::string &filepath); + +// To and from UTF-8 unicode conversion functions + +// Convert a unicode code point into a UTF-8 representation by appending it +// to a string. Returns the number of bytes generated. +inline int ToUTF8(uint32_t ucc, std::string *out) { + FLATBUFFERS_ASSERT(!(ucc & 0x80000000)); // Top bit can't be set. + // 6 possible encodings: http://en.wikipedia.org/wiki/UTF-8 + for (int i = 0; i < 6; i++) { + // Max bits this encoding can represent. + uint32_t max_bits = 6 + i * 5 + static_cast(!i); + if (ucc < (1u << max_bits)) { // does it fit? + // Remaining bits not encoded in the first byte, store 6 bits each + uint32_t remain_bits = i * 6; + // Store first byte: + (*out) += static_cast((0xFE << (max_bits - remain_bits)) | + (ucc >> remain_bits)); + // Store remaining bytes: + for (int j = i - 1; j >= 0; j--) { + (*out) += static_cast(((ucc >> (j * 6)) & 0x3F) | 0x80); + } + return i + 1; // Return the number of bytes added. + } + } + FLATBUFFERS_ASSERT(0); // Impossible to arrive here. + return -1; +} + +// Converts whatever prefix of the incoming string corresponds to a valid +// UTF-8 sequence into a unicode code. The incoming pointer will have been +// advanced past all bytes parsed. +// returns -1 upon corrupt UTF-8 encoding (ignore the incoming pointer in +// this case). +inline int FromUTF8(const char **in) { + int len = 0; + // Count leading 1 bits. + for (int mask = 0x80; mask >= 0x04; mask >>= 1) { + if (**in & mask) { + len++; + } else { + break; + } + } + if ((static_cast(**in) << len) & 0x80) + return -1; // Bit after leading 1's must be 0. + if (!len) return *(*in)++; + // UTF-8 encoded values with a length are between 2 and 4 bytes. + if (len < 2 || len > 4) { return -1; } + // Grab initial bits of the code. + int ucc = *(*in)++ & ((1 << (7 - len)) - 1); + for (int i = 0; i < len - 1; i++) { + if ((**in & 0xC0) != 0x80) return -1; // Upper bits must 1 0. + ucc <<= 6; + ucc |= *(*in)++ & 0x3F; // Grab 6 more bits of the code. + } + // UTF-8 cannot encode values between 0xD800 and 0xDFFF (reserved for + // UTF-16 surrogate pairs). + if (ucc >= 0xD800 && ucc <= 0xDFFF) { return -1; } + // UTF-8 must represent code points in their shortest possible encoding. + switch (len) { + case 2: + // Two bytes of UTF-8 can represent code points from U+0080 to U+07FF. + if (ucc < 0x0080 || ucc > 0x07FF) { return -1; } + break; + case 3: + // Three bytes of UTF-8 can represent code points from U+0800 to U+FFFF. + if (ucc < 0x0800 || ucc > 0xFFFF) { return -1; } + break; + case 4: + // Four bytes of UTF-8 can represent code points from U+10000 to U+10FFFF. + if (ucc < 0x10000 || ucc > 0x10FFFF) { return -1; } + break; + } + return ucc; +} + +#ifndef FLATBUFFERS_PREFER_PRINTF +// Wraps a string to a maximum length, inserting new lines where necessary. Any +// existing whitespace will be collapsed down to a single space. A prefix or +// suffix can be provided, which will be inserted before or after a wrapped +// line, respectively. +inline std::string WordWrap(const std::string in, size_t max_length, + const std::string wrapped_line_prefix, + const std::string wrapped_line_suffix) { + std::istringstream in_stream(in); + std::string wrapped, line, word; + + in_stream >> word; + line = word; + + while (in_stream >> word) { + if ((line.length() + 1 + word.length() + wrapped_line_suffix.length()) < + max_length) { + line += " " + word; + } else { + wrapped += line + wrapped_line_suffix + "\n"; + line = wrapped_line_prefix + word; + } + } + wrapped += line; + + return wrapped; +} +#endif // !FLATBUFFERS_PREFER_PRINTF + +inline bool EscapeString(const char *s, size_t length, std::string *_text, + bool allow_non_utf8, bool natural_utf8) { + std::string &text = *_text; + text += "\""; + for (uoffset_t i = 0; i < length; i++) { + char c = s[i]; + switch (c) { + case '\n': text += "\\n"; break; + case '\t': text += "\\t"; break; + case '\r': text += "\\r"; break; + case '\b': text += "\\b"; break; + case '\f': text += "\\f"; break; + case '\"': text += "\\\""; break; + case '\\': text += "\\\\"; break; + default: + if (c >= ' ' && c <= '~') { + text += c; + } else { + // Not printable ASCII data. Let's see if it's valid UTF-8 first: + const char *utf8 = s + i; + int ucc = FromUTF8(&utf8); + if (ucc < 0) { + if (allow_non_utf8) { + text += "\\x"; + text += IntToStringHex(static_cast(c), 2); + } else { + // There are two cases here: + // + // 1) We reached here by parsing an IDL file. In that case, + // we previously checked for non-UTF-8, so we shouldn't reach + // here. + // + // 2) We reached here by someone calling GenerateText() + // on a previously-serialized flatbuffer. The data might have + // non-UTF-8 Strings, or might be corrupt. + // + // In both cases, we have to give up and inform the caller + // they have no JSON. + return false; + } + } else { + if (natural_utf8) { + // utf8 points to past all utf-8 bytes parsed + text.append(s + i, static_cast(utf8 - s - i)); + } else if (ucc <= 0xFFFF) { + // Parses as Unicode within JSON's \uXXXX range, so use that. + text += "\\u"; + text += IntToStringHex(ucc, 4); + } else if (ucc <= 0x10FFFF) { + // Encode Unicode SMP values to a surrogate pair using two \u + // escapes. + uint32_t base = ucc - 0x10000; + auto high_surrogate = (base >> 10) + 0xD800; + auto low_surrogate = (base & 0x03FF) + 0xDC00; + text += "\\u"; + text += IntToStringHex(high_surrogate, 4); + text += "\\u"; + text += IntToStringHex(low_surrogate, 4); + } + // Skip past characters recognized. + i = static_cast(utf8 - s - 1); + } + } + break; + } + } + text += "\""; + return true; +} + +// Remove paired quotes in a string: "text"|'text' -> text. +std::string RemoveStringQuotes(const std::string &s); + +// Change th global C-locale to locale with name . +// Returns an actual locale name in <_value>, useful if locale_name is "" or +// null. +bool SetGlobalTestLocale(const char *locale_name, + std::string *_value = nullptr); + +// Read (or test) a value of environment variable. +bool ReadEnvironmentVariable(const char *var_name, + std::string *_value = nullptr); + +} // namespace flatbuffers + +#endif // FLATBUFFERS_UTIL_H_ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.cpp b/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.cpp new file mode 100644 index 000000000..cd72c2a0e --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.cpp @@ -0,0 +1,753 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2024, Raspberry Pi Ltd + * + * imx500_tensor_parser.cpp - Parser for imx500 tensors + */ + +#include "imx500_tensor_parser.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "apParams.flatbuffers_generated.h" + +using namespace libcamera; +using namespace RPiController; + +LOG_DEFINE_CATEGORY(IMX500) + +namespace { + +/* Setup in the IMX500 driver */ +constexpr unsigned int TensorStride = 2560; + +constexpr unsigned int DnnHeaderSize = 12; +constexpr unsigned int MipiPhSize = 0; +constexpr unsigned int InputSensorMaxWidth = 1280; +constexpr unsigned int InputSensorMaxHeight = 960; + +enum TensorDataType { + Signed = 0, + Unsigned +}; + +struct DnnHeader { + uint8_t frameValid; + uint8_t frameCount; + uint16_t maxLineLen; + uint16_t apParamSize; + uint16_t networkId; + uint8_t tensorType; +}; + +struct OutputTensorApParams { + uint8_t id; + std::string name; + std::string networkName; + uint16_t numDimensions; + uint8_t bitsPerElement; + std::vector vecDim; + uint16_t shift; + float scale; + uint8_t format; +}; + +struct InputTensorApParams { + uint8_t networkId; + std::string networkName; + uint16_t width; + uint16_t height; + uint16_t channel; + uint16_t widthStride; + uint16_t heightStride; + uint8_t format; +}; + +int parseHeader(DnnHeader &dnnHeader, std::vector &apParams, const uint8_t *src) +{ + dnnHeader = *reinterpret_cast(src); + + LOG(IMX500, Debug) + << "Header: valid " << static_cast(dnnHeader.frameValid) + << " count " << static_cast(dnnHeader.frameCount) + << " max len " << dnnHeader.maxLineLen + << " ap param size " << dnnHeader.apParamSize + << " network id " << dnnHeader.networkId + << " tensor type " << static_cast(dnnHeader.tensorType); + + if (!dnnHeader.frameValid) + return -1; + + apParams.resize(dnnHeader.apParamSize, 0); + + uint32_t i = DnnHeaderSize; + for (unsigned int j = 0; j < dnnHeader.apParamSize; j++) { + if (i >= TensorStride) { + i = 0; + src += TensorStride + MipiPhSize; + } + apParams[j] = src[i++]; + } + + return 0; +} + +int parseOutputApParams(std::vector &outputApParams, const std::vector &apParams, + const DnnHeader &dnnHeader) +{ + const apParams::fb::FBApParams *fbApParams; + const apParams::fb::FBNetwork *fbNetwork; + const apParams::fb::FBOutputTensor *fbOutputTensor; + + fbApParams = apParams::fb::GetFBApParams(apParams.data()); + LOG(IMX500, Debug) << "Networks size: " << fbApParams->networks()->size(); + + outputApParams.clear(); + + for (unsigned int i = 0; i < fbApParams->networks()->size(); i++) { + fbNetwork = (apParams::fb::FBNetwork *)(fbApParams->networks()->Get(i)); + if (fbNetwork->id() != dnnHeader.networkId) + continue; + + LOG(IMX500, Debug) + << "Network: " << fbNetwork->type()->c_str() + << ", i/p size: " << fbNetwork->inputTensors()->size() + << ", o/p size: " << fbNetwork->outputTensors()->size(); + + for (unsigned int j = 0; j < fbNetwork->outputTensors()->size(); j++) { + OutputTensorApParams outApParam; + + fbOutputTensor = (apParams::fb::FBOutputTensor *)fbNetwork->outputTensors()->Get(j); + + outApParam.id = fbOutputTensor->id(); + outApParam.name = fbOutputTensor->name()->str(); + outApParam.networkName = fbNetwork->type()->str(); + outApParam.numDimensions = fbOutputTensor->numOfDimensions(); + + for (unsigned int k = 0; k < fbOutputTensor->numOfDimensions(); k++) { + Dimensions dim; + dim.ordinal = fbOutputTensor->dimensions()->Get(k)->id(); + dim.size = fbOutputTensor->dimensions()->Get(k)->size(); + dim.serializationIndex = fbOutputTensor->dimensions()->Get(k)->serializationIndex(); + dim.padding = fbOutputTensor->dimensions()->Get(k)->padding(); + if (dim.padding != 0) { + LOG(IMX500, Error) + << "Error in AP Params, Non-Zero padding for Dimension " << k; + return -1; + } + + outApParam.vecDim.push_back(dim); + } + + outApParam.bitsPerElement = fbOutputTensor->bitsPerElement(); + outApParam.shift = fbOutputTensor->shift(); + outApParam.scale = fbOutputTensor->scale(); + outApParam.format = fbOutputTensor->format(); + + /* Add the element to vector */ + outputApParams.push_back(outApParam); + } + + break; + } + + return 0; +} + +int populateOutputTensorInfo(IMX500OutputTensorInfo &outputTensorInfo, + const std::vector &outputApParams) +{ + /* Calculate total output size. */ + unsigned int totalOutSize = 0; + for (auto const &ap : outputApParams) { + unsigned int totalDimensionSize = 1; + for (auto &dim : ap.vecDim) { + if (totalDimensionSize >= std::numeric_limits::max() / dim.size) { + LOG(IMX500, Error) << "Invalid totalDimensionSize"; + return -1; + } + + totalDimensionSize *= dim.size; + } + + if (totalOutSize >= std::numeric_limits::max() - totalDimensionSize) { + LOG(IMX500, Error) << "Invalid totalOutSize"; + return -1; + } + + totalOutSize += totalDimensionSize; + } + + if (totalOutSize == 0) { + LOG(IMX500, Error) << "Invalid output tensor info (totalOutSize is 0)"; + return -1; + } + + LOG(IMX500, Debug) << "Final output size: " << totalOutSize; + + if (totalOutSize >= std::numeric_limits::max() / sizeof(float)) { + LOG(IMX500, Error) << "Invalid output tensor info"; + return -1; + } + + outputTensorInfo.data = std::shared_ptr(new float[totalOutSize]); + unsigned int numOutputTensors = outputApParams.size(); + + if (!numOutputTensors) { + LOG(IMX500, Error) << "Invalid numOutputTensors (0)"; + return -1; + } + + if (numOutputTensors >= std::numeric_limits::max() / sizeof(uint32_t)) { + LOG(IMX500, Error) << "Invalid numOutputTensors"; + return -1; + } + + outputTensorInfo.totalSize = totalOutSize; + outputTensorInfo.numTensors = numOutputTensors; + outputTensorInfo.networkName = outputApParams[0].networkName; + outputTensorInfo.tensorDataNum.resize(numOutputTensors, 0); + for (auto const &p : outputApParams) { + outputTensorInfo.vecDim.push_back(p.vecDim); + outputTensorInfo.numDimensions.push_back(p.vecDim.size()); + } + + return 0; +} + +template +float getVal8(const uint8_t *src, const OutputTensorApParams ¶m) +{ + T temp = (T)*src; + float value = (temp - param.shift) * param.scale; + return value; +} + +template +float getVal16(const uint8_t *src, const OutputTensorApParams ¶m) +{ + T temp = (((T) * (src + 1)) & 0xff) << 8 | (*src & 0xff); + float value = (temp - param.shift) * param.scale; + return value; +} + +template +float getVal32(const uint8_t *src, const OutputTensorApParams ¶m) +{ + T temp = (((T) * (src + 3)) & 0xff) << 24 | (((T) * (src + 2)) & 0xff) << 16 | + (((T) * (src + 1)) & 0xff) << 8 | (*src & 0xff); + float value = (temp - param.shift) * param.scale; + return value; +} + +int parseOutputTensorBody(IMX500OutputTensorInfo &outputTensorInfo, const uint8_t *src, + const std::vector &outputApParams, + const DnnHeader &dnnHeader) +{ + float *dst = outputTensorInfo.data.get(); + int ret = 0; + + if (outputTensorInfo.totalSize > (std::numeric_limits::max() / sizeof(float))) { + LOG(IMX500, Error) << "totalSize is greater than maximum size"; + return -1; + } + + std::unique_ptr tmpDst = std::make_unique(outputTensorInfo.totalSize); + std::vector numLinesVec(outputApParams.size()); + std::vector outSizes(outputApParams.size()); + std::vector offsets(outputApParams.size()); + std::vector srcArr(outputApParams.size()); + std::vector> serializedDims; + std::vector> actualDims; + + const uint8_t *src1 = src; + uint32_t offset = 0; + std::vector serializedDimT; + std::vector actualDimT; + + for (unsigned int tensorIdx = 0; tensorIdx < outputApParams.size(); tensorIdx++) { + offsets[tensorIdx] = offset; + srcArr[tensorIdx] = src1; + uint32_t tensorDataNum = 0; + + const OutputTensorApParams ¶m = outputApParams.at(tensorIdx); + uint32_t outputTensorSize = 0; + uint32_t tensorOutSize = (param.bitsPerElement / 8); + + serializedDimT.resize(param.numDimensions); + actualDimT.resize(param.numDimensions); + + for (int idx = 0; idx < param.numDimensions; idx++) { + actualDimT[idx].size = param.vecDim.at(idx).size; + serializedDimT[param.vecDim.at(idx).serializationIndex].size = param.vecDim.at(idx).size; + + tensorOutSize *= param.vecDim.at(idx).size; + if (tensorOutSize >= std::numeric_limits::max() / param.bitsPerElement / 8) { + LOG(IMX500, Error) << "Invalid output tensor info"; + return -1; + } + + actualDimT[idx].serializationIndex = param.vecDim.at(idx).serializationIndex; + serializedDimT[param.vecDim.at(idx).serializationIndex].serializationIndex = + static_cast(idx); + } + + uint16_t numLines = std::ceil(tensorOutSize / static_cast(dnnHeader.maxLineLen)); + outputTensorSize = tensorOutSize; + numLinesVec[tensorIdx] = numLines; + outSizes[tensorIdx] = tensorOutSize; + + serializedDims.push_back(serializedDimT); + actualDims.push_back(actualDimT); + + src1 += numLines * TensorStride; + tensorDataNum = (outputTensorSize / (param.bitsPerElement / 8)); + offset += tensorDataNum; + outputTensorInfo.tensorDataNum[tensorIdx] = tensorDataNum; + if (offset > outputTensorInfo.totalSize) { + LOG(IMX500, Error) + << "Error in parsing output tensor offset " << offset << " > output_size"; + return -1; + } + } + + std::vector idxs(outputApParams.size()); + for (unsigned int i = 0; i < idxs.size(); i++) + idxs[i] = i; + + for (unsigned int i = 0; i < idxs.size(); i++) { + for (unsigned int j = 0; j < idxs.size(); j++) { + if (numLinesVec[idxs[i]] > numLinesVec[idxs[j]]) + std::swap(idxs[i], idxs[j]); + } + } + + std::vector> futures; + for (unsigned int ii = 0; ii < idxs.size(); ii++) { + uint32_t idx = idxs[ii]; + futures.emplace_back(std::async( + std::launch::async, + [&tmpDst, &outSizes, &numLinesVec, &actualDims, &serializedDims, + &outputApParams, &dnnHeader, dst](int tensorIdx, const uint8_t *tsrc, int toffset) -> int { + uint32_t outputTensorSize = outSizes[tensorIdx]; + uint16_t numLines = numLinesVec[tensorIdx]; + bool sortingRequired = false; + + const OutputTensorApParams ¶m = outputApParams[tensorIdx]; + const std::vector &serializedDim = serializedDims[tensorIdx]; + const std::vector &actualDim = actualDims[tensorIdx]; + + for (unsigned i = 0; i < param.numDimensions; i++) { + if (param.vecDim.at(i).serializationIndex != param.vecDim.at(i).ordinal) + sortingRequired = true; + } + + if (!outputTensorSize) { + LOG(IMX500, Error) << "Invalid output tensorsize (0)"; + return -1; + } + + /* Extract output tensor data */ + uint32_t elementIndex = 0; + if (param.bitsPerElement == 8) { + for (unsigned int i = 0; i < numLines; i++) { + int lineIndex = 0; + while (lineIndex < dnnHeader.maxLineLen) { + if (param.format == TensorDataType::Signed) + tmpDst[toffset + elementIndex] = + getVal8(tsrc + lineIndex, param); + else + tmpDst[toffset + elementIndex] = + getVal8(tsrc + lineIndex, param); + elementIndex++; + lineIndex++; + if (elementIndex == outputTensorSize) + break; + } + tsrc += TensorStride; + if (elementIndex == outputTensorSize) + break; + } + } else if (param.bitsPerElement == 16) { + for (unsigned int i = 0; i < numLines; i++) { + int lineIndex = 0; + while (lineIndex < dnnHeader.maxLineLen) { + if (param.format == TensorDataType::Signed) + tmpDst[toffset + elementIndex] = + getVal16(tsrc + lineIndex, param); + else + tmpDst[toffset + elementIndex] = + getVal16(tsrc + lineIndex, param); + elementIndex++; + lineIndex += 2; + if (elementIndex >= (outputTensorSize >> 1)) + break; + } + tsrc += TensorStride; + if (elementIndex >= (outputTensorSize >> 1)) + break; + } + } else if (param.bitsPerElement == 32) { + for (unsigned int i = 0; i < numLines; i++) { + int lineIndex = 0; + while (lineIndex < dnnHeader.maxLineLen) { + if (param.format == TensorDataType::Signed) + tmpDst[toffset + elementIndex] = + getVal32(tsrc + lineIndex, param); + else + tmpDst[toffset + elementIndex] = + getVal32(tsrc + lineIndex, param); + elementIndex++; + lineIndex += 4; + if (elementIndex >= (outputTensorSize >> 2)) + break; + } + tsrc += TensorStride; + if (elementIndex >= (outputTensorSize >> 2)) + break; + } + } + + /* + * Sorting in order according to AP Params. Not supported if larger than 3D + * Preparation: + */ + if (sortingRequired) { + constexpr unsigned int DimensionMax = 3; + + std::array loopCnt{ 1, 1, 1 }; + std::array coef{ 1, 1, 1 }; + for (unsigned int i = 0; i < param.numDimensions; i++) { + if (i >= DimensionMax) { + LOG(IMX500, Error) << "numDimensions value is 3 or higher"; + break; + } + + loopCnt[i] = serializedDim.at(i).size; + + for (unsigned int j = serializedDim.at(i).serializationIndex; j > 0; j--) + coef[i] *= actualDim.at(j - 1).size; + } + /* Sort execution */ + unsigned int srcIndex = 0; + unsigned int dstIndex; + for (unsigned int i = 0; i < loopCnt[DimensionMax - 1]; i++) { + for (unsigned int j = 0; j < loopCnt[DimensionMax - 2]; j++) { + for (unsigned int k = 0; k < loopCnt[DimensionMax - 3]; k++) { + dstIndex = (coef[DimensionMax - 1] * i) + + (coef[DimensionMax - 2] * j) + + (coef[DimensionMax - 3] * k); + dst[toffset + dstIndex] = tmpDst[toffset + srcIndex++]; + } + } + } + } else { + if (param.bitsPerElement == 8) + memcpy(dst + toffset, tmpDst.get() + toffset, + outputTensorSize * sizeof(float)); + else if (param.bitsPerElement == 16) + memcpy(dst + toffset, tmpDst.get() + toffset, + (outputTensorSize >> 1) * sizeof(float)); + else if (param.bitsPerElement == 32) + memcpy(dst + toffset, tmpDst.get() + toffset, + (outputTensorSize >> 2) * sizeof(float)); + else { + LOG(IMX500, Error) + << "Invalid bitsPerElement value =" << param.bitsPerElement; + return -1; + } + } + + return 0; + }, + idx, srcArr[idx], offsets[idx])); + } + + for (auto &f : futures) + ret += f.get(); + + return ret; +} + +int parseInputApParams(InputTensorApParams &inputApParams, const std::vector &apParams, + const DnnHeader &dnnHeader) +{ + const apParams::fb::FBApParams *fbApParams; + const apParams::fb::FBNetwork *fbNetwork; + const apParams::fb::FBInputTensor *fbInputTensor; + + fbApParams = apParams::fb::GetFBApParams(apParams.data()); + LOG(IMX500, Debug) << "Networks size: " << fbApParams->networks()->size(); + + for (unsigned int i = 0; i < fbApParams->networks()->size(); i++) { + fbNetwork = reinterpret_cast(fbApParams->networks()->Get(i)); + if (fbNetwork->id() != dnnHeader.networkId) + continue; + + LOG(IMX500, Debug) + << "Network: " << fbNetwork->type()->c_str() + << ", i/p size: " << fbNetwork->inputTensors()->size() + << ", o/p size: " << fbNetwork->outputTensors()->size(); + + inputApParams.networkName = fbNetwork->type()->str(); + fbInputTensor = + reinterpret_cast(fbNetwork->inputTensors()->Get(0)); + + LOG(IMX500, Debug) + << "Input Tensor shift: " << fbInputTensor->shift() + << ", Scale: scale: " << fbInputTensor->scale() + << ", Format: " << static_cast(fbInputTensor->format()); + + if (fbInputTensor->dimensions()->size() != 3) { + LOG(IMX500, Error) << "Invalid number of dimensions in InputTensor"; + return -1; + } + + for (unsigned int j = 0; j < fbInputTensor->dimensions()->size(); j++) { + switch (fbInputTensor->dimensions()->Get(j)->serializationIndex()) { + case 0: + inputApParams.width = fbInputTensor->dimensions()->Get(j)->size(); + inputApParams.widthStride = + inputApParams.width + fbInputTensor->dimensions()->Get(j)->padding(); + break; + case 1: + inputApParams.height = fbInputTensor->dimensions()->Get(j)->size(); + inputApParams.heightStride = + inputApParams.height + fbInputTensor->dimensions()->Get(j)->padding(); + break; + case 2: + inputApParams.channel = fbInputTensor->dimensions()->Get(j)->size(); + break; + default: + LOG(IMX500, Error) << "Invalid dimension in InputTensor " << j; + break; + } + } + } + + return 0; +} + +int parseInputTensorBody(IMX500InputTensorInfo &inputTensorInfo, const uint8_t *src, + const InputTensorApParams &inputApParams, const DnnHeader &dnnHeader) +{ + if ((inputApParams.width > InputSensorMaxWidth) || (inputApParams.height > InputSensorMaxHeight) || + ((inputApParams.channel != 1) && (inputApParams.channel != 3) && (inputApParams.channel != 4))) { + LOG(IMX500, Error) + << "Invalid input tensor size w: " << inputApParams.width + << " h: " << inputApParams.height + << " c: " << inputApParams.channel; + return -1; + } + + unsigned int outSize = inputApParams.width * inputApParams.height * inputApParams.channel; + unsigned int outSizePadded = inputApParams.widthStride * inputApParams.heightStride * inputApParams.channel; + unsigned int numLines = std::ceil(outSizePadded / static_cast(dnnHeader.maxLineLen)); + inputTensorInfo.data = std::shared_ptr(new uint8_t[outSize]); + + unsigned int diff = 0, outLineIndex = 0, pixelIndex = 0, heightIndex = 0, size = 0, left = 0; + unsigned int wPad = inputApParams.widthStride - inputApParams.width; + unsigned int hPad = inputApParams.heightStride - inputApParams.height; + + for (unsigned int line = 0; line < numLines; line++) { + for (unsigned int lineIndex = diff; lineIndex < dnnHeader.maxLineLen; lineIndex += size) { + if (outLineIndex == inputApParams.width) { /* Skip width padding pixels */ + outLineIndex = 0; + heightIndex++; + lineIndex += wPad; + if (lineIndex >= dnnHeader.maxLineLen) { + diff = lineIndex - dnnHeader.maxLineLen; + break; + } else + diff = 0; + } + + if (heightIndex == inputApParams.height) { /* Skip height padding pixels */ + lineIndex += hPad * inputApParams.widthStride; + heightIndex = 0; + if (lineIndex >= dnnHeader.maxLineLen) { + diff = lineIndex - dnnHeader.maxLineLen; + while (diff >= dnnHeader.maxLineLen) { + diff -= dnnHeader.maxLineLen; + src += TensorStride; + line++; + } + break; + } else + diff = 0; + } + + if (((pixelIndex == inputApParams.width * inputApParams.height) || + (pixelIndex == inputApParams.width * inputApParams.height * 2) || + (pixelIndex == inputApParams.width * inputApParams.height * 3))) { + if (pixelIndex == outSize) + break; + } + + if (left > 0) { + size = left; + left = 0; + } else if (pixelIndex + inputApParams.width >= outSize) { + size = outSize - pixelIndex; + } else if (lineIndex + inputApParams.width >= dnnHeader.maxLineLen) { + size = dnnHeader.maxLineLen - lineIndex; + left = inputApParams.width - size; + } else { + size = inputApParams.width; + } + + memcpy(&inputTensorInfo.data[pixelIndex], src + lineIndex, size); + pixelIndex += size; + outLineIndex += size; + } + + if (pixelIndex == outSize) + break; + + src += TensorStride; + } + + inputTensorInfo.size = outSize; + inputTensorInfo.width = inputApParams.width; + inputTensorInfo.height = inputApParams.height; + inputTensorInfo.channels = inputApParams.channel; + inputTensorInfo.widthStride = inputApParams.widthStride; + inputTensorInfo.heightStride = inputApParams.heightStride; + inputTensorInfo.networkName = inputApParams.networkName; + + return 0; +} + +} /* namespace */ + +int RPiController::imx500ParseInputTensor(IMX500InputTensorInfo &inputTensorInfo, + libcamera::Span inputTensor) +{ + DnnHeader dnnHeader; + std::vector apParams; + InputTensorApParams inputApParams{}; + + const uint8_t *src = inputTensor.data(); + int ret = parseHeader(dnnHeader, apParams, src); + if (ret) { + LOG(IMX500, Error) << "Header param parsing failed!"; + return ret; + } + + if (dnnHeader.tensorType != TensorType::InputTensor) { + LOG(IMX500, Error) << "Invalid input tensor type in AP params!"; + return -1; + } + + ret = parseInputApParams(inputApParams, apParams, dnnHeader); + if (ret) { + LOG(IMX500, Error) << "AP param parsing failed!"; + return ret; + } + + ret = parseInputTensorBody(inputTensorInfo, src + TensorStride, inputApParams, dnnHeader); + if (ret) { + LOG(IMX500, Error) << "Input tensor body parsing failed!"; + return ret; + } + + return 0; +} + +int RPiController::imx500ParseOutputTensor(IMX500OutputTensorInfo &outputTensorInfo, + Span outputTensor) +{ + DnnHeader dnnHeader; + std::vector apParams; + std::vector outputApParams; + + const uint8_t *src = outputTensor.data(); + int ret = parseHeader(dnnHeader, apParams, src); + if (ret) { + LOG(IMX500, Error) << "Header param parsing failed!"; + return ret; + } + + if (dnnHeader.tensorType != TensorType::OutputTensor) { + LOG(IMX500, Error) << "Invalid output tensor type in AP params!"; + return -1; + } + + ret = parseOutputApParams(outputApParams, apParams, dnnHeader); + if (ret) { + LOG(IMX500, Error) << "AP param parsing failed!"; + return ret; + } + + ret = populateOutputTensorInfo(outputTensorInfo, outputApParams); + if (ret) { + LOG(IMX500, Error) << "Failed to populate OutputTensorInfo!"; + return ret; + } + + ret = parseOutputTensorBody(outputTensorInfo, src + TensorStride, outputApParams, dnnHeader); + if (ret) { + LOG(IMX500, Error) << "Output tensor body parsing failed!"; + return ret; + } + + return 0; +} + +std::unordered_map RPiController::imx500SplitTensors(Span tensors) +{ + const DnnHeader *outputHeader; + DnnHeader inputHeader; + std::unordered_map offsets; + + /* + * Structure of the IMX500 DNN output: + * Line 0: KPI params + * Line [1, x): Input tensor + * Line [x, N-1): Output tensor + * Line N-1: PQ params + */ + offsets[TensorType::Kpi].offset = 0; + + const uint8_t *src = tensors.data() + TensorStride; + inputHeader = *reinterpret_cast(src); + if (inputHeader.tensorType != TensorType::InputTensor) { + LOG(IMX500, Debug) << "Input tensor is invalid, arborting."; + return {}; + } + + offsets[TensorType::InputTensor].offset = TensorStride; + offsets[TensorType::InputTensor].valid = inputHeader.frameValid; + LOG(IMX500, Debug) + << "Found input tensor at offset: " << offsets[TensorType::InputTensor].offset + << ", valid: " << static_cast(offsets[TensorType::InputTensor].valid); + + src += TensorStride; + + while (src < tensors.data() + tensors.size()) { + outputHeader = reinterpret_cast(src); + if (outputHeader->frameCount == inputHeader.frameCount && + outputHeader->apParamSize == inputHeader.apParamSize && + outputHeader->maxLineLen == inputHeader.maxLineLen && + outputHeader->tensorType == TensorType::OutputTensor) { + offsets[TensorType::OutputTensor].offset = src - tensors.data(); + offsets[TensorType::OutputTensor].valid = outputHeader->frameValid; + LOG(IMX500, Debug) + << "Found output tensor at offset: " << offsets[TensorType::OutputTensor].offset + << ", valid: " << static_cast(offsets[TensorType::OutputTensor].valid); + break; + } + src += TensorStride; + } + + return offsets; +} diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.h b/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.h new file mode 100644 index 000000000..98b7b1d30 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/imx500_tensor_parser.h @@ -0,0 +1,63 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2024, Raspberry Pi Ltd + * + * imx500_tensor_parser.h - Parser for imx500 tensors + */ + +#include +#include +#include +#include +#include + +#include + +namespace RPiController { + +enum TensorType { + InputTensor = 0, + OutputTensor, + Kpi, +}; + +struct Dimensions { + uint8_t ordinal; + uint16_t size; + uint8_t serializationIndex; + uint8_t padding; +}; + +struct IMX500OutputTensorInfo { + uint32_t totalSize; + uint32_t numTensors; + std::string networkName; + std::shared_ptr data; + std::vector tensorDataNum; + std::vector> vecDim; + std::vector numDimensions; +}; + +struct IMX500InputTensorInfo { + unsigned int width; + unsigned int height; + unsigned int widthStride; + unsigned int heightStride; + unsigned int channels; + unsigned int size; + std::string networkName; + std::shared_ptr data; +}; + +struct IMX500Tensors { + bool valid; + unsigned int offset; +}; + +int imx500ParseOutputTensor(IMX500OutputTensorInfo &outputTensorInfo, + libcamera::Span outputTensor); +int imx500ParseInputTensor(IMX500InputTensorInfo &inputTensorInfo, + libcamera::Span inputTensor); +std::unordered_map imx500SplitTensors(libcamera::Span tensors); + +} /* namespace RPiController */ diff --git a/src/ipa/rpi/cam_helper/imx500_tensor_parser/meson.build b/src/ipa/rpi/cam_helper/imx500_tensor_parser/meson.build new file mode 100644 index 000000000..d23179092 --- /dev/null +++ b/src/ipa/rpi/cam_helper/imx500_tensor_parser/meson.build @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: CC0-1.0 + +rpi_ipa_cam_helper_sources += files([ + 'imx500_tensor_parser.cpp', +]) diff --git a/src/ipa/rpi/cam_helper/meson.build b/src/ipa/rpi/cam_helper/meson.build index 1e43f1da2..694ec59b0 100644 --- a/src/ipa/rpi/cam_helper/meson.build +++ b/src/ipa/rpi/cam_helper/meson.build @@ -8,6 +8,7 @@ rpi_ipa_cam_helper_sources = files([ 'cam_helper_imx290.cpp', 'cam_helper_imx296.cpp', 'cam_helper_imx477.cpp', + 'cam_helper_imx500.cpp', 'cam_helper_imx519.cpp', 'cam_helper_imx708.cpp', 'cam_helper_ov64a40.cpp', @@ -19,6 +20,8 @@ rpi_ipa_cam_helper_includes = [ include_directories('..'), ] +subdir('imx500_tensor_parser') + rpi_ipa_cam_helper_deps = [ libcamera_private, ] diff --git a/src/ipa/rpi/pisp/data/imx500.json b/src/ipa/rpi/pisp/data/imx500.json new file mode 100644 index 000000000..59ef5798d --- /dev/null +++ b/src/ipa/rpi/pisp/data/imx500.json @@ -0,0 +1,1209 @@ +{ + "version": 2.0, + "target": "pisp", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 10369, + "reference_gain": 2.0, + "reference_aperture": 1.0, + "reference_lux": 950, + "reference_Y": 12457 + } + }, + { + "rpi.dpc": + { + "strength": 1 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.747 + } + }, + { + "rpi.geq": + { + "offset": 223, + "slope": 0.00933 + } + }, + { + "rpi.denoise": + { + "normal": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 0.8, + "threshold": 0.05 + } + }, + "hdr": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + }, + "night": + { + "sdn": + { + "deviation": 1.6, + "strength": 0.5, + "deviation2": 3.2, + "deviation_no_tdn": 3.2, + "strength_no_tdn": 0.75 + }, + "cdn": + { + "deviation": 200, + "strength": 0.3 + }, + "tdn": + { + "deviation": 1.3, + "threshold": 0.1 + } + } + } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2800, + "hi": 7700 + }, + "incandescent": + { + "lo": 2800, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 7600 + } + }, + "bayes": 1, + "ct_curve": + [ + 2800.0, 0.7115, 0.3579, + 2860.0, 0.6671, 0.4058, + 2880.0, 0.6641, 0.4089, + 3580.0, 0.5665, 0.5113, + 3650.0, 0.5621, 0.5159, + 4500.0, 0.4799, 0.5997, + 4570.0, 0.4752, 0.6046, + 5648.0, 0.4139, 0.6657, + 5717.0, 0.4118, 0.6678, + 7600.0, 0.3625, 0.7162 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.02822, + "transverse_neg": 0.02678 + } + }, + { + "rpi.agc": + { + "channels": [ + { + "comment": "Channel 0 is normal AGC", + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 66666 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 60000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 10000, 30000, 60000, 90000, 120000 ], + "gain": [ 1.0, 1.5, 2.0, 4.0, 8.0, 12.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.5, + "y_target": + [ + 0, 0.17, + 1000, 0.17 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 1 is the HDR short channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 60000 ], + "gain": [ 1.0, 1.0, 1.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.95, + "q_hi": 1.0, + "y_target": + [ + 0, 0.7, + 1000, 0.7 + ] + }, + { + "bound": "LOWER", + "q_lo": 0.0, + "q_hi": 0.2, + "y_target": + [ + 0, 0.002, + 1000, 0.002 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 2 is the HDR long channel", + "desaturate": 0, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 30000, 60000 ], + "gain": [ 1.0, 2.0, 4.0, 8.0 ] + } + }, + "constraint_modes": + { + "normal": [ ], + "highlight": [ ], + "shadows": [ ] + }, + "channel_constraints": [ + { + "bound": "UPPER", + "channel": 4, + "factor": 8 + }, + { + "bound": "LOWER", + "channel": 4, + "factor": 2 + } + ], + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + }, + { + "comment": "Channel 3 is the night mode channel", + "base_ev": 0.33, + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 20000, 66666 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "short": + { + "shutter": [ 100, 20000, 33333 ], + "gain": [ 1.0, 2.0, 4.0 ] + }, + "long": + { + "shutter": [ 100, 20000, 66666, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 4.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ], + "shadows": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.16, + 10000, 0.17 + ] + } + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 2800, + "table": + [ + 1.607, 1.613, 1.616, 1.619, 1.621, 1.623, 1.624, 1.623, 1.623, 1.621, 1.619, 1.618, 1.616, 1.614, 1.614, 1.613, 1.613, 1.614, 1.616, 1.616, 1.618, 1.621, 1.623, 1.626, 1.626, 1.626, 1.626, 1.625, 1.622, 1.618, 1.611, 1.605, + 1.609, 1.614, 1.616, 1.619, 1.621, 1.623, 1.623, 1.622, 1.621, 1.617, 1.613, 1.609, 1.607, 1.605, 1.603, 1.602, 1.602, 1.603, 1.605, 1.608, 1.613, 1.616, 1.621, 1.625, 1.626, 1.626, 1.626, 1.625, 1.623, 1.619, 1.612, 1.609, + 1.612, 1.615, 1.616, 1.617, 1.621, 1.622, 1.622, 1.619, 1.615, 1.609, 1.602, 1.598, 1.594, 1.591, 1.589, 1.587, 1.587, 1.589, 1.593, 1.595, 1.601, 1.607, 1.615, 1.621, 1.624, 1.626, 1.627, 1.626, 1.623, 1.621, 1.616, 1.611, + 1.612, 1.614, 1.615, 1.617, 1.619, 1.621, 1.619, 1.615, 1.608, 1.601, 1.593, 1.585, 1.581, 1.577, 1.573, 1.572, 1.572, 1.574, 1.578, 1.582, 1.588, 1.595, 1.606, 1.615, 1.621, 1.625, 1.626, 1.626, 1.624, 1.621, 1.616, 1.613, + 1.612, 1.613, 1.615, 1.617, 1.619, 1.619, 1.616, 1.608, 1.601, 1.589, 1.581, 1.572, 1.565, 1.559, 1.558, 1.556, 1.556, 1.557, 1.562, 1.568, 1.574, 1.585, 1.595, 1.606, 1.615, 1.622, 1.626, 1.626, 1.626, 1.623, 1.617, 1.614, + 1.612, 1.613, 1.615, 1.617, 1.617, 1.616, 1.611, 1.601, 1.589, 1.578, 1.566, 1.556, 1.549, 1.543, 1.539, 1.538, 1.538, 1.541, 1.546, 1.552, 1.561, 1.572, 1.585, 1.597, 1.607, 1.618, 1.624, 1.626, 1.626, 1.623, 1.617, 1.615, + 1.612, 1.613, 1.616, 1.616, 1.616, 1.612, 1.604, 1.592, 1.578, 1.566, 1.553, 1.542, 1.533, 1.527, 1.523, 1.522, 1.522, 1.524, 1.529, 1.536, 1.546, 1.561, 1.572, 1.586, 1.601, 1.611, 1.619, 1.625, 1.625, 1.624, 1.619, 1.617, + 1.612, 1.613, 1.614, 1.615, 1.614, 1.607, 1.597, 1.584, 1.567, 1.553, 1.541, 1.529, 1.518, 1.511, 1.507, 1.506, 1.506, 1.507, 1.513, 1.519, 1.531, 1.546, 1.561, 1.576, 1.591, 1.605, 1.616, 1.623, 1.625, 1.624, 1.621, 1.618, + 1.612, 1.613, 1.614, 1.614, 1.611, 1.601, 1.589, 1.573, 1.555, 1.541, 1.529, 1.513, 1.503, 1.496, 1.493, 1.489, 1.489, 1.492, 1.498, 1.506, 1.519, 1.531, 1.549, 1.566, 1.582, 1.599, 1.613, 1.621, 1.625, 1.625, 1.621, 1.619, + 1.612, 1.613, 1.614, 1.613, 1.607, 1.598, 1.583, 1.567, 1.547, 1.529, 1.513, 1.503, 1.489, 1.482, 1.478, 1.476, 1.476, 1.481, 1.485, 1.494, 1.506, 1.519, 1.537, 1.556, 1.575, 1.593, 1.608, 1.621, 1.625, 1.625, 1.622, 1.619, + 1.612, 1.614, 1.614, 1.613, 1.606, 1.594, 1.577, 1.558, 1.539, 1.519, 1.503, 1.489, 1.479, 1.471, 1.466, 1.464, 1.464, 1.467, 1.473, 1.484, 1.494, 1.509, 1.528, 1.549, 1.568, 1.588, 1.605, 1.619, 1.626, 1.626, 1.623, 1.621, + 1.614, 1.614, 1.614, 1.612, 1.602, 1.591, 1.572, 1.552, 1.532, 1.512, 1.495, 1.479, 1.471, 1.463, 1.456, 1.455, 1.455, 1.459, 1.466, 1.473, 1.485, 1.502, 1.522, 1.542, 1.562, 1.584, 1.602, 1.618, 1.626, 1.626, 1.623, 1.622, + 1.614, 1.614, 1.614, 1.611, 1.601, 1.585, 1.568, 1.547, 1.526, 1.506, 1.488, 1.473, 1.463, 1.456, 1.449, 1.447, 1.447, 1.452, 1.459, 1.467, 1.478, 1.496, 1.515, 1.537, 1.559, 1.581, 1.601, 1.617, 1.626, 1.626, 1.624, 1.623, + 1.614, 1.614, 1.614, 1.611, 1.601, 1.584, 1.564, 1.544, 1.522, 1.502, 1.484, 1.469, 1.458, 1.449, 1.446, 1.443, 1.443, 1.447, 1.452, 1.461, 1.475, 1.492, 1.511, 1.533, 1.556, 1.578, 1.599, 1.616, 1.625, 1.626, 1.625, 1.621, + 1.614, 1.614, 1.614, 1.609, 1.599, 1.583, 1.563, 1.542, 1.521, 1.499, 1.482, 1.466, 1.455, 1.447, 1.443, 1.441, 1.442, 1.443, 1.449, 1.459, 1.473, 1.489, 1.509, 1.531, 1.554, 1.577, 1.597, 1.615, 1.625, 1.626, 1.626, 1.622, + 1.615, 1.614, 1.614, 1.609, 1.599, 1.583, 1.563, 1.542, 1.519, 1.499, 1.481, 1.466, 1.454, 1.447, 1.442, 1.439, 1.439, 1.443, 1.449, 1.459, 1.472, 1.489, 1.509, 1.531, 1.554, 1.576, 1.597, 1.615, 1.625, 1.626, 1.626, 1.622, + 1.615, 1.615, 1.614, 1.609, 1.599, 1.584, 1.563, 1.542, 1.521, 1.499, 1.482, 1.466, 1.454, 1.447, 1.442, 1.441, 1.442, 1.443, 1.449, 1.459, 1.472, 1.489, 1.509, 1.532, 1.554, 1.577, 1.598, 1.615, 1.625, 1.627, 1.627, 1.624, + 1.615, 1.615, 1.614, 1.611, 1.601, 1.586, 1.565, 1.544, 1.522, 1.502, 1.483, 1.469, 1.458, 1.451, 1.447, 1.443, 1.443, 1.448, 1.453, 1.462, 1.475, 1.493, 1.513, 1.534, 1.558, 1.579, 1.601, 1.616, 1.626, 1.628, 1.628, 1.624, + 1.615, 1.616, 1.615, 1.611, 1.601, 1.588, 1.568, 1.547, 1.526, 1.506, 1.488, 1.473, 1.462, 1.456, 1.451, 1.448, 1.448, 1.453, 1.458, 1.466, 1.481, 1.497, 1.517, 1.538, 1.561, 1.582, 1.603, 1.617, 1.628, 1.628, 1.628, 1.624, + 1.615, 1.615, 1.615, 1.613, 1.605, 1.589, 1.573, 1.552, 1.531, 1.511, 1.494, 1.479, 1.469, 1.462, 1.456, 1.455, 1.455, 1.458, 1.466, 1.473, 1.486, 1.503, 1.522, 1.543, 1.564, 1.585, 1.605, 1.621, 1.629, 1.629, 1.627, 1.624, + 1.615, 1.616, 1.616, 1.614, 1.607, 1.594, 1.576, 1.557, 1.538, 1.518, 1.501, 1.487, 1.479, 1.469, 1.463, 1.462, 1.462, 1.466, 1.473, 1.483, 1.494, 1.509, 1.529, 1.549, 1.571, 1.591, 1.609, 1.621, 1.629, 1.629, 1.627, 1.624, + 1.614, 1.615, 1.616, 1.615, 1.611, 1.599, 1.582, 1.564, 1.546, 1.527, 1.511, 1.499, 1.487, 1.479, 1.475, 1.473, 1.474, 1.476, 1.483, 1.493, 1.504, 1.518, 1.538, 1.557, 1.577, 1.596, 1.612, 1.625, 1.631, 1.631, 1.627, 1.624, + 1.613, 1.615, 1.616, 1.615, 1.613, 1.604, 1.589, 1.573, 1.555, 1.538, 1.522, 1.511, 1.499, 1.492, 1.488, 1.487, 1.487, 1.489, 1.494, 1.504, 1.518, 1.529, 1.548, 1.567, 1.586, 1.604, 1.617, 1.627, 1.631, 1.631, 1.626, 1.622, + 1.612, 1.614, 1.616, 1.616, 1.615, 1.608, 1.596, 1.582, 1.566, 1.549, 1.537, 1.522, 1.514, 1.507, 1.503, 1.501, 1.501, 1.504, 1.509, 1.518, 1.529, 1.544, 1.561, 1.578, 1.594, 1.609, 1.623, 1.629, 1.631, 1.631, 1.626, 1.623, + 1.612, 1.614, 1.616, 1.618, 1.618, 1.614, 1.604, 1.592, 1.577, 1.563, 1.549, 1.537, 1.529, 1.523, 1.518, 1.518, 1.518, 1.521, 1.526, 1.533, 1.544, 1.559, 1.574, 1.591, 1.604, 1.617, 1.626, 1.632, 1.632, 1.631, 1.626, 1.623, + 1.612, 1.613, 1.617, 1.619, 1.619, 1.619, 1.612, 1.601, 1.588, 1.576, 1.563, 1.552, 1.543, 1.538, 1.536, 1.535, 1.536, 1.538, 1.542, 1.549, 1.559, 1.574, 1.588, 1.601, 1.613, 1.623, 1.631, 1.633, 1.633, 1.631, 1.626, 1.623, + 1.612, 1.613, 1.617, 1.619, 1.621, 1.621, 1.618, 1.611, 1.601, 1.588, 1.577, 1.568, 1.561, 1.555, 1.552, 1.552, 1.552, 1.556, 1.558, 1.566, 1.576, 1.588, 1.599, 1.611, 1.621, 1.628, 1.633, 1.634, 1.634, 1.631, 1.625, 1.622, + 1.611, 1.612, 1.617, 1.619, 1.622, 1.623, 1.621, 1.616, 1.609, 1.601, 1.591, 1.583, 1.577, 1.574, 1.571, 1.569, 1.569, 1.573, 1.577, 1.582, 1.591, 1.601, 1.611, 1.621, 1.628, 1.634, 1.635, 1.635, 1.634, 1.631, 1.625, 1.622, + 1.609, 1.612, 1.616, 1.618, 1.622, 1.623, 1.624, 1.622, 1.617, 1.611, 1.603, 1.597, 1.593, 1.589, 1.588, 1.587, 1.587, 1.589, 1.593, 1.598, 1.605, 1.612, 1.621, 1.628, 1.633, 1.635, 1.635, 1.635, 1.633, 1.631, 1.624, 1.622, + 1.607, 1.611, 1.615, 1.618, 1.621, 1.624, 1.624, 1.624, 1.622, 1.618, 1.613, 1.609, 1.607, 1.603, 1.603, 1.603, 1.603, 1.605, 1.608, 1.613, 1.617, 1.621, 1.628, 1.634, 1.635, 1.635, 1.635, 1.633, 1.632, 1.628, 1.623, 1.619, + 1.605, 1.609, 1.614, 1.617, 1.619, 1.624, 1.625, 1.625, 1.625, 1.624, 1.621, 1.619, 1.617, 1.617, 1.617, 1.617, 1.617, 1.618, 1.621, 1.623, 1.627, 1.629, 1.633, 1.635, 1.635, 1.634, 1.633, 1.632, 1.631, 1.625, 1.619, 1.617, + 1.602, 1.606, 1.613, 1.617, 1.619, 1.624, 1.625, 1.626, 1.627, 1.626, 1.626, 1.625, 1.625, 1.624, 1.624, 1.624, 1.625, 1.625, 1.626, 1.628, 1.631, 1.633, 1.634, 1.635, 1.634, 1.634, 1.633, 1.632, 1.631, 1.625, 1.617, 1.608 + ] + }, + { + "ct": 4000, + "table": + [ + 2.044, 2.051, 2.055, 2.059, 2.061, 2.063, 2.064, 2.063, 2.062, 2.062, 2.058, 2.058, 2.057, 2.055, 2.054, 2.054, 2.055, 2.056, 2.057, 2.059, 2.062, 2.065, 2.068, 2.071, 2.072, 2.072, 2.072, 2.071, 2.069, 2.065, 2.055, 2.047, + 2.048, 2.051, 2.055, 2.058, 2.059, 2.061, 2.062, 2.061, 2.059, 2.053, 2.049, 2.046, 2.043, 2.042, 2.039, 2.039, 2.039, 2.041, 2.044, 2.047, 2.053, 2.059, 2.065, 2.068, 2.072, 2.072, 2.072, 2.071, 2.069, 2.064, 2.058, 2.052, + 2.049, 2.052, 2.054, 2.057, 2.059, 2.059, 2.059, 2.057, 2.052, 2.044, 2.037, 2.033, 2.029, 2.024, 2.023, 2.021, 2.021, 2.023, 2.028, 2.034, 2.038, 2.048, 2.057, 2.064, 2.068, 2.071, 2.072, 2.072, 2.069, 2.065, 2.058, 2.056, + 2.051, 2.052, 2.054, 2.057, 2.058, 2.058, 2.057, 2.052, 2.044, 2.034, 2.026, 2.018, 2.012, 2.008, 2.005, 2.004, 2.004, 2.006, 2.012, 2.017, 2.024, 2.034, 2.047, 2.056, 2.064, 2.069, 2.072, 2.072, 2.071, 2.067, 2.061, 2.057, + 2.051, 2.052, 2.054, 2.056, 2.057, 2.057, 2.052, 2.045, 2.034, 2.021, 2.011, 2.001, 1.995, 1.988, 1.986, 1.985, 1.985, 1.988, 1.994, 1.999, 2.009, 2.022, 2.033, 2.047, 2.056, 2.066, 2.071, 2.072, 2.071, 2.069, 2.062, 2.061, + 2.051, 2.051, 2.053, 2.054, 2.055, 2.053, 2.046, 2.036, 2.021, 2.008, 1.994, 1.983, 1.975, 1.969, 1.965, 1.964, 1.965, 1.968, 1.973, 1.981, 1.991, 2.006, 2.021, 2.034, 2.048, 2.061, 2.066, 2.071, 2.071, 2.069, 2.063, 2.061, + 2.051, 2.051, 2.053, 2.053, 2.053, 2.048, 2.039, 2.025, 2.008, 1.993, 1.979, 1.965, 1.956, 1.949, 1.945, 1.944, 1.945, 1.948, 1.953, 1.961, 1.973, 1.991, 2.006, 2.022, 2.036, 2.052, 2.064, 2.069, 2.069, 2.069, 2.064, 2.061, + 2.051, 2.051, 2.051, 2.052, 2.049, 2.043, 2.031, 2.014, 1.994, 1.979, 1.964, 1.949, 1.939, 1.931, 1.925, 1.924, 1.924, 1.927, 1.934, 1.943, 1.957, 1.973, 1.991, 2.009, 2.028, 2.045, 2.058, 2.067, 2.069, 2.069, 2.064, 2.062, + 2.049, 2.049, 2.049, 2.049, 2.046, 2.036, 2.021, 2.002, 1.981, 1.964, 1.949, 1.931, 1.919, 1.911, 1.907, 1.905, 1.905, 1.909, 1.915, 1.926, 1.941, 1.957, 1.977, 1.997, 2.018, 2.037, 2.053, 2.064, 2.069, 2.069, 2.064, 2.062, + 2.049, 2.049, 2.049, 2.049, 2.041, 2.029, 2.011, 1.992, 1.969, 1.949, 1.931, 1.918, 1.904, 1.894, 1.889, 1.888, 1.888, 1.892, 1.898, 1.909, 1.926, 1.941, 1.962, 1.984, 2.008, 2.031, 2.048, 2.062, 2.069, 2.069, 2.066, 2.064, + 2.049, 2.051, 2.049, 2.049, 2.041, 2.024, 2.005, 1.984, 1.961, 1.938, 1.918, 1.904, 1.891, 1.879, 1.874, 1.873, 1.873, 1.877, 1.884, 1.898, 1.909, 1.929, 1.951, 1.973, 1.999, 2.025, 2.044, 2.062, 2.069, 2.069, 2.066, 2.064, + 2.051, 2.051, 2.051, 2.046, 2.035, 2.021, 1.999, 1.976, 1.952, 1.928, 1.908, 1.891, 1.879, 1.869, 1.862, 1.861, 1.861, 1.865, 1.875, 1.884, 1.899, 1.919, 1.943, 1.966, 1.992, 2.018, 2.039, 2.059, 2.069, 2.069, 2.067, 2.065, + 2.051, 2.051, 2.049, 2.046, 2.035, 2.017, 1.995, 1.969, 1.946, 1.921, 1.901, 1.881, 1.869, 1.861, 1.852, 1.851, 1.851, 1.856, 1.865, 1.875, 1.892, 1.911, 1.936, 1.961, 1.988, 2.014, 2.037, 2.057, 2.068, 2.069, 2.067, 2.066, + 2.051, 2.051, 2.049, 2.045, 2.034, 2.015, 1.992, 1.968, 1.941, 1.916, 1.895, 1.876, 1.862, 1.852, 1.849, 1.845, 1.845, 1.849, 1.856, 1.869, 1.886, 1.907, 1.931, 1.956, 1.984, 2.011, 2.037, 2.056, 2.068, 2.069, 2.068, 2.067, + 2.052, 2.051, 2.049, 2.044, 2.033, 2.013, 1.991, 1.964, 1.937, 1.915, 1.892, 1.873, 1.859, 1.849, 1.845, 1.841, 1.843, 1.844, 1.853, 1.865, 1.883, 1.906, 1.928, 1.954, 1.981, 2.009, 2.035, 2.055, 2.067, 2.068, 2.068, 2.068, + 2.051, 2.051, 2.049, 2.044, 2.032, 2.013, 1.991, 1.964, 1.937, 1.914, 1.891, 1.873, 1.858, 1.849, 1.842, 1.839, 1.839, 1.844, 1.853, 1.865, 1.883, 1.904, 1.928, 1.953, 1.981, 2.008, 2.034, 2.054, 2.067, 2.069, 2.069, 2.068, + 2.053, 2.052, 2.051, 2.045, 2.032, 2.015, 1.991, 1.965, 1.938, 1.914, 1.891, 1.874, 1.859, 1.849, 1.844, 1.841, 1.843, 1.845, 1.853, 1.866, 1.883, 1.904, 1.929, 1.954, 1.981, 2.009, 2.034, 2.055, 2.068, 2.069, 2.069, 2.068, + 2.053, 2.053, 2.051, 2.045, 2.035, 2.016, 1.993, 1.967, 1.942, 1.918, 1.894, 1.878, 1.863, 1.854, 1.849, 1.844, 1.845, 1.851, 1.857, 1.869, 1.885, 1.907, 1.932, 1.957, 1.985, 2.012, 2.037, 2.055, 2.069, 2.071, 2.069, 2.067, + 2.054, 2.053, 2.052, 2.047, 2.036, 2.019, 1.995, 1.972, 1.947, 1.922, 1.899, 1.882, 1.869, 1.861, 1.854, 1.851, 1.851, 1.857, 1.864, 1.873, 1.892, 1.913, 1.936, 1.962, 1.989, 2.014, 2.039, 2.058, 2.071, 2.071, 2.069, 2.067, + 2.053, 2.053, 2.053, 2.049, 2.039, 2.022, 2.002, 1.977, 1.951, 1.928, 1.907, 1.891, 1.877, 1.868, 1.861, 1.859, 1.859, 1.864, 1.873, 1.882, 1.899, 1.919, 1.943, 1.967, 1.994, 2.018, 2.043, 2.061, 2.072, 2.072, 2.069, 2.067, + 2.053, 2.054, 2.053, 2.051, 2.045, 2.027, 2.008, 1.984, 1.959, 1.937, 1.917, 1.901, 1.889, 1.877, 1.869, 1.869, 1.869, 1.873, 1.882, 1.894, 1.909, 1.928, 1.951, 1.975, 2.001, 2.025, 2.046, 2.063, 2.072, 2.072, 2.069, 2.068, + 2.053, 2.054, 2.055, 2.052, 2.047, 2.034, 2.014, 1.993, 1.971, 1.948, 1.929, 1.914, 1.901, 1.889, 1.885, 1.882, 1.883, 1.886, 1.894, 1.908, 1.921, 1.939, 1.961, 1.984, 2.007, 2.029, 2.051, 2.066, 2.072, 2.072, 2.068, 2.068, + 2.052, 2.054, 2.054, 2.054, 2.051, 2.039, 2.023, 2.002, 1.982, 1.962, 1.944, 1.929, 1.914, 1.906, 1.901, 1.899, 1.899, 1.903, 1.909, 1.921, 1.936, 1.951, 1.973, 1.995, 2.018, 2.038, 2.057, 2.068, 2.072, 2.072, 2.068, 2.065, + 2.051, 2.054, 2.055, 2.056, 2.054, 2.047, 2.031, 2.012, 1.994, 1.975, 1.959, 1.944, 1.932, 1.923, 1.918, 1.917, 1.917, 1.921, 1.927, 1.936, 1.951, 1.968, 1.988, 2.009, 2.028, 2.047, 2.061, 2.071, 2.073, 2.072, 2.067, 2.064, + 2.052, 2.054, 2.055, 2.057, 2.057, 2.053, 2.039, 2.027, 2.007, 1.991, 1.975, 1.959, 1.951, 1.943, 1.938, 1.938, 1.938, 1.939, 1.944, 1.955, 1.968, 1.987, 2.003, 2.022, 2.038, 2.056, 2.066, 2.072, 2.075, 2.073, 2.068, 2.067, + 2.052, 2.053, 2.057, 2.059, 2.059, 2.058, 2.051, 2.037, 2.021, 2.007, 1.991, 1.978, 1.968, 1.962, 1.958, 1.958, 1.959, 1.961, 1.966, 1.974, 1.987, 2.003, 2.019, 2.036, 2.051, 2.063, 2.071, 2.075, 2.075, 2.073, 2.068, 2.068, + 2.052, 2.053, 2.057, 2.061, 2.062, 2.062, 2.057, 2.049, 2.036, 2.021, 2.009, 1.998, 1.988, 1.983, 1.978, 1.978, 1.978, 1.981, 1.986, 1.994, 2.006, 2.019, 2.035, 2.049, 2.061, 2.069, 2.075, 2.077, 2.077, 2.074, 2.069, 2.067, + 2.051, 2.053, 2.057, 2.061, 2.063, 2.064, 2.063, 2.056, 2.048, 2.036, 2.026, 2.016, 2.008, 2.005, 2.001, 1.999, 2.001, 2.003, 2.007, 2.013, 2.025, 2.035, 2.048, 2.061, 2.068, 2.075, 2.079, 2.078, 2.077, 2.074, 2.069, 2.067, + 2.049, 2.053, 2.057, 2.059, 2.064, 2.065, 2.065, 2.063, 2.056, 2.048, 2.041, 2.033, 2.028, 2.023, 2.021, 2.021, 2.021, 2.023, 2.028, 2.033, 2.042, 2.049, 2.061, 2.069, 2.074, 2.078, 2.079, 2.079, 2.077, 2.073, 2.068, 2.064, + 2.046, 2.052, 2.054, 2.059, 2.063, 2.065, 2.066, 2.066, 2.064, 2.057, 2.051, 2.047, 2.045, 2.039, 2.039, 2.038, 2.039, 2.041, 2.045, 2.049, 2.055, 2.061, 2.071, 2.074, 2.077, 2.078, 2.078, 2.077, 2.075, 2.071, 2.065, 2.061, + 2.045, 2.051, 2.054, 2.059, 2.062, 2.065, 2.067, 2.068, 2.067, 2.065, 2.061, 2.058, 2.057, 2.056, 2.056, 2.056, 2.057, 2.058, 2.059, 2.062, 2.067, 2.071, 2.075, 2.077, 2.078, 2.077, 2.077, 2.076, 2.074, 2.068, 2.061, 2.056, + 2.043, 2.049, 2.056, 2.058, 2.061, 2.067, 2.068, 2.069, 2.069, 2.069, 2.068, 2.068, 2.065, 2.065, 2.065, 2.066, 2.067, 2.068, 2.068, 2.069, 2.073, 2.074, 2.077, 2.078, 2.078, 2.076, 2.076, 2.075, 2.071, 2.067, 2.057, 2.051 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 2800, + "table": + [ + 2.896, 2.894, 2.882, 2.876, 2.871, 2.863, 2.857, 2.855, 2.852, 2.852, 2.852, 2.852, 2.855, 2.857, 2.859, 2.863, 2.863, 2.862, 2.859, 2.859, 2.861, 2.863, 2.863, 2.864, 2.867, 2.869, 2.875, 2.879, 2.892, 2.897, 2.899, 2.904, + 2.888, 2.883, 2.877, 2.874, 2.865, 2.859, 2.852, 2.848, 2.846, 2.845, 2.845, 2.848, 2.849, 2.849, 2.851, 2.852, 2.854, 2.853, 2.852, 2.852, 2.852, 2.852, 2.851, 2.853, 2.857, 2.865, 2.873, 2.876, 2.882, 2.883, 2.897, 2.901, + 2.881, 2.878, 2.875, 2.867, 2.859, 2.853, 2.848, 2.846, 2.844, 2.844, 2.845, 2.847, 2.849, 2.849, 2.851, 2.851, 2.852, 2.852, 2.852, 2.851, 2.849, 2.849, 2.849, 2.851, 2.854, 2.857, 2.865, 2.873, 2.877, 2.881, 2.885, 2.892, + 2.881, 2.877, 2.873, 2.867, 2.859, 2.852, 2.849, 2.847, 2.846, 2.847, 2.848, 2.849, 2.851, 2.851, 2.852, 2.853, 2.854, 2.854, 2.854, 2.853, 2.852, 2.851, 2.851, 2.851, 2.851, 2.856, 2.861, 2.869, 2.875, 2.879, 2.885, 2.891, + 2.877, 2.874, 2.871, 2.867, 2.861, 2.856, 2.851, 2.848, 2.847, 2.848, 2.849, 2.851, 2.852, 2.853, 2.855, 2.856, 2.856, 2.856, 2.855, 2.854, 2.851, 2.849, 2.849, 2.851, 2.851, 2.853, 2.858, 2.864, 2.872, 2.875, 2.881, 2.888, + 2.873, 2.872, 2.871, 2.867, 2.861, 2.857, 2.853, 2.851, 2.849, 2.851, 2.851, 2.852, 2.854, 2.856, 2.857, 2.858, 2.858, 2.858, 2.857, 2.855, 2.854, 2.851, 2.849, 2.849, 2.851, 2.852, 2.855, 2.863, 2.869, 2.873, 2.877, 2.888, + 2.872, 2.872, 2.871, 2.868, 2.862, 2.858, 2.854, 2.853, 2.852, 2.853, 2.854, 2.857, 2.859, 2.859, 2.862, 2.863, 2.863, 2.862, 2.861, 2.857, 2.854, 2.853, 2.852, 2.851, 2.851, 2.851, 2.853, 2.859, 2.866, 2.872, 2.875, 2.885, + 2.872, 2.872, 2.871, 2.867, 2.861, 2.858, 2.855, 2.854, 2.854, 2.855, 2.857, 2.861, 2.862, 2.863, 2.866, 2.868, 2.869, 2.868, 2.865, 2.862, 2.857, 2.855, 2.855, 2.852, 2.851, 2.851, 2.853, 2.856, 2.862, 2.869, 2.876, 2.882, + 2.872, 2.872, 2.869, 2.865, 2.861, 2.859, 2.857, 2.856, 2.855, 2.858, 2.861, 2.862, 2.865, 2.868, 2.871, 2.873, 2.872, 2.871, 2.869, 2.865, 2.861, 2.858, 2.856, 2.854, 2.853, 2.852, 2.853, 2.856, 2.861, 2.869, 2.872, 2.879, + 2.874, 2.872, 2.869, 2.865, 2.863, 2.861, 2.859, 2.858, 2.859, 2.859, 2.862, 2.865, 2.868, 2.873, 2.877, 2.879, 2.879, 2.877, 2.873, 2.871, 2.865, 2.859, 2.857, 2.854, 2.854, 2.853, 2.855, 2.856, 2.861, 2.868, 2.872, 2.879, + 2.874, 2.873, 2.871, 2.866, 2.864, 2.863, 2.862, 2.862, 2.862, 2.863, 2.866, 2.868, 2.875, 2.882, 2.885, 2.886, 2.886, 2.884, 2.881, 2.873, 2.871, 2.864, 2.858, 2.856, 2.855, 2.855, 2.856, 2.857, 2.861, 2.868, 2.871, 2.879, + 2.874, 2.874, 2.872, 2.867, 2.865, 2.864, 2.864, 2.864, 2.865, 2.866, 2.868, 2.875, 2.882, 2.891, 2.897, 2.897, 2.896, 2.894, 2.888, 2.882, 2.873, 2.867, 2.862, 2.857, 2.857, 2.857, 2.857, 2.858, 2.862, 2.866, 2.871, 2.878, + 2.874, 2.874, 2.872, 2.869, 2.867, 2.865, 2.865, 2.865, 2.868, 2.868, 2.874, 2.882, 2.891, 2.899, 2.906, 2.907, 2.906, 2.903, 2.895, 2.888, 2.877, 2.868, 2.864, 2.862, 2.858, 2.858, 2.858, 2.859, 2.861, 2.867, 2.871, 2.877, + 2.875, 2.874, 2.871, 2.869, 2.868, 2.868, 2.868, 2.869, 2.869, 2.872, 2.878, 2.885, 2.899, 2.907, 2.912, 2.914, 2.914, 2.907, 2.903, 2.893, 2.879, 2.869, 2.866, 2.862, 2.859, 2.859, 2.859, 2.859, 2.861, 2.864, 2.868, 2.877, + 2.876, 2.874, 2.872, 2.869, 2.869, 2.869, 2.869, 2.869, 2.871, 2.875, 2.881, 2.894, 2.902, 2.912, 2.917, 2.919, 2.917, 2.914, 2.906, 2.894, 2.882, 2.874, 2.866, 2.863, 2.861, 2.859, 2.858, 2.859, 2.859, 2.863, 2.867, 2.876, + 2.873, 2.873, 2.869, 2.871, 2.869, 2.869, 2.869, 2.871, 2.872, 2.877, 2.884, 2.894, 2.902, 2.912, 2.921, 2.921, 2.919, 2.917, 2.907, 2.895, 2.882, 2.874, 2.868, 2.862, 2.859, 2.857, 2.857, 2.858, 2.859, 2.862, 2.866, 2.872, + 2.872, 2.872, 2.871, 2.871, 2.869, 2.869, 2.869, 2.871, 2.873, 2.878, 2.885, 2.894, 2.905, 2.914, 2.921, 2.922, 2.921, 2.917, 2.907, 2.896, 2.884, 2.874, 2.867, 2.863, 2.861, 2.859, 2.858, 2.858, 2.859, 2.863, 2.867, 2.871, + 2.871, 2.872, 2.871, 2.869, 2.868, 2.869, 2.869, 2.871, 2.875, 2.878, 2.884, 2.893, 2.905, 2.915, 2.919, 2.921, 2.919, 2.916, 2.907, 2.895, 2.884, 2.873, 2.868, 2.864, 2.862, 2.859, 2.858, 2.858, 2.861, 2.863, 2.866, 2.871, + 2.872, 2.872, 2.871, 2.869, 2.868, 2.868, 2.871, 2.873, 2.875, 2.877, 2.884, 2.893, 2.905, 2.909, 2.916, 2.919, 2.916, 2.911, 2.904, 2.894, 2.884, 2.873, 2.867, 2.864, 2.861, 2.859, 2.859, 2.858, 2.861, 2.863, 2.866, 2.873, + 2.873, 2.872, 2.871, 2.869, 2.867, 2.868, 2.869, 2.872, 2.873, 2.876, 2.882, 2.889, 2.899, 2.905, 2.909, 2.911, 2.911, 2.904, 2.899, 2.891, 2.881, 2.869, 2.865, 2.864, 2.861, 2.858, 2.858, 2.858, 2.861, 2.863, 2.865, 2.875, + 2.876, 2.874, 2.871, 2.869, 2.869, 2.869, 2.869, 2.869, 2.872, 2.873, 2.879, 2.886, 2.894, 2.899, 2.903, 2.903, 2.903, 2.899, 2.893, 2.883, 2.875, 2.869, 2.864, 2.862, 2.859, 2.858, 2.857, 2.857, 2.861, 2.863, 2.866, 2.875, + 2.876, 2.876, 2.873, 2.871, 2.869, 2.868, 2.868, 2.869, 2.869, 2.872, 2.875, 2.881, 2.887, 2.894, 2.895, 2.898, 2.898, 2.893, 2.887, 2.877, 2.872, 2.865, 2.862, 2.861, 2.859, 2.858, 2.857, 2.859, 2.862, 2.864, 2.868, 2.875, + 2.876, 2.877, 2.875, 2.871, 2.869, 2.867, 2.866, 2.866, 2.869, 2.871, 2.874, 2.878, 2.883, 2.887, 2.891, 2.891, 2.891, 2.887, 2.881, 2.874, 2.867, 2.863, 2.861, 2.859, 2.859, 2.858, 2.858, 2.861, 2.864, 2.866, 2.869, 2.875, + 2.876, 2.877, 2.875, 2.871, 2.868, 2.866, 2.864, 2.865, 2.867, 2.869, 2.872, 2.875, 2.879, 2.882, 2.885, 2.885, 2.883, 2.882, 2.878, 2.873, 2.865, 2.861, 2.859, 2.858, 2.857, 2.858, 2.859, 2.862, 2.866, 2.868, 2.875, 2.879, + 2.878, 2.878, 2.876, 2.871, 2.868, 2.864, 2.863, 2.863, 2.865, 2.867, 2.869, 2.872, 2.874, 2.879, 2.881, 2.881, 2.881, 2.878, 2.874, 2.868, 2.863, 2.859, 2.858, 2.858, 2.857, 2.859, 2.861, 2.864, 2.869, 2.874, 2.879, 2.883, + 2.879, 2.879, 2.876, 2.871, 2.865, 2.863, 2.863, 2.863, 2.862, 2.863, 2.867, 2.869, 2.871, 2.873, 2.874, 2.875, 2.875, 2.874, 2.871, 2.864, 2.862, 2.859, 2.858, 2.857, 2.857, 2.859, 2.863, 2.868, 2.874, 2.878, 2.881, 2.886, + 2.881, 2.881, 2.879, 2.871, 2.866, 2.863, 2.862, 2.861, 2.859, 2.861, 2.864, 2.868, 2.868, 2.869, 2.871, 2.871, 2.871, 2.871, 2.866, 2.863, 2.862, 2.859, 2.857, 2.858, 2.858, 2.859, 2.865, 2.872, 2.877, 2.879, 2.883, 2.887, + 2.881, 2.882, 2.879, 2.875, 2.869, 2.865, 2.862, 2.861, 2.859, 2.862, 2.863, 2.866, 2.868, 2.869, 2.871, 2.869, 2.869, 2.867, 2.866, 2.864, 2.863, 2.861, 2.858, 2.859, 2.858, 2.864, 2.867, 2.874, 2.879, 2.883, 2.887, 2.889, + 2.881, 2.883, 2.881, 2.881, 2.871, 2.868, 2.865, 2.862, 2.861, 2.863, 2.864, 2.867, 2.868, 2.869, 2.871, 2.871, 2.869, 2.868, 2.868, 2.867, 2.865, 2.863, 2.862, 2.863, 2.866, 2.867, 2.872, 2.876, 2.881, 2.886, 2.891, 2.897, + 2.885, 2.886, 2.884, 2.882, 2.874, 2.869, 2.866, 2.863, 2.861, 2.861, 2.862, 2.865, 2.866, 2.867, 2.871, 2.871, 2.868, 2.867, 2.867, 2.867, 2.865, 2.863, 2.862, 2.865, 2.867, 2.867, 2.872, 2.877, 2.881, 2.886, 2.891, 2.898, + 2.886, 2.889, 2.887, 2.882, 2.874, 2.869, 2.866, 2.863, 2.862, 2.861, 2.861, 2.862, 2.861, 2.862, 2.863, 2.863, 2.863, 2.862, 2.861, 2.861, 2.862, 2.862, 2.863, 2.863, 2.864, 2.867, 2.872, 2.876, 2.881, 2.884, 2.889, 2.898, + 2.907, 2.892, 2.889, 2.876, 2.874, 2.869, 2.865, 2.863, 2.861, 2.859, 2.861, 2.861, 2.861, 2.859, 2.861, 2.862, 2.862, 2.861, 2.859, 2.861, 2.861, 2.862, 2.862, 2.863, 2.863, 2.864, 2.868, 2.874, 2.879, 2.883, 2.888, 2.899 + ] + }, + { + "ct": 4000, + "table": + [ + 1.929, 1.927, 1.922, 1.919, 1.916, 1.914, 1.911, 1.909, 1.908, 1.908, 1.909, 1.909, 1.911, 1.911, 1.912, 1.913, 1.914, 1.913, 1.912, 1.912, 1.911, 1.911, 1.912, 1.912, 1.912, 1.913, 1.915, 1.916, 1.922, 1.923, 1.927, 1.928, + 1.925, 1.923, 1.919, 1.917, 1.914, 1.911, 1.909, 1.908, 1.906, 1.907, 1.908, 1.909, 1.911, 1.911, 1.911, 1.912, 1.913, 1.912, 1.911, 1.911, 1.911, 1.909, 1.909, 1.909, 1.909, 1.911, 1.914, 1.915, 1.919, 1.919, 1.922, 1.924, + 1.921, 1.919, 1.918, 1.914, 1.912, 1.909, 1.908, 1.907, 1.906, 1.907, 1.908, 1.909, 1.911, 1.911, 1.911, 1.912, 1.912, 1.911, 1.911, 1.911, 1.909, 1.908, 1.908, 1.908, 1.909, 1.909, 1.912, 1.915, 1.917, 1.918, 1.921, 1.921, + 1.921, 1.919, 1.917, 1.914, 1.913, 1.909, 1.909, 1.908, 1.908, 1.909, 1.911, 1.912, 1.913, 1.913, 1.914, 1.914, 1.913, 1.913, 1.912, 1.912, 1.911, 1.909, 1.909, 1.909, 1.908, 1.909, 1.911, 1.914, 1.916, 1.918, 1.919, 1.921, + 1.918, 1.918, 1.917, 1.914, 1.913, 1.911, 1.909, 1.909, 1.909, 1.911, 1.912, 1.913, 1.914, 1.915, 1.916, 1.916, 1.916, 1.915, 1.914, 1.914, 1.912, 1.911, 1.909, 1.908, 1.908, 1.908, 1.909, 1.912, 1.915, 1.916, 1.917, 1.918, + 1.917, 1.917, 1.916, 1.915, 1.913, 1.912, 1.911, 1.911, 1.912, 1.913, 1.913, 1.914, 1.916, 1.917, 1.917, 1.917, 1.918, 1.918, 1.916, 1.915, 1.914, 1.912, 1.911, 1.909, 1.908, 1.908, 1.909, 1.911, 1.913, 1.915, 1.916, 1.917, + 1.916, 1.916, 1.916, 1.915, 1.914, 1.913, 1.913, 1.913, 1.913, 1.915, 1.917, 1.918, 1.919, 1.919, 1.921, 1.921, 1.921, 1.921, 1.919, 1.918, 1.915, 1.914, 1.912, 1.909, 1.908, 1.908, 1.908, 1.909, 1.913, 1.914, 1.915, 1.916, + 1.915, 1.916, 1.916, 1.915, 1.914, 1.914, 1.913, 1.914, 1.915, 1.918, 1.919, 1.922, 1.922, 1.924, 1.925, 1.925, 1.925, 1.924, 1.923, 1.921, 1.918, 1.915, 1.914, 1.911, 1.909, 1.908, 1.908, 1.909, 1.912, 1.913, 1.915, 1.915, + 1.915, 1.915, 1.915, 1.915, 1.914, 1.914, 1.915, 1.915, 1.917, 1.919, 1.922, 1.923, 1.924, 1.927, 1.928, 1.929, 1.929, 1.927, 1.925, 1.923, 1.921, 1.918, 1.915, 1.913, 1.911, 1.909, 1.908, 1.909, 1.912, 1.913, 1.914, 1.916, + 1.915, 1.915, 1.915, 1.916, 1.915, 1.915, 1.916, 1.917, 1.919, 1.922, 1.923, 1.925, 1.928, 1.929, 1.932, 1.933, 1.933, 1.932, 1.929, 1.926, 1.922, 1.919, 1.916, 1.914, 1.912, 1.911, 1.911, 1.911, 1.912, 1.913, 1.915, 1.917, + 1.916, 1.916, 1.916, 1.916, 1.916, 1.917, 1.918, 1.919, 1.921, 1.923, 1.925, 1.928, 1.933, 1.935, 1.937, 1.939, 1.939, 1.936, 1.934, 1.929, 1.926, 1.921, 1.917, 1.915, 1.913, 1.912, 1.911, 1.911, 1.913, 1.913, 1.914, 1.915, + 1.916, 1.917, 1.917, 1.917, 1.917, 1.918, 1.919, 1.921, 1.923, 1.925, 1.927, 1.933, 1.935, 1.941, 1.943, 1.944, 1.944, 1.941, 1.938, 1.934, 1.929, 1.924, 1.921, 1.916, 1.915, 1.913, 1.911, 1.911, 1.912, 1.914, 1.914, 1.914, + 1.917, 1.917, 1.917, 1.917, 1.917, 1.919, 1.921, 1.922, 1.925, 1.927, 1.931, 1.935, 1.941, 1.945, 1.949, 1.949, 1.949, 1.946, 1.941, 1.938, 1.931, 1.925, 1.921, 1.917, 1.916, 1.915, 1.913, 1.912, 1.912, 1.913, 1.913, 1.914, + 1.916, 1.917, 1.917, 1.917, 1.917, 1.919, 1.921, 1.923, 1.925, 1.928, 1.931, 1.938, 1.945, 1.949, 1.953, 1.954, 1.954, 1.949, 1.946, 1.941, 1.932, 1.926, 1.922, 1.919, 1.916, 1.915, 1.914, 1.912, 1.912, 1.912, 1.913, 1.914, + 1.915, 1.917, 1.917, 1.918, 1.919, 1.921, 1.922, 1.924, 1.926, 1.929, 1.934, 1.941, 1.946, 1.952, 1.955, 1.956, 1.955, 1.953, 1.947, 1.941, 1.933, 1.928, 1.922, 1.919, 1.916, 1.915, 1.913, 1.912, 1.912, 1.911, 1.913, 1.914, + 1.915, 1.916, 1.917, 1.919, 1.919, 1.921, 1.922, 1.924, 1.926, 1.931, 1.935, 1.941, 1.947, 1.952, 1.956, 1.956, 1.956, 1.953, 1.948, 1.941, 1.933, 1.928, 1.923, 1.919, 1.916, 1.914, 1.913, 1.911, 1.911, 1.911, 1.912, 1.914, + 1.915, 1.916, 1.917, 1.918, 1.919, 1.921, 1.922, 1.924, 1.927, 1.931, 1.935, 1.941, 1.947, 1.952, 1.956, 1.956, 1.956, 1.953, 1.948, 1.941, 1.933, 1.927, 1.922, 1.919, 1.917, 1.915, 1.913, 1.912, 1.911, 1.912, 1.912, 1.914, + 1.915, 1.915, 1.916, 1.917, 1.919, 1.921, 1.922, 1.925, 1.928, 1.931, 1.935, 1.941, 1.947, 1.952, 1.955, 1.956, 1.954, 1.951, 1.947, 1.941, 1.933, 1.927, 1.923, 1.919, 1.917, 1.914, 1.913, 1.911, 1.911, 1.912, 1.913, 1.913, + 1.915, 1.915, 1.916, 1.917, 1.918, 1.919, 1.922, 1.925, 1.928, 1.931, 1.935, 1.941, 1.946, 1.949, 1.953, 1.954, 1.951, 1.948, 1.945, 1.941, 1.933, 1.927, 1.923, 1.918, 1.917, 1.914, 1.912, 1.911, 1.911, 1.912, 1.913, 1.913, + 1.915, 1.916, 1.916, 1.917, 1.917, 1.919, 1.921, 1.924, 1.926, 1.929, 1.933, 1.938, 1.944, 1.946, 1.949, 1.949, 1.948, 1.946, 1.942, 1.937, 1.931, 1.924, 1.921, 1.918, 1.917, 1.913, 1.912, 1.911, 1.911, 1.911, 1.912, 1.912, + 1.915, 1.916, 1.916, 1.917, 1.917, 1.919, 1.921, 1.922, 1.924, 1.927, 1.931, 1.936, 1.938, 1.944, 1.944, 1.944, 1.944, 1.942, 1.938, 1.933, 1.926, 1.923, 1.919, 1.918, 1.915, 1.912, 1.911, 1.911, 1.911, 1.911, 1.912, 1.912, + 1.915, 1.916, 1.916, 1.917, 1.917, 1.919, 1.919, 1.921, 1.922, 1.926, 1.929, 1.931, 1.936, 1.938, 1.939, 1.941, 1.941, 1.938, 1.933, 1.929, 1.924, 1.921, 1.918, 1.916, 1.914, 1.912, 1.912, 1.911, 1.911, 1.911, 1.913, 1.913, + 1.915, 1.916, 1.917, 1.917, 1.916, 1.917, 1.918, 1.919, 1.921, 1.924, 1.927, 1.929, 1.932, 1.934, 1.936, 1.936, 1.935, 1.933, 1.929, 1.927, 1.922, 1.918, 1.916, 1.914, 1.913, 1.912, 1.912, 1.911, 1.912, 1.913, 1.914, 1.914, + 1.916, 1.917, 1.917, 1.917, 1.916, 1.915, 1.916, 1.918, 1.919, 1.922, 1.924, 1.927, 1.929, 1.931, 1.933, 1.933, 1.932, 1.929, 1.928, 1.925, 1.919, 1.917, 1.914, 1.913, 1.912, 1.912, 1.912, 1.912, 1.914, 1.914, 1.916, 1.916, + 1.916, 1.917, 1.917, 1.917, 1.915, 1.914, 1.915, 1.916, 1.917, 1.919, 1.921, 1.924, 1.926, 1.928, 1.929, 1.929, 1.929, 1.928, 1.925, 1.922, 1.919, 1.917, 1.914, 1.913, 1.912, 1.912, 1.912, 1.913, 1.915, 1.916, 1.917, 1.918, + 1.917, 1.917, 1.917, 1.916, 1.914, 1.913, 1.914, 1.914, 1.916, 1.917, 1.919, 1.921, 1.922, 1.924, 1.925, 1.926, 1.926, 1.925, 1.923, 1.919, 1.918, 1.915, 1.913, 1.913, 1.911, 1.911, 1.912, 1.915, 1.917, 1.917, 1.919, 1.921, + 1.917, 1.917, 1.917, 1.916, 1.914, 1.913, 1.913, 1.913, 1.913, 1.914, 1.917, 1.919, 1.921, 1.922, 1.922, 1.922, 1.922, 1.921, 1.919, 1.918, 1.916, 1.914, 1.913, 1.913, 1.912, 1.912, 1.914, 1.916, 1.917, 1.918, 1.921, 1.921, + 1.917, 1.918, 1.918, 1.917, 1.915, 1.913, 1.913, 1.912, 1.913, 1.913, 1.916, 1.918, 1.921, 1.921, 1.921, 1.921, 1.921, 1.919, 1.919, 1.918, 1.915, 1.914, 1.913, 1.913, 1.912, 1.914, 1.915, 1.917, 1.919, 1.921, 1.921, 1.923, + 1.917, 1.918, 1.919, 1.919, 1.917, 1.914, 1.914, 1.912, 1.913, 1.913, 1.915, 1.918, 1.919, 1.919, 1.921, 1.921, 1.919, 1.919, 1.919, 1.918, 1.916, 1.915, 1.914, 1.914, 1.914, 1.915, 1.917, 1.918, 1.919, 1.922, 1.923, 1.925, + 1.918, 1.921, 1.919, 1.919, 1.915, 1.914, 1.912, 1.911, 1.912, 1.913, 1.913, 1.915, 1.917, 1.918, 1.918, 1.919, 1.919, 1.918, 1.918, 1.918, 1.915, 1.915, 1.914, 1.914, 1.914, 1.915, 1.916, 1.918, 1.919, 1.921, 1.924, 1.926, + 1.921, 1.921, 1.919, 1.918, 1.914, 1.913, 1.911, 1.911, 1.911, 1.911, 1.911, 1.912, 1.912, 1.913, 1.913, 1.914, 1.914, 1.913, 1.912, 1.913, 1.913, 1.913, 1.913, 1.913, 1.912, 1.913, 1.915, 1.917, 1.918, 1.919, 1.923, 1.927, + 1.933, 1.924, 1.919, 1.914, 1.913, 1.913, 1.911, 1.909, 1.909, 1.909, 1.911, 1.911, 1.911, 1.911, 1.912, 1.912, 1.912, 1.911, 1.911, 1.911, 1.911, 1.911, 1.911, 1.911, 1.911, 1.912, 1.913, 1.916, 1.918, 1.919, 1.921, 1.927 + ] + } + ], + "luminance_lut": + [ + 3.676, 3.541, 3.263, 3.031, 2.824, 2.635, 2.471, 2.327, 2.204, 2.101, 2.018, 1.949, 1.913, 1.891, 1.879, 1.879, 1.879, 1.882, 1.898, 1.928, 1.979, 2.058, 2.149, 2.256, 2.389, 2.537, 2.712, 2.909, 3.124, 3.372, 3.676, 3.786, + 3.541, 3.353, 3.095, 2.871, 2.663, 2.481, 2.333, 2.219, 2.106, 2.018, 1.945, 1.882, 1.831, 1.793, 1.769, 1.762, 1.762, 1.777, 1.809, 1.854, 1.912, 1.979, 2.058, 2.155, 2.271, 2.391, 2.553, 2.745, 2.961, 3.196, 3.478, 3.676, + 3.364, 3.207, 2.959, 2.736, 2.535, 2.359, 2.219, 2.106, 2.018, 1.923, 1.846, 1.779, 1.726, 1.686, 1.661, 1.653, 1.653, 1.671, 1.702, 1.749, 1.809, 1.881, 1.964, 2.058, 2.155, 2.278, 2.429, 2.614, 2.828, 3.061, 3.324, 3.478, + 3.238, 3.078, 2.838, 2.614, 2.418, 2.259, 2.129, 2.021, 1.923, 1.834, 1.748, 1.678, 1.623, 1.584, 1.559, 1.549, 1.549, 1.567, 1.598, 1.646, 1.709, 1.783, 1.879, 1.964, 2.066, 2.183, 2.323, 2.494, 2.703, 2.933, 3.189, 3.333, + 3.132, 2.966, 2.725, 2.506, 2.319, 2.171, 2.048, 1.937, 1.834, 1.748, 1.654, 1.583, 1.528, 1.488, 1.463, 1.455, 1.455, 1.473, 1.505, 1.551, 1.613, 1.694, 1.783, 1.879, 1.986, 2.102, 2.232, 2.391, 2.589, 2.819, 3.072, 3.219, + 3.038, 2.863, 2.622, 2.411, 2.236, 2.095, 1.972, 1.858, 1.749, 1.654, 1.572, 1.495, 1.439, 1.402, 1.378, 1.371, 1.371, 1.388, 1.419, 1.465, 1.527, 1.613, 1.694, 1.798, 1.908, 2.027, 2.155, 2.303, 2.489, 2.714, 2.968, 3.119, + 2.951, 2.767, 2.531, 2.326, 2.163, 2.027, 1.901, 1.782, 1.671, 1.572, 1.495, 1.417, 1.363, 1.327, 1.303, 1.296, 1.296, 1.312, 1.342, 1.388, 1.452, 1.527, 1.616, 1.721, 1.835, 1.958, 2.086, 2.228, 2.402, 2.621, 2.872, 3.033, + 2.876, 2.683, 2.451, 2.255, 2.101, 1.965, 1.836, 1.712, 1.599, 1.499, 1.417, 1.354, 1.296, 1.259, 1.236, 1.231, 1.231, 1.246, 1.275, 1.319, 1.388, 1.452, 1.542, 1.649, 1.768, 1.895, 2.026, 2.165, 2.331, 2.538, 2.783, 2.956, + 2.809, 2.611, 2.383, 2.197, 2.044, 1.908, 1.777, 1.649, 1.536, 1.436, 1.354, 1.296, 1.237, 1.201, 1.179, 1.173, 1.173, 1.189, 1.218, 1.268, 1.319, 1.391, 1.479, 1.585, 1.706, 1.837, 1.971, 2.112, 2.269, 2.466, 2.707, 2.888, + 2.753, 2.546, 2.323, 2.147, 1.998, 1.858, 1.723, 1.596, 1.482, 1.384, 1.302, 1.237, 1.195, 1.153, 1.131, 1.124, 1.124, 1.141, 1.171, 1.218, 1.268, 1.339, 1.427, 1.531, 1.651, 1.784, 1.923, 2.065, 2.219, 2.406, 2.643, 2.829, + 2.705, 2.491, 2.276, 2.105, 1.956, 1.814, 1.677, 1.549, 1.436, 1.339, 1.259, 1.195, 1.153, 1.113, 1.091, 1.084, 1.084, 1.101, 1.137, 1.171, 1.226, 1.295, 1.381, 1.484, 1.604, 1.738, 1.882, 2.025, 2.176, 2.361, 2.587, 2.783, + 2.669, 2.446, 2.239, 2.072, 1.923, 1.777, 1.638, 1.511, 1.397, 1.303, 1.224, 1.162, 1.113, 1.086, 1.057, 1.052, 1.052, 1.069, 1.101, 1.137, 1.193, 1.261, 1.345, 1.448, 1.567, 1.701, 1.846, 1.992, 2.145, 2.323, 2.545, 2.747, + 2.642, 2.412, 2.209, 2.045, 1.895, 1.749, 1.608, 1.479, 1.369, 1.275, 1.197, 1.134, 1.086, 1.057, 1.034, 1.027, 1.027, 1.051, 1.069, 1.111, 1.166, 1.233, 1.318, 1.419, 1.537, 1.671, 1.816, 1.966, 2.119, 2.291, 2.509, 2.719, + 2.626, 2.389, 2.191, 2.026, 1.876, 1.727, 1.585, 1.457, 1.348, 1.254, 1.178, 1.116, 1.067, 1.034, 1.024, 1.012, 1.014, 1.027, 1.051, 1.092, 1.146, 1.214, 1.298, 1.398, 1.516, 1.651, 1.794, 1.945, 2.099, 2.271, 2.486, 2.703, + 2.619, 2.374, 2.177, 2.016, 1.864, 1.714, 1.572, 1.445, 1.335, 1.243, 1.166, 1.104, 1.056, 1.024, 1.011, 1.003, 1.009, 1.014, 1.039, 1.081, 1.135, 1.202, 1.286, 1.385, 1.502, 1.637, 1.783, 1.933, 2.088, 2.259, 2.469, 2.697, + 2.619, 2.372, 2.175, 2.013, 1.861, 1.711, 1.569, 1.442, 1.333, 1.241, 1.164, 1.102, 1.054, 1.021, 1.004, 1.001, 1.001, 1.011, 1.038, 1.079, 1.134, 1.202, 1.283, 1.383, 1.501, 1.633, 1.779, 1.931, 2.085, 2.256, 2.465, 2.697, + 2.619, 2.372, 2.175, 2.013, 1.861, 1.711, 1.569, 1.442, 1.333, 1.241, 1.164, 1.102, 1.054, 1.021, 1.004, 1.002, 1.002, 1.011, 1.038, 1.081, 1.135, 1.202, 1.283, 1.383, 1.501, 1.633, 1.779, 1.931, 2.085, 2.256, 2.465, 2.697, + 2.623, 2.385, 2.187, 2.022, 1.871, 1.722, 1.579, 1.452, 1.342, 1.251, 1.173, 1.111, 1.064, 1.031, 1.017, 1.005, 1.011, 1.021, 1.048, 1.089, 1.144, 1.211, 1.293, 1.394, 1.511, 1.644, 1.789, 1.941, 2.094, 2.265, 2.477, 2.699, + 2.636, 2.409, 2.207, 2.039, 1.888, 1.741, 1.601, 1.472, 1.361, 1.268, 1.191, 1.129, 1.081, 1.051, 1.031, 1.021, 1.021, 1.045, 1.064, 1.106, 1.161, 1.227, 1.311, 1.412, 1.529, 1.664, 1.808, 1.957, 2.109, 2.282, 2.499, 2.714, + 2.664, 2.441, 2.233, 2.066, 1.914, 1.769, 1.628, 1.499, 1.389, 1.294, 1.216, 1.153, 1.106, 1.081, 1.051, 1.045, 1.045, 1.064, 1.092, 1.131, 1.186, 1.254, 1.338, 1.441, 1.559, 1.693, 1.836, 1.985, 2.138, 2.313, 2.534, 2.739, + 2.697, 2.477, 2.265, 2.094, 1.943, 1.801, 1.662, 1.535, 1.422, 1.326, 1.247, 1.185, 1.141, 1.106, 1.081, 1.075, 1.075, 1.092, 1.129, 1.161, 1.217, 1.286, 1.371, 1.474, 1.594, 1.728, 1.869, 2.015, 2.168, 2.348, 2.573, 2.775, + 2.739, 2.528, 2.308, 2.133, 1.982, 1.842, 1.705, 1.579, 1.465, 1.368, 1.287, 1.224, 1.185, 1.141, 1.119, 1.114, 1.114, 1.129, 1.161, 1.205, 1.256, 1.327, 1.413, 1.519, 1.639, 1.772, 1.911, 2.054, 2.209, 2.394, 2.628, 2.818, + 2.793, 2.587, 2.361, 2.179, 2.028, 1.889, 1.757, 1.631, 1.517, 1.419, 1.337, 1.277, 1.224, 1.187, 1.165, 1.159, 1.159, 1.175, 1.205, 1.256, 1.304, 1.377, 1.465, 1.571, 1.691, 1.823, 1.959, 2.099, 2.258, 2.451, 2.693, 2.876, + 2.856, 2.661, 2.428, 2.239, 2.082, 1.946, 1.817, 1.693, 1.579, 1.479, 1.396, 1.337, 1.277, 1.241, 1.219, 1.214, 1.214, 1.231, 1.259, 1.304, 1.368, 1.436, 1.526, 1.634, 1.753, 1.883, 2.015, 2.154, 2.318, 2.523, 2.772, 2.943, + 2.931, 2.745, 2.505, 2.305, 2.144, 2.008, 1.882, 1.761, 1.648, 1.549, 1.471, 1.396, 1.342, 1.303, 1.281, 1.275, 1.275, 1.293, 1.323, 1.368, 1.436, 1.506, 1.595, 1.702, 1.821, 1.946, 2.075, 2.215, 2.388, 2.603, 2.857, 3.023, + 3.013, 2.842, 2.599, 2.387, 2.215, 2.076, 1.952, 1.836, 1.726, 1.627, 1.549, 1.471, 1.416, 1.377, 1.353, 1.347, 1.347, 1.365, 1.397, 1.444, 1.506, 1.593, 1.674, 1.779, 1.893, 2.014, 2.142, 2.289, 2.472, 2.696, 2.955, 3.108, + 3.107, 2.945, 2.699, 2.481, 2.296, 2.151, 2.027, 1.915, 1.808, 1.719, 1.627, 1.555, 1.501, 1.461, 1.435, 1.429, 1.429, 1.447, 1.479, 1.529, 1.593, 1.674, 1.761, 1.862, 1.971, 2.088, 2.219, 2.374, 2.568, 2.805, 3.064, 3.211, + 3.218, 3.058, 2.814, 2.589, 2.392, 2.235, 2.108, 1.997, 1.897, 1.808, 1.719, 1.649, 1.593, 1.553, 1.527, 1.521, 1.521, 1.539, 1.572, 1.622, 1.686, 1.761, 1.858, 1.947, 2.051, 2.168, 2.304, 2.474, 2.682, 2.923, 3.183, 3.327, + 3.342, 3.187, 2.939, 2.712, 2.506, 2.337, 2.198, 2.085, 1.995, 1.897, 1.818, 1.751, 1.695, 1.654, 1.629, 1.621, 1.621, 1.641, 1.674, 1.723, 1.786, 1.858, 1.947, 2.039, 2.139, 2.259, 2.408, 2.593, 2.807, 3.053, 3.319, 3.475, + 3.495, 3.329, 3.071, 2.845, 2.634, 2.455, 2.303, 2.185, 2.085, 1.995, 1.919, 1.855, 1.801, 1.763, 1.738, 1.731, 1.731, 1.749, 1.781, 1.828, 1.888, 1.959, 2.039, 2.139, 2.238, 2.367, 2.531, 2.728, 2.949, 3.195, 3.475, 3.658, + 3.669, 3.495, 3.218, 2.987, 2.776, 2.588, 2.426, 2.294, 2.185, 2.097, 2.024, 1.961, 1.911, 1.875, 1.851, 1.844, 1.844, 1.862, 1.893, 1.937, 1.995, 2.063, 2.142, 2.238, 2.352, 2.497, 2.675, 2.877, 3.101, 3.356, 3.658, 3.843, + 3.837, 3.669, 3.367, 3.123, 2.912, 2.721, 2.552, 2.407, 2.291, 2.185, 2.097, 2.024, 1.975, 1.954, 1.944, 1.944, 1.944, 1.946, 1.965, 1.995, 2.063, 2.142, 2.236, 2.345, 2.471, 2.628, 2.812, 3.018, 3.248, 3.517, 3.843, 3.988 + ], + "sigma": 0.00072, + "sigma_Cb": 0.00079 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2800, + "ccm": + [ + 1.60099, -0.27615, -0.32485, + -0.36173, 1.73154, -0.36981, + 0.05061, -1.11212, 2.06152 + ] + }, + { + "ct": 2860, + "ccm": + [ + 1.61273, -0.35631, -0.25641, + -0.49273, 1.98065, -0.48793, + -0.03047, -0.69949, 1.72997 + ] + }, + { + "ct": 2880, + "ccm": + [ + 1.60615, -0.34009, -0.26606, + -0.48642, 1.98548, -0.49906, + -0.02324, -0.73793, 1.76117 + ] + }, + { + "ct": 3580, + "ccm": + [ + 1.68146, -0.47435, -0.20711, + -0.42387, 1.87351, -0.44963, + -0.03582, -0.59119, 1.62701 + ] + }, + { + "ct": 3650, + "ccm": + [ + 1.66879, -0.45734, -0.21146, + -0.42285, 1.86266, -0.43981, + -0.04212, -0.55689, 1.59902 + ] + }, + { + "ct": 4500, + "ccm": + [ + 1.58737, -0.34781, -0.23956, + -0.38604, 1.97168, -0.58564, + -0.05469, -0.50253, 1.55722 + ] + }, + { + "ct": 4570, + "ccm": + [ + 1.61538, -0.38095, -0.23443, + -0.38067, 1.96743, -0.58675, + -0.05282, -0.52277, 1.57559 + ] + }, + { + "ct": 5648, + "ccm": + [ + 1.76567, -0.60063, -0.16504, + -0.33153, 1.81445, -0.48292, + -0.06404, -0.43593, 1.49997 + ] + }, + { + "ct": 5717, + "ccm": + [ + 1.75403, -0.58859, -0.16543, + -0.32727, 1.80986, -0.48259, + -0.06479, -0.43555, 1.50035 + ] + }, + { + "ct": 7600, + "ccm": + [ + 1.71011, -0.33715, -0.37296, + -0.31253, 2.25037, -0.93784, + -0.08325, -0.71623, 1.79948 + ] + } + ] + } + }, + { + "rpi.cac": { } + }, + { + "rpi.sharpen": + { + "threshold": 0.25, + "limit": 1.0, + "strength": 1.0 + } + }, + { + "rpi.hdr": + { + "Off": + { + "cadence": [ 0 ] + }, + "MultiExposureUnmerged": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + } + }, + "SingleExposure": + { + "cadence": [ 1 ], + "channel_map": + { + "short": 1 + }, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "MultiExposure": + { + "cadence": [ 1, 2 ], + "channel_map": + { + "short": 1, + "long": 2 + }, + "stitch_enable": 1, + "spatial_gain": 2.0, + "tonemap_enable": 1 + }, + "Night": + { + "cadence": [ 3 ], + "channel_map": + { + "night": 3 + }, + "tonemap_enable": 1, + "tonemap": + [ + 0, 0, + 5000, 20000, + 10000, 30000, + 20000, 47000, + 30000, 55000, + 65535, 65535 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/pisp/data/meson.build b/src/ipa/rpi/pisp/data/meson.build index 76c182d12..a559f01d3 100644 --- a/src/ipa/rpi/pisp/data/meson.build +++ b/src/ipa/rpi/pisp/data/meson.build @@ -9,6 +9,7 @@ conf_files = files([ 'imx477.json', 'imx477_noir.json', 'imx477_scientific.json', + 'imx500.json', 'imx519.json', 'imx708.json', 'imx708_noir.json', diff --git a/src/ipa/rpi/vc4/data/imx500.json b/src/ipa/rpi/vc4/data/imx500.json new file mode 100644 index 000000000..41c663d93 --- /dev/null +++ b/src/ipa/rpi/vc4/data/imx500.json @@ -0,0 +1,463 @@ +{ + "version": 2.0, + "target": "bcm2835", + "algorithms": [ + { + "rpi.black_level": + { + "black_level": 4096 + } + }, + { + "rpi.dpc": { } + }, + { + "rpi.lux": + { + "reference_shutter_speed": 10369, + "reference_gain": 2.0, + "reference_aperture": 1.0, + "reference_lux": 950, + "reference_Y": 12457 + } + }, + { + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.747 + } + }, + { + "rpi.geq": + { + "offset": 223, + "slope": 0.00933 + } + }, + { + "rpi.sdn": { } + }, + { + "rpi.awb": + { + "priors": [ + { + "lux": 0, + "prior": + [ + 2000, 1.0, + 3000, 0.0, + 13000, 0.0 + ] + }, + { + "lux": 800, + "prior": + [ + 2000, 0.0, + 6000, 2.0, + 13000, 2.0 + ] + }, + { + "lux": 1500, + "prior": + [ + 2000, 0.0, + 4000, 1.0, + 6000, 6.0, + 6500, 7.0, + 7000, 1.0, + 13000, 1.0 + ] + } + ], + "modes": + { + "auto": + { + "lo": 2800, + "hi": 8000 + }, + "incandescent": + { + "lo": 2800, + "hi": 3000 + }, + "tungsten": + { + "lo": 3000, + "hi": 3500 + }, + "fluorescent": + { + "lo": 4000, + "hi": 4700 + }, + "indoor": + { + "lo": 3000, + "hi": 5000 + }, + "daylight": + { + "lo": 5500, + "hi": 6500 + }, + "cloudy": + { + "lo": 7000, + "hi": 7600 + } + }, + "bayes": 1, + "ct_curve": + [ + 2800.0, 0.7126, 0.3567, + 2860.0, 0.6681, 0.4042, + 2880.0, 0.6651, 0.4074, + 3580.0, 0.5674, 0.5091, + 3650.0, 0.5629, 0.5137, + 4500.0, 0.4792, 0.5982, + 4570.0, 0.4752, 0.6022, + 5648.0, 0.4137, 0.6628, + 5717.0, 0.4116, 0.6648, + 7600.0, 0.3609, 0.7138 + ], + "sensitivity_r": 1.0, + "sensitivity_b": 1.0, + "transverse_pos": 0.02798, + "transverse_neg": 0.02626 + } + }, + { + "rpi.agc": + { + "metering_modes": + { + "centre-weighted": + { + "weights": + [ + 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 + ] + }, + "spot": + { + "weights": + [ + 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + }, + "matrix": + { + "weights": + [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + ] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 10000, 30000, 60000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 6.0 ] + }, + "short": + { + "shutter": [ 100, 5000, 10000, 20000, 120000 ], + "gain": [ 1.0, 2.0, 4.0, 6.0, 6.0 ] + } + }, + "constraint_modes": + { + "normal": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + } + ], + "highlight": [ + { + "bound": "LOWER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.5, + 1000, 0.5 + ] + }, + { + "bound": "UPPER", + "q_lo": 0.98, + "q_hi": 1.0, + "y_target": + [ + 0, 0.8, + 1000, 0.8 + ] + } + ] + }, + "y_target": + [ + 0, 0.16, + 1000, 0.165, + 10000, 0.17 + ] + } + }, + { + "rpi.alsc": + { + "omega": 1.3, + "n_iter": 100, + "luminance_strength": 0.8, + "calibrations_Cr": [ + { + "ct": 2800, + "table": + [ + 1.613, 1.617, 1.621, 1.621, 1.615, 1.607, 1.604, 1.603, 1.603, 1.603, 1.607, 1.619, 1.626, 1.626, 1.622, 1.615, + 1.613, 1.616, 1.617, 1.615, 1.599, 1.583, 1.571, 1.564, 1.564, 1.571, 1.584, 1.603, 1.621, 1.624, 1.622, 1.618, + 1.613, 1.614, 1.614, 1.599, 1.577, 1.546, 1.529, 1.521, 1.521, 1.529, 1.548, 1.582, 1.603, 1.621, 1.621, 1.621, + 1.613, 1.613, 1.604, 1.577, 1.546, 1.521, 1.489, 1.481, 1.481, 1.491, 1.525, 1.548, 1.582, 1.612, 1.621, 1.623, + 1.614, 1.612, 1.595, 1.561, 1.521, 1.489, 1.475, 1.453, 1.453, 1.479, 1.491, 1.525, 1.567, 1.606, 1.623, 1.624, + 1.614, 1.612, 1.593, 1.555, 1.513, 1.477, 1.454, 1.452, 1.453, 1.455, 1.481, 1.519, 1.563, 1.604, 1.624, 1.626, + 1.615, 1.612, 1.593, 1.555, 1.513, 1.477, 1.458, 1.452, 1.453, 1.459, 1.481, 1.519, 1.563, 1.604, 1.625, 1.626, + 1.615, 1.614, 1.599, 1.564, 1.525, 1.496, 1.477, 1.459, 1.459, 1.481, 1.497, 1.531, 1.572, 1.609, 1.626, 1.627, + 1.614, 1.614, 1.609, 1.581, 1.552, 1.525, 1.496, 1.488, 1.488, 1.497, 1.531, 1.558, 1.591, 1.619, 1.626, 1.626, + 1.614, 1.616, 1.618, 1.607, 1.581, 1.552, 1.535, 1.529, 1.529, 1.538, 1.558, 1.591, 1.616, 1.631, 1.631, 1.625, + 1.613, 1.618, 1.619, 1.621, 1.607, 1.591, 1.579, 1.575, 1.575, 1.582, 1.597, 1.616, 1.631, 1.632, 1.631, 1.625, + 1.611, 1.616, 1.622, 1.623, 1.621, 1.615, 1.614, 1.614, 1.614, 1.615, 1.619, 1.631, 1.633, 1.633, 1.629, 1.624 + ] + }, + { + "ct": 4000, + "table": + [ + 2.051, 2.057, 2.058, 2.058, 2.052, 2.045, 2.041, 2.041, 2.041, 2.042, 2.047, 2.062, 2.071, 2.071, 2.068, 2.061, + 2.051, 2.053, 2.055, 2.051, 2.033, 2.014, 2.001, 1.995, 1.995, 2.004, 2.019, 2.042, 2.064, 2.069, 2.068, 2.062, + 2.051, 2.051, 2.051, 2.033, 2.005, 1.971, 1.951, 1.943, 1.943, 1.953, 1.976, 2.016, 2.042, 2.064, 2.065, 2.065, + 2.049, 2.049, 2.037, 2.005, 1.971, 1.939, 1.904, 1.894, 1.894, 1.906, 1.947, 1.976, 2.016, 2.053, 2.065, 2.066, + 2.051, 2.048, 2.028, 1.987, 1.939, 1.904, 1.884, 1.858, 1.858, 1.891, 1.906, 1.947, 1.998, 2.044, 2.066, 2.068, + 2.051, 2.048, 2.025, 1.981, 1.929, 1.886, 1.858, 1.855, 1.857, 1.861, 1.892, 1.939, 1.992, 2.041, 2.068, 2.068, + 2.052, 2.048, 2.025, 1.981, 1.929, 1.886, 1.863, 1.855, 1.858, 1.864, 1.892, 1.939, 1.992, 2.041, 2.068, 2.069, + 2.053, 2.052, 2.033, 1.992, 1.944, 1.911, 1.886, 1.864, 1.864, 1.892, 1.912, 1.953, 2.003, 2.048, 2.069, 2.069, + 2.053, 2.053, 2.046, 2.013, 1.978, 1.944, 1.911, 1.901, 1.901, 1.912, 1.953, 1.985, 2.023, 2.059, 2.069, 2.069, + 2.053, 2.055, 2.058, 2.044, 2.013, 1.978, 1.959, 1.951, 1.951, 1.961, 1.985, 2.023, 2.054, 2.071, 2.071, 2.068, + 2.052, 2.058, 2.059, 2.061, 2.044, 2.025, 2.011, 2.005, 2.005, 2.014, 2.031, 2.054, 2.071, 2.075, 2.072, 2.068, + 2.051, 2.056, 2.064, 2.064, 2.061, 2.055, 2.052, 2.052, 2.052, 2.054, 2.058, 2.071, 2.077, 2.077, 2.072, 2.067 + ] + } + ], + "calibrations_Cb": [ + { + "ct": 2800, + "table": + [ + 2.878, 2.876, 2.864, 2.851, 2.847, 2.847, 2.849, 2.854, 2.854, 2.854, 2.854, 2.854, 2.861, 2.873, 2.885, 2.887, + 2.876, 2.871, 2.859, 2.852, 2.849, 2.849, 2.854, 2.855, 2.855, 2.855, 2.854, 2.852, 2.854, 2.861, 2.875, 2.885, + 2.872, 2.869, 2.859, 2.856, 2.854, 2.856, 2.859, 2.863, 2.863, 2.861, 2.855, 2.852, 2.853, 2.855, 2.867, 2.875, + 2.872, 2.871, 2.865, 2.859, 2.858, 2.863, 2.869, 2.877, 2.877, 2.872, 2.861, 2.856, 2.854, 2.857, 2.863, 2.873, + 2.872, 2.871, 2.868, 2.865, 2.866, 2.872, 2.886, 2.899, 2.899, 2.879, 2.872, 2.861, 2.857, 2.859, 2.862, 2.871, + 2.872, 2.871, 2.869, 2.869, 2.872, 2.886, 2.901, 2.909, 2.903, 2.899, 2.879, 2.865, 2.859, 2.859, 2.861, 2.869, + 2.872, 2.871, 2.871, 2.871, 2.873, 2.886, 2.906, 2.909, 2.908, 2.902, 2.879, 2.865, 2.859, 2.859, 2.861, 2.868, + 2.872, 2.871, 2.871, 2.869, 2.873, 2.884, 2.892, 2.907, 2.903, 2.889, 2.875, 2.864, 2.859, 2.859, 2.861, 2.868, + 2.875, 2.872, 2.868, 2.867, 2.869, 2.874, 2.884, 2.889, 2.889, 2.877, 2.866, 2.859, 2.859, 2.861, 2.864, 2.872, + 2.877, 2.875, 2.867, 2.864, 2.865, 2.869, 2.874, 2.877, 2.877, 2.868, 2.861, 2.859, 2.859, 2.863, 2.872, 2.881, + 2.882, 2.877, 2.868, 2.863, 2.863, 2.863, 2.868, 2.869, 2.868, 2.865, 2.863, 2.861, 2.863, 2.871, 2.881, 2.883, + 2.885, 2.882, 2.872, 2.864, 2.861, 2.861, 2.865, 2.865, 2.865, 2.864, 2.863, 2.863, 2.866, 2.872, 2.882, 2.891 + ] + }, + { + "ct": 4000, + "table": + [ + 1.919, 1.919, 1.913, 1.909, 1.909, 1.909, 1.911, 1.912, 1.912, 1.911, 1.909, 1.909, 1.911, 1.914, 1.919, 1.921, + 1.919, 1.916, 1.913, 1.911, 1.909, 1.912, 1.914, 1.915, 1.914, 1.913, 1.911, 1.909, 1.909, 1.911, 1.915, 1.919, + 1.916, 1.915, 1.915, 1.914, 1.914, 1.918, 1.921, 1.921, 1.921, 1.919, 1.915, 1.911, 1.909, 1.911, 1.913, 1.916, + 1.916, 1.916, 1.916, 1.916, 1.919, 1.924, 1.928, 1.932, 1.932, 1.928, 1.919, 1.915, 1.911, 1.911, 1.912, 1.914, + 1.916, 1.917, 1.918, 1.919, 1.924, 1.928, 1.937, 1.945, 1.945, 1.932, 1.928, 1.919, 1.915, 1.912, 1.912, 1.913, + 1.916, 1.918, 1.919, 1.923, 1.928, 1.937, 1.946, 1.949, 1.946, 1.945, 1.931, 1.922, 1.916, 1.912, 1.912, 1.913, + 1.916, 1.918, 1.919, 1.923, 1.928, 1.937, 1.948, 1.949, 1.948, 1.945, 1.931, 1.922, 1.916, 1.912, 1.912, 1.912, + 1.915, 1.917, 1.918, 1.922, 1.927, 1.933, 1.938, 1.946, 1.945, 1.935, 1.928, 1.919, 1.915, 1.912, 1.912, 1.912, + 1.916, 1.916, 1.917, 1.918, 1.922, 1.927, 1.933, 1.935, 1.935, 1.928, 1.921, 1.915, 1.913, 1.912, 1.912, 1.914, + 1.917, 1.916, 1.916, 1.915, 1.917, 1.921, 1.925, 1.926, 1.926, 1.921, 1.918, 1.913, 1.913, 1.913, 1.916, 1.919, + 1.918, 1.917, 1.915, 1.913, 1.913, 1.916, 1.919, 1.921, 1.921, 1.918, 1.914, 1.913, 1.913, 1.915, 1.918, 1.921, + 1.919, 1.919, 1.914, 1.912, 1.912, 1.913, 1.914, 1.915, 1.915, 1.915, 1.913, 1.913, 1.913, 1.915, 1.919, 1.922 + ] + } + ], + "luminance_lut": + [ + 3.029, 2.888, 2.497, 2.201, 1.954, 1.761, 1.711, 1.711, 1.711, 1.713, 1.778, 1.975, 2.225, 2.526, 2.925, 3.069, + 2.888, 2.562, 2.203, 1.999, 1.762, 1.602, 1.495, 1.447, 1.447, 1.503, 1.616, 1.785, 2.019, 2.229, 2.594, 2.925, + 2.577, 2.319, 2.004, 1.762, 1.602, 1.391, 1.284, 1.241, 1.241, 1.294, 1.409, 1.616, 1.785, 2.031, 2.349, 2.607, + 2.451, 2.155, 1.861, 1.607, 1.391, 1.284, 1.137, 1.095, 1.095, 1.154, 1.294, 1.409, 1.631, 1.891, 2.185, 2.483, + 2.393, 2.056, 1.765, 1.501, 1.288, 1.137, 1.091, 1.004, 1.011, 1.095, 1.154, 1.309, 1.527, 1.796, 2.088, 2.425, + 2.393, 2.015, 1.722, 1.455, 1.245, 1.097, 1.004, 1.001, 1.001, 1.016, 1.115, 1.266, 1.482, 1.752, 2.046, 2.425, + 2.393, 2.015, 1.722, 1.455, 1.245, 1.097, 1.014, 1.001, 1.011, 1.017, 1.115, 1.266, 1.482, 1.752, 2.046, 2.425, + 2.399, 2.071, 1.777, 1.515, 1.301, 1.158, 1.097, 1.017, 1.017, 1.114, 1.169, 1.323, 1.543, 1.809, 2.102, 2.429, + 2.471, 2.178, 1.881, 1.628, 1.419, 1.301, 1.158, 1.117, 1.117, 1.169, 1.323, 1.439, 1.657, 1.915, 2.213, 2.501, + 2.622, 2.358, 2.034, 1.799, 1.628, 1.419, 1.315, 1.271, 1.271, 1.327, 1.439, 1.657, 1.824, 2.067, 2.394, 2.662, + 2.959, 2.622, 2.255, 2.034, 1.799, 1.644, 1.536, 1.489, 1.489, 1.548, 1.664, 1.824, 2.066, 2.284, 2.662, 3.018, + 3.099, 2.959, 2.559, 2.249, 1.994, 1.803, 1.756, 1.756, 1.756, 1.759, 1.824, 2.022, 2.281, 2.601, 3.018, 3.155 + ], + "sigma": 0.00096, + "sigma_Cb": 0.00125 + } + }, + { + "rpi.contrast": + { + "ce_enable": 1, + "gamma_curve": + [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } + }, + { + "rpi.ccm": + { + "ccms": [ + { + "ct": 2800, + "ccm": + [ + 1.61505, -0.29143, -0.32361, + -0.36502, 1.73067, -0.36565, + 0.05048, -1.11795, 2.06747 + ] + }, + { + "ct": 2860, + "ccm": + [ + 1.61304, -0.35407, -0.25897, + -0.49934, 1.98721, -0.48786, + -0.03138, -0.70205, 1.73343 + ] + }, + { + "ct": 2880, + "ccm": + [ + 1.61025, -0.33823, -0.27202, + -0.49191, 1.99155, -0.49964, + -0.02357, -0.74144, 1.76501 + ] + }, + { + "ct": 3580, + "ccm": + [ + 1.67102, -0.45799, -0.21303, + -0.43726, 1.89058, -0.45332, + -0.04778, -0.57899, 1.62678 + ] + }, + { + "ct": 3650, + "ccm": + [ + 1.66289, -0.44966, -0.21324, + -0.42687, 1.86716, -0.44029, + -0.04423, -0.55781, 1.60204 + ] + }, + { + "ct": 4500, + "ccm": + [ + 1.59699, -0.35409, -0.24291, + -0.38812, 1.97453, -0.58641, + -0.05398, -0.50715, 1.56113 + ] + }, + { + "ct": 4570, + "ccm": + [ + 1.62669, -0.38858, -0.23811, + -0.38608, 1.97311, -0.58703, + -0.05461, -0.52526, 1.57986 + ] + }, + { + "ct": 5648, + "ccm": + [ + 1.77461, -0.60797, -0.16664, + -0.33734, 1.82254, -0.48521, + -0.06916, -0.43139, 1.50056 + ] + }, + { + "ct": 5717, + "ccm": + [ + 1.76115, -0.59353, -0.16763, + -0.33521, 1.82009, -0.48488, + -0.07309, -0.42667, 1.49976 + ] + }, + { + "ct": 7600, + "ccm": + [ + 1.71087, -0.34863, -0.36223, + -0.31392, 2.24605, -0.93213, + -0.08447, -0.72208, 1.80655 + ] + } + ] + } + }, + { + "rpi.sharpen": { } + } + ] +} \ No newline at end of file diff --git a/src/ipa/rpi/vc4/data/meson.build b/src/ipa/rpi/vc4/data/meson.build index 60477c112..38ae2bd53 100644 --- a/src/ipa/rpi/vc4/data/meson.build +++ b/src/ipa/rpi/vc4/data/meson.build @@ -11,6 +11,7 @@ conf_files = files([ 'imx477.json', 'imx477_noir.json', 'imx477_scientific.json', + 'imx500.json', 'imx519.json', 'imx708.json', 'imx708_noir.json', From b76f57c6df1c68931fa8e873250c0699cc8c11a7 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 17 Oct 2024 11:52:16 +0100 Subject: [PATCH 26/46] ipa: rpi: Add imx290.json to meson.build. The file imx290.json was present in the tree, but wasn't included in meson.build and so was never installed. Add it in so that imx290/327/462 all work on Pi5. Signed-off-by: Dave Stevenson --- src/ipa/rpi/pisp/data/meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ipa/rpi/pisp/data/meson.build b/src/ipa/rpi/pisp/data/meson.build index a559f01d3..d30740c2b 100644 --- a/src/ipa/rpi/pisp/data/meson.build +++ b/src/ipa/rpi/pisp/data/meson.build @@ -3,6 +3,7 @@ conf_files = files([ 'imx219.json', 'imx219_noir.json', + 'imx290.json', 'imx296.json', 'imx296_mono.json', 'imx378.json', From 080547d543b4529130cff76769237e285ae2ef3b Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Wed, 23 Oct 2024 09:01:18 +0200 Subject: [PATCH 27/46] include: linux: Update headers for line-based embedded data support Update the kernel headers with the definition of two device-specific line-based metadata formats, and with the definition of the MEDIA_PAD_FL_INTERNAL and V4L2_SUBDEV_ROUTE_FL_IMMUTABLE flags. The new definitions will allow to support handling line-based metadata streams exposed by the sensor driver through an internal sink pad. While the changes have not yet been collected in the official linux-media tree, they're available in the 'metadata' branch of https://git.linuxtv.org/sailus/media_tree.git, at revision: 8d8fdc8a8809 ("media: Documentation: Add subdev configuration models, raw sensor model"). The patches are expected to land in Linux v6.13. Signed-off-by: Jacopo Mondi Acked-by: Kieran Bingham --- include/linux/README | 2 +- include/linux/media-bus-format.h | 4 ++++ include/linux/media.h | 1 + include/linux/v4l2-subdev.h | 5 +++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/linux/README b/include/linux/README index ef178681f..077eaba30 100644 --- a/include/linux/README +++ b/include/linux/README @@ -1,4 +1,4 @@ # SPDX-License-Identifier: CC0-1.0 -Files in this directory are imported from next-media-rkisp1-20240814-14-ga043ea54bbb9 of the Linux kernel. Do not +Files in this directory are imported from v6.12-rc1-56-g8d8fdc8a8809 of the Linux kernel. Do not modify them manually. diff --git a/include/linux/media-bus-format.h b/include/linux/media-bus-format.h index d4c1d9910..13e68c2cc 100644 --- a/include/linux/media-bus-format.h +++ b/include/linux/media-bus-format.h @@ -183,4 +183,8 @@ #define MEDIA_BUS_FMT_META_20 0x8006 #define MEDIA_BUS_FMT_META_24 0x8007 +/* Specific metadata formats. Next is 0x9003. */ +#define MEDIA_BUS_FMT_CCS_EMBEDDED 0x9001 +#define MEDIA_BUS_FMT_OV2740_EMBEDDED 0x9002 + #endif /* __LINUX_MEDIA_BUS_FORMAT_H */ diff --git a/include/linux/media.h b/include/linux/media.h index b5a77bbf4..4a733b9be 100644 --- a/include/linux/media.h +++ b/include/linux/media.h @@ -206,6 +206,7 @@ struct media_entity_desc { #define MEDIA_PAD_FL_SINK (1U << 0) #define MEDIA_PAD_FL_SOURCE (1U << 1) #define MEDIA_PAD_FL_MUST_CONNECT (1U << 2) +#define MEDIA_PAD_FL_INTERNAL (1U << 3) struct media_pad_desc { __u32 entity; /* entity ID */ diff --git a/include/linux/v4l2-subdev.h b/include/linux/v4l2-subdev.h index 2347e266c..839b1329a 100644 --- a/include/linux/v4l2-subdev.h +++ b/include/linux/v4l2-subdev.h @@ -204,6 +204,11 @@ struct v4l2_subdev_capability { * on a video node. */ #define V4L2_SUBDEV_ROUTE_FL_ACTIVE (1U << 0) +/* + * Is the route immutable? The ACTIVE flag of an immutable route may not be + * unset. + */ +#define V4L2_SUBDEV_ROUTE_FL_IMMUTABLE (1U << 1) /** * struct v4l2_subdev_route - A route inside a subdev From 65621f4f8e8663710c812458ea6fcab9d70f3e8f Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Wed, 23 Oct 2024 12:49:44 +0200 Subject: [PATCH 28/46] include: linux: videodev2: Add generic line based pixel formats Add the definition for the generic line based pixelformats. The formats has been added in upstream Linux by commit 1d9215233958 ("media: uapi: v4l: Add generic 8-bit metadata format definitions") which got merged in Linux v6.10. The formats however are not yet available to userspace, as they have been made only available to the kernel by commit d69c8429ea80 ("media: uapi: v4l: Don't expose generic metadata formats to userspace") to let the line-based metadata support stabilize before allowing applications to use it. With the forthcoming completion of the line-based metadata upstreaming manually add the generic line based pixel format to prepare libcamera to support them. Signed-off-by: Jacopo Mondi --- include/linux/videodev2.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 3829c0b60..1168f6ff4 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -840,6 +840,18 @@ struct v4l2_pix_format { /* The metadata format identifier for FE stats buffers. */ #define V4L2_META_FMT_RPI_FE_STATS v4l2_fourcc('R', 'P', 'F', 'S') +/* + * Line-based metadata formats. Remember to update v4l_fill_fmtdesc() when + * adding new ones! + */ +#define V4L2_META_FMT_GENERIC_8 v4l2_fourcc('M', 'E', 'T', '8') /* Generic 8-bit metadata */ +#define V4L2_META_FMT_GENERIC_CSI2_10 v4l2_fourcc('M', 'C', '1', 'A') /* 10-bit CSI-2 packed 8-bit metadata */ +#define V4L2_META_FMT_GENERIC_CSI2_12 v4l2_fourcc('M', 'C', '1', 'C') /* 12-bit CSI-2 packed 8-bit metadata */ +#define V4L2_META_FMT_GENERIC_CSI2_14 v4l2_fourcc('M', 'C', '1', 'E') /* 14-bit CSI-2 packed 8-bit metadata */ +#define V4L2_META_FMT_GENERIC_CSI2_16 v4l2_fourcc('M', 'C', '1', 'G') /* 16-bit CSI-2 packed 8-bit metadata */ +#define V4L2_META_FMT_GENERIC_CSI2_20 v4l2_fourcc('M', 'C', '1', 'K') /* 20-bit CSI-2 packed 8-bit metadata */ +#define V4L2_META_FMT_GENERIC_CSI2_24 v4l2_fourcc('M', 'C', '1', 'O') /* 24-bit CSI-2 packed 8-bit metadata */ + /* priv field value to indicates that subsequent fields are valid. */ #define V4L2_PIX_FMT_PRIV_MAGIC 0xfeedcafe From 54d2df6ab5d000c8c16671f7e5b603d3e0c15e85 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Thu, 24 Oct 2024 09:37:42 +0200 Subject: [PATCH 29/46] include: v4l2-controls: Re-assign V4L2_CID_USER_BCM2835_ISP_BASE V4L2_CID_USER_BCM2835_ISP_BASE is defined in RPi BSP as (V4L2_CID_USER_BASE + 0x10e0) However in mainline this address has been occupied by other control bases. Align V4L2_CID_USER_BCM2835_ISP_BASE to the last available identifier available in mainline. This commit requires kernel commit d1b7fb3b95c6 ("uapi: bcm2835-isp: Re-assign V4L2_CID_USER_BCM2835_ISP_BASE") Signed-off-by: Jacopo Mondi --- include/linux/v4l2-controls.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/v4l2-controls.h b/include/linux/v4l2-controls.h index 882a81805..20e389a00 100644 --- a/include/linux/v4l2-controls.h +++ b/include/linux/v4l2-controls.h @@ -180,7 +180,7 @@ enum v4l2_colorfx { /* The base for the bcm2835-isp driver controls. * We reserve 16 controls for this driver. */ -#define V4L2_CID_USER_BCM2835_ISP_BASE (V4L2_CID_USER_BASE + 0x10e0) +#define V4L2_CID_USER_BCM2835_ISP_BASE (V4L2_CID_USER_BASE + 0x11d0) /* * The base for Allegro driver controls. * We reserve 16 controls for this driver. From 5a87ec1fa6ad58daad29d32e8e29877af0f0c952 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Mon, 26 Feb 2024 12:53:01 +0200 Subject: [PATCH 30/46] libcamera: v4l2_subdevice: Add new metadata formats Support the newly introduced V4L2 media bus formats for metadata. This includes generic metadata formats, and two sensor-specific embedded data formats. Signed-off-by: Laurent Pinchart Reviewed-by: Jacopo Mondi Signed-off-by: Jacopo Mondi --- src/libcamera/v4l2_subdevice.cpp | 63 ++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp index 9f2ec4798..f65dd6593 100644 --- a/src/libcamera/v4l2_subdevice.cpp +++ b/src/libcamera/v4l2_subdevice.cpp @@ -700,6 +700,69 @@ const std::map mediaBusFormatInfo{ .bitsPerPixel = 0, .colourEncoding = PixelFormatInfo::ColourEncodingRAW, } }, + { MEDIA_BUS_FMT_META_8, { + .name = "META_8", + .code = MEDIA_BUS_FMT_META_8, + .type = MediaBusFormatInfo::Type::Metadata, + .bitsPerPixel = 8, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + } }, + { MEDIA_BUS_FMT_META_10, { + .name = "META_10", + .code = MEDIA_BUS_FMT_META_10, + .type = MediaBusFormatInfo::Type::Metadata, + .bitsPerPixel = 10, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + } }, + { MEDIA_BUS_FMT_META_12, { + .name = "META_12", + .code = MEDIA_BUS_FMT_META_12, + .type = MediaBusFormatInfo::Type::Metadata, + .bitsPerPixel = 12, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + } }, + { MEDIA_BUS_FMT_META_14, { + .name = "META_14", + .code = MEDIA_BUS_FMT_META_14, + .type = MediaBusFormatInfo::Type::Metadata, + .bitsPerPixel = 14, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + } }, + { MEDIA_BUS_FMT_META_16, { + .name = "META_16", + .code = MEDIA_BUS_FMT_META_16, + .type = MediaBusFormatInfo::Type::Metadata, + .bitsPerPixel = 16, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + } }, + { MEDIA_BUS_FMT_META_20, { + .name = "META_20", + .code = MEDIA_BUS_FMT_META_20, + .type = MediaBusFormatInfo::Type::Metadata, + .bitsPerPixel = 20, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + } }, + { MEDIA_BUS_FMT_META_24, { + .name = "META_24", + .code = MEDIA_BUS_FMT_META_24, + .type = MediaBusFormatInfo::Type::Metadata, + .bitsPerPixel = 24, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + } }, + { MEDIA_BUS_FMT_CCS_EMBEDDED, { + .name = "CCS_EMBEDDED", + .code = MEDIA_BUS_FMT_CCS_EMBEDDED, + .type = MediaBusFormatInfo::Type::EmbeddedData, + .bitsPerPixel = 0, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + } }, + { MEDIA_BUS_FMT_OV2740_EMBEDDED, { + .name = "OV2740_EMBEDDED", + .code = MEDIA_BUS_FMT_CCS_EMBEDDED, + .type = MediaBusFormatInfo::Type::EmbeddedData, + .bitsPerPixel = 0, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + } }, }; } /* namespace */ From 8679b2f99cf3e448db0522a2e2fab47dc1b6a036 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 1 Mar 2024 18:43:27 +0200 Subject: [PATCH 31/46] libcamera: v4l2_videodevice: Update to the new kernel metadata API With support for metadata in the streams API, the v4l2_meta_format structure has been extended with width, height and bytesperline fields. Support them in the V4L2VideoDevice getFormat() and setFormat() functions is the video device is meta capture device and if the pixel format is one of the generic line-based metadata formats. Signed-off-by: Laurent Pinchart Reviewed-by: Jacopo Mondi Signed-off-by: Jacopo Mondi --- Compared to Larent's first version, this one sets width, height and bytesperline only if the device isMetaCap() and the V4L2 pixel format is one of the generic line based ones. Signed-off-by: Jacopo Mondi --- include/libcamera/internal/v4l2_pixelformat.h | 2 + src/libcamera/v4l2_pixelformat.cpp | 34 +++++++++++++ src/libcamera/v4l2_videodevice.cpp | 51 ++++++++++++++----- 3 files changed, 73 insertions(+), 14 deletions(-) diff --git a/include/libcamera/internal/v4l2_pixelformat.h b/include/libcamera/internal/v4l2_pixelformat.h index c836346bd..543eb21b3 100644 --- a/include/libcamera/internal/v4l2_pixelformat.h +++ b/include/libcamera/internal/v4l2_pixelformat.h @@ -49,6 +49,8 @@ class V4L2PixelFormat static const std::vector & fromPixelFormat(const PixelFormat &pixelFormat); + bool isGenericLineBasedMetadata() const; + private: uint32_t fourcc_; }; diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp index eb9ac2224..e8b3eb9c1 100644 --- a/src/libcamera/v4l2_pixelformat.cpp +++ b/src/libcamera/v4l2_pixelformat.cpp @@ -372,6 +372,40 @@ V4L2PixelFormat::fromPixelFormat(const PixelFormat &pixelFormat) return info.v4l2Formats; } +/** + * \brief Test if a V4L2PixelFormat is one of the line based generic metadata + * formats + * + * A limited number of metadata formats, the ones that represents generic + * line-based metadata buffers, need to have their width, height and + * bytesperline set by userspace. + * + * This function tests if the current V4L2PixelFormat is one of those. + * + * Note: It would have been nicer to store this information in a + * V4L2PixelFormat::Info instance, but as metadata format are not exposed to + * applications, there are no PixelFormat and DRM fourcc codes associated to + * them. + * + * \return True if the V4L2PixelFormat() is a generic line based format, false + * otherwise + */ +bool V4L2PixelFormat::isGenericLineBasedMetadata() const +{ + switch (fourcc_) { + case V4L2_META_FMT_GENERIC_8: + case V4L2_META_FMT_GENERIC_CSI2_10: + case V4L2_META_FMT_GENERIC_CSI2_12: + case V4L2_META_FMT_GENERIC_CSI2_14: + case V4L2_META_FMT_GENERIC_CSI2_16: + case V4L2_META_FMT_GENERIC_CSI2_20: + case V4L2_META_FMT_GENERIC_CSI2_24: + return true; + default: + return false; + } +} + /** * \brief Insert a text representation of a V4L2PixelFormat into an output * stream diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp index 833527aa9..7429801bb 100644 --- a/src/libcamera/v4l2_videodevice.cpp +++ b/src/libcamera/v4l2_videodevice.cpp @@ -888,7 +888,7 @@ int V4L2VideoDevice::setFormat(V4L2DeviceFormat *format) int V4L2VideoDevice::getFormatMeta(V4L2DeviceFormat *format) { struct v4l2_format v4l2Format = {}; - struct v4l2_meta_format *pix = &v4l2Format.fmt.meta; + struct v4l2_meta_format *meta = &v4l2Format.fmt.meta; int ret; v4l2Format.type = bufferType_; @@ -898,25 +898,42 @@ int V4L2VideoDevice::getFormatMeta(V4L2DeviceFormat *format) return ret; } - format->size.width = 0; - format->size.height = 0; - format->fourcc = V4L2PixelFormat(pix->dataformat); + format->fourcc = V4L2PixelFormat(meta->dataformat); + format->planes[0].size = meta->buffersize; format->planesCount = 1; - format->planes[0].bpl = pix->buffersize; - format->planes[0].size = pix->buffersize; + + bool genericLineBased = caps_.isMetaCapture() && + format->fourcc.isGenericLineBasedMetadata(); + + if (genericLineBased) { + format->size.width = meta->width; + format->size.height = meta->height; + format->planes[0].bpl = meta->bytesperline; + } else { + format->size.width = 0; + format->size.height = 0; + format->planes[0].bpl = meta->buffersize; + } return 0; } int V4L2VideoDevice::trySetFormatMeta(V4L2DeviceFormat *format, bool set) { + bool genericLineBased = caps_.isMetaCapture() && + format->fourcc.isGenericLineBasedMetadata(); struct v4l2_format v4l2Format = {}; - struct v4l2_meta_format *pix = &v4l2Format.fmt.meta; + struct v4l2_meta_format *meta = &v4l2Format.fmt.meta; int ret; v4l2Format.type = bufferType_; - pix->dataformat = format->fourcc; - pix->buffersize = format->planes[0].size; + meta->dataformat = format->fourcc; + meta->buffersize = format->planes[0].size; + if (genericLineBased) { + meta->width = format->size.width; + meta->height = format->size.height; + meta->bytesperline = format->planes[0].bpl; + } ret = ioctl(set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT, &v4l2Format); if (ret) { LOG(V4L2, Error) @@ -929,12 +946,18 @@ int V4L2VideoDevice::trySetFormatMeta(V4L2DeviceFormat *format, bool set) * Return to caller the format actually applied on the video device, * which might differ from the requested one. */ - format->size.width = 0; - format->size.height = 0; - format->fourcc = V4L2PixelFormat(pix->dataformat); + format->fourcc = V4L2PixelFormat(meta->dataformat); format->planesCount = 1; - format->planes[0].bpl = pix->buffersize; - format->planes[0].size = pix->buffersize; + format->planes[0].size = meta->buffersize; + if (genericLineBased) { + format->size.width = meta->width; + format->size.height = meta->height; + format->planes[0].bpl = meta->bytesperline; + } else { + format->size.width = 0; + format->size.height = 0; + format->planes[0].bpl = meta->buffersize; + } return 0; } From cfcebaacc4cd9f76dc5e75d8e84d9cb5d71f81ee Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Tue, 17 Dec 2019 12:47:51 +0100 Subject: [PATCH 32/46] libcamera: camera_sensor: Introduce CameraSensorFactory Introduce a factory to create CameraSensor derived classes instances by inspecting the sensor media entity name and provide a convenience macro to register specialized sensor handlers. Signed-off-by: Jacopo Mondi Signed-off-by: Laurent Pinchart Reviewed-by: Stefan Klug --- include/libcamera/internal/camera_sensor.h | 48 +++++- src/libcamera/pipeline/imx8-isi/imx8-isi.cpp | 9 +- src/libcamera/pipeline/ipu3/cio2.cpp | 7 +- src/libcamera/pipeline/mali-c55/mali-c55.cpp | 5 +- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 7 +- .../pipeline/rpi/common/pipeline_base.cpp | 5 +- src/libcamera/pipeline/simple/simple.cpp | 9 +- src/libcamera/pipeline/vimc/vimc.cpp | 7 +- src/libcamera/sensor/camera_sensor.cpp | 162 ++++++++++++++++++ test/camera-sensor.cpp | 7 +- .../v4l2_videodevice_test.cpp | 5 +- test/v4l2_videodevice/v4l2_videodevice_test.h | 2 +- 12 files changed, 233 insertions(+), 40 deletions(-) diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index a42c15fa3..2d6cb697a 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -38,7 +38,6 @@ enum class Orientation; class CameraSensor : protected Loggable { public: - explicit CameraSensor(const MediaEntity *entity); ~CameraSensor(); int init(); @@ -81,6 +80,7 @@ class CameraSensor : protected Loggable int setTestPatternMode(controls::draft::TestPatternModeEnum mode); protected: + explicit CameraSensor(const MediaEntity *entity); std::string logPrefix() const override; private: @@ -122,4 +122,50 @@ class CameraSensor : protected Loggable std::unique_ptr focusLens_; }; +class CameraSensorFactoryBase +{ +public: + CameraSensorFactoryBase(); + virtual ~CameraSensorFactoryBase() = default; + + static std::unique_ptr create(MediaEntity *entity); + +private: + LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorFactoryBase) + + static std::vector &factories(); + + static void registerFactory(CameraSensorFactoryBase *factory); + + virtual bool match(const MediaEntity *entity) const = 0; + + virtual std::unique_ptr + createInstance(MediaEntity *entity) const = 0; +}; + +template +class CameraSensorFactory final : public CameraSensorFactoryBase +{ +public: + CameraSensorFactory() + : CameraSensorFactoryBase() + { + } + +private: + bool match(const MediaEntity *entity) const override + { + return _CameraSensor::match(entity); + } + + std::unique_ptr + createInstance(MediaEntity *entity) const override + { + return _CameraSensor::create(entity); + } +}; + +#define REGISTER_CAMERA_SENSOR(sensor) \ +static CameraSensorFactory global_##sensor##Factory{}; + } /* namespace libcamera */ diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp index 72aa6c756..4e66b3368 100644 --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp @@ -157,11 +157,10 @@ PipelineHandlerISI *ISICameraData::pipe() /* Open and initialize pipe components. */ int ISICameraData::init() { - int ret = sensor_->init(); - if (ret) - return ret; + if (!sensor_) + return -ENODEV; - ret = csis_->open(); + int ret = csis_->open(); if (ret) return ret; @@ -1057,7 +1056,7 @@ bool PipelineHandlerISI::match(DeviceEnumerator *enumerator) std::unique_ptr data = std::make_unique(this); - data->sensor_ = std::make_unique(sensor); + data->sensor_ = CameraSensorFactoryBase::create(sensor); data->csis_ = std::make_unique(csi); data->xbarSink_ = sink; diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp index 81a7a8ab0..9afcce93a 100644 --- a/src/libcamera/pipeline/ipu3/cio2.cpp +++ b/src/libcamera/pipeline/ipu3/cio2.cpp @@ -134,10 +134,9 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index) MediaLink *link = links[0]; MediaEntity *sensorEntity = link->source()->entity(); - sensor_ = std::make_unique(sensorEntity); - ret = sensor_->init(); - if (ret) - return ret; + sensor_ = CameraSensorFactoryBase::create(sensorEntity); + if (!sensor_) + return -ENODEV; ret = link->setEnabled(true); if (ret) diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp index 45c71c1dd..4b71e0dad 100644 --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp @@ -141,9 +141,8 @@ int MaliC55CameraData::init() * Register a CameraSensor if we connect to a sensor and create * an entity for the connected CSI-2 receiver. */ - sensor_ = std::make_unique(entity_); - ret = sensor_->init(); - if (ret) + sensor_ = CameraSensorFactoryBase::create(entity_); + if (!sensor_) return ret; const MediaPad *sourcePad = entity_->getPadByIndex(0); diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index c02c7cf37..6b2e21f57 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -1094,10 +1094,9 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) std::make_unique(this, &mainPath_, hasSelfPath_ ? &selfPath_ : nullptr); - data->sensor_ = std::make_unique(sensor); - ret = data->sensor_->init(); - if (ret) - return ret; + data->sensor_ = CameraSensorFactoryBase::create(sensor); + if (!data->sensor_) + return -ENODEV; /* Initialize the camera properties. */ data->properties_ = data->sensor_->properties(); diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index dbfb6a33d..d360c145d 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -796,13 +796,10 @@ int PipelineHandlerBase::registerCamera(std::unique_ptr &camera CameraData *data = cameraData.get(); int ret; - data->sensor_ = std::make_unique(sensorEntity); + data->sensor_ = CameraSensorFactoryBase::create(sensorEntity); if (!data->sensor_) return -EINVAL; - if (data->sensor_->init()) - return -EINVAL; - /* Populate the map of sensor supported formats and sizes. */ for (auto const mbusCode : data->sensor_->mbusCodes()) data->sensorFormats_.emplace(mbusCode, diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 81915573b..ccefb2a04 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -384,8 +384,6 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe, MediaEntity *sensor) : Camera::Private(pipe), streams_(numStreams) { - int ret; - /* * Find the shortest path from the camera sensor to a video capture * device using the breadth-first search algorithm. This heuristic will @@ -476,12 +474,9 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe, } /* Finally also remember the sensor. */ - sensor_ = std::make_unique(sensor); - ret = sensor_->init(); - if (ret) { - sensor_.reset(); + sensor_ = CameraSensorFactoryBase::create(sensor); + if (!sensor_) return; - } LOG(SimplePipeline, Debug) << "Found pipeline: " diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 325174b90..b12cec5d7 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -532,10 +532,9 @@ int VimcCameraData::init() return ret; /* Create and open the camera sensor, debayer, scaler and video device. */ - sensor_ = std::make_unique(media_->getEntityByName("Sensor B")); - ret = sensor_->init(); - if (ret) - return ret; + sensor_ = CameraSensorFactoryBase::create(media_->getEntityByName("Sensor B")); + if (!sensor_) + return -ENODEV; debayer_ = V4L2Subdevice::fromEntityName(media_, "Debayer B"); if (debayer_->open()) diff --git a/src/libcamera/sensor/camera_sensor.cpp b/src/libcamera/sensor/camera_sensor.cpp index 4a990bb99..cc83c3c6d 100644 --- a/src/libcamera/sensor/camera_sensor.cpp +++ b/src/libcamera/sensor/camera_sensor.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -1202,4 +1203,165 @@ std::string CameraSensor::logPrefix() const return "'" + entity_->name() + "'"; } +namespace { + +/* Transitory default camera sensor implementation */ +class CameraSensorDefault : public CameraSensor +{ +public: + CameraSensorDefault(MediaEntity *entity) + : CameraSensor(entity) + { + } + + static bool match([[maybe_unused]] const MediaEntity *entity) + { + return true; + } + + static std::unique_ptr create(MediaEntity *entity) + { + std::unique_ptr sensor = + std::make_unique(entity); + + if (sensor->init()) + return nullptr; + + return sensor; + } +}; + +REGISTER_CAMERA_SENSOR(CameraSensorDefault) + +}; /* namespace */ + +/** + * \class CameraSensorFactoryBase + * \brief Base class for camera sensor factories + * + * The CameraSensorFactoryBase class is the base of all specializations of + * the CameraSensorFactory class template. It implements the factory + * registration, maintains a registry of factories, and provides access to the + * registered factories. + */ + +/** + * \brief Construct a camera sensor factory base + * + * Creating an instance of the factory base registers it with the global list of + * factories, accessible through the factories() function. + */ +CameraSensorFactoryBase::CameraSensorFactoryBase() +{ + registerFactory(this); +} + +/** + * \brief Create an instance of the CameraSensor corresponding to a media entity + * \param[in] entity The media entity on the source end of the sensor + * + * \return A unique pointer to a new instance of the CameraSensor subclass + * matching the entity, or a null pointer if no such factory exists + */ +std::unique_ptr CameraSensorFactoryBase::create(MediaEntity *entity) +{ + const std::vector &factories = + CameraSensorFactoryBase::factories(); + + for (const CameraSensorFactoryBase *factory : factories) { + if (!factory->match(entity)) + continue; + + std::unique_ptr sensor = factory->createInstance(entity); + if (!sensor) { + LOG(CameraSensor, Error) + << "Failed to create sensor for '" + << entity->name(); + return nullptr; + } + + return sensor; + } + + return nullptr; +} + +/** + * \brief Retrieve the list of all camera sensor factories + * \return The list of camera sensor factories + */ +std::vector &CameraSensorFactoryBase::factories() +{ + /* + * The static factories map is defined inside the function to ensure + * it gets initialized on first use, without any dependency on link + * order. + */ + static std::vector factories; + return factories; +} + +/** + * \brief Add a camera sensor class to the registry + * \param[in] factory Factory to use to construct the camera sensor + */ +void CameraSensorFactoryBase::registerFactory(CameraSensorFactoryBase *factory) +{ + std::vector &factories = + CameraSensorFactoryBase::factories(); + + factories.push_back(factory); +} + +/** + * \class CameraSensorFactory + * \brief Registration of CameraSensorFactory classes and creation of instances + * \tparam _CameraSensor The camera sensor class type for this factory + * + * To facilitate discovery and instantiation of CameraSensor classes, the + * CameraSensorFactory class implements auto-registration of camera sensors. + * Each CameraSensor subclass shall register itself using the + * REGISTER_CAMERA_SENSOR() macro, which will create a corresponding instance + * of a CameraSensorFactory subclass and register it with the static list of + * factories. + */ + +/** + * \fn CameraSensorFactory::CameraSensorFactory() + * \brief Construct a camera sensor factory + * + * Creating an instance of the factory registers it with the global list of + * factories, accessible through the CameraSensorFactoryBase::factories() + * function. + */ + +/** + * \fn CameraSensorFactory::createInstance() const + * \brief Create an instance of the CameraSensor corresponding to the factory + * + * \return A unique pointer to a newly constructed instance of the CameraSensor + * subclass corresponding to the factory + */ + +/** + * \def REGISTER_CAMERA_SENSOR(sensor) + * \brief Register a camera sensor type to the sensor factory + * \param[in] sensor Class name of the CameraSensor derived class to register + * + * Register a CameraSensor subclass with the factory and make it available to + * try and match sensors. The subclass needs to implement two static functions: + * + * \code{.cpp} + * static bool match(const MediaEntity *entity); + * static std::unique_ptr create(MediaEntity *entity); + * \endcode + * + * The match() function tests if the sensor class supports the camera sensor + * identified by a MediaEntity. + * + * The create() function creates a new instance of the sensor class. It may + * return a null pointer if initialization of the instance fails. It will only + * be called if the match() function has returned true for the given entity. + */ + } /* namespace libcamera */ diff --git a/test/camera-sensor.cpp b/test/camera-sensor.cpp index 1d402c433..869c78896 100644 --- a/test/camera-sensor.cpp +++ b/test/camera-sensor.cpp @@ -52,8 +52,8 @@ class CameraSensorTest : public Test return TestFail; } - sensor_ = new CameraSensor(entity); - if (sensor_->init() < 0) { + sensor_ = CameraSensorFactoryBase::create(entity); + if (!sensor_) { cerr << "Unable to initialise camera sensor" << endl; return TestFail; } @@ -118,13 +118,12 @@ class CameraSensorTest : public Test void cleanup() { - delete sensor_; } private: std::unique_ptr enumerator_; std::shared_ptr media_; - CameraSensor *sensor_; + std::unique_ptr sensor_; CameraLens *lens_; }; diff --git a/test/v4l2_videodevice/v4l2_videodevice_test.cpp b/test/v4l2_videodevice/v4l2_videodevice_test.cpp index 1113cf5bf..9fbd24cc9 100644 --- a/test/v4l2_videodevice/v4l2_videodevice_test.cpp +++ b/test/v4l2_videodevice/v4l2_videodevice_test.cpp @@ -64,8 +64,8 @@ int V4L2VideoDeviceTest::init() format.size.height = 480; if (driver_ == "vimc") { - sensor_ = new CameraSensor(media_->getEntityByName("Sensor A")); - if (sensor_->init()) + sensor_ = CameraSensorFactoryBase::create(media_->getEntityByName("Sensor A")); + if (!sensor_) return TestFail; debayer_ = new V4L2Subdevice(media_->getEntityByName("Debayer A")); @@ -98,6 +98,5 @@ void V4L2VideoDeviceTest::cleanup() capture_->close(); delete debayer_; - delete sensor_; delete capture_; } diff --git a/test/v4l2_videodevice/v4l2_videodevice_test.h b/test/v4l2_videodevice/v4l2_videodevice_test.h index b5871ce69..7c9003ec4 100644 --- a/test/v4l2_videodevice/v4l2_videodevice_test.h +++ b/test/v4l2_videodevice/v4l2_videodevice_test.h @@ -36,7 +36,7 @@ class V4L2VideoDeviceTest : public Test std::string entity_; std::unique_ptr enumerator_; std::shared_ptr media_; - libcamera::CameraSensor *sensor_; + std::unique_ptr sensor_; libcamera::V4L2Subdevice *debayer_; libcamera::V4L2VideoDevice *capture_; std::vector> buffers_; From f6cc2df154dcbe24879febcf4f037c00deb49556 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sun, 4 Feb 2024 17:55:31 +0200 Subject: [PATCH 33/46] libcamera: camera_sensor: Create abstract base class With a camera sensor factory in place, the next step is to create an abstract base class that all camera sensors implement, providing a uniform API to pipeline handler. Turn all public functions of the CameraSensor class into pure virtual functions, and move the implementation to the CameraSensorLegacy class. Part of the code is likely worth keeping as common helpers in a base class. However, to follow the principle of not designing helpers with a single user, this commit moves the whole implementation. Common helpers will be introduced later, along with other CameraSensor subclasses. Signed-off-by: Laurent Pinchart Reviewed-by: Stefan Klug Reviewed-by: Jacopo Mondi Signed-off-by: Jacopo Mondi --- Documentation/Doxyfile-internal.in | 1 + include/libcamera/internal/camera_sensor.h | 136 +-- src/libcamera/sensor/camera_sensor.cpp | 993 +--------------- src/libcamera/sensor/camera_sensor_legacy.cpp | 1015 +++++++++++++++++ src/libcamera/sensor/meson.build | 1 + 5 files changed, 1110 insertions(+), 1036 deletions(-) create mode 100644 src/libcamera/sensor/camera_sensor_legacy.cpp diff --git a/Documentation/Doxyfile-internal.in b/Documentation/Doxyfile-internal.in index cf9825537..b5ad7e7ff 100644 --- a/Documentation/Doxyfile-internal.in +++ b/Documentation/Doxyfile-internal.in @@ -25,6 +25,7 @@ EXCLUDE = @TOP_SRCDIR@/include/libcamera/base/span.h \ @TOP_SRCDIR@/src/libcamera/device_enumerator_udev.cpp \ @TOP_SRCDIR@/src/libcamera/ipc_pipe_unixsocket.cpp \ @TOP_SRCDIR@/src/libcamera/pipeline/ \ + @TOP_SRCDIR@/src/libcamera/sensor/camera_sensor_legacy.cpp \ @TOP_SRCDIR@/src/libcamera/tracepoints.cpp \ @TOP_BUILDDIR@/include/libcamera/internal/tracepoints.h \ @TOP_BUILDDIR@/include/libcamera/ipa/soft_ipa_interface.h \ diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index 2d6cb697a..7713aea02 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -9,10 +9,10 @@ #include #include +#include #include #include -#include #include #include @@ -20,8 +20,6 @@ #include #include -#include - #include "libcamera/internal/bayer_format.h" #include "libcamera/internal/v4l2_subdevice.h" @@ -31,105 +29,62 @@ class CameraLens; class MediaEntity; class SensorConfiguration; -struct CameraSensorProperties; - enum class Orientation; -class CameraSensor : protected Loggable +struct IPACameraSensorInfo; + +class CameraSensor { public: - ~CameraSensor(); - - int init(); + virtual ~CameraSensor(); - const std::string &model() const { return model_; } - const std::string &id() const { return id_; } + virtual const std::string &model() const = 0; + virtual const std::string &id() const = 0; - const MediaEntity *entity() const { return entity_; } - V4L2Subdevice *device() { return subdev_.get(); } + virtual const MediaEntity *entity() const = 0; + virtual V4L2Subdevice *device() = 0; - CameraLens *focusLens() { return focusLens_.get(); } + virtual CameraLens *focusLens() = 0; - const std::vector &mbusCodes() const { return mbusCodes_; } - std::vector sizes(unsigned int mbusCode) const; - Size resolution() const; + virtual const std::vector &mbusCodes() const = 0; + virtual std::vector sizes(unsigned int mbusCode) const = 0; + virtual Size resolution() const = 0; - V4L2SubdeviceFormat getFormat(const std::vector &mbusCodes, - const Size &size) const; - int setFormat(V4L2SubdeviceFormat *format, - Transform transform = Transform::Identity); - int tryFormat(V4L2SubdeviceFormat *format) const; + virtual V4L2SubdeviceFormat + getFormat(const std::vector &mbusCodes, + const Size &size) const = 0; + virtual int setFormat(V4L2SubdeviceFormat *format, + Transform transform = Transform::Identity) = 0; + virtual int tryFormat(V4L2SubdeviceFormat *format) const = 0; - int applyConfiguration(const SensorConfiguration &config, - Transform transform = Transform::Identity, - V4L2SubdeviceFormat *sensorFormat = nullptr); + virtual int applyConfiguration(const SensorConfiguration &config, + Transform transform = Transform::Identity, + V4L2SubdeviceFormat *sensorFormat = nullptr) = 0; - const ControlList &properties() const { return properties_; } - int sensorInfo(IPACameraSensorInfo *info) const; - Transform computeTransform(Orientation *orientation) const; - BayerFormat::Order bayerOrder(Transform t) const; + virtual const ControlList &properties() const = 0; + virtual int sensorInfo(IPACameraSensorInfo *info) const = 0; + virtual Transform computeTransform(Orientation *orientation) const = 0; + virtual BayerFormat::Order bayerOrder(Transform t) const = 0; - const ControlInfoMap &controls() const; - ControlList getControls(const std::vector &ids); - int setControls(ControlList *ctrls); - - const std::vector &testPatternModes() const - { - return testPatternModes_; - } - int setTestPatternMode(controls::draft::TestPatternModeEnum mode); + virtual const ControlInfoMap &controls() const = 0; + virtual ControlList getControls(const std::vector &ids) = 0; + virtual int setControls(ControlList *ctrls) = 0; -protected: - explicit CameraSensor(const MediaEntity *entity); - std::string logPrefix() const override; - -private: - LIBCAMERA_DISABLE_COPY(CameraSensor) - - int generateId(); - int validateSensorDriver(); - void initVimcDefaultProperties(); - void initStaticProperties(); - void initTestPatternModes(); - int initProperties(); - int discoverAncillaryDevices(); - int applyTestPatternMode(controls::draft::TestPatternModeEnum mode); - - const MediaEntity *entity_; - std::unique_ptr subdev_; - unsigned int pad_; - - const CameraSensorProperties *staticProps_; - - std::string model_; - std::string id_; - - V4L2Subdevice::Formats formats_; - std::vector mbusCodes_; - std::vector sizes_; - std::vector testPatternModes_; - controls::draft::TestPatternModeEnum testPatternMode_; - - Size pixelArraySize_; - Rectangle activeArea_; - const BayerFormat *bayerFormat_; - bool supportFlips_; - bool flipsAlterBayerOrder_; - Orientation mountingOrientation_; - - ControlList properties_; - - std::unique_ptr focusLens_; + virtual const std::vector & + testPatternModes() const = 0; + virtual int setTestPatternMode(controls::draft::TestPatternModeEnum mode) = 0; }; class CameraSensorFactoryBase { public: - CameraSensorFactoryBase(); + CameraSensorFactoryBase(const char *name); virtual ~CameraSensorFactoryBase() = default; static std::unique_ptr create(MediaEntity *entity); + const std::string &name() const { return name_; } + private: LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorFactoryBase) @@ -137,35 +92,30 @@ class CameraSensorFactoryBase static void registerFactory(CameraSensorFactoryBase *factory); - virtual bool match(const MediaEntity *entity) const = 0; + virtual std::variant, int> + match(MediaEntity *entity) const = 0; - virtual std::unique_ptr - createInstance(MediaEntity *entity) const = 0; + std::string name_; }; template class CameraSensorFactory final : public CameraSensorFactoryBase { public: - CameraSensorFactory() - : CameraSensorFactoryBase() + CameraSensorFactory(const char *name) + : CameraSensorFactoryBase(name) { } private: - bool match(const MediaEntity *entity) const override + std::variant, int> + match(MediaEntity *entity) const override { return _CameraSensor::match(entity); } - - std::unique_ptr - createInstance(MediaEntity *entity) const override - { - return _CameraSensor::create(entity); - } }; #define REGISTER_CAMERA_SENSOR(sensor) \ -static CameraSensorFactory global_##sensor##Factory{}; +static CameraSensorFactory global_##sensor##Factory{ #sensor }; } /* namespace libcamera */ diff --git a/src/libcamera/sensor/camera_sensor.cpp b/src/libcamera/sensor/camera_sensor.cpp index cc83c3c6d..951ebd2cc 100644 --- a/src/libcamera/sensor/camera_sensor.cpp +++ b/src/libcamera/sensor/camera_sensor.cpp @@ -7,24 +7,12 @@ #include "libcamera/internal/camera_sensor.h" -#include -#include -#include -#include -#include -#include +#include +#include -#include +#include -#include -#include -#include - -#include "libcamera/internal/bayer_format.h" -#include "libcamera/internal/camera_lens.h" -#include "libcamera/internal/camera_sensor_properties.h" -#include "libcamera/internal/media_device.h" -#include "libcamera/internal/sysfs.h" +#include "libcamera/internal/media_object.h" /** * \file camera_sensor.h @@ -37,537 +25,16 @@ LOG_DEFINE_CATEGORY(CameraSensor) /** * \class CameraSensor - * \brief A camera sensor based on V4L2 subdevices + * \brief A abstract camera sensor * * The CameraSensor class eases handling of sensors for pipeline handlers by - * hiding the details of the V4L2 subdevice kernel API and caching sensor - * information. - * - * The implementation is currently limited to sensors that expose a single V4L2 - * subdevice with a single pad. It will be extended to support more complex - * devices as the needs arise. - */ - -/** - * \brief Construct a CameraSensor - * \param[in] entity The media entity backing the camera sensor - * - * Once constructed the instance must be initialized with init(). + * hiding the details of the kernel API and caching sensor information. */ -CameraSensor::CameraSensor(const MediaEntity *entity) - : entity_(entity), pad_(UINT_MAX), staticProps_(nullptr), - bayerFormat_(nullptr), supportFlips_(false), - flipsAlterBayerOrder_(false), properties_(properties::properties) -{ -} /** * \brief Destroy a CameraSensor */ -CameraSensor::~CameraSensor() -{ -} - -/** - * \brief Initialize the camera sensor instance - * - * This function performs the initialisation steps of the CameraSensor that may - * fail. It shall be called once and only once after constructing the instance. - * - * \return 0 on success or a negative error code otherwise - */ -int CameraSensor::init() -{ - for (const MediaPad *pad : entity_->pads()) { - if (pad->flags() & MEDIA_PAD_FL_SOURCE) { - pad_ = pad->index(); - break; - } - } - - if (pad_ == UINT_MAX) { - LOG(CameraSensor, Error) - << "Sensors with more than one pad are not supported"; - return -EINVAL; - } - - switch (entity_->function()) { - case MEDIA_ENT_F_CAM_SENSOR: - case MEDIA_ENT_F_PROC_VIDEO_ISP: - break; - - default: - LOG(CameraSensor, Error) - << "Invalid sensor function " - << utils::hex(entity_->function()); - return -EINVAL; - } - - /* Create and open the subdev. */ - subdev_ = std::make_unique(entity_); - int ret = subdev_->open(); - if (ret < 0) - return ret; - - /* - * Clear any flips to be sure we get the "native" Bayer order. This is - * harmless for sensors where the flips don't affect the Bayer order. - */ - ControlList ctrls(subdev_->controls()); - if (subdev_->controls().find(V4L2_CID_HFLIP) != subdev_->controls().end()) - ctrls.set(V4L2_CID_HFLIP, 0); - if (subdev_->controls().find(V4L2_CID_VFLIP) != subdev_->controls().end()) - ctrls.set(V4L2_CID_VFLIP, 0); - subdev_->setControls(&ctrls); - - /* Enumerate, sort and cache media bus codes and sizes. */ - formats_ = subdev_->formats(pad_); - if (formats_.empty()) { - LOG(CameraSensor, Error) << "No image format found"; - return -EINVAL; - } - - mbusCodes_ = utils::map_keys(formats_); - std::sort(mbusCodes_.begin(), mbusCodes_.end()); - - for (const auto &format : formats_) { - const std::vector &ranges = format.second; - std::transform(ranges.begin(), ranges.end(), std::back_inserter(sizes_), - [](const SizeRange &range) { return range.max; }); - } - - std::sort(sizes_.begin(), sizes_.end()); - - /* Remove duplicates. */ - auto last = std::unique(sizes_.begin(), sizes_.end()); - sizes_.erase(last, sizes_.end()); - - /* - * VIMC is a bit special, as it does not yet support all the mandatory - * requirements regular sensors have to respect. - * - * Do not validate the driver if it's VIMC and initialize the sensor - * properties with static information. - * - * \todo Remove the special case once the VIMC driver has been - * updated in all test platforms. - */ - if (entity_->device()->driver() == "vimc") { - initVimcDefaultProperties(); - - ret = initProperties(); - if (ret) - return ret; - - return discoverAncillaryDevices(); - } - - /* Get the color filter array pattern (only for RAW sensors). */ - for (unsigned int mbusCode : mbusCodes_) { - const BayerFormat &bayerFormat = BayerFormat::fromMbusCode(mbusCode); - if (bayerFormat.isValid()) { - bayerFormat_ = &bayerFormat; - break; - } - } - - ret = validateSensorDriver(); - if (ret) - return ret; - - ret = initProperties(); - if (ret) - return ret; - - ret = discoverAncillaryDevices(); - if (ret) - return ret; - - /* - * Set HBLANK to the minimum to start with a well-defined line length, - * allowing IPA modules that do not modify HBLANK to use the sensor - * minimum line length in their calculations. - */ - const struct v4l2_query_ext_ctrl *hblankInfo = subdev_->controlInfo(V4L2_CID_HBLANK); - if (hblankInfo && !(hblankInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) { - ControlList ctrl(subdev_->controls()); - - ctrl.set(V4L2_CID_HBLANK, static_cast(hblankInfo->minimum)); - ret = subdev_->setControls(&ctrl); - if (ret) - return ret; - } - - return applyTestPatternMode(controls::draft::TestPatternModeEnum::TestPatternModeOff); -} - -int CameraSensor::generateId() -{ - const std::string devPath = subdev_->devicePath(); - - /* Try to get ID from firmware description. */ - id_ = sysfs::firmwareNodePath(devPath); - if (!id_.empty()) - return 0; - - /* - * Virtual sensors not described in firmware - * - * Verify it's a platform device and construct ID from the device path - * and model of sensor. - */ - if (devPath.find("/sys/devices/platform/", 0) == 0) { - id_ = devPath.substr(strlen("/sys/devices/")) + " " + model(); - return 0; - } - - LOG(CameraSensor, Error) << "Can't generate sensor ID"; - return -EINVAL; -} - -int CameraSensor::validateSensorDriver() -{ - int err = 0; - - /* - * Optional controls are used to register optional sensor properties. If - * not present, some values will be defaulted. - */ - static constexpr uint32_t optionalControls[] = { - V4L2_CID_CAMERA_SENSOR_ROTATION, - }; - - const ControlIdMap &controls = subdev_->controls().idmap(); - for (uint32_t ctrl : optionalControls) { - if (!controls.count(ctrl)) - LOG(CameraSensor, Debug) - << "Optional V4L2 control " << utils::hex(ctrl) - << " not supported"; - } - - /* - * Recommended controls are similar to optional controls, but will - * become mandatory in the near future. Be loud if they're missing. - */ - static constexpr uint32_t recommendedControls[] = { - V4L2_CID_CAMERA_ORIENTATION, - }; - - for (uint32_t ctrl : recommendedControls) { - if (!controls.count(ctrl)) { - LOG(CameraSensor, Warning) - << "Recommended V4L2 control " << utils::hex(ctrl) - << " not supported"; - err = -EINVAL; - } - } - - /* - * Verify if sensor supports horizontal/vertical flips - * - * \todo Handle horizontal and vertical flips independently. - */ - const struct v4l2_query_ext_ctrl *hflipInfo = subdev_->controlInfo(V4L2_CID_HFLIP); - const struct v4l2_query_ext_ctrl *vflipInfo = subdev_->controlInfo(V4L2_CID_VFLIP); - if (hflipInfo && !(hflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY) && - vflipInfo && !(vflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) { - supportFlips_ = true; - - if (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT || - vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT) - flipsAlterBayerOrder_ = true; - } - - if (!supportFlips_) - LOG(CameraSensor, Debug) - << "Camera sensor does not support horizontal/vertical flip"; - - /* - * Make sure the required selection targets are supported. - * - * Failures in reading any of the targets are not deemed to be fatal, - * but some properties and features, like constructing a - * IPACameraSensorInfo for the IPA module, won't be supported. - * - * \todo Make support for selection targets mandatory as soon as all - * test platforms have been updated. - */ - Rectangle rect; - int ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_BOUNDS, &rect); - if (ret) { - /* - * Default the pixel array size to the largest size supported - * by the sensor. The sizes_ vector is sorted in ascending - * order, the largest size is thus the last element. - */ - pixelArraySize_ = sizes_.back(); - - LOG(CameraSensor, Warning) - << "The PixelArraySize property has been defaulted to " - << pixelArraySize_; - err = -EINVAL; - } else { - pixelArraySize_ = rect.size(); - } - - ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_DEFAULT, &activeArea_); - if (ret) { - activeArea_ = Rectangle(pixelArraySize_); - LOG(CameraSensor, Warning) - << "The PixelArrayActiveAreas property has been defaulted to " - << activeArea_; - err = -EINVAL; - } - - ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP, &rect); - if (ret) { - LOG(CameraSensor, Warning) - << "Failed to retrieve the sensor crop rectangle"; - err = -EINVAL; - } - - if (err) { - LOG(CameraSensor, Warning) - << "The sensor kernel driver needs to be fixed"; - LOG(CameraSensor, Warning) - << "See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information"; - } - - if (!bayerFormat_) - return 0; - - /* - * For raw sensors, make sure the sensor driver supports the controls - * required by the CameraSensor class. - */ - static constexpr uint32_t mandatoryControls[] = { - V4L2_CID_ANALOGUE_GAIN, - V4L2_CID_EXPOSURE, - V4L2_CID_HBLANK, - V4L2_CID_PIXEL_RATE, - V4L2_CID_VBLANK, - }; - - err = 0; - for (uint32_t ctrl : mandatoryControls) { - if (!controls.count(ctrl)) { - LOG(CameraSensor, Error) - << "Mandatory V4L2 control " << utils::hex(ctrl) - << " not available"; - err = -EINVAL; - } - } - - if (err) { - LOG(CameraSensor, Error) - << "The sensor kernel driver needs to be fixed"; - LOG(CameraSensor, Error) - << "See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information"; - return err; - } - - return 0; -} - -/* - * \brief Initialize properties that cannot be intialized by the - * regular initProperties() function for VIMC - */ -void CameraSensor::initVimcDefaultProperties() -{ - /* Use the largest supported size. */ - pixelArraySize_ = sizes_.back(); - activeArea_ = Rectangle(pixelArraySize_); -} - -void CameraSensor::initStaticProperties() -{ - staticProps_ = CameraSensorProperties::get(model_); - if (!staticProps_) - return; - - /* Register the properties retrieved from the sensor database. */ - properties_.set(properties::UnitCellSize, staticProps_->unitCellSize); - - initTestPatternModes(); -} - -void CameraSensor::initTestPatternModes() -{ - const auto &v4l2TestPattern = controls().find(V4L2_CID_TEST_PATTERN); - if (v4l2TestPattern == controls().end()) { - LOG(CameraSensor, Debug) << "V4L2_CID_TEST_PATTERN is not supported"; - return; - } - - const auto &testPatternModes = staticProps_->testPatternModes; - if (testPatternModes.empty()) { - /* - * The camera sensor supports test patterns but we don't know - * how to map them so this should be fixed. - */ - LOG(CameraSensor, Debug) << "No static test pattern map for \'" - << model() << "\'"; - return; - } - - /* - * Create a map that associates the V4L2 control index to the test - * pattern mode by reversing the testPatternModes map provided by the - * camera sensor properties. This makes it easier to verify if the - * control index is supported in the below for loop that creates the - * list of supported test patterns. - */ - std::map indexToTestPatternMode; - for (const auto &it : testPatternModes) - indexToTestPatternMode[it.second] = it.first; - - for (const ControlValue &value : v4l2TestPattern->second.values()) { - const int32_t index = value.get(); - - const auto it = indexToTestPatternMode.find(index); - if (it == indexToTestPatternMode.end()) { - LOG(CameraSensor, Debug) - << "Test pattern mode " << index << " ignored"; - continue; - } - - testPatternModes_.push_back(it->second); - } -} - -int CameraSensor::initProperties() -{ - model_ = subdev_->model(); - properties_.set(properties::Model, utils::toAscii(model_)); - - /* Generate a unique ID for the sensor. */ - int ret = generateId(); - if (ret) - return ret; - - /* Initialize the static properties from the sensor database. */ - initStaticProperties(); - - /* Retrieve and register properties from the kernel interface. */ - const ControlInfoMap &controls = subdev_->controls(); - - const auto &orientation = controls.find(V4L2_CID_CAMERA_ORIENTATION); - if (orientation != controls.end()) { - int32_t v4l2Orientation = orientation->second.def().get(); - int32_t propertyValue; - - switch (v4l2Orientation) { - default: - LOG(CameraSensor, Warning) - << "Unsupported camera location " - << v4l2Orientation << ", setting to External"; - [[fallthrough]]; - case V4L2_CAMERA_ORIENTATION_EXTERNAL: - propertyValue = properties::CameraLocationExternal; - break; - case V4L2_CAMERA_ORIENTATION_FRONT: - propertyValue = properties::CameraLocationFront; - break; - case V4L2_CAMERA_ORIENTATION_BACK: - propertyValue = properties::CameraLocationBack; - break; - } - properties_.set(properties::Location, propertyValue); - } else { - LOG(CameraSensor, Warning) << "Failed to retrieve the camera location"; - } - - const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION); - if (rotationControl != controls.end()) { - int32_t propertyValue = rotationControl->second.def().get(); - - /* - * Cache the Transform associated with the camera mounting - * rotation for later use in computeTransform(). - */ - bool success; - mountingOrientation_ = orientationFromRotation(propertyValue, &success); - if (!success) { - LOG(CameraSensor, Warning) - << "Invalid rotation of " << propertyValue - << " degrees - ignoring"; - mountingOrientation_ = Orientation::Rotate0; - } - - properties_.set(properties::Rotation, propertyValue); - } else { - LOG(CameraSensor, Warning) - << "Rotation control not available, default to 0 degrees"; - properties_.set(properties::Rotation, 0); - mountingOrientation_ = Orientation::Rotate0; - } - - properties_.set(properties::PixelArraySize, pixelArraySize_); - properties_.set(properties::PixelArrayActiveAreas, { activeArea_ }); - - /* Color filter array pattern, register only for RAW sensors. */ - if (bayerFormat_) { - int32_t cfa; - switch (bayerFormat_->order) { - case BayerFormat::BGGR: - cfa = properties::draft::BGGR; - break; - case BayerFormat::GBRG: - cfa = properties::draft::GBRG; - break; - case BayerFormat::GRBG: - cfa = properties::draft::GRBG; - break; - case BayerFormat::RGGB: - cfa = properties::draft::RGGB; - break; - case BayerFormat::MONO: - cfa = properties::draft::MONO; - break; - } - - properties_.set(properties::draft::ColorFilterArrangement, cfa); - } - - return 0; -} - -/** - * \brief Check for and initialise any ancillary devices - * - * Sensors sometimes have ancillary devices such as a Lens or Flash that could - * be linked to their MediaEntity by the kernel. Search for and handle any - * such device. - * - * \todo Handle MEDIA_ENT_F_FLASH too. - */ -int CameraSensor::discoverAncillaryDevices() -{ - int ret; - - for (MediaEntity *ancillary : entity_->ancillaryEntities()) { - switch (ancillary->function()) { - case MEDIA_ENT_F_LENS: - focusLens_ = std::make_unique(ancillary); - ret = focusLens_->init(); - if (ret) { - LOG(CameraSensor, Error) - << "Lens initialisation failed, lens disabled"; - focusLens_.reset(); - } - break; - - default: - LOG(CameraSensor, Warning) - << "Unsupported ancillary entity function " - << ancillary->function(); - break; - } - } - - return 0; -} +CameraSensor::~CameraSensor() = default; /** * \fn CameraSensor::model() @@ -622,29 +89,15 @@ int CameraSensor::discoverAncillaryDevices() */ /** + * \fn CameraSensor::sizes() * \brief Retrieve the supported frame sizes for a media bus code * \param[in] mbusCode The media bus code for which sizes are requested * * \return The supported frame sizes for \a mbusCode sorted in increasing order */ -std::vector CameraSensor::sizes(unsigned int mbusCode) const -{ - std::vector sizes; - - const auto &format = formats_.find(mbusCode); - if (format == formats_.end()) - return sizes; - - const std::vector &ranges = format->second; - std::transform(ranges.begin(), ranges.end(), std::back_inserter(sizes), - [](const SizeRange &range) { return range.max; }); - - std::sort(sizes.begin(), sizes.end()); - - return sizes; -} /** + * \fn CameraSensor::resolution() * \brief Retrieve the camera sensor resolution * * The camera sensor resolution is the active pixel area size, clamped to the @@ -657,12 +110,9 @@ std::vector CameraSensor::sizes(unsigned int mbusCode) const * * \return The camera sensor resolution in pixels */ -Size CameraSensor::resolution() const -{ - return std::min(sizes_.back(), activeArea_.size()); -} /** + * \fn CameraSensor::getFormat() * \brief Retrieve the best sensor format for a desired output * \param[in] mbusCodes The list of acceptable media bus codes * \param[in] size The desired size @@ -698,59 +148,9 @@ Size CameraSensor::resolution() const * \return The best sensor output format matching the desired media bus codes * and size on success, or an empty format otherwise. */ -V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector &mbusCodes, - const Size &size) const -{ - unsigned int desiredArea = size.width * size.height; - unsigned int bestArea = UINT_MAX; - float desiredRatio = static_cast(size.width) / size.height; - float bestRatio = FLT_MAX; - const Size *bestSize = nullptr; - uint32_t bestCode = 0; - - for (unsigned int code : mbusCodes) { - const auto formats = formats_.find(code); - if (formats == formats_.end()) - continue; - - for (const SizeRange &range : formats->second) { - const Size &sz = range.max; - - if (sz.width < size.width || sz.height < size.height) - continue; - - float ratio = static_cast(sz.width) / sz.height; - float ratioDiff = fabsf(ratio - desiredRatio); - unsigned int area = sz.width * sz.height; - unsigned int areaDiff = area - desiredArea; - - if (ratioDiff > bestRatio) - continue; - - if (ratioDiff < bestRatio || areaDiff < bestArea) { - bestRatio = ratioDiff; - bestArea = areaDiff; - bestSize = &sz; - bestCode = code; - } - } - } - - if (!bestSize) { - LOG(CameraSensor, Debug) << "No supported format or size found"; - return {}; - } - - V4L2SubdeviceFormat format{ - .code = bestCode, - .size = *bestSize, - .colorSpace = ColorSpace::Raw, - }; - - return format; -} /** + * \fn CameraSensor::setFormat() * \brief Set the sensor output format * \param[in] format The desired sensor output format * \param[in] transform The transform to be applied on the sensor. @@ -765,32 +165,9 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector &mbu * * \return 0 on success or a negative error code otherwise */ -int CameraSensor::setFormat(V4L2SubdeviceFormat *format, Transform transform) -{ - /* Configure flips if the sensor supports that. */ - if (supportFlips_) { - ControlList flipCtrls(subdev_->controls()); - - flipCtrls.set(V4L2_CID_HFLIP, - static_cast(!!(transform & Transform::HFlip))); - flipCtrls.set(V4L2_CID_VFLIP, - static_cast(!!(transform & Transform::VFlip))); - - int ret = subdev_->setControls(&flipCtrls); - if (ret) - return ret; - } - - /* Apply format on the subdev. */ - int ret = subdev_->setFormat(pad_, format); - if (ret) - return ret; - - subdev_->updateControlInfo(); - return 0; -} /** + * \fn CameraSensor::tryFormat() * \brief Try the sensor output format * \param[in] format The desired sensor output format * @@ -801,13 +178,9 @@ int CameraSensor::setFormat(V4L2SubdeviceFormat *format, Transform transform) * * \return 0 on success or a negative error code otherwise */ -int CameraSensor::tryFormat(V4L2SubdeviceFormat *format) const -{ - return subdev_->setFormat(pad_, format, - V4L2Subdevice::Whence::TryFormat); -} /** + * \fn CameraSensor::applyConfiguration() * \brief Apply a sensor configuration to the camera sensor * \param[in] config The sensor configuration * \param[in] transform The transform to be applied on the sensor. @@ -822,74 +195,6 @@ int CameraSensor::tryFormat(V4L2SubdeviceFormat *format) const * \return 0 if \a config is applied correctly to the camera sensor, a negative * error code otherwise */ -int CameraSensor::applyConfiguration(const SensorConfiguration &config, - Transform transform, - V4L2SubdeviceFormat *sensorFormat) -{ - if (!config.isValid()) { - LOG(CameraSensor, Error) << "Invalid sensor configuration"; - return -EINVAL; - } - - std::vector filteredCodes; - std::copy_if(mbusCodes_.begin(), mbusCodes_.end(), - std::back_inserter(filteredCodes), - [&config](unsigned int mbusCode) { - BayerFormat bayer = BayerFormat::fromMbusCode(mbusCode); - if (bayer.bitDepth == config.bitDepth) - return true; - return false; - }); - if (filteredCodes.empty()) { - LOG(CameraSensor, Error) - << "Cannot find any format with bit depth " - << config.bitDepth; - return -EINVAL; - } - - /* - * Compute the sensor's data frame size by applying the cropping - * rectangle, subsampling and output crop to the sensor's pixel array - * size. - * - * \todo The actual size computation is for now ignored and only the - * output size is considered. This implies that resolutions obtained - * with two different cropping/subsampling will look identical and - * only the first found one will be considered. - */ - V4L2SubdeviceFormat subdevFormat = {}; - for (unsigned int code : filteredCodes) { - for (const Size &size : sizes(code)) { - if (size.width != config.outputSize.width || - size.height != config.outputSize.height) - continue; - - subdevFormat.code = code; - subdevFormat.size = size; - break; - } - } - if (!subdevFormat.code) { - LOG(CameraSensor, Error) << "Invalid output size in sensor configuration"; - return -EINVAL; - } - - int ret = setFormat(&subdevFormat, transform); - if (ret) - return ret; - - /* - * Return to the caller the format actually applied to the sensor. - * This is relevant if transform has changed the bayer pattern order. - */ - if (sensorFormat) - *sensorFormat = subdevFormat; - - /* \todo Handle AnalogCrop. Most sensors do not support set_selection */ - /* \todo Handle scaling in the digital domain. */ - - return 0; -} /** * \fn CameraSensor::properties() @@ -898,6 +203,7 @@ int CameraSensor::applyConfiguration(const SensorConfiguration &config, */ /** + * \fn CameraSensor::sensorInfo() * \brief Assemble and return the camera sensor info * \param[out] info The camera sensor info * @@ -911,82 +217,9 @@ int CameraSensor::applyConfiguration(const SensorConfiguration &config, * * \return 0 on success, a negative error code otherwise */ -int CameraSensor::sensorInfo(IPACameraSensorInfo *info) const -{ - if (!bayerFormat_) - return -EINVAL; - - info->model = model(); - - /* - * The active area size is a static property, while the crop - * rectangle needs to be re-read as it depends on the sensor - * configuration. - */ - info->activeAreaSize = { activeArea_.width, activeArea_.height }; - - /* - * \todo Support for retreiving the crop rectangle is scheduled to - * become mandatory. For the time being use the default value if it has - * been initialized at sensor driver validation time. - */ - int ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP, &info->analogCrop); - if (ret) { - info->analogCrop = activeArea_; - LOG(CameraSensor, Warning) - << "The analogue crop rectangle has been defaulted to the active area size"; - } - - /* - * IPACameraSensorInfo::analogCrop::x and IPACameraSensorInfo::analogCrop::y - * are defined relatively to the active pixel area, while V4L2's - * TGT_CROP target is defined in respect to the full pixel array. - * - * Compensate it by subtracting the active area offset. - */ - info->analogCrop.x -= activeArea_.x; - info->analogCrop.y -= activeArea_.y; - - /* The bit depth and image size depend on the currently applied format. */ - V4L2SubdeviceFormat format{}; - ret = subdev_->getFormat(pad_, &format); - if (ret) - return ret; - - info->bitsPerPixel = MediaBusFormatInfo::info(format.code).bitsPerPixel; - info->outputSize = format.size; - - std::optional cfa = properties_.get(properties::draft::ColorFilterArrangement); - info->cfaPattern = cfa ? *cfa : properties::draft::RGB; - - /* - * Retrieve the pixel rate, line length and minimum/maximum frame - * duration through V4L2 controls. Support for the V4L2_CID_PIXEL_RATE, - * V4L2_CID_HBLANK and V4L2_CID_VBLANK controls is mandatory. - */ - ControlList ctrls = subdev_->getControls({ V4L2_CID_PIXEL_RATE, - V4L2_CID_HBLANK, - V4L2_CID_VBLANK }); - if (ctrls.empty()) { - LOG(CameraSensor, Error) - << "Failed to retrieve camera info controls"; - return -EINVAL; - } - - info->pixelRate = ctrls.get(V4L2_CID_PIXEL_RATE).get(); - - const ControlInfo hblank = ctrls.infoMap()->at(V4L2_CID_HBLANK); - info->minLineLength = info->outputSize.width + hblank.min().get(); - info->maxLineLength = info->outputSize.width + hblank.max().get(); - - const ControlInfo vblank = ctrls.infoMap()->at(V4L2_CID_VBLANK); - info->minFrameLength = info->outputSize.height + vblank.min().get(); - info->maxFrameLength = info->outputSize.height + vblank.max().get(); - - return 0; -} /** + * \fn CameraSensor::computeTransform() * \brief Compute the Transform that gives the requested \a orientation * \param[inout] orientation The desired image orientation * @@ -1012,40 +245,9 @@ int CameraSensor::sensorInfo(IPACameraSensorInfo *info) const * \return A Transform instance that applied to the CameraSensor produces images * with \a orientation */ -Transform CameraSensor::computeTransform(Orientation *orientation) const -{ - /* - * If we cannot do any flips we cannot change the native camera mounting - * orientation. - */ - if (!supportFlips_) { - *orientation = mountingOrientation_; - return Transform::Identity; - } - - /* - * Now compute the required transform to obtain 'orientation' starting - * from the mounting rotation. - * - * As a note: - * orientation / mountingOrientation_ = transform - * mountingOrientation_ * transform = orientation - */ - Transform transform = *orientation / mountingOrientation_; - - /* - * If transform contains any Transpose we cannot do it, so adjust - * 'orientation' to report the image native orientation and return Identity. - */ - if (!!(transform & Transform::Transpose)) { - *orientation = mountingOrientation_; - return Transform::Identity; - } - - return transform; -} /** + * \fn CameraSensor::bayerOrder() * \brief Compute the Bayer order that results from the given Transform * \param[in] t The Transform to apply to the sensor * @@ -1057,23 +259,9 @@ Transform CameraSensor::computeTransform(Orientation *orientation) const * * \return The Bayer order produced by the sensor when the Transform is applied */ -BayerFormat::Order CameraSensor::bayerOrder(Transform t) const -{ - /* Return a defined by meaningless value for non-Bayer sensors. */ - if (!bayerFormat_) - return BayerFormat::Order::BGGR; - - if (!flipsAlterBayerOrder_) - return bayerFormat_->order; - - /* - * Apply the transform to the native (i.e. untransformed) Bayer order, - * using the rest of the Bayer format supplied by the caller. - */ - return bayerFormat_->transform(t).order; -} /** + * \fn CameraSensor::controls() * \brief Retrieve the supported V4L2 controls and their information * * Control information is updated automatically to reflect the current sensor @@ -1082,12 +270,9 @@ BayerFormat::Order CameraSensor::bayerOrder(Transform t) const * * \return A map of the V4L2 controls supported by the sensor */ -const ControlInfoMap &CameraSensor::controls() const -{ - return subdev_->controls(); -} /** + * \fn CameraSensor::getControls() * \brief Read V4L2 controls from the sensor * \param[in] ids The list of controls to read, specified by their ID * @@ -1105,12 +290,9 @@ const ControlInfoMap &CameraSensor::controls() const * \return The control values in a ControlList on success, or an empty list on * error */ -ControlList CameraSensor::getControls(const std::vector &ids) -{ - return subdev_->getControls(ids); -} /** + * \fn CameraSensor::setControls() * \brief Write V4L2 controls to the sensor * \param[in] ctrls The list of controls to write * @@ -1135,10 +317,6 @@ ControlList CameraSensor::getControls(const std::vector &ids) * \retval -EINVAL One of the control is not supported or not accessible * \retval i The index of the control that failed */ -int CameraSensor::setControls(ControlList *ctrls) -{ - return subdev_->setControls(ctrls); -} /** * \fn CameraSensor::testPatternModes() @@ -1149,6 +327,7 @@ int CameraSensor::setControls(ControlList *ctrls) */ /** + * \fn CameraSensor::setTestPatternMode() * \brief Set the test pattern mode for the camera sensor * \param[in] mode The test pattern mode * @@ -1156,84 +335,6 @@ int CameraSensor::setControls(ControlList *ctrls) * pattern mode. Otherwise, this function is a no-op. Setting the same test * pattern mode for every frame thus incurs no performance penalty. */ -int CameraSensor::setTestPatternMode(controls::draft::TestPatternModeEnum mode) -{ - if (testPatternMode_ == mode) - return 0; - - if (testPatternModes_.empty()) { - LOG(CameraSensor, Error) - << "Camera sensor does not support test pattern modes."; - return -EINVAL; - } - - return applyTestPatternMode(mode); -} - -int CameraSensor::applyTestPatternMode(controls::draft::TestPatternModeEnum mode) -{ - if (testPatternModes_.empty()) - return 0; - - auto it = std::find(testPatternModes_.begin(), testPatternModes_.end(), - mode); - if (it == testPatternModes_.end()) { - LOG(CameraSensor, Error) << "Unsupported test pattern mode " - << mode; - return -EINVAL; - } - - LOG(CameraSensor, Debug) << "Apply test pattern mode " << mode; - - int32_t index = staticProps_->testPatternModes.at(mode); - ControlList ctrls{ controls() }; - ctrls.set(V4L2_CID_TEST_PATTERN, index); - - int ret = setControls(&ctrls); - if (ret) - return ret; - - testPatternMode_ = mode; - - return 0; -} - -std::string CameraSensor::logPrefix() const -{ - return "'" + entity_->name() + "'"; -} - -namespace { - -/* Transitory default camera sensor implementation */ -class CameraSensorDefault : public CameraSensor -{ -public: - CameraSensorDefault(MediaEntity *entity) - : CameraSensor(entity) - { - } - - static bool match([[maybe_unused]] const MediaEntity *entity) - { - return true; - } - - static std::unique_ptr create(MediaEntity *entity) - { - std::unique_ptr sensor = - std::make_unique(entity); - - if (sensor->init()) - return nullptr; - - return sensor; - } -}; - -REGISTER_CAMERA_SENSOR(CameraSensorDefault) - -}; /* namespace */ /** * \class CameraSensorFactoryBase @@ -1247,11 +348,13 @@ REGISTER_CAMERA_SENSOR(CameraSensorDefault) /** * \brief Construct a camera sensor factory base + * \param[in] name The camera sensor factory name * * Creating an instance of the factory base registers it with the global list of * factories, accessible through the factories() function. */ -CameraSensorFactoryBase::CameraSensorFactoryBase() +CameraSensorFactoryBase::CameraSensorFactoryBase(const char *name) + : name_(name) { registerFactory(this); } @@ -1269,23 +372,33 @@ std::unique_ptr CameraSensorFactoryBase::create(MediaEntity *entit CameraSensorFactoryBase::factories(); for (const CameraSensorFactoryBase *factory : factories) { - if (!factory->match(entity)) - continue; + std::variant, int> result = + factory->match(entity); - std::unique_ptr sensor = factory->createInstance(entity); - if (!sensor) { + if (std::holds_alternative>(result)) { + LOG(CameraSensor, Debug) + << "Entity '" << entity->name() << "' matched by " + << factory->name(); + return std::get>(std::move(result)); + } + + if (std::get(result)) { LOG(CameraSensor, Error) << "Failed to create sensor for '" - << entity->name(); + << entity->name() << ": " << std::get(result); return nullptr; } - - return sensor; } return nullptr; } +/** + * \fn CameraSensorFactoryBase::name() + * \brief Retrieve the camera sensor factory name + * \return The name of the factory + */ + /** * \brief Retrieve the list of all camera sensor factories * \return The list of camera sensor factories @@ -1335,33 +448,27 @@ void CameraSensorFactoryBase::registerFactory(CameraSensorFactoryBase *factory) * function. */ -/** - * \fn CameraSensorFactory::createInstance() const - * \brief Create an instance of the CameraSensor corresponding to the factory - * - * \return A unique pointer to a newly constructed instance of the CameraSensor - * subclass corresponding to the factory - */ - /** * \def REGISTER_CAMERA_SENSOR(sensor) * \brief Register a camera sensor type to the sensor factory * \param[in] sensor Class name of the CameraSensor derived class to register * * Register a CameraSensor subclass with the factory and make it available to - * try and match sensors. The subclass needs to implement two static functions: + * try and match sensors. The subclass needs to implement a static match + * function: * * \code{.cpp} - * static bool match(const MediaEntity *entity); - * static std::unique_ptr create(MediaEntity *entity); + * static std::variant, int> match(MediaEntity *entity); * \endcode * - * The match() function tests if the sensor class supports the camera sensor - * identified by a MediaEntity. + * The function tests if the sensor class supports the camera sensor identified + * by a MediaEntity. If so, it creates a new instance of the sensor class. The + * return value is a variant that contains * - * The create() function creates a new instance of the sensor class. It may - * return a null pointer if initialization of the instance fails. It will only - * be called if the match() function has returned true for the given entity. + * - A new instance of the camera sensor class if the entity matched and + * creation succeeded ; + * - A non-zero error code if the entity matched and the creation failed ; or + * - A zero error code if the entity didn't match. */ } /* namespace libcamera */ diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp new file mode 100644 index 000000000..68c945331 --- /dev/null +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp @@ -0,0 +1,1015 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * camera_sensor_legacy.cpp - A V4L2-backed camera sensor + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "libcamera/internal/bayer_format.h" +#include "libcamera/internal/camera_lens.h" +#include "libcamera/internal/camera_sensor.h" +#include "libcamera/internal/camera_sensor_properties.h" +#include "libcamera/internal/formats.h" +#include "libcamera/internal/media_device.h" +#include "libcamera/internal/sysfs.h" +#include "libcamera/internal/v4l2_subdevice.h" + +namespace libcamera { + +class BayerFormat; +class CameraLens; +class MediaEntity; +class SensorConfiguration; + +struct CameraSensorProperties; + +enum class Orientation; + +LOG_DECLARE_CATEGORY(CameraSensor) + +class CameraSensorLegacy : public CameraSensor, protected Loggable +{ +public: + CameraSensorLegacy(const MediaEntity *entity); + ~CameraSensorLegacy(); + + static std::variant, int> + match(MediaEntity *entity); + + const std::string &model() const override { return model_; } + const std::string &id() const override { return id_; } + + const MediaEntity *entity() const override { return entity_; } + V4L2Subdevice *device() override { return subdev_.get(); } + + CameraLens *focusLens() override { return focusLens_.get(); } + + const std::vector &mbusCodes() const override { return mbusCodes_; } + std::vector sizes(unsigned int mbusCode) const override; + Size resolution() const override; + + V4L2SubdeviceFormat getFormat(const std::vector &mbusCodes, + const Size &size) const override; + int setFormat(V4L2SubdeviceFormat *format, + Transform transform = Transform::Identity) override; + int tryFormat(V4L2SubdeviceFormat *format) const override; + + int applyConfiguration(const SensorConfiguration &config, + Transform transform = Transform::Identity, + V4L2SubdeviceFormat *sensorFormat = nullptr) override; + + const ControlList &properties() const override { return properties_; } + int sensorInfo(IPACameraSensorInfo *info) const override; + Transform computeTransform(Orientation *orientation) const override; + BayerFormat::Order bayerOrder(Transform t) const override; + + const ControlInfoMap &controls() const override; + ControlList getControls(const std::vector &ids) override; + int setControls(ControlList *ctrls) override; + + const std::vector & + testPatternModes() const override { return testPatternModes_; } + int setTestPatternMode(controls::draft::TestPatternModeEnum mode) override; + +protected: + std::string logPrefix() const override; + +private: + LIBCAMERA_DISABLE_COPY(CameraSensorLegacy) + + int init(); + int generateId(); + int validateSensorDriver(); + void initVimcDefaultProperties(); + void initStaticProperties(); + void initTestPatternModes(); + int initProperties(); + int applyTestPatternMode(controls::draft::TestPatternModeEnum mode); + int discoverAncillaryDevices(); + + const MediaEntity *entity_; + std::unique_ptr subdev_; + unsigned int pad_; + + const CameraSensorProperties *staticProps_; + + std::string model_; + std::string id_; + + V4L2Subdevice::Formats formats_; + std::vector mbusCodes_; + std::vector sizes_; + std::vector testPatternModes_; + controls::draft::TestPatternModeEnum testPatternMode_; + + Size pixelArraySize_; + Rectangle activeArea_; + const BayerFormat *bayerFormat_; + bool supportFlips_; + bool flipsAlterBayerOrder_; + Orientation mountingOrientation_; + + ControlList properties_; + + std::unique_ptr focusLens_; +}; + +/** + * \class CameraSensorLegacy + * \brief A camera sensor based on V4L2 subdevices + * + * The implementation is currently limited to sensors that expose a single V4L2 + * subdevice with a single pad. It will be extended to support more complex + * devices as the needs arise. + */ + +CameraSensorLegacy::CameraSensorLegacy(const MediaEntity *entity) + : entity_(entity), pad_(UINT_MAX), staticProps_(nullptr), + bayerFormat_(nullptr), supportFlips_(false), + flipsAlterBayerOrder_(false), properties_(properties::properties) +{ +} + +CameraSensorLegacy::~CameraSensorLegacy() = default; + +std::variant, int> +CameraSensorLegacy::match(MediaEntity *entity) +{ + std::unique_ptr sensor = + std::make_unique(entity); + + int ret = sensor->init(); + if (ret) + return { ret }; + + return { std::move(sensor) }; +} + +int CameraSensorLegacy::init() +{ + for (const MediaPad *pad : entity_->pads()) { + if (pad->flags() & MEDIA_PAD_FL_SOURCE) { + pad_ = pad->index(); + break; + } + } + + if (pad_ == UINT_MAX) { + LOG(CameraSensor, Error) + << "Sensors with more than one pad are not supported"; + return -EINVAL; + } + + switch (entity_->function()) { + case MEDIA_ENT_F_CAM_SENSOR: + case MEDIA_ENT_F_PROC_VIDEO_ISP: + break; + + default: + LOG(CameraSensor, Error) + << "Invalid sensor function " + << utils::hex(entity_->function()); + return -EINVAL; + } + + /* Create and open the subdev. */ + subdev_ = std::make_unique(entity_); + int ret = subdev_->open(); + if (ret < 0) + return ret; + + /* + * Clear any flips to be sure we get the "native" Bayer order. This is + * harmless for sensors where the flips don't affect the Bayer order. + */ + ControlList ctrls(subdev_->controls()); + if (subdev_->controls().find(V4L2_CID_HFLIP) != subdev_->controls().end()) + ctrls.set(V4L2_CID_HFLIP, 0); + if (subdev_->controls().find(V4L2_CID_VFLIP) != subdev_->controls().end()) + ctrls.set(V4L2_CID_VFLIP, 0); + subdev_->setControls(&ctrls); + + /* Enumerate, sort and cache media bus codes and sizes. */ + formats_ = subdev_->formats(pad_); + if (formats_.empty()) { + LOG(CameraSensor, Error) << "No image format found"; + return -EINVAL; + } + + mbusCodes_ = utils::map_keys(formats_); + std::sort(mbusCodes_.begin(), mbusCodes_.end()); + + for (const auto &format : formats_) { + const std::vector &ranges = format.second; + std::transform(ranges.begin(), ranges.end(), std::back_inserter(sizes_), + [](const SizeRange &range) { return range.max; }); + } + + std::sort(sizes_.begin(), sizes_.end()); + + /* Remove duplicates. */ + auto last = std::unique(sizes_.begin(), sizes_.end()); + sizes_.erase(last, sizes_.end()); + + /* + * VIMC is a bit special, as it does not yet support all the mandatory + * requirements regular sensors have to respect. + * + * Do not validate the driver if it's VIMC and initialize the sensor + * properties with static information. + * + * \todo Remove the special case once the VIMC driver has been + * updated in all test platforms. + */ + if (entity_->device()->driver() == "vimc") { + initVimcDefaultProperties(); + + ret = initProperties(); + if (ret) + return ret; + + return discoverAncillaryDevices(); + } + + /* Get the color filter array pattern (only for RAW sensors). */ + for (unsigned int mbusCode : mbusCodes_) { + const BayerFormat &bayerFormat = BayerFormat::fromMbusCode(mbusCode); + if (bayerFormat.isValid()) { + bayerFormat_ = &bayerFormat; + break; + } + } + + ret = validateSensorDriver(); + if (ret) + return ret; + + ret = initProperties(); + if (ret) + return ret; + + ret = discoverAncillaryDevices(); + if (ret) + return ret; + + /* + * Set HBLANK to the minimum to start with a well-defined line length, + * allowing IPA modules that do not modify HBLANK to use the sensor + * minimum line length in their calculations. + */ + const struct v4l2_query_ext_ctrl *hblankInfo = subdev_->controlInfo(V4L2_CID_HBLANK); + if (hblankInfo && !(hblankInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) { + ControlList ctrl(subdev_->controls()); + + ctrl.set(V4L2_CID_HBLANK, static_cast(hblankInfo->minimum)); + ret = subdev_->setControls(&ctrl); + if (ret) + return ret; + } + + return applyTestPatternMode(controls::draft::TestPatternModeEnum::TestPatternModeOff); +} + +int CameraSensorLegacy::generateId() +{ + const std::string devPath = subdev_->devicePath(); + + /* Try to get ID from firmware description. */ + id_ = sysfs::firmwareNodePath(devPath); + if (!id_.empty()) + return 0; + + /* + * Virtual sensors not described in firmware + * + * Verify it's a platform device and construct ID from the device path + * and model of sensor. + */ + if (devPath.find("/sys/devices/platform/", 0) == 0) { + id_ = devPath.substr(strlen("/sys/devices/")) + " " + model(); + return 0; + } + + LOG(CameraSensor, Error) << "Can't generate sensor ID"; + return -EINVAL; +} + +int CameraSensorLegacy::validateSensorDriver() +{ + int err = 0; + + /* + * Optional controls are used to register optional sensor properties. If + * not present, some values will be defaulted. + */ + static constexpr uint32_t optionalControls[] = { + V4L2_CID_CAMERA_SENSOR_ROTATION, + }; + + const ControlIdMap &controls = subdev_->controls().idmap(); + for (uint32_t ctrl : optionalControls) { + if (!controls.count(ctrl)) + LOG(CameraSensor, Debug) + << "Optional V4L2 control " << utils::hex(ctrl) + << " not supported"; + } + + /* + * Recommended controls are similar to optional controls, but will + * become mandatory in the near future. Be loud if they're missing. + */ + static constexpr uint32_t recommendedControls[] = { + V4L2_CID_CAMERA_ORIENTATION, + }; + + for (uint32_t ctrl : recommendedControls) { + if (!controls.count(ctrl)) { + LOG(CameraSensor, Warning) + << "Recommended V4L2 control " << utils::hex(ctrl) + << " not supported"; + err = -EINVAL; + } + } + + /* + * Verify if sensor supports horizontal/vertical flips + * + * \todo Handle horizontal and vertical flips independently. + */ + const struct v4l2_query_ext_ctrl *hflipInfo = subdev_->controlInfo(V4L2_CID_HFLIP); + const struct v4l2_query_ext_ctrl *vflipInfo = subdev_->controlInfo(V4L2_CID_VFLIP); + if (hflipInfo && !(hflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY) && + vflipInfo && !(vflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) { + supportFlips_ = true; + + if (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT || + vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT) + flipsAlterBayerOrder_ = true; + } + + if (!supportFlips_) + LOG(CameraSensor, Debug) + << "Camera sensor does not support horizontal/vertical flip"; + + /* + * Make sure the required selection targets are supported. + * + * Failures in reading any of the targets are not deemed to be fatal, + * but some properties and features, like constructing a + * IPACameraSensorInfo for the IPA module, won't be supported. + * + * \todo Make support for selection targets mandatory as soon as all + * test platforms have been updated. + */ + Rectangle rect; + int ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_BOUNDS, &rect); + if (ret) { + /* + * Default the pixel array size to the largest size supported + * by the sensor. The sizes_ vector is sorted in ascending + * order, the largest size is thus the last element. + */ + pixelArraySize_ = sizes_.back(); + + LOG(CameraSensor, Warning) + << "The PixelArraySize property has been defaulted to " + << pixelArraySize_; + err = -EINVAL; + } else { + pixelArraySize_ = rect.size(); + } + + ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_DEFAULT, &activeArea_); + if (ret) { + activeArea_ = Rectangle(pixelArraySize_); + LOG(CameraSensor, Warning) + << "The PixelArrayActiveAreas property has been defaulted to " + << activeArea_; + err = -EINVAL; + } + + ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP, &rect); + if (ret) { + LOG(CameraSensor, Warning) + << "Failed to retrieve the sensor crop rectangle"; + err = -EINVAL; + } + + if (err) { + LOG(CameraSensor, Warning) + << "The sensor kernel driver needs to be fixed"; + LOG(CameraSensor, Warning) + << "See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information"; + } + + if (!bayerFormat_) + return 0; + + /* + * For raw sensors, make sure the sensor driver supports the controls + * required by the CameraSensor class. + */ + static constexpr uint32_t mandatoryControls[] = { + V4L2_CID_ANALOGUE_GAIN, + V4L2_CID_EXPOSURE, + V4L2_CID_HBLANK, + V4L2_CID_PIXEL_RATE, + V4L2_CID_VBLANK, + }; + + err = 0; + for (uint32_t ctrl : mandatoryControls) { + if (!controls.count(ctrl)) { + LOG(CameraSensor, Error) + << "Mandatory V4L2 control " << utils::hex(ctrl) + << " not available"; + err = -EINVAL; + } + } + + if (err) { + LOG(CameraSensor, Error) + << "The sensor kernel driver needs to be fixed"; + LOG(CameraSensor, Error) + << "See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information"; + return err; + } + + return 0; +} + +void CameraSensorLegacy::initVimcDefaultProperties() +{ + /* Use the largest supported size. */ + pixelArraySize_ = sizes_.back(); + activeArea_ = Rectangle(pixelArraySize_); +} + +void CameraSensorLegacy::initStaticProperties() +{ + staticProps_ = CameraSensorProperties::get(model_); + if (!staticProps_) + return; + + /* Register the properties retrieved from the sensor database. */ + properties_.set(properties::UnitCellSize, staticProps_->unitCellSize); + + initTestPatternModes(); +} + +void CameraSensorLegacy::initTestPatternModes() +{ + const auto &v4l2TestPattern = controls().find(V4L2_CID_TEST_PATTERN); + if (v4l2TestPattern == controls().end()) { + LOG(CameraSensor, Debug) << "V4L2_CID_TEST_PATTERN is not supported"; + return; + } + + const auto &testPatternModes = staticProps_->testPatternModes; + if (testPatternModes.empty()) { + /* + * The camera sensor supports test patterns but we don't know + * how to map them so this should be fixed. + */ + LOG(CameraSensor, Debug) << "No static test pattern map for \'" + << model() << "\'"; + return; + } + + /* + * Create a map that associates the V4L2 control index to the test + * pattern mode by reversing the testPatternModes map provided by the + * camera sensor properties. This makes it easier to verify if the + * control index is supported in the below for loop that creates the + * list of supported test patterns. + */ + std::map indexToTestPatternMode; + for (const auto &it : testPatternModes) + indexToTestPatternMode[it.second] = it.first; + + for (const ControlValue &value : v4l2TestPattern->second.values()) { + const int32_t index = value.get(); + + const auto it = indexToTestPatternMode.find(index); + if (it == indexToTestPatternMode.end()) { + LOG(CameraSensor, Debug) + << "Test pattern mode " << index << " ignored"; + continue; + } + + testPatternModes_.push_back(it->second); + } +} + +int CameraSensorLegacy::initProperties() +{ + model_ = subdev_->model(); + properties_.set(properties::Model, utils::toAscii(model_)); + + /* Generate a unique ID for the sensor. */ + int ret = generateId(); + if (ret) + return ret; + + /* Initialize the static properties from the sensor database. */ + initStaticProperties(); + + /* Retrieve and register properties from the kernel interface. */ + const ControlInfoMap &controls = subdev_->controls(); + + const auto &orientation = controls.find(V4L2_CID_CAMERA_ORIENTATION); + if (orientation != controls.end()) { + int32_t v4l2Orientation = orientation->second.def().get(); + int32_t propertyValue; + + switch (v4l2Orientation) { + default: + LOG(CameraSensor, Warning) + << "Unsupported camera location " + << v4l2Orientation << ", setting to External"; + [[fallthrough]]; + case V4L2_CAMERA_ORIENTATION_EXTERNAL: + propertyValue = properties::CameraLocationExternal; + break; + case V4L2_CAMERA_ORIENTATION_FRONT: + propertyValue = properties::CameraLocationFront; + break; + case V4L2_CAMERA_ORIENTATION_BACK: + propertyValue = properties::CameraLocationBack; + break; + } + properties_.set(properties::Location, propertyValue); + } else { + LOG(CameraSensor, Warning) << "Failed to retrieve the camera location"; + } + + const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION); + if (rotationControl != controls.end()) { + int32_t propertyValue = rotationControl->second.def().get(); + + /* + * Cache the Transform associated with the camera mounting + * rotation for later use in computeTransform(). + */ + bool success; + mountingOrientation_ = orientationFromRotation(propertyValue, &success); + if (!success) { + LOG(CameraSensor, Warning) + << "Invalid rotation of " << propertyValue + << " degrees - ignoring"; + mountingOrientation_ = Orientation::Rotate0; + } + + properties_.set(properties::Rotation, propertyValue); + } else { + LOG(CameraSensor, Warning) + << "Rotation control not available, default to 0 degrees"; + properties_.set(properties::Rotation, 0); + mountingOrientation_ = Orientation::Rotate0; + } + + properties_.set(properties::PixelArraySize, pixelArraySize_); + properties_.set(properties::PixelArrayActiveAreas, { activeArea_ }); + + /* Color filter array pattern, register only for RAW sensors. */ + if (bayerFormat_) { + int32_t cfa; + switch (bayerFormat_->order) { + case BayerFormat::BGGR: + cfa = properties::draft::BGGR; + break; + case BayerFormat::GBRG: + cfa = properties::draft::GBRG; + break; + case BayerFormat::GRBG: + cfa = properties::draft::GRBG; + break; + case BayerFormat::RGGB: + cfa = properties::draft::RGGB; + break; + case BayerFormat::MONO: + cfa = properties::draft::MONO; + break; + } + + properties_.set(properties::draft::ColorFilterArrangement, cfa); + } + + return 0; +} + +int CameraSensorLegacy::discoverAncillaryDevices() +{ + int ret; + + for (MediaEntity *ancillary : entity_->ancillaryEntities()) { + switch (ancillary->function()) { + case MEDIA_ENT_F_LENS: + focusLens_ = std::make_unique(ancillary); + ret = focusLens_->init(); + if (ret) { + LOG(CameraSensor, Error) + << "Lens initialisation failed, lens disabled"; + focusLens_.reset(); + } + break; + + default: + LOG(CameraSensor, Warning) + << "Unsupported ancillary entity function " + << ancillary->function(); + break; + } + } + + return 0; +} + +std::vector CameraSensorLegacy::sizes(unsigned int mbusCode) const +{ + std::vector sizes; + + const auto &format = formats_.find(mbusCode); + if (format == formats_.end()) + return sizes; + + const std::vector &ranges = format->second; + std::transform(ranges.begin(), ranges.end(), std::back_inserter(sizes), + [](const SizeRange &range) { return range.max; }); + + std::sort(sizes.begin(), sizes.end()); + + return sizes; +} + +Size CameraSensorLegacy::resolution() const +{ + return std::min(sizes_.back(), activeArea_.size()); +} + +V4L2SubdeviceFormat +CameraSensorLegacy::getFormat(const std::vector &mbusCodes, + const Size &size) const +{ + unsigned int desiredArea = size.width * size.height; + unsigned int bestArea = UINT_MAX; + float desiredRatio = static_cast(size.width) / size.height; + float bestRatio = FLT_MAX; + const Size *bestSize = nullptr; + uint32_t bestCode = 0; + + for (unsigned int code : mbusCodes) { + const auto formats = formats_.find(code); + if (formats == formats_.end()) + continue; + + for (const SizeRange &range : formats->second) { + const Size &sz = range.max; + + if (sz.width < size.width || sz.height < size.height) + continue; + + float ratio = static_cast(sz.width) / sz.height; + float ratioDiff = std::abs(ratio - desiredRatio); + unsigned int area = sz.width * sz.height; + unsigned int areaDiff = area - desiredArea; + + if (ratioDiff > bestRatio) + continue; + + if (ratioDiff < bestRatio || areaDiff < bestArea) { + bestRatio = ratioDiff; + bestArea = areaDiff; + bestSize = &sz; + bestCode = code; + } + } + } + + if (!bestSize) { + LOG(CameraSensor, Debug) << "No supported format or size found"; + return {}; + } + + V4L2SubdeviceFormat format{ + .code = bestCode, + .size = *bestSize, + .colorSpace = ColorSpace::Raw, + }; + + return format; +} + +int CameraSensorLegacy::setFormat(V4L2SubdeviceFormat *format, Transform transform) +{ + /* Configure flips if the sensor supports that. */ + if (supportFlips_) { + ControlList flipCtrls(subdev_->controls()); + + flipCtrls.set(V4L2_CID_HFLIP, + static_cast(!!(transform & Transform::HFlip))); + flipCtrls.set(V4L2_CID_VFLIP, + static_cast(!!(transform & Transform::VFlip))); + + int ret = subdev_->setControls(&flipCtrls); + if (ret) + return ret; + } + + /* Apply format on the subdev. */ + int ret = subdev_->setFormat(pad_, format); + if (ret) + return ret; + + subdev_->updateControlInfo(); + return 0; +} + +int CameraSensorLegacy::tryFormat(V4L2SubdeviceFormat *format) const +{ + return subdev_->setFormat(pad_, format, + V4L2Subdevice::Whence::TryFormat); +} + +int CameraSensorLegacy::applyConfiguration(const SensorConfiguration &config, + Transform transform, + V4L2SubdeviceFormat *sensorFormat) +{ + if (!config.isValid()) { + LOG(CameraSensor, Error) << "Invalid sensor configuration"; + return -EINVAL; + } + + std::vector filteredCodes; + std::copy_if(mbusCodes_.begin(), mbusCodes_.end(), + std::back_inserter(filteredCodes), + [&config](unsigned int mbusCode) { + BayerFormat bayer = BayerFormat::fromMbusCode(mbusCode); + if (bayer.bitDepth == config.bitDepth) + return true; + return false; + }); + if (filteredCodes.empty()) { + LOG(CameraSensor, Error) + << "Cannot find any format with bit depth " + << config.bitDepth; + return -EINVAL; + } + + /* + * Compute the sensor's data frame size by applying the cropping + * rectangle, subsampling and output crop to the sensor's pixel array + * size. + * + * \todo The actual size computation is for now ignored and only the + * output size is considered. This implies that resolutions obtained + * with two different cropping/subsampling will look identical and + * only the first found one will be considered. + */ + V4L2SubdeviceFormat subdevFormat = {}; + for (unsigned int code : filteredCodes) { + for (const Size &size : sizes(code)) { + if (size.width != config.outputSize.width || + size.height != config.outputSize.height) + continue; + + subdevFormat.code = code; + subdevFormat.size = size; + break; + } + } + if (!subdevFormat.code) { + LOG(CameraSensor, Error) << "Invalid output size in sensor configuration"; + return -EINVAL; + } + + int ret = setFormat(&subdevFormat, transform); + if (ret) + return ret; + + /* + * Return to the caller the format actually applied to the sensor. + * This is relevant if transform has changed the bayer pattern order. + */ + if (sensorFormat) + *sensorFormat = subdevFormat; + + /* \todo Handle AnalogCrop. Most sensors do not support set_selection */ + /* \todo Handle scaling in the digital domain. */ + + return 0; +} + +int CameraSensorLegacy::sensorInfo(IPACameraSensorInfo *info) const +{ + if (!bayerFormat_) + return -EINVAL; + + info->model = model(); + + /* + * The active area size is a static property, while the crop + * rectangle needs to be re-read as it depends on the sensor + * configuration. + */ + info->activeAreaSize = { activeArea_.width, activeArea_.height }; + + /* + * \todo Support for retreiving the crop rectangle is scheduled to + * become mandatory. For the time being use the default value if it has + * been initialized at sensor driver validation time. + */ + int ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP, &info->analogCrop); + if (ret) { + info->analogCrop = activeArea_; + LOG(CameraSensor, Warning) + << "The analogue crop rectangle has been defaulted to the active area size"; + } + + /* + * IPACameraSensorInfo::analogCrop::x and IPACameraSensorInfo::analogCrop::y + * are defined relatively to the active pixel area, while V4L2's + * TGT_CROP target is defined in respect to the full pixel array. + * + * Compensate it by subtracting the active area offset. + */ + info->analogCrop.x -= activeArea_.x; + info->analogCrop.y -= activeArea_.y; + + /* The bit depth and image size depend on the currently applied format. */ + V4L2SubdeviceFormat format{}; + ret = subdev_->getFormat(pad_, &format); + if (ret) + return ret; + info->bitsPerPixel = MediaBusFormatInfo::info(format.code).bitsPerPixel; + info->outputSize = format.size; + + std::optional cfa = properties_.get(properties::draft::ColorFilterArrangement); + info->cfaPattern = cfa ? *cfa : properties::draft::RGB; + + /* + * Retrieve the pixel rate, line length and minimum/maximum frame + * duration through V4L2 controls. Support for the V4L2_CID_PIXEL_RATE, + * V4L2_CID_HBLANK and V4L2_CID_VBLANK controls is mandatory. + */ + ControlList ctrls = subdev_->getControls({ V4L2_CID_PIXEL_RATE, + V4L2_CID_HBLANK, + V4L2_CID_VBLANK }); + if (ctrls.empty()) { + LOG(CameraSensor, Error) + << "Failed to retrieve camera info controls"; + return -EINVAL; + } + + info->pixelRate = ctrls.get(V4L2_CID_PIXEL_RATE).get(); + + const ControlInfo hblank = ctrls.infoMap()->at(V4L2_CID_HBLANK); + info->minLineLength = info->outputSize.width + hblank.min().get(); + info->maxLineLength = info->outputSize.width + hblank.max().get(); + + const ControlInfo vblank = ctrls.infoMap()->at(V4L2_CID_VBLANK); + info->minFrameLength = info->outputSize.height + vblank.min().get(); + info->maxFrameLength = info->outputSize.height + vblank.max().get(); + + return 0; +} + +Transform CameraSensorLegacy::computeTransform(Orientation *orientation) const +{ + /* + * If we cannot do any flips we cannot change the native camera mounting + * orientation. + */ + if (!supportFlips_) { + *orientation = mountingOrientation_; + return Transform::Identity; + } + + /* + * Now compute the required transform to obtain 'orientation' starting + * from the mounting rotation. + * + * As a note: + * orientation / mountingOrientation_ = transform + * mountingOrientation_ * transform = orientation + */ + Transform transform = *orientation / mountingOrientation_; + + /* + * If transform contains any Transpose we cannot do it, so adjust + * 'orientation' to report the image native orientation and return Identity. + */ + if (!!(transform & Transform::Transpose)) { + *orientation = mountingOrientation_; + return Transform::Identity; + } + + return transform; +} + +BayerFormat::Order CameraSensorLegacy::bayerOrder(Transform t) const +{ + /* Return a defined by meaningless value for non-Bayer sensors. */ + if (!bayerFormat_) + return BayerFormat::Order::BGGR; + + if (!flipsAlterBayerOrder_) + return bayerFormat_->order; + + /* + * Apply the transform to the native (i.e. untransformed) Bayer order, + * using the rest of the Bayer format supplied by the caller. + */ + return bayerFormat_->transform(t).order; +} + +const ControlInfoMap &CameraSensorLegacy::controls() const +{ + return subdev_->controls(); +} + +ControlList CameraSensorLegacy::getControls(const std::vector &ids) +{ + return subdev_->getControls(ids); +} + +int CameraSensorLegacy::setControls(ControlList *ctrls) +{ + return subdev_->setControls(ctrls); +} + +int CameraSensorLegacy::setTestPatternMode(controls::draft::TestPatternModeEnum mode) +{ + if (testPatternMode_ == mode) + return 0; + + if (testPatternModes_.empty()) { + LOG(CameraSensor, Error) + << "Camera sensor does not support test pattern modes."; + return -EINVAL; + } + + return applyTestPatternMode(mode); +} + +int CameraSensorLegacy::applyTestPatternMode(controls::draft::TestPatternModeEnum mode) +{ + if (testPatternModes_.empty()) + return 0; + + auto it = std::find(testPatternModes_.begin(), testPatternModes_.end(), + mode); + if (it == testPatternModes_.end()) { + LOG(CameraSensor, Error) << "Unsupported test pattern mode " + << mode; + return -EINVAL; + } + + LOG(CameraSensor, Debug) << "Apply test pattern mode " << mode; + + int32_t index = staticProps_->testPatternModes.at(mode); + ControlList ctrls{ controls() }; + ctrls.set(V4L2_CID_TEST_PATTERN, index); + + int ret = setControls(&ctrls); + if (ret) + return ret; + + testPatternMode_ = mode; + + return 0; +} + +std::string CameraSensorLegacy::logPrefix() const +{ + return "'" + entity_->name() + "'"; +} + +REGISTER_CAMERA_SENSOR(CameraSensorLegacy) + +} /* namespace libcamera */ diff --git a/src/libcamera/sensor/meson.build b/src/libcamera/sensor/meson.build index 61234e950..f0d588977 100644 --- a/src/libcamera/sensor/meson.build +++ b/src/libcamera/sensor/meson.build @@ -2,5 +2,6 @@ libcamera_internal_sources += files([ 'camera_sensor.cpp', + 'camera_sensor_legacy.cpp', 'camera_sensor_properties.cpp', ]) From eb9a2b3a8d9fb38df2dd4c95d809fee5271977fc Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 23 Feb 2024 14:03:32 +0200 Subject: [PATCH 34/46] libcamera: camera_sensor: Sort factories by priority In order to support a default implementation for camera sensors when no better implementation matches, libcamera needs to try "specialized" implementations first and pick the default last. Make this possible by adding a priority value for factories. Newly registered factories are inserted in the factories list sorted by descending priority, and the default factory uses a negative priority to be inserted as the last element. This mechanism may be a bit overkill in the sense that there is no expected use cases for priorities other than trying the default last, but the implementation is simple and easy to understand. Signed-off-by: Laurent Pinchart Reviewed-by: Stefan Klug Reviewed-by: Jacopo Mondi Signed-off-by: Jacopo Mondi --- include/libcamera/internal/camera_sensor.h | 12 ++++--- src/libcamera/sensor/camera_sensor.cpp | 35 ++++++++++++++++--- src/libcamera/sensor/camera_sensor_legacy.cpp | 2 +- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index 7713aea02..8aafd82e6 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -78,12 +78,13 @@ class CameraSensor class CameraSensorFactoryBase { public: - CameraSensorFactoryBase(const char *name); + CameraSensorFactoryBase(const char *name, int priority); virtual ~CameraSensorFactoryBase() = default; static std::unique_ptr create(MediaEntity *entity); const std::string &name() const { return name_; } + int priority() const { return priority_; } private: LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorFactoryBase) @@ -96,14 +97,15 @@ class CameraSensorFactoryBase match(MediaEntity *entity) const = 0; std::string name_; + int priority_; }; template class CameraSensorFactory final : public CameraSensorFactoryBase { public: - CameraSensorFactory(const char *name) - : CameraSensorFactoryBase(name) + CameraSensorFactory(const char *name, int priority) + : CameraSensorFactoryBase(name, priority) { } @@ -115,7 +117,7 @@ class CameraSensorFactory final : public CameraSensorFactoryBase } }; -#define REGISTER_CAMERA_SENSOR(sensor) \ -static CameraSensorFactory global_##sensor##Factory{ #sensor }; +#define REGISTER_CAMERA_SENSOR(sensor, priority) \ +static CameraSensorFactory global_##sensor##Factory{ #sensor, priority }; } /* namespace libcamera */ diff --git a/src/libcamera/sensor/camera_sensor.cpp b/src/libcamera/sensor/camera_sensor.cpp index 951ebd2cc..54cf98b20 100644 --- a/src/libcamera/sensor/camera_sensor.cpp +++ b/src/libcamera/sensor/camera_sensor.cpp @@ -349,12 +349,13 @@ CameraSensor::~CameraSensor() = default; /** * \brief Construct a camera sensor factory base * \param[in] name The camera sensor factory name + * \param[in] priority Priority order for factory selection * * Creating an instance of the factory base registers it with the global list of * factories, accessible through the factories() function. */ -CameraSensorFactoryBase::CameraSensorFactoryBase(const char *name) - : name_(name) +CameraSensorFactoryBase::CameraSensorFactoryBase(const char *name, int priority) + : name_(name), priority_(priority) { registerFactory(this); } @@ -363,6 +364,12 @@ CameraSensorFactoryBase::CameraSensorFactoryBase(const char *name) * \brief Create an instance of the CameraSensor corresponding to a media entity * \param[in] entity The media entity on the source end of the sensor * + * When multiple factories match the same \a entity, this function selects the + * matching factory with the highest priority as specified to the + * REGISTER_CAMERA_SENSOR() macro at factory registration time. If multiple + * matching factories have the same highest priority value, which factory gets + * selected is undefined and may vary between runs. + * * \return A unique pointer to a new instance of the CameraSensor subclass * matching the entity, or a null pointer if no such factory exists */ @@ -399,8 +406,17 @@ std::unique_ptr CameraSensorFactoryBase::create(MediaEntity *entit * \return The name of the factory */ +/** + * \fn CameraSensorFactoryBase::priority() + * \brief Retrieve the priority value for the factory + * \return The priority value for the factory + */ + /** * \brief Retrieve the list of all camera sensor factories + * + * The factories are sorted in decreasing priority order. + * * \return The list of camera sensor factories */ std::vector &CameraSensorFactoryBase::factories() @@ -423,7 +439,12 @@ void CameraSensorFactoryBase::registerFactory(CameraSensorFactoryBase *factory) std::vector &factories = CameraSensorFactoryBase::factories(); - factories.push_back(factory); + auto pos = std::upper_bound(factories.begin(), factories.end(), factory, + [](const CameraSensorFactoryBase *value, + const CameraSensorFactoryBase *elem) { + return value->priority() > elem->priority(); + }); + factories.insert(pos, factory); } /** @@ -449,9 +470,10 @@ void CameraSensorFactoryBase::registerFactory(CameraSensorFactoryBase *factory) */ /** - * \def REGISTER_CAMERA_SENSOR(sensor) + * \def REGISTER_CAMERA_SENSOR(sensor, priority) * \brief Register a camera sensor type to the sensor factory * \param[in] sensor Class name of the CameraSensor derived class to register + * \param[in] priority Priority order for factory selection * * Register a CameraSensor subclass with the factory and make it available to * try and match sensors. The subclass needs to implement a static match @@ -469,6 +491,11 @@ void CameraSensorFactoryBase::registerFactory(CameraSensorFactoryBase *factory) * creation succeeded ; * - A non-zero error code if the entity matched and the creation failed ; or * - A zero error code if the entity didn't match. + * + * When multiple factories can support the same MediaEntity (as in the match() + * function of multiple factories returning true for the same entity), the \a + * priority argument selects which factory will be used. See + * CameraSensorFactoryBase::create() for more information. */ } /* namespace libcamera */ diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp index 68c945331..a9b15c038 100644 --- a/src/libcamera/sensor/camera_sensor_legacy.cpp +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp @@ -1010,6 +1010,6 @@ std::string CameraSensorLegacy::logPrefix() const return "'" + entity_->name() + "'"; } -REGISTER_CAMERA_SENSOR(CameraSensorLegacy) +REGISTER_CAMERA_SENSOR(CameraSensorLegacy, -100) } /* namespace libcamera */ From e01d430b678355f12f48c8335f9dd63b946b6b4e Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 23 Feb 2024 14:12:14 +0200 Subject: [PATCH 35/46] libcamera: Add CameraSensor implementation for raw V4L2 sensors Add a new CameraSensorRaw implementation of the CameraSensor interface tailored to devices that implement the new V4L2 raw camera sensors API. This new class duplicates code from the CameraSensorLegacy class. The two classes will be refactored to share code. Signed-off-by: Laurent Pinchart --- Changes since combined RFC: - Set factory priority explicitly - Set flipsAlterBayerOrder_ - Fix build warning due to missing default case in cfa switch - Check for read-only hblank using V4L2_CTRL_FLAG_READ_ONLY --- Documentation/Doxyfile-internal.in | 1 + src/libcamera/sensor/camera_sensor_raw.cpp | 1055 ++++++++++++++++++++ src/libcamera/sensor/meson.build | 1 + 3 files changed, 1057 insertions(+) create mode 100644 src/libcamera/sensor/camera_sensor_raw.cpp diff --git a/Documentation/Doxyfile-internal.in b/Documentation/Doxyfile-internal.in index b5ad7e7ff..5343bc2b1 100644 --- a/Documentation/Doxyfile-internal.in +++ b/Documentation/Doxyfile-internal.in @@ -26,6 +26,7 @@ EXCLUDE = @TOP_SRCDIR@/include/libcamera/base/span.h \ @TOP_SRCDIR@/src/libcamera/ipc_pipe_unixsocket.cpp \ @TOP_SRCDIR@/src/libcamera/pipeline/ \ @TOP_SRCDIR@/src/libcamera/sensor/camera_sensor_legacy.cpp \ + @TOP_SRCDIR@/src/libcamera/sensor/camera_sensor_raw.cpp \ @TOP_SRCDIR@/src/libcamera/tracepoints.cpp \ @TOP_BUILDDIR@/include/libcamera/internal/tracepoints.h \ @TOP_BUILDDIR@/include/libcamera/ipa/soft_ipa_interface.h \ diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp new file mode 100644 index 000000000..899f72335 --- /dev/null +++ b/src/libcamera/sensor/camera_sensor_raw.cpp @@ -0,0 +1,1055 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2024, Ideas on Board Oy. + * + * camera_sensor_raw.cpp - A raw camera sensor using the V4L2 streams API + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "libcamera/internal/bayer_format.h" +#include "libcamera/internal/camera_lens.h" +#include "libcamera/internal/camera_sensor.h" +#include "libcamera/internal/camera_sensor_properties.h" +#include "libcamera/internal/formats.h" +#include "libcamera/internal/media_device.h" +#include "libcamera/internal/sysfs.h" +#include "libcamera/internal/v4l2_subdevice.h" + +namespace libcamera { + +class BayerFormat; +class CameraLens; +class MediaEntity; +class SensorConfiguration; + +struct CameraSensorProperties; + +enum class Orientation; + +LOG_DECLARE_CATEGORY(CameraSensor) + +class CameraSensorRaw : public CameraSensor, protected Loggable +{ +public: + CameraSensorRaw(const MediaEntity *entity); + ~CameraSensorRaw(); + + static std::variant, int> + match(MediaEntity *entity); + + const std::string &model() const override { return model_; } + const std::string &id() const override { return id_; } + + const MediaEntity *entity() const override { return entity_; } + V4L2Subdevice *device() override { return subdev_.get(); } + + CameraLens *focusLens() override { return focusLens_.get(); } + + const std::vector &mbusCodes() const override { return mbusCodes_; } + std::vector sizes(unsigned int mbusCode) const override; + Size resolution() const override; + + V4L2SubdeviceFormat getFormat(const std::vector &mbusCodes, + const Size &size) const override; + int setFormat(V4L2SubdeviceFormat *format, + Transform transform = Transform::Identity) override; + int tryFormat(V4L2SubdeviceFormat *format) const override; + + int applyConfiguration(const SensorConfiguration &config, + Transform transform = Transform::Identity, + V4L2SubdeviceFormat *sensorFormat = nullptr) override; + + const ControlList &properties() const override { return properties_; } + int sensorInfo(IPACameraSensorInfo *info) const override; + Transform computeTransform(Orientation *orientation) const override; + BayerFormat::Order bayerOrder(Transform t) const override; + + const ControlInfoMap &controls() const override; + ControlList getControls(const std::vector &ids) override; + int setControls(ControlList *ctrls) override; + + const std::vector & + testPatternModes() const override { return testPatternModes_; } + int setTestPatternMode(controls::draft::TestPatternModeEnum mode) override; + +protected: + std::string logPrefix() const override; + +private: + LIBCAMERA_DISABLE_COPY(CameraSensorRaw) + + std::optional init(); + int initProperties(); + void initStaticProperties(); + void initTestPatternModes(); + int applyTestPatternMode(controls::draft::TestPatternModeEnum mode); + + const MediaEntity *entity_; + std::unique_ptr subdev_; + + struct Streams { + V4L2Subdevice::Stream sink; + V4L2Subdevice::Stream source; + }; + + struct { + Streams image; + std::optional edata; + } streams_; + + const CameraSensorProperties *staticProps_; + + std::string model_; + std::string id_; + + V4L2Subdevice::Formats formats_; + std::vector mbusCodes_; + std::vector sizes_; + std::vector testPatternModes_; + controls::draft::TestPatternModeEnum testPatternMode_; + + Size pixelArraySize_; + Rectangle activeArea_; + BayerFormat::Order cfaPattern_; + bool supportFlips_; + bool flipsAlterBayerOrder_; + Orientation mountingOrientation_; + + ControlList properties_; + + std::unique_ptr focusLens_; +}; + +/** + * \class CameraSensorRaw + * \brief A camera sensor based on V4L2 subdevices + * + * This class supports single-subdev sensors with a single source pad and one + * or two internal sink pads (for the image and embedded data streams). + */ + +CameraSensorRaw::CameraSensorRaw(const MediaEntity *entity) + : entity_(entity), staticProps_(nullptr), supportFlips_(false), + flipsAlterBayerOrder_(false), properties_(properties::properties) +{ +} + +CameraSensorRaw::~CameraSensorRaw() = default; + +std::variant, int> +CameraSensorRaw::match(MediaEntity *entity) +{ + /* Check the entity type. */ + if (entity->type() != MediaEntity::Type::V4L2Subdevice || + entity->function() != MEDIA_ENT_F_CAM_SENSOR) { + libcamera::LOG(CameraSensor, Debug) + << entity->name() << ": unsupported entity type (" + << utils::to_underlying(entity->type()) + << ") or function (" << utils::hex(entity->function()) << ")"; + return { 0 }; + } + + /* Count and check the number of pads. */ + static constexpr uint32_t kPadFlagsMask = MEDIA_PAD_FL_SINK + | MEDIA_PAD_FL_SOURCE + | MEDIA_PAD_FL_INTERNAL; + unsigned int numSinks = 0; + unsigned int numSources = 0; + + for (const MediaPad *pad : entity->pads()) { + switch (pad->flags() & kPadFlagsMask) { + case MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_INTERNAL: + numSinks++; + break; + + case MEDIA_PAD_FL_SOURCE: + numSources++; + break; + + default: + libcamera::LOG(CameraSensor, Debug) + << entity->name() << ": unsupported pad " << pad->index() + << " type " << utils::hex(pad->flags()); + return { 0 }; + } + } + + if (numSinks < 1 || numSinks > 2 || numSources != 1) { + libcamera::LOG(CameraSensor, Debug) + << entity->name() << ": unsupported number of sinks (" + << numSinks << ") or sources (" << numSources << ")"; + return { 0 }; + } + + /* + * The entity matches. Create the camera sensor and initialize it. The + * init() function will perform further match checks. + */ + std::unique_ptr sensor = + std::make_unique(entity); + + std::optional err = sensor->init(); + if (err) + return { *err }; + + return { std::move(sensor) }; +} + +std::optional CameraSensorRaw::init() +{ + /* Create and open the subdev. */ + subdev_ = std::make_unique(entity_); + int ret = subdev_->open(); + if (ret) + return { ret }; + + /* + * 1. Identify the pads. + */ + + /* + * First locate the source pad. The match() function guarantees there + * is one and only one source pad. + */ + unsigned int sourcePad = UINT_MAX; + + for (const MediaPad *pad : entity_->pads()) { + if (pad->flags() & MEDIA_PAD_FL_SOURCE) { + sourcePad = pad->index(); + break; + } + } + + /* + * Iterate over the routes to identify the streams on the source pad, + * and the internal sink pads. + */ + V4L2Subdevice::Routing routing = {}; + ret = subdev_->getRouting(&routing, V4L2Subdevice::TryFormat); + if (ret) + return { ret }; + + bool imageStreamFound = false; + + for (const V4L2Subdevice::Route &route : routing) { + if (route.source.pad != sourcePad) { + LOG(CameraSensor, Error) << "Invalid route " << route; + return { -EINVAL }; + } + + /* Identify the stream type based on the supported formats. */ + V4L2Subdevice::Formats formats = subdev_->formats(route.source); + + std::optional type; + + for (const auto &[code, sizes] : formats) { + const MediaBusFormatInfo &info = + MediaBusFormatInfo::info(code); + if (info.isValid()) { + type = info.type; + break; + } + } + + if (!type) { + LOG(CameraSensor, Warning) + << "No known format on pad " << route.source; + continue; + } + + switch (*type) { + case MediaBusFormatInfo::Type::Image: + if (imageStreamFound) { + LOG(CameraSensor, Error) + << "Multiple internal image streams (" + << streams_.image.sink << " and " + << route.sink << ")"; + return { -EINVAL }; + } + + imageStreamFound = true; + streams_.image.sink = route.sink; + streams_.image.source = route.source; + break; + + case MediaBusFormatInfo::Type::Metadata: + /* + * Skip metadata streams that are not sensor embedded + * data. The source stream reports a generic metadata + * format, check the sink stream for the exact format. + */ + formats = subdev_->formats(route.sink); + if (formats.size() != 1) + continue; + + if (MediaBusFormatInfo::info(formats.cbegin()->first).type != + MediaBusFormatInfo::Type::EmbeddedData) + continue; + + if (streams_.edata) { + LOG(CameraSensor, Error) + << "Multiple internal embedded data streams (" + << streams_.edata->sink << " and " + << route.sink << ")"; + return { -EINVAL }; + } + + streams_.edata = { route.sink, route.source }; + break; + + default: + break; + } + } + + if (!imageStreamFound) { + LOG(CameraSensor, Error) << "No image stream found"; + return { -EINVAL }; + } + + LOG(CameraSensor, Debug) + << "Found image stream " << streams_.image.sink + << " -> " << streams_.image.source; + + if (streams_.edata) + LOG(CameraSensor, Debug) + << "Found embedded data stream " << streams_.edata->sink + << " -> " << streams_.edata->source; + + /* + * 2. Enumerate and cache the media bus codes, sizes and colour filter + * array order for the image stream. + */ + + /* + * Get the native sensor CFA pattern. It is simpler to retrieve it from + * the internal image sink pad as it is guaranteed to expose a single + * format, and is not affected by flips. + */ + V4L2Subdevice::Formats formats = subdev_->formats(streams_.image.sink); + if (formats.size() != 1) { + LOG(CameraSensor, Error) + << "Image pad has " << formats.size() + << " formats, expected 1"; + return { -EINVAL }; + } + + uint32_t nativeFormat = formats.cbegin()->first; + const BayerFormat &bayerFormat = BayerFormat::fromMbusCode(nativeFormat); + if (!bayerFormat.isValid()) { + LOG(CameraSensor, Error) + << "Invalid native format " << nativeFormat; + return { 0 }; + } + + cfaPattern_ = bayerFormat.order; + + /* + * Retrieve and cache the media bus codes and sizes on the source image + * stream. + */ + formats_ = subdev_->formats(streams_.image.source); + if (formats_.empty()) { + LOG(CameraSensor, Error) << "No image format found"; + return { -EINVAL }; + } + + /* Populate and sort the media bus codes and the sizes. */ + for (const auto &[code, ranges] : formats_) { + /* Drop non-raw formats (in case we have a hybrid sensor). */ + const MediaBusFormatInfo &info = MediaBusFormatInfo::info(code); + if (info.colourEncoding != PixelFormatInfo::ColourEncodingRAW) + continue; + + mbusCodes_.push_back(code); + std::transform(ranges.begin(), ranges.end(), std::back_inserter(sizes_), + [](const SizeRange &range) { return range.max; }); + } + + if (mbusCodes_.empty()) { + LOG(CameraSensor, Debug) << "No raw image formats found"; + return { 0 }; + } + + std::sort(mbusCodes_.begin(), mbusCodes_.end()); + std::sort(sizes_.begin(), sizes_.end()); + + /* + * Remove duplicate sizes. There are no duplicate media bus codes as + * they are the keys in the formats map. + */ + auto last = std::unique(sizes_.begin(), sizes_.end()); + sizes_.erase(last, sizes_.end()); + + /* + * 3. Query selection rectangles. Retrieve properties, and verify that + * all the expected selection rectangles are supported. + */ + + Rectangle rect; + ret = subdev_->getSelection(streams_.image.sink, V4L2_SEL_TGT_CROP_BOUNDS, + &rect); + if (ret) { + LOG(CameraSensor, Error) << "No pixel array crop bounds"; + return { ret }; + } + + pixelArraySize_ = rect.size(); + + ret = subdev_->getSelection(streams_.image.sink, V4L2_SEL_TGT_CROP_DEFAULT, + &activeArea_); + if (ret) { + LOG(CameraSensor, Error) << "No pixel array crop default"; + return { ret }; + } + + ret = subdev_->getSelection(streams_.image.sink, V4L2_SEL_TGT_CROP, + &rect); + if (ret) { + LOG(CameraSensor, Error) << "No pixel array crop rectangle"; + return { ret }; + } + + /* + * 4. Verify that all required controls are present. + */ + + const ControlIdMap &controls = subdev_->controls().idmap(); + + static constexpr uint32_t mandatoryControls[] = { + V4L2_CID_ANALOGUE_GAIN, + V4L2_CID_CAMERA_ORIENTATION, + V4L2_CID_EXPOSURE, + V4L2_CID_HBLANK, + V4L2_CID_PIXEL_RATE, + V4L2_CID_VBLANK, + }; + + ret = 0; + + for (uint32_t ctrl : mandatoryControls) { + if (!controls.count(ctrl)) { + LOG(CameraSensor, Error) + << "Mandatory V4L2 control " << utils::hex(ctrl) + << " not available"; + ret = -EINVAL; + } + } + + if (ret) { + LOG(CameraSensor, Error) + << "The sensor kernel driver needs to be fixed"; + LOG(CameraSensor, Error) + << "See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information"; + return { ret }; + } + + /* + * Verify if sensor supports horizontal/vertical flips + * + * \todo Handle horizontal and vertical flips independently. + */ + const struct v4l2_query_ext_ctrl *hflipInfo = subdev_->controlInfo(V4L2_CID_HFLIP); + const struct v4l2_query_ext_ctrl *vflipInfo = subdev_->controlInfo(V4L2_CID_VFLIP); + if (hflipInfo && !(hflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY) && + vflipInfo && !(vflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) { + supportFlips_ = true; + + if (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT || + vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT) + flipsAlterBayerOrder_ = true; + } + + if (!supportFlips_) + LOG(CameraSensor, Debug) + << "Camera sensor does not support horizontal/vertical flip"; + + /* + * 5. Discover ancillary devices. + * + * \todo This code may be shared by different V4L2 sensor classes. + */ + for (MediaEntity *ancillary : entity_->ancillaryEntities()) { + switch (ancillary->function()) { + case MEDIA_ENT_F_LENS: + focusLens_ = std::make_unique(ancillary); + ret = focusLens_->init(); + if (ret) { + LOG(CameraSensor, Error) + << "Lens initialisation failed, lens disabled"; + focusLens_.reset(); + } + break; + + default: + LOG(CameraSensor, Warning) + << "Unsupported ancillary entity function " + << ancillary->function(); + break; + } + } + + /* + * 6. Initialize properties. + */ + + ret = initProperties(); + if (ret) + return { ret }; + + /* + * 7. Initialize controls. + */ + + /* + * Set HBLANK to the minimum to start with a well-defined line length, + * allowing IPA modules that do not modify HBLANK to use the sensor + * minimum line length in their calculations. + */ + const struct v4l2_query_ext_ctrl *hblankInfo = subdev_->controlInfo(V4L2_CID_HBLANK); + if (hblankInfo && !(hblankInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) { + ControlList ctrl(subdev_->controls()); + + ctrl.set(V4L2_CID_HBLANK, static_cast(hblankInfo->minimum)); + ret = subdev_->setControls(&ctrl); + if (ret) + return ret; + } + + ret = applyTestPatternMode(controls::draft::TestPatternModeEnum::TestPatternModeOff); + if (ret) + return { ret }; + + return {}; +} + +int CameraSensorRaw::initProperties() +{ + model_ = subdev_->model(); + properties_.set(properties::Model, utils::toAscii(model_)); + + /* Generate a unique ID for the sensor. */ + id_ = sysfs::firmwareNodePath(subdev_->devicePath()); + if (id_.empty()) { + LOG(CameraSensor, Error) << "Can't generate sensor ID"; + return -EINVAL; + } + + /* Initialize the static properties from the sensor database. */ + initStaticProperties(); + + /* Retrieve and register properties from the kernel interface. */ + const ControlInfoMap &controls = subdev_->controls(); + + const auto &orientation = controls.find(V4L2_CID_CAMERA_ORIENTATION); + if (orientation != controls.end()) { + int32_t v4l2Orientation = orientation->second.def().get(); + int32_t propertyValue; + + switch (v4l2Orientation) { + default: + LOG(CameraSensor, Warning) + << "Unsupported camera location " + << v4l2Orientation << ", setting to External"; + [[fallthrough]]; + case V4L2_CAMERA_ORIENTATION_EXTERNAL: + propertyValue = properties::CameraLocationExternal; + break; + case V4L2_CAMERA_ORIENTATION_FRONT: + propertyValue = properties::CameraLocationFront; + break; + case V4L2_CAMERA_ORIENTATION_BACK: + propertyValue = properties::CameraLocationBack; + break; + } + properties_.set(properties::Location, propertyValue); + } else { + LOG(CameraSensor, Warning) << "Failed to retrieve the camera location"; + } + + const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION); + if (rotationControl != controls.end()) { + int32_t propertyValue = rotationControl->second.def().get(); + + /* + * Cache the Transform associated with the camera mounting + * rotation for later use in computeTransform(). + */ + bool success; + mountingOrientation_ = orientationFromRotation(propertyValue, &success); + if (!success) { + LOG(CameraSensor, Warning) + << "Invalid rotation of " << propertyValue + << " degrees - ignoring"; + mountingOrientation_ = Orientation::Rotate0; + } + + properties_.set(properties::Rotation, propertyValue); + } else { + LOG(CameraSensor, Warning) + << "Rotation control not available, default to 0 degrees"; + properties_.set(properties::Rotation, 0); + mountingOrientation_ = Orientation::Rotate0; + } + + properties_.set(properties::PixelArraySize, pixelArraySize_); + properties_.set(properties::PixelArrayActiveAreas, { activeArea_ }); + + /* Color filter array pattern. */ + uint32_t cfa; + + switch (cfaPattern_) { + case BayerFormat::BGGR: + cfa = properties::draft::BGGR; + break; + case BayerFormat::GBRG: + cfa = properties::draft::GBRG; + break; + case BayerFormat::GRBG: + cfa = properties::draft::GRBG; + break; + case BayerFormat::RGGB: + cfa = properties::draft::RGGB; + break; + case BayerFormat::MONO: + default: + cfa = properties::draft::MONO; + break; + } + + properties_.set(properties::draft::ColorFilterArrangement, cfa); + + return 0; +} + +void CameraSensorRaw::initStaticProperties() +{ + staticProps_ = CameraSensorProperties::get(model_); + if (!staticProps_) + return; + + /* Register the properties retrieved from the sensor database. */ + properties_.set(properties::UnitCellSize, staticProps_->unitCellSize); + + initTestPatternModes(); +} + +void CameraSensorRaw::initTestPatternModes() +{ + const auto &v4l2TestPattern = controls().find(V4L2_CID_TEST_PATTERN); + if (v4l2TestPattern == controls().end()) { + LOG(CameraSensor, Debug) << "V4L2_CID_TEST_PATTERN is not supported"; + return; + } + + const auto &testPatternModes = staticProps_->testPatternModes; + if (testPatternModes.empty()) { + /* + * The camera sensor supports test patterns but we don't know + * how to map them so this should be fixed. + */ + LOG(CameraSensor, Debug) << "No static test pattern map for \'" + << model() << "\'"; + return; + } + + /* + * Create a map that associates the V4L2 control index to the test + * pattern mode by reversing the testPatternModes map provided by the + * camera sensor properties. This makes it easier to verify if the + * control index is supported in the below for loop that creates the + * list of supported test patterns. + */ + std::map indexToTestPatternMode; + for (const auto &it : testPatternModes) + indexToTestPatternMode[it.second] = it.first; + + for (const ControlValue &value : v4l2TestPattern->second.values()) { + const int32_t index = value.get(); + + const auto it = indexToTestPatternMode.find(index); + if (it == indexToTestPatternMode.end()) { + LOG(CameraSensor, Debug) + << "Test pattern mode " << index << " ignored"; + continue; + } + + testPatternModes_.push_back(it->second); + } +} + +std::vector CameraSensorRaw::sizes(unsigned int mbusCode) const +{ + std::vector sizes; + + const auto &format = formats_.find(mbusCode); + if (format == formats_.end()) + return sizes; + + const std::vector &ranges = format->second; + std::transform(ranges.begin(), ranges.end(), std::back_inserter(sizes), + [](const SizeRange &range) { return range.max; }); + + std::sort(sizes.begin(), sizes.end()); + + return sizes; +} + +Size CameraSensorRaw::resolution() const +{ + return std::min(sizes_.back(), activeArea_.size()); +} + +V4L2SubdeviceFormat +CameraSensorRaw::getFormat(const std::vector &mbusCodes, + const Size &size) const +{ + unsigned int desiredArea = size.width * size.height; + unsigned int bestArea = UINT_MAX; + float desiredRatio = static_cast(size.width) / size.height; + float bestRatio = FLT_MAX; + const Size *bestSize = nullptr; + uint32_t bestCode = 0; + + for (unsigned int code : mbusCodes) { + const auto formats = formats_.find(code); + if (formats == formats_.end()) + continue; + + for (const SizeRange &range : formats->second) { + const Size &sz = range.max; + + if (sz.width < size.width || sz.height < size.height) + continue; + + float ratio = static_cast(sz.width) / sz.height; + float ratioDiff = fabsf(ratio - desiredRatio); + unsigned int area = sz.width * sz.height; + unsigned int areaDiff = area - desiredArea; + + if (ratioDiff > bestRatio) + continue; + + if (ratioDiff < bestRatio || areaDiff < bestArea) { + bestRatio = ratioDiff; + bestArea = areaDiff; + bestSize = &sz; + bestCode = code; + } + } + } + + if (!bestSize) { + LOG(CameraSensor, Debug) << "No supported format or size found"; + return {}; + } + + V4L2SubdeviceFormat format{ + .code = bestCode, + .size = *bestSize, + .colorSpace = ColorSpace::Raw, + }; + + return format; +} + +int CameraSensorRaw::setFormat(V4L2SubdeviceFormat *format, Transform transform) +{ + /* Configure flips if the sensor supports that. */ + if (supportFlips_) { + ControlList flipCtrls(subdev_->controls()); + + flipCtrls.set(V4L2_CID_HFLIP, + static_cast(!!(transform & Transform::HFlip))); + flipCtrls.set(V4L2_CID_VFLIP, + static_cast(!!(transform & Transform::VFlip))); + + int ret = subdev_->setControls(&flipCtrls); + if (ret) + return ret; + } + + /* Apply format on the subdev. */ + int ret = subdev_->setFormat(streams_.image.source, format); + if (ret) + return ret; + + subdev_->updateControlInfo(); + return 0; +} + +int CameraSensorRaw::tryFormat(V4L2SubdeviceFormat *format) const +{ + return subdev_->setFormat(streams_.image.source, format, + V4L2Subdevice::Whence::TryFormat); +} + +int CameraSensorRaw::applyConfiguration(const SensorConfiguration &config, + Transform transform, + V4L2SubdeviceFormat *sensorFormat) +{ + if (!config.isValid()) { + LOG(CameraSensor, Error) << "Invalid sensor configuration"; + return -EINVAL; + } + + std::vector filteredCodes; + std::copy_if(mbusCodes_.begin(), mbusCodes_.end(), + std::back_inserter(filteredCodes), + [&config](unsigned int mbusCode) { + BayerFormat bayer = BayerFormat::fromMbusCode(mbusCode); + if (bayer.bitDepth == config.bitDepth) + return true; + return false; + }); + if (filteredCodes.empty()) { + LOG(CameraSensor, Error) + << "Cannot find any format with bit depth " + << config.bitDepth; + return -EINVAL; + } + + /* + * Compute the sensor's data frame size by applying the cropping + * rectangle, subsampling and output crop to the sensor's pixel array + * size. + * + * \todo The actual size computation is for now ignored and only the + * output size is considered. This implies that resolutions obtained + * with two different cropping/subsampling will look identical and + * only the first found one will be considered. + */ + V4L2SubdeviceFormat subdevFormat = {}; + for (unsigned int code : filteredCodes) { + for (const Size &size : sizes(code)) { + if (size.width != config.outputSize.width || + size.height != config.outputSize.height) + continue; + + subdevFormat.code = code; + subdevFormat.size = size; + break; + } + } + if (!subdevFormat.code) { + LOG(CameraSensor, Error) << "Invalid output size in sensor configuration"; + return -EINVAL; + } + + int ret = setFormat(&subdevFormat, transform); + if (ret) + return ret; + + /* + * Return to the caller the format actually applied to the sensor. + * This is relevant if transform has changed the bayer pattern order. + */ + if (sensorFormat) + *sensorFormat = subdevFormat; + + /* \todo Handle AnalogCrop. Most sensors do not support set_selection */ + /* \todo Handle scaling in the digital domain. */ + + return 0; +} + +int CameraSensorRaw::sensorInfo(IPACameraSensorInfo *info) const +{ + info->model = model(); + + /* + * The active area size is a static property, while the crop + * rectangle needs to be re-read as it depends on the sensor + * configuration. + */ + info->activeAreaSize = { activeArea_.width, activeArea_.height }; + + int ret = subdev_->getSelection(streams_.image.sink, V4L2_SEL_TGT_CROP, + &info->analogCrop); + if (ret) + return ret; + + /* + * IPACameraSensorInfo::analogCrop::x and IPACameraSensorInfo::analogCrop::y + * are defined relatively to the active pixel area, while V4L2's + * TGT_CROP target is defined in respect to the full pixel array. + * + * Compensate it by subtracting the active area offset. + */ + info->analogCrop.x -= activeArea_.x; + info->analogCrop.y -= activeArea_.y; + + /* The bit depth and image size depend on the currently applied format. */ + V4L2SubdeviceFormat format{}; + ret = subdev_->getFormat(streams_.image.source, &format); + if (ret) + return ret; + info->bitsPerPixel = MediaBusFormatInfo::info(format.code).bitsPerPixel; + info->outputSize = format.size; + + std::optional cfa = properties_.get(properties::draft::ColorFilterArrangement); + info->cfaPattern = cfa ? *cfa : properties::draft::RGB; + + /* + * Retrieve the pixel rate, line length and minimum/maximum frame + * duration through V4L2 controls. Support for the V4L2_CID_PIXEL_RATE, + * V4L2_CID_HBLANK and V4L2_CID_VBLANK controls is mandatory. + */ + ControlList ctrls = subdev_->getControls({ V4L2_CID_PIXEL_RATE, + V4L2_CID_HBLANK, + V4L2_CID_VBLANK }); + if (ctrls.empty()) { + LOG(CameraSensor, Error) + << "Failed to retrieve camera info controls"; + return -EINVAL; + } + + info->pixelRate = ctrls.get(V4L2_CID_PIXEL_RATE).get(); + + const ControlInfo hblank = ctrls.infoMap()->at(V4L2_CID_HBLANK); + info->minLineLength = info->outputSize.width + hblank.min().get(); + info->maxLineLength = info->outputSize.width + hblank.max().get(); + + const ControlInfo vblank = ctrls.infoMap()->at(V4L2_CID_VBLANK); + info->minFrameLength = info->outputSize.height + vblank.min().get(); + info->maxFrameLength = info->outputSize.height + vblank.max().get(); + + return 0; +} + +Transform CameraSensorRaw::computeTransform(Orientation *orientation) const +{ + /* + * If we cannot do any flips we cannot change the native camera mounting + * orientation. + */ + if (!supportFlips_) { + *orientation = mountingOrientation_; + return Transform::Identity; + } + + /* + * Now compute the required transform to obtain 'orientation' starting + * from the mounting rotation. + * + * As a note: + * orientation / mountingOrientation_ = transform + * mountingOrientation_ * transform = orientation + */ + Transform transform = *orientation / mountingOrientation_; + + /* + * If transform contains any Transpose we cannot do it, so adjust + * 'orientation' to report the image native orientation and return Identity. + */ + if (!!(transform & Transform::Transpose)) { + *orientation = mountingOrientation_; + return Transform::Identity; + } + + return transform; +} + +BayerFormat::Order CameraSensorRaw::bayerOrder(Transform t) const +{ + if (!flipsAlterBayerOrder_) + return cfaPattern_; + + /* + * Apply the transform to the native (i.e. untransformed) Bayer order, + * using the rest of the Bayer format supplied by the caller. + */ + BayerFormat format{ cfaPattern_, 8, BayerFormat::Packing::None }; + return format.transform(t).order; +} + +const ControlInfoMap &CameraSensorRaw::controls() const +{ + return subdev_->controls(); +} + +ControlList CameraSensorRaw::getControls(const std::vector &ids) +{ + return subdev_->getControls(ids); +} + +int CameraSensorRaw::setControls(ControlList *ctrls) +{ + return subdev_->setControls(ctrls); +} + +int CameraSensorRaw::setTestPatternMode(controls::draft::TestPatternModeEnum mode) +{ + if (testPatternMode_ == mode) + return 0; + + if (testPatternModes_.empty()) { + LOG(CameraSensor, Error) + << "Camera sensor does not support test pattern modes."; + return -EINVAL; + } + + return applyTestPatternMode(mode); +} + +int CameraSensorRaw::applyTestPatternMode(controls::draft::TestPatternModeEnum mode) +{ + if (testPatternModes_.empty()) + return 0; + + auto it = std::find(testPatternModes_.begin(), testPatternModes_.end(), + mode); + if (it == testPatternModes_.end()) { + LOG(CameraSensor, Error) << "Unsupported test pattern mode " + << mode; + return -EINVAL; + } + + LOG(CameraSensor, Debug) << "Apply test pattern mode " << mode; + + int32_t index = staticProps_->testPatternModes.at(mode); + ControlList ctrls{ controls() }; + ctrls.set(V4L2_CID_TEST_PATTERN, index); + + int ret = setControls(&ctrls); + if (ret) + return ret; + + testPatternMode_ = mode; + + return 0; +} + +std::string CameraSensorRaw::logPrefix() const +{ + return "'" + entity_->name() + "'"; +} + +REGISTER_CAMERA_SENSOR(CameraSensorRaw, 0) + +} /* namespace libcamera */ diff --git a/src/libcamera/sensor/meson.build b/src/libcamera/sensor/meson.build index f0d588977..dce74ed6a 100644 --- a/src/libcamera/sensor/meson.build +++ b/src/libcamera/sensor/meson.build @@ -4,4 +4,5 @@ libcamera_internal_sources += files([ 'camera_sensor.cpp', 'camera_sensor_legacy.cpp', 'camera_sensor_properties.cpp', + 'camera_sensor_raw.cpp', ]) From ab6846565ee86abcb70b5fdd1be5a40e6ebc31d4 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 29 Feb 2024 02:21:15 +0200 Subject: [PATCH 36/46] libcamera: camera_sensor: Add support for embedded data Some sensors support producing and transmitting embedded data over a stream separate from the image stream. Add support for this feature in the CameraSensor interface, and implement it for the CameraSensorRaw class. The CameraSensorLegacy uses the default stub implementation, as the corresponding kernel drivers don't support embedded data. Signed-off-by: Laurent Pinchart --- include/libcamera/internal/camera_sensor.h | 5 ++ src/libcamera/sensor/camera_sensor.cpp | 67 ++++++++++++++++++++ src/libcamera/sensor/camera_sensor_raw.cpp | 72 ++++++++++++++++++++++ 3 files changed, 144 insertions(+) diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index 8aafd82e6..61bf1d7ca 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -61,6 +61,11 @@ class CameraSensor Transform transform = Transform::Identity, V4L2SubdeviceFormat *sensorFormat = nullptr) = 0; + virtual V4L2Subdevice::Stream imageStream() const; + virtual std::optional embeddedDataStream() const; + virtual V4L2SubdeviceFormat embeddedDataFormat() const; + virtual int setEmbeddedDataEnabled(bool enable); + virtual const ControlList &properties() const = 0; virtual int sensorInfo(IPACameraSensorInfo *info) const = 0; virtual Transform computeTransform(Orientation *orientation) const = 0; diff --git a/src/libcamera/sensor/camera_sensor.cpp b/src/libcamera/sensor/camera_sensor.cpp index 54cf98b20..1217365b2 100644 --- a/src/libcamera/sensor/camera_sensor.cpp +++ b/src/libcamera/sensor/camera_sensor.cpp @@ -196,6 +196,73 @@ CameraSensor::~CameraSensor() = default; * error code otherwise */ +/** + * \brief Retrieve the image source stream + * + * Sensors that produce multiple streams do not guarantee that the image stream + * is always assigned number 0. This function allows callers to retrieve the + * image stream on the sensor's source pad, in order to configure the receiving + * side accordingly. + * + * \return The image source stream + */ +V4L2Subdevice::Stream CameraSensor::imageStream() const +{ + return { 0, 0 }; +} + +/** + * \brief Retrieve the embedded data source stream + * + * Some sensors produce embedded data in a stream separate from the image + * stream. This function indicates if the sensor supports this feature by + * returning the embedded data stream on the sensor's source pad if available, + * or an std::optional<> without a value otheriwse. + * + * \return The embedded data source stream + */ +std::optional CameraSensor::embeddedDataStream() const +{ + return {}; +} + +/** + * \brief Retrieve the format on the embedded data stream + * + * When an embedded data stream is available, this function returns the + * corresponding format on the sensor's source pad. The format may vary with + * the image stream format, and should therefore be retrieved after configuring + * the image stream. + * + * If the sensor doesn't support embedded data, this function returns a + * default-constructed format. + * + * \return The format on the embedded data stream + */ +V4L2SubdeviceFormat CameraSensor::embeddedDataFormat() const +{ + return {}; +} + +/** + * \brief Enable or disable the embedded data stream + * \param[in] enable True to enable the embedded data stream, false to disable it + * + * For sensors that support embedded data, this function enables or disables + * generation of embedded data. Some of such sensors always produce embedded + * data, in which case this function return -EISCONN if the caller attempts to + * disable embedded data. + * + * If the sensor doesn't support embedded data, this function returns 0 when \a + * enable is false, and -ENOSTR otherwise. + * + * \return 0 on success, or a negative error code otherwise + */ +int CameraSensor::setEmbeddedDataEnabled(bool enable) +{ + return enable ? -ENOSTR : 0; +} + /** * \fn CameraSensor::properties() * \brief Retrieve the camera sensor properties diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp index 899f72335..827f53ea5 100644 --- a/src/libcamera/sensor/camera_sensor_raw.cpp +++ b/src/libcamera/sensor/camera_sensor_raw.cpp @@ -84,6 +84,11 @@ class CameraSensorRaw : public CameraSensor, protected Loggable Transform transform = Transform::Identity, V4L2SubdeviceFormat *sensorFormat = nullptr) override; + V4L2Subdevice::Stream imageStream() const override; + std::optional embeddedDataStream() const override; + V4L2SubdeviceFormat embeddedDataFormat() const override; + int setEmbeddedDataEnabled(bool enable) override; + const ControlList &properties() const override { return properties_; } int sensorInfo(IPACameraSensorInfo *info) const override; Transform computeTransform(Orientation *orientation) const override; @@ -878,6 +883,73 @@ int CameraSensorRaw::applyConfiguration(const SensorConfiguration &config, return 0; } +V4L2Subdevice::Stream CameraSensorRaw::imageStream() const +{ + return streams_.image.source; +} + +std::optional CameraSensorRaw::embeddedDataStream() const +{ + if (!streams_.edata) + return {}; + + return { streams_.edata->source }; +} + +V4L2SubdeviceFormat CameraSensorRaw::embeddedDataFormat() const +{ + if (!streams_.edata) + return {}; + + V4L2SubdeviceFormat format; + int ret = subdev_->getFormat(streams_.edata->source, &format); + if (ret) + return {}; + + return format; +} + +int CameraSensorRaw::setEmbeddedDataEnabled(bool enable) +{ + if (!streams_.edata) + return enable ? -ENOSTR : 0; + + V4L2Subdevice::Routing routing{ 2 }; + + routing[0].sink = streams_.image.sink; + routing[0].source = streams_.image.source; + routing[0].flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE; + + routing[1].sink = streams_.edata->sink; + routing[1].source = streams_.edata->source; + routing[1].flags = enable ? V4L2_SUBDEV_ROUTE_FL_ACTIVE : 0; + + int ret = subdev_->setRouting(&routing); + if (ret) + return ret; + + /* + * Check if the embedded data stream has been enabled or disabled + * correctly. Assume at least one route will match the embedded data + * source stream, as there would be something seriously wrong + * otherwise. + */ + bool enabled = false; + + for (const V4L2Subdevice::Route &route : routing) { + if (route.source != streams_.edata->source) + continue; + + enabled = route.flags & V4L2_SUBDEV_ROUTE_FL_ACTIVE; + break; + } + + if (enabled != enable) + return enabled ? -EISCONN : -ENOSTR; + + return 0; +} + int CameraSensorRaw::sensorInfo(IPACameraSensorInfo *info) const { info->model = model(); From 70c86aa31642981385361e81412472df984dad74 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 29 Feb 2024 02:32:34 +0200 Subject: [PATCH 37/46] pipeline: raspberrypi: common: Configure sensor embedded data Now that the CameraSensor class implements support for embedded data, use the corresponding API to enable or disable the embedded data stream. This changes requires sensor kernel drivers that implement the upstream embedded data API based on V4L2 streams. As the API is under development and not merged in the upstream kernel yet, this breaks compatibility with the downstream Raspberry Pi kernel. Signed-off-by: Laurent Pinchart --- src/libcamera/pipeline/rpi/common/pipeline_base.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index d360c145d..0d2e59c7d 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -537,6 +537,18 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config) return ret; } + /* + * Configure embedded data on the sensor. Only check for errors when + * enabling embedded data, as some sensors don't support disabling it, + * and Unicam will simply drop the embedded data packets if we don't + * capture them. + */ + ret = data->sensor_->setEmbeddedDataEnabled(data->sensorMetadata_); + if (ret && data->sensorMetadata_) { + LOG(RPI, Error) << "Unable to enable embedded data: " << ret; + return ret; + } + /* * Platform specific internal stream configuration. This also assigns * external streams which get configured below. From 3a1cd60d48a9ac6c95ed6545b999f157cd0d0a64 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 1 Mar 2024 18:45:29 +0200 Subject: [PATCH 38/46] pipeline: raspberrypi: vc4: Use operator<<(V4L2VideoFormat) Use the stream formatting operator for V4L2VideoFormat instead of calling .toString() manually. As the .toString() member function is a wrapper around the stream formatting operator, this makes the code slightly more efficient. Signed-off-by: Laurent Pinchart --- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index 4d184674b..170a1f120 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -742,7 +742,7 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi format.fourcc = V4L2PixelFormat(V4L2_META_FMT_SENSOR_DATA); format.planes[0].size = embeddedFormat.size.width * embeddedFormat.size.height; - LOG(RPI, Debug) << "Setting embedded data format " << format.toString(); + LOG(RPI, Debug) << "Setting embedded data format " << format; ret = unicam_[Unicam::Embedded].dev()->setFormat(&format); if (ret) { LOG(RPI, Error) << "Failed to set format on Unicam embedded: " From e19432ede28247d571515dda1029de036dc578cb Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 29 Feb 2024 17:14:42 +0200 Subject: [PATCH 39/46] pipeline: raspberrypi: vc4: Reorganize platformConfigure() The Vc4CameraData::platformConfigure() function configures inicam and the ISP. The corresponding configuration steps are interleaved, making it more difficult to read the code and follow the flow. Reorganize the function to improve readability. Signed-off-by: Laurent Pinchart --- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 65 ++++++++++++++------------ 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index 170a1f120..1303004b2 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -589,9 +589,9 @@ int Vc4CameraData::platformPipelineConfigure(const std::unique_ptr & int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfig) { - const std::vector &rawStreams = rpiConfig->rawStreams_; - const std::vector &outStreams = rpiConfig->outStreams_; - int ret; + /* + * 1. Configure the Unicam video devices. + */ V4L2VideoDevice *unicam = unicam_[Unicam::Image].dev(); V4L2DeviceFormat unicamFormat; @@ -600,6 +600,8 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi * See which streams are requested, and route the user * StreamConfiguration appropriately. */ + const std::vector &rawStreams = rpiConfig->rawStreams_; + if (!rawStreams.empty()) { rawStreams[0].cfg->setStream(&unicam_[Unicam::Image]); unicam_[Unicam::Image].setFlags(StreamFlag::External); @@ -611,11 +613,7 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi BayerFormat::Packing::CSI2); } - ret = unicam->setFormat(&unicamFormat); - if (ret) - return ret; - - ret = isp_[Isp::Input].dev()->setFormat(&unicamFormat); + int ret = unicam->setFormat(&unicamFormat); if (ret) return ret; @@ -623,7 +621,37 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi << " - Selected sensor format: " << rpiConfig->sensorFormat_ << " - Selected unicam format: " << unicamFormat; + /* + * Configure the Unicam embedded data output format only if the sensor + * supports it. + */ + if (sensorMetadata_) { + V4L2SubdeviceFormat embeddedFormat; + + sensor_->device()->getFormat(1, &embeddedFormat); + V4L2DeviceFormat format{}; + format.fourcc = V4L2PixelFormat(V4L2_META_FMT_SENSOR_DATA); + format.planes[0].size = embeddedFormat.size.width * embeddedFormat.size.height; + + LOG(RPI, Debug) << "Setting embedded data format " << format; + ret = unicam_[Unicam::Embedded].dev()->setFormat(&format); + if (ret) { + LOG(RPI, Error) << "Failed to set format on Unicam embedded: " + << format; + return ret; + } + } + + /* + * 2. Configure the ISP. + */ + + ret = isp_[Isp::Input].dev()->setFormat(&unicamFormat); + if (ret) + return ret; + /* Use a sensible small default size if no output streams are configured. */ + const std::vector &outStreams = rpiConfig->outStreams_; Size maxSize = outStreams.empty() ? Size(320, 240) : outStreams[0].cfg->size; V4L2DeviceFormat format; @@ -730,27 +758,6 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi ispOutputTotal_++; - /* - * Configure the Unicam embedded data output format only if the sensor - * supports it. - */ - if (sensorMetadata_) { - V4L2SubdeviceFormat embeddedFormat; - - sensor_->device()->getFormat(1, &embeddedFormat); - format = {}; - format.fourcc = V4L2PixelFormat(V4L2_META_FMT_SENSOR_DATA); - format.planes[0].size = embeddedFormat.size.width * embeddedFormat.size.height; - - LOG(RPI, Debug) << "Setting embedded data format " << format; - ret = unicam_[Unicam::Embedded].dev()->setFormat(&format); - if (ret) { - LOG(RPI, Error) << "Failed to set format on Unicam embedded: " - << format; - return ret; - } - } - /* Figure out the smallest selection the ISP will allow. */ Rectangle testCrop(0, 0, 1, 1); isp_[Isp::Input].dev()->setSelection(V4L2_SEL_TGT_CROP, &testCrop); From 63793118c9557dff4b83cdd1963f4595c603cfb4 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 29 Feb 2024 02:32:34 +0200 Subject: [PATCH 40/46] pipeline: raspberrypi: vc4: Use the CameraSensor embedded data API Now that the CameraSensor class implements support for embedded data, use the corresponding API instead of retrieving the embedded data format from the subdev manually. This changes requires sensor kernel drivers that implement the upstream embedded data API based on V4L2 streams. As the API is under development and not merged in the upstream kernel yet, this breaks compatibility with the downstream Raspberry Pi kernel. Signed-off-by: Laurent Pinchart --- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index 1303004b2..020e0cd52 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -626,9 +626,7 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi * supports it. */ if (sensorMetadata_) { - V4L2SubdeviceFormat embeddedFormat; - - sensor_->device()->getFormat(1, &embeddedFormat); + V4L2SubdeviceFormat embeddedFormat = sensor_->embeddedDataFormat(); V4L2DeviceFormat format{}; format.fourcc = V4L2PixelFormat(V4L2_META_FMT_SENSOR_DATA); format.planes[0].size = embeddedFormat.size.width * embeddedFormat.size.height; From 16b304824468c00623082080c483ae5cf9e4bfa2 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 1 Aug 2023 21:50:26 +0300 Subject: [PATCH 41/46] pipeline: raspberrypi: vc4: Unconditionally create embedded data stream The mainline Unicam driver unconditionally creates the embedded data video device. Create the corresponding stream unconditionally. Drop the warning in case of mismatch between Unicam and the CamHelper, as this becomes a normal situation when the sensor doesn't support emebedded data. Signed-off-by: Laurent Pinchart --- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index 020e0cd52..d685ad769 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -357,24 +357,19 @@ int PipelineHandlerVc4::platformRegister(std::unique_ptr &camer return -ENOMEM; MediaEntity *unicamImage = unicam->getEntityByName("unicam-image"); + MediaEntity *unicamEmbedded = unicam->getEntityByName("unicam-embedded"); MediaEntity *ispOutput0 = isp->getEntityByName("bcm2835-isp0-output0"); MediaEntity *ispCapture1 = isp->getEntityByName("bcm2835-isp0-capture1"); MediaEntity *ispCapture2 = isp->getEntityByName("bcm2835-isp0-capture2"); MediaEntity *ispCapture3 = isp->getEntityByName("bcm2835-isp0-capture3"); - if (!unicamImage || !ispOutput0 || !ispCapture1 || !ispCapture2 || !ispCapture3) + if (!unicamImage || !unicamEmbedded || + !ispOutput0 || !ispCapture1 || !ispCapture2 || !ispCapture3) return -ENOENT; - /* Locate and open the unicam video streams. */ + /* Create the unicam video streams. */ data->unicam_[Unicam::Image] = RPi::Stream("Unicam Image", unicamImage); - - /* An embedded data node will not be present if the sensor does not support it. */ - MediaEntity *unicamEmbedded = unicam->getEntityByName("unicam-embedded"); - if (unicamEmbedded) { - data->unicam_[Unicam::Embedded] = RPi::Stream("Unicam Embedded", unicamEmbedded); - data->unicam_[Unicam::Embedded].dev()->bufferReady.connect(data, - &Vc4CameraData::unicamBufferDequeue); - } + data->unicam_[Unicam::Embedded] = RPi::Stream("Unicam Embedded", unicamEmbedded); /* Tag the ISP input stream as an import stream. */ data->isp_[Isp::Input] = RPi::Stream("ISP Input", ispOutput0, StreamFlag::ImportOnly); @@ -384,18 +379,15 @@ int PipelineHandlerVc4::platformRegister(std::unique_ptr &camer /* Wire up all the buffer connections. */ data->unicam_[Unicam::Image].dev()->bufferReady.connect(data, &Vc4CameraData::unicamBufferDequeue); + if (data->sensorMetadata_) + data->unicam_[Unicam::Embedded].dev()->bufferReady.connect(data, + &Vc4CameraData::unicamBufferDequeue); + data->isp_[Isp::Input].dev()->bufferReady.connect(data, &Vc4CameraData::ispInputDequeue); data->isp_[Isp::Output0].dev()->bufferReady.connect(data, &Vc4CameraData::ispOutputDequeue); data->isp_[Isp::Output1].dev()->bufferReady.connect(data, &Vc4CameraData::ispOutputDequeue); data->isp_[Isp::Stats].dev()->bufferReady.connect(data, &Vc4CameraData::ispOutputDequeue); - if (data->sensorMetadata_ ^ !!data->unicam_[Unicam::Embedded].dev()) { - LOG(RPI, Warning) << "Mismatch between Unicam and CamHelper for embedded data usage!"; - data->sensorMetadata_ = false; - if (data->unicam_[Unicam::Embedded].dev()) - data->unicam_[Unicam::Embedded].dev()->bufferReady.disconnect(); - } - /* * Open all Unicam and ISP streams. The exception is the embedded data * stream, which only gets opened below if the IPA reports that the sensor From 25f6f7943016d8128627d6b421a9aa49d62f622e Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 1 Aug 2023 21:50:26 +0300 Subject: [PATCH 42/46] pipeline: raspberrypi: vc4: Configure format on Unicam subdev The mainline Unicam driver creates a V4L2 subdevice, which needs to be configured. Create and open a corresponding V4L2Subdevice instance and configure the format on its sink pad in the platformConfigure() function. Presence of the Unicam subdev is required, to avoid extra complexity. This drops support for the driver from the Raspberry Pi downstream kernel. Users are expected to update their kernel to use the mainline Unicam driver. Signed-off-by: Laurent Pinchart --- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 78 ++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 10 deletions(-) diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index d685ad769..0b5b1e397 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -5,6 +5,8 @@ * Pipeline handler for VC4-based Raspberry Pi devices */ +#include + #include #include #include @@ -13,6 +15,7 @@ #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/dma_buf_allocator.h" +#include "libcamera/internal/v4l2_subdevice.h" #include "../common/pipeline_base.h" #include "../common/rpi_stream.h" @@ -31,6 +34,10 @@ namespace { enum class Unicam : unsigned int { Image, Embedded }; enum class Isp : unsigned int { Input, Output0, Output1, Stats }; +static constexpr unsigned int kUnicamSinkPad = 0; +static constexpr unsigned int kUnicamSourceImagePad = 1; +static constexpr unsigned int kUnicamSourceMetadataPad = 2; + } /* namespace */ class Vc4CameraData final : public RPi::CameraData @@ -81,6 +88,8 @@ class Vc4CameraData final : public RPi::CameraData void setIspControls(const ControlList &controls); void setCameraTimeout(uint32_t maxFrameLengthMs); + std::unique_ptr unicamSubdev_; + /* Array of Unicam and ISP device streams and associated buffers/streams. */ RPi::Device unicam_; RPi::Device isp_; @@ -356,6 +365,7 @@ int PipelineHandlerVc4::platformRegister(std::unique_ptr &camer if (!data->dmaHeap_.isValid()) return -ENOMEM; + MediaEntity *unicamSubdev = unicam->getEntityByName("unicam"); MediaEntity *unicamImage = unicam->getEntityByName("unicam-image"); MediaEntity *unicamEmbedded = unicam->getEntityByName("unicam-embedded"); MediaEntity *ispOutput0 = isp->getEntityByName("bcm2835-isp0-output0"); @@ -367,7 +377,13 @@ int PipelineHandlerVc4::platformRegister(std::unique_ptr &camer !ispOutput0 || !ispCapture1 || !ispCapture2 || !ispCapture3) return -ENOENT; - /* Create the unicam video streams. */ + if (!unicamSubdev) { + LOG(RPI, Error) << "Downstream Unicam driver not supported, please update your kernel!"; + return -EINVAL; + } + + /* Create the unicam subdev and video streams. */ + data->unicamSubdev_ = std::make_unique(unicamSubdev); data->unicam_[Unicam::Image] = RPi::Stream("Unicam Image", unicamImage); data->unicam_[Unicam::Embedded] = RPi::Stream("Unicam Embedded", unicamEmbedded); @@ -396,6 +412,10 @@ int PipelineHandlerVc4::platformRegister(std::unique_ptr &camer * The below grouping is just for convenience so that we can easily * iterate over all streams in one go. */ + int ret = data->unicamSubdev_->open(); + if (ret < 0) + return ret; + data->streams_.push_back(&data->unicam_[Unicam::Image]); if (data->sensorMetadata_) data->streams_.push_back(&data->unicam_[Unicam::Embedded]); @@ -404,16 +424,11 @@ int PipelineHandlerVc4::platformRegister(std::unique_ptr &camer data->streams_.push_back(&stream); for (auto stream : data->streams_) { - int ret = stream->dev()->open(); + ret = stream->dev()->open(); if (ret) return ret; } - if (!data->unicam_[Unicam::Image].dev()->caps().hasMediaController()) { - LOG(RPI, Error) << "Unicam driver does not use the MediaController, please update your kernel!"; - return -EINVAL; - } - /* Write up all the IPA connections. */ data->ipa_->processStatsComplete.connect(data, &Vc4CameraData::processStatsComplete); data->ipa_->prepareIspComplete.connect(data, &Vc4CameraData::prepareIspComplete); @@ -582,7 +597,50 @@ int Vc4CameraData::platformPipelineConfigure(const std::unique_ptr & int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfig) { /* - * 1. Configure the Unicam video devices. + * 1. Configure the Unicam subdev. + * + * Start by setting up routes, and then set the formats on the sink pad + * streams. They will be automatically propagated to the source pads by + * the kernel. + */ + + const V4L2Subdevice::Stream imageStream{ + kUnicamSinkPad, + sensor_->imageStream().stream + }; + const V4L2Subdevice::Stream embeddedDataStream{ + kUnicamSinkPad, + sensor_->embeddedDataStream().value_or(V4L2Subdevice::Stream{}).stream + }; + + V4L2Subdevice::Routing routing; + + routing.emplace_back(imageStream, V4L2Subdevice::Stream{ kUnicamSourceImagePad, 0 }, + V4L2_SUBDEV_ROUTE_FL_ACTIVE); + + if (sensorMetadata_) + routing.emplace_back(embeddedDataStream, + V4L2Subdevice::Stream{ kUnicamSourceMetadataPad, 0 }, + V4L2_SUBDEV_ROUTE_FL_ACTIVE); + + int ret = unicamSubdev_->setRouting(&routing); + if (ret) + return ret; + + V4L2SubdeviceFormat subdevFormat = rpiConfig->sensorFormat_; + ret = unicamSubdev_->setFormat(imageStream, &subdevFormat); + if (ret) + return ret; + + if (sensorMetadata_) { + subdevFormat = sensor_->embeddedDataFormat(); + ret = unicamSubdev_->setFormat(embeddedDataStream, &subdevFormat); + if (ret) + return ret; + } + + /* + * 2. Configure the Unicam video devices. */ V4L2VideoDevice *unicam = unicam_[Unicam::Image].dev(); @@ -605,7 +663,7 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi BayerFormat::Packing::CSI2); } - int ret = unicam->setFormat(&unicamFormat); + ret = unicam->setFormat(&unicamFormat); if (ret) return ret; @@ -633,7 +691,7 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi } /* - * 2. Configure the ISP. + * 3. Configure the ISP. */ ret = isp_[Isp::Input].dev()->setFormat(&unicamFormat); From 376b68ac673dc68f1e55e422fd5452127dbb393f Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 1 Mar 2024 18:45:29 +0200 Subject: [PATCH 43/46] pipeline: raspberrypi: vc4: Fix configuration of the embedded data node The Unicam embedded data video device suffers from two issues with the upstream driver: - The driver uses the generic metadata V4L2_META_FMT_GENERIC_* formats, instead of the downstream V4L2_META_FMT_SENSOR_DATA. - The driver requires the width and height of the embedded data stream to be configured. Fix them both. Signed-off-by: Laurent Pinchart --- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index 0b5b1e397..cebb46750 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -676,10 +676,25 @@ int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfi * supports it. */ if (sensorMetadata_) { + static const std::map metaFormats{ + { MEDIA_BUS_FMT_META_8, V4L2PixelFormat(V4L2_META_FMT_GENERIC_8) }, + { MEDIA_BUS_FMT_META_10, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_10) }, + { MEDIA_BUS_FMT_META_12, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_12) }, + { MEDIA_BUS_FMT_META_14, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_14) }, + }; + V4L2SubdeviceFormat embeddedFormat = sensor_->embeddedDataFormat(); + const auto metaFormat = metaFormats.find(embeddedFormat.code); + if (metaFormat == metaFormats.end()) { + LOG(RPI, Error) + << "Unsupported metadata format " + << utils::hex(embeddedFormat.code, 4); + return -EINVAL; + } + V4L2DeviceFormat format{}; - format.fourcc = V4L2PixelFormat(V4L2_META_FMT_SENSOR_DATA); - format.planes[0].size = embeddedFormat.size.width * embeddedFormat.size.height; + format.fourcc = metaFormat->second; + format.size = embeddedFormat.size; LOG(RPI, Debug) << "Setting embedded data format " << format; ret = unicam_[Unicam::Embedded].dev()->setFormat(&format); From bae71ceb9ddee5f96a63a93eb5c4f95c2f1853c8 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 1 Mar 2024 21:22:25 +0200 Subject: [PATCH 44/46] include: linux: Drop V4L2_META_FMT_SENSOR_DATA The V4L2_META_FMT_SENSOR_DATA format was used by the Raspberry Pi VC4 pipeline handler and the downstream Unicam kernel driver. Now that they have both moved to an upstream API, drop the format definition from the kernel header. This brings videodev2.h closer to the mainline kernel. Signed-off-by: Laurent Pinchart --- include/linux/videodev2.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 1168f6ff4..237a29cec 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -823,7 +823,6 @@ struct v4l2_pix_format { #define V4L2_META_FMT_UVC v4l2_fourcc('U', 'V', 'C', 'H') /* UVC Payload Header metadata */ #define V4L2_META_FMT_D4XX v4l2_fourcc('D', '4', 'X', 'X') /* D4XX Payload Header metadata */ #define V4L2_META_FMT_VIVID v4l2_fourcc('V', 'I', 'V', 'D') /* Vivid Metadata */ -#define V4L2_META_FMT_SENSOR_DATA v4l2_fourcc('S', 'E', 'N', 'S') /* Sensor Ancillary metadata */ #define V4L2_META_FMT_BCM2835_ISP_STATS v4l2_fourcc('B', 'S', 'T', 'A') /* BCM2835 ISP image statistics output */ /* Vendor specific - used for RK_ISP1 camera sub-system */ From c67f1d1a6cff2c70252c13347bfb8acb91705ab5 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Mon, 29 Jan 2024 15:44:15 +0200 Subject: [PATCH 45/46] [HACK]: ipa: rpi: cam_helper_imx219: Enable embedded data Enable embedded data usage with the IMX219 for testing purpose. Signed-off-by: Laurent Pinchart --- src/ipa/rpi/cam_helper/cam_helper_imx219.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx219.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx219.cpp index 91461f7af..c6b56442a 100644 --- a/src/ipa/rpi/cam_helper/cam_helper_imx219.cpp +++ b/src/ipa/rpi/cam_helper/cam_helper_imx219.cpp @@ -14,7 +14,7 @@ * We have observed that the imx219 embedded data stream randomly returns junk * register values. Do not rely on embedded data until this has been resolved. */ -#define ENABLE_EMBEDDED_DATA 0 +#define ENABLE_EMBEDDED_DATA 1 #include "cam_helper.h" #if ENABLE_EMBEDDED_DATA From 07e84f2cf75f528f775a9fbd6997cff94a156d01 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Wed, 13 Mar 2024 11:55:49 +0000 Subject: [PATCH 46/46] pipeline: rpi: pisp: Add support for streams api Also update the entity names to match the upstream driver. Signed-off-by: Naushir Patuck Signed-off-by: Jacopo Mondi --- src/libcamera/pipeline/rpi/pisp/pisp.cpp | 81 ++++++++++++++++-------- 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp index f822c9f3d..6cbb93d2d 100644 --- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp +++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp @@ -856,9 +856,9 @@ bool PipelineHandlerPiSP::match(DeviceEnumerator *enumerator) */ for (unsigned int i = 0; i < numCfeDevices; i++) { DeviceMatch cfe("rp1-cfe"); - cfe.add("rp1-cfe-fe_image0"); - cfe.add("rp1-cfe-fe_stats"); - cfe.add("rp1-cfe-fe_config"); + cfe.add("rp1-cfe-fe-image0"); + cfe.add("rp1-cfe-fe-stats"); + cfe.add("rp1-cfe-fe-config"); MediaDevice *cfeDevice = acquireMediaDevice(enumerator, cfe); if (!cfeDevice) { @@ -1045,10 +1045,10 @@ int PipelineHandlerPiSP::platformRegister(std::unique_ptr &came PiSPCameraData *data = static_cast(cameraData.get()); int ret; - MediaEntity *cfeImage = cfe->getEntityByName("rp1-cfe-fe_image0"); - MediaEntity *cfeEmbedded = cfe->getEntityByName("rp1-cfe-embedded"); - MediaEntity *cfeStats = cfe->getEntityByName("rp1-cfe-fe_stats"); - MediaEntity *cfeConfig = cfe->getEntityByName("rp1-cfe-fe_config"); + MediaEntity *cfeImage = cfe->getEntityByName("rp1-cfe-fe-image0"); + MediaEntity *cfeEmbedded = cfe->getEntityByName("rp1-cfe-csi2-ch1"); + MediaEntity *cfeStats = cfe->getEntityByName("rp1-cfe-fe-stats"); + MediaEntity *cfeConfig = cfe->getEntityByName("rp1-cfe-fe-config"); MediaEntity *ispInput = isp->getEntityByName("pispbe-input"); MediaEntity *IpaPrepare = isp->getEntityByName("pispbe-config"); MediaEntity *ispOutput0 = isp->getEntityByName("pispbe-output0"); @@ -1396,7 +1396,6 @@ int PiSPCameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConf const std::vector &rawStreams = rpiConfig->rawStreams_; const std::vector &outStreams = rpiConfig->outStreams_; int ret; - V4L2VideoDevice *cfe = cfe_[Cfe::Output0].dev(); V4L2DeviceFormat cfeFormat; @@ -1577,7 +1576,7 @@ int PiSPCameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConf ret = cfe_[Cfe::Stats].dev()->setFormat(&format); if (ret) { LOG(RPI, Error) << "Failed to set format on CFE stats stream: " - << format.toString(); + << format; return ret; } @@ -1587,7 +1586,7 @@ int PiSPCameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConf ret = cfe_[Cfe::Config].dev()->setFormat(&format); if (ret) { LOG(RPI, Error) << "Failed to set format on CFE config stream: " - << format.toString(); + << format; return ret; } @@ -1595,14 +1594,28 @@ int PiSPCameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConf * Configure the CFE embedded data output format only if the sensor * supports it. */ - V4L2SubdeviceFormat embeddedFormat; + V4L2SubdeviceFormat embeddedFormat = sensor_->embeddedDataFormat(); if (sensorMetadata_) { - sensor_->device()->getFormat(1, &embeddedFormat); + static const std::map metaFormats{ + { MEDIA_BUS_FMT_META_8, V4L2PixelFormat(V4L2_META_FMT_GENERIC_8) }, + { MEDIA_BUS_FMT_META_10, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_10) }, + { MEDIA_BUS_FMT_META_12, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_12) }, + { MEDIA_BUS_FMT_META_14, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_14) }, + }; + + const auto metaFormat = metaFormats.find(embeddedFormat.code); + if (metaFormat == metaFormats.end()) { + LOG(RPI, Error) + << "Unsupported metadata format " + << utils::hex(embeddedFormat.code, 4); + return -EINVAL; + } + format = {}; - format.fourcc = V4L2PixelFormat(V4L2_META_FMT_SENSOR_DATA); - format.planes[0].size = embeddedFormat.size.width * embeddedFormat.size.height; + format.fourcc = metaFormat->second; + format.size = embeddedFormat.size; - LOG(RPI, Debug) << "Setting embedded data format " << format.toString(); + LOG(RPI, Debug) << "Setting embedded data format " << format; ret = cfe_[Cfe::Embedded].dev()->setFormat(&format); if (ret) { LOG(RPI, Error) << "Failed to set format on CFE embedded: " @@ -2109,9 +2122,8 @@ int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat, int ret = 0; constexpr unsigned int csiVideoSinkPad = 0; - constexpr unsigned int csiMetaSinkPad = 1; - constexpr unsigned int csiVideoSourcePad = 4; - constexpr unsigned int csiMetaSourcePad = 5; + constexpr unsigned int csiVideoSourcePad = 1; + constexpr unsigned int csiMetaSourcePad = 2; constexpr unsigned int feVideoSinkPad = 0; constexpr unsigned int feConfigSinkPad = 1; @@ -2123,7 +2135,7 @@ int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat, const MediaEntity *fe = feSubdev_->entity(); for (MediaLink *link : csi2->pads()[csiVideoSourcePad]->links()) { - if (link->sink()->entity()->name() == "rp1-cfe-csi2_ch0") + if (link->sink()->entity()->name() == "rp1-cfe-csi2-ch0") link->setEnabled(false); else if (link->sink()->entity()->name() == "pisp-fe") link->setEnabled(true); @@ -2136,16 +2148,35 @@ int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat, fe->pads()[feVideo1SourcePad]->links()[0]->setEnabled(false); fe->pads()[feStatsSourcePad]->links()[0]->setEnabled(true); - ret = csi2Subdev_->setFormat(csiVideoSinkPad, &sensorFormat); + const V4L2Subdevice::Stream imageStream{ + csiVideoSinkPad, + sensor_->imageStream().stream + }; + const V4L2Subdevice::Stream embeddedDataStream{ + csiVideoSinkPad, + sensor_->embeddedDataStream().value_or(V4L2Subdevice::Stream{}).stream + }; + + V4L2Subdevice::Routing routing; + routing.emplace_back(imageStream, V4L2Subdevice::Stream{ csiVideoSourcePad, 0 }, + V4L2_SUBDEV_ROUTE_FL_ACTIVE); + + if (sensorMetadata_) + routing.emplace_back(embeddedDataStream, + V4L2Subdevice::Stream{ csiMetaSourcePad, 0 }, + V4L2_SUBDEV_ROUTE_FL_ACTIVE); + + ret = csi2Subdev_->setRouting(&routing); if (ret) return ret; - if (sensorMetadata_) { - ret = csi2Subdev_->setFormat(csiMetaSinkPad, &embeddedFormat); - if (ret) - return ret; - ret = csi2Subdev_->setFormat(csiMetaSourcePad, &embeddedFormat); + ret = csi2Subdev_->setFormat(imageStream, &sensorFormat); + if (ret) + return ret; + + if (sensorMetadata_) { + ret = csi2Subdev_->setFormat(embeddedDataStream, &embeddedFormat); if (ret) return ret; }