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#if defined(CHANNEL_CLIPRDR_SERVER)
40#include <freerdp/server/cliprdr.h>
42#include <freerdp/server/rdpgfx.h>
44#include <freerdp/codec/color.h>
45#include <freerdp/codec/region.h>
48#include <winpr/synch.h>
49#include <winpr/collections.h>
50#include <winpr/cmdline.h>
64 typedef struct rdp_shadow_multiclient_event rdpShadowMultiClientEvent;
65 typedef struct rdp_shadow_clipboard rdpShadowClipboard;
68 typedef int (*pfnShadowSubsystemEntry)(RDP_SHADOW_ENTRY_POINTS* pEntryPoints);
70 typedef rdpShadowSubsystem* (*pfnShadowSubsystemNew)(void);
71 typedef void (*pfnShadowSubsystemFree)(rdpShadowSubsystem* subsystem);
73 typedef int (*pfnShadowSubsystemInit)(rdpShadowSubsystem* subsystem);
74 typedef int (*pfnShadowSubsystemUninit)(rdpShadowSubsystem* subsystem);
76 typedef int (*pfnShadowSubsystemStart)(rdpShadowSubsystem* subsystem);
77 typedef int (*pfnShadowSubsystemStop)(rdpShadowSubsystem* subsystem);
79 typedef UINT32 (*pfnShadowEnumMonitors)(
MONITOR_DEF* monitors, UINT32 maxMonitors);
81 typedef int (*pfnShadowAuthenticate)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
82 const char* user,
const char* domain,
83 const char* password);
84 typedef BOOL (*pfnShadowClientConnect)(rdpShadowSubsystem* subsystem, rdpShadowClient* client);
85 typedef void (*pfnShadowClientDisconnect)(rdpShadowSubsystem* subsystem,
86 rdpShadowClient* client);
87 typedef BOOL (*pfnShadowClientCapabilities)(rdpShadowSubsystem* subsystem,
88 rdpShadowClient* client);
90 typedef BOOL (*pfnShadowSynchronizeEvent)(rdpShadowSubsystem* subsystem,
91 rdpShadowClient* client, UINT32 flags);
92 typedef BOOL (*pfnShadowKeyboardEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
93 UINT16 flags, UINT8 code);
94 typedef BOOL (*pfnShadowUnicodeKeyboardEvent)(rdpShadowSubsystem* subsystem,
95 rdpShadowClient* client, UINT16 flags,
97 typedef BOOL (*pfnShadowMouseEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
98 UINT16 flags, UINT16 x, UINT16 y);
99 typedef BOOL (*pfnShadowRelMouseEvent)(rdpShadowSubsystem* subsystem, rdpShadowClient* client,
100 UINT16 flags, INT16 xDelta,
103 typedef BOOL (*pfnShadowExtendedMouseEvent)(rdpShadowSubsystem* subsystem,
104 rdpShadowClient* client, UINT16 flags, UINT16 x,
107 typedef BOOL (*pfnShadowChannelAudinServerReceiveSamples)(rdpShadowSubsystem* subsystem,
108 rdpShadowClient* client,
119#define SHADOW_CLIPBOARD_MAX_SIZE (256ull * 1024ull * 1024ull)
123 typedef BOOL (*pfnShadowClipboardOffer)(rdpShadowSubsystem* subsystem,
124 const char*
const* mimeTypes,
size_t count);
128 typedef BOOL (*pfnShadowClipboardRead)(rdpShadowSubsystem* subsystem,
const char* mimeType);
132 typedef BOOL (*pfnShadowClipboardProvide)(rdpShadowSubsystem* subsystem, UINT32 request,
133 const BYTE* data,
size_t size);
147 wMessageQueue* MsgQueue;
150 rdpShadowServer* server;
151 rdpShadowEncoder* encoder;
152 rdpShadowSubsystem* subsystem;
158 EncomspServerContext* encomsp;
159 RemdeskServerContext* remdesk;
160 RdpsndServerContext* rdpsnd;
161#if defined(CHANNEL_AUDIN_SERVER)
162 audin_server_context* audin;
164 RdpgfxServerContext* rdpgfx;
165#if defined(CHANNEL_CLIPRDR_SERVER)
166 CliprdrServerContext* cliprdr;
169 BOOL resizeRequested;
172 BOOL areGfxCapsReady;
193 rdpSettings* settings;
194 rdpShadowScreen* screen;
195 rdpShadowSurface* surface;
196 rdpShadowSurface* lobby;
197 rdpShadowCapture* capture;
198 rdpShadowSubsystem* subsystem;
205 UINT32 selectedMonitor;
210 H264_RATECONTROL_MODE h264RateControlMode;
212 UINT32 h264FrameRate;
217 char* CertificateFile;
218 char* PrivateKeyFile;
220 freerdp_listener* listener;
222 size_t maxClientsConnected;
223 BOOL SupportMultiRectBitmapUpdates;
225#if defined(WITH_GFX_AV1)
226 FREERDP_AV1_RATECONTROL AV1RateControlMode;
235#if defined(WITH_GFX_AV2)
236 FREERDP_AV2_RATECONTROL AV2RateControlMode;
239 UINT32 reservedAV2[2];
241 rdpShadowClipboard* clipboard;
246 rdpShadowServer* server;
262 WINPR_ATTR_NODISCARD pfnShadowSubsystemNew New;
263 pfnShadowSubsystemFree Free;
265 WINPR_ATTR_NODISCARD pfnShadowSubsystemInit Init;
266 pfnShadowSubsystemUninit Uninit;
268 WINPR_ATTR_NODISCARD pfnShadowSubsystemStart Start;
269 pfnShadowSubsystemStop Stop;
271 WINPR_ATTR_NODISCARD pfnShadowEnumMonitors EnumMonitors;
276 RDP_SHADOW_ENTRY_POINTS ep;
279 UINT32 captureFrameRate;
280 UINT32 selectedMonitor;
287 rdpShadowMultiClientEvent* updateEvent;
294 size_t nRdpsndFormats;
296 size_t nAudinFormats;
298 WINPR_ATTR_NODISCARD pfnShadowSynchronizeEvent SynchronizeEvent;
299 WINPR_ATTR_NODISCARD pfnShadowKeyboardEvent KeyboardEvent;
300 WINPR_ATTR_NODISCARD pfnShadowUnicodeKeyboardEvent UnicodeKeyboardEvent;
301 WINPR_ATTR_NODISCARD pfnShadowMouseEvent MouseEvent;
302 WINPR_ATTR_NODISCARD pfnShadowExtendedMouseEvent ExtendedMouseEvent;
303 WINPR_ATTR_NODISCARD pfnShadowChannelAudinServerReceiveSamples AudinServerReceiveSamples;
305 WINPR_ATTR_NODISCARD pfnShadowAuthenticate Authenticate;
306 WINPR_ATTR_NODISCARD pfnShadowClientConnect ClientConnect;
307 pfnShadowClientDisconnect ClientDisconnect;
308 WINPR_ATTR_NODISCARD pfnShadowClientCapabilities ClientCapabilities;
310 rdpShadowServer* server;
312 WINPR_ATTR_NODISCARD pfnShadowRelMouseEvent RelMouseEvent;
317 WINPR_ATTR_NODISCARD pfnShadowClipboardProvide
322#define SHADOW_MSG_IN_REFRESH_REQUEST_ID 1001
325 typedef void (*MSG_OUT_FREE_FN)(UINT32 id,
326 SHADOW_MSG_OUT* msg);
331 MSG_OUT_FREE_FN Free;
334#define SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID 2001
335#define SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID 2002
336#define SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID 2003
337#define SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID 2004
341 SHADOW_MSG_OUT common;
348 SHADOW_MSG_OUT common;
353 UINT32 lengthAndMask;
354 UINT32 lengthXorMask;
361 SHADOW_MSG_OUT common;
370 SHADOW_MSG_OUT common;
375 FREERDP_API
void shadow_subsystem_set_entry_builtin(
const char* name);
376 FREERDP_API
void shadow_subsystem_set_entry(pfnShadowSubsystemEntry pEntry);
392 FREERDP_API BOOL shadow_subsystem_add_entry(
const char* name, pfnShadowSubsystemEntry pEntry);
394#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
395 WINPR_DEPRECATED_VAR(
396 "[since 3.4.0] Use shadow_subsystem_pointer_convert_alpha_pointer_data_to_format instead",
397 WINPR_ATTR_NODISCARD FREERDP_API
int shadow_subsystem_pointer_convert_alpha_pointer_data(
398 const BYTE* WINPR_RESTRICT pixels, BOOL premultiplied, UINT32 width, UINT32 height,
416 FREERDP_API
int shadow_subsystem_pointer_convert_alpha_pointer_data_to_format(
417 const BYTE* WINPR_RESTRICT pixels, UINT32 format, BOOL premultiplied, UINT32 width,
421 FREERDP_API
int shadow_server_parse_command_line(rdpShadowServer* server,
int argc,
char** argv,
425 FREERDP_API
int shadow_server_command_line_status_print(rdpShadowServer* server,
int argc,
426 char** argv,
int status,
430 FREERDP_API
int shadow_server_start(rdpShadowServer* server);
432 FREERDP_API
int shadow_server_stop(rdpShadowServer* server);
435 FREERDP_API
int shadow_server_init(rdpShadowServer* server);
437 FREERDP_API
int shadow_server_uninit(rdpShadowServer* server);
440 FREERDP_API UINT32 shadow_enum_monitors(
MONITOR_DEF* monitors, UINT32 maxMonitors);
442 FREERDP_API
void shadow_server_free(rdpShadowServer* server);
444 WINPR_ATTR_MALLOC(shadow_server_free, 1)
446 FREERDP_API rdpShadowServer* shadow_server_new(
void);
451#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
452 WINPR_DEPRECATED_VAR(
"[since 3.4.0] Use shadow_capture_compare_with_format",
453 WINPR_ATTR_NODISCARD FREERDP_API
int shadow_capture_compare(
454 const BYTE* WINPR_RESTRICT pData1, UINT32 nStep1, UINT32 nWidth,
455 UINT32 nHeight,
const BYTE* WINPR_RESTRICT pData2, UINT32 nStep2,
476 FREERDP_API
int shadow_capture_compare_with_format(
const BYTE* WINPR_RESTRICT pData1,
477 UINT32 format1, UINT32 nStep1, UINT32 nWidth,
479 const BYTE* WINPR_RESTRICT pData2,
480 UINT32 format2, UINT32 nStep2,
483 FREERDP_API
void shadow_subsystem_frame_update(rdpShadowSubsystem* subsystem);
486 FREERDP_API BOOL shadow_client_post_msg(rdpShadowClient* client,
void* context, UINT32 type,
487 SHADOW_MSG_OUT* msg,
void* lParam);
490 FREERDP_API
int shadow_client_boardcast_msg(rdpShadowServer* server,
void* context, UINT32 type,
491 SHADOW_MSG_OUT* msg,
void* lParam);
494 FREERDP_API
int shadow_client_boardcast_quit(rdpShadowServer* server,
int nExitCode);
506 FREERDP_API BOOL shadow_clipboard_session_changed(rdpShadowServer* server,
507 const char*
const* mimeTypes,
size_t count);
519 FREERDP_API BOOL shadow_clipboard_session_data(rdpShadowServer* server,
const BYTE* data,
532 FREERDP_API BOOL shadow_clipboard_session_request(rdpShadowServer* server, UINT32 request,
533 const char* mimeType);
536 FREERDP_API UINT32 shadow_encoder_preferred_fps(rdpShadowEncoder* encoder);
539 FREERDP_API UINT32 shadow_encoder_inflight_frames(rdpShadowEncoder* encoder);
542 FREERDP_API BOOL shadow_screen_resize(rdpShadowScreen* screen);
RDPGFX_CAPSET confirmedCaps
wMessageQueue * SoundQueue
WINPR_ATTR_NODISCARD pfnShadowClipboardRead ClipboardRead
WINPR_ATTR_NODISCARD pfnShadowClipboardOffer ClipboardOffer
WINPR_ATTR_NODISCARD pfnShadowClipboardProvide ClipboardProvide