summaryrefslogtreecommitdiff
path: root/rotord
diff options
context:
space:
mode:
authorTim Redfern <tim@herge.(none)>2013-05-08 16:12:10 +0100
committerTim Redfern <tim@herge.(none)>2013-05-08 16:12:10 +0100
commitba982775255912035f4b84ae63e1f38bdbb611f4 (patch)
treeb481bc0702948b146bb2b91841c7065744733689 /rotord
parent39b71890f5f17c0c5d2c6730a068c2b8e77afd28 (diff)
luma node
Diffstat (limited to 'rotord')
-rwxr-xr-xrotord/rotor.cpp1
-rwxr-xr-xrotord/rotor.h104
-rw-r--r--rotord/rotord.cbp2
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" />