diff options
| -rwxr-xr-x | rotord/rotor.cpp | 1 | ||||
| -rwxr-xr-x | rotord/rotor.h | 104 | ||||
| -rw-r--r-- | rotord/rotord.cbp | 2 |
3 files changed, 79 insertions, 28 deletions
diff --git a/rotord/rotor.cpp b/rotord/rotor.cpp index 209439b..33cd3f5 100755 --- a/rotord/rotor.cpp +++ b/rotord/rotor.cpp @@ -16,6 +16,7 @@ Node_factory::Node_factory(){ add_type("on_off",new On_off()); add_type("invert",new Invert()); add_type("video_cycler",new Video_cycler()); + add_type("luma_levels",new Luma_levels()); } bool Signal_input::connect(Signal_node* source) { diff --git a/rotord/rotor.h b/rotord/rotor.h index 5b92199..839ac32 100755 --- a/rotord/rotor.h +++ b/rotord/rotor.h @@ -111,6 +111,25 @@ namespace Rotor { AVPacket packet; }; + class Time_spec{ + public: + Time_spec(float _time,float _framerate){ time=_time; framerate=_framerate; }; + float time; + float framerate; + Time_spec lastframe() const{ + return Time_spec(time-(1.0f/framerate),framerate); + } + }; + class Frame_spec{ + public: + Frame_spec(float _time,float _framerate,int _w,int _h){ time=_time; framerate=_framerate; w=_w; h=_h;}; + float time; //this hould probably be implemented with a num/denom scheme eventually for accuracy + float framerate; + int h,w; + Frame_spec lastframe(){ + return Frame_spec(time-(1.0f/framerate),framerate,w,h); + } + }; class Image{ public: Image(){ @@ -170,25 +189,6 @@ namespace Rotor { int h,w; bool ownsRGBdata,ownsAdata,ownsZdata; //better done through auto_ptr? }; - class Time_spec{ - public: - Time_spec(float _time,float _framerate){ time=_time; framerate=_framerate; }; - float time; - float framerate; - Time_spec lastframe() const{ - return Time_spec(time-(1.0f/framerate),framerate); - } - }; - class Frame_spec{ - public: - Frame_spec(float _time,float _framerate,int _w,int _h){ time=_time; framerate=_framerate; w=_w; h=_h;}; - float time; //this hould probably be implemented with a num/denom scheme eventually for accuracy - float framerate; - int h,w; - Frame_spec lastframe(){ - return Frame_spec(time-(1.0f/framerate),framerate,w,h); - } - }; class Render_status{ public: int id; @@ -233,12 +233,14 @@ namespace Rotor { string type; string output_type; string ID; - string check(map<string,string> &settings,string key,string def=""){ if (settings.find(key)!=settings.end()) return settings[key]; else return def;}; + string find_setting(map<string,string> &settings,string key,string def=""){ if (settings.find(key)!=settings.end()) return settings[key]; else return def;}; + float find_setting(map<string,string> &settings,string key,float def){ if (settings.find(key)!=settings.end()) return ofToFloat(settings[key]); else return def;}; + int find_setting(map<string,string> &settings,string key,int def){ if (settings.find(key)!=settings.end()) return ofToInt(settings[key]); else return def;}; void base_settings(map<string,string> &settings) { - description=check(settings,"description"); - type=check(settings,"type"); - output_type=check(settings,"output"); - ID=check(settings,"ID"); + description=find_setting(settings,"description"); + type=find_setting(settings,"type"); + output_type=find_setting(settings,"output"); + ID=find_setting(settings,"ID"); } }; class Signal_node: public Node{ @@ -268,9 +270,9 @@ namespace Rotor { Audio_analysis(){}; Audio_analysis(map<string,string> &settings) { base_settings(settings); - soname=check(settings,"soname"); - id=check(settings,"id"); - outputNo=ofToInt(check(settings,"output","0")); + soname=find_setting(settings,"soname"); + id=find_setting(settings,"id"); + outputNo=ofToInt(find_setting(settings,"output","0")); }; Audio_analysis* clone(map<string,string> &_settings) { return new Audio_analysis(_settings);}; bool init(int _channels,int _bits,int _samples,int _rate); @@ -302,7 +304,7 @@ namespace Rotor { Signal_divide(){}; Signal_divide(map<string,string> &settings) { base_settings(settings); - divide_amount=ofToFloat(check(settings,"amount")); + divide_amount=ofToFloat(find_setting(settings,"amount")); }; Signal_divide* clone(map<string,string> &_settings) { return new Signal_divide(_settings);}; const float get_output(const Time_spec &time) { @@ -493,6 +495,52 @@ namespace Rotor { Video_cycler* clone(map<string,string> &_settings) { return new Video_cycler(_settings);}; private: }; + class Luma_levels: public Image_node { + //cycles through video inputs in order + public: + Luma_levels(){LUT=nullptr;}; + Luma_levels(map<string,string> &settings) { + base_settings(settings); + black_in=find_setting(settings,"black_in",0.0f); + white_in=find_setting(settings,"white_in",1.0f); + gamma=find_setting(settings,"gamma",1.0f); + black_out=find_setting(settings,"black_out",0.0f); + white_out=find_setting(settings,"white_out",1.0f); + LUT=nullptr; + image=new Image(); + generate_LUT(); + }; + ~Luma_levels(){if (LUT) {delete[] LUT;} if (image) {delete image;} }; + void generate_LUT(){ + if (LUT) delete[] LUT; + LUT=new unsigned char[256]; + float fltmax=(255.0f/256.0f); + for (int i=0;i<256;i++){ + LUT[i]=(unsigned char)(((pow(min(fltmax,max(0.0f,(((((float)i)/256.0f)-black_in)/(white_in-black_in)))),(1.0/gamma))*(white_out-black_out))+black_out)*256.0f); + } + } + bool load(const string &filename); + Image *get_output(const Frame_spec &frame){ + image->setup(frame.w,frame.h); + if (image_inputs.size()) { + if (image_inputs[0]->connection){ + if (LUT) { + Image *in= (((Image_node*)image_inputs[0]->connection)->get_output(frame)); + for (int i=0;i<frame.w*frame.h*3;i++){ + image->RGBdata[i]=LUT[in->RGBdata[i]]; + } + return image; + } + } + } + return nullptr; + } + Luma_levels* clone(map<string,string> &_settings) { return new Luma_levels(_settings);}; + private: + unsigned char *LUT; + Image *image; + float black_in,white_in,gamma,black_out,white_out; + }; //------------------------------------------------------------------- class Node_factory{ public: diff --git a/rotord/rotord.cbp b/rotord/rotord.cbp index 690d6b9..a0d52df 100644 --- a/rotord/rotord.cbp +++ b/rotord/rotord.cbp @@ -73,6 +73,8 @@ <Unit filename="tinyxml.h" /> <Unit filename="tinyxmlerror.cpp" /> <Unit filename="tinyxmlparser.cpp" /> + <Unit filename="utils.cpp" /> + <Unit filename="utils.h" /> <Unit filename="vampHost.cpp" /> <Unit filename="vampHost.h" /> <Unit filename="xmlIO.cpp" /> |
