[libcamera-devel] [PATCH 7/8] android: camera_device: Use libcamera buffer pool

Niklas Söderlund niklas.soderlund at ragnatech.se
Thu Sep 10 13:35:05 CEST 2020


Hi Jacopo,

Thanks for your work.

On 2020-09-09 17:54:56 +0200, Jacopo Mondi wrote:
> Now that we have reserved and made available to the camera HAL a
> pool of libcamera allocated buffers, use them when a CameraStream
> instance that requires internal allocation is processed.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/android/camera_device.cpp | 47 +++++++++++++++++++++++++----------
>  1 file changed, 34 insertions(+), 13 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index a7cb1be03b9a..f94b313581e7 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -1422,6 +1422,8 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
>  	for (unsigned int i = 0; i < descriptor->numBuffers; ++i) {
>  		CameraStream *cameraStream =
>  			static_cast<CameraStream *>(camera3Buffers[i].stream->priv);
> +		const StreamConfiguration &config = config_->at(cameraStream->index());
> +		Stream *stream = config.stream();
>  
>  		/*
>  		 * Keep track of which stream the request belongs to and store
> @@ -1430,27 +1432,39 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
>  		descriptor->buffers[i].stream = camera3Buffers[i].stream;
>  		descriptor->buffers[i].buffer = camera3Buffers[i].buffer;
>  
> -		/* Software streams are handled after hardware streams complete. */
> -		if (cameraStream->format() == formats::MJPEG)
> +		/* Mapped streams don't need to be added to the Request. */
> +		if (cameraStream->type() == CameraStream::Type::Mapped)
>  			continue;
>  
> -		/*
> -		 * Create a libcamera buffer using the dmabuf descriptors of
> -		 * the camera3Buffer for each stream. The FrameBuffer is
> -		 * directly associated with the Camera3RequestDescriptor for
> -		 * lifetime management only.
> -		 */
> -		FrameBuffer *buffer = createFrameBuffer(*camera3Buffers[i].buffer);
> +		FrameBuffer *buffer;
> +		if (cameraStream->type() == CameraStream::Type::Direct) {
> +			/*
> +			 * Create a libcamera buffer using the dmabuf
> +			 * descriptors of the camera3Buffer for each stream and
> +			 * associate it with the Camera3RequestDescriptor for
> +			 * lifetime management only.
> +			 */
> +			buffer = createFrameBuffer(*camera3Buffers[i].buffer);
> +			descriptor->frameBuffers.emplace_back(buffer);
> +
> +		} else {
> +			/*
> +			 * Get the frame buffer from the CameraStream internal
> +			 * buffer pool. The lifetime management of internal
> +			 * buffers is connected to the one of the
> +			 * FrameBufferAllocator instance.
> +			 *
> +			 * The retrieved buffer has to be returned to the
> +			 * allocator once it has been processed.
> +			 */
> +			buffer = allocator_.getBuffer(stream);

Should we add a LOG(Error) if there are no free buffers to retrieve form 
the allocator?

> +		}
>  		if (!buffer) {
>  			LOG(HAL, Error) << "Failed to create buffer";
>  			delete request;
>  			delete descriptor;
>  			return -ENOMEM;
>  		}
> -		descriptor->frameBuffers.emplace_back(buffer);
> -
> -		StreamConfiguration *streamConfiguration = &config_->at(cameraStream->index());
> -		Stream *stream = streamConfiguration->stream();
>  
>  		request->addBuffer(stream, buffer);
>  	}
> @@ -1561,6 +1575,13 @@ void CameraDevice::requestComplete(Request *request)
>  		const uint32_t jpeg_orientation = 0;
>  		resultMetadata->addEntry(ANDROID_JPEG_ORIENTATION,
>  					 &jpeg_orientation, 1);
> +
> +		/*
> +		 * Return the FrameBuffer to the CameraStream now that we're
> +		 * done processing it.
> +		 */
> +		if (cameraStream->type() == CameraStream::Type::Internal)
> +			allocator_.returnBuffer(stream, buffer);

Seeing how the getBuffer() and returnBuffer() is used here could it not 
be replaced with a  std::queue in a similar fashion we have in 
pipeline handlers?

>  	}
>  
>  	/* Prepare to call back the Android camera stack. */
> -- 
> 2.28.0
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list