diff options
| author | Tim Redfern <tim@herge.(none)> | 2013-06-26 13:40:44 +0100 |
|---|---|---|
| committer | Tim Redfern <tim@herge.(none)> | 2013-06-26 13:40:44 +0100 |
| commit | 3710ee5ea32841d3f62e52834aa2a55f026c6620 (patch) | |
| tree | 6ce6fa4b475a618533ca15cd78f2fbd2b274fc38 | |
| parent | 8c6a4c2fb16cafdfabf30c2b755810fd01d049d8 (diff) | |
mirror node
| -rwxr-xr-x | rotord/libavwrapper.cpp | 7 | ||||
| -rwxr-xr-x | rotord/rotor.cpp | 2 | ||||
| -rwxr-xr-x | rotord/rotor.h | 83 |
3 files changed, 67 insertions, 25 deletions
diff --git a/rotord/libavwrapper.cpp b/rotord/libavwrapper.cpp index 7f99668..0142e8f 100755 --- a/rotord/libavwrapper.cpp +++ b/rotord/libavwrapper.cpp @@ -355,7 +355,8 @@ bool libav::decoder::readNextFrameWithPacket(int targetFrameIndex, AVPacket& pac finished = 0; av_free_packet(&packet); int result; - if (!avtry(av_read_frame( container, &packet ), "Failed to read frame")) + //if (!avtry(av_read_frame( container, &packet ), "Failed to read frame")) + if (!avtry(av_read_packet( container, &packet ), "Failed to read packet")) return false; // !!NOTE: see docs on packet.convergence_duration for proper seeking if( packet.stream_index != videoStream ) /* Is it what we're trying to parse? */ continue; @@ -392,8 +393,8 @@ bool libav::decoder::readNextFrameWithPacket(int targetFrameIndex, AVPacket& pac if (packet.size == 0) // packet.size==0 usually means EOF break; } - //} while ( (!finished) || (pYuv->best_effort_timestamp < targetFrameIndex)); - } while (!finished); + } while ( (!finished) || (pYuv->best_effort_timestamp < targetFrameIndex)); + // } while (!finished); av_free_packet(&packet); diff --git a/rotord/rotor.cpp b/rotord/rotor.cpp index 1c0345d..fb68eed 100755 --- a/rotord/rotor.cpp +++ b/rotord/rotor.cpp @@ -27,7 +27,7 @@ Node_factory::Node_factory(){ add_type("image_arithmetic",new Image_arithmetic()); add_type("random",new Random()); add_type("blend",new Blend()); - //add_type("mirror",new Mirror()); + add_type("mirror",new Mirror()); } bool Signal_input::connect(Signal_node* source) { diff --git a/rotord/rotor.h b/rotord/rotor.h index da7e875..8720983 100755 --- a/rotord/rotor.h +++ b/rotord/rotor.h @@ -960,7 +960,7 @@ namespace Rotor { Image *output(const Frame_spec &frame){ if (image_inputs.size()) { if (image_inputs[0]->connection){ - if (image) delete image; + if (image) image->free(); Image *in=(((Image_node*)image_inputs[0]->connection)->get_output(frame)); switch (op) { case ARITHMETIC_plus: @@ -1006,7 +1006,7 @@ namespace Rotor { if (p->parameter=="white_out") p->receiver=&white_out; } }; - ~Luma_levels(){if (LUT) {delete[] LUT;} if (image) {delete image;} }; + ~Luma_levels(){if (LUT) {delete[] LUT;} if (image) delete image; }; void levels_settings(map<string,string> &settings){ black_in=find_setting(settings,"black_in",0.0f); white_in=find_setting(settings,"white_in",1.0f); @@ -1027,7 +1027,7 @@ namespace Rotor { void apply_LUT(const Image& in){ apply_LUT(in,*image); } - void apply_LUT(const Image& in,Image &out){ //facility to apply to other images for ingherited classes + void apply_LUT(const Image& in,Image &out){ //facility to apply to other images for inherited classes out.setup(in.w,in.h); for (int i=0;i<out.w*out.h*3;i++){ out.RGBdata[i]=LUT[in.RGBdata[i]]; @@ -1086,7 +1086,7 @@ namespace Rotor { number=find_setting(settings,"number",1); fadeto=find_setting(settings,"fadeto",1.0f); levels_settings(settings); - image=new Image(); + image=nullptr; lastframe=-1; mode=find_setting(settings,"mode",0.0f); } @@ -1104,7 +1104,8 @@ namespace Rotor { }; //~Echo_trails(){if (image) {delete image;} }; ~Echo_trails(){ - for (auto i:images) {delete i.second;} + if (image) delete image; + for (auto i:images) {if (image) delete i.second;} }; Image *output(const Frame_spec &frame){ //check if cache is valid @@ -1137,7 +1138,7 @@ namespace Rotor { if (image_inputs[0]->connection){ if (LUT) { //copy incoming image **writable - image->free(); + if (image) image->free(); image=(((Image_node*)image_inputs[0]->connection)->get_output(frame))->clone(); for (int i=1;i<number;i++){ //check echo frame isn't at negative time @@ -1194,7 +1195,7 @@ namespace Rotor { Blend(){}; Blend(map<string,string> &settings) { base_settings(settings); - image=new Image(); + image=nullptr; amount=find_setting(settings,"amount",1.0f); string _mode=find_setting(settings,"mode","screen"); if (_mode=="screen") mode=BLEND_screen; @@ -1206,7 +1207,7 @@ namespace Rotor { if (p->parameter=="amount") p->receiver=&amount; } }; - ~Blend(){ delete image;}; + ~Blend(){ if (image) delete image;}; Blend* clone(map<string,string> &_settings) { return new Blend(_settings);}; Image *output(const Frame_spec &frame){ if (image_inputs.size()) { @@ -1214,7 +1215,7 @@ namespace Rotor { if (image_inputs.size()>1) { if (image_inputs[1]->connection) { //copy incoming image **writable - image->free(); + if (image) image->free(); image=(((Image_node*)image_inputs[0]->connection)->get_output(frame))->clone(); switch(mode){ case BLEND_screen: @@ -1245,27 +1246,68 @@ namespace Rotor { float amount; //for blend }; #define MIRROR_horiz 1 - #define MIRROR_vert 1 - /* + #define MIRROR_vert 2 + #define MIRROR_horizR 3 + #define MIRROR_vertR 4 class Mirror: public Image_node { public: Mirror(){}; Mirror(map<string,string> &settings) { base_settings(settings); - image=new Image(); - amount=find_setting(settings,"amount",1.0f); - string _mode=find_setting(settings,"mode","screen"); - if (_mode=="horiz") mode=BLEND_screen; - if (_mode=="vert") mode=BLEND_multiply; + image=nullptr; + string _mode=find_setting(settings,"mode","horiz"); + if (_mode=="horiz") mode=MIRROR_horiz; + if (_mode=="vert") mode=MIRROR_vert; + if (_mode=="horizR") mode=MIRROR_horizR; + if (_mode=="vertR") mode=MIRROR_vertR; }; - ~Mirror(){ delete image;}; + ~Mirror(){ if (image) delete image;}; Mirror* clone(map<string,string> &_settings) { return new Mirror(_settings);}; Image *output(const Frame_spec &frame){ if (image_inputs.size()) { if (image_inputs[0]->connection){ - - //if there aren't 2 image inputs connected just return the first - return (((Image_node*)image_inputs[0]->connection)->get_output(frame)); + //copy incoming image **writable + if (image) image->free(); + image=(((Image_node*)image_inputs[0]->connection)->get_output(frame))->clone(); + switch (mode) { + case MIRROR_horiz: + for (int i=0;i<image->w/2;i++){ + for (int j=0;j<image->h;j++){ + for (int k=0;k<3;k++){ + image->RGBdata[(((j*image->w)+((image->w/2)+i))*3)+k]=image->RGBdata[(((j*image->w)+((image->w/2)-i))*3)+k]; + } + } + } + break; + case MIRROR_vert: + for (int i=0;i<image->w;i++){ + for (int j=0;j<image->h/2;j++){ + for (int k=0;k<3;k++){ + image->RGBdata[((((image->h/2+j)*image->w)+i)*3)+k]=image->RGBdata[((((image->h/2-j)*image->w)+i)*3)+k]; + } + } + } + break; + case MIRROR_horizR: + for (int i=0;i<image->w/2;i++){ + for (int j=0;j<image->h;j++){ + for (int k=0;k<3;k++){ + image->RGBdata[(((j*image->w)+((image->w/2)-i))*3)+k]=image->RGBdata[(((j*image->w)+((image->w/2)+i))*3)+k]; + } + } + } + break; + case MIRROR_vertR: + for (int i=0;i<image->w;i++){ + for (int j=0;j<image->h/2;j++){ + for (int k=0;k<3;k++){ + image->RGBdata[((((image->h/2-j)*image->w)+i)*3)+k]=image->RGBdata[((((image->h/2+j)*image->w)+i)*3)+k]; + } + } + } + break; + } + return image; } } return nullptr; @@ -1274,7 +1316,6 @@ namespace Rotor { Image *image; //is an image generator int mode; }; - */ //------------------------------------------------------------------- class Node_factory{ public: |
