/*
|
* analyzer_loader.cpp - analyzer loader
|
*
|
* Copyright (c) 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>
|
* Jia Meng <jia.meng@intel.com>
|
*/
|
|
#include "dynamic_analyzer.h"
|
|
namespace XCam {
|
|
DynamicAnalyzer::DynamicAnalyzer (XCam3ADescription *desc, SmartPtr<AnalyzerLoader> &loader, const char *name)
|
: X3aAnalyzer (name)
|
, _desc (desc)
|
, _context (NULL)
|
, _loader (loader)
|
{
|
}
|
|
DynamicAnalyzer::~DynamicAnalyzer ()
|
{
|
destroy_context ();
|
}
|
|
XCamReturn
|
DynamicAnalyzer::create_context ()
|
{
|
XCam3AContext *context = NULL;
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
XCAM_ASSERT (!_context);
|
if ((ret = _desc->create_context (&context)) != XCAM_RETURN_NO_ERROR) {
|
XCAM_LOG_WARNING ("dynamic 3a lib create context failed");
|
return ret;
|
}
|
_context = context;
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
void
|
DynamicAnalyzer::destroy_context ()
|
{
|
if (_context && _desc && _desc->destroy_context) {
|
_desc->destroy_context (_context);
|
_context = NULL;
|
}
|
}
|
|
XCamReturn
|
DynamicAnalyzer::analyze_ae (XCamAeParam ¶m)
|
{
|
XCAM_ASSERT (_context);
|
return _desc->analyze_ae (_context, ¶m);
|
}
|
|
XCamReturn
|
DynamicAnalyzer::analyze_awb (XCamAwbParam ¶m)
|
{
|
XCAM_ASSERT (_context);
|
return _desc->analyze_awb (_context, ¶m);
|
}
|
|
XCamReturn
|
DynamicAnalyzer::analyze_af (XCamAfParam ¶m)
|
{
|
XCAM_ASSERT (_context);
|
return _desc->analyze_af (_context, ¶m);
|
}
|
|
SmartPtr<AeHandler>
|
DynamicAnalyzer::create_ae_handler ()
|
{
|
return new DynamicAeHandler (this);
|
}
|
|
SmartPtr<AwbHandler>
|
DynamicAnalyzer::create_awb_handler ()
|
{
|
return new DynamicAwbHandler (this);
|
}
|
|
SmartPtr<AfHandler>
|
DynamicAnalyzer::create_af_handler ()
|
{
|
return new DynamicAfHandler (this);
|
}
|
|
SmartPtr<CommonHandler>
|
DynamicAnalyzer::create_common_handler ()
|
{
|
if (_common_handler.ptr())
|
return _common_handler;
|
|
_common_handler = new DynamicCommonHandler (this);
|
return _common_handler;
|
}
|
|
XCamReturn
|
DynamicAnalyzer::internal_init (uint32_t width, uint32_t height, double framerate)
|
{
|
XCAM_UNUSED (width);
|
XCAM_UNUSED (height);
|
XCAM_UNUSED (framerate);
|
return create_context ();
|
}
|
|
XCamReturn
|
DynamicAnalyzer::internal_deinit ()
|
{
|
destroy_context ();
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
XCamReturn
|
DynamicAnalyzer::configure_3a ()
|
{
|
uint32_t width = get_width ();
|
uint32_t height = get_height ();
|
double framerate = get_framerate ();
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
XCAM_ASSERT (_context);
|
|
ret = _desc->configure_3a (_context, width, height, framerate);
|
XCAM_FAIL_RETURN (WARNING,
|
ret == XCAM_RETURN_NO_ERROR,
|
ret,
|
"dynamic analyzer configure 3a failed");
|
set_manual_brightness(_brightness_level_param);
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
XCamReturn
|
DynamicAnalyzer::pre_3a_analyze (SmartPtr<X3aStats> &stats)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
XCamCommonParam common_params = _common_handler->get_params_unlock ();
|
|
XCAM_ASSERT (_context);
|
_cur_stats = stats;
|
ret = _desc->set_3a_stats (_context, stats->get_stats (), stats->get_timestamp ());
|
XCAM_FAIL_RETURN (WARNING,
|
ret == XCAM_RETURN_NO_ERROR,
|
ret,
|
"dynamic analyzer set_3a_stats failed");
|
|
ret = _desc->update_common_params (_context, &common_params);
|
XCAM_FAIL_RETURN (WARNING,
|
ret == XCAM_RETURN_NO_ERROR,
|
ret,
|
"dynamic analyzer update common params failed");
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
XCamReturn
|
DynamicAnalyzer::post_3a_analyze (X3aResultList &results)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
XCam3aResultHead *res_array[XCAM_3A_MAX_RESULT_COUNT];
|
uint32_t res_count = XCAM_3A_MAX_RESULT_COUNT;
|
|
xcam_mem_clear (res_array);
|
XCAM_ASSERT (_context);
|
ret = _desc->combine_analyze_results (_context, res_array, &res_count);
|
XCAM_FAIL_RETURN (WARNING,
|
ret == XCAM_RETURN_NO_ERROR,
|
ret,
|
"dynamic analyzer combine_analyze_results failed");
|
|
_cur_stats.release ();
|
|
if (res_count) {
|
ret = convert_results (res_array, res_count, results);
|
XCAM_FAIL_RETURN (WARNING,
|
ret == XCAM_RETURN_NO_ERROR,
|
ret,
|
"dynamic analyzer convert_results failed");
|
_desc->free_results (res_array, res_count);
|
}
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
const XCamCommonParam
|
DynamicAnalyzer::get_common_params ()
|
{
|
return _common_handler->get_params_unlock ();
|
}
|
|
XCamReturn
|
DynamicAnalyzer::convert_results (XCam3aResultHead *from[], uint32_t from_count, X3aResultList &to)
|
{
|
for (uint32_t i = 0; i < from_count; ++i) {
|
SmartPtr<X3aResult> standard_res =
|
X3aResultFactory::instance ()->create_3a_result (from[i]);
|
to.push_back (standard_res);
|
}
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
}
|