Chris@58
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@58
|
2
|
Chris@58
|
3 /*
|
Chris@60
|
4 Sonic Visualiser
|
Chris@60
|
5 An audio file viewer and annotation editor.
|
Chris@60
|
6 Centre for Digital Music, Queen Mary, University of London.
|
Chris@60
|
7 This file copyright 2006 Chris Cannam.
|
Chris@58
|
8
|
Chris@60
|
9 This program is free software; you can redistribute it and/or
|
Chris@60
|
10 modify it under the terms of the GNU General Public License as
|
Chris@60
|
11 published by the Free Software Foundation; either version 2 of the
|
Chris@60
|
12 License, or (at your option) any later version. See the file
|
Chris@60
|
13 COPYING included with this distribution for more information.
|
Chris@58
|
14 */
|
Chris@58
|
15
|
Chris@58
|
16 #include "FeatureExtractionPluginAdapter.h"
|
Chris@58
|
17
|
Chris@60
|
18 FeatureExtractionPluginAdapterBase::FeatureExtractionPluginAdapterBase() :
|
Chris@60
|
19 m_populated(false)
|
Chris@58
|
20 {
|
Chris@58
|
21 }
|
Chris@58
|
22
|
Chris@60
|
23 const SVPPluginDescriptor *
|
Chris@60
|
24 FeatureExtractionPluginAdapterBase::getDescriptor()
|
Chris@60
|
25 {
|
Chris@60
|
26 if (m_populated) return &m_descriptor;
|
Chris@60
|
27
|
Chris@60
|
28 FeatureExtractionPlugin *plugin = createPlugin(48000);
|
Chris@60
|
29
|
Chris@60
|
30 m_parameters = plugin->getParameterDescriptors();
|
Chris@60
|
31 m_programs = plugin->getPrograms();
|
Chris@60
|
32
|
Chris@60
|
33 m_descriptor.name = strdup(plugin->getName().c_str());
|
Chris@60
|
34 m_descriptor.description = strdup(plugin->getDescription().c_str());
|
Chris@60
|
35 m_descriptor.maker = strdup(plugin->getMaker().c_str());
|
Chris@60
|
36 m_descriptor.pluginVersion = plugin->getPluginVersion();
|
Chris@60
|
37 m_descriptor.copyright = strdup(plugin->getCopyright().c_str());
|
Chris@60
|
38
|
Chris@60
|
39 m_descriptor.parameterCount = m_parameters.size();
|
Chris@60
|
40 m_descriptor.parameters = (const SVPParameterDescriptor **)
|
Chris@60
|
41 malloc(m_parameters.size() * sizeof(SVPParameterDescriptor));
|
Chris@60
|
42
|
Chris@60
|
43 for (unsigned int i = 0; i < m_parameters.size(); ++i) {
|
Chris@60
|
44 SVPParameterDescriptor *desc = (SVPParameterDescriptor *)
|
Chris@60
|
45 malloc(sizeof(SVPParameterDescriptor));
|
Chris@60
|
46 desc->name = strdup(m_parameters[i].name.c_str());
|
Chris@60
|
47 desc->description = strdup(m_parameters[i].description.c_str());
|
Chris@60
|
48 desc->unit = strdup(m_parameters[i].unit.c_str());
|
Chris@60
|
49 desc->minValue = m_parameters[i].minValue;
|
Chris@60
|
50 desc->maxValue = m_parameters[i].maxValue;
|
Chris@60
|
51 desc->defaultValue = m_parameters[i].defaultValue;
|
Chris@60
|
52 desc->isQuantized = m_parameters[i].isQuantized;
|
Chris@60
|
53 desc->quantizeStep = m_parameters[i].quantizeStep;
|
Chris@60
|
54 m_descriptor.parameters[i] = desc;
|
Chris@60
|
55 }
|
Chris@60
|
56
|
Chris@60
|
57 m_descriptor.programCount = m_programs.size();
|
Chris@60
|
58 m_descriptor.programs = (const char **)
|
Chris@60
|
59 malloc(m_programs.size() * sizeof(const char *));
|
Chris@60
|
60
|
Chris@60
|
61 for (unsigned int i = 0; i < m_programs.size(); ++i) {
|
Chris@60
|
62 m_descriptor.programs[i] = strdup(m_programs[i].c_str());
|
Chris@60
|
63 }
|
Chris@60
|
64
|
Chris@60
|
65 m_descriptor.instantiate = svpInstantiate;
|
Chris@60
|
66 m_descriptor.cleanup = svpCleanup;
|
Chris@60
|
67 m_descriptor.initialise = svpInitialise;
|
Chris@60
|
68 m_descriptor.reset = svpReset;
|
Chris@60
|
69 m_descriptor.getParameter = svpGetParameter;
|
Chris@60
|
70 m_descriptor.setParameter = svpSetParameter;
|
Chris@60
|
71 m_descriptor.getCurrentProgram = svpGetCurrentProgram;
|
Chris@60
|
72 m_descriptor.selectProgram = svpSelectProgram;
|
Chris@60
|
73 m_descriptor.getPreferredStepSize = svpGetPreferredStepSize;
|
Chris@60
|
74 m_descriptor.getPreferredBlockSize = svpGetPreferredBlockSize;
|
Chris@60
|
75 m_descriptor.getMinChannelCount = svpGetMinChannelCount;
|
Chris@60
|
76 m_descriptor.getMaxChannelCount = svpGetMaxChannelCount;
|
Chris@60
|
77 m_descriptor.getOutputCount = svpGetOutputCount;
|
Chris@60
|
78 m_descriptor.getOutputDescriptor = svpGetOutputDescriptor;
|
Chris@60
|
79 m_descriptor.releaseOutputDescriptor = svpReleaseOutputDescriptor;
|
Chris@60
|
80 m_descriptor.process = svpProcess;
|
Chris@60
|
81 m_descriptor.getRemainingFeatures = svpGetRemainingFeatures;
|
Chris@60
|
82 m_descriptor.releaseFeatureSet = svpReleaseFeatureSet;
|
Chris@60
|
83
|
Chris@60
|
84 m_adapterMap[&m_descriptor] = this;
|
Chris@60
|
85
|
Chris@60
|
86 delete plugin;
|
Chris@60
|
87
|
Chris@60
|
88 m_populated = true;
|
Chris@60
|
89 return &m_descriptor;
|
Chris@60
|
90 }
|
Chris@60
|
91
|
Chris@60
|
92 FeatureExtractionPluginAdapterBase::~FeatureExtractionPluginAdapterBase()
|
Chris@60
|
93 {
|
Chris@60
|
94 if (!m_populated) return;
|
Chris@60
|
95
|
Chris@60
|
96 free((void *)m_descriptor.name);
|
Chris@60
|
97 free((void *)m_descriptor.description);
|
Chris@60
|
98 free((void *)m_descriptor.maker);
|
Chris@60
|
99 free((void *)m_descriptor.copyright);
|
Chris@60
|
100
|
Chris@60
|
101 for (unsigned int i = 0; i < m_descriptor.parameterCount; ++i) {
|
Chris@60
|
102 const SVPParameterDescriptor *desc = m_descriptor.parameters[i];
|
Chris@60
|
103 free((void *)desc->name);
|
Chris@60
|
104 free((void *)desc->description);
|
Chris@60
|
105 free((void *)desc->unit);
|
Chris@60
|
106 }
|
Chris@60
|
107 free((void *)m_descriptor.parameters);
|
Chris@60
|
108
|
Chris@60
|
109 for (unsigned int i = 0; i < m_descriptor.programCount; ++i) {
|
Chris@60
|
110 free((void *)m_descriptor.programs[i]);
|
Chris@60
|
111 }
|
Chris@60
|
112 free((void *)m_descriptor.programs);
|
Chris@60
|
113
|
Chris@60
|
114 m_adapterMap.erase(&m_descriptor);
|
Chris@60
|
115 }
|
Chris@60
|
116
|
Chris@60
|
117 FeatureExtractionPluginAdapterBase *
|
Chris@60
|
118 FeatureExtractionPluginAdapterBase::lookupAdapter(SVPPluginHandle handle)
|
Chris@60
|
119 {
|
Chris@60
|
120 AdapterMap::const_iterator i = m_adapterMap.find(handle);
|
Chris@60
|
121 if (i == m_adapterMap.end()) return 0;
|
Chris@60
|
122 return i->second;
|
Chris@60
|
123 }
|
Chris@60
|
124
|
Chris@60
|
125 SVPPluginHandle
|
Chris@60
|
126 FeatureExtractionPluginAdapterBase::svpInstantiate(const SVPPluginDescriptor *desc,
|
Chris@60
|
127 float inputSampleRate)
|
Chris@60
|
128 {
|
Chris@60
|
129 if (m_adapterMap.find(desc) == m_adapterMap.end()) return 0;
|
Chris@60
|
130 FeatureExtractionPluginAdapterBase *adapter = m_adapterMap[desc];
|
Chris@60
|
131 if (desc != &adapter->m_descriptor) return 0;
|
Chris@60
|
132
|
Chris@60
|
133 FeatureExtractionPlugin *plugin = adapter->createPlugin(inputSampleRate);
|
Chris@60
|
134 if (plugin) {
|
Chris@60
|
135 m_adapterMap[plugin] = adapter;
|
Chris@60
|
136 }
|
Chris@60
|
137
|
Chris@60
|
138 return plugin;
|
Chris@60
|
139 }
|
Chris@60
|
140
|
Chris@60
|
141 void
|
Chris@60
|
142 FeatureExtractionPluginAdapterBase::svpCleanup(SVPPluginHandle handle)
|
Chris@60
|
143 {
|
Chris@60
|
144 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
|
Chris@60
|
145 if (!adapter) {
|
Chris@60
|
146 delete ((FeatureExtractionPlugin *)handle);
|
Chris@60
|
147 return;
|
Chris@60
|
148 }
|
Chris@60
|
149 adapter->cleanup(((FeatureExtractionPlugin *)handle));
|
Chris@60
|
150 }
|
Chris@60
|
151
|
Chris@60
|
152 int
|
Chris@60
|
153 FeatureExtractionPluginAdapterBase::svpInitialise(SVPPluginHandle handle,
|
Chris@60
|
154 unsigned int channels,
|
Chris@60
|
155 unsigned int stepSize,
|
Chris@60
|
156 unsigned int blockSize)
|
Chris@60
|
157 {
|
Chris@60
|
158 bool result = ((FeatureExtractionPlugin *)handle)->initialise
|
Chris@60
|
159 (channels, stepSize, blockSize);
|
Chris@60
|
160 return result ? 1 : 0;
|
Chris@60
|
161 }
|
Chris@60
|
162
|
Chris@60
|
163 void
|
Chris@60
|
164 FeatureExtractionPluginAdapterBase::svpReset(SVPPluginHandle handle)
|
Chris@60
|
165 {
|
Chris@60
|
166 ((FeatureExtractionPlugin *)handle)->reset();
|
Chris@60
|
167 }
|
Chris@60
|
168
|
Chris@60
|
169 float
|
Chris@60
|
170 FeatureExtractionPluginAdapterBase::svpGetParameter(SVPPluginHandle handle,
|
Chris@60
|
171 int param)
|
Chris@60
|
172 {
|
Chris@60
|
173 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
|
Chris@60
|
174 if (!adapter) return 0.0;
|
Chris@60
|
175 FeatureExtractionPlugin::ParameterList &list = adapter->m_parameters;
|
Chris@60
|
176 return ((FeatureExtractionPlugin *)handle)->getParameter(list[param].name);
|
Chris@60
|
177 }
|
Chris@60
|
178
|
Chris@60
|
179 void
|
Chris@60
|
180 FeatureExtractionPluginAdapterBase::svpSetParameter(SVPPluginHandle handle,
|
Chris@60
|
181 int param, float value)
|
Chris@60
|
182 {
|
Chris@60
|
183 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
|
Chris@60
|
184 if (!adapter) return;
|
Chris@60
|
185 FeatureExtractionPlugin::ParameterList &list = adapter->m_parameters;
|
Chris@60
|
186 ((FeatureExtractionPlugin *)handle)->setParameter(list[param].name, value);
|
Chris@60
|
187 }
|
Chris@60
|
188
|
Chris@60
|
189 unsigned int
|
Chris@60
|
190 FeatureExtractionPluginAdapterBase::svpGetCurrentProgram(SVPPluginHandle handle)
|
Chris@60
|
191 {
|
Chris@60
|
192 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
|
Chris@60
|
193 if (!adapter) return 0;
|
Chris@60
|
194 FeatureExtractionPlugin::ProgramList &list = adapter->m_programs;
|
Chris@60
|
195 std::string program = ((FeatureExtractionPlugin *)handle)->getCurrentProgram();
|
Chris@60
|
196 for (unsigned int i = 0; i < list.size(); ++i) {
|
Chris@60
|
197 if (list[i] == program) return i;
|
Chris@60
|
198 }
|
Chris@60
|
199 return 0;
|
Chris@60
|
200 }
|
Chris@60
|
201
|
Chris@60
|
202 void
|
Chris@60
|
203 FeatureExtractionPluginAdapterBase::svpSelectProgram(SVPPluginHandle handle,
|
Chris@60
|
204 unsigned int program)
|
Chris@60
|
205 {
|
Chris@60
|
206 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
|
Chris@60
|
207 if (!adapter) return;
|
Chris@60
|
208 FeatureExtractionPlugin::ProgramList &list = adapter->m_programs;
|
Chris@60
|
209 ((FeatureExtractionPlugin *)handle)->selectProgram(list[program]);
|
Chris@60
|
210 }
|
Chris@60
|
211
|
Chris@60
|
212 unsigned int
|
Chris@60
|
213 FeatureExtractionPluginAdapterBase::svpGetPreferredStepSize(SVPPluginHandle handle)
|
Chris@60
|
214 {
|
Chris@60
|
215 return ((FeatureExtractionPlugin *)handle)->getPreferredStepSize();
|
Chris@60
|
216 }
|
Chris@60
|
217
|
Chris@60
|
218 unsigned int
|
Chris@60
|
219 FeatureExtractionPluginAdapterBase::svpGetPreferredBlockSize(SVPPluginHandle handle)
|
Chris@60
|
220 {
|
Chris@60
|
221 return ((FeatureExtractionPlugin *)handle)->getPreferredBlockSize();
|
Chris@60
|
222 }
|
Chris@60
|
223
|
Chris@60
|
224 unsigned int
|
Chris@60
|
225 FeatureExtractionPluginAdapterBase::svpGetMinChannelCount(SVPPluginHandle handle)
|
Chris@60
|
226 {
|
Chris@60
|
227 return ((FeatureExtractionPlugin *)handle)->getMinChannelCount();
|
Chris@60
|
228 }
|
Chris@60
|
229
|
Chris@60
|
230 unsigned int
|
Chris@60
|
231 FeatureExtractionPluginAdapterBase::svpGetMaxChannelCount(SVPPluginHandle handle)
|
Chris@60
|
232 {
|
Chris@60
|
233 return ((FeatureExtractionPlugin *)handle)->getMaxChannelCount();
|
Chris@60
|
234 }
|
Chris@60
|
235
|
Chris@60
|
236 unsigned int
|
Chris@60
|
237 FeatureExtractionPluginAdapterBase::svpGetOutputCount(SVPPluginHandle handle)
|
Chris@60
|
238 {
|
Chris@60
|
239 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
|
Chris@60
|
240 if (!adapter) return 0;
|
Chris@60
|
241 return adapter->getOutputCount((FeatureExtractionPlugin *)handle);
|
Chris@60
|
242 }
|
Chris@60
|
243
|
Chris@60
|
244 SVPOutputDescriptor *
|
Chris@60
|
245 FeatureExtractionPluginAdapterBase::svpGetOutputDescriptor(SVPPluginHandle handle,
|
Chris@60
|
246 unsigned int i)
|
Chris@60
|
247 {
|
Chris@60
|
248 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
|
Chris@60
|
249 if (!adapter) return 0;
|
Chris@60
|
250 return adapter->getOutputDescriptor((FeatureExtractionPlugin *)handle, i);
|
Chris@60
|
251 }
|
Chris@60
|
252
|
Chris@60
|
253 void
|
Chris@60
|
254 FeatureExtractionPluginAdapterBase::svpReleaseOutputDescriptor(SVPOutputDescriptor *desc)
|
Chris@60
|
255 {
|
Chris@60
|
256 if (desc->name) free((void *)desc->name);
|
Chris@60
|
257 if (desc->description) free((void *)desc->description);
|
Chris@60
|
258 if (desc->unit) free((void *)desc->unit);
|
Chris@60
|
259 for (unsigned int i = 0; i < desc->valueCount; ++i) {
|
Chris@60
|
260 free((void *)desc->valueNames[i]);
|
Chris@60
|
261 }
|
Chris@60
|
262 if (desc->valueNames) free((void *)desc->valueNames);
|
Chris@60
|
263 free((void *)desc);
|
Chris@60
|
264 }
|
Chris@60
|
265
|
Chris@60
|
266 SVPFeatureList **
|
Chris@60
|
267 FeatureExtractionPluginAdapterBase::svpProcess(SVPPluginHandle handle,
|
Chris@60
|
268 float **inputBuffers,
|
Chris@60
|
269 int sec,
|
Chris@60
|
270 int nsec)
|
Chris@60
|
271 {
|
Chris@60
|
272 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
|
Chris@60
|
273 if (!adapter) return 0;
|
Chris@60
|
274 return adapter->process((FeatureExtractionPlugin *)handle,
|
Chris@60
|
275 inputBuffers, sec, nsec);
|
Chris@60
|
276 }
|
Chris@60
|
277
|
Chris@60
|
278 SVPFeatureList **
|
Chris@60
|
279 FeatureExtractionPluginAdapterBase::svpGetRemainingFeatures(SVPPluginHandle handle)
|
Chris@60
|
280 {
|
Chris@60
|
281 FeatureExtractionPluginAdapterBase *adapter = lookupAdapter(handle);
|
Chris@60
|
282 if (!adapter) return 0;
|
Chris@60
|
283 return adapter->getRemainingFeatures((FeatureExtractionPlugin *)handle);
|
Chris@60
|
284 }
|
Chris@60
|
285
|
Chris@60
|
286 void
|
Chris@60
|
287 FeatureExtractionPluginAdapterBase::svpReleaseFeatureSet(SVPFeatureList **fs)
|
Chris@60
|
288 {
|
Chris@60
|
289 if (!fs) return;
|
Chris@60
|
290 for (unsigned int i = 0; fs[i]; ++i) {
|
Chris@60
|
291 for (unsigned int j = 0; j < fs[i]->featureCount; ++j) {
|
Chris@60
|
292 SVPFeature *feature = &fs[i]->features[j];
|
Chris@60
|
293 if (feature->values) free((void *)feature->values);
|
Chris@60
|
294 if (feature->label) free((void *)feature->label);
|
Chris@60
|
295 free((void *)feature);
|
Chris@60
|
296 }
|
Chris@60
|
297 if (fs[i]->features) free((void *)fs[i]->features);
|
Chris@60
|
298 free((void *)fs[i]);
|
Chris@60
|
299 }
|
Chris@60
|
300 free((void *)fs);
|
Chris@60
|
301 }
|
Chris@60
|
302
|
Chris@60
|
303 void
|
Chris@60
|
304 FeatureExtractionPluginAdapterBase::cleanup(FeatureExtractionPlugin *plugin)
|
Chris@60
|
305 {
|
Chris@60
|
306 if (m_pluginOutputs.find(plugin) != m_pluginOutputs.end()) {
|
Chris@60
|
307 delete m_pluginOutputs[plugin];
|
Chris@60
|
308 m_pluginOutputs.erase(plugin);
|
Chris@60
|
309 }
|
Chris@60
|
310 m_adapterMap.erase(plugin);
|
Chris@60
|
311 delete ((FeatureExtractionPlugin *)plugin);
|
Chris@60
|
312 }
|
Chris@60
|
313
|
Chris@60
|
314 void
|
Chris@60
|
315 FeatureExtractionPluginAdapterBase::checkOutputMap(FeatureExtractionPlugin *plugin)
|
Chris@60
|
316 {
|
Chris@60
|
317 if (!m_pluginOutputs[plugin]) {
|
Chris@60
|
318 m_pluginOutputs[plugin] = new FeatureExtractionPlugin::OutputList
|
Chris@60
|
319 (plugin->getOutputDescriptors());
|
Chris@60
|
320 }
|
Chris@60
|
321 }
|
Chris@60
|
322
|
Chris@60
|
323 unsigned int
|
Chris@60
|
324 FeatureExtractionPluginAdapterBase::getOutputCount(FeatureExtractionPlugin *plugin)
|
Chris@60
|
325 {
|
Chris@60
|
326 checkOutputMap(plugin);
|
Chris@60
|
327 return m_pluginOutputs[plugin]->size();
|
Chris@60
|
328 }
|
Chris@60
|
329
|
Chris@60
|
330 SVPOutputDescriptor *
|
Chris@60
|
331 FeatureExtractionPluginAdapterBase::getOutputDescriptor(FeatureExtractionPlugin *plugin,
|
Chris@60
|
332 unsigned int i)
|
Chris@60
|
333 {
|
Chris@60
|
334 checkOutputMap(plugin);
|
Chris@60
|
335 FeatureExtractionPlugin::OutputDescriptor &od =
|
Chris@60
|
336 (*m_pluginOutputs[plugin])[i];
|
Chris@60
|
337
|
Chris@60
|
338 SVPOutputDescriptor *desc = (SVPOutputDescriptor *)
|
Chris@60
|
339 malloc(sizeof(SVPOutputDescriptor));
|
Chris@60
|
340
|
Chris@60
|
341 desc->name = strdup(od.name.c_str());
|
Chris@60
|
342 desc->description = strdup(od.description.c_str());
|
Chris@60
|
343 desc->unit = strdup(od.unit.c_str());
|
Chris@60
|
344 desc->hasFixedValueCount = od.hasFixedValueCount;
|
Chris@60
|
345 desc->valueCount = od.valueCount;
|
Chris@60
|
346
|
Chris@60
|
347 desc->valueNames = (const char **)
|
Chris@60
|
348 malloc(od.valueCount * sizeof(const char *));
|
Chris@60
|
349
|
Chris@60
|
350 for (unsigned int i = 0; i < od.valueCount; ++i) {
|
Chris@60
|
351 desc->valueNames[i] = strdup(od.valueNames[i].c_str());
|
Chris@60
|
352 }
|
Chris@60
|
353
|
Chris@60
|
354 desc->hasKnownExtents = od.hasKnownExtents;
|
Chris@60
|
355 desc->minValue = od.minValue;
|
Chris@60
|
356 desc->maxValue = od.maxValue;
|
Chris@60
|
357 desc->isQuantized = od.isQuantized;
|
Chris@60
|
358 desc->quantizeStep = od.quantizeStep;
|
Chris@60
|
359
|
Chris@60
|
360 switch (od.sampleType) {
|
Chris@60
|
361 case FeatureExtractionPlugin::OutputDescriptor::OneSamplePerStep:
|
Chris@60
|
362 desc->sampleType = svpOneSamplePerStep; break;
|
Chris@60
|
363 case FeatureExtractionPlugin::OutputDescriptor::FixedSampleRate:
|
Chris@60
|
364 desc->sampleType = svpFixedSampleRate; break;
|
Chris@60
|
365 case FeatureExtractionPlugin::OutputDescriptor::VariableSampleRate:
|
Chris@60
|
366 desc->sampleType = svpVariableSampleRate; break;
|
Chris@60
|
367 }
|
Chris@60
|
368
|
Chris@60
|
369 desc->sampleRate = od.sampleRate;
|
Chris@60
|
370
|
Chris@60
|
371 return desc;
|
Chris@60
|
372 }
|
Chris@60
|
373
|
Chris@60
|
374 SVPFeatureList **
|
Chris@60
|
375 FeatureExtractionPluginAdapterBase::process(FeatureExtractionPlugin *plugin,
|
Chris@60
|
376 float **inputBuffers,
|
Chris@60
|
377 int sec, int nsec)
|
Chris@60
|
378 {
|
Chris@60
|
379 RealTime rt(sec, nsec);
|
Chris@60
|
380 return convertFeatures(plugin->process(inputBuffers, rt));
|
Chris@60
|
381 }
|
Chris@60
|
382
|
Chris@60
|
383 SVPFeatureList **
|
Chris@60
|
384 FeatureExtractionPluginAdapterBase::getRemainingFeatures(FeatureExtractionPlugin *plugin)
|
Chris@60
|
385 {
|
Chris@60
|
386 return convertFeatures(plugin->getRemainingFeatures());
|
Chris@60
|
387 }
|
Chris@60
|
388
|
Chris@60
|
389 SVPFeatureList **
|
Chris@60
|
390 FeatureExtractionPluginAdapterBase::convertFeatures(const FeatureExtractionPlugin::FeatureSet &features)
|
Chris@60
|
391 {
|
Chris@60
|
392 unsigned int n = 0;
|
Chris@60
|
393 if (features.begin() != features.end()) {
|
Chris@60
|
394 FeatureExtractionPlugin::FeatureSet::const_iterator i = features.end();
|
Chris@60
|
395 --i;
|
Chris@60
|
396 n = i->first + 1;
|
Chris@60
|
397 }
|
Chris@60
|
398
|
Chris@60
|
399 if (!n) return 0;
|
Chris@60
|
400
|
Chris@60
|
401 SVPFeatureList **fs = (SVPFeatureList **)
|
Chris@60
|
402 malloc((n + 1) * sizeof(SVPFeatureList *));
|
Chris@60
|
403
|
Chris@60
|
404 for (unsigned int i = 0; i < n; ++i) {
|
Chris@60
|
405 fs[i] = (SVPFeatureList *)malloc(sizeof(SVPFeatureList));
|
Chris@60
|
406 if (features.find(i) == features.end()) {
|
Chris@60
|
407 fs[i]->featureCount = 0;
|
Chris@60
|
408 fs[i]->features = 0;
|
Chris@60
|
409 } else {
|
Chris@60
|
410 FeatureExtractionPlugin::FeatureSet::const_iterator fi =
|
Chris@60
|
411 features.find(i);
|
Chris@60
|
412 const FeatureExtractionPlugin::FeatureList &fl = fi->second;
|
Chris@60
|
413 fs[i]->featureCount = fl.size();
|
Chris@60
|
414 fs[i]->features = (SVPFeature *)malloc(fl.size() *
|
Chris@60
|
415 sizeof(SVPFeature));
|
Chris@60
|
416 for (unsigned int j = 0; j < fl.size(); ++j) {
|
Chris@60
|
417 fs[i]->features[j].hasTimestamp = fl[j].hasTimestamp;
|
Chris@60
|
418 fs[i]->features[j].sec = fl[j].timestamp.sec;
|
Chris@60
|
419 fs[i]->features[j].nsec = fl[j].timestamp.nsec;
|
Chris@60
|
420 fs[i]->features[j].valueCount = fl[j].values.size();
|
Chris@60
|
421 fs[i]->features[j].values = (float *)malloc
|
Chris@60
|
422 (fs[i]->features[j].valueCount * sizeof(float));
|
Chris@60
|
423 for (unsigned int k = 0; k < fs[i]->features[j].valueCount; ++k) {
|
Chris@60
|
424 fs[i]->features[j].values[k] = fl[j].values[k];
|
Chris@60
|
425 }
|
Chris@60
|
426 fs[i]->features[j].label = strdup(fl[j].label.c_str());
|
Chris@60
|
427 }
|
Chris@60
|
428 }
|
Chris@60
|
429 }
|
Chris@60
|
430
|
Chris@60
|
431 fs[n] = 0;
|
Chris@60
|
432
|
Chris@60
|
433 return fs;
|
Chris@60
|
434 }
|
Chris@60
|
435
|
Chris@60
|
436 FeatureExtractionPluginAdapterBase::AdapterMap
|
Chris@60
|
437 FeatureExtractionPluginAdapterBase::m_adapterMap;
|
Chris@60
|
438
|
Chris@60
|
439
|