blob: 2e4edac17eb1f8080633bbc6dacf4e9aba348f30 [file] [log] [blame]
/*
* Copyright (C) 2019-2020 Intel Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <pthread.h>
#include <memory>
#include <mutex>
#include <string>
#include <unordered_map>
#include "CameraLog.h"
#include "Parameters.h"
#include "base/bind.h"
#include "base/callback.h"
#include "cros-camera/camera_algorithm_bridge.h"
#include "iutils/Thread.h"
#include "modules/sandboxing/IPCCommon.h"
namespace icamera {
typedef enum {
CPU_ALGO_SHM,
GPU_ALGO_SHM,
MAX_ALGO_SHM,
} ShmMemUsage;
class IntelAlgoClient : public camera_algorithm_callback_ops_t {
public:
static IntelAlgoClient* getInstance();
static void releaseInstance();
IntelAlgoClient();
virtual ~IntelAlgoClient();
void setMojoManager(cros::CameraMojoChannelManager* manager) { mMojoManager = manager; }
// Connect to the algo processes(cpu and gpu)
// It must be called after all preparation are ready in camera service
int initialize();
bool isIPCFine();
// when IPC error happens, device error
// will be sent out via the camera_callback_ops_t which belongs to CameraHal.
// before the CameraHal be terminated, set nullptr in the function.
void registerErrorCallback(const camera_callback_ops_t* errCb);
int allocateShmMem(const std::string& name, int size, int* fd, void** addr);
void releaseShmMem(const std::string& name, int size, int fd, void* addr);
int requestSync(IPC_CMD cmd, int32_t bufferHandle);
int requestSync(IPC_CMD cmd);
int32_t registerBuffer(int bufferFd, void* addr, ShmMemUsage usage = CPU_ALGO_SHM);
void deregisterBuffer(int32_t bufferHandle, ShmMemUsage usage = CPU_ALGO_SHM);
int32_t registerGbmBuffer(int bufferFd, ShmMemUsage usage = CPU_ALGO_SHM);
void deregisterGbmBuffer(int32_t bufferHandle, ShmMemUsage usage = CPU_ALGO_SHM);
int32_t getBufferHandle(void* addr, ShmMemUsage usage = CPU_ALGO_SHM);
private:
int waitCallback();
void callbackHandler(uint32_t req_id, uint32_t status, int32_t buffer_handle);
void notifyHandler(uint32_t msg);
// when the request is done, the callback will be received.
static void returnCallback(const camera_algorithm_callback_ops_t* callback_ops, uint32_t req_id,
uint32_t status, int32_t buffer_handle);
// when IPC error happens in the bridge, notifyCallback will be called.
static void notifyCallback(const struct camera_algorithm_callback_ops* callback_ops,
camera_algorithm_error_msg_code_t msg);
private:
/*
* Get access to the IntelAlgoClient singleton.
*/
static IntelAlgoClient* sInstance;
static Mutex sLock; // Guard for singleton creation.
const camera_callback_ops_t* mErrCb;
std::unique_ptr<cros::CameraAlgorithmBridge> mBridge;
std::unique_ptr<cros::CameraAlgorithmBridge> mGpuBridge;
base::Callback<void(uint32_t, uint32_t, int32_t)> mCallback;
base::Callback<void(uint32_t)> mNotifyCallback;
bool mIPCStatus; // true: no error happens, false: error happens
std::mutex mIPCStatusMutex; // the mutex for mIPCStatus
// <addr in client, buffer handle in server>
std::unordered_map<void*, int32_t> mShmMap[MAX_ALGO_SHM];
std::mutex mShmMapMutex; // the mutex for mShmMap
cros::CameraMojoChannelManager* mMojoManager;
bool mInitialized;
private:
class Runner {
public:
Runner(IPC_GROUP group, cros::CameraAlgorithmBridge* bridge);
virtual ~Runner();
int requestSync(IPC_CMD cmd, int32_t bufferHandle);
void callbackHandler(uint32_t status, int32_t buffer_handle);
private:
int waitCallback();
private:
IPC_GROUP mGroup;
cros::CameraAlgorithmBridge* mBridge;
pthread_mutex_t mCbLock;
pthread_cond_t mCbCond;
bool mIsCallbacked;
bool mCbResult; // true: success, false: fail
bool mInitialized;
std::mutex mMutex; // the mutex for the public method
};
std::unique_ptr<Runner> mRunner[IPC_GROUP_NUM];
};
} /* namespace icamera */