Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

VideoStream.h

Go to the documentation of this file.
00001 /***************************************************************************
00002  *cr
00003  *cr            (C) Copyright 1995-2019 The Board of Trustees of the
00004  *cr                        University of Illinois
00005  *cr                         All Rights Reserved
00006  *cr
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010 * RCS INFORMATION:
00011 *
00012 *      $RCSfile: OptiXDisplayDevice.h
00013 *      $Author: johns $      $Locker:  $               $State: Exp $
00014 *      $Revision: 1.22 $         $Date: 2020/10/15 16:07:31 $
00015 *
00016 ***************************************************************************
00017 * DESCRIPTION:
00018 *   VMD interface for video streaming
00019 *
00020 ***************************************************************************/
00021 
00022 #ifndef VIDEOSTREAM_H
00023 #define VIDEOSTREAM_H
00024 
00025 #define VIDEOSTREAM_SUCCESS  0
00026 #define VIDEOSTREAM_ERROR   -1
00027 
00028 // #define VIDEOSTREAM_STATICBUFS 1
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     // client-side UI event transmission routines
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     // Key virtual methods inherited from UIObject
00079     int check_event();
00080     int act_on_command(int, Command *);
00081 
00082     // methods used to inform videostream of graphics updates 
00083     // and/or to funnel in incoming image data
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     // special method for use by OptiXRenderer
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; // clear event so we read it only once
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; // clear event so we read it only once
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; // clear event so we read it only once
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; // clear event so we read it only once
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

Generated on Thu Mar 28 02:44:19 2024 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002