diff options
Diffstat (limited to 'rotord/rotor.h')
| -rwxr-xr-x | rotord/rotor.h | 85 |
1 files changed, 63 insertions, 22 deletions
diff --git a/rotord/rotor.h b/rotord/rotor.h index 441be2f..ea4d758 100755 --- a/rotord/rotor.h +++ b/rotord/rotor.h @@ -62,6 +62,7 @@ extern "C" { #include "libavaudioloader.h" #include "libavexporter.h" #include "gstvideoloader.h" +#include "utils.h" //fequal namespace Rotor { #define IDLE 0 @@ -76,19 +77,7 @@ namespace Rotor { #define PREVIEW 2 #define RENDER 3 -#ifndef FEQUAL -//float equality -bool fequal(const float u,const float v){ - if (abs(u-v)<.001) return true; - else return false; -}; -bool flessorequal(const float u,const float v){ - //v is less or equal to u - if (u-v>-.001) return true; - else return false; -}; -#define FEQUAL -#endif + //forward declaration class Node; @@ -344,6 +333,21 @@ bool flessorequal(const float u,const float v){ return 0.0f; } }; + class On_off: public Signal_node { + public: + On_off(){}; + On_off(map<string,string> &settings) { + base_settings(settings); + }; + On_off* clone(map<string,string> &_settings) { return new On_off(_settings);}; + const float get_output(const Time_spec &time) { + if (inputs[0]->connection) { + float s1=(((Signal_node*)(inputs[0]->connection))->get_output(time)); + if ((int)s1%2) return 1.0f; + } + return 0.0f; + } + }; class Signal_output: public Signal_node { public: Signal_output(){}; @@ -400,12 +404,22 @@ bool flessorequal(const float u,const float v){ Invert* clone(map<string,string> &_settings) { return new Invert(_settings);}; Image *get_output(const Frame_spec &frame){ if (inputs.size()) { - if (inputs[0]->connection) { - Time_spec requested=Time_spec(frame.time,frame.framerate); - if (fequal((((Signal_node*)inputs[0]->connection)->get_output(requested)),1.0f)) { - //invert=!invert; - } - } + if (image_inputs[0]->connection){ + if (inputs[0]->connection) { + Time_spec requested=Time_spec(frame.time,frame.framerate); + if (fmoreorequal(1.0f,(((Signal_node*)inputs[0]->connection)->get_output(requested)))) { + Image *in=(((Image_node*)image_inputs[0]->connection)->get_output(frame)); + image->setup(frame.w,frame.h); + for (int i=0;i<in->w*in->h*3;i++) { + image->RGBdata[i]=255-in->RGBdata[i]; + } + return image; + + } + } + return (((Image_node*)image_inputs[0]->connection)->get_output(frame)); + } + return nullptr; } if (image_inputs[0]->connection) { @@ -431,7 +445,7 @@ bool flessorequal(const float u,const float v){ else return nullptr; }; Video_output* clone(map<string,string> &_settings) { return new Video_output(_settings);}; - bool render(const float duration, const float framerate,const string &output_filename,const string &audio_filename); + bool render(const float duration, const float framerate,const string &output_filename,const string &audio_filename,float& progress); private: //ofxMovieExporter *exporter; @@ -454,6 +468,31 @@ bool flessorequal(const float u,const float v){ ofGstVideoPlayer *player; Image *image; }; + class Video_cycler: public Image_node { + //cycles through video inputs in order + public: + Video_cycler(){}; + Video_cycler(map<string,string> &settings) { + base_settings(settings); + }; + ~Video_cycler(){}; + bool load(const string &filename); + Image *get_output(const Frame_spec &frame){ + int which_input=0; + Time_spec requested=Time_spec(frame.time,frame.framerate); + if (inputs[0]->connection) { + which_input=((int)((Signal_node*)inputs[0]->connection)->get_output(requested))%image_inputs.size(); + } + if (image_inputs.size()) { + if (image_inputs[which_input]->connection){ + return (((Image_node*)image_inputs[which_input]->connection)->get_output(frame)); + } + } + return nullptr; + } + Video_cycler* clone(map<string,string> &_settings) { return new Video_cycler(_settings);}; + private: + }; //------------------------------------------------------------------- class Node_factory{ public: @@ -484,7 +523,7 @@ bool flessorequal(const float u,const float v){ vector<Node*> find_nodes(const string &type); Node* find_node(const string &type); bool signal_render(string &signal_xml,const float framerate); - bool video_render(const string &output_filename,const string &audio_filename,const float framerate); + bool video_render(const string &output_filename,const string &audio_filename,const float framerate,float& progress); int load(Poco::UUID uid); bool load(string &graph_filename); UUID save(); //save to DB, returns UUID of saved graph @@ -526,6 +565,7 @@ bool flessorequal(const float u,const float v){ audio_thumb=new Audio_thumbnailer(); state=IDLE; output_framerate=25.0f; + audio_loaded=false; }; void runTask(); void add_queue(int item); @@ -538,7 +578,7 @@ bool flessorequal(const float u,const float v){ bool load_video(const string &nodeID,const string &filename);//can be performance or clip private: int state; - double progress; //for a locking process: audio analysis or rendering + float progress; //for a locking process: audio analysis or rendering //thread only does one thing at once std::deque<int> work_queue; Poco::Mutex mutex; //lock for access from parent thread @@ -550,6 +590,7 @@ bool flessorequal(const float u,const float v){ Graph graph; Node_factory factory; float output_framerate; + bool audio_loaded; }; } |
