summaryrefslogtreecommitdiff
path: root/rotord/src
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/src')
-rw-r--r--rotord/src/libavwrapper.cpp7
-rw-r--r--rotord/src/nodes_audio_analysis.cpp105
-rw-r--r--rotord/src/nodes_channels.h2
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";