blob: 2de3c5a6e855b764a60ed1631a16533a8fe8ce05 [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 "IntelTNRClient"
#include "modules/sandboxing/client/IntelTNR7US.h"
#include <string>
#include "iutils/CameraLog.h"
#include "iutils/Utils.h"
namespace icamera {
IntelTNR7US::IntelTNR7US(int cameraId)
: mCameraId(cameraId),
mTnrType(TNR_INSTANCE_MAX),
mTnrRequestInfo(nullptr) {
LOG1("%s ", __func__);
}
IntelTNR7US::~IntelTNR7US() {
LOG1("%s ", __func__);
// the instance not initialized, don't need to free
if (mTnrType != TNR_INSTANCE_MAX) {
mTnrRequestInfo->type = mTnrType;
mTnrRequestInfo->cameraId = mCameraId;
int32_t requestHandle =
mCommon.getShmMemHandle(static_cast<void*>(mTnrRequestInfo), GPU_ALGO_SHM);
int ret = mCommon.requestSync(IPC_GPU_TNR_DEINIT, requestHandle);
CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
mCommon.freeShmMem(mTnrRequestInfoMem, GPU_ALGO_SHM);
}
}
int IntelTNR7US::init(int width, int height, TnrType type) {
uintptr_t personal = reinterpret_cast<uintptr_t>(this);
std::string initName = "/TnrRun" + std::to_string(personal) + "Shm";
mTnrRequestInfoMem.mName = initName.c_str();
mTnrRequestInfoMem.mSize = sizeof(TnrRequestInfo);
bool ret = mCommon.allocShmMem(mTnrRequestInfoMem.mName, mTnrRequestInfoMem.mSize,
&mTnrRequestInfoMem, GPU_ALGO_SHM);
CheckError(!ret, UNKNOWN_ERROR, "@%s, allocShmMem fails", __func__);
mTnrRequestInfo = static_cast<TnrRequestInfo*>(mTnrRequestInfoMem.mAddr);
initName = "/TnrInit" + std::to_string(personal) + "Shm";
ShmMemInfo initInfoMems;
initInfoMems.mName = initName.c_str();
initInfoMems.mSize = sizeof(TnrInitInfo);
ret = mCommon.allocShmMem(initInfoMems.mName, initInfoMems.mSize, &initInfoMems, GPU_ALGO_SHM);
if (!ret) {
LOGE("@%s, alloc initInfo ShmMem fails", __func__);
mCommon.freeShmMem(mTnrRequestInfoMem, GPU_ALGO_SHM);
return UNKNOWN_ERROR;
}
TnrInitInfo* initInfo = static_cast<TnrInitInfo*>(initInfoMems.mAddr);
*initInfo = {width, height, mCameraId, type};
ret = mCommon.requestSync(IPC_GPU_TNR_INIT, initInfoMems.mHandle);
if (!ret) {
LOGE("@%s, IPC %d failed", __func__, IPC_GPU_TNR_INIT);
mCommon.freeShmMem(mTnrRequestInfoMem, GPU_ALGO_SHM);
}
mCommon.freeShmMem(initInfoMems, GPU_ALGO_SHM);
mTnrType = type;
LOG1("%s size %dx%d, type %d", __func__, width, height, mTnrType);
return ret ? OK : UNKNOWN_ERROR;
}
int IntelTNR7US::runTnrFrame(const void* inBufAddr, void* outBufAddr, uint32_t inBufSize,
uint32_t outBufSize, Tnr7Param* tnrParam, bool syncUpdate, int fd) {
LOG1("%s type:%d", __func__, mTnrType);
CheckError(!inBufAddr || !outBufAddr || !tnrParam, UNKNOWN_ERROR,
"@%s, invalid data buffer or parameter buffer", __func__);
int32_t inHandle = mCommon.getShmMemHandle(const_cast<void*>(inBufAddr), GPU_ALGO_SHM);
CheckError(inHandle < 0, UNKNOWN_ERROR, "@%s, can't find inBuf handle", __func__);
CheckError(mParamMems.mAddr != tnrParam, UNKNOWN_ERROR, "@%s, invalid tnr parameter", __func__);
if (fd >= 0) {
LOG1("%s type:%d using usr buffer fd: %d", __func__, mTnrType, fd);
mTnrRequestInfo->outHandle = mCommon.registerGbmBuffer(fd, GPU_ALGO_SHM);
} else {
mTnrRequestInfo->outHandle =
mCommon.getShmMemHandle(static_cast<void*>(outBufAddr), GPU_ALGO_SHM);
}
CheckError(mTnrRequestInfo->outHandle < 0, UNKNOWN_ERROR, "@%s, can't init outBuf handle",
__func__);
mTnrRequestInfo->inHandle = inHandle;
mTnrRequestInfo->paramHandle = mParamMems.mHandle;
mTnrRequestInfo->type = mTnrType;
mTnrRequestInfo->cameraId = mCameraId;
mTnrRequestInfo->outBufFd = fd;
mTnrRequestInfo->isForceUpdate = syncUpdate;
int32_t requestHandle =
mCommon.getShmMemHandle(static_cast<void*>(mTnrRequestInfo), GPU_ALGO_SHM);
bool ret = mCommon.requestSync(IPC_GPU_TNR_RUN_FRAME, requestHandle);
if (fd >= 0) {
mCommon.deregisterGbmBuffer(mTnrRequestInfo->outHandle, GPU_ALGO_SHM);
}
CheckError(!ret, OK, "@%s, run tnr fails", __func__);
return OK;
}
void* IntelTNR7US::allocCamBuf(uint32_t bufSize, int id) {
LOG1("Enter %s type:%d, size %d", __func__, mTnrType, bufSize);
uintptr_t personal = reinterpret_cast<uintptr_t>(this);
std::string initName = "/TnrCam" + std::to_string(personal) + std::to_string(id) + "Shm";
ShmMemInfo shm;
shm.mName = initName.c_str();
shm.mSize = bufSize;
bool ret = mCommon.allocShmMem(shm.mName, shm.mSize, &shm, GPU_ALGO_SHM);
CheckError(!ret, nullptr, "@%s, allocShmMem fails", __func__);
mTnrRequestInfo->surfaceHandle = shm.mHandle;
mTnrRequestInfo->type = mTnrType;
mTnrRequestInfo->cameraId = mCameraId;
int32_t requestHandle =
mCommon.getShmMemHandle(static_cast<void*>(mTnrRequestInfo), GPU_ALGO_SHM);
ret = mCommon.requestSync(IPC_GPU_TNR_PREPARE_SURFACE, requestHandle);
if (!ret) {
mCommon.freeShmMem(shm, GPU_ALGO_SHM);
return nullptr;
}
mCamBufMems.push_back(shm);
LOG1("Exit %s Fd: %d", __func__, shm.mFd);
return shm.mAddr;
}
void IntelTNR7US::freeAllBufs() {
LOG1("%s type:%d", __func__, mTnrType);
if (mParamMems.mAddr) {
mCommon.freeShmMem(mParamMems, GPU_ALGO_SHM);
}
for (auto& camBuf : mCamBufMems) {
if (camBuf.mAddr) {
mCommon.freeShmMem(camBuf, GPU_ALGO_SHM);
}
}
}
Tnr7Param* IntelTNR7US::allocTnr7ParamBuf() {
LOG1("%s type:%d", __func__, mTnrType);
uintptr_t personal = reinterpret_cast<uintptr_t>(this);
std::string initName = "/TnrParam" + std::to_string(personal) + "Shm";
mParamMems.mName = initName.c_str();
mParamMems.mSize = sizeof(Tnr7Param);
bool ret = mCommon.allocShmMem(mParamMems.mName, mParamMems.mSize, &mParamMems, GPU_ALGO_SHM);
CheckError(!ret, nullptr, "@%s, allocShmMem fails", __func__);
return reinterpret_cast<Tnr7Param*>(mParamMems.mAddr);
}
int IntelTNR7US::asyncParamUpdate(int gain, bool forceUpdate) {
LOG1("%s type:%d", __func__, mTnrType);
mTnrRequestInfo->gain = gain;
mTnrRequestInfo->type = mTnrType;
mTnrRequestInfo->cameraId = mCameraId;
mTnrRequestInfo->isForceUpdate = forceUpdate;
int32_t requestHandle =
mCommon.getShmMemHandle(static_cast<void*>(mTnrRequestInfo), GPU_ALGO_SHM);
bool ret = mCommon.requestSync(IPC_GPU_TNR_PARAM_UPDATE, requestHandle);
CheckError(!ret, UNKNOWN_ERROR, "@%s, IPC_GPU_TNR_PARAM_UPDATE requestSync fails", __func__);
return OK;
}
} // namespace icamera