annotate runner/FeatureExtractionManager.h @ 269:39fb206b1153 piper-nopiper

Filter out Xing/LAME info frames, rather than letting them go to the mp3 decoder as if they were audio frames. Fixes the 1152-sample zero pad at start of some decoded mp3 files (distinct from decoder delay). The logic here is based on the madplay code.
author Chris Cannam
date Thu, 24 Nov 2016 13:32:04 +0000
parents 68dc2d99a5b1
children 0e866ef12d87
rev   line source
Chris@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@0 4 Sonic Annotator
Chris@0 5 A utility for batch feature extraction from audio files.
Chris@0 6 Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London.
Chris@0 7 Copyright 2007-2008 QMUL.
Chris@0 8
Chris@0 9 This program is free software; you can redistribute it and/or
Chris@0 10 modify it under the terms of the GNU General Public License as
Chris@0 11 published by the Free Software Foundation; either version 2 of the
Chris@0 12 License, or (at your option) any later version. See the file
Chris@0 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@0 16 #ifndef _FEATURE_EXTRACTION_MANAGER_H_
Chris@0 17 #define _FEATURE_EXTRACTION_MANAGER_H_
Chris@0 18
Chris@0 19 #include <vector>
Chris@0 20 #include <set>
Chris@0 21 #include <string>
Chris@0 22
Chris@45 23 #include <QMap>
Chris@45 24
Chris@0 25 #include <vamp-hostsdk/Plugin.h>
Chris@0 26 #include <vamp-hostsdk/PluginSummarisingAdapter.h>
Chris@0 27 #include <transform/Transform.h>
Chris@0 28
Chris@0 29 using std::vector;
Chris@0 30 using std::set;
Chris@0 31 using std::string;
Chris@0 32 using std::pair;
Chris@0 33 using std::map;
Chris@0 34
Chris@0 35 class FeatureWriter;
Chris@45 36 class AudioFileReader;
Chris@0 37
Chris@0 38 class FeatureExtractionManager
Chris@0 39 {
Chris@0 40 public:
Chris@263 41 FeatureExtractionManager(bool verbose);
Chris@0 42 virtual ~FeatureExtractionManager();
Chris@0 43
Chris@0 44 void setChannels(int channels);
Chris@0 45 void setDefaultSampleRate(int sampleRate);
Chris@116 46 void setNormalise(bool normalise);
Chris@0 47
Chris@0 48 bool setSummaryTypes(const set<string> &summaryTypes,
Chris@0 49 const Vamp::HostExt::PluginSummarisingAdapter::SegmentBoundaries &boundaries);
Chris@0 50
Chris@102 51 void setSummariesOnly(bool summariesOnly);
Chris@102 52
Chris@0 53 bool addFeatureExtractor(Transform transform,
Chris@0 54 const vector<FeatureWriter*> &writers);
Chris@0 55
Chris@0 56 bool addFeatureExtractorFromFile(QString transformXmlFile,
Chris@0 57 const vector<FeatureWriter*> &writers);
Chris@0 58
Chris@0 59 bool addDefaultFeatureExtractor(TransformId transformId,
Chris@0 60 const vector<FeatureWriter*> &writers);
Chris@0 61
Chris@47 62 // Make a note of an audio or playlist file which will be passed
Chris@47 63 // to extractFeatures later. Amongst other things, this may
Chris@47 64 // initialise the default sample rate and channel count
Chris@106 65 void addSource(QString audioSource, bool willMultiplex);
Chris@47 66
Chris@47 67 // Extract features from the given audio or playlist file. If the
Chris@47 68 // file is a playlist and force is true, continue extracting even
Chris@47 69 // if a file in the playlist fails.
Chris@112 70 void extractFeatures(QString audioSource);
Chris@0 71
Chris@106 72 // Extract features from the given audio files, multiplexing into
Chris@106 73 // a single "file" whose individual channels are mixdowns of the
Chris@106 74 // supplied sources.
Chris@106 75 void extractFeaturesMultiplexed(QStringList sources);
Chris@106 76
Chris@0 77 private:
Chris@263 78 bool m_verbose;
Chris@263 79
Chris@0 80 // A plugin may have many outputs, so we can have more than one
Chris@0 81 // transform requested for a single plugin. The things we want to
Chris@0 82 // run in our process loop are plugins rather than their outputs,
Chris@0 83 // so we maintain a map from the plugins to the transforms desired
Chris@0 84 // of them and then iterate through this map
Chris@0 85
Chris@0 86 typedef map<Transform, vector<FeatureWriter *> > TransformWriterMap;
Chris@0 87 typedef map<Vamp::Plugin *, TransformWriterMap> PluginMap;
Chris@0 88 PluginMap m_plugins;
Chris@108 89
Chris@109 90 // When we run plugins, we want to run them in a known order so as
Chris@109 91 // to get the same results on each run of Sonic Annotator with the
Chris@109 92 // same transforms. But if we just iterate through our PluginMap,
Chris@109 93 // we get them in an arbitrary order based on pointer
Chris@109 94 // address. This vector provides an underlying order for us. Note
Chris@109 95 // that the TransformWriterMap is consistently ordered (because
Chris@109 96 // the key is a Transform which has a proper ordering) so using
Chris@109 97 // this gives us a consistent order across the whole PluginMap
Chris@109 98 vector<Vamp::Plugin *> m_orderedPlugins;
Chris@109 99
Chris@0 100 // And a map back from transforms to their plugins. Note that
Chris@0 101 // this is keyed by transform, not transform ID -- two differently
Chris@0 102 // configured transforms with the same ID must use different
Chris@0 103 // plugin instances.
Chris@0 104
Chris@0 105 typedef map<Transform, Vamp::Plugin *> TransformPluginMap;
Chris@0 106 TransformPluginMap m_transformPluginMap;
Chris@0 107
Chris@0 108 // Cache the plugin output descriptors, mapping from plugin to a
Chris@0 109 // map from output ID to output descriptor.
Chris@0 110 typedef map<string, Vamp::Plugin::OutputDescriptor> OutputMap;
Chris@0 111 typedef map<Vamp::Plugin *, OutputMap> PluginOutputMap;
Chris@0 112 PluginOutputMap m_pluginOutputs;
Chris@0 113
Chris@0 114 // Map from plugin output identifier to plugin output index
Chris@0 115 typedef map<string, int> OutputIndexMap;
Chris@0 116 OutputIndexMap m_pluginOutputIndices;
Chris@0 117
Chris@0 118 typedef set<std::string> SummaryNameSet;
Chris@233 119 SummaryNameSet m_summaries; // requested on command line for all transforms
Chris@233 120 bool m_summariesOnly; // command line flag
Chris@0 121 Vamp::HostExt::PluginSummarisingAdapter::SegmentBoundaries m_boundaries;
Chris@0 122
Chris@106 123 AudioFileReader *prepareReader(QString audioSource);
Chris@106 124
Chris@106 125 void extractFeaturesFor(AudioFileReader *reader, QString audioSource);
Chris@106 126
Chris@0 127 void writeSummaries(QString audioSource, Vamp::Plugin *);
Chris@0 128
Chris@0 129 void writeFeatures(QString audioSource,
Chris@0 130 Vamp::Plugin *,
Chris@0 131 const Vamp::Plugin::FeatureSet &,
Chris@0 132 Transform::SummaryType summaryType =
Chris@0 133 Transform::NoSummary);
Chris@31 134
Chris@31 135 void testOutputFiles(QString audioSource);
Chris@0 136 void finish();
Chris@0 137
Chris@0 138 int m_blockSize;
Chris@0 139 int m_defaultSampleRate;
Chris@0 140 int m_sampleRate;
Chris@0 141 int m_channels;
Chris@116 142 bool m_normalise;
Chris@45 143
Chris@45 144 QMap<QString, AudioFileReader *> m_readyReaders;
Chris@0 145
Chris@0 146 void print(Transform transform) const;
Chris@0 147 };
Chris@0 148
Chris@0 149 #endif