blob: 3d14a26bd396d5fec823ff4265cc5d922dbebd2d [file] [log] [blame]
/*
* Copyright (C) 2015-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 "PlatformData.h"
#include "Parameters.h"
#include "ia_aiq.h"
#include "ia_ltm_types.h"
#include "ia_dvs_types.h"
#include "ia_isp_bxt_statistics_types.h"
namespace icamera {
/*!> Top limit for the RGBS grid size */
static const unsigned int MAX_AE_GRID_SIZE = 2048;
/*!> Number of leds AEC algorithm provides output for */
static const unsigned int MAX_EXPOSURES_NUM = 3;
static const unsigned int NUM_FLASH_LEDS = 1;
static const unsigned int MAX_GAMMA_LUT_SIZE = 2048;
static const unsigned int MAX_TONEMAP_LUT_SIZE = 2048;
static const unsigned int MAX_STATISTICS_WIDTH = BXT_RGBS_GRID_MAX_WIDTH;
static const unsigned int MAX_STATISTICS_HEIGHT = BXT_RGBS_GRID_MAX_HEIGHT;
static const unsigned int MAX_LSC_WIDTH = 100;
static const unsigned int MAX_LSC_HEIGHT = 100;
static const unsigned int MAX_IR_WEIGHT_GRID_SIZE = 480;
static const unsigned int MAX_NUM_SECTORS = 36;
static const int MAX_BAYER_ORDER_NUM = 4;
/*! \brief Definitions of IA imaging coordinate system. */
static const unsigned int IA_COORDINATE_TOP = 0;
static const unsigned int IA_COORDINATE_LEFT = 0;
static const unsigned int IA_COORDINATE_BOTTOM = 8192;
static const unsigned int IA_COORDINATE_RIGHT = 8192;
static const unsigned int IA_COORDINATE_WIDTH = (IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT);
static const unsigned int IA_COORDINATE_HEIGHT = (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP);
/**
* The normalized awb gain range is (4.0, 1.0) which is just experimental.
* TODO: Maybe need put them in configuration file later.
*/
static const int AWB_GAIN_NORMALIZED_START = 4.0;
static const int AWB_GAIN_NORMALIZED_END = 1.0;
static const int AWB_GAIN_RANGE_NORMALIZED = AWB_GAIN_NORMALIZED_END - AWB_GAIN_NORMALIZED_START;
static const float AWB_GAIN_MIN = 0;
static const float AWB_GAIN_MAX = 255;
static const float AWB_GAIN_RANGE_USER = AWB_GAIN_MAX - AWB_GAIN_MIN;
static const int MAX_CUSTOM_CONTROLS_PARAM_SIZE = 1024;
namespace AiqUtils {
int dumpAeResults(const ia_aiq_ae_results &aeResult);
int dumpAfResults(const ia_aiq_af_results &afResult);
int dumpAwbResults(const ia_aiq_awb_results &awbResult);
int deepCopyAeResults(const ia_aiq_ae_results& src, ia_aiq_ae_results* dst);
int deepCopyAfResults(const ia_aiq_af_results& src, ia_aiq_af_results* dst);
int deepCopyAwbResults(const ia_aiq_awb_results& src, ia_aiq_awb_results* dst);
int deepCopyGbceResults(const ia_aiq_gbce_results& src, ia_aiq_gbce_results* dst);
int deepCopyPaResults(const ia_aiq_pa_results_v1& src, ia_aiq_pa_results_v1* dst,
ia_aiq_advanced_ccm_t* preferredAcm);
int deepCopySaResults(const ia_aiq_sa_results_v1& src, ia_aiq_sa_results_v1* dst);
int deepCopyLtmResults(const ia_ltm_results& src, ia_ltm_results* dst);
int deepCopyLtmDRCParams(const ia_ltm_drc_params& src, ia_ltm_drc_params* dst);
int deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst);
int deepCopyDvsResults(const ia_dvs_image_transformation& src, ia_dvs_image_transformation* dst);
int convertError(ia_err iaErr);
void convertToAiqFrameParam(const SensorFrameParams& sensor, ia_aiq_frame_params& aiq);
camera_coordinate_t convertCoordinateSystem(const camera_coordinate_system_t& srcSystem,
const camera_coordinate_system_t& dstSystem,
const camera_coordinate_t& srcCoordinate);
camera_coordinate_t convertToIaCoordinate(const camera_coordinate_system_t& srcSystem,
const camera_coordinate_t& srcCoordinate);
camera_window_t convertToIaWindow(const camera_coordinate_system_t& srcSystem,
const camera_window_t& srcWindow);
float normalizeAwbGain(int gain);
int convertToUserAwbGain(float normalizedGain);
float convertSpeedModeToTime(camera_converge_speed_t mode);
ia_aiq_frame_use convertFrameUsageToIaFrameUsage(int frameUsage);
void applyTonemapGamma(float gamma, ia_aiq_gbce_results* results);
void applyTonemapSRGB(ia_aiq_gbce_results* results);
void applyTonemapREC709(ia_aiq_gbce_results* results);
void applyTonemapCurve(const camera_tonemap_curves_t& curves, ia_aiq_gbce_results* results);
void applyAwbGainForTonemapCurve(const camera_tonemap_curves_t& curves,
ia_aiq_awb_results* results);
// Resize a 2D array with linear interpolation
// For some cases, we need to upscale or downscale a 2D array.
// For example, Android requests lensShadingMapSize must be smaller than 64*64,
// but for some sensors, the lens shading map is bigger than this, so need to do resize.
/* Value of 8 is maximum in order to avoid overflow with 16-bit inputs */
#define FRAC_BITS_CURR_LOC 8
#define FRAC_BASE (short)(1) << FRAC_BITS_CURR_LOC
/*!
* \brief Resize a 2D array with linear interpolation.
*
* @param[in,out]
* in a_src pointer to input array (width-major)
* in a_src_w width of the input array
* in a_src_h height of the input array
* in a_dst pointer to output array (width-major)
* in a_dst_w width of the output array
* in a_dst_h height of the output array
*/
template <typename T> int resize2dArray(
const T* a_src, int a_src_w, int a_src_h,
T* a_dst, int a_dst_w, int a_dst_h) {
int i, j, step_size_w, step_size_h, rounding_term;
if (a_src_w < 2 || a_dst_w < 2 || a_src_h < 2 || a_dst_h < 2) {
return -1;
}
nsecs_t startTime = CameraUtils::systemTime();
step_size_w = ((a_src_w - 1) << FRAC_BITS_CURR_LOC) / (a_dst_w - 1);
step_size_h = ((a_src_h - 1) << FRAC_BITS_CURR_LOC) / (a_dst_h - 1);
rounding_term = (1 << (2 * FRAC_BITS_CURR_LOC - 1));
for (j = 0; j < a_dst_h; ++j) {
unsigned int curr_loc_h, curr_loc_lower_h;
curr_loc_h = j * step_size_h;
curr_loc_lower_h = (curr_loc_h > 0) ? (curr_loc_h - 1) >> FRAC_BITS_CURR_LOC : 0;
for (i = 0; i < a_dst_w; ++i) {
unsigned int curr_loc_w, curr_loc_lower_w;
curr_loc_w = i * step_size_w;
curr_loc_lower_w = (curr_loc_w > 0) ? (curr_loc_w - 1) >> FRAC_BITS_CURR_LOC : 0;
a_dst[a_dst_w * j + i] =
(a_src[curr_loc_lower_w + curr_loc_lower_h * a_src_w] *
(((curr_loc_lower_w + 1) << FRAC_BITS_CURR_LOC) - curr_loc_w) *
(((curr_loc_lower_h + 1) << FRAC_BITS_CURR_LOC) - curr_loc_h) +
a_src[curr_loc_lower_w + 1 + curr_loc_lower_h * a_src_w] *
(curr_loc_w-((curr_loc_lower_w) << FRAC_BITS_CURR_LOC)) *
(((curr_loc_lower_h + 1) << FRAC_BITS_CURR_LOC) - curr_loc_h) +
a_src[curr_loc_lower_w + (curr_loc_lower_h + 1) * a_src_w] *
(((curr_loc_lower_w + 1) << FRAC_BITS_CURR_LOC) - curr_loc_w) *
(curr_loc_h - ((curr_loc_lower_h) << FRAC_BITS_CURR_LOC)) +
a_src[curr_loc_lower_w + 1 + (curr_loc_lower_h + 1) * a_src_w] *
(curr_loc_w - ((curr_loc_lower_w) << FRAC_BITS_CURR_LOC)) *
(curr_loc_h - ((curr_loc_lower_h) << FRAC_BITS_CURR_LOC))
+ rounding_term) / (FRAC_BASE * FRAC_BASE);
}
}
LOG2("resize the 2D array cost %dus",
(unsigned)((CameraUtils::systemTime() - startTime) / 1000));
return 0;
}
template int resize2dArray<float>(
const float* a_src, int a_src_w, int a_src_h,
float* a_dst, int a_dst_w, int a_dst_h);
template int resize2dArray<unsigned short>(
const unsigned short* a_src, int a_src_w, int a_src_h,
unsigned short* a_dst, int a_dst_w, int a_dst_h);
template int resize2dArray<int>(
const int* a_src, int a_src_w, int a_src_h,
int* a_dst, int a_dst_w, int a_dst_h);
float calculateHyperfocalDistance(const ia_cmc_t &cmcData);
} // namespace AiqUtils
} // namespace icamera