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:
Jacopo Mondi 2019-10-27 02:01:08 +01:00 committed by Laurent Pinchart
parent 1f1d27cc14
commit 53eab99680
7 changed files with 11 additions and 118 deletions

View file

@ -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,

View file

@ -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);

View file

@ -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();
}

View file

@ -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_;

View file

@ -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([

View file

@ -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_; });
}

View file

@ -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__ */