| /* |
| * smart_analyzer.cpp - smart analyzer |
| * |
| * 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: Zong Wei <[email protected]> |
| */ |
| |
| #include "smart_analyzer_loader.h" |
| #include "smart_analyzer.h" |
| #include "smart_analysis_handler.h" |
| |
| #include "xcam_obj_debug.h" |
| |
| namespace XCam { |
| |
| SmartAnalyzer::SmartAnalyzer (const char *name) |
| : XAnalyzer (name) |
| { |
| XCAM_OBJ_PROFILING_INIT; |
| } |
| |
| SmartAnalyzer::~SmartAnalyzer () |
| { |
| } |
| |
| XCamReturn |
| SmartAnalyzer::add_handler (SmartPtr<SmartAnalysisHandler> handler) |
| { |
| XCamReturn ret = XCAM_RETURN_NO_ERROR; |
| if (!handler.ptr ()) { |
| return XCAM_RETURN_ERROR_PARAM; |
| } |
| |
| _handlers.push_back (handler); |
| handler->set_analyzer (this); |
| return ret; |
| } |
| |
| XCamReturn |
| SmartAnalyzer::create_handlers () |
| { |
| XCamReturn ret = XCAM_RETURN_NO_ERROR; |
| if (_handlers.empty ()) { |
| ret = XCAM_RETURN_ERROR_PARAM; |
| } |
| return ret; |
| } |
| |
| XCamReturn |
| SmartAnalyzer::release_handlers () |
| { |
| XCamReturn ret = XCAM_RETURN_NO_ERROR; |
| return ret; |
| } |
| |
| XCamReturn |
| SmartAnalyzer::internal_init (uint32_t width, uint32_t height, double framerate) |
| { |
| XCAM_UNUSED (width); |
| XCAM_UNUSED (height); |
| XCAM_UNUSED (framerate); |
| SmartHandlerList::iterator i_handler = _handlers.begin (); |
| for (; i_handler != _handlers.end (); ++i_handler) |
| { |
| SmartPtr<SmartAnalysisHandler> handler = *i_handler; |
| XCamReturn ret = handler->create_context (handler); |
| if (ret != XCAM_RETURN_NO_ERROR) { |
| XCAM_LOG_WARNING ("smart analyzer initialize handler(%s) context failed", XCAM_STR(handler->get_name())); |
| } |
| } |
| |
| return XCAM_RETURN_NO_ERROR; |
| } |
| |
| XCamReturn |
| SmartAnalyzer::internal_deinit () |
| { |
| SmartHandlerList::iterator i_handler = _handlers.begin (); |
| for (; i_handler != _handlers.end (); ++i_handler) |
| { |
| SmartPtr<SmartAnalysisHandler> handler = *i_handler; |
| if (handler->is_valid ()) |
| handler->destroy_context (); |
| } |
| |
| return XCAM_RETURN_NO_ERROR; |
| } |
| |
| XCamReturn |
| SmartAnalyzer::configure () |
| { |
| XCamReturn ret = XCAM_RETURN_NO_ERROR; |
| return ret; |
| } |
| |
| XCamReturn |
| SmartAnalyzer::update_params (XCamSmartAnalysisParam ¶ms) |
| { |
| XCamReturn ret = XCAM_RETURN_NO_ERROR; |
| |
| SmartHandlerList::iterator i_handler = _handlers.begin (); |
| for (; i_handler != _handlers.end (); ++i_handler) |
| { |
| SmartPtr<SmartAnalysisHandler> handler = *i_handler; |
| if (!handler->is_valid ()) |
| continue; |
| |
| ret = handler->update_params (params); |
| |
| if (ret != XCAM_RETURN_NO_ERROR) { |
| XCAM_LOG_WARNING ("smart analyzer update handler(%s) context failed", XCAM_STR(handler->get_name())); |
| handler->destroy_context (); |
| } |
| } |
| |
| return XCAM_RETURN_NO_ERROR; |
| } |
| |
| XCamReturn |
| SmartAnalyzer::analyze (const SmartPtr<VideoBuffer> &buffer) |
| { |
| XCAM_OBJ_PROFILING_START; |
| |
| XCamReturn ret = XCAM_RETURN_NO_ERROR; |
| X3aResultList results; |
| |
| if (!buffer.ptr ()) { |
| XCAM_LOG_DEBUG ("SmartAnalyzer::analyze got NULL buffer!"); |
| return XCAM_RETURN_ERROR_PARAM; |
| } |
| |
| SmartHandlerList::iterator i_handler = _handlers.begin (); |
| for (; i_handler != _handlers.end (); ++i_handler) |
| { |
| SmartPtr<SmartAnalysisHandler> handler = *i_handler; |
| if (!handler->is_valid ()) |
| continue; |
| |
| ret = handler->analyze (buffer, results); |
| if (ret != XCAM_RETURN_NO_ERROR && ret != XCAM_RETURN_BYPASS) { |
| XCAM_LOG_WARNING ("smart analyzer analyze handler(%s) context failed", XCAM_STR(handler->get_name())); |
| handler->destroy_context (); |
| } |
| } |
| |
| if (!results.empty ()) { |
| set_results_timestamp (results, buffer->get_timestamp ()); |
| notify_calculation_done (results); |
| } |
| |
| XCAM_OBJ_PROFILING_END ("smart analysis", XCAM_OBJ_DUR_FRAME_NUM); |
| |
| return XCAM_RETURN_NO_ERROR; |
| } |
| |
| void |
| SmartAnalyzer::post_smart_results (X3aResultList &results, int64_t timestamp) |
| { |
| if (!results.empty ()) { |
| set_results_timestamp (results, timestamp); |
| notify_calculation_done (results); |
| } |
| } |
| |
| } |