android: Replace ThreadRPC with blocking method call
Use the newly introduced InvocationTypeBlocking message type to replace the blocking message delivery implemented with the ThreadRPC class in the Android camera HAL. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
parent
1f1d27cc14
commit
53eab99680
7 changed files with 11 additions and 118 deletions
|
@ -11,7 +11,6 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#include "camera_metadata.h"
|
#include "camera_metadata.h"
|
||||||
#include "thread_rpc.h"
|
|
||||||
|
|
||||||
using namespace libcamera;
|
using namespace libcamera;
|
||||||
|
|
||||||
|
@ -64,25 +63,6 @@ CameraDevice::~CameraDevice()
|
||||||
delete it.second;
|
delete it.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Handle RPC request received from the associated proxy.
|
|
||||||
*/
|
|
||||||
void CameraDevice::call(ThreadRpc *rpc)
|
|
||||||
{
|
|
||||||
switch (rpc->tag) {
|
|
||||||
case ThreadRpc::ProcessCaptureRequest:
|
|
||||||
processCaptureRequest(rpc->request);
|
|
||||||
break;
|
|
||||||
case ThreadRpc::Close:
|
|
||||||
close();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOG(HAL, Error) << "Unknown RPC operation: " << rpc->tag;
|
|
||||||
}
|
|
||||||
|
|
||||||
rpc->notifyReception();
|
|
||||||
}
|
|
||||||
|
|
||||||
int CameraDevice::open()
|
int CameraDevice::open()
|
||||||
{
|
{
|
||||||
int ret = camera_->acquire();
|
int ret = camera_->acquire();
|
||||||
|
@ -698,7 +678,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Request)
|
void CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Request)
|
||||||
{
|
{
|
||||||
StreamConfiguration *streamConfiguration = &config_->at(0);
|
StreamConfiguration *streamConfiguration = &config_->at(0);
|
||||||
Stream *stream = streamConfiguration->stream();
|
Stream *stream = streamConfiguration->stream();
|
||||||
|
@ -706,7 +686,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
|
||||||
if (camera3Request->num_output_buffers != 1) {
|
if (camera3Request->num_output_buffers != 1) {
|
||||||
LOG(HAL, Error) << "Invalid number of output buffers: "
|
LOG(HAL, Error) << "Invalid number of output buffers: "
|
||||||
<< camera3Request->num_output_buffers;
|
<< camera3Request->num_output_buffers;
|
||||||
return -EINVAL;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start the camera if that's the first request we handle. */
|
/* Start the camera if that's the first request we handle. */
|
||||||
|
@ -714,14 +694,14 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
|
||||||
int ret = camera_->allocateBuffers();
|
int ret = camera_->allocateBuffers();
|
||||||
if (ret) {
|
if (ret) {
|
||||||
LOG(HAL, Error) << "Failed to allocate buffers";
|
LOG(HAL, Error) << "Failed to allocate buffers";
|
||||||
return ret;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = camera_->start();
|
ret = camera_->start();
|
||||||
if (ret) {
|
if (ret) {
|
||||||
LOG(HAL, Error) << "Failed to start camera";
|
LOG(HAL, Error) << "Failed to start camera";
|
||||||
camera_->freeBuffers();
|
camera_->freeBuffers();
|
||||||
return ret;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
running_ = true;
|
running_ = true;
|
||||||
|
@ -769,7 +749,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
|
||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
LOG(HAL, Error) << "Failed to create buffer";
|
LOG(HAL, Error) << "Failed to create buffer";
|
||||||
delete descriptor;
|
delete descriptor;
|
||||||
return -EINVAL;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Request *request =
|
Request *request =
|
||||||
|
@ -782,13 +762,11 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
delete request;
|
delete request;
|
||||||
delete descriptor;
|
delete descriptor;
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraDevice::requestComplete(Request *request,
|
void CameraDevice::requestComplete(Request *request,
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
#include "message.h"
|
#include "message.h"
|
||||||
|
|
||||||
class CameraMetadata;
|
class CameraMetadata;
|
||||||
class ThreadRpc;
|
|
||||||
|
|
||||||
class CameraDevice : public libcamera::Object
|
class CameraDevice : public libcamera::Object
|
||||||
{
|
{
|
||||||
|
@ -28,15 +27,13 @@ public:
|
||||||
CameraDevice(unsigned int id, const std::shared_ptr<libcamera::Camera> &camera);
|
CameraDevice(unsigned int id, const std::shared_ptr<libcamera::Camera> &camera);
|
||||||
~CameraDevice();
|
~CameraDevice();
|
||||||
|
|
||||||
void call(ThreadRpc *rpc);
|
|
||||||
|
|
||||||
int open();
|
int open();
|
||||||
void close();
|
void close();
|
||||||
void setCallbacks(const camera3_callback_ops_t *callbacks);
|
void setCallbacks(const camera3_callback_ops_t *callbacks);
|
||||||
camera_metadata_t *getStaticMetadata();
|
camera_metadata_t *getStaticMetadata();
|
||||||
const camera_metadata_t *constructDefaultRequestSettings(int type);
|
const camera_metadata_t *constructDefaultRequestSettings(int type);
|
||||||
int configureStreams(camera3_stream_configuration_t *stream_list);
|
int configureStreams(camera3_stream_configuration_t *stream_list);
|
||||||
int processCaptureRequest(camera3_capture_request_t *request);
|
void processCaptureRequest(camera3_capture_request_t *request);
|
||||||
void requestComplete(libcamera::Request *request,
|
void requestComplete(libcamera::Request *request,
|
||||||
const std::map<libcamera::Stream *, libcamera::Buffer *> &buffers);
|
const std::map<libcamera::Stream *, libcamera::Buffer *> &buffers);
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#include "camera_device.h"
|
#include "camera_device.h"
|
||||||
#include "thread_rpc.h"
|
|
||||||
|
|
||||||
using namespace libcamera;
|
using namespace libcamera;
|
||||||
|
|
||||||
|
@ -148,10 +147,8 @@ int CameraProxy::open(const hw_module_t *hardwareModule)
|
||||||
|
|
||||||
void CameraProxy::close()
|
void CameraProxy::close()
|
||||||
{
|
{
|
||||||
ThreadRpc rpcRequest;
|
cameraDevice_->invokeMethod(&CameraDevice::close,
|
||||||
rpcRequest.tag = ThreadRpc::Close;
|
ConnectionTypeBlocking);
|
||||||
|
|
||||||
threadRpcCall(rpcRequest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraProxy::initialize(const camera3_callback_ops_t *callbacks)
|
void CameraProxy::initialize(const camera3_callback_ops_t *callbacks)
|
||||||
|
@ -176,18 +173,8 @@ int CameraProxy::configureStreams(camera3_stream_configuration_t *stream_list)
|
||||||
|
|
||||||
int CameraProxy::processCaptureRequest(camera3_capture_request_t *request)
|
int CameraProxy::processCaptureRequest(camera3_capture_request_t *request)
|
||||||
{
|
{
|
||||||
ThreadRpc rpcRequest;
|
cameraDevice_->invokeMethod(&CameraDevice::processCaptureRequest,
|
||||||
rpcRequest.tag = ThreadRpc::ProcessCaptureRequest;
|
ConnectionTypeBlocking, request);
|
||||||
rpcRequest.request = request;
|
|
||||||
|
|
||||||
threadRpcCall(rpcRequest);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraProxy::threadRpcCall(ThreadRpc &rpcRequest)
|
|
||||||
{
|
|
||||||
cameraDevice_->invokeMethod(&CameraDevice::call, ConnectionTypeQueued,
|
|
||||||
&rpcRequest);
|
|
||||||
rpcRequest.waitDelivery();
|
|
||||||
}
|
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
#include <libcamera/camera.h>
|
#include <libcamera/camera.h>
|
||||||
|
|
||||||
class CameraDevice;
|
class CameraDevice;
|
||||||
class ThreadRpc;
|
|
||||||
|
|
||||||
class CameraProxy
|
class CameraProxy
|
||||||
{
|
{
|
||||||
|
@ -35,8 +34,6 @@ public:
|
||||||
camera3_device_t *camera3Device() { return &camera3Device_; }
|
camera3_device_t *camera3Device() { return &camera3Device_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void threadRpcCall(ThreadRpc &rpcRequest);
|
|
||||||
|
|
||||||
unsigned int id_;
|
unsigned int id_;
|
||||||
CameraDevice *cameraDevice_;
|
CameraDevice *cameraDevice_;
|
||||||
camera3_device_t camera3Device_;
|
camera3_device_t camera3Device_;
|
||||||
|
|
|
@ -4,7 +4,6 @@ android_hal_sources = files([
|
||||||
'camera_device.cpp',
|
'camera_device.cpp',
|
||||||
'camera_metadata.cpp',
|
'camera_metadata.cpp',
|
||||||
'camera_proxy.cpp',
|
'camera_proxy.cpp',
|
||||||
'thread_rpc.cpp'
|
|
||||||
])
|
])
|
||||||
|
|
||||||
android_camera_metadata_sources = files([
|
android_camera_metadata_sources = files([
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2019, Google Inc.
|
|
||||||
*
|
|
||||||
* thread_rpc.cpp - Inter-thread procedure call
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "thread.h"
|
|
||||||
#include "thread_rpc.h"
|
|
||||||
|
|
||||||
using namespace libcamera;
|
|
||||||
|
|
||||||
void ThreadRpc::notifyReception()
|
|
||||||
{
|
|
||||||
{
|
|
||||||
libcamera::MutexLocker locker(mutex_);
|
|
||||||
delivered_ = true;
|
|
||||||
}
|
|
||||||
cv_.notify_one();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThreadRpc::waitDelivery()
|
|
||||||
{
|
|
||||||
libcamera::MutexLocker locker(mutex_);
|
|
||||||
cv_.wait(locker, [&] { return delivered_; });
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2019, Google Inc.
|
|
||||||
*
|
|
||||||
* thread_rpc.h - Inter-thread procedure call
|
|
||||||
*/
|
|
||||||
#ifndef __ANDROID_THREAD_RPC_H__
|
|
||||||
#define __ANDROID_THREAD_RPC_H__
|
|
||||||
|
|
||||||
#include <condition_variable>
|
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
#include <hardware/camera3.h>
|
|
||||||
|
|
||||||
class ThreadRpc
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum RpcTag {
|
|
||||||
ProcessCaptureRequest,
|
|
||||||
Close,
|
|
||||||
};
|
|
||||||
|
|
||||||
ThreadRpc()
|
|
||||||
: delivered_(false) {}
|
|
||||||
|
|
||||||
void notifyReception();
|
|
||||||
void waitDelivery();
|
|
||||||
|
|
||||||
RpcTag tag;
|
|
||||||
|
|
||||||
camera3_capture_request_t *request;
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool delivered_;
|
|
||||||
std::mutex mutex_;
|
|
||||||
std::condition_variable cv_;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* __ANDROID_THREAD_RPC_H__ */
|
|
Loading…
Add table
Add a link
Reference in a new issue