blob: 6555d79d3c8e7c76255f202fbad9e3a68193745b [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.
*/
#define LOG_TAG "IPC_INTEL_CMC"
#include "modules/sandboxing/IPCIntelCmc.h"
#include "iutils/CameraLog.h"
#include "iutils/Utils.h"
namespace icamera {
IPCIntelCmc::IPCIntelCmc() {
LOGIPC("@%s", __func__);
}
IPCIntelCmc::~IPCIntelCmc() {
LOGIPC("@%s", __func__);
}
bool IPCIntelCmc::clientFlattenInit(const ia_binary_data& aiqb, const ia_binary_data* nvmData,
cmc_init_params* params) {
LOGIPC("@%s, aiqb: data:%p, size:%d, nvmData %p, params:%p", __func__, aiqb.data, aiqb.size,
nvmData, params);
CheckError(!params, false, "@%s, params is nullptr", __func__);
CheckError(!aiqb.data, false, "@%s, aiqb.data is nullptr", __func__);
CheckError(aiqb.size == 0, false, "@%s, aiqb.size is 0", __func__);
CheckError(aiqb.size > sizeof(params->input.data), false, "@%s, aiqb:%d is too big", __func__,
aiqb.size);
ia_binary_data_mod* input = &params->input;
char* ptr = input->data;
MEMCPY_S(ptr, sizeof(input->data), aiqb.data, aiqb.size);
params->aiqb_size = aiqb.size;
params->nvm_size = 0;
ptr += aiqb.size;
if (nvmData) {
MEMCPY_S(ptr, sizeof(input->data) - aiqb.size, nvmData->data, nvmData->size);
params->nvm_size = nvmData->size;
}
return true;
}
bool IPCIntelCmc::clientUnflattenInit(const cmc_init_params& params, ia_cmc_t** cmc,
uintptr_t* cmcRemoteHandle) {
LOGIPC("@%s, cmc:%p", __func__, cmc);
CheckError(!cmc, false, "@%s, cmc is nullptr", __func__);
int ret = unflattenCmcData(const_cast<ia_cmc_data*>(&params.results));
CheckError(ret == false, false, "%s, unflattenCmcData fails", __func__);
*cmc = const_cast<ia_cmc_t*>(&params.results.base);
*cmcRemoteHandle = params.results.cmcRemoteHandle;
return true;
}
bool IPCIntelCmc::serverUnflattenInit(const cmc_init_params& params, ia_binary_data* aiqb,
ia_binary_data* nvmData) {
LOGIPC("@%s, aiqb:%p, nvmData:%p", __func__, aiqb, nvmData);
CheckError(aiqb == nullptr, false, "@%s, aiqb is nullptr", __func__);
CheckError(nvmData == nullptr, false, "@%s, nvmData is nullptr", __func__);
ia_binary_data_mod* input = const_cast<ia_binary_data_mod*>(&params.input);
aiqb->data = input->data;
aiqb->size = params.aiqb_size;
if (params.nvm_size > 0) {
nvmData->data = input->data + aiqb->size;
nvmData->size = params.nvm_size;
}
return true;
}
bool IPCIntelCmc::serverFlattenInit(const ia_cmc_t& cmc, cmc_init_params* params) {
LOGIPC("@%s, params:%p", __func__, params);
CheckError(!params, false, "@%s, params is nullptr", __func__);
int ret = flattenCmcData(&cmc, &params->results);
CheckError(ret == false, false, "%s flattenCmcData fails", __func__);
return true;
}
bool IPCIntelCmc::flattenCmcData(const ia_cmc_t* cmc, ia_cmc_data* results) {
CheckError(!cmc || !results, false, "%s, cmc or results is nullptr", __func__);
results->base = *cmc;
results->cmcRemoteHandle = reinterpret_cast<uintptr_t>(cmc);
ia_cmc_t* base = &results->base;
if (base->cmc_general_data) {
results->cmc_general_data = *base->cmc_general_data;
}
cmc_parsed_black_level_t* baseBL = &base->cmc_parsed_black_level;
cmc_parsed_black_level_data* retBL = &results->cmc_parsed_black_level;
if (baseBL->cmc_black_level) {
retBL->cmc_black_level = *baseBL->cmc_black_level;
}
if (baseBL->cmc_black_level_luts) {
retBL->cmc_black_level_luts = *baseBL->cmc_black_level_luts;
}
if (base->cmc_saturation_level) {
results->cmc_saturation_level = *base->cmc_saturation_level;
}
if (base->cmc_sensitivity) {
results->cmc_sensitivity = *base->cmc_sensitivity;
}
cmc_parsed_lens_shading_t* baseLS = &base->cmc_parsed_lens_shading;
cmc_parsed_lens_shading_data* retLS = &results->cmc_parsed_lens_shading;
if (baseLS->cmc_lens_shading) {
retLS->cmc_lens_shading = *baseLS->cmc_lens_shading;
}
if (baseLS->cmc_lsc_grids) {
retLS->cmc_lsc_grids = *baseLS->cmc_lsc_grids;
}
if (baseLS->lsc_grids) {
retLS->lsc_grids = *baseLS->lsc_grids;
}
if (baseLS->cmc_lsc_rg_bg_ratios) {
retLS->cmc_lsc_rg_bg_ratios = *baseLS->cmc_lsc_rg_bg_ratios;
}
cmc_parsed_optics_t* baseOptics = &base->cmc_parsed_optics;
cmc_parsed_optics_data* retOptics = &results->cmc_parsed_optics;
if (baseOptics->cmc_optomechanics) {
retOptics->cmc_optomechanics = *baseOptics->cmc_optomechanics;
}
if (baseOptics->lut_apertures) {
retOptics->lut_apertures = *baseOptics->lut_apertures;
}
cmc_parsed_color_matrices_t* baseCM = &base->cmc_parsed_color_matrices;
cmc_parsed_color_matrices_data* retCM = &results->cmc_parsed_color_matrices;
if (baseCM->cmc_color_matrices) {
retCM->cmc_color_matrices = *baseCM->cmc_color_matrices;
}
if (baseCM->cmc_color_matrix) {
// fix asan issue:base->cmc_parsed_color_matrices.cmc_color_matrix is not 4 aligned
// use memcpy instead of *
MEMCPY_S(&retCM->cmc_color_matrix, sizeof(retCM->cmc_color_matrix),
baseCM->cmc_color_matrix, sizeof(cmc_color_matrix_t));
}
if (baseCM->ccm_estimate_method) {
retCM->ccm_estimate_method = *baseCM->ccm_estimate_method;
}
cmc_parsed_analog_gain_conversion_t* baseAGC = &base->cmc_parsed_analog_gain_conversion;
cmc_parsed_analog_gain_conversion_data* retAGC = &results->cmc_parsed_analog_gain_conversion;
if (baseAGC->cmc_analog_gain_conversion) {
retAGC->cmc_analog_gain_conversion = *baseAGC->cmc_analog_gain_conversion;
CheckError(baseAGC->cmc_analog_gain_conversion->num_segments > MAX_NUM_SEGMENTS, false,
"@%s, num_segments:%d is too big", __func__,
baseAGC->cmc_analog_gain_conversion->num_segments);
CheckError(baseAGC->cmc_analog_gain_conversion->num_pairs > MAX_NUM_ANALOG_PAIRS, false,
"@%s, num_pairs:%d is too big", __func__,
baseAGC->cmc_analog_gain_conversion->num_pairs);
if (baseAGC->cmc_analog_gain_segments) {
MEMCPY_S(retAGC->cmc_analog_gain_segments, sizeof(retAGC->cmc_analog_gain_segments),
baseAGC->cmc_analog_gain_segments,
(sizeof(*baseAGC->cmc_analog_gain_segments) *
baseAGC->cmc_analog_gain_conversion->num_segments));
}
if (baseAGC->cmc_analog_gain_pairs) {
MEMCPY_S(retAGC->cmc_analog_gain_pairs, sizeof(retAGC->cmc_analog_gain_pairs),
baseAGC->cmc_analog_gain_pairs,
(sizeof(*baseAGC->cmc_analog_gain_pairs) *
baseAGC->cmc_analog_gain_conversion->num_pairs));
}
}
return true;
}
bool IPCIntelCmc::unflattenCmcData(ia_cmc_data* results) {
LOGIPC("@%s", __func__);
CheckError(!results, false, "%s, results is nullptr", __func__);
ia_cmc_t* base = &results->base;
if (base->cmc_general_data) {
base->cmc_general_data = &results->cmc_general_data;
}
cmc_parsed_black_level_t* baseBL = &base->cmc_parsed_black_level;
cmc_parsed_black_level_data* retBL = &results->cmc_parsed_black_level;
if (baseBL->cmc_black_level) {
baseBL->cmc_black_level = &retBL->cmc_black_level;
}
if (baseBL->cmc_black_level_luts) {
baseBL->cmc_black_level_luts = &retBL->cmc_black_level_luts;
}
if (base->cmc_saturation_level) {
base->cmc_saturation_level = &results->cmc_saturation_level;
}
if (base->cmc_sensitivity) {
base->cmc_sensitivity = &results->cmc_sensitivity;
}
cmc_parsed_lens_shading_t* baseLS = &base->cmc_parsed_lens_shading;
cmc_parsed_lens_shading_data* retLS = &results->cmc_parsed_lens_shading;
if (baseLS->cmc_lens_shading) {
baseLS->cmc_lens_shading = &retLS->cmc_lens_shading;
}
if (baseLS->cmc_lsc_grids) {
baseLS->cmc_lsc_grids = &retLS->cmc_lsc_grids;
}
if (baseLS->lsc_grids) {
baseLS->lsc_grids = &retLS->lsc_grids;
}
if (baseLS->cmc_lsc_rg_bg_ratios) {
baseLS->cmc_lsc_rg_bg_ratios = &retLS->cmc_lsc_rg_bg_ratios;
}
cmc_parsed_optics_t* baseOptics = &base->cmc_parsed_optics;
cmc_parsed_optics_data* retOptics = &results->cmc_parsed_optics;
if (baseOptics->cmc_optomechanics) {
baseOptics->cmc_optomechanics = &retOptics->cmc_optomechanics;
}
if (baseOptics->lut_apertures) {
baseOptics->lut_apertures = &retOptics->lut_apertures;
}
cmc_parsed_color_matrices_t* baseCM = &base->cmc_parsed_color_matrices;
cmc_parsed_color_matrices_data* retCM = &results->cmc_parsed_color_matrices;
if (baseCM->cmc_color_matrices) {
baseCM->cmc_color_matrices = &retCM->cmc_color_matrices;
}
if (baseCM->cmc_color_matrix) {
baseCM->cmc_color_matrix = &retCM->cmc_color_matrix;
}
if (baseCM->ccm_estimate_method) {
baseCM->ccm_estimate_method = &retCM->ccm_estimate_method;
}
cmc_parsed_analog_gain_conversion_t* baseAGC = &base->cmc_parsed_analog_gain_conversion;
cmc_parsed_analog_gain_conversion_data* retAGC = &results->cmc_parsed_analog_gain_conversion;
if (baseAGC->cmc_analog_gain_conversion) {
baseAGC->cmc_analog_gain_conversion = &retAGC->cmc_analog_gain_conversion;
if (baseAGC->cmc_analog_gain_segments) {
baseAGC->cmc_analog_gain_segments = retAGC->cmc_analog_gain_segments;
}
if (baseAGC->cmc_analog_gain_pairs) {
baseAGC->cmc_analog_gain_pairs = retAGC->cmc_analog_gain_pairs;
}
}
return true;
}
} /* namespace icamera */