summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xrotord/libavwrapper.cpp7
-rwxr-xr-xrotord/rotor.cpp2
-rwxr-xr-xrotord/rotor.h83
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: