[v3,6/7] ipa: rpi: Add HDR support
diff mbox series

Message ID 20240510100208.12188-7-naush@raspberrypi.com
State Accepted
Commit 706578ecc803fbffed9eaab60f0d15501281a2b4
Headers show
Series
  • Pre Raspberry Pi 5 support changes
Related show

Commit Message

Naushir Patuck May 10, 2024, 10:02 a.m. UTC
Add support for the following HDR modes in the Raspberry Pi IPA:
- Night mode
- Single exposure mode
- Multi-exposure (merged and unmerged)

The algorithm is updated to expect the HDR short channel to meter
explicitly for highlights. This means that it will not in general
under-expose the short channel more than is actually necessary.

When images don't have much saturation, it's good to detect this so
that some of the boost we want to apply to the dark areas can be
implemented as regular gain. This means we can then adjust the tone
curve less, leading to less flat looking images.

The impact on the HDR algorithm is then that this determines how we
build tonemaps dynamically. The highlights are more-or-less correct
now, so we have to build a power-type curve that gives us the
appropriately configured targets in the lower part of the histogram.

We allow the tuning file to supply the maximum spatial gain value,
rather than the whole curve (though it can supply this if it
wants). Some parameter defaults are tweaked to be generally better
across the range of our cameras.

Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Acked-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
---
 src/ipa/rpi/common/ipa_base.cpp             |  78 ++-
 src/ipa/rpi/common/ipa_base.h               |   7 +
 src/ipa/rpi/controller/rpi/hdr.cpp          | 112 +++-
 src/ipa/rpi/controller/rpi/hdr.h            |  10 +-
 src/ipa/rpi/vc4/data/imx219.json            | 607 ++++++++++---------
 src/ipa/rpi/vc4/data/imx219_noir.json       | 607 ++++++++++---------
 src/ipa/rpi/vc4/data/imx290.json            |  15 +-
 src/ipa/rpi/vc4/data/imx296.json            |  17 +-
 src/ipa/rpi/vc4/data/imx296_mono.json       |  17 +-
 src/ipa/rpi/vc4/data/imx378.json            |  15 +-
 src/ipa/rpi/vc4/data/imx477.json            | 615 ++++++++++----------
 src/ipa/rpi/vc4/data/imx477_noir.json       | 607 ++++++++++---------
 src/ipa/rpi/vc4/data/imx477_scientific.json |  15 +-
 src/ipa/rpi/vc4/data/imx477_v1.json         |  15 +-
 src/ipa/rpi/vc4/data/imx519.json            |  15 +-
 src/ipa/rpi/vc4/data/imx708.json            | 555 +++++++++---------
 src/ipa/rpi/vc4/data/imx708_noir.json       | 555 +++++++++---------
 src/ipa/rpi/vc4/data/imx708_wide.json       | 555 +++++++++---------
 src/ipa/rpi/vc4/data/imx708_wide_noir.json  | 555 +++++++++---------
 src/ipa/rpi/vc4/data/ov5647.json            | 611 +++++++++----------
 src/ipa/rpi/vc4/data/ov5647_noir.json       |  15 +-
 src/ipa/rpi/vc4/data/ov9281_mono.json       |   5 +-
 src/ipa/rpi/vc4/data/se327m12.json          |  15 +-
 src/ipa/rpi/vc4/data/uncalibrated.json      |   5 +-
 24 files changed, 3040 insertions(+), 2583 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp
index 31b7985eea0b..61490bd6263e 100644
--- a/src/ipa/rpi/common/ipa_base.cpp
+++ b/src/ipa/rpi/common/ipa_base.cpp
@@ -25,7 +25,6 @@ 
 #include "controller/contrast_algorithm.h"
 #include "controller/denoise_algorithm.h"
 #include "controller/hdr_algorithm.h"
-#include "controller/hdr_status.h"
 #include "controller/lux_status.h"
 #include "controller/sharpen_algorithm.h"
 #include "controller/statistics.h"
@@ -104,9 +103,8 @@  LOG_DEFINE_CATEGORY(IPARPI)
 namespace ipa::RPi {
 
 IpaBase::IpaBase()
-	: controller_(), frameLengths_(FrameLengthsQueueSize, 0s), statsMetadataOutput_(false),
-	  frameCount_(0), mistrustCount_(0), lastRunTimestamp_(0), firstStart_(true),
-	  flickerState_({ 0, 0s })
+	: controller_(), frameLengths_(FrameLengthsQueueSize, 0s), stitchSwapBuffers_(false), frameCount_(0),
+	  mistrustCount_(0), lastRunTimestamp_(0), firstStart_(true), flickerState_({ 0, 0s })
 {
 }
 
@@ -299,6 +297,8 @@  void IpaBase::start(const ControlList &controls, StartResult *result)
 		result->controls = std::move(ctrls);
 		setCameraTimeoutValue();
 	}
+	/* Make a note of this as it tells us the HDR status of the first few frames. */
+	hdrStatus_ = agcStatus.hdr;
 
 	/*
 	 * Initialise frame counts, and decide how many frames must be hidden or
@@ -402,11 +402,17 @@  void IpaBase::prepareIsp(const PrepareParams &params)
 	 * sensor exposure/gain changes. So fetch it from the metadata list
 	 * indexed by the IPA cookie returned, and put it in the current frame
 	 * metadata.
+	 *
+	 * Note if the HDR mode has changed, as things like tonemaps may need updating.
 	 */
 	AgcStatus agcStatus;
+	bool hdrChange = false;
 	RPiController::Metadata &delayedMetadata = rpiMetadata_[params.delayContext];
-	if (!delayedMetadata.get<AgcStatus>("agc.status", agcStatus))
+	if (!delayedMetadata.get<AgcStatus>("agc.status", agcStatus)) {
 		rpiMetadata.set("agc.delayed_status", agcStatus);
+		hdrChange = agcStatus.hdr.mode != hdrStatus_.mode;
+		hdrStatus_ = agcStatus.hdr;
+	}
 
 	/*
 	 * This may overwrite the DeviceStatus using values from the sensor
@@ -417,7 +423,7 @@  void IpaBase::prepareIsp(const PrepareParams &params)
 	/* Allow a 10% margin on the comparison below. */
 	Duration delta = (frameTimestamp - lastRunTimestamp_) * 1.0ns;
 	if (lastRunTimestamp_ && frameCount_ > dropFrameCount_ &&
-	    delta < controllerMinFrameDuration * 0.9) {
+	    delta < controllerMinFrameDuration * 0.9 && !hdrChange) {
 		/*
 		 * Ensure we merge the previous frame's metadata with the current
 		 * frame. This will not overwrite exposure/gain values for the
@@ -454,7 +460,7 @@  void IpaBase::prepareIsp(const PrepareParams &params)
 		reportMetadata(ipaContext);
 
 	/* Ready to push the input buffer into the ISP. */
-	prepareIspComplete.emit(params.buffers, false);
+	prepareIspComplete.emit(params.buffers, stitchSwapBuffers_);
 }
 
 void IpaBase::processStats(const ProcessParams &params)
@@ -701,14 +707,18 @@  static const std::map<int32_t, RPiController::AfAlgorithm::AfPause> AfPauseTable
 
 static const std::map<int32_t, std::string> HdrModeTable = {
 	{ controls::HdrModeOff, "Off" },
+	{ controls::HdrModeMultiExposureUnmerged, "MultiExposureUnmerged" },
 	{ controls::HdrModeMultiExposure, "MultiExposure" },
 	{ controls::HdrModeSingleExposure, "SingleExposure" },
+	{ controls::HdrModeNight, "Night" },
 };
 
 void IpaBase::applyControls(const ControlList &controls)
 {
 	using RPiController::AgcAlgorithm;
 	using RPiController::AfAlgorithm;
+	using RPiController::ContrastAlgorithm;
+	using RPiController::DenoiseAlgorithm;
 	using RPiController::HdrAlgorithm;
 
 	/* Clear the return metadata buffer. */
@@ -1200,9 +1210,32 @@  void IpaBase::applyControls(const ControlList &controls)
 				break;
 			}
 
-			if (hdr->setMode(mode->second) == 0)
+			if (hdr->setMode(mode->second) == 0) {
 				agc->setActiveChannels(hdr->getChannels());
-			else
+
+				/* We also disable adpative contrast enhancement if HDR is running. */
+				ContrastAlgorithm *contrast =
+					dynamic_cast<ContrastAlgorithm *>(controller_.getAlgorithm("contrast"));
+				if (contrast) {
+					if (mode->second == "Off")
+						contrast->restoreCe();
+					else
+						contrast->enableCe(false);
+				}
+
+				DenoiseAlgorithm *denoise =
+					dynamic_cast<DenoiseAlgorithm *>(controller_.getAlgorithm("denoise"));
+				if (denoise) {
+					/* \todo - make the HDR mode say what denoise it wants? */
+					if (mode->second == "Night")
+						denoise->setConfig("night");
+					else if (mode->second == "SingleExposure")
+						denoise->setConfig("hdr");
+					/* MultiExposure doesn't need extra extra denoise. */
+					else
+						denoise->setConfig("normal");
+				}
+			} else
 				LOG(IPARPI, Warning)
 					<< "HDR mode " << mode->second << " not supported";
 
@@ -1360,12 +1393,31 @@  void IpaBase::reportMetadata(unsigned int ipaContext)
 		libcameraMetadata_.set(controls::AfPauseState, p);
 	}
 
-	const HdrStatus *hdrStatus = rpiMetadata.getLocked<HdrStatus>("hdr.status");
-	if (hdrStatus) {
-		if (hdrStatus->channel == "short")
+	/*
+	 * THe HDR algorithm sets the HDR channel into the agc.status at the time that those
+	 * AGC parameters were calculated several frames ago, so it comes back to us now in
+	 * the delayed_status. If this frame is too soon after a mode switch for the
+	 * delayed_status to be available, we use the HDR status that came out of the
+	 * switchMode call.
+	 */
+	const AgcStatus *agcStatus = rpiMetadata.getLocked<AgcStatus>("agc.delayed_status");
+	const HdrStatus &hdrStatus = agcStatus ? agcStatus->hdr : hdrStatus_;
+	if (!hdrStatus.mode.empty() && hdrStatus.mode != "Off") {
+		int32_t hdrMode = controls::HdrModeOff;
+		for (auto const &[mode, name] : HdrModeTable) {
+			if (hdrStatus.mode == name) {
+				hdrMode = mode;
+				break;
+			}
+		}
+		libcameraMetadata_.set(controls::HdrMode, hdrMode);
+
+		if (hdrStatus.channel == "short")
 			libcameraMetadata_.set(controls::HdrChannel, controls::HdrChannelShort);
-		else if (hdrStatus->channel == "long")
+		else if (hdrStatus.channel == "long")
 			libcameraMetadata_.set(controls::HdrChannel, controls::HdrChannelLong);
+		else if (hdrStatus.channel == "medium")
+			libcameraMetadata_.set(controls::HdrChannel, controls::HdrChannelMedium);
 		else
 			libcameraMetadata_.set(controls::HdrChannel, controls::HdrChannelNone);
 	}
diff --git a/src/ipa/rpi/common/ipa_base.h b/src/ipa/rpi/common/ipa_base.h
index b7637ab1d8ab..074b304e9fd8 100644
--- a/src/ipa/rpi/common/ipa_base.h
+++ b/src/ipa/rpi/common/ipa_base.h
@@ -22,6 +22,7 @@ 
 #include "controller/agc_status.h"
 #include "controller/camera_mode.h"
 #include "controller/controller.h"
+#include "controller/hdr_status.h"
 #include "controller/metadata.h"
 
 namespace libcamera {
@@ -64,6 +65,12 @@  protected:
 	ControlList libcameraMetadata_;
 	bool statsMetadataOutput_;
 
+	/* Remember the HDR status after a mode switch. */
+	HdrStatus hdrStatus_;
+
+	/* Whether the stitch block (if available) needs to swap buffers. */
+	bool stitchSwapBuffers_;
+
 private:
 	/* Number of metadata objects available in the context list. */
 	static constexpr unsigned int numMetadataContexts = 16;
diff --git a/src/ipa/rpi/controller/rpi/hdr.cpp b/src/ipa/rpi/controller/rpi/hdr.cpp
index 0019d5084df7..34cf360e9552 100644
--- a/src/ipa/rpi/controller/rpi/hdr.cpp
+++ b/src/ipa/rpi/controller/rpi/hdr.cpp
@@ -7,6 +7,8 @@ 
 
 #include "hdr.h"
 
+#include <cmath>
+
 #include <libcamera/base/log.h>
 
 #include "../agc_status.h"
@@ -39,25 +41,52 @@  void HdrConfig::read(const libcamera::YamlObject &params, const std::string &mod
 		channelMap[v.get<unsigned int>().value()] = k;
 
 	/* Lens shading related parameters. */
-	if (params.contains("spatial_gain")) {
-		spatialGain.read(params["spatial_gain"]);
-		diffusion = params["diffusion"].get<unsigned int>(3);
-		/* Clip to an arbitrary limit just to stop typos from killing the system! */
-		const unsigned int MAX_DIFFUSION = 15;
-		if (diffusion > MAX_DIFFUSION) {
-			diffusion = MAX_DIFFUSION;
-			LOG(RPiHdr, Warning) << "Diffusion value clipped to " << MAX_DIFFUSION;
-		}
+	if (params.contains("spatial_gain_curve")) {
+		spatialGainCurve.read(params["spatial_gain_curve"]);
+	} else if (params.contains("spatial_gain")) {
+		double spatialGain = params["spatial_gain"].get<double>(2.0);
+		spatialGainCurve.append(0.0, spatialGain);
+		spatialGainCurve.append(0.01, spatialGain);
+		spatialGainCurve.append(0.06, 1.0); /* maybe make this programmable? */
+		spatialGainCurve.append(1.0, 1.0);
+	}
+
+	diffusion = params["diffusion"].get<unsigned int>(3);
+	/* Clip to an arbitrary limit just to stop typos from killing the system! */
+	const unsigned int MAX_DIFFUSION = 15;
+	if (diffusion > MAX_DIFFUSION) {
+		diffusion = MAX_DIFFUSION;
+		LOG(RPiHdr, Warning) << "Diffusion value clipped to " << MAX_DIFFUSION;
 	}
 
 	/* Read any tonemap parameters. */
 	tonemapEnable = params["tonemap_enable"].get<int>(0);
-	detailConstant = params["detail_constant"].get<uint16_t>(50);
-	detailSlope = params["detail_slope"].get<double>(8.0);
+	detailConstant = params["detail_constant"].get<uint16_t>(0);
+	detailSlope = params["detail_slope"].get<double>(0.0);
 	iirStrength = params["iir_strength"].get<double>(8.0);
 	strength = params["strength"].get<double>(1.5);
 	if (tonemapEnable)
 		tonemap.read(params["tonemap"]);
+	speed = params["speed"].get<double>(1.0);
+	if (params.contains("hi_quantile_targets")) {
+		hiQuantileTargets = params["hi_quantile_targets"].getList<double>().value();
+		if (hiQuantileTargets.empty() || hiQuantileTargets.size() % 2)
+			LOG(RPiHdr, Fatal) << "hi_quantile_targets much be even and non-empty";
+	} else
+		hiQuantileTargets = { 0.95, 0.65, 0.5, 0.28, 0.3, 0.25 };
+	hiQuantileMaxGain = params["hi_quantile_max_gain"].get<double>(1.6);
+	if (params.contains("quantile_targets")) {
+		quantileTargets = params["quantile_targets"].getList<double>().value();
+		if (quantileTargets.empty() || quantileTargets.size() % 2)
+			LOG(RPiHdr, Fatal) << "quantile_targets much be even and non-empty";
+	} else
+		quantileTargets = { 0.2, 0.03, 1.0, 0.15 };
+	powerMin = params["power_min"].get<double>(0.65);
+	powerMax = params["power_max"].get<double>(1.0);
+	if (params.contains("contrast_adjustments")) {
+		contrastAdjustments = params["contrast_adjustments"].getList<double>().value();
+	} else
+		contrastAdjustments = { 0.5, 0.75 };
 
 	/* Read any stitch parameters. */
 	stitchEnable = params["stitch_enable"].get<int>(0);
@@ -159,7 +188,7 @@  void Hdr::prepare(Metadata *imageMetadata)
 	}
 
 	HdrConfig &config = it->second;
-	if (config.spatialGain.empty())
+	if (config.spatialGainCurve.empty())
 		return;
 
 	AlscStatus alscStatus{}; /* some compilers seem to require the braces */
@@ -205,10 +234,61 @@  bool Hdr::updateTonemap([[maybe_unused]] StatisticsPtr &stats, HdrConfig &config
 		return true;
 
 	/*
-	 * If we wanted to build or adjust tonemaps dynamically, this would be the place
-	 * to do it. But for now we seem to be getting by without.
+	 * Create a tonemap dynamically. We have three ingredients.
+	 *
+	 * 1. We have a list of "hi quantiles" and "targets". We use these to judge if
+	 * the image does seem to be reasonably saturated. If it isn't, we calculate
+	 * a gain that we will feed as a linear factor into the tonemap generation.
+	 * This prevents unsaturated images from beoming quite so "flat".
+	 *
+	 * 2. We have a list of quantile/target pairs for the bottom of the histogram.
+	 * We use these to calculate how much gain we must apply to the bottom of the
+	 * tonemap. We apply this gain as a power curve so as not to blow out the top
+	 * end.
+	 *
+	 * 3. Finally, when we generate the tonemap, we have some contrast adjustments
+	 * for the bottom because we know that power curves can start quite steeply and
+	 * cause a washed-out look.
 	 */
 
+	/* Compute the linear gain from the headroom for saturation at the top. */
+	double gain = 10; /* arbitrary, but hiQuantileMaxGain will clamp it later */
+	for (unsigned int i = 0; i < config.hiQuantileTargets.size(); i += 2) {
+		double quantile = config.hiQuantileTargets[i];
+		double target = config.hiQuantileTargets[i + 1];
+		double value = stats->yHist.interQuantileMean(quantile, 1.0) / 1024.0;
+		double newGain = target / (value + 0.01);
+		gain = std::min(gain, newGain);
+	}
+	gain = std::clamp(gain, 1.0, config.hiQuantileMaxGain);
+
+	/* Compute the power curve from the amount of gain needed at the bottom. */
+	double min_power = 2; /* arbitrary, but config.powerMax will clamp it later */
+	for (unsigned int i = 0; i < config.quantileTargets.size(); i += 2) {
+		double quantile = config.quantileTargets[i];
+		double target = config.quantileTargets[i + 1];
+		double value = stats->yHist.interQuantileMean(0, quantile) / 1024.0;
+		value = std::min(value * gain, 1.0);
+		double power = log(target + 1e-6) / log(value + 1e-6);
+		min_power = std::min(min_power, power);
+	}
+	double power = std::clamp(min_power, config.powerMin, config.powerMax);
+
+	/* Generate the tonemap, including the contrast adjustment factors. */
+	Pwl tonemap;
+	tonemap.append(0, 0);
+	for (unsigned int i = 0; i <= 6; i++) {
+		double x = 1 << (i + 9); /* x loops from 512 to 32768 inclusive */
+		double y = pow(std::min(x * gain, 65535.0) / 65536.0, power) * 65536;
+		if (i < config.contrastAdjustments.size())
+			y *= config.contrastAdjustments[i];
+		if (!tonemap_.empty())
+			y = y * config.speed + tonemap_.eval(x) * (1 - config.speed);
+		tonemap.append(x, y);
+	}
+	tonemap.append(65535, 65535);
+	tonemap_ = tonemap;
+
 	return true;
 }
 
@@ -255,7 +335,7 @@  static void averageGains(std::vector<double> &src, std::vector<double> &dst, con
 
 void Hdr::updateGains(StatisticsPtr &stats, HdrConfig &config)
 {
-	if (config.spatialGain.empty())
+	if (config.spatialGainCurve.empty())
 		return;
 
 	/* When alternating exposures, only compute these gains for the short frame. */
@@ -270,7 +350,7 @@  void Hdr::updateGains(StatisticsPtr &stats, HdrConfig &config)
 		double g = region.val.gSum / counted;
 		double b = region.val.bSum / counted;
 		double brightness = std::max({ r, g, b }) / 65535;
-		gains_[0][i] = config.spatialGain.eval(brightness);
+		gains_[0][i] = config.spatialGainCurve.eval(brightness);
 	}
 
 	/* Ping-pong between the two gains_ buffers. */
diff --git a/src/ipa/rpi/controller/rpi/hdr.h b/src/ipa/rpi/controller/rpi/hdr.h
index 44272cb80d93..9b7327f8bb98 100644
--- a/src/ipa/rpi/controller/rpi/hdr.h
+++ b/src/ipa/rpi/controller/rpi/hdr.h
@@ -26,7 +26,7 @@  struct HdrConfig {
 	std::map<unsigned int, std::string> channelMap;
 
 	/* Lens shading related parameters. */
-	Pwl spatialGain; /* Brightness to gain curve for different image regions. */
+	Pwl spatialGainCurve; /* Brightness to gain curve for different image regions. */
 	unsigned int diffusion; /* How much to diffuse the gain spatially. */
 
 	/* Tonemap related parameters. */
@@ -36,6 +36,14 @@  struct HdrConfig {
 	double iirStrength;
 	double strength;
 	Pwl tonemap;
+	/* These relate to adaptive tonemap calculation. */
+	double speed;
+	std::vector<double> hiQuantileTargets; /* quantiles to check for unsaturated images */
+	double hiQuantileMaxGain; /* the max gain we'll apply when unsaturated */
+	std::vector<double> quantileTargets; /* target values for histogram quantiles */
+	double powerMin; /* minimum tonemap power */
+	double powerMax; /* maximum tonemap power */
+	std::vector<double> contrastAdjustments; /* any contrast adjustment factors */
 
 	/* Stitch related parameters. */
 	bool stitchEnable;
diff --git a/src/ipa/rpi/vc4/data/imx219.json b/src/ipa/rpi/vc4/data/imx219.json
index 54defc0b8ab8..a020b12f553f 100644
--- a/src/ipa/rpi/vc4/data/imx219.json
+++ b/src/ipa/rpi/vc4/data/imx219.json
@@ -131,282 +131,308 @@ 
         {
             "rpi.agc":
             {
-		"channels":
-		[
-		    {
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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.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
-			]
-		    },
-		    {
-			"base_ev": 0.125,
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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.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
-			]
-		    },
-		    {
-			"base_ev": 1.5,
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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.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
-			]
-		    }
-		]
-	    }
+                "channels": [
+                    {
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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.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
+                        ]
+                    },
+                    {
+                        "base_ev": 0.125,
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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.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
+                        ]
+                    },
+                    {
+                        "base_ev": 1.5,
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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.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
+                        ]
+                    }
+                ]
+            }
         },
         {
             "rpi.alsc":
@@ -651,20 +677,19 @@ 
         {
             "rpi.sharpen": { }
         },
-	{
-	    "rpi.hdr":
-	    {
-		"MultiExposure":
-		{
-		    "cadence": [ 1, 2 ],
-		    "channel_map": { "short": 1, "long": 2 }
-		},
-		"SingleExposure":
-		{
-		    "cadence": [ 1 ],
-		    "channel_map": { "short": 1 }
-		}
-	    }
-	}
+        {
+            "rpi.hdr":
+            {
+                "MultiExposureUnmerged":
+                {
+                    "cadence": [ 1, 2 ],
+                    "channel_map":
+                    {
+                        "short": 1,
+                        "long": 2
+                    }
+                }
+            }
+        }
     ]
 }
diff --git a/src/ipa/rpi/vc4/data/imx219_noir.json b/src/ipa/rpi/vc4/data/imx219_noir.json
index e823a90dffa8..d8bc963962a4 100644
--- a/src/ipa/rpi/vc4/data/imx219_noir.json
+++ b/src/ipa/rpi/vc4/data/imx219_noir.json
@@ -47,282 +47,308 @@ 
         {
             "rpi.agc":
             {
-		"channels":
-		[
-		    {
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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.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
-			]
-		    },
-		    {
-			"base_ev": 0.125,
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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.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
-			]
-		    },
-		    {
-			"base_ev": 1.5,
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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.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
-			]
-		    }
-		]
-	    }
+                "channels": [
+                    {
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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.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
+                        ]
+                    },
+                    {
+                        "base_ev": 0.125,
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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.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
+                        ]
+                    },
+                    {
+                        "base_ev": 1.5,
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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.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
+                        ]
+                    }
+                ]
+            }
         },
         {
             "rpi.alsc":
@@ -585,20 +611,19 @@ 
         {
             "rpi.sharpen": { }
         },
-	{
-	    "rpi.hdr":
-	    {
-		"MultiExposure":
-		{
-		    "cadence": [ 1, 2 ],
-		    "channel_map": { "short": 1, "long": 2 }
-		},
-		"SingleExposure":
-		{
-		    "cadence": [ 1 ],
-		    "channel_map": { "short": 1 }
-		}
-	    }
-	}
+        {
+            "rpi.hdr":
+            {
+                "MultiExposureUnmerged":
+                {
+                    "cadence": [ 1, 2 ],
+                    "channel_map":
+                    {
+                        "short": 1,
+                        "long": 2
+                    }
+                }
+            }
+        }
     ]
 }
diff --git a/src/ipa/rpi/vc4/data/imx290.json b/src/ipa/rpi/vc4/data/imx290.json
index 8a7cadba38a2..8f41bf519644 100644
--- a/src/ipa/rpi/vc4/data/imx290.json
+++ b/src/ipa/rpi/vc4/data/imx290.json
@@ -52,15 +52,24 @@ 
                 {
                     "matrix":
                     {
-                        "weights": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
                     },
                     "centre-weighted":
                     {
-                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "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 ]
+                        "weights":
+                        [
+                            2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+                        ]
                     }
                 },
                 "exposure_modes":
diff --git a/src/ipa/rpi/vc4/data/imx296.json b/src/ipa/rpi/vc4/data/imx296.json
index 7621f759fc3f..8f24ce5b819a 100644
--- a/src/ipa/rpi/vc4/data/imx296.json
+++ b/src/ipa/rpi/vc4/data/imx296.json
@@ -135,15 +135,24 @@ 
                 {
                     "centre-weighted":
                     {
-                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "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 ]
+                        "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 ]
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
                     }
                 },
                 "exposure_modes":
@@ -431,4 +440,4 @@ 
             }
         }
     ]
-}
+}
\ No newline at end of file
diff --git a/src/ipa/rpi/vc4/data/imx296_mono.json b/src/ipa/rpi/vc4/data/imx296_mono.json
index d4140c81bf0d..fe331569938e 100644
--- a/src/ipa/rpi/vc4/data/imx296_mono.json
+++ b/src/ipa/rpi/vc4/data/imx296_mono.json
@@ -38,15 +38,24 @@ 
                 {
                     "centre-weighted":
                     {
-                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "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 ]
+                        "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 ]
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
                     }
                 },
                 "exposure_modes":
@@ -228,4 +237,4 @@ 
             }
         }
     ]
-}
+}
\ No newline at end of file
diff --git a/src/ipa/rpi/vc4/data/imx378.json b/src/ipa/rpi/vc4/data/imx378.json
index f7b68011b634..363b47e19888 100644
--- a/src/ipa/rpi/vc4/data/imx378.json
+++ b/src/ipa/rpi/vc4/data/imx378.json
@@ -133,15 +133,24 @@ 
                 {
                     "centre-weighted":
                     {
-                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "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 ]
+                        "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 ]
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
                     }
                 },
                 "exposure_modes":
diff --git a/src/ipa/rpi/vc4/data/imx477.json b/src/ipa/rpi/vc4/data/imx477.json
index 853bfa67a9b7..fa25ee86004e 100644
--- a/src/ipa/rpi/vc4/data/imx477.json
+++ b/src/ipa/rpi/vc4/data/imx477.json
@@ -115,16 +115,16 @@ 
                 "ct_curve":
                 [
                     2360.0, 0.6009, 0.3093,
-                    2848.0, 0.5071, 0.4000,
+                    2848.0, 0.5071, 0.4,
                     2903.0, 0.4905, 0.4392,
                     3628.0, 0.4261, 0.5564,
                     3643.0, 0.4228, 0.5623,
-                    4660.0, 0.3529, 0.6800,
-                    5579.0, 0.3227, 0.7000,
-                    6125.0, 0.3129, 0.7100,
-                    6671.0, 0.3065, 0.7200,
-                    7217.0, 0.3014, 0.7300,
-                    7763.0, 0.2950, 0.7400,
+                    4660.0, 0.3529, 0.68,
+                    5579.0, 0.3227, 0.7,
+                    6125.0, 0.3129, 0.71,
+                    6671.0, 0.3065, 0.72,
+                    7217.0, 0.3014, 0.73,
+                    7763.0, 0.295, 0.74,
                     9505.0, 0.2524, 0.7856
                 ],
                 "sensitivity_r": 1.05,
@@ -136,282 +136,308 @@ 
         {
             "rpi.agc":
             {
-		"channels":
-		[
+                "channels": [
                     {
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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
-				    ]
-				}
-			    ],
-			    "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
-			]
-		    },
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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
+                                    ]
+                                }
+                            ],
+                            "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
+                        ]
+                    },
                     {
-			"base_ev": 0.125,
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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
-				    ]
-				}
-			    ],
-			    "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
-			]
-		    },
+                        "base_ev": 0.125,
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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
+                                    ]
+                                }
+                            ],
+                            "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
+                        ]
+                    },
                     {
-			"base_ev": 1.5,
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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
-				    ]
-				}
-			    ],
-			    "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
-			]
-		    }
-		]
-	    }
+                        "base_ev": 1.5,
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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
+                                    ]
+                                }
+                            ],
+                            "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
+                        ]
+                    }
+                ]
+            }
         },
         {
             "rpi.alsc":
@@ -656,20 +682,19 @@ 
         {
             "rpi.sharpen": { }
         },
-	{
-	    "rpi.hdr":
-	    {
-		"MultiExposure":
-		{
-		    "cadence": [ 1, 2 ],
-		    "channel_map": { "short": 1, "long": 2 }
-		},
-		"SingleExposure":
-		{
-		    "cadence": [ 1 ],
-		    "channel_map": { "short": 1 }
-		}
-	    }
-	}
+        {
+            "rpi.hdr":
+            {
+                "MultiExposureUnmerged":
+                {
+                    "cadence": [ 1, 2 ],
+                    "channel_map":
+                    {
+                        "short": 1,
+                        "long": 2
+                    }
+                }
+            }
+        }
     ]
 }
\ No newline at end of file
diff --git a/src/ipa/rpi/vc4/data/imx477_noir.json b/src/ipa/rpi/vc4/data/imx477_noir.json
index 143e20bd92d8..472f33fe1556 100644
--- a/src/ipa/rpi/vc4/data/imx477_noir.json
+++ b/src/ipa/rpi/vc4/data/imx477_noir.json
@@ -47,282 +47,308 @@ 
         {
             "rpi.agc":
             {
-		"channels":
-		[
-		    {
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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
-				    ]
-				}
-			    ],
-			    "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
-			]
-		    },
-		    {
-			"base_ev": 0.125,
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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
-				    ]
-				}
-			    ],
-			    "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
-			]
-		    },
-		    {
-			"base_ev": 1.5,
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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
-				    ]
-				}
-			    ],
-			    "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
-			]
-		    }
-		]
-	    }
+                "channels": [
+                    {
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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
+                                    ]
+                                }
+                            ],
+                            "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
+                        ]
+                    },
+                    {
+                        "base_ev": 0.125,
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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
+                                    ]
+                                }
+                            ],
+                            "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
+                        ]
+                    },
+                    {
+                        "base_ev": 1.5,
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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
+                                    ]
+                                }
+                            ],
+                            "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
+                        ]
+                    }
+                ]
+            }
         },
         {
             "rpi.alsc":
@@ -612,20 +638,19 @@ 
         {
             "rpi.sharpen": { }
         },
-	{
-	    "rpi.hdr":
-	    {
-		"MultiExposure":
-		{
-		    "cadence": [ 1, 2 ],
-		    "channel_map": { "short": 1, "long": 2 }
-		},
-		"SingleExposure":
-		{
-		    "cadence": [ 1 ],
-		    "channel_map": { "short": 1 }
-		}
-	    }
-	}
+        {
+            "rpi.hdr":
+            {
+                "MultiExposureUnmerged":
+                {
+                    "cadence": [ 1, 2 ],
+                    "channel_map":
+                    {
+                        "short": 1,
+                        "long": 2
+                    }
+                }
+            }
+        }
     ]
 }
diff --git a/src/ipa/rpi/vc4/data/imx477_scientific.json b/src/ipa/rpi/vc4/data/imx477_scientific.json
index 26c692fdbab9..9dc32eb1525c 100644
--- a/src/ipa/rpi/vc4/data/imx477_scientific.json
+++ b/src/ipa/rpi/vc4/data/imx477_scientific.json
@@ -148,15 +148,24 @@ 
                 {
                     "centre-weighted":
                     {
-                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "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 ]
+                        "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 ]
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
                     }
                 },
                 "exposure_modes":
diff --git a/src/ipa/rpi/vc4/data/imx477_v1.json b/src/ipa/rpi/vc4/data/imx477_v1.json
index d64020091efa..55e4adc1961d 100644
--- a/src/ipa/rpi/vc4/data/imx477_v1.json
+++ b/src/ipa/rpi/vc4/data/imx477_v1.json
@@ -138,15 +138,24 @@ 
                 {
                     "centre-weighted":
                     {
-                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "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 ]
+                        "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 ]
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
                     }
                 },
                 "exposure_modes":
diff --git a/src/ipa/rpi/vc4/data/imx519.json b/src/ipa/rpi/vc4/data/imx519.json
index 1b0a77476aab..ce19425683a6 100644
--- a/src/ipa/rpi/vc4/data/imx519.json
+++ b/src/ipa/rpi/vc4/data/imx519.json
@@ -133,15 +133,24 @@ 
                 {
                     "centre-weighted":
                     {
-                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "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 ]
+                        "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 ]
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
                     }
                 },
                 "exposure_modes":
diff --git a/src/ipa/rpi/vc4/data/imx708.json b/src/ipa/rpi/vc4/data/imx708.json
index 26aafc95c584..4de6f0796fd0 100644
--- a/src/ipa/rpi/vc4/data/imx708.json
+++ b/src/ipa/rpi/vc4/data/imx708.json
@@ -139,255 +139,281 @@ 
         {
             "rpi.agc":
             {
-		"channels":
-		[
-		    {
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    },
-		    {
-			"base_ev": 0.125,
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    },
-		    {
-			"base_ev": 1.5,
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    }
-		]
-	    }
+                "channels": [
+                    {
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    },
+                    {
+                        "base_ev": 0.125,
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    },
+                    {
+                        "base_ev": 1.5,
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    }
+                ]
+            }
         },
         {
             "rpi.alsc":
@@ -627,20 +653,19 @@ 
                 "map": [ 0.0, 445, 15.0, 925 ]
             }
         },
-	{
-	    "rpi.hdr":
-	    {
-		"MultiExposure":
-		{
-		    "cadence": [ 1, 2 ],
-		    "channel_map": { "short": 1, "long": 2 }
-		},
-		"SingleExposure":
-		{
-		    "cadence": [ 1 ],
-		    "channel_map": { "short": 1 }
-		}
-	    }
-	}
+        {
+            "rpi.hdr":
+            {
+                "MultiExposureUnmerged":
+                {
+                    "cadence": [ 1, 2 ],
+                    "channel_map":
+                    {
+                        "short": 1,
+                        "long": 2
+                    }
+                }
+            }
+        }
     ]
-}
+}
\ No newline at end of file
diff --git a/src/ipa/rpi/vc4/data/imx708_noir.json b/src/ipa/rpi/vc4/data/imx708_noir.json
index 8259ca4d0411..7b7ee874f66a 100644
--- a/src/ipa/rpi/vc4/data/imx708_noir.json
+++ b/src/ipa/rpi/vc4/data/imx708_noir.json
@@ -139,255 +139,281 @@ 
         {
             "rpi.agc":
             {
-		"channels":
-		[
-		    {
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    },
-		    {
-			"base_ev": 0.125,
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    },
-		    {
-			"base_ev": 1.5,
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    }
-		]
-	    }
+                "channels": [
+                    {
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    },
+                    {
+                        "base_ev": 0.125,
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    },
+                    {
+                        "base_ev": 1.5,
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    }
+                ]
+            }
         },
         {
             "rpi.alsc":
@@ -726,20 +752,19 @@ 
                 "map": [ 0.0, 445, 15.0, 925 ]
             }
         },
-	{
-	    "rpi.hdr":
-	    {
-		"MultiExposure":
-		{
-		    "cadence": [ 1, 2 ],
-		    "channel_map": { "short": 1, "long": 2 }
-		},
-		"SingleExposure":
-		{
-		    "cadence": [ 1 ],
-		    "channel_map": { "short": 1 }
-		}
-	    }
-	}
+        {
+            "rpi.hdr":
+            {
+                "MultiExposureUnmerged":
+                {
+                    "cadence": [ 1, 2 ],
+                    "channel_map":
+                    {
+                        "short": 1,
+                        "long": 2
+                    }
+                }
+            }
+        }
     ]
-}
+}
\ No newline at end of file
diff --git a/src/ipa/rpi/vc4/data/imx708_wide.json b/src/ipa/rpi/vc4/data/imx708_wide.json
index 0f846ea29393..6f45aafc0997 100644
--- a/src/ipa/rpi/vc4/data/imx708_wide.json
+++ b/src/ipa/rpi/vc4/data/imx708_wide.json
@@ -129,255 +129,281 @@ 
         {
             "rpi.agc":
             {
-		"channels":
-		[
-		    {
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    },
-		    {
-			"base_ev": 0.125,
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    },
-		    {
-			"base_ev": 1.5,
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    }
-		]
-	    }
+                "channels": [
+                    {
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    },
+                    {
+                        "base_ev": 0.125,
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    },
+                    {
+                        "base_ev": 1.5,
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    }
+                ]
+            }
         },
         {
             "rpi.alsc":
@@ -638,20 +664,19 @@ 
                 "map": [ 0.0, 420, 35.0, 920 ]
             }
         },
-	{
-	    "rpi.hdr":
-	    {
-		"MultiExposure":
-		{
-		    "cadence": [ 1, 2 ],
-		    "channel_map": { "short": 1, "long": 2 }
-		},
-		"SingleExposure":
-		{
-		    "cadence": [ 1 ],
-		    "channel_map": { "short": 1 }
-		}
-	    }
-	}
+        {
+            "rpi.hdr":
+            {
+                "MultiExposureUnmerged":
+                {
+                    "cadence": [ 1, 2 ],
+                    "channel_map":
+                    {
+                        "short": 1,
+                        "long": 2
+                    }
+                }
+            }
+        }
     ]
-}
+}
\ No newline at end of file
diff --git a/src/ipa/rpi/vc4/data/imx708_wide_noir.json b/src/ipa/rpi/vc4/data/imx708_wide_noir.json
index f12ddbb61fcd..b9a5227e1acc 100644
--- a/src/ipa/rpi/vc4/data/imx708_wide_noir.json
+++ b/src/ipa/rpi/vc4/data/imx708_wide_noir.json
@@ -129,255 +129,281 @@ 
         {
             "rpi.agc":
             {
-		"channels":
-		[
-		    {
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    },
-		    {
-			"base_ev": 0.125,
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    },
-		    {
-			"base_ev": 1.5,
-			"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, 15000, 30000, 60000, 120000 ],
-				"gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 120000 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
-					1000, 0.2
-				    ]
-				}
-			    ],
-			    "highlight": [
-				{
-				    "bound": "LOWER",
-				    "q_lo": 0.98,
-				    "q_hi": 1.0,
-				    "y_target":
-				    [
-					0, 0.2,
-					1000, 0.2
-				    ]
-				},
-				{
-				    "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
-			],
-			"startup_frames": 5,
-			"convergence_frames": 6,
-			"speed": 0.15
-		    }
-		]
-	    }
+                "channels": [
+                    {
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    },
+                    {
+                        "base_ev": 0.125,
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    },
+                    {
+                        "base_ev": 1.5,
+                        "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, 15000, 30000, 60000, 120000 ],
+                                "gain": [ 1.0, 1.0, 2.0, 4.0, 6.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 120000 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 6.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.2,
+                                        1000, 0.2
+                                    ]
+                                }
+                            ],
+                            "highlight": [
+                                {
+                                    "bound": "LOWER",
+                                    "q_lo": 0.98,
+                                    "q_hi": 1.0,
+                                    "y_target":
+                                    [
+                                        0, 0.2,
+                                        1000, 0.2
+                                    ]
+                                },
+                                {
+                                    "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
+                        ],
+                        "startup_frames": 5,
+                        "convergence_frames": 6,
+                        "speed": 0.15
+                    }
+                ]
+            }
         },
         {
             "rpi.alsc":
@@ -629,20 +655,19 @@ 
                 "map": [ 0.0, 420, 35.0, 920 ]
             }
         },
-	{
-	    "rpi.hdr":
-	    {
-		"MultiExposure":
-		{
-		    "cadence": [ 1, 2 ],
-		    "channel_map": { "short": 1, "long": 2 }
-		},
-		"SingleExposure":
-		{
-		    "cadence": [ 1 ],
-		    "channel_map": { "short": 1 }
-		}
-	    }
-	}
+        {
+            "rpi.hdr":
+            {
+                "MultiExposureUnmerged":
+                {
+                    "cadence": [ 1, 2 ],
+                    "channel_map":
+                    {
+                        "short": 1,
+                        "long": 2
+                    }
+                }
+            }
+        }
     ]
-}
+}
\ No newline at end of file
diff --git a/src/ipa/rpi/vc4/data/ov5647.json b/src/ipa/rpi/vc4/data/ov5647.json
index 4def9ffc2dcb..40c6059c862b 100644
--- a/src/ipa/rpi/vc4/data/ov5647.json
+++ b/src/ipa/rpi/vc4/data/ov5647.json
@@ -131,285 +131,309 @@ 
         {
             "rpi.agc":
             {
-		"channels":
-		[
-		    {
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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.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
-			],
-			"base_ev": 1.25
-		    },
-		    {
-			"base_ev": 0.125,
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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.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
-			],
-			"base_ev": 1.25
-		    },
-		    {
-			"base_ev": 1.5,
-			"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, 66666 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
-			    },
-			    "short":
-			    {
-				"shutter": [ 100, 5000, 10000, 20000, 33333 ],
-				"gain": [ 1.0, 2.0, 4.0, 6.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.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
-			],
-			"base_ev": 1.25
-		    }
-		]
-	    }
+                "channels": [
+                    {
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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.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
+                        ],
+                        "base_ev": 1.25
+                    },
+                    {
+                        "base_ev": 1.25,
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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.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
+                        ]
+                    },
+                    {
+                        "base_ev": 1.25,
+                        "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, 66666 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]
+                            },
+                            "short":
+                            {
+                                "shutter": [ 100, 5000, 10000, 20000, 33333 ],
+                                "gain": [ 1.0, 2.0, 4.0, 6.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.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
+                        ]
+                    }
+                ]
+            }
         },
         {
             "rpi.alsc":
@@ -654,20 +678,19 @@ 
         {
             "rpi.sharpen": { }
         },
-	{
-	    "rpi.hdr":
-	    {
-		"MultiExposure":
-		{
-		    "cadence": [ 1, 2 ],
-		    "channel_map": { "short": 1, "long": 2 }
-		},
-		"SingleExposure":
-		{
-		    "cadence": [ 1 ],
-		    "channel_map": { "short": 1 }
-		}
-	    }
-	}
+        {
+            "rpi.hdr":
+            {
+                "MultiExposureUnmerged":
+                {
+                    "cadence": [ 1, 2 ],
+                    "channel_map":
+                    {
+                        "short": 1,
+                        "long": 2
+                    }
+                }
+            }
+        }
     ]
 }
diff --git a/src/ipa/rpi/vc4/data/ov5647_noir.json b/src/ipa/rpi/vc4/data/ov5647_noir.json
index a6c6722f12a6..488b7119b17c 100644
--- a/src/ipa/rpi/vc4/data/ov5647_noir.json
+++ b/src/ipa/rpi/vc4/data/ov5647_noir.json
@@ -51,15 +51,24 @@ 
                 {
                     "centre-weighted":
                     {
-                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "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 ]
+                        "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 ]
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
                     }
                 },
                 "exposure_modes":
diff --git a/src/ipa/rpi/vc4/data/ov9281_mono.json b/src/ipa/rpi/vc4/data/ov9281_mono.json
index 2b7292ec7e20..a9d05a01b53f 100644
--- a/src/ipa/rpi/vc4/data/ov9281_mono.json
+++ b/src/ipa/rpi/vc4/data/ov9281_mono.json
@@ -35,7 +35,10 @@ 
                 {
                     "centre-weighted":
                     {
-                        "weights": [ 4, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "weights":
+                        [
+                            4, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0
+                        ]
                     }
                 },
                 "exposure_modes":
diff --git a/src/ipa/rpi/vc4/data/se327m12.json b/src/ipa/rpi/vc4/data/se327m12.json
index 8552ed92bce6..948169db2419 100644
--- a/src/ipa/rpi/vc4/data/se327m12.json
+++ b/src/ipa/rpi/vc4/data/se327m12.json
@@ -133,15 +133,24 @@ 
                 {
                     "centre-weighted":
                     {
-                        "weights": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "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 ]
+                        "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 ]
+                        "weights":
+                        [
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+                        ]
                     }
                 },
                 "exposure_modes":
diff --git a/src/ipa/rpi/vc4/data/uncalibrated.json b/src/ipa/rpi/vc4/data/uncalibrated.json
index 7654defa6dfe..cdc56b323c2e 100644
--- a/src/ipa/rpi/vc4/data/uncalibrated.json
+++ b/src/ipa/rpi/vc4/data/uncalibrated.json
@@ -22,7 +22,10 @@ 
                 {
                     "centre-weighted":
                     {
-                        "weights": [ 4, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]
+                        "weights":
+                        [
+                            4, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0
+                        ]
                     }
                 },
                 "exposure_modes":