diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 14cab9e5..4958c956 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -444,12 +444,16 @@ PipelineHandlerIPU3::generateConfiguration(Camera *camera, std::span<const Strea
 		case StreamRole::VideoRecording: {
 			/*
 			 * Default viewfinder and videorecording to 1280x720,
-			 * capped to the maximum sensor resolution and aligned
-			 * to the ImgU output constraints.
+			 * capped to the sensor resolution minus the ImgU output
+			 * margins that validate() applies, and aligned to the
+			 * ImgU output constraints.
 			 */
-			size = sensorResolution.boundedTo(kViewfinderSize)
-					       .alignedDownTo(ImgUDevice::kOutputAlignWidth,
-							      ImgUDevice::kOutputAlignHeight);
+			size = sensorResolution.shrunkBy({ 1, 1 })
+				       .alignedDownTo(ImgUDevice::kOutputMarginWidth,
+						      ImgUDevice::kOutputMarginHeight)
+				       .boundedTo(kViewfinderSize)
+				       .alignedDownTo(ImgUDevice::kOutputAlignWidth,
+						      ImgUDevice::kOutputAlignHeight);
 			pixelFormat = formats::NV12;
 			bufferCount = IPU3CameraConfiguration::kBufferCount;
 			streamFormats[pixelFormat] = { { ImgUDevice::kOutputMinSize, size } };
