diff options
Diffstat (limited to 'rotord')
| -rw-r--r-- | rotord/src/libavwrapper.cpp | 7 | ||||
| -rw-r--r-- | rotord/src/nodes_audio_analysis.cpp | 105 | ||||
| -rw-r--r-- | rotord/src/nodes_channels.h | 2 |
3 files changed, 111 insertions, 3 deletions
diff --git a/rotord/src/libavwrapper.cpp b/rotord/src/libavwrapper.cpp index d48cbc3..a6cb56d 100644 --- a/rotord/src/libavwrapper.cpp +++ b/rotord/src/libavwrapper.cpp @@ -65,9 +65,12 @@ bool libav::video_decoder::open(const std::string& filename){ } } if (makeindex) { - cerr<<"FFMS2: creating index "<<idxfile<<endl; index = FFMS_MakeIndex(filename.c_str(), 0, 0, NULL, NULL, FFMS_IEH_IGNORE, NULL, NULL, &err); - FFMS_WriteIndex(idxfile.c_str(),index,&err); + if (index) { + FFMS_WriteIndex(idxfile.c_str(),index,&err); + cerr<<"FFMS2: created index "<<idxfile<<endl; + } + cerr<<"FFMS2: "<<filename<<" cannot be indexed "<<endl; } if (index == NULL) { std::cerr<<"ffmpegsource: "<<err.Buffer<<std::endl; diff --git a/rotord/src/nodes_audio_analysis.cpp b/rotord/src/nodes_audio_analysis.cpp index 2a39d8c..c6a19c9 100644 --- a/rotord/src/nodes_audio_analysis.cpp +++ b/rotord/src/nodes_audio_analysis.cpp @@ -253,6 +253,111 @@ namespace Rotor{ features[times[totals[i].first]]=f; } +<<<<<<< HEAD +======= + /* +sort intensity totals +find out how many segments will share levels apart from similarity levels +start with a structure: +map<inputnum,vector<pair<tempo,inputnum>> +start grouping by similarity +if there are more similarity groups than wantedgroups, start by grouping similarities +otherwise take biggest similarity groups and split them by intensity +if there are still too many groups, merge closest smallest groups +finally sort by intensity to map output + +nned to retrieve total intensity by segment + */ + // segment group_intensity seg_intense segment + vector<pair<double,vector<pair<double,int> > > > seggrps; + for (i=0;i<totalsmap.size();i++){ + vector<pair<double,int> > data; + data.push_back(make_pair(totalsmap[i],i)); + seggrps.push_back(make_pair(totalsmap[i],data)); + } + for (auto s:similarities){ + if (s.second.size()>1){ + for (int j=s.second.size()-1;j>0;j--){ + seggrps[s.second[0]].second.push_back(make_pair(totalsmap[s.second[j]],s.second[j])); + //keep running average// should be by area? + //seggrps[s.second[0]].first+=(totalsmap[s.second[j]]*(1.0/max(1,(int)seggrps[s.second[0]].second.size()-1))); + //double div=seggrps[s.second[0]].second.size()==1?1.0:((double)seggrps[s.second[0]].second.size()-1/(double)seggrps[s.second[0]].second.size()); + //neat! this gives 1,1/2,2/3,3/4.. + //seggrps[s.second[0]].first*=div; + + //easier is to + double avg=0.0f; + for (auto p:seggrps[s.second[0]].second) avg+=p.first; + avg/=seggrps[s.second[0]].second.size(); + seggrps[s.second[0]].first=avg; + + seggrps.erase(seggrps.begin()+s.second[j]); + } + } + } + cerr<<"similarities assigned, "<<(totalsmap.size()-seggrps.size())<<" segments merged"<<endl; + //sort the contents by intensity + std::sort(seggrps.begin(),seggrps.end(),sortseggrps); + //possible mergers will be with groups with adjacent intensity + if (((int)parameters["levels"]->value)>0) { + while (seggrps.size()>(int)parameters["levels"]->value){ + //reduce similarity groups + //decide the best 2 to merge + vector<double> diffs; + for (int j=0;j<seggrps.size()-1;j++) diffs.push_back(seggrps[j+1].first-seggrps[j].first); + int smallest=0; + for (int j=1;j<diffs.size();j++) if (diffs[j]<diffs[smallest]) smallest=j; + for (int j=0;j<seggrps[smallest].second.size();j++) { + seggrps[smallest+1].second.push_back(seggrps[smallest].second[j]); + } + //recalculate intensity average + double avg=0.0f; + for (auto p:seggrps[smallest+1].second) avg+=p.first; + avg/=seggrps[smallest+1].second.size(); + seggrps[smallest+1].first=avg; + + seggrps.erase(seggrps.begin()+smallest); + } + cerr<<"intensities merged, "<<seggrps.size()<<" levels remain"<<endl; + while (seggrps.size()<min((int)parameters["levels"]->value,(int)totalsmap.size())) { + //split groups + //calculate standard deviation of intensity variation + vector<double> devs; + for (int j=0;j<seggrps.size()-1;j++) { + double avg=0.0; + double dev=0.0; + for (int k=0;k<seggrps[j].second.size();k++){ + avg+=k<seggrps[j].second[k].first; + } + avg/=seggrps[j].second.size(); + for (int k=0;k<seggrps[j].second.size();k++){ + dev+=pow(avg-k<seggrps[j].second[k].first,2.0); + } + dev/=seggrps[j].second.size(); + devs.push_back(pow(dev,0.5)); + } + //find group with largest standard deviation + int largest=0; + for (int j=1;j<devs.size();j++) if (devs[j]>devs[largest]) largest=j; + //sanity check: if there are any groups that can be split they will have larger SD than singleton groups + //TODO actually split group + } + } + + map<int,int> outputvalues; + for (int j=0;j<seggrps.size();j++){ + for (int k=0;k<seggrps[j].second.size();k++){ + outputvalues[seggrps[j].second[k].second]=j; + } + } + + + for (i=0;i<totals.size();i++){ + vampHost::feature f; + f.values.push_back(outputvalues[i]); + features[times[totals[i].first]]=f; + } +>>>>>>> intensitysimilarity } } diff --git a/rotord/src/nodes_channels.h b/rotord/src/nodes_channels.h index 4782e00..3b3fa70 100644 --- a/rotord/src/nodes_channels.h +++ b/rotord/src/nodes_channels.h @@ -419,7 +419,7 @@ namespace Rotor { Echo_trails(){ //calls base class constructor first create_parameter("number","number","number of echoes","Number echoes",25.0); - create_parameter("fadeto","number","amount that echoes fade out","Fadout amount",1.0,0.0,1.0); + create_parameter("fadeto","number","amount that echoes fade out to","Fadeout amount",1.0,0.0,1.0); create_parameter("interval","number","number of frames between echoes","",1.0,0.0,1.0); create_attribute("mode","blend mode for echoes","Blend mode","screen",{"screen","wrap","min","max"}); title="Echo trails"; |
