/*
|
* handler_interface.cpp - handler interface
|
*
|
* Copyright (c) 2014-2015 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.
|
*
|
* Author: Wind Yuan <feng.yuan@intel.com>
|
*/
|
|
#include "handler_interface.h"
|
|
namespace XCam {
|
|
AeHandler::AeHandler()
|
{
|
reset_parameters ();
|
}
|
|
void
|
AeHandler::reset_parameters ()
|
{
|
// in case missing any parameters
|
xcam_mem_clear (_params);
|
|
_params.mode = XCAM_AE_MODE_AUTO;
|
_params.metering_mode = XCAM_AE_METERING_MODE_AUTO;
|
_params.flicker_mode = XCAM_AE_FLICKER_MODE_AUTO;
|
_params.speed = 1.0;
|
_params.exposure_time_min = UINT64_C(0);
|
_params.exposure_time_max = UINT64_C(0);
|
_params.max_analog_gain = 0.0;
|
_params.manual_exposure_time = UINT64_C (0);
|
_params.manual_analog_gain = 0.0;
|
_params.aperture_fn = 0.0;
|
_params.ev_shift = 0.0;
|
|
_params.window.x_start = 0;
|
_params.window.y_start = 0;
|
_params.window.x_end = 0;
|
_params.window.y_end = 0;
|
_params.window.weight = 0;
|
|
xcam_mem_clear (_params.window_list);
|
}
|
|
bool
|
AeHandler::set_mode (XCamAeMode mode)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.mode = mode;
|
|
XCAM_LOG_DEBUG ("ae set mode [%d]", mode);
|
return true;
|
}
|
|
bool
|
AeHandler::set_metering_mode (XCamAeMeteringMode mode)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.metering_mode = mode;
|
|
XCAM_LOG_DEBUG ("ae set metering mode [%d]", mode);
|
return true;
|
}
|
|
bool
|
AeHandler::set_window (XCam3AWindow *window)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.window = *window;
|
|
XCAM_LOG_DEBUG ("ae set metering mode window [x:%d, y:%d, x_end:%d, y_end:%d, weight:%d]",
|
window->x_start,
|
window->y_start,
|
window->x_end,
|
window->y_end,
|
window->weight);
|
return true;
|
}
|
|
bool
|
AeHandler::set_window (XCam3AWindow *window, uint8_t count)
|
{
|
if (0 == count) {
|
XCAM_LOG_WARNING ("invalid input parameter, window count = %d, reset to default value", count);
|
XCam3AWindow defaultWindow = {0, 0, 1000, 1000, 15};
|
set_window(&defaultWindow);
|
_params.window_list[0] = defaultWindow;
|
return true;
|
}
|
|
if (XCAM_AE_MAX_METERING_WINDOW_COUNT < count) {
|
XCAM_LOG_WARNING ("invalid input parameter, window count = %d, reset count to maximum", count);
|
count = XCAM_AE_MAX_METERING_WINDOW_COUNT;
|
}
|
|
AnalyzerHandler::HandlerLock lock(this);
|
|
_params.window = *window;
|
|
for (int i = 0; i < count; i++) {
|
XCAM_LOG_DEBUG ("window start point(%d, %d), end point(%d, %d), weight = %d",
|
window[i].x_start, window[i].y_start, window[i].x_end, window[i].y_end, window[i].weight);
|
|
_params.window_list[i] = window[i];
|
if (_params.window.weight < window[i].weight) {
|
_params.window.weight = window[i].weight;
|
_params.window.x_start = window[i].x_start;
|
_params.window.y_start = window[i].y_start;
|
_params.window.x_end = window[i].x_end;
|
_params.window.y_end = window[i].y_end;
|
}
|
}
|
|
XCAM_LOG_DEBUG ("ae set metering mode window [x:%d, y:%d, x_end:%d, y_end:%d, weight:%d]",
|
_params.window.x_start,
|
_params.window.y_start,
|
_params.window.x_end,
|
_params.window.y_end,
|
_params.window.weight);
|
|
return true;
|
}
|
|
bool
|
AeHandler::set_ev_shift (double ev_shift)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.ev_shift = ev_shift;
|
|
XCAM_LOG_DEBUG ("ae set ev shift:%.03f", ev_shift);
|
return true;
|
}
|
|
bool
|
AeHandler::set_speed (double speed)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.speed = speed;
|
|
XCAM_LOG_DEBUG ("ae set speed:%.03f", speed);
|
return true;
|
}
|
|
bool
|
AeHandler::set_flicker_mode (XCamFlickerMode flicker)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.flicker_mode = flicker;
|
|
XCAM_LOG_DEBUG ("ae set flicker:%d", flicker);
|
return true;
|
}
|
|
XCamFlickerMode
|
AeHandler::get_flicker_mode ()
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
return _params.flicker_mode;
|
}
|
|
int64_t
|
AeHandler::get_current_exposure_time ()
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
if (_params.mode == XCAM_AE_MODE_MANUAL)
|
return _params.manual_exposure_time;
|
return INT64_C(-1);
|
}
|
|
double
|
AeHandler::get_current_analog_gain ()
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
if (_params.mode == XCAM_AE_MODE_MANUAL)
|
return _params.manual_analog_gain;
|
return 0.0;
|
}
|
|
bool
|
AeHandler::set_manual_exposure_time (int64_t time_in_us)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.manual_exposure_time = time_in_us;
|
|
XCAM_LOG_DEBUG ("ae set manual exposure time: %" PRId64 "us", time_in_us);
|
return true;
|
}
|
|
bool
|
AeHandler::set_manual_analog_gain (double gain)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.manual_analog_gain = gain;
|
|
XCAM_LOG_DEBUG ("ae set manual analog gain: %.03f", gain);
|
return true;
|
}
|
|
bool
|
AeHandler::set_aperture (double fn)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.aperture_fn = fn;
|
|
XCAM_LOG_DEBUG ("ae set aperture fn: %.03f", fn);
|
return true;
|
}
|
|
bool
|
AeHandler::set_max_analog_gain (double max_gain)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.max_analog_gain = max_gain;
|
|
XCAM_LOG_DEBUG ("ae set max analog_gain: %.03f", max_gain);
|
return true;
|
}
|
|
double AeHandler::get_max_analog_gain ()
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
return _params.max_analog_gain;
|
}
|
|
bool AeHandler::set_exposure_time_range (int64_t min_time_in_us, int64_t max_time_in_us)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.exposure_time_min = min_time_in_us;
|
_params.exposure_time_max = max_time_in_us;
|
|
XCAM_LOG_DEBUG ("ae set exposrue range[%" PRId64 "us, %" PRId64 "us]", min_time_in_us, max_time_in_us);
|
return true;
|
}
|
|
bool
|
AeHandler::update_parameters (const XCamAeParam ¶ms)
|
{
|
{
|
AnalyzerHandler::HandlerLock lock (this);
|
_params = params;
|
}
|
XCAM_LOG_DEBUG ("ae parameters updated");
|
return true;
|
}
|
|
bool
|
AeHandler::get_exposure_time_range (int64_t *min_time_in_us, int64_t *max_time_in_us)
|
{
|
XCAM_ASSERT (min_time_in_us && max_time_in_us);
|
|
AnalyzerHandler::HandlerLock lock(this);
|
*min_time_in_us = _params.exposure_time_min;
|
*max_time_in_us = _params.exposure_time_max;
|
|
return true;
|
}
|
|
AwbHandler::AwbHandler()
|
{
|
reset_parameters ();
|
}
|
|
void
|
AwbHandler::reset_parameters ()
|
{
|
xcam_mem_clear (_params);
|
_params.mode = XCAM_AWB_MODE_AUTO;
|
_params.speed = 1.0;
|
_params.cct_min = 0;
|
_params.cct_max = 0;
|
_params.gr_gain = 0.0;
|
_params.r_gain = 0.0;
|
_params.b_gain = 0.0;
|
_params.gb_gain = 0.0;
|
|
_params.window.x_start = 0;
|
_params.window.y_start = 0;
|
_params.window.x_end = 0;
|
_params.window.y_end = 0;
|
_params.window.weight = 0;
|
}
|
|
bool
|
AwbHandler::set_mode (XCamAwbMode mode)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.mode = mode;
|
|
XCAM_LOG_DEBUG ("awb set mode [%d]", mode);
|
return true;
|
}
|
|
bool
|
AwbHandler::set_speed (double speed)
|
{
|
XCAM_FAIL_RETURN (
|
ERROR,
|
(0.0 < speed) && (speed <= 1.0),
|
false,
|
"awb speed(%f) is out of range, suggest (0.0, 1.0]", speed);
|
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.speed = speed;
|
|
XCAM_LOG_DEBUG ("awb set speed [%f]", speed);
|
return true;
|
}
|
|
bool
|
AwbHandler::set_color_temperature_range (uint32_t cct_min, uint32_t cct_max)
|
{
|
XCAM_FAIL_RETURN (
|
ERROR,
|
(cct_min <= cct_max),
|
false,
|
"awb set wrong cct(%u, %u) parameters", cct_min, cct_max);
|
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.cct_min = cct_min;
|
_params.cct_max = cct_max;
|
|
XCAM_LOG_DEBUG ("awb set cct range [%u, %u]", cct_min, cct_max);
|
return true;
|
}
|
|
bool
|
AwbHandler::set_manual_gain (double gr, double r, double b, double gb)
|
{
|
XCAM_FAIL_RETURN (
|
ERROR,
|
gr >= 0.0 && r >= 0.0 && b >= 0.0 && gb >= 0.0,
|
false,
|
"awb manual gain value must >= 0.0");
|
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.gr_gain = gr;
|
_params.r_gain = r;
|
_params.b_gain = b;
|
_params.gb_gain = gb;
|
XCAM_LOG_DEBUG ("awb set manual gain value(gr:%.03f, r:%.03f, b:%.03f, gb:%.03f)", gr, r, b, gb);
|
return true;
|
}
|
|
bool
|
AwbHandler::update_parameters (const XCamAwbParam ¶ms)
|
{
|
{
|
AnalyzerHandler::HandlerLock lock (this);
|
_params = params;
|
}
|
XCAM_LOG_DEBUG ("awb parameters updated");
|
return true;
|
}
|
|
uint32_t
|
AwbHandler::get_current_estimate_cct ()
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
if (_params.mode == XCAM_AWB_MODE_MANUAL)
|
return (_params.cct_max + _params.cct_min) / 2;
|
return 0.0;
|
}
|
|
bool
|
AfHandler::update_parameters (const XCamAfParam ¶ms)
|
{
|
{
|
AnalyzerHandler::HandlerLock lock (this);
|
_params = params;
|
}
|
XCAM_LOG_DEBUG ("af parameters updated");
|
return true;
|
}
|
|
CommonHandler::CommonHandler()
|
{
|
reset_parameters ();
|
}
|
|
void
|
CommonHandler::reset_parameters ()
|
{
|
xcam_mem_clear (_params);
|
|
_params.is_manual_gamma = false;
|
_params.nr_level = 0.0;
|
_params.tnr_level = 0.0;
|
_params.brightness = 0.0;
|
_params.contrast = 0.0;
|
_params.hue = 0.0;
|
_params.saturation = 0.0;
|
_params.sharpness = 0.0;
|
_params.enable_dvs = false;
|
_params.enable_gbce = false;
|
_params.enable_night_mode = false;
|
}
|
|
bool CommonHandler::set_dvs (bool enable)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.enable_dvs = enable;
|
|
XCAM_LOG_DEBUG ("common 3A enable dvs:%s", XCAM_BOOL2STR(enable));
|
return true;
|
}
|
|
bool
|
CommonHandler::set_gbce (bool enable)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.enable_gbce = enable;
|
|
XCAM_LOG_DEBUG ("common 3A enable gbce:%s", XCAM_BOOL2STR(enable));
|
return true;
|
}
|
|
bool
|
CommonHandler::set_night_mode (bool enable)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.enable_night_mode = enable;
|
|
XCAM_LOG_DEBUG ("common 3A enable night mode:%s", XCAM_BOOL2STR(enable));
|
return true;
|
}
|
|
/* Picture quality */
|
bool
|
CommonHandler::set_noise_reduction_level (double level)
|
{
|
XCAM_FAIL_RETURN (
|
ERROR,
|
level >= -1.0 && level < 1.0,
|
false,
|
"set NR levlel(%.03f) out of range[-1.0, 1.0]", level);
|
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.nr_level = level;
|
|
XCAM_LOG_DEBUG ("common 3A set NR level:%.03f", level);
|
return true;
|
}
|
|
bool
|
CommonHandler::set_temporal_noise_reduction_level (double level)
|
{
|
XCAM_FAIL_RETURN (
|
ERROR,
|
level >= -1.0 && level < 1.0,
|
false,
|
"set TNR levlel(%.03f) out of range[-1.0, 1.0]", level);
|
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.tnr_level = level;
|
|
XCAM_LOG_DEBUG ("common 3A set TNR level:%.03f", level);
|
return true;
|
}
|
|
bool
|
CommonHandler::set_manual_brightness (double level)
|
{
|
XCAM_FAIL_RETURN (
|
ERROR,
|
level >= -1.0 && level < 1.0,
|
false,
|
"set brightness levlel(%.03f) out of range[-1.0, 1.0]", level);
|
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.brightness = level;
|
|
XCAM_LOG_DEBUG ("common 3A set brightness level:%.03f", level);
|
return true;
|
}
|
|
bool CommonHandler::set_manual_contrast (double level)
|
{
|
XCAM_FAIL_RETURN (
|
ERROR,
|
level >= -1.0 && level < 1.0,
|
false,
|
"set contrast levlel(%.03f) out of range[-1.0, 1.0]", level);
|
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.contrast = level;
|
|
XCAM_LOG_DEBUG ("common 3A set contrast level:%.03f", level);
|
return true;
|
}
|
|
bool CommonHandler::set_manual_hue (double level)
|
{
|
XCAM_FAIL_RETURN (
|
ERROR,
|
level >= -1.0 && level < 1.0,
|
false,
|
"set hue levlel(%.03f) out of range[-1.0, 1.0]", level);
|
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.hue = level;
|
|
XCAM_LOG_DEBUG ("common 3A set hue level:%.03f", level);
|
return true;
|
}
|
|
bool
|
CommonHandler::set_manual_saturation (double level)
|
{
|
XCAM_FAIL_RETURN (
|
ERROR,
|
level >= -1.0 && level < 1.0,
|
false,
|
"set saturation levlel(%.03f) out of range[-1.0, 1.0]", level);
|
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.saturation = level;
|
|
XCAM_LOG_DEBUG ("common 3A set saturation level:%.03f", level);
|
return true;
|
}
|
|
bool CommonHandler::set_manual_sharpness (double level)
|
{
|
XCAM_FAIL_RETURN (
|
ERROR,
|
level >= -1.0 && level < 1.0,
|
false,
|
"set sharpness levlel(%.03f) out of range[-1.0, 1.0]", level);
|
|
AnalyzerHandler::HandlerLock lock(this);
|
_params.sharpness = level;
|
|
XCAM_LOG_DEBUG ("common 3A set sharpness level:%.03f", level);
|
return true;
|
}
|
|
bool
|
CommonHandler::set_gamma_table (double *r_table, double *g_table, double *b_table)
|
{
|
AnalyzerHandler::HandlerLock lock(this);
|
if (!r_table && ! g_table && !b_table) {
|
_params.is_manual_gamma = false;
|
XCAM_LOG_DEBUG ("common 3A disabled gamma");
|
return true;
|
}
|
|
if (!r_table || !g_table || !b_table) {
|
XCAM_LOG_ERROR ("common 3A gamma table parameters wrong");
|
return false;
|
}
|
|
for (uint32_t i = 0; i < XCAM_GAMMA_TABLE_SIZE; ++i) {
|
_params.r_gamma [i] = r_table [i];
|
_params.g_gamma [i] = g_table [i];
|
_params.b_gamma [i] = b_table [i];
|
}
|
_params.is_manual_gamma = true;
|
|
XCAM_LOG_DEBUG ("common 3A enabled RGB gamma");
|
return true;
|
}
|
|
bool
|
CommonHandler::set_color_effect (XCamColorEffect effect)
|
{
|
// TODO validate the input
|
|
AnalyzerHandler::HandlerLock lock(this);
|
|
_params.color_effect = effect;
|
|
XCAM_LOG_DEBUG ("common 3A set color effect");
|
return true;
|
}
|
|
bool
|
CommonHandler::update_parameters (const XCamCommonParam ¶ms)
|
{
|
{
|
AnalyzerHandler::HandlerLock lock (this);
|
_params = params;
|
}
|
XCAM_LOG_DEBUG ("common parameters updated");
|
return true;
|
}
|
|
};
|