mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-16 17:05:08 +03:00
android: camera_device: Use CameraStream buffers
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: Umang Jain <email@uajain.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
parent
b84e35dc97
commit
de8304b116
1 changed files with 41 additions and 10 deletions
|
@ -1387,24 +1387,48 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
|
||||||
descriptor->buffers[i].stream = camera3Buffers[i].stream;
|
descriptor->buffers[i].stream = camera3Buffers[i].stream;
|
||||||
descriptor->buffers[i].buffer = camera3Buffers[i].buffer;
|
descriptor->buffers[i].buffer = camera3Buffers[i].buffer;
|
||||||
|
|
||||||
/* Software streams are handled after hardware streams complete. */
|
/*
|
||||||
if (cameraStream->camera3Stream().format == HAL_PIXEL_FORMAT_BLOB)
|
* Inspect the camera stream type, create buffers opportunely
|
||||||
|
* and add them to the Request if required.
|
||||||
|
*/
|
||||||
|
FrameBuffer *buffer = nullptr;
|
||||||
|
switch (cameraStream->type()) {
|
||||||
|
case CameraStream::Type::Mapped:
|
||||||
|
/*
|
||||||
|
* Mapped streams don't need buffers added to the
|
||||||
|
* Request.
|
||||||
|
*/
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
case CameraStream::Type::Direct:
|
||||||
* Create a libcamera buffer using the dmabuf descriptors of
|
/*
|
||||||
* the camera3Buffer for each stream. The FrameBuffer is
|
* Create a libcamera buffer using the dmabuf
|
||||||
* directly associated with the Camera3RequestDescriptor for
|
* descriptors of the camera3Buffer for each stream and
|
||||||
* lifetime management only.
|
* associate it with the Camera3RequestDescriptor for
|
||||||
*/
|
* lifetime management only.
|
||||||
FrameBuffer *buffer = createFrameBuffer(*camera3Buffers[i].buffer);
|
*/
|
||||||
|
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) {
|
if (!buffer) {
|
||||||
LOG(HAL, Error) << "Failed to create buffer";
|
LOG(HAL, Error) << "Failed to create buffer";
|
||||||
delete request;
|
delete request;
|
||||||
delete descriptor;
|
delete descriptor;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
descriptor->frameBuffers.emplace_back(buffer);
|
|
||||||
|
|
||||||
request->addBuffer(cameraStream->stream(), buffer);
|
request->addBuffer(cameraStream->stream(), buffer);
|
||||||
}
|
}
|
||||||
|
@ -1476,6 +1500,13 @@ void CameraDevice::requestComplete(Request *request)
|
||||||
status = CAMERA3_BUFFER_STATUS_ERROR;
|
status = CAMERA3_BUFFER_STATUS_ERROR;
|
||||||
continue;
|
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. */
|
/* Prepare to call back the Android camera stack. */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue