/* * 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 * Jia Meng */ #include "dynamic_analyzer.h" namespace XCam { DynamicAnalyzer::DynamicAnalyzer (XCam3ADescription *desc, SmartPtr &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 DynamicAnalyzer::create_ae_handler () { return new DynamicAeHandler (this); } SmartPtr DynamicAnalyzer::create_awb_handler () { return new DynamicAwbHandler (this); } SmartPtr DynamicAnalyzer::create_af_handler () { return new DynamicAfHandler (this); } SmartPtr DynamicAnalyzer::create_common_handler () { if (_common_handler.ptr()) return _common_handler; SmartPtr handler = new DynamicCommonHandler (this); XCAM_ASSERT (handler.ptr ()); _common_handler = handler; 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 &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 standard_res = X3aResultFactory::instance ()->create_3a_result (from[i]); to.push_back (standard_res); } return XCAM_RETURN_NO_ERROR; } }