blob: 34af9bf472730c0b4406615cf398cbc7c27df8ee [file] [log] [blame]
/*
* Copyright (C) 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.
*/
#define LOG_TAG "IntelCPUAlgoServer"
#include "modules/sandboxing/server/IntelCPUAlgoServer.h"
#include <ia_log.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <memory>
#include <string>
#include "iutils/Utils.h"
namespace icamera {
IntelCPUAlgoServer::IntelCPUAlgoServer(IntelAlgoServer* server) : RequestHandler(server) {
LOGIPC("@%s", __func__);
}
void IntelCPUAlgoServer::handleRequest(const MsgReq& msg) {
uint32_t req_id = msg.req_id;
int32_t buffer_handle = msg.buffer_handle;
ShmInfo info = {};
status_t status = getIntelAlgoServer()->getShmInfo(buffer_handle, &info);
if (status != OK) {
LOGE("@%s, Invalid buffer handle", __func__);
getIntelAlgoServer()->returnCallback(req_id, UNKNOWN_ERROR, buffer_handle);
return;
}
size_t requestSize = info.size;
void* addr = info.addr;
LOGIPC("@%s, req_id:%d:%s, requestSize:%zu, addr:%p, buffer_handle:%d", __func__, req_id,
IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)), requestSize, addr, buffer_handle);
switch (req_id) {
case IPC_LARD_INIT:
status = mLard.init(addr, requestSize);
break;
case IPC_LARD_GET_TAG_LIST:
status = mLard.getTagList(addr, requestSize);
break;
case IPC_LARD_RUN:
status = mLard.run(addr, requestSize);
break;
case IPC_LARD_DEINIT:
status = mLard.deinit(addr, requestSize);
break;
case IPC_FD_INIT:
status = mFaceDetection.init(addr, requestSize);
break;
case IPC_FD_RUN: {
FaceDetectionRunParams* palParams = static_cast<FaceDetectionRunParams*>(addr);
void* addrImage = nullptr;
if (palParams->bufferHandle >= 0) {
ShmInfo imageDataInfo;
status = getIntelAlgoServer()->getShmInfo(palParams->bufferHandle, &imageDataInfo);
if (status != OK) {
LOGE("%s, the buffer handle for image data is invalid", __func__);
break;
}
addrImage = imageDataInfo.addr;
}
status = mFaceDetection.run(addr, requestSize, addrImage);
break;
}
case IPC_FD_DEINIT:
status = mFaceDetection.deinit();
break;
case IPC_GRAPH_ADD_KEY:
mGraph.addCustomKeyMap();
break;
case IPC_GRAPH_PARSE:
mGraph.parse(addr, requestSize);
break;
case IPC_GRAPH_RELEASE_NODES:
mGraph.releaseGraphNodes();
break;
case IPC_GRAPH_CONFIG_STREAMS:
mGraph.configStreams(addr, requestSize);
break;
case IPC_GRAPH_GET_CONFIG_DATA:
mGraph.getGraphConfigData(addr, requestSize);
break;
case IPC_GRAPH_GET_CONNECTION:
mGraph.pipelineGetConnections(addr, requestSize);
break;
case IPC_GRAPH_GET_PG_ID:
mGraph.getPgIdForKernel(addr, requestSize);
break;
case IPC_CMC_INIT:
status = mCmc.init(addr, requestSize);
break;
case IPC_CMC_DEINIT:
status = mCmc.deinit(addr, requestSize);
break;
case IPC_MKN_INIT:
status = mMkn.init(addr, requestSize);
break;
case IPC_MKN_ENABLE:
status = mMkn.enable(addr, requestSize);
break;
case IPC_MKN_PREPARE:
status = mMkn.prepare(addr, requestSize);
break;
case IPC_MKN_DEINIT:
status = mMkn.deinit(addr, requestSize);
break;
case IPC_LTM_INIT:
status = mLtm.init(addr, requestSize);
break;
case IPC_LTM_RUN:
status = mLtm.run(addr, requestSize);
break;
case IPC_LTM_DEINIT:
status = mLtm.deinit(addr, requestSize);
break;
case IPC_AIQ_INIT:
status = mAiq.init(addr, requestSize);
break;
case IPC_AIQ_AE_RUN:
status = mAiq.aeRun(addr, requestSize);
break;
case IPC_AIQ_AF_RUN:
status = mAiq.afRun(addr, requestSize);
break;
case IPC_AIQ_AWB_RUN:
status = mAiq.awbRun(addr, requestSize);
break;
case IPC_AIQ_GBCE_RUN:
status = mAiq.gbceRun(addr, requestSize);
break;
case IPC_AIQ_PA_RUN_V1:
status = mAiq.paRunV1(addr, requestSize);
break;
case IPC_AIQ_SA_RUN_V2:
status = mAiq.saRunV2(addr, requestSize);
break;
case IPC_AIQ_STATISTICS_SET_V4:
status = mAiq.statisticsSetV4(addr, requestSize);
break;
case IPC_AIQ_GET_AIQD_DATA:
status = mAiq.getAiqdData(addr, requestSize);
break;
case IPC_AIQ_DEINIT:
status = mAiq.deinit(addr, requestSize);
break;
case IPC_AIQ_GET_VERSION:
status = mAiq.getVersion(addr, requestSize);
break;
case IPC_DVS_INIT:
status = mDvs.init(addr, requestSize);
break;
case IPC_DVS_CONFIG:
status = mDvs.config(addr, requestSize);
break;
case IPC_DVS_SET_NONE_BLANK_RATION:
status = mDvs.setNonBlankRatio(addr, requestSize);
break;
case IPC_DVS_SET_DIGITAL_ZOOM_MODE:
status = mDvs.setDigitalZoomMode(addr, requestSize);
break;
case IPC_DVS_SET_DIGITAL_ZOOM_REGION:
status = mDvs.setDigitalZoomRegion(addr, requestSize);
break;
case IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE:
status = mDvs.setDigitalZoomCoordinate(addr, requestSize);
break;
case IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE:
status = mDvs.setDigitalZoomMagnitude(addr, requestSize);
break;
case IPC_DVS_FREE_MORPH_TABLE:
status = mDvs.freeMorphTable(addr, requestSize);
break;
case IPC_DVS_ALLOCATE_MORPH_TABLE:
status = mDvs.allocateMorphTalbe(addr, requestSize);
break;
case IPC_DVS_GET_MORPH_TABLE:
status = mDvs.getMorphTalbe(addr, requestSize);
break;
case IPC_DVS_SET_STATISTICS:
status = mDvs.setStatistics(addr, requestSize);
break;
case IPC_DVS_EXECUTE:
status = mDvs.execute(addr, requestSize);
break;
case IPC_DVS_GET_IMAGE_TRANSFORMATION:
status = mDvs.getImageTransformation(addr, requestSize);
break;
case IPC_DVS_DEINIT:
status = mDvs.deinit(addr, requestSize);
break;
case IPC_ISP_ADAPTOR_INIT:
status = mIspAdaptor.init(addr, requestSize);
break;
case IPC_ISP_ADAPTOR_DEINIT:
status = mIspAdaptor.deInit(addr, requestSize);
break;
case IPC_ISP_GET_PAL_SIZE:
status = mIspAdaptor.getPalDataSize(addr, requestSize);
break;
case IPC_ISP_CONVERT_STATS: {
ConvertStatsParam* params = static_cast<ConvertStatsParam*>(addr);
ShmInfo statsDataInfo = {};
status = getIntelAlgoServer()->getShmInfo(params->statsHandle, &statsDataInfo);
if (status == OK) {
status = mIspAdaptor.queryAndConvertStats(addr, requestSize, statsDataInfo.addr);
} else {
LOGE("%s, the buffer handle for stats data is invalid", __func__);
}
break;
}
case IPC_ISP_RUN_PAL: {
RunPalParam* palParams = static_cast<RunPalParam*>(addr);
ShmInfo palDataInfo;
status = getIntelAlgoServer()->getShmInfo(palParams->palDataHandle, &palDataInfo);
if (status != OK) {
LOGE("%s, the buffer handle for pal data is invalid", __func__);
break;
}
LOGIPC("@%s, pal data info: fd:%d, size:%zu, addr: %p", __func__, palDataInfo.fd,
palDataInfo.size, palDataInfo.addr);
status = mIspAdaptor.runPal(addr, requestSize, palDataInfo.addr);
break;
}
case IPC_PG_PARAM_INIT:
status = mPGParam.init(addr, requestSize);
break;
case IPC_PG_PARAM_PREPARE: {
pg_param_prepare_params* prepareParams = static_cast<pg_param_prepare_params*>(addr);
ShmInfo palDataInfo = {};
status = getIntelAlgoServer()->getShmInfo(prepareParams->ipuParamHandle, &palDataInfo);
if (status != OK) {
LOGE("%s, the buffer handle for pal data is invalid", __func__);
break;
}
status = mPGParam.prepare(addr, requestSize, palDataInfo.addr);
break;
}
case IPC_PG_PARAM_ALLOCATE_PG:
status = mPGParam.allocatePGBuffer(addr, requestSize);
break;
case IPC_PG_PARAM_GET_FRAG_DESCS:
status = mPGParam.getFragmentDescriptors(addr, requestSize);
break;
case IPC_PG_PARAM_PREPARE_PROGRAM:
status = mPGParam.setPGAndPrepareProgram(addr, requestSize);
break;
case IPC_PG_PARAM_REGISTER_PAYLOADS:
status = mPGParam.registerPayloads(addr, requestSize);
break;
case IPC_PG_PARAM_ENCODE: {
pg_param_encode_params* encodeParams = static_cast<pg_param_encode_params*>(addr);
ShmInfo palDataInfo = {};
status = getIntelAlgoServer()->getShmInfo(encodeParams->ipuParamHandle, &palDataInfo);
if (status != OK) {
LOGE("%s, the buffer handle for pal data is invalid", __func__);
break;
}
status = mPGParam.updatePALAndEncode(addr, requestSize, palDataInfo.addr);
break;
}
case IPC_PG_PARAM_DECODE: {
pg_param_decode_params* decodeParams = static_cast<pg_param_decode_params*>(addr);
ShmInfo decodeInfo = {};
status = getIntelAlgoServer()->getShmInfo(decodeParams->clientStatsHandle, &decodeInfo);
if (status == OK) {
status = mPGParam.decode(addr, requestSize, decodeInfo.addr);
} else {
LOGE("%s, the buffer handle for stats data is invalid", __func__);
}
break;
}
case IPC_PG_PARAM_DEINIT:
mPGParam.deinit(addr, requestSize);
break;
default:
LOGE("@%s, req_id:%d is not defined", __func__, req_id);
status = UNKNOWN_ERROR;
break;
}
LOGIPC("@%s, req_id:%d:%s, status:%d", __func__, req_id,
IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)), status);
getIntelAlgoServer()->returnCallback(req_id, status, buffer_handle);
}
} // namespace icamera