summaryrefslogtreecommitdiff
path: root/rotord/rotor.h
diff options
context:
space:
mode:
authorTim Redfern <tim@herge.(none)>2013-05-03 18:25:26 +0100
committerTim Redfern <tim@herge.(none)>2013-05-03 18:25:26 +0100
commitff59340614ec150e4bd84d3554081e666970aef2 (patch)
treeb32689f18b0457580ecf1c7934edd69142a9e005 /rotord/rotor.h
parent4aa8f7c20c5e8bbe1ed9b007a1193ced8b019f4d (diff)
elusive hang while rendering
Diffstat (limited to 'rotord/rotor.h')
-rwxr-xr-xrotord/rotor.h85
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;
};
}