00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef VIDEOSTREAM_H
00023 #define VIDEOSTREAM_H
00024
00025 #define VIDEOSTREAM_SUCCESS 0
00026 #define VIDEOSTREAM_ERROR -1
00027
00028
00029
00030 #include <stdlib.h>
00031 #include "UIObject.h"
00032 #include "WKFUtils.h"
00033
00034 struct VSMsgHeader_t;
00035
00036 class VideoStream : public UIObject {
00037 public:
00038 VideoStream(VMDApp *);
00039 ~VideoStream(void);
00040
00041 int cli_listen(int port);
00042 int cli_connect(const char *hostname, int port);
00043 int cli_wait_msg();
00044 int cli_disconnect();
00045 const char *cli_gethost() { return "Unknown"; };
00046 int cli_getport() { return 0; };
00047 int cli_connected() { return (cli_socket != NULL); }
00048 int cli_decode_frame(unsigned char *cbuf, long cbufsz,
00049 unsigned char *rgba, int width, int height);
00050
00051
00052 int cli_send_rotate_by(float angle, char axis);
00053 int cli_send_translate_by(float dx, float dy, float dz);
00054 int cli_send_scale_by(float scalefactor);
00055 int cli_send_keyboard(int dev, char val, int shift_state);
00056
00057 int srv_listen(int port);
00058 int srv_connect(const char *hostname, int port);
00059 int srv_send_frame(const unsigned char *rgba, int pitch,
00060 int width, int height, int forceIFrame);
00061 int srv_disconnect();
00062 const char *srv_gethost() { return "Unknown"; };
00063 int srv_getport() { return 0; };
00064 int srv_connected() { return (srv_socket != NULL); }
00065
00066 int set_target_bitrate_Mbps(float Mbps) {
00067 vs_bitrateMbps = int(Mbps);
00068 vs_codec_reconfig_pending = 1;
00069 return 0;
00070 }
00071
00072 int set_target_frame_rate(float tfps) {
00073 vs_targetFPS = int(tfps);
00074 vs_codec_reconfig_pending = 1;
00075 return 0;
00076 }
00077
00078
00079 int check_event();
00080 int act_on_command(int, Command *);
00081
00082
00083
00084 void video_frame_pending(const unsigned char *ptr = NULL,
00085 int pwidth=0, int pheight=0) {
00086 vs_rgba_pend = ptr;
00087 vs_rgba_width = pwidth;
00088 vs_rgba_height = pheight;
00089 vs_framepending = 1;
00090 }
00091 void video_frame_force_Iframe() { vs_forceIframe = 1; }
00092
00093 enum VSEventDev {
00094 VS_EV_NONE,
00095 VS_EV_ROTATE_BY,
00096 VS_EV_TRANSLATE_BY,
00097 VS_EV_SCALE_BY,
00098 VS_EV_KEYBOARD
00099 };
00100
00101
00102 int srv_check_ui_event();
00103
00105 int srv_process_all_events() {
00106 srv_get_one_ui_event=0;
00107 return 0;
00108 }
00109
00111 int srv_get_last_event_type(int &eventtype) {
00112 eventtype = srv_last_event_type;
00113 return 0;
00114 }
00115
00117 int srv_get_last_rotate_by(float &angle, int &axis) {
00118 angle = srv_last_rotate_by_angle;
00119 axis = srv_last_rotate_by_axis;
00120
00121 srv_last_event_type = VS_EV_NONE;
00122 return 0;
00123 }
00124
00126 int srv_get_last_translate_by(float &tx, float &ty, float &tz) {
00127 tx = srv_last_translate_by_vec[0];
00128 ty = srv_last_translate_by_vec[1];
00129 tz = srv_last_translate_by_vec[2];
00130
00131 srv_last_event_type = VS_EV_NONE;
00132 return 0;
00133 }
00134
00136 int srv_get_last_scale_by(float &factor) {
00137 factor = srv_last_scale_by_factor;
00138
00139 srv_last_event_type = VS_EV_NONE;
00140 return 0;
00141 }
00142
00144 int srv_get_last_keyboard(int &dev, int &val, int &shift_state) {
00145 dev = srv_last_key_dev;
00146 val = srv_last_key_val;
00147 shift_state = srv_last_key_shift_state;
00148
00149 srv_last_event_type = VS_EV_NONE;
00150 return 0;
00151 }
00152
00153 private:
00154 int srv_get_one_ui_event;
00155
00156 int srv_last_event_type;
00157 int srv_last_rotate_by_axis;
00158 float srv_last_rotate_by_angle;
00159 float srv_last_translate_by_vec[3];
00160 float srv_last_scale_by_factor;
00161 int srv_last_key_dev;
00162 int srv_last_key_val;
00163 int srv_last_key_shift_state;
00164
00165 int vs_framepending;
00166 const unsigned char *vs_rgba_pend;
00167 int vs_rgba_width;
00168 int vs_rgba_height;
00169
00170 int vs_forceIframe;
00171 int vs_width;
00172 int vs_height;
00173 int vs_targetFPS;
00174 int vs_bitrateMbps;
00175 int vs_codec_reconfig_pending;
00176
00177 double imagesz_comp;
00178 double imagesz_uncomp;
00179 double expave_fps;
00180
00181 void *ench;
00182 void *cli_socket;
00183 void *srv_socket;
00184
00185 #if defined(VIDEOSTREAM_STATICBUFS)
00186 unsigned char *vs_imgbuf;
00187 int vs_imgbufsz;
00188 unsigned char *vs_cbuf;
00189 int vs_cbufsz;
00190 #endif
00191
00192 wkf_timerhandle timer;
00193 double lastconsolemesg;
00194 double cli_lastmsgtime;
00195 double cli_lastframe;
00196 double srv_lastmsgtime;
00197 double srv_lastframe;
00198 int lastmsgeventloops;
00199
00200 enum VSMsgType {
00201 VS_HANDSHAKE,
00202 VS_GO,
00203 VS_PAUSE,
00204 VS_CODEC_RECONFIG,
00205 VS_IMAGE,
00206 VS_RESIZE,
00207 #if 0
00208 VS_KILL,
00209 VS_TRATE,
00210 #endif
00211 VS_UIEVENT,
00212 VS_HEARTBEAT,
00213 VS_DISCONNECT,
00214 VS_IOERROR
00215 };
00216
00217 int vs_encoder_reconfig();
00218
00219 int vs_recv_handshake(void *sock);
00220 int vs_send_handshake(void *s);
00221
00222 int vs_recv_header(void *s, VSMsgHeader_t &header);
00223 int vs_recv_header_nolengthswap(void *s, int *length);
00224 int vs_readn(void *s, char *ptr, int n);
00225 int vs_readn_discard(void *s, int n);
00226 int vs_writen(void *s, const char *ptr, int n);
00227 int vs_send_disconnect(void *s);
00228 int vs_send_pause(void *s);
00229 int vs_send_go(void *s);
00230 int vs_send_heartbeat(void *s);
00231 int vs_send_resize(void *s, int w, int h);
00232 int vs_send_codec_reconfig(void *s, int bitrateMbps, int targetFPS);
00233 };
00234
00235 #endif