[libcamera-devel] [PATCH v2 11/13] android: camera_device: Use CameraStream buffers

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Oct 6 22:01:00 CEST 2020


Hi Jacopo,

On 06/10/2020 15:44, Jacopo Mondi wrote:
> Now that CameraStream that require internal memory allocation
> have been instrumented with a FrameBuffer pool, use them to create
> intermediate buffers in the CameraDevice.

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/android/camera_device.cpp | 51 ++++++++++++++++++++++++++++-------
>  1 file changed, 41 insertions(+), 10 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index ecdc0922e90b..b2fec7040038 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -1387,24 +1387,48 @@ 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->camera3Stream().format == HAL_PIXEL_FORMAT_BLOB)
> -			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.
> +		 * Inspect the camera stream type, create buffers opportunely
> +		 * and add them to the Request if required.
>  		 */
> -		FrameBuffer *buffer = createFrameBuffer(*camera3Buffers[i].buffer);
> +		FrameBuffer *buffer;
> +		switch (cameraStream->type()) {
> +		case CameraStream::Type::Mapped:
> +			/*
> +			 * Mapped streams don't need buffers added to the
> +			 * Request.
> +			 */
> +			continue;
> +
> +		case 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);
> +			break;
> +
> +		case CameraStream::Type::Internal:
> +			/*
> +			 * Get the frame buffer from the CameraStream internal
> +			 * buffer pool.
> +			 *
> +			 * The buffer has to be returned to the CameraStream
> +			 * once it has been processed.
> +			 */
> +			buffer = cameraStream->getBuffer();
> +			break;
> +		}
> +
>  		if (!buffer) {
>  			LOG(HAL, Error) << "Failed to create buffer";
>  			delete request;
>  			delete descriptor;
>  			return -ENOMEM;
>  		}
> -		descriptor->frameBuffers.emplace_back(buffer);
>  
>  		request->addBuffer(cameraStream->stream(), buffer);
>  	}
> @@ -1476,6 +1500,13 @@ void CameraDevice::requestComplete(Request *request)
>  			status = CAMERA3_BUFFER_STATUS_ERROR;
>  			continue;
>  		}
> +
> +		/*
> +		 * Return the FrameBuffer to the CameraStream now that we're
> +		 * done processing it.
> +		 */
> +		if (cameraStream->type() == CameraStream::Type::Internal)
> +			cameraStream->putBuffer(buffer);
>  	}
>  
>  	/* Prepare to call back the Android camera stack. */
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list