annotate src/MatchFeatureFeeder.cpp @ 172:30d59e1e4232 structure

Minor tidy
author Chris Cannam
date Fri, 06 Feb 2015 18:09:18 +0000
parents bb4507f24dc9
children 8e7f96432570
rev   line source
cannam@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@0 2
cannam@0 3 /*
cannam@0 4 Vamp feature extraction plugin using the MATCH audio alignment
cannam@0 5 algorithm.
cannam@0 6
cannam@0 7 Centre for Digital Music, Queen Mary, University of London.
cannam@0 8 This file copyright 2007 Simon Dixon, Chris Cannam and QMUL.
cannam@0 9
cannam@0 10 This program is free software; you can redistribute it and/or
cannam@0 11 modify it under the terms of the GNU General Public License as
cannam@0 12 published by the Free Software Foundation; either version 2 of the
cannam@0 13 License, or (at your option) any later version. See the file
cannam@0 14 COPYING included with this distribution for more information.
cannam@0 15 */
cannam@0 16
Chris@24 17 #include "MatchFeatureFeeder.h"
cannam@0 18
Chris@14 19 using std::vector;
Chris@14 20
Chris@24 21 MatchFeatureFeeder::MatchFeatureFeeder(Matcher *m1, Matcher *m2) :
Chris@167 22 m_pm1(m1),
Chris@167 23 m_pm2(m2),
Chris@167 24 m_finder(m_pm1)
cannam@0 25 {
cannam@0 26 }
cannam@0 27
Chris@24 28 MatchFeatureFeeder::~MatchFeatureFeeder()
cannam@0 29 {
cannam@0 30 }
cannam@0 31
Chris@154 32 void
Chris@24 33 MatchFeatureFeeder::feed(vector<double> f1, vector<double> f2)
cannam@0 34 {
Chris@49 35 // We maintain two FIFO queues of feature vectors, one per input
Chris@49 36 // stream. When the match-feeder function is entered, it knows
Chris@49 37 // that it has at least one feature in each queue. It loops,
Chris@49 38 // processing up to one feature per matcher, until a queue is
Chris@49 39 // empty. Then it returns, to be called again with more data.
Chris@49 40
Chris@60 41 if (!f1.empty()) {
Chris@74 42 m_q1.push(f1);
Chris@60 43 }
Chris@60 44
Chris@60 45 if (!f2.empty()) {
Chris@74 46 m_q2.push(f2);
Chris@60 47 }
Chris@14 48
Chris@74 49 while (!m_q1.empty() && !m_q2.empty()) {
Chris@63 50 feedBlock();
Chris@63 51 }
Chris@63 52 }
Chris@63 53
Chris@167 54 int
Chris@167 55 MatchFeatureFeeder::getEstimatedReferenceFrame()
Chris@167 56 {
Chris@167 57 if (m_pm1->getFrameCount() == 0 || m_pm2->getFrameCount() == 0) {
Chris@167 58 return 0;
Chris@167 59 }
Chris@167 60 int bestRow = 0;
Chris@167 61 double bestCost = 0;
Chris@167 62 if (!m_finder.getBestColCost(m_pm2->getFrameCount()-1, bestRow, bestCost)) {
Chris@167 63 return -1;
Chris@167 64 } else {
Chris@167 65 return bestRow;
Chris@167 66 }
Chris@167 67 }
Chris@167 68
Chris@63 69 void
Chris@63 70 MatchFeatureFeeder::finish()
Chris@63 71 {
Chris@74 72 while (!m_q1.empty() || !m_q2.empty()) {
Chris@24 73 feedBlock();
Chris@14 74 }
Chris@14 75 }
Chris@14 76
Chris@24 77 void
Chris@24 78 MatchFeatureFeeder::feedBlock()
Chris@14 79 {
Chris@74 80 if (m_q1.empty()) { // ended
Chris@60 81 feed2();
Chris@74 82 } else if (m_q2.empty()) { // ended
Chris@60 83 feed1();
Chris@171 84 } else if (m_pm1->isFillingInitialBlock()) {
Chris@24 85 feed1();
Chris@24 86 feed2();
Chris@78 87 } else if (m_pm1->isOverrunning()) { // slope constraints
Chris@24 88 feed2();
Chris@78 89 } else if (m_pm2->isOverrunning()) {
Chris@24 90 feed1();
cannam@0 91 } else {
Chris@171 92 switch (m_finder.getExpandDirection()) {
Chris@45 93 case Matcher::AdvanceThis:
Chris@24 94 feed1();
cannam@0 95 break;
Chris@45 96 case Matcher::AdvanceOther:
Chris@24 97 feed2();
cannam@0 98 break;
Chris@45 99 case Matcher::AdvanceBoth:
Chris@24 100 feed1();
Chris@24 101 feed2();
cannam@0 102 break;
Chris@45 103 case Matcher::AdvanceNone:
Chris@74 104 cerr << "m_finder says AdvanceNone!" << endl;
Chris@45 105 break;
cannam@0 106 }
cannam@0 107 }
Chris@135 108
Chris@135 109 m_fpx.push_back(m_pm2->getFrameCount());
Chris@135 110 m_fpy.push_back(m_pm1->getFrameCount());
cannam@0 111 }
cannam@0 112
Chris@24 113 void
Chris@24 114 MatchFeatureFeeder::feed1()
cannam@0 115 {
Chris@74 116 m_pm1->consumeFeatureVector(m_q1.front());
Chris@74 117 m_q1.pop();
cannam@0 118 }
cannam@0 119
Chris@24 120 void
Chris@24 121 MatchFeatureFeeder::feed2()
cannam@0 122 {
Chris@74 123 m_pm2->consumeFeatureVector(m_q2.front());
Chris@74 124 m_q2.pop();
cannam@0 125 }
cannam@0 126