20#ifndef FREERDP_SERVER_SHADOW_H
21#define FREERDP_SERVER_SHADOW_H
23#include <freerdp/api.h>
24#include <freerdp/types.h>
26#include <freerdp/freerdp.h>
27#include <freerdp/settings.h>
28#include <freerdp/listener.h>
30#include <freerdp/channels/wtsvc.h>
31#include <freerdp/channels/channels.h>
33#include <freerdp/server/encomsp.h>
34#include <freerdp/server/remdesk.h>
35#include <freerdp/server/rdpsnd.h>
36#if defined(CHANNEL_AUDIN_SERVER)
37#include <freerdp/server/audin.h>
39#include <freerdp/server/rdpgfx.h>
41#include <freerdp/codec/color.h>
42#include <freerdp/codec/region.h>
45#include <winpr/synch.h>
46#include <winpr/collections.h>
47#include <winpr/cmdline.h>
61 typedef struct rdp_shadow_multiclient_event rdpShadowMultiClientEvent;
64 typedef int (*pfnShadowSubsystemEntry)(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
66 typedef rdpShadowSubsystem* (*pfnShadowSubsystemNew)(void);
67 typedef void (*pfnShadowSubsystemFree)(rdpShadowSubsystem* subsystem);
69 typedef int (*pfnShadowSubsystemInit)(rdpShadowSubsystem* subsystem);
70 typedef int (*pfnShadowSubsystemUninit)(rdpShadowSubsystem* subsystem);
72 typedef int (*pfnShadowSubsystemStart)(rdpShadowSubsystem* subsystem);
73 typedef int (*pfnShadowSubsystemStop)(rdpShadowSubsystem* subsystem);
75 typedef UINT32 (*pfnShadowEnumMonitors)(
MONITOR_DEF* monitors, UINT32 maxMonitors);
77 typedef int (*pfnShadowAuthenticate)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
78 const char* user,
const char* domain,
79 const char* password);
80 typedef BOOL (*pfnShadowClientConnect)(rdpShadowSubsystem* subsystem, rdpShadowClient* client);
81 typedef void (*pfnShadowClientDisconnect)(rdpShadowSubsystem* subsystem,
82 rdpShadowClient* client);
83 typedef BOOL (*pfnShadowClientCapabilities)(rdpShadowSubsystem* subsystem,
84 rdpShadowClient* client);
86 typedef BOOL (*pfnShadowSynchronizeEvent)(rdpShadowSubsystem* subsystem,
87 rdpShadowClient* client, UINT32 flags);
88 typedef BOOL (*pfnShadowKeyboardEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
89 UINT16 flags, UINT8 code);
90 typedef BOOL (*pfnShadowUnicodeKeyboardEvent)(rdpShadowSubsystem* subsystem,
91 rdpShadowClient* client, UINT16 flags,
93 typedef BOOL (*pfnShadowMouseEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
94 UINT16 flags, UINT16 x, UINT16 y);
95 typedef BOOL (*pfnShadowRelMouseEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
96 UINT16 flags, INT16 xDelta,
99 typedef BOOL (*pfnShadowExtendedMouseEvent)(rdpShadowSubsystem* subsystem,
100 rdpShadowClient* client, UINT16 flags, UINT16 x,
103 typedef BOOL (*pfnShadowChannelAudinServerReceiveSamples)(rdpShadowSubsystem* subsystem,
104 rdpShadowClient* client,
120 wMessageQueue* MsgQueue;
123 rdpShadowServer* server;
124 rdpShadowEncoder* encoder;
125 rdpShadowSubsystem* subsystem;
131 EncomspServerContext* encomsp;
132 RemdeskServerContext* remdesk;
133 RdpsndServerContext* rdpsnd;
134#if defined(CHANNEL_AUDIN_SERVER)
135 audin_server_context* audin;
137 RdpgfxServerContext* rdpgfx;
139 BOOL resizeRequested;
142 BOOL areGfxCapsReady;
152 rdpSettings* settings;
153 rdpShadowScreen* screen;
154 rdpShadowSurface* surface;
155 rdpShadowSurface* lobby;
156 rdpShadowCapture* capture;
157 rdpShadowSubsystem* subsystem;
164 UINT32 selectedMonitor;
169 H264_RATECONTROL_MODE h264RateControlMode;
171 UINT32 h264FrameRate;
176 char* CertificateFile;
177 char* PrivateKeyFile;
179 freerdp_listener* listener;
181 size_t maxClientsConnected;
182 BOOL SupportMultiRectBitmapUpdates;
184#if defined(WITH_GFX_AV1)
185 FREERDP_AV1_RATECONTROL AV1RateControlMode;
195 rdpShadowServer* server;
211 WINPR_ATTR_NODISCARD pfnShadowSubsystemNew New;
212 pfnShadowSubsystemFree Free;
214 WINPR_ATTR_NODISCARD pfnShadowSubsystemInit Init;
215 pfnShadowSubsystemUninit Uninit;
217 WINPR_ATTR_NODISCARD pfnShadowSubsystemStart Start;
218 pfnShadowSubsystemStop Stop;
220 WINPR_ATTR_NODISCARD pfnShadowEnumMonitors EnumMonitors;
225 RDP_SHADOW_ENTRY_POINTS ep;
228 UINT32 captureFrameRate;
229 UINT32 selectedMonitor;
236 rdpShadowMultiClientEvent* updateEvent;
243 size_t nRdpsndFormats;
245 size_t nAudinFormats;
247 WINPR_ATTR_NODISCARD pfnShadowSynchronizeEvent SynchronizeEvent;
248 WINPR_ATTR_NODISCARD pfnShadowKeyboardEvent KeyboardEvent;
249 WINPR_ATTR_NODISCARD pfnShadowUnicodeKeyboardEvent UnicodeKeyboardEvent;
250 WINPR_ATTR_NODISCARD pfnShadowMouseEvent MouseEvent;
251 WINPR_ATTR_NODISCARD pfnShadowExtendedMouseEvent ExtendedMouseEvent;
252 WINPR_ATTR_NODISCARD pfnShadowChannelAudinServerReceiveSamples AudinServerReceiveSamples;
254 WINPR_ATTR_NODISCARD pfnShadowAuthenticate Authenticate;
255 WINPR_ATTR_NODISCARD pfnShadowClientConnect ClientConnect;
256 pfnShadowClientDisconnect ClientDisconnect;
257 WINPR_ATTR_NODISCARD pfnShadowClientCapabilities ClientCapabilities;
259 rdpShadowServer* server;
261 WINPR_ATTR_NODISCARD pfnShadowRelMouseEvent RelMouseEvent;
265#define SHADOW_MSG_IN_REFRESH_REQUEST_ID 1001
268 typedef void (*MSG_OUT_FREE_FN)(UINT32 id,
269 SHADOW_MSG_OUT* msg);
274 MSG_OUT_FREE_FN Free;
277#define SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID 2001
278#define SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID 2002
279#define SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID 2003
280#define SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID 2004
284 SHADOW_MSG_OUT common;
291 SHADOW_MSG_OUT common;
296 UINT32 lengthAndMask;
297 UINT32 lengthXorMask;
304 SHADOW_MSG_OUT common;
313 SHADOW_MSG_OUT common;
318 FREERDP_API
void shadow_subsystem_set_entry_builtin(
const char* name);
319 FREERDP_API
void shadow_subsystem_set_entry(pfnShadowSubsystemEntry pEntry);
321#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
322 WINPR_DEPRECATED_VAR(
323 "[since 3.4.0] Use shadow_subsystem_pointer_convert_alpha_pointer_data_to_format instead",
324 WINPR_ATTR_NODISCARD FREERDP_API
int shadow_subsystem_pointer_convert_alpha_pointer_data(
325 const BYTE* WINPR_RESTRICT pixels, BOOL premultiplied, UINT32 width, UINT32 height,
343 FREERDP_API
int shadow_subsystem_pointer_convert_alpha_pointer_data_to_format(
344 const BYTE* WINPR_RESTRICT pixels, UINT32 format, BOOL premultiplied, UINT32 width,
348 FREERDP_API
int shadow_server_parse_command_line(rdpShadowServer* server,
int argc,
char** argv,
352 FREERDP_API
int shadow_server_command_line_status_print(rdpShadowServer* server,
int argc,
353 char** argv,
int status,
357 FREERDP_API
int shadow_server_start(rdpShadowServer* server);
359 FREERDP_API
int shadow_server_stop(rdpShadowServer* server);
362 FREERDP_API
int shadow_server_init(rdpShadowServer* server);
364 FREERDP_API
int shadow_server_uninit(rdpShadowServer* server);
367 FREERDP_API UINT32 shadow_enum_monitors(
MONITOR_DEF* monitors, UINT32 maxMonitors);
369 FREERDP_API
void shadow_server_free(rdpShadowServer* server);
371 WINPR_ATTR_MALLOC(shadow_server_free, 1)
373 FREERDP_API rdpShadowServer* shadow_server_new(
void);
378#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
379 WINPR_DEPRECATED_VAR(
"[since 3.4.0] Use shadow_capture_compare_with_format",
380 WINPR_ATTR_NODISCARD FREERDP_API
int shadow_capture_compare(
381 const BYTE* WINPR_RESTRICT pData1, UINT32 nStep1, UINT32 nWidth,
382 UINT32 nHeight,
const BYTE* WINPR_RESTRICT pData2, UINT32 nStep2,
403 FREERDP_API
int shadow_capture_compare_with_format(
const BYTE* WINPR_RESTRICT pData1,
404 UINT32 format1, UINT32 nStep1, UINT32 nWidth,
406 const BYTE* WINPR_RESTRICT pData2,
407 UINT32 format2, UINT32 nStep2,
410 FREERDP_API
void shadow_subsystem_frame_update(rdpShadowSubsystem* subsystem);
413 FREERDP_API BOOL shadow_client_post_msg(rdpShadowClient* client,
void* context, UINT32 type,
414 SHADOW_MSG_OUT* msg,
void* lParam);
417 FREERDP_API
int shadow_client_boardcast_msg(rdpShadowServer* server,
void* context, UINT32 type,
418 SHADOW_MSG_OUT* msg,
void* lParam);
421 FREERDP_API
int shadow_client_boardcast_quit(rdpShadowServer* server,
int nExitCode);
424 FREERDP_API UINT32 shadow_encoder_preferred_fps(rdpShadowEncoder* encoder);
427 FREERDP_API UINT32 shadow_encoder_inflight_frames(rdpShadowEncoder* encoder);
430 FREERDP_API BOOL shadow_screen_resize(rdpShadowScreen* screen);
RDPGFX_CAPSET confirmedCaps