1 /*
2 * smart_analyzer.cpp - smart analyzer
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: Zong Wei <wei.zong@intel.com>
19 */
20
21 #include "smart_analyzer_loader.h"
22 #include "smart_analyzer.h"
23 #include "smart_analysis_handler.h"
24
25 #include "xcam_obj_debug.h"
26
27 namespace XCam {
28
SmartAnalyzer(const char * name)29 SmartAnalyzer::SmartAnalyzer (const char *name)
30 : XAnalyzer (name)
31 {
32 XCAM_OBJ_PROFILING_INIT;
33 }
34
~SmartAnalyzer()35 SmartAnalyzer::~SmartAnalyzer ()
36 {
37 }
38
39 XCamReturn
add_handler(SmartPtr<SmartAnalysisHandler> handler)40 SmartAnalyzer::add_handler (SmartPtr<SmartAnalysisHandler> handler)
41 {
42 XCamReturn ret = XCAM_RETURN_NO_ERROR;
43 if (!handler.ptr ()) {
44 return XCAM_RETURN_ERROR_PARAM;
45 }
46
47 _handlers.push_back (handler);
48 handler->set_analyzer (this);
49 return ret;
50 }
51
52 XCamReturn
create_handlers()53 SmartAnalyzer::create_handlers ()
54 {
55 XCamReturn ret = XCAM_RETURN_NO_ERROR;
56 if (_handlers.empty ()) {
57 ret = XCAM_RETURN_ERROR_PARAM;
58 }
59 return ret;
60 }
61
62 XCamReturn
release_handlers()63 SmartAnalyzer::release_handlers ()
64 {
65 XCamReturn ret = XCAM_RETURN_NO_ERROR;
66 return ret;
67 }
68
69 XCamReturn
internal_init(uint32_t width,uint32_t height,double framerate)70 SmartAnalyzer::internal_init (uint32_t width, uint32_t height, double framerate)
71 {
72 XCAM_UNUSED (width);
73 XCAM_UNUSED (height);
74 XCAM_UNUSED (framerate);
75 SmartHandlerList::iterator i_handler = _handlers.begin ();
76 for (; i_handler != _handlers.end (); ++i_handler)
77 {
78 SmartPtr<SmartAnalysisHandler> handler = *i_handler;
79 XCamReturn ret = handler->create_context (handler);
80 if (ret != XCAM_RETURN_NO_ERROR) {
81 XCAM_LOG_WARNING ("smart analyzer initialize handler(%s) context failed", XCAM_STR(handler->get_name()));
82 }
83 }
84
85 return XCAM_RETURN_NO_ERROR;
86 }
87
88 XCamReturn
internal_deinit()89 SmartAnalyzer::internal_deinit ()
90 {
91 SmartHandlerList::iterator i_handler = _handlers.begin ();
92 for (; i_handler != _handlers.end (); ++i_handler)
93 {
94 SmartPtr<SmartAnalysisHandler> handler = *i_handler;
95 if (handler->is_valid ())
96 handler->destroy_context ();
97 }
98
99 return XCAM_RETURN_NO_ERROR;
100 }
101
102 XCamReturn
configure()103 SmartAnalyzer::configure ()
104 {
105 XCamReturn ret = XCAM_RETURN_NO_ERROR;
106 return ret;
107 }
108
109 XCamReturn
update_params(XCamSmartAnalysisParam & params)110 SmartAnalyzer::update_params (XCamSmartAnalysisParam ¶ms)
111 {
112 XCamReturn ret = XCAM_RETURN_NO_ERROR;
113
114 SmartHandlerList::iterator i_handler = _handlers.begin ();
115 for (; i_handler != _handlers.end (); ++i_handler)
116 {
117 SmartPtr<SmartAnalysisHandler> handler = *i_handler;
118 if (!handler->is_valid ())
119 continue;
120
121 ret = handler->update_params (params);
122
123 if (ret != XCAM_RETURN_NO_ERROR) {
124 XCAM_LOG_WARNING ("smart analyzer update handler(%s) context failed", XCAM_STR(handler->get_name()));
125 handler->destroy_context ();
126 }
127 }
128
129 return XCAM_RETURN_NO_ERROR;
130 }
131
132 XCamReturn
analyze(const SmartPtr<VideoBuffer> & buffer)133 SmartAnalyzer::analyze (const SmartPtr<VideoBuffer> &buffer)
134 {
135 XCAM_OBJ_PROFILING_START;
136
137 XCamReturn ret = XCAM_RETURN_NO_ERROR;
138 X3aResultList results;
139
140 if (!buffer.ptr ()) {
141 XCAM_LOG_DEBUG ("SmartAnalyzer::analyze got NULL buffer!");
142 return XCAM_RETURN_ERROR_PARAM;
143 }
144
145 SmartHandlerList::iterator i_handler = _handlers.begin ();
146 for (; i_handler != _handlers.end (); ++i_handler)
147 {
148 SmartPtr<SmartAnalysisHandler> handler = *i_handler;
149 if (!handler->is_valid ())
150 continue;
151
152 ret = handler->analyze (buffer, results);
153 if (ret != XCAM_RETURN_NO_ERROR && ret != XCAM_RETURN_BYPASS) {
154 XCAM_LOG_WARNING ("smart analyzer analyze handler(%s) context failed", XCAM_STR(handler->get_name()));
155 handler->destroy_context ();
156 }
157 }
158
159 if (!results.empty ()) {
160 set_results_timestamp (results, buffer->get_timestamp ());
161 notify_calculation_done (results);
162 }
163
164 XCAM_OBJ_PROFILING_END ("smart analysis", XCAM_OBJ_DUR_FRAME_NUM);
165
166 return XCAM_RETURN_NO_ERROR;
167 }
168
169 void
post_smart_results(X3aResultList & results,int64_t timestamp)170 SmartAnalyzer::post_smart_results (X3aResultList &results, int64_t timestamp)
171 {
172 if (!results.empty ()) {
173 set_results_timestamp (results, timestamp);
174 notify_calculation_done (results);
175 }
176 }
177
178 }
179