Mercurial > hg > sonic-annotator
comparison runner/FeatureExtractionManager.cpp @ 110:ca565b18ba3e multiplex
Merge from default branch
| author | Chris Cannam |
|---|---|
| date | Thu, 02 Oct 2014 14:54:48 +0100 |
| parents | 7b60603966cf 78a7c77ba432 |
| children | 0c2d8c945bbf |
comparison
equal
deleted
inserted
replaced
| 107:7b60603966cf | 110:ca565b18ba3e |
|---|---|
| 347 } | 347 } |
| 348 | 348 |
| 349 } else { | 349 } else { |
| 350 | 350 |
| 351 plugin = m_transformPluginMap[transform]; | 351 plugin = m_transformPluginMap[transform]; |
| 352 } | |
| 353 | |
| 354 if (m_plugins.find(plugin) == m_plugins.end()) { | |
| 355 m_orderedPlugins.push_back(plugin); | |
| 352 } | 356 } |
| 353 | 357 |
| 354 m_plugins[plugin][transform] = writers; | 358 m_plugins[plugin][transform] = writers; |
| 355 | 359 |
| 356 return true; | 360 return true; |
| 657 | 661 |
| 658 int earliestStartFrame = 0; | 662 int earliestStartFrame = 0; |
| 659 int latestEndFrame = frameCount; | 663 int latestEndFrame = frameCount; |
| 660 bool haveExtents = false; | 664 bool haveExtents = false; |
| 661 | 665 |
| 662 for (PluginMap::iterator pi = m_plugins.begin(); | 666 foreach (Plugin *plugin, m_orderedPlugins) { |
| 663 pi != m_plugins.end(); ++pi) { | 667 |
| 664 | 668 PluginMap::iterator pi = m_plugins.find(plugin); |
| 665 Plugin *plugin = pi->first; | 669 |
| 666 | 670 std::cerr << "Calling reset on " << plugin << std::endl; |
| 667 // std::cerr << "Calling reset on " << plugin << std::endl; | |
| 668 plugin->reset(); | 671 plugin->reset(); |
| 669 | 672 |
| 670 for (TransformWriterMap::iterator ti = pi->second.begin(); | 673 for (TransformWriterMap::iterator ti = pi->second.begin(); |
| 671 ti != pi->second.end(); ++ti) { | 674 ti != pi->second.end(); ++ti) { |
| 672 | 675 |
| 684 earliestStartFrame = startFrame; | 687 earliestStartFrame = startFrame; |
| 685 } | 688 } |
| 686 if (!haveExtents || startFrame + duration > latestEndFrame) { | 689 if (!haveExtents || startFrame + duration > latestEndFrame) { |
| 687 latestEndFrame = startFrame + duration; | 690 latestEndFrame = startFrame + duration; |
| 688 } | 691 } |
| 692 | |
| 693 cerr << "startFrame for transform " << startFrame << endl; | |
| 694 cerr << "duration for transform " << duration << endl; | |
| 695 cerr << "earliestStartFrame becomes " << earliestStartFrame << endl; | |
| 696 cerr << "latestEndFrame becomes " << latestEndFrame << endl; | |
| 689 | 697 |
| 690 haveExtents = true; | 698 haveExtents = true; |
| 691 | 699 |
| 692 string outputId = transform.getOutput().toStdString(); | 700 string outputId = transform.getOutput().toStdString(); |
| 693 if (m_pluginOutputs[plugin].find(outputId) == | 701 if (m_pluginOutputs[plugin].find(outputId) == |
| 716 } | 724 } |
| 717 | 725 |
| 718 int startFrame = earliestStartFrame; | 726 int startFrame = earliestStartFrame; |
| 719 int endFrame = latestEndFrame; | 727 int endFrame = latestEndFrame; |
| 720 | 728 |
| 721 for (PluginMap::iterator pi = m_plugins.begin(); | 729 foreach (Plugin *plugin, m_orderedPlugins) { |
| 722 pi != m_plugins.end(); ++pi) { | 730 |
| 731 PluginMap::iterator pi = m_plugins.find(plugin); | |
| 723 | 732 |
| 724 for (TransformWriterMap::const_iterator ti = pi->second.begin(); | 733 for (TransformWriterMap::const_iterator ti = pi->second.begin(); |
| 725 ti != pi->second.end(); ++ti) { | 734 ti != pi->second.end(); ++ti) { |
| 726 | 735 |
| 727 const vector<FeatureWriter *> &writers = ti->second; | 736 const vector<FeatureWriter *> &writers = ti->second; |
| 789 } | 798 } |
| 790 | 799 |
| 791 Vamp::RealTime timestamp = Vamp::RealTime::frame2RealTime | 800 Vamp::RealTime timestamp = Vamp::RealTime::frame2RealTime |
| 792 (i, m_sampleRate); | 801 (i, m_sampleRate); |
| 793 | 802 |
| 794 for (PluginMap::iterator pi = m_plugins.begin(); | 803 foreach (Plugin *plugin, m_orderedPlugins) { |
| 795 pi != m_plugins.end(); ++pi) { | 804 |
| 796 | 805 PluginMap::iterator pi = m_plugins.find(plugin); |
| 797 Plugin *plugin = pi->first; | |
| 798 Plugin::FeatureSet featureSet = plugin->process(data, timestamp); | 806 Plugin::FeatureSet featureSet = plugin->process(data, timestamp); |
| 799 | 807 |
| 800 if (!m_summariesOnly) { | 808 if (!m_summariesOnly) { |
| 801 writeFeatures(audioSource, plugin, featureSet); | 809 writeFeatures(audioSource, plugin, featureSet); |
| 802 } | 810 } |
| 809 | 817 |
| 810 // std::cerr << "FeatureExtractionManager: deleting audio file reader" << std::endl; | 818 // std::cerr << "FeatureExtractionManager: deleting audio file reader" << std::endl; |
| 811 | 819 |
| 812 lifemgr.destroy(); // deletes reader, data | 820 lifemgr.destroy(); // deletes reader, data |
| 813 | 821 |
| 814 // In order to ensure our results are written to the output in a | 822 foreach (Plugin *plugin, m_orderedPlugins) { |
| 815 // fixed order (and not one that depends on the pointer value of | 823 |
| 816 // each plugin on the heap in any given run of the program) we | 824 PluginMap::iterator pi = m_plugins.find(plugin); |
| 817 // take the plugins' entries from the plugin map and sort them | |
| 818 // into a new, temporary map that is indexed by the first | |
| 819 // transform for each plugin. We then iterate over than instead of | |
| 820 // over m_plugins in order to get the right ordering. | |
| 821 | |
| 822 // This is not the most elegant way to do this -- it would be more | |
| 823 // elegant to impose an ordering directly on the plugins that are | |
| 824 // used as keys to m_plugins. But the plugin type comes from the | |
| 825 // Vamp SDK, so this change is more localised. | |
| 826 | |
| 827 // Thanks to Matthias for this. | |
| 828 | |
| 829 typedef map<Transform, PluginMap::value_type> OrderedPluginMap; | |
| 830 OrderedPluginMap orderedPlugins; | |
| 831 | |
| 832 for (PluginMap::iterator pi = m_plugins.begin(); | |
| 833 pi != m_plugins.end(); ++pi) { | |
| 834 Transform firstForPlugin = (pi->second).begin()->first; | |
| 835 orderedPlugins.insert(OrderedPluginMap::value_type(firstForPlugin, *pi)); | |
| 836 } | |
| 837 | |
| 838 for (OrderedPluginMap::iterator superPi = orderedPlugins.begin(); | |
| 839 superPi != orderedPlugins.end(); ++superPi) { | |
| 840 | |
| 841 // The value we extract from this map is just the same as the | |
| 842 // value_type we get from iterating over our PluginMap | |
| 843 // directly -- but we happen to get them in the right order | |
| 844 // now because the map iterator is ordered by the Transform | |
| 845 // key type ordering | |
| 846 PluginMap::value_type pi = superPi->second; | |
| 847 | |
| 848 Plugin *plugin = pi.first; | |
| 849 Plugin::FeatureSet featureSet = plugin->getRemainingFeatures(); | 825 Plugin::FeatureSet featureSet = plugin->getRemainingFeatures(); |
| 850 | 826 |
| 851 if (!m_summariesOnly) { | 827 if (!m_summariesOnly) { |
| 852 writeFeatures(audioSource, plugin, featureSet); | 828 writeFeatures(audioSource, plugin, featureSet); |
| 853 } | 829 } |
| 986 } | 962 } |
| 987 } | 963 } |
| 988 | 964 |
| 989 void FeatureExtractionManager::finish() | 965 void FeatureExtractionManager::finish() |
| 990 { | 966 { |
| 991 for (PluginMap::iterator pi = m_plugins.begin(); | 967 foreach (Plugin *plugin, m_orderedPlugins) { |
| 992 pi != m_plugins.end(); ++pi) { | 968 |
| 969 PluginMap::iterator pi = m_plugins.find(plugin); | |
| 993 | 970 |
| 994 for (TransformWriterMap::iterator ti = pi->second.begin(); | 971 for (TransformWriterMap::iterator ti = pi->second.begin(); |
| 995 ti != pi->second.end(); ++ti) { | 972 ti != pi->second.end(); ++ti) { |
| 996 | 973 |
| 997 vector<FeatureWriter *> &writers = ti->second; | 974 vector<FeatureWriter *> &writers = ti->second; |
