diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 3541a74b..9433dde7 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -424,13 +424,37 @@ int CameraDevice::open(const hw_module_t *hardwareModule)
 
 void CameraDevice::close()
 {
-	streams_.clear();
-
 	stop();
 
+	streams_.clear();
+
 	camera_->release();
 }
 
+void CameraDevice::stopCamera()
+{
+	/*
+	 * Stopping the worker will prevent any new requests queued to
+	 * libcamera::Camera.
+	 */
+	worker_.stop();
+
+	/*
+	 * libcamera::Camera::stop() will synchronously complete all requests
+	 * thereby, ensuring requestComplete() signal handler is executed for
+	 * all requests which are in-flight.
+	 */
+	camera_->stop();
+
+	/*
+	 * While libcamera::Camera::stop() is completing in-flight requests,
+	 * some of those request might queue post-processing of a stream.
+	 * Purge the post-processsing queue in this case so that the descriptors
+	 * can be processed and get offloaded from descriptors_.
+	 */
+	for (auto &stream : streams_)
+		stream.flush();
+}
 void CameraDevice::flush()
 {
 	{
@@ -441,8 +465,7 @@ void CameraDevice::flush()
 		state_ = State::Flushing;
 	}
 
-	worker_.stop();
-	camera_->stop();
+	stopCamera();
 
 	MutexLocker stateLock(stateMutex_);
 	state_ = State::Stopped;
@@ -454,8 +477,7 @@ void CameraDevice::stop()
 	if (state_ == State::Stopped)
 		return;
 
-	worker_.stop();
-	camera_->stop();
+	stopCamera();
 
 	descriptors_ = {};
 
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 0ce6caeb..20eae704 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -115,6 +115,7 @@ private:
 	};
 
 	void stop();
+	void stopCamera();
 
 	std::unique_ptr<libcamera::FrameBuffer>
 	createFrameBuffer(const buffer_handle_t camera3buffer,
