diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index 9541aa3..e408d72 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -186,9 +186,6 @@ int GstLibcameraSrcState::queueRequest()
 	if (!request)
 		return -ENOMEM;
 
-	/* Apply controls */
-	controls_.applyControls(request);
-
 	std::unique_ptr<RequestWrap> wrap =
 		std::make_unique<RequestWrap>(std::move(request));
 
@@ -210,6 +207,13 @@ int GstLibcameraSrcState::queueRequest()
 		wrap->attachBuffer(srcpad, buffer);
 	}
 
+	/*
+	 * Apply the controls now that the request is known to be queueable.
+	 * applyControls() consumes the pending controls, so calling it before
+	 * the buffers are acquired would drop them along with the request.
+	 */
+	controls_.applyControls(wrap->request_);
+
 	GST_TRACE_OBJECT(src_, "Requesting buffers");
 
 	{
