[libcamera-devel,2/2] android: camera_device: Queue request to Worker
diff mbox series

Message ID 20201009133956.77396-3-jacopo@jmondi.org
State Superseded, archived
Delegated to: Jacopo Mondi
Headers show
Series
  • android: Introduce CameraWorker
Related show

Commit Message

Jacopo Mondi Oct. 9, 2020, 1:39 p.m. UTC
Add a CameraWorker class member to the CameraDevice class and
queue capture requests to it to delegate fence handling and capture
requests queueing to the camera.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/android/camera_device.cpp | 19 +++++++++----------
 src/android/camera_device.h   |  3 +++
 2 files changed, 12 insertions(+), 10 deletions(-)

Comments

Laurent Pinchart Oct. 9, 2020, 5:40 p.m. UTC | #1
Hi Jacopo,

Thank you for the patch.

On Fri, Oct 09, 2020 at 03:39:56PM +0200, Jacopo Mondi wrote:
> Add a CameraWorker class member to the CameraDevice class and
> queue capture requests to it to delegate fence handling and capture
> requests queueing to the camera.
> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> ---
>  src/android/camera_device.cpp | 19 +++++++++----------
>  src/android/camera_device.h   |  3 +++
>  2 files changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 0a94c1ae17ac..0e42e2e194d8 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -194,8 +194,8 @@ CameraDevice::Camera3RequestDescriptor::~Camera3RequestDescriptor()
>   */
>  
>  CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camera)
> -	: id_(id), running_(false), camera_(camera), staticMetadata_(nullptr),
> -	  facing_(CAMERA_FACING_FRONT), orientation_(0)
> +	: id_(id), worker_(camera), running_(false), camera_(camera),
> +	  staticMetadata_(nullptr), facing_(CAMERA_FACING_FRONT), orientation_(0)
>  {
>  	camera_->requestCompleted.connect(this, &CameraDevice::requestComplete);
>  
> @@ -519,6 +519,7 @@ void CameraDevice::close()
>  {
>  	streams_.clear();
>  
> +	worker_.stop();
>  	camera_->stop();
>  	camera_->release();
>  
> @@ -1356,6 +1357,8 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
>  			return ret;
>  		}
>  
> +		worker_.start();
> +
>  		running_ = true;
>  	}
>  
> @@ -1377,6 +1380,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
>  
>  	Request *request =
>  		camera_->createRequest(reinterpret_cast<uint64_t>(descriptor));
> +	std::unique_ptr<CaptureRequest> captureRequest = std::make_unique<CaptureRequest>(request);

Line break ?

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>  
>  	LOG(HAL, Debug) << "Queueing Request to libcamera with "
>  			<< descriptor->numBuffers << " HAL streams";
> @@ -1445,16 +1449,11 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
>  			return -ENOMEM;
>  		}
>  
> -		request->addBuffer(cameraStream->stream(), buffer);
> +		captureRequest->addBuffer(cameraStream->stream(), buffer,
> +					  camera3Buffers[i].acquire_fence);
>  	}
>  
> -	int ret = camera_->queueRequest(request);
> -	if (ret) {
> -		LOG(HAL, Error) << "Failed to queue request";
> -		delete request;
> -		delete descriptor;
> -		return ret;
> -	}
> +	worker_.queueRequest(std::move(captureRequest));
>  
>  	return 0;
>  }
> diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> index 777d1a35e801..b4b32f77a29a 100644
> --- a/src/android/camera_device.h
> +++ b/src/android/camera_device.h
> @@ -25,6 +25,7 @@
>  #include "libcamera/internal/message.h"
>  
>  #include "camera_stream.h"
> +#include "camera_worker.h"
>  #include "jpeg/encoder.h"
>  
>  class CameraMetadata;
> @@ -108,6 +109,8 @@ private:
>  	unsigned int id_;
>  	camera3_device_t camera3Device_;
>  
> +	CameraWorker worker_;
> +
>  	bool running_;
>  	std::shared_ptr<libcamera::Camera> camera_;
>  	std::unique_ptr<libcamera::CameraConfiguration> config_;

Patch
diff mbox series

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 0a94c1ae17ac..0e42e2e194d8 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -194,8 +194,8 @@  CameraDevice::Camera3RequestDescriptor::~Camera3RequestDescriptor()
  */
 
 CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camera)
-	: id_(id), running_(false), camera_(camera), staticMetadata_(nullptr),
-	  facing_(CAMERA_FACING_FRONT), orientation_(0)
+	: id_(id), worker_(camera), running_(false), camera_(camera),
+	  staticMetadata_(nullptr), facing_(CAMERA_FACING_FRONT), orientation_(0)
 {
 	camera_->requestCompleted.connect(this, &CameraDevice::requestComplete);
 
@@ -519,6 +519,7 @@  void CameraDevice::close()
 {
 	streams_.clear();
 
+	worker_.stop();
 	camera_->stop();
 	camera_->release();
 
@@ -1356,6 +1357,8 @@  int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 			return ret;
 		}
 
+		worker_.start();
+
 		running_ = true;
 	}
 
@@ -1377,6 +1380,7 @@  int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 
 	Request *request =
 		camera_->createRequest(reinterpret_cast<uint64_t>(descriptor));
+	std::unique_ptr<CaptureRequest> captureRequest = std::make_unique<CaptureRequest>(request);
 
 	LOG(HAL, Debug) << "Queueing Request to libcamera with "
 			<< descriptor->numBuffers << " HAL streams";
@@ -1445,16 +1449,11 @@  int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 			return -ENOMEM;
 		}
 
-		request->addBuffer(cameraStream->stream(), buffer);
+		captureRequest->addBuffer(cameraStream->stream(), buffer,
+					  camera3Buffers[i].acquire_fence);
 	}
 
-	int ret = camera_->queueRequest(request);
-	if (ret) {
-		LOG(HAL, Error) << "Failed to queue request";
-		delete request;
-		delete descriptor;
-		return ret;
-	}
+	worker_.queueRequest(std::move(captureRequest));
 
 	return 0;
 }
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 777d1a35e801..b4b32f77a29a 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -25,6 +25,7 @@ 
 #include "libcamera/internal/message.h"
 
 #include "camera_stream.h"
+#include "camera_worker.h"
 #include "jpeg/encoder.h"
 
 class CameraMetadata;
@@ -108,6 +109,8 @@  private:
 	unsigned int id_;
 	camera3_device_t camera3Device_;
 
+	CameraWorker worker_;
+
 	bool running_;
 	std::shared_ptr<libcamera::Camera> camera_;
 	std::unique_ptr<libcamera::CameraConfiguration> config_;