diff --git a/src/ipa/rpi/controller/rpi/agc_channel.cpp b/src/ipa/rpi/controller/rpi/agc_channel.cpp
index 3efb6482b67f..8d374b53689d 100644
--- a/src/ipa/rpi/controller/rpi/agc_channel.cpp
+++ b/src/ipa/rpi/controller/rpi/agc_channel.cpp
@@ -270,7 +270,11 @@ AgcChannel::AgcChannel()
 	  lastTargetExposure_(0s), ev_(1.0), flickerPeriod_(0s),
 	  maxShutter_(0s), fixedShutter_(0s), fixedAnalogueGain_(0.0)
 {
-	memset(&awb_, 0, sizeof(awb_));
+	/* Set AWB default values in case early frames have no updates in metadata. */
+	awb_.gainR = 1.0;
+	awb_.gainG = 1.0;
+	awb_.gainB = 1.0;
+
 	/*
 	 * Setting status_.totalExposureValue_ to zero initially tells us
 	 * it's not been calculated yet (i.e. Process hasn't yet run).
@@ -409,7 +413,6 @@ void AgcChannel::switchMode(CameraMode const &cameraMode,
 	Duration fixedShutter = limitShutter(fixedShutter_);
 	if (fixedShutter && fixedAnalogueGain_) {
 		/* We're going to reset the algorithm here with these fixed values. */
-
 		fetchAwbStatus(metadata);
 		double minColourGain = std::min({ awb_.gainR, awb_.gainG, awb_.gainB, 1.0 });
 		ASSERT(minColourGain != 0.0);
@@ -464,6 +467,9 @@ void AgcChannel::prepare(Metadata *imageMetadata)
 	AgcStatus delayedStatus;
 	AgcPrepareStatus prepareStatus;
 
+	/* Fetch the AWB status now because AWB also sets it in the prepare method. */
+	fetchAwbStatus(imageMetadata);
+
 	if (!imageMetadata->get("agc.delayed_status", delayedStatus))
 		totalExposureValue = delayedStatus.totalExposureValue;
 
@@ -507,8 +513,6 @@ void AgcChannel::process(StatisticsPtr &stats, DeviceStatus const &deviceStatus,
 	 * configuration, that kind of thing.
 	 */
 	housekeepConfig();
-	/* Fetch the AWB status immediately, so that we can assume it's there. */
-	fetchAwbStatus(imageMetadata);
 	/* Get the current exposure values for the frame that's just arrived. */
 	fetchCurrentExposure(deviceStatus);
 	/* Compute the total gain we require relative to the current exposure. */
@@ -637,9 +641,6 @@ void AgcChannel::fetchCurrentExposure(DeviceStatus const &deviceStatus)
 
 void AgcChannel::fetchAwbStatus(Metadata *imageMetadata)
 {
-	awb_.gainR = 1.0; /* in case not found in metadata */
-	awb_.gainG = 1.0;
-	awb_.gainB = 1.0;
 	if (imageMetadata->get("awb.status", awb_) != 0)
 		LOG(RPiAgc, Debug) << "No AWB status found";
 }
