[v1,3/5] ipa: rpi: Add HDR support
diff mbox series

Message ID 20240502080925.31730-4-naush@raspberrypi.com
State Superseded
Headers show
Series
  • Pre Raspberry Pi 5 support changes
Related show

Commit Message

Naushir Patuck May 2, 2024, 8:09 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>
---
 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(-)

Comments

Jacopo Mondi May 2, 2024, 10:03 a.m. UTC | #1
On Thu, May 02, 2024 at 09:09:23AM GMT, Naushir Patuck wrote:
> 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>
> ---
>  src/ipa/rpi/common/ipa_base.cpp             |  78 ++-
>  src/ipa/rpi/common/ipa_base.h               |   7 +

These changes to the common IPA looks ok

Acked-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>

The rest is your private stuff, so I trust you there ;)

>  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(-)
>
> diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp
> index 3c133c55943a..149a133ab662 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)
> @@ -695,14 +701,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. */
> @@ -1194,9 +1204,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";
>
> @@ -1354,12 +1387,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 4db4411eed7c..512d7e8fe778 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 fb580548d068..28c2280a0fe2 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 980aa3d1850d..ac855b223d97 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":
> --
> 2.34.1
>

Patch
diff mbox series

diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp
index 3c133c55943a..149a133ab662 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)
@@ -695,14 +701,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. */
@@ -1194,9 +1204,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";
 
@@ -1354,12 +1387,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 4db4411eed7c..512d7e8fe778 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 fb580548d068..28c2280a0fe2 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 980aa3d1850d..ac855b223d97 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":