vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Wed May 15 20:20:52 2019 +0300| [56fb22c5a4f2c924103d37d3b3dff6f749d6079d] | committer: Rémi Denis-Courmont
remoteosd: remove > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=56fb22c5a4f2c924103d37d3b3dff6f749d6079d --- NEWS | 1 + modules/spu/Makefile.am | 7 - modules/spu/remoteosd.c | 1349 -------------------------------------- modules/spu/remoteosd_rfbproto.h | 729 -------------------- po/POTFILES.in | 1 - 5 files changed, 1 insertion(+), 2086 deletions(-) diff --git a/NEWS b/NEWS index df6d552ce4..a90762a649 100644 --- a/NEWS +++ b/NEWS @@ -53,6 +53,7 @@ Video output: Video filter: * Update yadif + * Remove remote OSD plugin Stream output: * New SDI output with improved audio and ancillary support. diff --git a/modules/spu/Makefile.am b/modules/spu/Makefile.am index ec956b29fe..571fcca299 100644 --- a/modules/spu/Makefile.am +++ b/modules/spu/Makefile.am @@ -29,10 +29,3 @@ libdynamicoverlay_plugin_la_SOURCES = \ if !HAVE_WIN32 spu_LTLIBRARIES += libdynamicoverlay_plugin.la endif - -libremoteosd_plugin_la_SOURCES = spu/remoteosd.c spu/remoteosd_rfbproto.h -libremoteosd_plugin_la_CFLAGS = $(AM_CFLAGS) $(GCRYPT_CFLAGS) -libremoteosd_plugin_la_LIBADD = $(GCRYPT_LIBS) $(SOCKET_LIBS) -if HAVE_GCRYPT -spu_LTLIBRARIES += libremoteosd_plugin.la -endif diff --git a/modules/spu/remoteosd.c b/modules/spu/remoteosd.c deleted file mode 100644 index bfa52a8784..0000000000 --- a/modules/spu/remoteosd.c +++ /dev/null @@ -1,1349 +0,0 @@ -/***************************************************************************** - * remoteosd.c: remote osd over vnc filter module - ***************************************************************************** - * Copyright (C) 2007-2008 Matthias Bauer - * - * Authors: Matthias Bauer <matthias dot bauer #_at_# gmx dot ch> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implid warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - *****************************************************************************/ - -/***************************************************************************** - * RemoteOSD uses the RFB-Protocol of VNC to display an On-Screen-Display - * menu generated by a streaming server as overlay for the streamed video. - * - * The streaming server that implements this is the ffnetdev plugin for VDR. - * VDR (VideoDiskRecorder) is an Linux based OpenSource harddisk recorder - * software. - * The VDR ffnetdev plugin emulates the hardware MPEG decoder and streams the - * video over the network instead of hardware video outputs. - * The OSD menu of VDR is offered with the RFB protocol to a VNC client. - * - * In fact this video-filter is a simple VNC client that could be also used to - * connect to a real VNC host. - * Only 8-bit color is supported at the moment. - * Using password protected VNC hosts is supported but not recommended, because - * you need to insert the used password in the plugin configuration page of - * VLC configuration in plain text and it's saved in plain text. - *****************************************************************************/ - -//#define VNC_DEBUG - -/***************************************************************************** - * Preamble - *****************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <vlc_common.h> -#include <vlc_plugin.h> -#include <vlc_filter.h> -#include <vlc_mouse.h> -#include <vlc_subpicture.h> -#include <vlc_actions.h> /* KEY_MODIFIER_CTRL */ - -#include <vlc_network.h> /* htonl */ -#include <vlc_tls.h> -#include <gcrypt.h> /* to encrypt password */ -#include <vlc_gcrypt.h> - -#include "remoteosd_rfbproto.h" /* type definitions of the RFB protocol for VNC */ - -/***************************************************************************** - * Module descriptor - *****************************************************************************/ -#define READ_BUFFER_SIZE 1000000 - -#define RMTOSD_HOST_TEXT N_("VNC Host") -#define RMTOSD_HOST_LONGTEXT N_( \ - "VNC hostname or IP address." ) - -#define RMTOSD_PORT_TEXT N_("VNC Port") -#define RMTOSD_PORT_LONGTEXT N_( \ - "VNC port number." ) - -#define RMTOSD_PASSWORD_TEXT N_("VNC Password") -#define RMTOSD_PASSWORD_LONGTEXT N_( \ - "VNC password." ) - -#define RMTOSD_UPDATE_TEXT N_("VNC poll interval" ) -#define RMTOSD_UPDATE_LONGTEXT N_( \ - "In this interval an update from VNC is requested, default every 300 ms.") - -#define RMTOSD_POLL_TEXT N_("VNC polling") -#define RMTOSD_POLL_LONGTEXT N_( \ - "Activate VNC polling. Do NOT activate for use as VDR ffnetdev client." ) - -#define RMTOSD_MOUSE_TEXT N_("Mouse events") -#define RMTOSD_MOUSE_LONGTEXT N_( \ - "Send mouse events to VNC host. Not needed for use as VDR ffnetdev client." ) - -#define RMTOSD_KEYS_TEXT N_("Key events") -#define RMTOSD_KEYS_LONGTEXT N_( \ - "Send key events to VNC host." ) - -#define RMTOSD_ALPHA_TEXT N_("Alpha transparency value (default 255)") -#define RMTOSD_ALPHA_LONGTEXT N_( \ - "The transparency of the OSD VNC can be changed by giving a value " \ - "between 0 and 255. A lower value specifies more transparency a higher " \ - "means less transparency. The default is being not transparent " \ - "(value 255) the minimum is fully transparent (value 0)." ) - -#define RMTOSD_CFG "rmtosd-" - -#define RMTOSD_UPDATE_MIN 200 -#define RMTOSD_UPDATE_DEFAULT 1000 -#define RMTOSD_UPDATE_MAX 300 - -static int CreateFilter ( vlc_object_t * ); -static void DestroyFilter( vlc_object_t * ); - -vlc_module_begin () - set_description( N_("Remote-OSD over VNC") ) - set_capability( "sub source", 100 ) - set_shortname( N_("Remote-OSD") ) - set_category( CAT_VIDEO ) - set_subcategory( SUBCAT_VIDEO_SUBPIC ) - add_shortcut( "rmtosd" ) - set_callbacks( CreateFilter, DestroyFilter ) - - add_string( RMTOSD_CFG "host", "myvdr", RMTOSD_HOST_TEXT, - RMTOSD_HOST_LONGTEXT, false ) - add_integer_with_range( RMTOSD_CFG "port", 20001, 1, 0xFFFF, - RMTOSD_PORT_TEXT, RMTOSD_PORT_LONGTEXT, false ) - add_password(RMTOSD_CFG "password", "", RMTOSD_PASSWORD_TEXT, - RMTOSD_PASSWORD_LONGTEXT) - add_integer_with_range( RMTOSD_CFG "update", RMTOSD_UPDATE_DEFAULT, - RMTOSD_UPDATE_MIN, RMTOSD_UPDATE_MAX, RMTOSD_UPDATE_TEXT, - RMTOSD_UPDATE_LONGTEXT, true ) - add_bool( RMTOSD_CFG "vnc-polling", false, - RMTOSD_POLL_TEXT , RMTOSD_POLL_LONGTEXT, false ) - add_bool( RMTOSD_CFG "mouse-events", false, - RMTOSD_MOUSE_TEXT , RMTOSD_MOUSE_LONGTEXT, false ) - add_bool( RMTOSD_CFG "key-events", false, - RMTOSD_KEYS_TEXT , RMTOSD_KEYS_LONGTEXT, false ) - add_integer_with_range( RMTOSD_CFG "alpha", 255, 0, 255, - RMTOSD_ALPHA_TEXT, RMTOSD_ALPHA_LONGTEXT, true ) - -vlc_module_end () - - -/***************************************************************************** - * Local prototypes - *****************************************************************************/ -#define CHALLENGESIZE 16 -#define MAX_VNC_SERVER_NAME_LENGTH 255 - -typedef struct filter_sys_t filter_sys_t; - -/* subsource functions */ -static subpicture_t *Filter( filter_t *, vlc_tick_t ); - -static int MouseEvent( filter_t *, - const vlc_mouse_t *, - const vlc_mouse_t *, - const video_format_t * ); - -static int KeyEvent( vlc_object_t *p_this, char const *psz_var, - vlc_value_t oldval, vlc_value_t newval, void *p_data ); - -static void* vnc_worker_thread ( void * ); - -static void* update_request_thread( void * ); - -static bool process_server_message ( filter_t *p_filter, - rfbServerToClientMsg *msg ); - -static inline void rgb_to_yuv( uint8_t *y, uint8_t *u, uint8_t *v, - int r, int g, int b ); - -static inline bool fill_rect( filter_sys_t* p_sys, - uint16_t i_x, uint16_t i_y, - uint16_t i_w, uint16_t i_h, - uint8_t i_color ); -static inline bool copy_rect( filter_sys_t* p_sys, - uint16_t i_x, uint16_t i_y, - uint16_t i_w, uint16_t i_h, - uint16_t i_sx, uint16_t i_sy ); - - -static inline bool raw_line( filter_sys_t* p_sys, - uint16_t i_x, uint16_t i_y, - uint16_t i_w ); - -static int vnc_encrypt_bytes( unsigned char *bytes, char *passwd ); - - -/***************************************************************************** - * Sub source code - *****************************************************************************/ - -/***************************************************************************** - * Local prototypes - *****************************************************************************/ -struct filter_sys_t -{ - vlc_mutex_t lock; /* To lock for read/write on picture */ - - bool b_need_update; /* VNC picture is updated, do update the OSD*/ - uint8_t i_alpha; /* alpha transparency value */ - - char *psz_host; /* VNC host */ - - char *psz_passwd; /* VNC password */ - - picture_t *p_pic; /* The picture with OSD data from VNC */ - - vlc_tls_t *i_socket; /* Socket used for VNC */ - - uint16_t i_vnc_width; /* The with of the VNC screen */ - uint16_t i_vnc_height; /* The height of the VNC screen */ - - bool b_vnc_key_events; /* Send KeyEvents ? */ - bool b_alpha_from_vnc; /* Special ffnetdev alpha feature enabled ? */ - - char read_buffer[READ_BUFFER_SIZE]; - - vlc_thread_t worker_thread; - - uint8_t ar_color_table_yuv[256][4]; -}; - -/***************************************************************************** - * CreateFilter: Create the filter and open the definition file - *****************************************************************************/ -static int CreateFilter ( vlc_object_t *p_this ) -{ - filter_t *p_filter = (filter_t *)p_this; - - filter_sys_t *p_sys = malloc( sizeof (*p_sys) ); - if( unlikely(p_sys == NULL) ) - return VLC_ENOMEM; - - /* Populating struct */ - vlc_mutex_init( &p_sys->lock ); - p_sys->b_need_update = false; - p_sys->psz_host = var_InheritString( p_this, RMTOSD_CFG "host" ); - p_sys->psz_passwd = var_InheritString( p_this, RMTOSD_CFG "password" ); - p_sys->i_alpha = var_InheritInteger( p_this, RMTOSD_CFG "alpha" ); - p_sys->p_pic = NULL; - p_sys->i_socket = NULL; - - memset( p_sys->ar_color_table_yuv, 255, - sizeof( p_sys->ar_color_table_yuv ) ); - - if( p_sys->psz_host == NULL ) - { - msg_Err( p_filter, "unable to get vnc host" ); - goto error; - } - - if( p_sys->psz_passwd == NULL ) - { - msg_Err( p_filter, "unable to get vnc password" ); - goto error; - } - - p_filter->p_sys = p_sys; - - vlc_gcrypt_init(); - - /* create the vnc worker thread */ - if( vlc_clone( &p_sys->worker_thread, - vnc_worker_thread, p_filter, VLC_THREAD_PRIORITY_LOW ) ) - { - msg_Err( p_filter, "cannot spawn vnc message reader thread" ); - goto error; - } - - /* Attach subpicture source callback */ - p_filter->pf_sub_source = Filter; - - es_format_Init( &p_filter->fmt_out, SPU_ES, VLC_CODEC_SPU ); - p_filter->fmt_out.i_priority = ES_PRIORITY_SELECTABLE_MIN; - - if( var_InheritBool( p_this, RMTOSD_CFG "mouse-events" ) ) - p_filter->pf_sub_mouse = MouseEvent; - - p_sys->b_vnc_key_events = var_InheritBool( p_this, - RMTOSD_CFG "key-events" ); - if( p_sys->b_vnc_key_events ) - var_AddCallback( vlc_object_instance(p_filter), "key-pressed", - KeyEvent, p_this ); - - msg_Dbg( p_filter, "osdvnc filter started" ); - - return VLC_SUCCESS; - -error: - msg_Err( p_filter, "osdvnc filter discarded" ); - - vlc_mutex_destroy( &p_sys->lock ); - free( p_sys->psz_host ); - free( p_sys->psz_passwd ); - free( p_sys ); - - return VLC_EGENERIC; -} - -/***************************************************************************** - * DestroyFilter: Make a clean exit of this plugin - *****************************************************************************/ -static void DestroyFilter( vlc_object_t *p_this ) -{ - filter_t *p_filter = (filter_t*)p_this; - filter_sys_t *p_sys = p_filter->p_sys; - - msg_Dbg( p_filter, "DestroyFilter called." ); - - if( p_sys->b_vnc_key_events ) - var_DelCallback( vlc_object_instance(p_filter), "key-pressed", - KeyEvent, p_this ); - - vlc_cancel( p_sys->worker_thread ); - vlc_join( p_sys->worker_thread, NULL ); - - if( p_sys->p_pic != NULL ) - picture_Release( p_sys->p_pic ); - if( p_sys->i_socket != NULL ) - vlc_tls_Close( p_sys->i_socket ); - - vlc_mutex_destroy( &p_sys->lock ); - free( p_sys->psz_host ); - free( p_sys->psz_passwd ); - free( p_sys ); -} - -static bool read_exact( vlc_tls_t *fd, void *buf, size_t len ) -{ - return (ssize_t)len == vlc_tls_Read( fd, buf, len, true ); -} - - -static bool write_exact( vlc_tls_t *fd, const void *buf, size_t len ) -{ - return (ssize_t)len == vlc_tls_Write( fd, buf, len ); -} - -static vlc_tls_t *vnc_connect( filter_t *p_filter ) -{ - filter_sys_t *p_sys = p_filter->p_sys; - - int port = var_InheritInteger( p_filter, RMTOSD_CFG "port" ); - - vlc_tls_t *fd = vlc_tls_SocketOpenTCP( VLC_OBJECT(p_filter), - p_sys->psz_host, port ); - if( fd == NULL ) - { - msg_Err( p_filter, "Could not connect to VNC host" ); - return NULL; - } - - msg_Dbg( p_filter, "Reading protocol version" ); - - rfbProtocolVersionMsg pv; - if ( !read_exact( fd, pv, sz_rfbProtocolVersionMsg ) ) - { - msg_Err( p_filter, "Could not read version message" ); - goto error; - } - pv[sz_rfbProtocolVersionMsg] = '\0'; /* pv size is sz_rfbProtocolVersionMsg+1 */ - - msg_Dbg( p_filter, "Server version is %s", pv ); - - static const char version[sz_rfbProtocolVersionMsg] = "RFB 003.003\n"; - - if( !write_exact(fd, version, sz_rfbProtocolVersionMsg) ) - { - msg_Err( p_filter, "Could not write version message" ); - goto error; - } - - msg_Dbg( p_filter, "Reading authentication scheme" ); - uint32_t i_authScheme; - if( !read_exact( fd, &i_authScheme, 4 ) ) - { - msg_Err( p_filter, "Could not read authentication scheme" ); - goto error; - } - i_authScheme = htonl(i_authScheme); - - msg_Dbg( p_filter, "Authentication scheme = %x", i_authScheme ); - if ( i_authScheme == rfbConnFailed ) - { - msg_Err( p_filter, "Connection rejected by server" ); - goto error; - } - if (i_authScheme == rfbVncAuth) - { - unsigned char challenge[CHALLENGESIZE]; - if ( !read_exact( fd, challenge, CHALLENGESIZE ) ) - { - msg_Err( p_filter, "Could not read password challenge" ); - goto error; - } - - int err = vnc_encrypt_bytes( challenge, p_sys->psz_passwd ); - if (err != VLC_SUCCESS) - return false; - - if( !write_exact(fd, challenge, CHALLENGESIZE ) ) - { - msg_Err( p_filter, "Could not write password" ); - goto error; - } - uint32_t i_authResult; - if( !read_exact( fd, &i_authResult, 4 ) ) - { - msg_Err( p_filter, "Could not read authentication result" ); - goto error; - } - i_authResult = htonl(i_authResult); - if (i_authResult != rfbVncAuthOK) - { - msg_Err( p_filter, "VNC authentication failed" ); - goto error; - } - } - - msg_Dbg( p_filter, "Writing client init message" ); - rfbClientInitMsg ci; - ci.shared = 1; - if( !write_exact( fd, &ci, sz_rfbClientInitMsg ) ) - { - msg_Err( p_filter, "Could not write client init message" ); - goto error; - } - - msg_Dbg( p_filter, "Reading server init message" ); - rfbServerInitMsg si; - if( !read_exact( fd, &si, sz_rfbServerInitMsg ) ) - { - msg_Err( p_filter, "Could not read server init message" ); - goto error; - } - si.framebufferWidth = htons(si.framebufferWidth); - si.framebufferHeight = htons(si.framebufferHeight); - si.format.redMax = htons(si.format.redMax); - si.format.greenMax = htons(si.format.greenMax); - si.format.blueMax = htons(si.format.blueMax); - - p_sys->i_vnc_width = si.framebufferWidth; - p_sys->i_vnc_height = si.framebufferHeight; - - msg_Dbg( p_filter, "Servers preferred pixelformat: " - "%ux%u, R(%u),G(%u),B(%u), %u bit, depht=%u, %s", - si.framebufferWidth, - si.framebufferHeight, - si.format.redMax, - si.format.greenMax, - si.format.blueMax, - si.format.bitsPerPixel, - si.format.depth, - si.format.trueColour ? "TrueColor" : "Not-TrueColor"); - - uint32_t i_nameLength = htonl(si.nameLength); - if( i_nameLength > MAX_VNC_SERVER_NAME_LENGTH ) - { - msg_Err( p_filter, "Server name too long" ); - goto error; - } - char s_ServerName[MAX_VNC_SERVER_NAME_LENGTH+1]; - - msg_Dbg( p_filter, "Reading server name with size = %u", i_nameLength ); - if( !read_exact( fd, s_ServerName, i_nameLength ) ) - { - msg_Err( p_filter, "Could not read server name" ); - goto error; - } - s_ServerName[i_nameLength] = '\0'; - - if( strcmp( s_ServerName, "VDR-OSD") == 0 ) - { - msg_Dbg( p_filter, "Server is a VDR" ); - p_sys->b_alpha_from_vnc = true; - } - else - { - msg_Dbg( p_filter, "Server is a normal VNC" ); - p_sys->b_alpha_from_vnc = false; - } - - - msg_Dbg( p_filter, "Server init message read properly" ); - msg_Dbg( p_filter, "Server name is %s", s_ServerName ); - - msg_Dbg( p_filter, "Writing SetPixelFormat message" ); - - rfbSetPixelFormatMsg sp; - sp.type = rfbSetPixelFormat; - sp.pad1 = sp.pad2 = 0; - sp.format.bitsPerPixel = 8; - sp.format.depth = 8 ; - sp.format.bigEndian = 1; - sp.format.trueColour = 0; - sp.format.redMax = htons(31); - sp.format.greenMax = htons(31); - sp.format.blueMax = htons(31); - sp.format.redShift = 10; - sp.format.greenShift = 5; - sp.format.blueShift = 0; - sp.format.pad1 = sp.format.pad2 = 0; - - if( !write_exact( fd, &sp, sz_rfbSetPixelFormatMsg) ) - { - msg_Err( p_filter, "Could not write SetPixelFormat message" ); - goto error; - } - - msg_Dbg( p_filter, "Writing SetEncodings message" ); - - rfbSetEncodingsMsg se; - se.type = rfbSetEncodings; - se.pad = 0; - se.nEncodings = htons( p_sys->b_alpha_from_vnc ? 3 : 2 ); - - if( !write_exact( fd, &se, sz_rfbSetEncodingsMsg) ) - { - msg_Err( p_filter, "Could not write SetEncodings message begin" ); - goto error; - } - - uint32_t i_encoding; - - msg_Dbg( p_filter, "Writing SetEncodings rfbEncodingCopyRect" ); - i_encoding = htonl(rfbEncodingCopyRect); - if( !write_exact( fd, &i_encoding, 4) ) - { - msg_Err( p_filter, "Could not write encoding type rfbEncodingCopyRect." ); - goto error; - } - - msg_Dbg( p_filter, "Writing SetEncodings rfbEncodingRRE" ); - i_encoding = htonl(rfbEncodingRRE); - if( !write_exact(fd, &i_encoding, 4) ) - { - msg_Err( p_filter, "Could not write encoding type rfbEncodingRRE." ); - goto error; - } - - if( p_sys->b_alpha_from_vnc ) - { - msg_Dbg( p_filter, "Writing SetEncodings rfbEncSpecialUseAlpha" ); - i_encoding = 0x00F0FFFF; /* rfbEncSpecialUseAlpha is 0xFFFFF000 - * before we swap it */ - if( !write_exact(fd, &i_encoding, 4) ) - { - msg_Err( p_filter, "Could not write encoding type rfbEncSpecialUseAlpha." ); - goto error; - } - } - - return fd; -error: - vlc_tls_Close( fd ); - return NULL; -} - -static int write_update_request(filter_t *p_filter, bool incremental) -{ - filter_sys_t *p_sys = p_filter->p_sys; - rfbFramebufferUpdateRequestMsg udr; - - udr.type = rfbFramebufferUpdateRequest; - udr.incremental = incremental; - udr.x = 0; - udr.y = 0; - udr.w = htons(p_sys->i_vnc_width); - udr.h = htons(p_sys->i_vnc_height); - - int w = write_exact(p_sys->i_socket, &udr, - sz_rfbFramebufferUpdateRequestMsg); - if( !w ) - msg_Err( p_filter, "Could not write rfbFramebufferUpdateRequestMsg." ); - return w; -} - -static void update_thread_cleanup( void *p ) -{ - vlc_thread_t *th = p; - - vlc_cancel( *th ); - vlc_join( *th, NULL ); -} - -static void dummy_cleanup( void *p ) -{ - (void) p; -} - -static void* vnc_worker_thread( void *obj ) -{ - filter_t* p_filter = (filter_t*)obj; - filter_sys_t *p_sys = p_filter->p_sys; - vlc_thread_t update_thread; - int canc = vlc_savecancel (); - - msg_Dbg( p_filter, "VNC worker thread started" ); - - vlc_tls_t *fd = vnc_connect( p_filter ); - if( fd == NULL ) - { - msg_Err( p_filter, "Error occurred while handshaking VNC host" ); - return NULL; - } - - /* Create an empty picture for VNC the data */ - picture_t *pic = picture_New( VLC_CODEC_YUVA, p_sys->i_vnc_width, - p_sys->i_vnc_height, 1, 1 ); - if( likely(pic != NULL) ) - { - vlc_mutex_lock( &p_sys->lock ); - p_sys->i_socket = fd; - p_sys->p_pic = pic; - vlc_mutex_unlock( &p_sys->lock ); - } - else - { - vlc_tls_Close( fd ); - return NULL; - } - - write_update_request( p_filter, false ); - - /* create the update request thread */ - bool polling = var_InheritBool( p_filter, RMTOSD_CFG "vnc-polling" ); - if( polling - && vlc_clone( &update_thread, update_request_thread, - p_filter, VLC_THREAD_PRIORITY_LOW ) ) - { - msg_Err( p_filter, "cannot spawn VNC update request thread" ); - polling = false; - } - - vlc_cleanup_push( polling ? update_thread_cleanup : dummy_cleanup, - &update_thread ); - - /* connection is initialized, now read and handle server messages */ - for( ;; ) - { - rfbServerToClientMsg msg; - int i_msgSize; - - memset( &msg, 0, sizeof(msg) ); - vlc_restorecancel (canc); - - if( !read_exact(fd, &msg, 1 ) ) - { - msg_Err( p_filter, "Error while waiting for next server message"); - break; - } - switch (msg.type) - { - case rfbFramebufferUpdate: - i_msgSize = sz_rfbFramebufferUpdateMsg; - break; - case rfbSetColourMapEntries: - i_msgSize = sz_rfbSetColourMapEntriesMsg; - break; - case rfbBell: - i_msgSize = sz_rfbBellMsg; - break; - case rfbServerCutText: - i_msgSize = sz_rfbServerCutTextMsg; - break; - case rfbReSizeFrameBuffer: - i_msgSize = sz_rfbReSizeFrameBufferMsg; - break; - default: - i_msgSize = 0; - msg_Err( p_filter, "Invalid message %u received", msg.type ); - break; - } - - if( i_msgSize <= 0 ) - break; - - if( --i_msgSize > 0 ) - { - if ( !read_exact( fd, ((char *)&msg) + 1, i_msgSize ) ) - { - msg_Err( p_filter, "Error while reading message of type %u", - msg.type ); - break; - } - } - - canc = vlc_savecancel (); - process_server_message( p_filter, &msg); - } - - vlc_cleanup_pop(); - if( polling ) - update_thread_cleanup( &update_thread ); - - msg_Dbg( p_filter, "VNC message reader thread ended" ); - vlc_restorecancel (canc); - return NULL; -} - -static void* update_request_thread( void *obj ) -{ - filter_t* p_filter = (filter_t*)obj; - int canc = vlc_savecancel(); - vlc_tick_t interval = VLC_TICK_FROM_MS( var_InheritInteger( p_filter, RMTOSD_CFG "update" ) ); - vlc_restorecancel(canc); - - if( interval < VLC_TICK_FROM_MS(100) ) - interval = VLC_TICK_FROM_MS(100); - - do - vlc_tick_sleep( interval ); - while( write_update_request( p_filter, true ) ); - - return NULL; -} - -static bool process_server_message ( filter_t *p_filter, - rfbServerToClientMsg *msg ) -{ - filter_sys_t *p_sys = p_filter->p_sys; - - switch (msg->type) - { - case rfbFramebufferUpdate: - { - msg->fu.nRects = htons(msg->fu.nRects); - rfbFramebufferUpdateRectHeader hdr; - - for (int i_rect = 0; i_rect < msg->fu.nRects; i_rect++) - { - if (!read_exact(p_sys->i_socket, &hdr, - sz_rfbFramebufferUpdateRectHeader ) ) - { - msg_Err( p_filter, "Could not read FrameBufferUpdate header" ); - return false; - } - hdr.r.x = htons(hdr.r.x); - hdr.r.y = htons(hdr.r.y); - hdr.r.w = htons(hdr.r.w); - hdr.r.h = htons(hdr.r.h); - hdr.encoding = htonl(hdr.encoding); - - switch (hdr.encoding) - { - case rfbEncodingRaw: - { - int i_line; - for (i_line = 0; i_line < hdr.r.h; i_line++) - { - if ( !read_exact( p_sys->i_socket, - p_sys->read_buffer, hdr.r.w ) ) - { - msg_Err( p_filter, - "Could not read FrameBufferUpdate line data" ); - return false; - } - vlc_mutex_lock( &p_sys->lock ); - if ( !raw_line( p_sys, hdr.r.x, - hdr.r.y + i_line, - hdr.r.w ) ) - { - msg_Err( p_filter, "raw_line failed." ); - vlc_mutex_unlock( &p_sys->lock ); - return false; - } - vlc_mutex_unlock( &p_sys->lock ); - } - } - break; - - case rfbEncodingCopyRect: - { - rfbCopyRect rect; - - if ( !read_exact( p_sys->i_socket, - &rect, sz_rfbCopyRect ) ) - { - msg_Err( p_filter, "Could not read rfbCopyRect" ); - return false; - } - rect.srcX = htons( rect.srcX ); - rect.srcY = htons( rect.srcY ); - - vlc_mutex_lock( &p_sys->lock ); - if ( !copy_rect( p_sys, - hdr.r.x, hdr.r.y, - hdr.r.w, hdr.r.h, - rect.srcX, rect.srcY ) ) - { - msg_Err( p_filter, "copy_rect failed." ); - vlc_mutex_unlock( &p_sys->lock ); - return false; - } - vlc_mutex_unlock( &p_sys->lock ); - } - break; - - case rfbEncodingRRE: - { - rfbRREHeader rrehdr; - if ( !read_exact( p_sys->i_socket, - &rrehdr, sz_rfbRREHeader ) ) - { - msg_Err( p_filter, "Could not read rfbRREHeader" ); - return false; - } - uint8_t i_pixcolor; - if ( !read_exact( p_sys->i_socket, - &i_pixcolor, 1 ) ) - { - msg_Err( p_filter, "Could not read RRE pixcolor" ); - return false; - } - - vlc_mutex_lock( &p_sys->lock ); - if ( !fill_rect( p_sys, - hdr.r.x, hdr.r.y, - hdr.r.w, hdr.r.h, - i_pixcolor) ) - { - msg_Err( p_filter, "main fill_rect failed." ); - vlc_mutex_unlock( &p_sys->lock ); - return false; - } - vlc_mutex_unlock( &p_sys->lock ); - - rrehdr.nSubrects = htonl(rrehdr.nSubrects); - - int i_datasize = rrehdr.nSubrects * - ( sizeof(i_pixcolor) + sz_rfbRectangle ) ; - if ( i_datasize > READ_BUFFER_SIZE ) - { - msg_Err( p_filter, "Buffer too small, " - "need %u bytes", i_datasize ); - return false; - } - if ( !read_exact( p_sys->i_socket, - p_sys->read_buffer, i_datasize ) ) - { - msg_Err( p_filter, - "Could not read RRE subrect data" ); - return false; - } - - uint32_t i_subrect; - rfbRectangle* p_subrect; - int i_offset = 0; - vlc_mutex_lock( &p_sys->lock ); - for ( i_subrect = 0; - i_subrect < rrehdr.nSubrects; i_subrect++) - { - i_pixcolor = p_sys->read_buffer[i_offset]; - i_offset += sizeof(i_pixcolor); - p_subrect = - (rfbRectangle*)(p_sys->read_buffer + i_offset); - i_offset += sz_rfbRectangle; - - if (!fill_rect( p_sys, - htons(p_subrect->x) + hdr.r.x, - htons(p_subrect->y) + hdr.r.y, - htons(p_subrect->w), - htons(p_subrect->h), - i_pixcolor) ) - { - msg_Err( p_filter, - "subrect %u fill_rect failed.", i_subrect ); - vlc_mutex_unlock( &p_sys->lock ); - return false; - } - } - vlc_mutex_unlock( &p_sys->lock ); - } - break; - - } - - } - vlc_mutex_lock( &p_sys->lock ); - p_sys->b_need_update = true; - vlc_mutex_unlock( &p_sys->lock ); - } - return true; - - case rfbSetColourMapEntries: - { - msg->scme.nColours = htons(msg->scme.nColours); - msg->scme.firstColour = htons(msg->scme.firstColour); - int i_datasize; - if ( p_sys->b_alpha_from_vnc ) - { - i_datasize = 2 * msg->scme.nColours * 4; - } - else - { - i_datasize = 2 * msg->scme.nColours * 3; - } - if ( i_datasize > READ_BUFFER_SIZE ) - { - msg_Err( p_filter, "Buffer too small, need %u bytes", - i_datasize ); - return false; - } - - if ( !read_exact( p_sys->i_socket, - p_sys->read_buffer, i_datasize ) ) - { - msg_Err( p_filter, "Could not read color map data" ); - return false; - } - - uint8_t i_red, i_green, i_blue, i_alpha, i_color_index; - uint16_t i_offset = 0; - i_alpha = 255; - - for (int i = 0; i < msg->scme.nColours; i++) - { - i_color_index = i+msg->scme.firstColour; - if ( p_sys->b_alpha_from_vnc ) - { - i_alpha = p_sys->read_buffer[i_offset]; - i_offset += 2; - } - i_red = p_sys->read_buffer[i_offset]; - i_offset += 2; - i_green = p_sys->read_buffer[i_offset]; - i_offset += 2; - i_blue = p_sys->read_buffer[i_offset]; - i_offset += 2; - rgb_to_yuv( &p_sys->ar_color_table_yuv[i_color_index][0], - &p_sys->ar_color_table_yuv[i_color_index][1], - &p_sys->ar_color_table_yuv[i_color_index][2], - i_red, - i_green, - i_blue ); - p_sys->ar_color_table_yuv[i][3] = i_alpha; - } - } - return true; - - case rfbBell: - msg_Err( p_filter, "rfbBell received" ); - return true; - - case rfbServerCutText: - msg->sct.length = htons(msg->sct.length); - if ( msg->sct.length > READ_BUFFER_SIZE ) - { - msg_Err( p_filter, "Buffer too small, need %u bytes", msg->sct.length ); - return false; - } - if ( !read_exact( p_sys->i_socket, - p_sys->read_buffer, msg->sct.length ) ) - { - msg_Err( p_filter, "Could not read Reading rfbServerCutText data" ); - return false; - } - return true; - - case rfbReSizeFrameBuffer: - msg_Err( p_filter, "Reading rfbReSizeFrameBuffer not implemented" ); - return false; - - default: - msg_Err( p_filter, "Invalid message %u received", msg->type ); - return false; - } - return false; -} - -/**************************************************************************** - * Filter: the whole thing - **************************************************************************** - * This function outputs subpictures at regular time intervals. - ****************************************************************************/ -static subpicture_t *Filter( filter_t *p_filter, vlc_tick_t date ) -{ - filter_sys_t *p_sys = p_filter->p_sys; - subpicture_t *p_spu; - subpicture_region_t *p_region; - video_format_t fmt; - picture_t *p_pic = NULL; - - vlc_mutex_lock( &p_sys->lock ); - - if( p_sys->b_need_update ) - p_pic = p_sys->p_pic; - - if( p_pic == NULL ) - { - vlc_mutex_unlock( &p_sys->lock ); - return NULL; - } - - /* Allocate the subpicture internal data. */ - p_spu = filter_NewSubpicture( p_filter ); - if( !p_spu ) - { - vlc_mutex_unlock( &p_sys->lock ); - return NULL; - } - - p_spu->b_absolute = false; - p_spu->i_start = date; - p_spu->i_stop = 0; - p_spu->b_ephemer = true; - - /* Create new SPU region */ - video_format_Init( &fmt, VLC_CODEC_YUVA ); - fmt.i_sar_num = fmt.i_sar_den = 1; - fmt.i_width = fmt.i_visible_width = p_pic->p[Y_PLANE].i_visible_pitch; - fmt.i_height = fmt.i_visible_height = p_pic->p[Y_PLANE].i_visible_lines; - fmt.i_x_offset = fmt.i_y_offset = 0; - p_region = subpicture_region_New( &fmt ); - if( !p_region ) - { - msg_Err( p_filter, "cannot allocate SPU region" ); - subpicture_Delete( p_spu ); - vlc_mutex_unlock( &p_sys->lock ); - return NULL; - } - - /* FIXME the copy is probably not needed anymore */ - picture_Copy( p_region->p_picture, p_pic ); - - p_sys->b_need_update = false; - - vlc_mutex_unlock( &p_sys->lock ); - - /* set to one of the 9 relative locations */ - p_region->i_align = 0; /* Center */ - p_spu->b_absolute = false; - - - p_spu->i_original_picture_width = 0; /*Let vout core do the horizontal scaling */ - p_spu->i_original_picture_height = fmt.i_height; - - p_spu->p_region = p_region; - - p_spu->i_alpha = ( p_sys->i_alpha ); - - return p_spu; -} - - -static inline void rgb_to_yuv( uint8_t *y, uint8_t *u, uint8_t *v, - int r, int g, int b ) -{ - *y = ( ( ( 66 * r + 129 * g + 25 * b + 128 ) >> 8 ) + 16 ); - *u = ( ( -38 * r - 74 * g + 112 * b + 128 ) >> 8 ) + 128 ; - *v = ( ( 112 * r - 94 * g - 18 * b + 128 ) >> 8 ) + 128 ; -} - -static inline bool fill_rect( filter_sys_t* p_sys, - uint16_t i_x, uint16_t i_y, - uint16_t i_w, uint16_t i_h, - uint8_t i_color) -{ - plane_t *p_outY = p_sys->p_pic->p+Y_PLANE; - plane_t *p_outU = p_sys->p_pic->p+U_PLANE; - plane_t *p_outV = p_sys->p_pic->p+V_PLANE; - plane_t *p_outA = p_sys->p_pic->p+A_PLANE; - int i_pitch = p_outY->i_pitch; - int i_lines = p_outY->i_lines; - if ( i_x + i_w > i_pitch) - return false; - if ( i_y + i_h > i_lines) - return false; - int i_line_offset = i_y * i_pitch; - uint8_t i_yuv_y = p_sys->ar_color_table_yuv[i_color][0]; - uint8_t i_yuv_u = p_sys->ar_color_table_yuv[i_color][1]; - uint8_t i_yuv_v = p_sys->ar_color_table_yuv[i_color][2]; - uint8_t i_alpha = p_sys->ar_color_table_yuv[i_color][3]; - for( int i_line = 0; i_line < i_h; i_line++ ) - { - for( int i_column = 0; i_column < i_w; i_column++ ) - { - int i_total_offset = i_line_offset + i_x + i_column; - p_outY->p_pixels[ i_total_offset ] = i_yuv_y; - p_outU->p_pixels[ i_total_offset ] = i_yuv_u; - p_outV->p_pixels[ i_total_offset ] = i_yuv_v; - p_outA->p_pixels[ i_total_offset ] = i_alpha; - } - i_line_offset += i_pitch; - } - return true; -} - -static inline bool copy_rect( filter_sys_t* p_sys, - uint16_t i_x, uint16_t i_y, - uint16_t i_w, uint16_t i_h, - uint16_t i_sx, uint16_t i_sy ) -{ - plane_t *p_Y = p_sys->p_pic->p+Y_PLANE; - plane_t *p_U = p_sys->p_pic->p+U_PLANE; - plane_t *p_V = p_sys->p_pic->p+V_PLANE; - plane_t *p_A = p_sys->p_pic->p+A_PLANE; - - int i_pitch = p_Y->i_pitch; - int i_lines = p_Y->i_lines; - - fprintf( stderr, "copy_rect: (%d,%d)+(%d,%d) -> (%d,%d)\n", i_x, i_y, i_w, i_h, i_sx, i_sy ); - - if( i_x + i_w > i_pitch || i_sx + i_w > i_pitch ) - return false; - if( i_y + i_h > i_lines || i_sy + i_h > i_lines) - return false; - - if( i_w <= 0 || i_h <= 0 ) - return true; - - uint8_t *pb_buffer = calloc( i_w * i_h, 4 ); - if( !pb_buffer ) - return false; - - for( int i_line = 0; i_line < i_h; i_line++ ) - { - for( int i_column = 0; i_column < i_w; i_column++ ) - { - const int i_src_offset = ( i_sy + i_line ) * i_pitch + i_sx + i_column; - const int i_tmp_offset = ( 0 + i_line ) * i_w + 0 + i_column; - - pb_buffer[4*i_tmp_offset + 0] = p_Y->p_pixels[i_src_offset]; - pb_buffer[4*i_tmp_offset + 1] = p_U->p_pixels[i_src_offset]; - pb_buffer[4*i_tmp_offset + 2] = p_V->p_pixels[i_src_offset]; - pb_buffer[4*i_tmp_offset + 3] = p_A->p_pixels[i_src_offset]; - } - } - - for( int i_line = 0; i_line < i_h; i_line++ ) - { - for( int i_column = 0; i_column < i_w; i_column++ ) - { - const int i_tmp_offset = ( 0 + i_line ) * i_w + 0 + i_column; - const int i_dst_offset = ( i_y + i_line ) * i_pitch + i_x + i_column; - - p_Y->p_pixels[i_dst_offset] = pb_buffer[4*i_tmp_offset + 0]; - p_U->p_pixels[i_dst_offset] = pb_buffer[4*i_tmp_offset + 1]; - p_V->p_pixels[i_dst_offset] = pb_buffer[4*i_tmp_offset + 2]; - p_A->p_pixels[i_dst_offset] = pb_buffer[4*i_tmp_offset + 3]; - } - } - free( pb_buffer ); - return true; - -} - -static inline bool raw_line( filter_sys_t* p_sys, - uint16_t i_x, uint16_t i_y, - uint16_t i_w ) -{ - plane_t *p_outY = p_sys->p_pic->p+Y_PLANE; - plane_t *p_outU = p_sys->p_pic->p+U_PLANE; - plane_t *p_outV = p_sys->p_pic->p+V_PLANE; - plane_t *p_outA = p_sys->p_pic->p+A_PLANE; - int i_pitch = p_outY->i_pitch; - int i_lines = p_outY->i_lines; - if ( i_x + i_w > i_pitch) - return false; - if ( i_y > i_lines) - return false; - - int i_line_offset = i_y * i_pitch + i_x; - - for( int i_column = 0; i_column < i_w; i_column++ ) - { - int i_offset = i_line_offset + i_column; - uint8_t i_color = p_sys->read_buffer[i_column]; - p_outY->p_pixels[ i_offset ] = p_sys->ar_color_table_yuv[i_color][0]; - p_outU->p_pixels[ i_offset ] = p_sys->ar_color_table_yuv[i_color][1]; - p_outV->p_pixels[ i_offset ] = p_sys->ar_color_table_yuv[i_color][2]; - p_outA->p_pixels[ i_offset ] = p_sys->ar_color_table_yuv[i_color][3]; - } - - return true; -} - - -/***************************************************************************** - * MouseEvent: callback for mouse events - *****************************************************************************/ -static int MouseEvent( filter_t *p_filter, - const vlc_mouse_t *p_old, - const vlc_mouse_t *p_new, - const video_format_t *p_fmt ) -{ - filter_sys_t *p_sys = p_filter->p_sys; - VLC_UNUSED(p_old); - - int i_v = p_new->i_pressed; - int i_x = p_new->i_x; - int i_y = p_new->i_y; - - vlc_mutex_lock( &p_sys->lock ); - - const int v_h = p_fmt->i_visible_height; - const int v_w = p_sys->i_vnc_width * v_h / p_sys->i_vnc_height; - const int v_x = (p_fmt->i_visible_width-v_w)/2; - - i_x -= v_x; - - if( i_y < 0 || i_x < 0 || i_y >= v_h || i_x >= v_w ) - { - vlc_mutex_unlock( &p_sys->lock ); - msg_Dbg( p_filter, "invalid mouse event? x=%d y=%d btn=%x", i_x, i_y, i_v ); - return VLC_SUCCESS; - } - - if( p_sys->i_socket == NULL ) - { - vlc_mutex_unlock( &p_sys->lock ); - return VLC_SUCCESS; - } - -#ifdef VNC_DEBUG - msg_Dbg( p_filter, "mouse event x=%d y=%d btn=%x", i_x, i_y, i_v ); -#endif - - /* */ - i_x = i_x * p_sys->i_vnc_width / v_w; - i_y = i_y * p_sys->i_vnc_height / v_h; - - /* buttonMask bits 0-7 are buttons 1-8, 0=up, 1=down */ - rfbPointerEventMsg ev; - ev.type = rfbPointerEvent; - ev.buttonMask = i_v; - ev.x = htons(i_x); - ev.y = htons(i_y); - - write_exact( p_sys->i_socket, &ev, sz_rfbPointerEventMsg); - vlc_mutex_unlock( &p_sys->lock ); - - return VLC_EGENERIC; -} - -/***************************************************************************** - * KeyEvent: callback for keyboard events - *****************************************************************************/ -static int KeyEvent( vlc_object_t *p_this, char const *psz_var, - vlc_value_t oldval, vlc_value_t newval, void *p_data ) -{ - VLC_UNUSED(psz_var); VLC_UNUSED(oldval); - - filter_t *p_filter = (filter_t *)p_data; - filter_sys_t *p_sys = p_filter->p_sys; - - msg_Dbg( p_this, "key pressed (%"PRId64") ", newval.i_int ); - - if ( !newval.i_int ) - { - msg_Err( p_this, "Received invalid key event 0" ); - return VLC_EGENERIC; - } - - vlc_mutex_lock( &p_sys->lock ); - if( p_sys->i_socket == NULL ) - { - vlc_mutex_unlock( &p_sys->lock ); - return VLC_SUCCESS; - } - - uint32_t i_key32 = newval.i_int; - i_key32 = htonl(i_key32); - rfbKeyEventMsg ev; - - ev.type = rfbKeyEvent; - ev.down = 1; - ev.pad = 0; - - /* first key-down for modifier-keys */ - if (newval.i_int & KEY_MODIFIER_CTRL) - { - ev.key = 0xffe3; - write_exact( p_sys->i_socket, &ev, sz_rfbKeyEventMsg ); - } - if (newval.i_int & KEY_MODIFIER_SHIFT) - { - ev.key = 0xffe1; - write_exact( p_sys->i_socket, &ev, sz_rfbKeyEventMsg ); - } - if (newval.i_int & KEY_MODIFIER_ALT) - { - ev.key = 0xffe9; - write_exact( p_sys->i_socket, &ev, sz_rfbKeyEventMsg ); - } - - /* then key-down for the pressed key */ - ev.key = i_key32; - write_exact( p_sys->i_socket, &ev, sz_rfbKeyEventMsg ); - - ev.down = 0; - - /* then key-up for the pressed key */ - write_exact( p_sys->i_socket, &ev, sz_rfbKeyEventMsg ); - - /* last key-down for modifier-keys */ - if (newval.i_int & KEY_MODIFIER_CTRL) - { - ev.key = 0xffe3; - write_exact( p_sys->i_socket, &ev, sz_rfbKeyEventMsg ); - } - if (newval.i_int & KEY_MODIFIER_SHIFT) - { - ev.key = 0xffe1; - write_exact( p_sys->i_socket, &ev, sz_rfbKeyEventMsg ); - } - if (newval.i_int & KEY_MODIFIER_ALT) - { - ev.key = 0xffe9; - write_exact( p_sys->i_socket, &ev, sz_rfbKeyEventMsg ); - } - vlc_mutex_unlock( &p_sys->lock ); - - return VLC_SUCCESS; -} - -static int vnc_encrypt_bytes( unsigned char *bytes, char *passwd ) -{ - unsigned char key[8]; - - for( unsigned i = 0; i < 8; i++ ) - key[i] = i < strlen( passwd ) ? passwd[i] : '\0'; - - gcry_cipher_hd_t ctx; - int err = gcry_cipher_open( &ctx, GCRY_CIPHER_DES, GCRY_CIPHER_MODE_ECB,0); - if (err) - return VLC_EGENERIC; - - /* reverse bits of the key */ - for( unsigned i = 0 ; i < 8 ; i++ ) - key[i] = - (key[i] >> 7) + - (((key[i] >> 6) & 0x01 ) << 1 ) + - (((key[i] >> 5) & 0x01 ) << 2 ) + - (((key[i] >> 4) & 0x01 ) << 3 ) + - (((key[i] >> 3) & 0x01 ) << 4 ) + - (((key[i] >> 2) & 0x01 ) << 5 ) + - (((key[i] >> 1) & 0x01 ) << 6 ) + - ((key[i] & 0x01) << 7 ); - - gcry_cipher_setkey( ctx, key, 8 ); - gcry_cipher_encrypt( ctx, bytes, CHALLENGESIZE, bytes, CHALLENGESIZE ); - gcry_cipher_close( ctx ); - return VLC_SUCCESS; -} - diff --git a/modules/spu/remoteosd_rfbproto.h b/modules/spu/remoteosd_rfbproto.h deleted file mode 100644 index c8ca85b017..0000000000 --- a/modules/spu/remoteosd_rfbproto.h +++ /dev/null @@ -1,729 +0,0 @@ -/* - * Copyright (C) 2002 RealVNC Ltd. All Rights Reserved. - * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -/* - * rfbproto.h - header file for the RFB protocol version 3.3 - * - * Uses types CARD<n> for an n-bit unsigned integer, INT<n> for an n-bit signed - * integer (for n = 8, 16 and 32). - * - * All multiple byte integers are in big endian (network) order (most - * significant byte first). Unless noted otherwise there is no special - * alignment of protocol structures. - * - * - * Once the initial handshaking is done, all messages start with a type byte, - * (usually) followed by message-specific data. The order of definitions in - * this file is as follows: - * - * (1) Structures used in several types of message. - * (2) Structures used in the initial handshaking. - * (3) Message types. - * (4) Encoding types. - * (5) For each message type, the form of the data following the type byte. - * Sometimes this is defined by a single structure but the more complex - * messages have to be explained by comments. - */ - -/***************************************************************************** - * - * Structures used in several messages - * - *****************************************************************************/ - -#include "inttypes.h" -#define CARD8 uint8_t -#define CARD16 uint16_t -#define CARD32 uint32_t - -/*----------------------------------------------------------------------------- - * Structure used to specify a rectangle. This structure is a multiple of 4 - * bytes so that it can be interspersed with 32-bit pixel data without - * affecting alignment. - */ -typedef struct { - CARD16 x; - CARD16 y; - CARD16 w; - CARD16 h; -} rfbRectangle; - -#define sz_rfbRectangle 8 - - -/*----------------------------------------------------------------------------- - * Structure used to specify pixel format. - */ - -typedef struct { - - CARD8 bitsPerPixel; /* 8,16,32 only */ - - CARD8 depth; /* 8 to 32 */ - - CARD8 bigEndian; /* True if multi-byte pixels are interpreted - as big endian, or if single-bit-per-pixel - has most significant bit of the byte - corresponding to first (leftmost) pixel. Of - course this is meaningless for 8 bits/pix */ - - CARD8 trueColour; /* If false then we need a "colour map" to - convert pixels to RGB. If true, xxxMax and - xxxShift specify bits used for red, green - and blue */ - - /* the following fields are only meaningful if trueColour is true */ - - CARD16 redMax; /* maximum red value (= 2^n - 1 where n is the - number of bits used for red). Note this - value is always in big endian order. */ - - CARD16 greenMax; /* similar for green */ - - CARD16 blueMax; /* and blue */ - - CARD8 redShift; /* number of shifts needed to get the red - value in a pixel to the least significant - bit. To find the red value from a given - pixel, do the following: - 1) Swap pixel value according to bigEndian - (e.g. if bigEndian is false and host byte - order is big endian, then swap). - 2) Shift right by redShift. - 3) AND with redMax (in host byte order). - 4) You now have the red value between 0 and - redMax. */ - - CARD8 greenShift; /* similar for green */ - - CARD8 blueShift; /* and blue */ - - CARD8 pad1; - CARD16 pad2; - -} rfbPixelFormat; - -#define sz_rfbPixelFormat 16 - - - -/***************************************************************************** - * - * Initial handshaking messages - * - *****************************************************************************/ - -/*----------------------------------------------------------------------------- - * Protocol Version - * - * The server always sends 12 bytes to start which identifies the latest RFB - * protocol version number which it supports. These bytes are interpreted - * as a string of 12 ASCII characters in the format "RFB xxx.yyy\n" where - * xxx and yyy are the major and minor version numbers (for version 3.3 - * this is "RFB 003.003\n"). - * - * The client then replies with a similar 12-byte message giving the version - * number of the protocol which should actually be used (which may be different - * to that quoted by the server). - * - * It is intended that both clients and servers may provide some level of - * backwards compatibility by this mechanism. Servers in particular should - * attempt to provide backwards compatibility, and even forwards compatibility - * to some extent. For example if a client demands version 3.1 of the - * protocol, a 3.0 server can probably assume that by ignoring requests for - * encoding types it doesn't understand, everything will still work OK. This - * will probably not be the case for changes in the major version number. - * - * The format string below can be used in sprintf or sscanf to generate or - * decode the version string respectively. - */ - -#define rfbProtocolVersionFormat "RFB %03d.%03d\n" -#define rfbProtocolMajorVersion 3 -#define rfbProtocolMinorVersion 3 - -typedef char rfbProtocolVersionMsg[13]; /* allow extra byte for null */ - -#define sz_rfbProtocolVersionMsg 12 - - -/*----------------------------------------------------------------------------- - * Authentication - * - * Once the protocol version has been decided, the server then sends a 32-bit - * word indicating whether any authentication is needed on the connection. - * The value of this word determines the authentication scheme in use. For - * version 3.0 of the protocol this may have one of the following values: - */ - -#define rfbConnFailed 0 -#define rfbNoAuth 1 -#define rfbVncAuth 2 - -/* - * rfbConnFailed: For some reason the connection failed (e.g. the server - * cannot support the desired protocol version). This is - * followed by a string describing the reason (where a - * string is specified as a 32-bit length followed by that - * many ASCII characters). - * - * rfbNoAuth: No authentication is needed. - * - * rfbVncAuth: The VNC authentication scheme is to be used. A 16-byte - * challenge follows, which the client encrypts as - * appropriate using the password and sends the resulting - * 16-byte response. If the response is correct, the - * server sends the 32-bit word rfbVncAuthOK. If a simple - * failure happens, the server sends rfbVncAuthFailed and - * closes the connection. If the server decides that too - * many failures have occurred, it sends rfbVncAuthTooMany - * and closes the connection. In the latter case, the - * server should not allow an immediate reconnection by - * the client. - */ - -#define rfbVncAuthOK 0 -#define rfbVncAuthFailed 1 -#define rfbVncAuthTooMany 2 - - -/*----------------------------------------------------------------------------- - * Client Initialisation Message - * - * Once the client and server are sure that they're happy to talk to one - * another, the client sends an initialisation message. At present this - * message only consists of a boolean indicating whether the server should try - * to share the desktop by leaving other clients connected, or give exclusive - * access to this client by disconnecting all other clients. - */ - -typedef struct { - CARD8 shared; -} rfbClientInitMsg; - -#define sz_rfbClientInitMsg 1 - - -/*----------------------------------------------------------------------------- - * Server Initialisation Message - * - * After the client initialisation message, the server sends one of its own. - * This tells the client the width and height of the server's framebuffer, - * its pixel format and the name associated with the desktop. - */ - -typedef struct { - CARD16 framebufferWidth; - CARD16 framebufferHeight; - rfbPixelFormat format; /* the server's preferred pixel format */ - CARD32 nameLength; - /* followed by char name[nameLength] */ -} rfbServerInitMsg; - -#define sz_rfbServerInitMsg (8 + sz_rfbPixelFormat) - - -/* - * Following the server initialisation message it's up to the client to send - * whichever protocol messages it wants. Typically it will send a - * SetPixelFormat message and a SetEncodings message, followed by a - * FramebufferUpdateRequest. From then on the server will send - * FramebufferUpdate messages in response to the client's - * FramebufferUpdateRequest messages. The client should send - * FramebufferUpdateRequest messages with incremental set to true when it has - * finished processing one FramebufferUpdate and is ready to process another. - * With a fast client, the rate at which FramebufferUpdateRequests are sent - * should be regulated to avoid hogging the network. - */ - - - -/***************************************************************************** - * - * Message types - * - *****************************************************************************/ - -/* server -> client */ - -#define rfbFramebufferUpdate 0 -#define rfbSetColourMapEntries 1 -#define rfbBell 2 -#define rfbServerCutText 3 -#define rfbReSizeFrameBuffer 0xF - - -/* client -> server */ - -#define rfbSetPixelFormat 0 -#define rfbFixColourMapEntries 1 /* not currently supported */ -#define rfbSetEncodings 2 -#define rfbFramebufferUpdateRequest 3 -#define rfbKeyEvent 4 -#define rfbPointerEvent 5 -#define rfbClientCutText 6 -#define rfbSetScaleFactor 0xF - - - - -/***************************************************************************** - * - * Encoding types - * - *****************************************************************************/ - -#define rfbEncodingRaw 0 -#define rfbEncodingCopyRect 1 -#define rfbEncodingRRE 2 -#define rfbEncodingCoRRE 4 -#define rfbEncodingHextile 5 -#define rfbEncodingZRLE 16 - - - -/***************************************************************************** - * - * Server -> client message definitions - * - *****************************************************************************/ - - -/*----------------------------------------------------------------------------- - * FramebufferUpdate - a block of rectangles to be copied to the framebuffer. - * - * This message consists of a header giving the number of rectangles of pixel - * data followed by the rectangles themselves. The header is padded so that - * together with the type byte it is an exact multiple of 4 bytes (to help - * with alignment of 32-bit pixels): - */ - -typedef struct { - CARD8 type; /* always rfbFramebufferUpdate */ - CARD8 pad; - CARD16 nRects; - /* followed by nRects rectangles */ -} rfbFramebufferUpdateMsg; - -#define sz_rfbFramebufferUpdateMsg 4 - -/* - * Each rectangle of pixel data consists of a header describing the position - * and size of the rectangle and a type word describing the encoding of the - * pixel data, followed finally by the pixel data. Note that if the client has - * not sent a SetEncodings message then it will only receive raw pixel data. - * Also note again that this structure is a multiple of 4 bytes. - */ - -typedef struct { - rfbRectangle r; - CARD32 encoding; /* one of the encoding types rfbEncoding... */ -} rfbFramebufferUpdateRectHeader; - -#define sz_rfbFramebufferUpdateRectHeader (sz_rfbRectangle + 4) - - -/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Raw Encoding. Pixels are sent in top-to-bottom scanline order, - * left-to-right within a scanline with no padding in between. - */ - - -/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * CopyRect Encoding. The pixels are specified simply by the x and y position - * of the source rectangle. - */ - -typedef struct { - CARD16 srcX; - CARD16 srcY; -} rfbCopyRect; - -#define sz_rfbCopyRect 4 - - -/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * RRE - Rise-and-Run-length Encoding. We have an rfbRREHeader structure - * giving the number of subrectangles following. Finally the data follows in - * the form [<bgpixel><subrect><subrect>...] where each <subrect> is - * [<pixel><rfbRectangle>]. - */ - -typedef struct { - CARD32 nSubrects; -} rfbRREHeader; - -#define sz_rfbRREHeader 4 - - -/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * CoRRE - Compact RRE Encoding. We have an rfbRREHeader structure giving - * the number of subrectangles following. Finally the data follows in the form - * [<bgpixel><subrect><subrect>...] where each <subrect> is - * [<pixel><rfbCoRRERectangle>]. This means that - * the whole rectangle must be at most 255x255 pixels. - */ - -typedef struct { - CARD8 x; - CARD8 y; - CARD8 w; - CARD8 h; -} rfbCoRRERectangle; - -#define sz_rfbCoRRERectangle 4 - - -/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Hextile Encoding. The rectangle is divided up into "tiles" of 16x16 pixels, - * starting at the top left going in left-to-right, top-to-bottom order. If - * the width of the rectangle is not an exact multiple of 16 then the width of - * the last tile in each row will be correspondingly smaller. Similarly if the - * height is not an exact multiple of 16 then the height of each tile in the - * final row will also be smaller. Each tile begins with a "subencoding" type - * byte, which is a mask made up of a number of bits. If the Raw bit is set - * then the other bits are irrelevant; w*h pixel values follow (where w and h - * are the width and height of the tile). Otherwise the tile is encoded in a - * similar way to RRE, except that the position and size of each subrectangle - * can be specified in just two bytes. The other bits in the mask are as - * follows: - * - * BackgroundSpecified - if set, a pixel value follows which specifies - * the background colour for this tile. The first non-raw tile in a - * rectangle must have this bit set. If this bit isn't set then the - * background is the same as the last tile. - * - * ForegroundSpecified - if set, a pixel value follows which specifies - * the foreground colour to be used for all subrectangles in this tile. - * If this bit is set then the SubrectsColoured bit must be zero. - * - * AnySubrects - if set, a single byte follows giving the number of - * subrectangles following. If not set, there are no subrectangles (i.e. - * the whole tile is just solid background colour). - * - * SubrectsColoured - if set then each subrectangle is preceded by a pixel - * value giving the colour of that subrectangle. If not set, all - * subrectangles are the same colour, the foreground colour; if the - * ForegroundSpecified bit wasn't set then the foreground is the same as - * the last tile. - * - * The position and size of each subrectangle is specified in two bytes. The - * Pack macros below can be used to generate the two bytes from x, y, w, h, - * and the Extract macros can be used to extract the x, y, w, h values from - * the two bytes. - */ - -#define rfbHextileRaw (1 << 0) -#define rfbHextileBackgroundSpecified (1 << 1) -#define rfbHextileForegroundSpecified (1 << 2) -#define rfbHextileAnySubrects (1 << 3) -#define rfbHextileSubrectsColoured (1 << 4) - -#define rfbHextilePackXY(x,y) (((x) << 4) | (y)) -#define rfbHextilePackWH(w,h) ((((w)-1) << 4) | ((h)-1)) -#define rfbHextileExtractX(byte) ((byte) >> 4) -#define rfbHextileExtractY(byte) ((byte) & 0xf) -#define rfbHextileExtractW(byte) (((byte) >> 4) + 1) -#define rfbHextileExtractH(byte) (((byte) & 0xf) + 1) - - -/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * ZRLE - encoding combining Zlib compression, tiling, palettisation and - * run-length encoding. - */ - -typedef struct { - CARD32 length; -} rfbZRLEHeader; - -#define sz_rfbZRLEHeader 4 - -#define rfbZRLETileWidth 64 -#define rfbZRLETileHeight 64 - - -/*----------------------------------------------------------------------------- - * SetColourMapEntries - these messages are only sent if the pixel - * format uses a "colour map" (i.e. trueColour false) and the client has not - * fixed the entire colour map using FixColourMapEntries. In addition they - * will only start being sent after the client has sent its first - * FramebufferUpdateRequest. So if the client always tells the server to use - * trueColour then it never needs to process this type of message. - */ - -typedef struct { - CARD8 type; /* always rfbSetColourMapEntries */ - CARD8 pad; - CARD16 firstColour; - CARD16 nColours; - - /* Followed by nColours * 3 * CARD16 - r1, g1, b1, r2, g2, b2, r3, g3, b3, ..., rn, bn, gn */ - -} rfbSetColourMapEntriesMsg; - -#define sz_rfbSetColourMapEntriesMsg 6 - - - -/*----------------------------------------------------------------------------- - * Bell - ring a bell on the client if it has one. - */ - -typedef struct { - CARD8 type; /* always rfbBell */ -} rfbBellMsg; - -#define sz_rfbBellMsg 1 - - - -/*----------------------------------------------------------------------------- - * ServerCutText - the server has new text in its cut buffer. - */ - -typedef struct { - CARD8 type; /* always rfbServerCutText */ - CARD8 pad1; - CARD16 pad2; - CARD32 length; - /* followed by char text[length] */ -} rfbServerCutTextMsg; - -#define sz_rfbServerCutTextMsg 8 - -/*----------------------------------------------------------------------------- - * ReSizeFrameBuffer - tell the RFB client to alter its framebuffer, either - * due to a resize of the server desktop or a client-requested scaling factor. - * The pixel format remains unchanged. - */ - -typedef struct { - CARD8 type; /* always rfbReSizeFrameBuffer */ - CARD8 pad1; - CARD16 desktop_w; /* Desktop width */ - CARD16 desktop_h; /* Desktop height */ - CARD16 buffer_w; /* FrameBuffer width */ - CARD16 buffer_h; /* Framebuffer height */ - CARD16 pad2; - -} rfbReSizeFrameBufferMsg; - -#define sz_rfbReSizeFrameBufferMsg (12) - - - -/*----------------------------------------------------------------------------- - * Union of all server->client messages. - */ - -typedef union { - CARD8 type; - rfbFramebufferUpdateMsg fu; - rfbSetColourMapEntriesMsg scme; - rfbBellMsg b; - rfbServerCutTextMsg sct; - rfbReSizeFrameBufferMsg rsfb; -} rfbServerToClientMsg; - - - -/***************************************************************************** - * - * Message definitions (client -> server) - * - *****************************************************************************/ - - -/*----------------------------------------------------------------------------- - * SetPixelFormat - tell the RFB server the format in which the client wants - * pixels sent. - */ - -typedef struct { - CARD8 type; /* always rfbSetPixelFormat */ - CARD8 pad1; - CARD16 pad2; - rfbPixelFormat format; -} rfbSetPixelFormatMsg; - -#define sz_rfbSetPixelFormatMsg (sz_rfbPixelFormat + 4) - - -/*----------------------------------------------------------------------------- - * FixColourMapEntries - when the pixel format uses a "colour map", fix - * read-only colour map entries. - * - * ***************** NOT CURRENTLY SUPPORTED ***************** - */ - -typedef struct { - CARD8 type; /* always rfbFixColourMapEntries */ - CARD8 pad; - CARD16 firstColour; - CARD16 nColours; - - /* Followed by nColours * 3 * CARD16 - r1, g1, b1, r2, g2, b2, r3, g3, b3, ..., rn, bn, gn */ - -} rfbFixColourMapEntriesMsg; - -#define sz_rfbFixColourMapEntriesMsg 6 - - -/*----------------------------------------------------------------------------- - * SetEncodings - tell the RFB server which encoding types we accept. Put them - * in order of preference, if we have any. We may always receive raw - * encoding, even if we don't specify it here. - */ - -typedef struct { - CARD8 type; /* always rfbSetEncodings */ - CARD8 pad; - CARD16 nEncodings; - /* followed by nEncodings * CARD32 encoding types */ -} rfbSetEncodingsMsg; - -#define sz_rfbSetEncodingsMsg 4 - -/*----------------------------------------------------------------------------- - * SetScaleFactor - tell the RFB server to alter the scale factor for the - * client buffer. - */ - -typedef struct { - CARD8 type; /* always rfbSetScaleFactor */ - CARD8 scale; /* Scale factor (positive non-zero integer) */ - CARD16 pad2; -} rfbSetScaleFactorMsg; - -#define sz_rfbSetScaleFactorMsg (4) - -/*----------------------------------------------------------------------------- - * FramebufferUpdateRequest - request for a framebuffer update. If incremental - * is true then the client just wants the changes since the last update. If - * false then it wants the whole of the specified rectangle. - */ - -typedef struct { - CARD8 type; /* always rfbFramebufferUpdateRequest */ - CARD8 incremental; - CARD16 x; - CARD16 y; - CARD16 w; - CARD16 h; -} rfbFramebufferUpdateRequestMsg; - -#define sz_rfbFramebufferUpdateRequestMsg 10 - - -/*----------------------------------------------------------------------------- - * KeyEvent - key press or release - * - * Keys are specified using the "keysym" values defined by the X Window System. - * For most ordinary keys, the keysym is the same as the corresponding ASCII - * value. Other common keys are: - * - * BackSpace 0xff08 - * Tab 0xff09 - * Return or Enter 0xff0d - * Escape 0xff1b - * Insert 0xff63 - * Delete 0xffff - * Home 0xff50 - * End 0xff57 - * Page Up 0xff55 - * Page Down 0xff56 - * Left 0xff51 - * Up 0xff52 - * Right 0xff53 - * Down 0xff54 - * F1 0xffbe - * F2 0xffbf - * ... ... - * F12 0xffc9 - * Shift 0xffe1 - * Control 0xffe3 - * Meta 0xffe7 - * Alt 0xffe9 - */ - -typedef struct { - CARD8 type; /* always rfbKeyEvent */ - CARD8 down; /* true if down (press), false if up */ - CARD16 pad; - CARD32 key; /* key is specified as an X keysym */ -} rfbKeyEventMsg; - -#define sz_rfbKeyEventMsg 8 - - -/*----------------------------------------------------------------------------- - * PointerEvent - mouse/pen move and/or button press. - */ - -typedef struct { - CARD8 type; /* always rfbPointerEvent */ - CARD8 buttonMask; /* bits 0-7 are buttons 1-8, 0=up, 1=down */ - CARD16 x; - CARD16 y; -} rfbPointerEventMsg; - -#define rfbButton1Mask 1 -#define rfbButton2Mask 2 -#define rfbButton3Mask 4 -#define rfbButton4Mask 8 -#define rfbButton5Mask 16 -#define rfbWheelUpMask rfbButton4Mask -#define rfbWheelDownMask rfbButton5Mask - -#define sz_rfbPointerEventMsg 6 - - - -/*----------------------------------------------------------------------------- - * ClientCutText - the client has new text in its cut buffer. - */ - -typedef struct { - CARD8 type; /* always rfbClientCutText */ - CARD8 pad1; - CARD16 pad2; - CARD32 length; - /* followed by char text[length] */ -} rfbClientCutTextMsg; - -#define sz_rfbClientCutTextMsg 8 - -/*----------------------------------------------------------------------------- - * Union of all client->server messages. - */ - -typedef union { - CARD8 type; - rfbSetPixelFormatMsg spf; - rfbSetScaleFactorMsg ssf; - rfbFixColourMapEntriesMsg fcme; - rfbSetEncodingsMsg se; - rfbFramebufferUpdateRequestMsg fur; - rfbKeyEventMsg ke; - rfbPointerEventMsg pe; - rfbClientCutTextMsg cct; -} rfbClientToServerMsg; diff --git a/po/POTFILES.in b/po/POTFILES.in index e7a9f0e948..5c6b2725b2 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1090,7 +1090,6 @@ modules/spu/dynamicoverlay/dynamicoverlay.c modules/spu/logo.c modules/spu/marq.c modules/spu/mosaic.c -modules/spu/remoteosd.c modules/spu/rss.c modules/spu/subsdelay.c modules/stream_extractor/archive.c _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
