blob: 690c1ea3a04477e1258114150bfd6cd416334903 [file] [log] [blame]
zongwave03954a32015-09-22 15:40:44 +08001/*
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"
zongwave03954a32015-09-22 15:40:44 +080022#include "smart_analyzer.h"
23#include "smart_analysis_handler.h"
24
zongwave213b5d62016-11-25 18:46:53 +080025#include "xcam_obj_debug.h"
26
zongwave03954a32015-09-22 15:40:44 +080027namespace XCam {
28
29SmartAnalyzer::SmartAnalyzer (const char *name)
30 : XAnalyzer (name)
31{
zongwave213b5d62016-11-25 18:46:53 +080032 XCAM_OBJ_PROFILING_INIT;
zongwave03954a32015-09-22 15:40:44 +080033}
34
zongwave03954a32015-09-22 15:40:44 +080035SmartAnalyzer::~SmartAnalyzer ()
36{
37}
38
39XCamReturn
40SmartAnalyzer::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);
Wind Yuan7f8d9e02016-03-30 22:49:57 +080048 handler->set_analyzer (this);
zongwave03954a32015-09-22 15:40:44 +080049 return ret;
50}
51
52XCamReturn
53SmartAnalyzer::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
62XCamReturn
63SmartAnalyzer::release_handlers ()
64{
65 XCamReturn ret = XCAM_RETURN_NO_ERROR;
66 return ret;
67}
68
69XCamReturn
70SmartAnalyzer::internal_init (uint32_t width, uint32_t height, double framerate)
71{
72 XCAM_UNUSED (width);
73 XCAM_UNUSED (height);
74 XCAM_UNUSED (framerate);
Wind Yuan7f8d9e02016-03-30 22:49:57 +080075 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) {
Yinhang Liu024a2342017-02-27 11:01:17 +080081 XCAM_LOG_WARNING ("smart analyzer initialize handler(%s) context failed", XCAM_STR(handler->get_name()));
Wind Yuan7f8d9e02016-03-30 22:49:57 +080082 }
83 }
84
85 return XCAM_RETURN_NO_ERROR;
zongwave03954a32015-09-22 15:40:44 +080086}
87
88XCamReturn
89SmartAnalyzer::internal_deinit ()
90{
Wind Yuan7f8d9e02016-03-30 22:49:57 +080091 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;
zongwave03954a32015-09-22 15:40:44 +0800100}
101
102XCamReturn
103SmartAnalyzer::configure ()
104{
105 XCamReturn ret = XCAM_RETURN_NO_ERROR;
106 return ret;
107}
108
109XCamReturn
110SmartAnalyzer::update_params (XCamSmartAnalysisParam &params)
111{
112 XCamReturn ret = XCAM_RETURN_NO_ERROR;
113
Wind Yuan7f8d9e02016-03-30 22:49:57 +0800114 SmartHandlerList::iterator i_handler = _handlers.begin ();
zongwave03954a32015-09-22 15:40:44 +0800115 for (; i_handler != _handlers.end (); ++i_handler)
116 {
Wind Yuan7f8d9e02016-03-30 22:49:57 +0800117 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 }
zongwave03954a32015-09-22 15:40:44 +0800127 }
128
Wind Yuan7f8d9e02016-03-30 22:49:57 +0800129 return XCAM_RETURN_NO_ERROR;
zongwave03954a32015-09-22 15:40:44 +0800130}
131
132XCamReturn
Wind Yuan6d144ce2017-08-16 18:29:29 +0800133SmartAnalyzer::analyze (const SmartPtr<VideoBuffer> &buffer)
zongwave03954a32015-09-22 15:40:44 +0800134{
zongwave213b5d62016-11-25 18:46:53 +0800135 XCAM_OBJ_PROFILING_START;
136
zongwave03954a32015-09-22 15:40:44 +0800137 XCamReturn ret = XCAM_RETURN_NO_ERROR;
138 X3aResultList results;
zongwave03954a32015-09-22 15:40:44 +0800139
140 if (!buffer.ptr ()) {
Wind Yuan7f8d9e02016-03-30 22:49:57 +0800141 XCAM_LOG_DEBUG ("SmartAnalyzer::analyze got NULL buffer!");
zongwave03954a32015-09-22 15:40:44 +0800142 return XCAM_RETURN_ERROR_PARAM;
143 }
144
Wind Yuan7f8d9e02016-03-30 22:49:57 +0800145 SmartHandlerList::iterator i_handler = _handlers.begin ();
zongwave03954a32015-09-22 15:40:44 +0800146 for (; i_handler != _handlers.end (); ++i_handler)
147 {
Wind Yuan7f8d9e02016-03-30 22:49:57 +0800148 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 }
zongwave03954a32015-09-22 15:40:44 +0800157 }
158
zongwave03954a32015-09-22 15:40:44 +0800159 if (!results.empty ()) {
Wind Yuan7f8d9e02016-03-30 22:49:57 +0800160 set_results_timestamp (results, buffer->get_timestamp ());
zongwave03954a32015-09-22 15:40:44 +0800161 notify_calculation_done (results);
162 }
163
Yinhang Liu070c7592017-04-13 19:22:17 +0800164 XCAM_OBJ_PROFILING_END ("smart analysis", XCAM_OBJ_DUR_FRAME_NUM);
zongwave213b5d62016-11-25 18:46:53 +0800165
Wind Yuan7f8d9e02016-03-30 22:49:57 +0800166 return XCAM_RETURN_NO_ERROR;
167}
168
169void
170SmartAnalyzer::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 }
zongwave03954a32015-09-22 15:40:44 +0800176}
177
178}