Mercurial > hg > qm-vamp-plugins
comparison plugins/SegmenterPlugin.cpp @ 150:7c7881bbb6ca
Update segmenter to add durations to segments and map the segment types onto a dense series starting at 1 with alphabetical labels. Update version number
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Mon, 02 Sep 2013 12:58:14 +0100 |
parents | dcf5800f0f00 |
children | f96ea0e4b475 |
comparison
equal
deleted
inserted
replaced
149:c45f74550f38 | 150:7c7881bbb6ca |
---|---|
62 } | 62 } |
63 | 63 |
64 int | 64 int |
65 SegmenterPlugin::getPluginVersion() const | 65 SegmenterPlugin::getPluginVersion() const |
66 { | 66 { |
67 return 2; | 67 return 3; |
68 } | 68 } |
69 | 69 |
70 string | 70 string |
71 SegmenterPlugin::getCopyright() const | 71 SegmenterPlugin::getCopyright() const |
72 { | 72 { |
73 return "Plugin by Mark Levy. Copyright (c) 2006-2009 QMUL - All Rights Reserved"; | 73 return "Plugin by Mark Levy. Copyright (c) 2006-2013 QMUL - All Rights Reserved"; |
74 } | 74 } |
75 | 75 |
76 bool | 76 bool |
77 SegmenterPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize) | 77 SegmenterPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize) |
78 { | 78 { |
268 segmentation.maxValue = nSegmentTypes; | 268 segmentation.maxValue = nSegmentTypes; |
269 segmentation.isQuantized = true; | 269 segmentation.isQuantized = true; |
270 segmentation.quantizeStep = 1; | 270 segmentation.quantizeStep = 1; |
271 segmentation.sampleType = OutputDescriptor::VariableSampleRate; | 271 segmentation.sampleType = OutputDescriptor::VariableSampleRate; |
272 segmentation.sampleRate = m_inputSampleRate / getPreferredStepSize(); | 272 segmentation.sampleRate = m_inputSampleRate / getPreferredStepSize(); |
273 segmentation.hasDuration = true; | |
273 | 274 |
274 list.push_back(segmentation); | 275 list.push_back(segmentation); |
275 | 276 |
276 return list; | 277 return list; |
277 } | 278 } |
278 | 279 |
279 SegmenterPlugin::FeatureSet | 280 SegmenterPlugin::FeatureSet |
280 SegmenterPlugin::process(const float *const *inputBuffers, Vamp::RealTime /* timestamp */) | 281 SegmenterPlugin::process(const float *const *inputBuffers, Vamp::RealTime timestamp) |
281 { | 282 { |
282 // convert float* to double* | 283 // convert float* to double* |
283 double *tempBuffer = new double[windowsize]; | 284 double *tempBuffer = new double[windowsize]; |
284 for (size_t i = 0; i < windowsize; ++i) { | 285 for (size_t i = 0; i < windowsize; ++i) { |
285 tempBuffer[i] = inputBuffers[0][i]; | 286 tempBuffer[i] = inputBuffers[0][i]; |
286 } | 287 } |
287 | 288 |
288 segmenter->extractFeatures(tempBuffer, segmenter->getWindowsize()); | 289 segmenter->extractFeatures(tempBuffer, segmenter->getWindowsize()); |
289 | 290 |
290 delete [] tempBuffer; | 291 delete [] tempBuffer; |
292 | |
293 m_endTime = timestamp; | |
291 | 294 |
292 return FeatureSet(); | 295 return FeatureSet(); |
293 } | 296 } |
294 | 297 |
295 SegmenterPlugin::FeatureSet | 298 SegmenterPlugin::FeatureSet |
297 { | 300 { |
298 segmenter->segment(nSegmentTypes); | 301 segmenter->segment(nSegmentTypes); |
299 Segmentation segm = segmenter->getSegmentation(); | 302 Segmentation segm = segmenter->getSegmentation(); |
300 | 303 |
301 FeatureSet returnFeatures; | 304 FeatureSet returnFeatures; |
302 | 305 |
306 // Map the segment types onto a dense series starting at 1 | |
307 | |
308 std::map<int, int> typeMap; | |
309 int nextType = 1; | |
310 | |
311 for (int i = 0; i < segm.segments.size(); ++i) { | |
312 Segment s = segm.segments[i]; | |
313 if (typeMap.find(s.type) == typeMap.end()) { | |
314 typeMap[s.type] = nextType; | |
315 ++nextType; | |
316 } | |
317 } | |
318 | |
303 for (int i = 0; i < segm.segments.size(); ++i) { | 319 for (int i = 0; i < segm.segments.size(); ++i) { |
304 | 320 |
305 Segment s = segm.segments[i]; | 321 Segment s = segm.segments[i]; |
306 | 322 |
307 Feature feature; | 323 Feature feature; |
308 feature.hasTimestamp = true; | 324 feature.hasTimestamp = true; |
309 feature.timestamp = Vamp::RealTime::frame2RealTime(s.start, static_cast<unsigned int>(m_inputSampleRate)); | 325 feature.timestamp = Vamp::RealTime::frame2RealTime |
326 (s.start, (int)m_inputSampleRate); | |
327 feature.hasDuration = true; | |
328 | |
329 if (i + 1 < segm.segments.size()) { | |
330 feature.duration = Vamp::RealTime::frame2RealTime | |
331 (segm.segments[i+1].start - s.start, (int)m_inputSampleRate); | |
332 } else { | |
333 feature.duration = m_endTime - feature.timestamp; | |
334 } | |
335 | |
336 int type = typeMap[s.type]; | |
310 | 337 |
311 vector<float> floatval; | 338 vector<float> floatval; |
312 floatval.push_back(s.type); | 339 floatval.push_back(type); |
313 feature.values = floatval; | 340 feature.values = floatval; |
314 | 341 |
315 ostringstream oss; | 342 ostringstream oss; |
316 oss << s.type; | 343 oss << char('A' + type - 1); |
317 feature.label = oss.str(); | 344 feature.label = oss.str(); |
318 | 345 |
319 returnFeatures[0].push_back(feature); | 346 returnFeatures[0].push_back(feature); |
320 } | 347 } |
321 | 348 |