• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * smart_analyzer_loader.cpp - smart 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: Zong Wei <wei.zong@intel.com>
19  */
20 
21 #include "smart_analyzer_loader.h"
22 #include "analyzer_loader.h"
23 #include "smart_analyzer.h"
24 #include "smart_analysis_handler.h"
25 #include <dirent.h>
26 
27 namespace XCam {
28 
29 #define MAX_PLUGIN_LIB_COUNT 10
30 
SmartAnalyzerLoader(const char * lib_path,const char * name,const char * symbol)31 SmartAnalyzerLoader::SmartAnalyzerLoader (const char *lib_path, const char *name, const char *symbol)
32     : AnalyzerLoader (lib_path, symbol)
33     , _name (NULL)
34 {
35     if (name)
36         _name = strndup (name, XCAM_MAX_STR_SIZE);
37 }
38 
~SmartAnalyzerLoader()39 SmartAnalyzerLoader::~SmartAnalyzerLoader ()
40 {
41     if (_name)
42         xcam_free (_name);
43 }
44 
45 SmartHandlerList
46 
load_smart_handlers(const char * dir_path)47 SmartAnalyzerLoader::load_smart_handlers (const char *dir_path)
48 {
49     SmartHandlerList ret_handers;
50     AnalyzerLoaderList loaders = create_analyzer_loader (dir_path);
51     for (AnalyzerLoaderList::iterator i_loader = loaders.begin ();
52             i_loader != loaders.end (); ++i_loader)
53     {
54         SmartPtr<SmartAnalysisHandler> handler = (*i_loader)->load_smart_handler(*i_loader);
55         if (!handler.ptr ())
56             continue;
57 
58         SmartHandlerList::iterator i_pos = ret_handers.begin ();
59         for (; i_pos != ret_handers.end (); ++i_pos)
60         {
61             if (handler->get_priority() < (*i_pos)->get_priority ())
62                 break;
63         }
64         ret_handers.insert (i_pos, handler);
65     }
66     return ret_handers;
67 }
68 
69 AnalyzerLoaderList
create_analyzer_loader(const char * dir_path)70 SmartAnalyzerLoader::create_analyzer_loader (const char *dir_path)
71 {
72     XCAM_ASSERT (dir_path);
73 
74     char lib_path[512];
75     DIR  *lib_dir = NULL;
76     struct dirent *dirent_lib = NULL;
77     SmartPtr<SmartAnalyzerLoader> loader;
78     AnalyzerLoaderList loader_list;
79     uint8_t count = 0;
80 
81     lib_dir = opendir (dir_path);
82     if (lib_dir) {
83         while ((count < MAX_PLUGIN_LIB_COUNT) && (dirent_lib = readdir (lib_dir)) != NULL) {
84             if (dirent_lib->d_type != DT_LNK &&
85                     dirent_lib->d_type != DT_REG)
86                 continue;
87             snprintf (lib_path, sizeof(lib_path), "%s/%s", dir_path, dirent_lib->d_name);
88             loader = new SmartAnalyzerLoader (lib_path, dirent_lib->d_name);
89             if (loader.ptr ()) {
90                 loader_list.push_back (loader);
91             }
92         }
93     }
94     if (lib_dir)
95         closedir (lib_dir);
96     return loader_list;
97 }
98 
99 SmartPtr<SmartAnalysisHandler>
load_smart_handler(SmartPtr<SmartAnalyzerLoader> & self)100 SmartAnalyzerLoader::load_smart_handler (SmartPtr<SmartAnalyzerLoader> &self)
101 {
102     XCAM_ASSERT (self.ptr () == this);
103 
104     SmartPtr<SmartAnalysisHandler> handler;
105     XCamSmartAnalysisDescription *desc = (XCamSmartAnalysisDescription*)load_library (get_lib_path ());
106     if (NULL == desc) {
107         XCAM_LOG_WARNING ("load smart handler lib symbol failed");
108         return NULL;
109     }
110 
111     handler = new SmartAnalysisHandler (desc, self, (desc->name ? desc->name : _name));
112     if (!handler.ptr ()) {
113         XCAM_LOG_WARNING ("create smart handler failed");
114         close_handle ();
115         return NULL;
116     }
117 
118     XCAM_LOG_INFO ("smart handler(%s) created from lib", XCAM_STR (handler->get_name()));
119     return handler;
120 }
121 
122 void *
load_symbol(void * handle)123 SmartAnalyzerLoader::load_symbol (void* handle)
124 {
125     XCamSmartAnalysisDescription *desc = NULL;
126 
127     desc = (XCamSmartAnalysisDescription *)AnalyzerLoader::get_symbol (handle);
128     if (!desc) {
129         XCAM_LOG_DEBUG ("get symbol failed from lib");
130         return NULL;
131     }
132     if (desc->version < xcam_version ()) {
133         XCAM_LOG_WARNING ("get symbol version is:0x%04x, but expect:0x%04x",
134                           desc->version, xcam_version ());
135     }
136     if (desc->size < sizeof (XCamSmartAnalysisDescription)) {
137         XCAM_LOG_DEBUG ("get symbol failed, XCamSmartAnalysisDescription size is:%" PRIu32 ", but expect:%" PRIuS,
138                         desc->size, sizeof (XCamSmartAnalysisDescription));
139         return NULL;
140     }
141 
142     if (!desc->create_context || !desc->destroy_context ||
143             !desc->update_params || !desc->analyze ||
144             !desc->free_results) {
145         XCAM_LOG_DEBUG ("some functions in symbol not set from lib");
146         return NULL;
147     }
148     return (void*)desc;
149 }
150 
151 };
152