/*
* x3a_analyze_tuner.cpp - x3a analyzer Common IQ tuning adaptor
*
* 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: Zong Wei <wei.zong@intel.com>
*/
#include "xcam_utils.h"
#include "x3a_stats_pool.h"
#include "x3a_analyzer.h"
#include "x3a_analyze_tuner.h"
#include "x3a_ciq_tuning_handler.h"
#include "x3a_ciq_tnr_tuning_handler.h"
#include "x3a_ciq_bnr_ee_tuning_handler.h"
#include "x3a_ciq_wavelet_tuning_handler.h"
namespace XCam {
X3aAnalyzeTuner::X3aAnalyzeTuner ()
: X3aAnalyzer ("X3aAnalyzeTuner")
{
}
X3aAnalyzeTuner::~X3aAnalyzeTuner ()
{
}
void
X3aAnalyzeTuner::set_analyzer (SmartPtr<X3aAnalyzer> &analyzer)
{
XCAM_ASSERT (analyzer.ptr () && !_analyzer.ptr ());
_analyzer = analyzer;
_analyzer->set_results_callback (this);
_analyzer->prepare_handlers ();
_analyzer->set_sync_mode (true);
}
XCamReturn
X3aAnalyzeTuner::create_tuning_handlers ()
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
SmartPtr<AeHandler> ae_handler = _analyzer->get_ae_handler ();
SmartPtr<AwbHandler> awb_handler = _analyzer->get_awb_handler();
SmartPtr<X3aCiqTuningHandler> tnr_tuning = new X3aCiqTnrTuningHandler ();
SmartPtr<X3aCiqTuningHandler> bnr_ee_tuning = new X3aCiqBnrEeTuningHandler ();
SmartPtr<X3aCiqTuningHandler> wavelet_tuning = new X3aCiqWaveletTuningHandler ();
if (tnr_tuning.ptr ()) {
tnr_tuning->set_ae_handler (ae_handler);
tnr_tuning->set_awb_handler (awb_handler);
add_handler (tnr_tuning);
} else {
ret = XCAM_RETURN_ERROR_PARAM;
}
if (bnr_ee_tuning.ptr ()) {
bnr_ee_tuning->set_ae_handler (ae_handler);
bnr_ee_tuning->set_awb_handler (awb_handler);
add_handler (bnr_ee_tuning);
} else {
ret = XCAM_RETURN_ERROR_PARAM;
}
if (wavelet_tuning.ptr ()) {
wavelet_tuning->set_ae_handler (ae_handler);
wavelet_tuning->set_awb_handler (awb_handler);
add_handler (wavelet_tuning);
} else {
ret = XCAM_RETURN_ERROR_PARAM;
}
return ret;
}
bool
X3aAnalyzeTuner::add_handler (SmartPtr<X3aCiqTuningHandler> &handler)
{
XCAM_ASSERT (handler.ptr ());
_handlers.push_back (handler);
return true;
}
XCamReturn
X3aAnalyzeTuner::analyze_ae (XCamAeParam ¶m)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
XCAM_ASSERT (_analyzer.ptr ());
_analyzer->update_ae_parameters (param);
return ret;
}
XCamReturn
X3aAnalyzeTuner::analyze_awb (XCamAwbParam ¶m)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
XCAM_ASSERT (_analyzer.ptr ());
_analyzer->update_awb_parameters (param);
return ret;
}
XCamReturn
X3aAnalyzeTuner::analyze_af (XCamAfParam ¶m)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
XCAM_ASSERT (_analyzer.ptr ());
_analyzer->update_af_parameters (param);
return ret;
}
XCamReturn
X3aAnalyzeTuner::analyze_common (XCamCommonParam ¶m)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
XCAM_ASSERT (_analyzer.ptr ());
_analyzer->update_common_parameters (param);
return ret;
}
SmartPtr<AeHandler>
X3aAnalyzeTuner::create_ae_handler ()
{
SmartPtr<AeHandler> ae_handler = new X3aCiqTuningAeHandler (this);
return ae_handler;
}
SmartPtr<AwbHandler>
X3aAnalyzeTuner::create_awb_handler ()
{
SmartPtr<AwbHandler> awb_handler = new X3aCiqTuningAwbHandler (this);
return awb_handler;
}
SmartPtr<AfHandler>
X3aAnalyzeTuner::create_af_handler ()
{
SmartPtr<AfHandler> af_handler = new X3aCiqTuningAfHandler (this);
return af_handler;
}
SmartPtr<CommonHandler>
X3aAnalyzeTuner::create_common_handler ()
{
SmartPtr<CommonHandler> common_handler = new X3aCiqTuningCommonHandler (this);
return common_handler;
}
XCamReturn
X3aAnalyzeTuner::internal_init (uint32_t width, uint32_t height, double framerate)
{
XCAM_ASSERT (_analyzer.ptr ());
XCamReturn ret = XCAM_RETURN_NO_ERROR;
_analyzer->init (width, height, framerate);
if (XCAM_RETURN_NO_ERROR == ret) {
ret = create_tuning_handlers ();
}
return ret;
}
XCamReturn
X3aAnalyzeTuner::internal_deinit ()
{
XCAM_ASSERT (_analyzer.ptr ());
XCamReturn ret = XCAM_RETURN_NO_ERROR;
ret = _analyzer->deinit ();
return ret;
}
XCamReturn
X3aAnalyzeTuner::configure_3a ()
{
XCAM_ASSERT (_analyzer.ptr ());
XCamReturn ret = XCAM_RETURN_NO_ERROR;
ret = _analyzer->start ();
return ret;
}
XCamReturn
X3aAnalyzeTuner::pre_3a_analyze (SmartPtr<X3aStats> &stats)
{
// save stats for aiq analyzer
XCamReturn ret = XCAM_RETURN_NO_ERROR;
if (stats.ptr ()) {
_stats = stats;
}
return ret;
}
XCamReturn
X3aAnalyzeTuner::post_3a_analyze (X3aResultList &results)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
XCAM_ASSERT (_analyzer.ptr ());
ret = _analyzer->push_3a_stats (_stats);
_stats.release ();
results.insert (results.end (), _results.begin (), _results.end ());
_results.clear ();
X3aCiqTuningHandlerList::iterator i_handler = _handlers.begin ();
for (; i_handler != _handlers.end (); ++i_handler)
{
(*i_handler)->analyze (results);
}
return ret;
}
void
X3aAnalyzeTuner::x3a_calculation_done (XAnalyzer *analyzer, X3aResultList &results)
{
XCAM_UNUSED (analyzer);
_results.clear ();
_results.assign (results.begin (), results.end ());
}
};