/*
|
* 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 <wei.zong@intel.com>
|
*/
|
|
#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);
|
}
|
}
|
|
}
|