summaryrefslogtreecommitdiff
path: root/NT/src/rendercontext.h
blob: 72c589e9901929a2ed636fe155477f5ed17cf41c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#ifndef RENDERCONTEXT_H
#define RENDERCONTEXT_H

/*------------------------

Render context manages a rotor graph as a web service, and renders out linear movies


TJR Jan 2014

-------------------------*/

#include "Poco/Task.h"
#include "Poco/StringTokenizer.h"

#include "rotor.h"
#include "graph.h"

//
// When rendering, where do duration etc come from?
//
// It should come from:
// a) a specified duration
// b) the duration of the song being worked on
// c) a default duration
//
// graph.get_duration()

namespace Rotor {
	#define IDLE 0
	#define ANALYSING_AUDIO 1
	#define AUDIO_READY 2
	#define CREATING_PREVIEW 3
	#define PREVIEW_READY 4
	#define RENDERING 5
	#define RENDER_READY 6
	#define FAILED 7
	#define NOT_FOUND 8
	#define CANCELLED 9
	#define LOADING_GRAPH 10

	#define ANALYSE_AUDIO 1
	#define PREVIEW 2
	#define RENDER 3
	#define LOAD_GRAPH_FILE 4
	#define LOAD_GRAPH_STRING 5

	class Session_command {
		public:
			Session_command(){body="";};
			string uid,method,id,body;
			vector<string> commands;
	};
	class Session_task {
		public:
			Session_task(const string &_uid="",int _task=0):uid(_uid),task(_task) {};
			string uid;
			int task;
			string message;
	};
	class Render_status {
		public:
			Render_status():status(0),progress(0.0){};
			Render_status(int _status):status(_status),progress(0.0){};
			int status;
			double progress;
	};
	class Render_settings {
		public:
			Render_settings(int w=640,int h=360):width(w),height(h){};
			int width,height;
	};
	class Render_context: public Poco::Task {
		public:
			Render_context(const std::string& _id,const std::string& _media_path=""): Task(_id)  {
				id=_id;
				media_path=_media_path;
				graph.init(id);
				//set up log
				AutoPtr<SplitterChannel> splitterChannel(new SplitterChannel());
			    AutoPtr<Channel> consoleChannel(new ConsoleChannel());
			    AutoPtr<Channel> fileChannel(new FileChannel("Rotord_"+id+".log"));
			    splitterChannel->addChannel(consoleChannel);
			    splitterChannel->addChannel(fileChannel);
			    AutoPtr<Formatter> formatter(new PatternFormatter("%d-%m-%Y %H:%M:%S %s: %t"));
			    AutoPtr<Channel> formattingChannel(new FormattingChannel(formatter, splitterChannel));
			    Logger& logger = Logger::create(id, formattingChannel, Message::PRIO_TRACE);
				
				//load profiles
				logger.information("started thread");
			}
			~Render_context(){
				Logger& logger = Logger::get(id);
				cancel();
				logger.information("stopped thread");
			}
			void runTask();
			void add_queue(Session_task item);
			bool set_profile(const std::string& _profile){
				if (profiles.find(_profile)==profiles.end()) return false;
				profile=_profile;
				return true;
			}
			void session_command(const Session_command& command,xmlIO& XML,Poco::Net::HTTPResponse::HTTPStatus& status);
			Render_status get_render_status(const string &uid){
				if (renders.find(uid)!=renders.end()){
					if (renders[uid].status==RENDERING){
						renders[uid].progress=graph.progress;
					}
					return renders[uid];
				}	
				return Render_status(NOT_FOUND);
			};
			std::string text_render(std::string node_id="");
			bool video_render(std::string output_filename,std::string node_id="");
			Graph graph;
		private:
			bool cancelled;
			double progress;
			int state;
			std::string id;
			std::unordered_map<std::string,Render_status> renders;
			std::unordered_map<std::string,Render_settings> profiles;
			std::string profile;
			std::string media_path;
			std::string graph_path;

			std::deque<Session_task> work_queue;
			Poco::Mutex mutex;
	};
	
};



#endif //RENDERCONTEXT_H