00001 #ifndef RENDERFARM_H
00002 #define RENDERFARM_H
00003
00004
00005 #include "arraylist.h"
00006 #include "asset.inc"
00007 #include "brender.inc"
00008 #include "bchash.inc"
00009 #include "condition.inc"
00010 #include "edl.inc"
00011 #include "mutex.inc"
00012 #include "mwindow.inc"
00013 #include "packagedispatcher.inc"
00014 #include "pluginserver.inc"
00015 #include "preferences.inc"
00016 #include "render.inc"
00017 #include "renderfarm.inc"
00018 #include "renderfarmclient.inc"
00019
00020 #include "thread.h"
00021
00022 #include <stdint.h>
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 #define STORE_INT32(value) \
00073 datagram[i++] = (((uint32_t)(value)) >> 24) & 0xff; \
00074 datagram[i++] = (((uint32_t)(value)) >> 16) & 0xff; \
00075 datagram[i++] = (((uint32_t)(value)) >> 8) & 0xff; \
00076 datagram[i++] = ((uint32_t)(value)) & 0xff;
00077
00078 #define STORE_INT64(value) \
00079 datagram[i++] = (((uint64_t)(value)) >> 56) & 0xff; \
00080 datagram[i++] = (((uint64_t)(value)) >> 48) & 0xff; \
00081 datagram[i++] = (((uint64_t)(value)) >> 40) & 0xff; \
00082 datagram[i++] = (((uint64_t)(value)) >> 32) & 0xff; \
00083 datagram[i++] = (((uint64_t)(value)) >> 24) & 0xff; \
00084 datagram[i++] = (((uint64_t)(value)) >> 16) & 0xff; \
00085 datagram[i++] = (((uint64_t)(value)) >> 8) & 0xff; \
00086 datagram[i++] = ((uint64_t)(value)) & 0xff;
00087
00088 #define READ_INT32(data) \
00089 ((((uint32_t)(data)[0]) << 24) | \
00090 (((uint32_t)(data)[1]) << 16) | \
00091 (((uint32_t)(data)[2]) << 8) | \
00092 ((uint32_t)(data)[3]))
00093
00094 #define READ_INT64(data) \
00095 ((((uint64_t)(data)[0]) << 56) | \
00096 (((uint64_t)(data)[1]) << 48) | \
00097 (((uint64_t)(data)[2]) << 40) | \
00098 (((uint64_t)(data)[3]) << 32) | \
00099 (((uint64_t)(data)[4]) << 24) | \
00100 (((uint64_t)(data)[5]) << 16) | \
00101 (((uint64_t)(data)[6]) << 8) | \
00102 ((uint64_t)(data)[7]))
00103
00104
00105
00106 enum
00107 {
00108 RENDERFARM_NONE,
00109 RENDERFARM_PREFERENCES,
00110 RENDERFARM_ASSET,
00111 RENDERFARM_EDL,
00112 RENDERFARM_PACKAGE,
00113 RENDERFARM_PROGRESS,
00114 RENDERFARM_SET_RESULT,
00115 RENDERFARM_GET_RESULT,
00116 RENDERFARM_DONE,
00117 RENDERFARM_SET_VMAP,
00118 RENDERFARM_COMMAND,
00119 RENDERFARM_TUNER,
00120 RENDERFARM_PACKAGES,
00121 RENDERFARM_KEEPALIVE,
00122
00123
00124 RENDERFARM_FOPEN,
00125 RENDERFARM_FCLOSE,
00126 RENDERFARM_REMOVE,
00127 RENDERFARM_RENAME,
00128 RENDERFARM_FGETC,
00129 RENDERFARM_FPUTC,
00130 RENDERFARM_FREAD,
00131 RENDERFARM_FWRITE,
00132 RENDERFARM_FSEEK,
00133 RENDERFARM_FTELL,
00134 RENDERFARM_STAT,
00135 RENDERFARM_STAT64,
00136 RENDERFARM_FGETS,
00137 RENDERFARM_FILENO
00138 };
00139
00140
00141 class RenderFarmServer
00142 {
00143 public:
00144
00145 RenderFarmServer(ArrayList<PluginServer*> *plugindb,
00146 PackageDispatcher *packages,
00147 Preferences *preferences,
00148 int use_local_rate,
00149 int *result_return,
00150 int64_t *total_return,
00151 Mutex *total_return_lock,
00152 Asset *default_asset,
00153 EDL *edl,
00154 BRender *brender);
00155 virtual ~RenderFarmServer();
00156
00157
00158
00159 int start_clients();
00160
00161 int wait_clients();
00162
00163
00164
00165
00166
00167 ArrayList<RenderFarmServerThread*> clients;
00168 ArrayList<PluginServer*> *plugindb;
00169
00170 PackageDispatcher *packages;
00171 Preferences *preferences;
00172
00173 int use_local_rate;
00174
00175
00176
00177
00178 int *result_return;
00179
00180 int64_t *total_return;
00181 Mutex *total_return_lock;
00182 Asset *default_asset;
00183 EDL *edl;
00184 Mutex *client_lock;
00185 BRender *brender;
00186 };
00187
00188
00189 class RenderFarmServerThread : public Thread
00190 {
00191 public:
00192 RenderFarmServerThread(ArrayList<PluginServer*> *plugindb,
00193 RenderFarmServer *server,
00194 int number);
00195 ~RenderFarmServerThread();
00196
00197
00198
00199 int write_int64(int64_t value);
00200 int64_t read_int64(int *error);
00201
00202 int write_string(char *string);
00203 static int open_client(char *hostname, int port);
00204
00205
00206
00207
00208 int read_socket(char *data, int len);
00209 int write_socket(char *data, int len);
00210 int start_loop();
00211 void send_preferences();
00212 void send_asset();
00213 void send_edl();
00214 void send_package(unsigned char *buffer);
00215 void set_progress(unsigned char *buffer);
00216 int set_video_map(unsigned char *buffer);
00217 void set_result(unsigned char *buffer);
00218 void get_result();
00219 void reallocate_buffer(int size);
00220
00221
00222 void run();
00223
00224
00225 ArrayList<PluginServer*> *plugindb;
00226 RenderFarmServer *server;
00227 RenderFarmWatchdog *watchdog;
00228 int socket_fd;
00229 int number;
00230
00231 double frames_per_second;
00232
00233 Asset *default_asset;
00234
00235
00236 unsigned char *buffer;
00237 int64_t buffer_allocated;
00238 char *datagram;
00239 };
00240
00241 class RenderFarmWatchdog : public Thread
00242 {
00243 public:
00244
00245
00246 RenderFarmWatchdog(RenderFarmServerThread *server,
00247 RenderFarmClientThread *client);
00248 ~RenderFarmWatchdog();
00249
00250
00251 void begin_request();
00252
00253 void end_request();
00254 void run();
00255
00256 RenderFarmServerThread *server;
00257 RenderFarmClientThread *client;
00258 Condition *next_request;
00259 Condition *request_complete;
00260 int done;
00261 int pid;
00262 };
00263
00264
00265
00266
00267
00268 #endif