Merge pull request #2338 from Nexarian/add_egfx_base_functions

Adding egfx base functions.
This commit is contained in:
Nexarian 2023-01-15 01:59:30 -05:00 committed by GitHub
commit 8fdb0fab39
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 1421 additions and 0 deletions

View File

@ -58,6 +58,8 @@ xrdp_SOURCES = \
xrdp_process.c \
xrdp_region.c \
xrdp_types.h \
xrdp_egfx.c \
xrdp_egfx.h \
xrdp_wm.c
xrdp_LDADD = \

1180
xrdp/xrdp_egfx.c Normal file

File diff suppressed because it is too large Load Diff

222
xrdp/xrdp_egfx.h Normal file
View File

@ -0,0 +1,222 @@
/**
* xrdp: A Remote Desktop Protocol server.
*
* Copyright (C) Jay Sorg 2019
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* MS-RDPEGFX
*/
#ifndef _XRDP_EGFX_H
#define _XRDP_EGFX_H
#define XR_RDPGFX_CAPVERSION_8 0x00080004
#define XR_RDPGFX_CAPVERSION_81 0x00080105
#define XR_RDPGFX_CAPVERSION_10 0x000A0002
#define XR_RDPGFX_CAPVERSION_101 0x000A0100
#define XR_RDPGFX_CAPVERSION_102 0x000A0200
#define XR_RDPGFX_CAPVERSION_103 0x000A0301
#define XR_RDPGFX_CAPVERSION_104 0x000A0400
#define XR_RDPGFX_CAPVERSION_105 0x000A0502
#define XR_RDPGFX_CAPVERSION_106 0x000A0600
#define XR_RDPGFX_CAPVERSION_107 0x000A0701
#define XR_PIXEL_FORMAT_XRGB_8888 0x20
#define XR_PIXEL_FORMAT_ARGB_8888 0x21
#define XR_RDPGFX_CAPS_FLAG_THINCLIENT 0x00000001
#define XR_RDPGFX_CAPS_FLAG_SMALL_CACHE 0x00000002
#define XR_RDPGFX_CAPS_FLAG_AVC420_ENABLED 0x00000010
#define XR_RDPGFX_CAPS_FLAG_AVC_DISABLED 0x00000020
#define XR_RDPGFX_CAPS_FLAG_AVC_THINCLIENT 0x00000040
#define XR_RDPGFX_CMDID_WIRETOSURFACE_1 0x0001
#define XR_RDPGFX_CMDID_WIRETOSURFACE_2 0x0002
#define XR_RDPGFX_CMDID_DELETEENCODINGCONTEXT 0x0003
#define XR_RDPGFX_CMDID_SOLIDFILL 0x0004
#define XR_RDPGFX_CMDID_SURFACETOSURFACE 0x0005
#define XR_RDPGFX_CMDID_SURFACETOCACHE 0x0006
#define XR_RDPGFX_CMDID_CACHETOSURFACE 0x0007
#define XR_RDPGFX_CMDID_EVICTCACHEENTRY 0x0008
#define XR_RDPGFX_CMDID_CREATESURFACE 0x0009
#define XR_RDPGFX_CMDID_DELETESURFACE 0x000A
#define XR_RDPGFX_CMDID_STARTFRAME 0x000B
#define XR_RDPGFX_CMDID_ENDFRAME 0x000C
#define XR_RDPGFX_CMDID_FRAMEACKNOWLEDGE 0x000D
#define XR_RDPGFX_CMDID_RESETGRAPHICS 0x000E
#define XR_RDPGFX_CMDID_MAPSURFACETOOUTPUT 0x000F
#define XR_RDPGFX_CMDID_CACHEIMPORTOFFER 0x0010
#define XR_RDPGFX_CMDID_CACHEIMPORTREPLY 0x0011
#define XR_RDPGFX_CMDID_CAPSADVERTISE 0x0012
#define XR_RDPGFX_CMDID_CAPSCONFIRM 0x0013
#define XR_RDPGFX_CMDID_MAPSURFACETOWINDOW 0x0015
#define XR_RDPGFX_CMDID_QOEFRAMEACKNOWLEDGE 0x0016
#define XR_RDPGFX_CMDID_MAPSURFACETOSCALEDOUTPUT 0x0017
#define XR_RDPGFX_CMDID_MAPSURFACETOSCALEDWINDOW 0x0018
#define XR_QUEUE_DEPTH_UNAVAILABLE 0x00000000
#define XR_SUSPEND_FRAME_ACKNOWLEDGEMENT 0xFFFFFFFF
/* The bitmap data encapsulated in the bitmapData field is uncompressed.
Pixels in the uncompressed data are ordered from left to right and then
top to bottom. */
#define XR_RDPGFX_CODECID_UNCOMPRESSED 0x0000
/* The bitmap data encapsulated in the bitmapData field is compressed using
the RemoteFX Codec ([MS-RDPRFX] sections 2.2.1 and 3.1.8). Note that the
TS_RFX_RECT ([MS-RDPRFX] section 2.2.2.1.6) structures encapsulated in
the bitmapData field MUST all be relative to the top-left corner of the
rectangle defined by the destRect field. */
#define XR_RDPGFX_CODECID_CAVIDEO 0x0003
/* The bitmap data encapsulated in the bitmapData field is compressed using
the ClearCodec Codec (sections 2.2.4.1 and 3.3.8.1). */
#define XR_RDPGFX_CODECID_CLEARCODEC 0x0008
/* The bitmap data encapsulated in the bitmapData field is compressed using
the Planar Codec ([MS-RDPEGDI] sections 2.2.2.5.1 and 3.1.9). */
#define XR_RDPGFX_CODECID_PLANAR 0x000A
/* The bitmap data encapsulated in the bitmapData field is compressed using
the MPEG-4 AVC/H.264 Codec in YUV420p mode (section 2.2.4.4). */
#define XR_RDPGFX_CODECID_AVC420 0x000B
/* The bitmap data encapsulated in the bitmapData field is compressed using
the Alpha Codec (section 2.2.4.3). */
#define XR_RDPGFX_CODECID_ALPHA 0x000C
/* The bitmap data encapsulated in the bitmapData field is compressed using
the MPEG-4 AVC/H.264 Codec in YUV444 mode (section 2.2.4.5). */
#define XR_RDPGFX_CODECID_AVC444 0x000E
/* The bitmap data encapsulated in the bitmapData field is compressed using
the MPEG-4 AVC/H.264 Codec in YUV444v2 mode (section 2.2.4.6). */
#define XR_RDPGFX_CODECID_AVC444V2 0x000F
struct xrdp_egfx_rect
{
short x1;
short y1;
short x2;
short y2;
};
struct xrdp_egfx_point
{
short x;
short y;
};
struct xrdp_egfx
{
struct xrdp_session *session;
int channel_id;
int surface_id;
int frame_id;
struct stream *s;
void *user;
struct xrdp_egfx_bulk *bulk;
int (*caps_advertise)(void *user, int num_caps, int *version, int *flags);
int (*frame_ack)(void *user, uint32_t queue_depth,
int frame_id, int frames_decoded);
};
struct xrdp_egfx_bulk
{
int id;
};
int
xrdp_egfx_send_data(struct xrdp_egfx *egfx, const char *data, int bytes);
int
xrdp_egfx_send_s(struct xrdp_egfx *egfx, struct stream *s);
int
xrdp_egfx_create(struct xrdp_mm *mm, struct xrdp_egfx **egfx);
int
xrdp_egfx_shutdown_delete_surface(struct xrdp_egfx *egfx);
int
xrdp_egfx_shutdown_close_connection(struct xrdp_egfx *egfx);
int
xrdp_egfx_shutdown_delete(struct xrdp_egfx *egfx);
int
xrdp_egfx_shutdown_full(struct xrdp_egfx *egfx);
struct stream *
xrdp_egfx_create_surface(struct xrdp_egfx_bulk *bulk, int surface_id,
int width, int height, int pixel_format);
int
xrdp_egfx_send_create_surface(struct xrdp_egfx *egfx, int surface_id,
int width, int height, int pixel_format);
struct stream *
xrdp_egfx_delete_surface(struct xrdp_egfx_bulk *bulk, int surface_id);
int
xrdp_egfx_send_delete_surface(struct xrdp_egfx *egfx, int surface_id);
struct stream *
xrdp_egfx_map_surface(struct xrdp_egfx_bulk *bulk, int surface_id,
int x, int y);
int
xrdp_egfx_send_map_surface(struct xrdp_egfx *egfx, int surface_id,
int x, int y);
struct stream *
xrdp_egfx_fill_surface(struct xrdp_egfx_bulk *bulk, int surface_id,
int fill_color, int num_rects,
const struct xrdp_egfx_rect *rects);
int
xrdp_egfx_send_fill_surface(struct xrdp_egfx *egfx, int surface_id,
int fill_color, int num_rects,
const struct xrdp_egfx_rect *rects);
struct stream *
xrdp_egfx_surface_to_surface(struct xrdp_egfx_bulk *bulk, int src_surface_id,
int dst_surface_id,
const struct xrdp_egfx_rect *src_rect,
int num_dst_points,
const struct xrdp_egfx_point *dst_points);
int
xrdp_egfx_send_surface_to_surface(struct xrdp_egfx *egfx, int src_surface_id,
int dst_surface_id,
const struct xrdp_egfx_rect *src_rect,
int num_dst_points,
const struct xrdp_egfx_point *dst_points);
struct stream *
xrdp_egfx_frame_start(struct xrdp_egfx_bulk *bulk, int frame_id, int timestamp);
int
xrdp_egfx_send_frame_start(struct xrdp_egfx *egfx, int frame_id, int timestamp);
struct stream *
xrdp_egfx_frame_end(struct xrdp_egfx_bulk *bulk, int frame_id);
int
xrdp_egfx_send_frame_end(struct xrdp_egfx *egfx, int frame_id);
struct stream *
xrdp_egfx_capsconfirm(struct xrdp_egfx_bulk *bulk, int version, int flags);
int
xrdp_egfx_send_capsconfirm(struct xrdp_egfx *egfx, int version, int flags);
struct stream *
xrdp_egfx_wire_to_surface1(struct xrdp_egfx_bulk *bulk, int surface_id,
int codec_id, int pixel_format,
struct xrdp_egfx_rect *dest_rect,
void *bitmap_data, int bitmap_data_length);
int
xrdp_egfx_send_wire_to_surface1(struct xrdp_egfx *egfx, int surface_id,
int codec_id, int pixel_format,
struct xrdp_egfx_rect *dest_rect,
void *bitmap_data, int bitmap_data_length);
struct stream *
xrdp_egfx_wire_to_surface2(struct xrdp_egfx_bulk *bulk, int surface_id,
int codec_id, int codec_context_id,
int pixel_format,
void *bitmap_data, int bitmap_data_length);
int
xrdp_egfx_send_wire_to_surface2(struct xrdp_egfx *egfx, int surface_id,
int codec_id, int codec_context_id,
int pixel_format,
void *bitmap_data, int bitmap_data_length);
struct stream *
xrdp_egfx_reset_graphics(struct xrdp_egfx_bulk *bulk, int width, int height,
int monitor_count, struct monitor_info *mi);
int
xrdp_egfx_send_reset_graphics(struct xrdp_egfx *egfx, int width, int height,
int monitor_count, struct monitor_info *mi);
#endif

View File

@ -322,9 +322,17 @@ enum mm_connect_state
enum display_resize_state
{
WMRZ_ENCODER_DELETE = 0,
WMRZ_EGFX_DELETE_SURFACE,
WMRZ_EGFX_CONN_CLOSE,
WMRZ_EGFX_CONN_CLOSING,
WMRZ_EGFX_CONN_CLOSED,
WRMZ_EGFX_DELETE,
WMRZ_SERVER_MONITOR_RESIZE,
WMRZ_SERVER_VERSION_MESSAGE,
WMRZ_XRDP_CORE_RESIZE,
WMRZ_EGFX_INITIALIZE,
WMRZ_EGFX_INITALIZING,
WMRZ_EGFX_INITIALIZED,
WMRZ_ENCODER_CREATE,
WMRZ_SERVER_INVALIDATE,
WMRZ_COMPLETE,
@ -333,9 +341,17 @@ enum display_resize_state
#define XRDP_DISPLAY_RESIZE_STATE_TO_STR(status) \
((status) == WMRZ_ENCODER_DELETE ? "WMRZ_ENCODER_DELETE" : \
(status) == WMRZ_EGFX_DELETE_SURFACE ? "WMRZ_EGFX_DELETE_SURFACE" : \
(status) == WMRZ_EGFX_CONN_CLOSE ? "WMRZ_EGFX_CONN_CLOSE" : \
(status) == WMRZ_EGFX_CONN_CLOSING ? "WMRZ_EGFX_CONN_CLOSING" : \
(status) == WMRZ_EGFX_CONN_CLOSED ? "WMRZ_EGFX_CONN_CLOSED" : \
(status) == WRMZ_EGFX_DELETE ? "WMRZ_EGFX_DELETE" : \
(status) == WMRZ_SERVER_MONITOR_RESIZE ? "WMRZ_SERVER_MONITOR_RESIZE" : \
(status) == WMRZ_SERVER_VERSION_MESSAGE ? "WMRZ_SERVER_VERSION_MESSAGE" : \
(status) == WMRZ_XRDP_CORE_RESIZE ? "WMRZ_XRDP_CORE_RESIZE" : \
(status) == WMRZ_EGFX_INITIALIZE ? "WMRZ_EGFX_INITIALIZE" : \
(status) == WMRZ_EGFX_INITALIZING ? "WMRZ_EGFX_INITALIZING" : \
(status) == WMRZ_EGFX_INITIALIZED ? "WMRZ_EGFX_INITIALIZED" : \
(status) == WMRZ_ENCODER_CREATE ? "WMRZ_ENCODER_CREATE" : \
(status) == WMRZ_SERVER_INVALIDATE ? "WMRZ_SERVER_INVALIDATE" : \
(status) == WMRZ_COMPLETE ? "WMRZ_COMPLETE" : \
@ -374,6 +390,7 @@ struct xrdp_mm
int cs2xr_cid_map[256];
int xr2cr_cid_map[256];
int dynamic_monitor_chanid;
struct xrdp_egfx *egfx;
/* Resize on-the-fly control */
struct display_control_monitor_layout_data *resize_data;