1 /*
2 * analyzer_loader.cpp - analyzer loader
3 *
4 * Copyright (c) 2015 Intel Corporation
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * Author: Wind Yuan <feng.yuan@intel.com>
19 * Jia Meng <jia.meng@intel.com>
20 */
21
22 #include "dynamic_analyzer.h"
23
24 namespace XCam {
25
DynamicAnalyzer(XCam3ADescription * desc,SmartPtr<AnalyzerLoader> & loader,const char * name)26 DynamicAnalyzer::DynamicAnalyzer (XCam3ADescription *desc, SmartPtr<AnalyzerLoader> &loader, const char *name)
27 : X3aAnalyzer (name)
28 , _desc (desc)
29 , _context (NULL)
30 , _loader (loader)
31 {
32 }
33
~DynamicAnalyzer()34 DynamicAnalyzer::~DynamicAnalyzer ()
35 {
36 destroy_context ();
37 }
38
39 XCamReturn
create_context()40 DynamicAnalyzer::create_context ()
41 {
42 XCam3AContext *context = NULL;
43 XCamReturn ret = XCAM_RETURN_NO_ERROR;
44 XCAM_ASSERT (!_context);
45 if ((ret = _desc->create_context (&context)) != XCAM_RETURN_NO_ERROR) {
46 XCAM_LOG_WARNING ("dynamic 3a lib create context failed");
47 return ret;
48 }
49 _context = context;
50 return XCAM_RETURN_NO_ERROR;
51 }
52
53 void
destroy_context()54 DynamicAnalyzer::destroy_context ()
55 {
56 if (_context && _desc && _desc->destroy_context) {
57 _desc->destroy_context (_context);
58 _context = NULL;
59 }
60 }
61
62 XCamReturn
analyze_ae(XCamAeParam & param)63 DynamicAnalyzer::analyze_ae (XCamAeParam ¶m)
64 {
65 XCAM_ASSERT (_context);
66 return _desc->analyze_ae (_context, ¶m);
67 }
68
69 XCamReturn
analyze_awb(XCamAwbParam & param)70 DynamicAnalyzer::analyze_awb (XCamAwbParam ¶m)
71 {
72 XCAM_ASSERT (_context);
73 return _desc->analyze_awb (_context, ¶m);
74 }
75
76 XCamReturn
analyze_af(XCamAfParam & param)77 DynamicAnalyzer::analyze_af (XCamAfParam ¶m)
78 {
79 XCAM_ASSERT (_context);
80 return _desc->analyze_af (_context, ¶m);
81 }
82
83 SmartPtr<AeHandler>
create_ae_handler()84 DynamicAnalyzer::create_ae_handler ()
85 {
86 return new DynamicAeHandler (this);
87 }
88
89 SmartPtr<AwbHandler>
create_awb_handler()90 DynamicAnalyzer::create_awb_handler ()
91 {
92 return new DynamicAwbHandler (this);
93 }
94
95 SmartPtr<AfHandler>
create_af_handler()96 DynamicAnalyzer::create_af_handler ()
97 {
98 return new DynamicAfHandler (this);
99 }
100
101 SmartPtr<CommonHandler>
create_common_handler()102 DynamicAnalyzer::create_common_handler ()
103 {
104 if (_common_handler.ptr())
105 return _common_handler;
106
107 _common_handler = new DynamicCommonHandler (this);
108 return _common_handler;
109 }
110
111 XCamReturn
internal_init(uint32_t width,uint32_t height,double framerate)112 DynamicAnalyzer::internal_init (uint32_t width, uint32_t height, double framerate)
113 {
114 XCAM_UNUSED (width);
115 XCAM_UNUSED (height);
116 XCAM_UNUSED (framerate);
117 return create_context ();
118 }
119
120 XCamReturn
internal_deinit()121 DynamicAnalyzer::internal_deinit ()
122 {
123 destroy_context ();
124 return XCAM_RETURN_NO_ERROR;
125 }
126
127 XCamReturn
configure_3a()128 DynamicAnalyzer::configure_3a ()
129 {
130 uint32_t width = get_width ();
131 uint32_t height = get_height ();
132 double framerate = get_framerate ();
133 XCamReturn ret = XCAM_RETURN_NO_ERROR;
134
135 XCAM_ASSERT (_context);
136
137 ret = _desc->configure_3a (_context, width, height, framerate);
138 XCAM_FAIL_RETURN (WARNING,
139 ret == XCAM_RETURN_NO_ERROR,
140 ret,
141 "dynamic analyzer configure 3a failed");
142 set_manual_brightness(_brightness_level_param);
143
144 return XCAM_RETURN_NO_ERROR;
145 }
146 XCamReturn
pre_3a_analyze(SmartPtr<X3aStats> & stats)147 DynamicAnalyzer::pre_3a_analyze (SmartPtr<X3aStats> &stats)
148 {
149 XCamReturn ret = XCAM_RETURN_NO_ERROR;
150 XCamCommonParam common_params = _common_handler->get_params_unlock ();
151
152 XCAM_ASSERT (_context);
153 _cur_stats = stats;
154 ret = _desc->set_3a_stats (_context, stats->get_stats (), stats->get_timestamp ());
155 XCAM_FAIL_RETURN (WARNING,
156 ret == XCAM_RETURN_NO_ERROR,
157 ret,
158 "dynamic analyzer set_3a_stats failed");
159
160 ret = _desc->update_common_params (_context, &common_params);
161 XCAM_FAIL_RETURN (WARNING,
162 ret == XCAM_RETURN_NO_ERROR,
163 ret,
164 "dynamic analyzer update common params failed");
165
166 return XCAM_RETURN_NO_ERROR;
167 }
168
169 XCamReturn
post_3a_analyze(X3aResultList & results)170 DynamicAnalyzer::post_3a_analyze (X3aResultList &results)
171 {
172 XCamReturn ret = XCAM_RETURN_NO_ERROR;
173 XCam3aResultHead *res_array[XCAM_3A_MAX_RESULT_COUNT];
174 uint32_t res_count = XCAM_3A_MAX_RESULT_COUNT;
175
176 xcam_mem_clear (res_array);
177 XCAM_ASSERT (_context);
178 ret = _desc->combine_analyze_results (_context, res_array, &res_count);
179 XCAM_FAIL_RETURN (WARNING,
180 ret == XCAM_RETURN_NO_ERROR,
181 ret,
182 "dynamic analyzer combine_analyze_results failed");
183
184 _cur_stats.release ();
185
186 if (res_count) {
187 ret = convert_results (res_array, res_count, results);
188 XCAM_FAIL_RETURN (WARNING,
189 ret == XCAM_RETURN_NO_ERROR,
190 ret,
191 "dynamic analyzer convert_results failed");
192 _desc->free_results (res_array, res_count);
193 }
194
195 return XCAM_RETURN_NO_ERROR;
196 }
197
198 const XCamCommonParam
get_common_params()199 DynamicAnalyzer::get_common_params ()
200 {
201 return _common_handler->get_params_unlock ();
202 }
203
204 XCamReturn
convert_results(XCam3aResultHead * from[],uint32_t from_count,X3aResultList & to)205 DynamicAnalyzer::convert_results (XCam3aResultHead *from[], uint32_t from_count, X3aResultList &to)
206 {
207 for (uint32_t i = 0; i < from_count; ++i) {
208 SmartPtr<X3aResult> standard_res =
209 X3aResultFactory::instance ()->create_3a_result (from[i]);
210 to.push_back (standard_res);
211 }
212
213 return XCAM_RETURN_NO_ERROR;
214 }
215 }
216