FreeRDP
Loading...
Searching...
No Matches
channels/rdpgfx.h
1
20#ifndef FREERDP_CHANNEL_RDPGFX_H
21#define FREERDP_CHANNEL_RDPGFX_H
22
23#include <freerdp/api.h>
24#include <freerdp/dvc.h>
25#include <freerdp/types.h>
26#include <freerdp/config.h>
27
32#define RDPGFX_CHANNEL_NAME "rdpgfx"
33#define RDPGFX_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::Graphics"
34
35#ifdef __cplusplus
36extern "C"
37{
38#endif
43 typedef struct
44 {
45 UINT16 x;
46 UINT16 y;
48
49 typedef struct
50 {
51 BYTE B;
52 BYTE G;
53 BYTE R;
54 BYTE XA;
56
57#define GFX_PIXEL_FORMAT_XRGB_8888 0x20
58#define GFX_PIXEL_FORMAT_ARGB_8888 0x21
59
60typedef BYTE RDPGFX_PIXELFORMAT;
61
62typedef enum
63{
64 RDPGFX_CMDID_UNUSED_0000 = 0x0000u,
65 RDPGFX_CMDID_WIRETOSURFACE_1 = 0x0001u,
66 RDPGFX_CMDID_WIRETOSURFACE_2 = 0x0002u,
67 RDPGFX_CMDID_DELETEENCODINGCONTEXT = 0x0003u,
68 RDPGFX_CMDID_SOLIDFILL = 0x0004u,
69 RDPGFX_CMDID_SURFACETOSURFACE = 0x0005u,
70 RDPGFX_CMDID_SURFACETOCACHE = 0x0006u,
71 RDPGFX_CMDID_CACHETOSURFACE = 0x0007u,
72 RDPGFX_CMDID_EVICTCACHEENTRY = 0x0008u,
73 RDPGFX_CMDID_CREATESURFACE = 0x0009u,
74 RDPGFX_CMDID_DELETESURFACE = 0x000Au,
75 RDPGFX_CMDID_STARTFRAME = 0x000Bu,
76 RDPGFX_CMDID_ENDFRAME = 0x000Cu,
77 RDPGFX_CMDID_FRAMEACKNOWLEDGE = 0x000Du,
78 RDPGFX_CMDID_RESETGRAPHICS = 0x000Eu,
79 RDPGFX_CMDID_MAPSURFACETOOUTPUT = 0x000Fu,
80 RDPGFX_CMDID_CACHEIMPORTOFFER = 0x0010u,
81 RDPGFX_CMDID_CACHEIMPORTREPLY = 0x0011u,
82 RDPGFX_CMDID_CAPSADVERTISE = 0x0012u,
83 RDPGFX_CMDID_CAPSCONFIRM = 0x0013u,
84 RDPGFX_CMDID_UNUSED_0014 = 0x0014u,
85 RDPGFX_CMDID_MAPSURFACETOWINDOW = 0x0015u,
86 RDPGFX_CMDID_QOEFRAMEACKNOWLEDGE = 0x0016u,
87 RDPGFX_CMDID_MAPSURFACETOSCALEDOUTPUT = 0x0017u,
88 RDPGFX_CMDID_MAPSURFACETOSCALEDWINDOW = 0x0018u,
89 RDPGFX_CMDID_PROTECT_SURFACE = 0x0019u,
90 RDPGFX_CMDID_WATERMARK = 0x001Au,
91 RDPGFX_CMDID_MAX = 0x001Bu
92} RDPGFX_CMDID;
93
94#define RDPGFX_HEADER_SIZE 8
95
96typedef struct
97{
98 UINT16 cmdId;
99 UINT16 flags;
100 UINT32 pduLength;
102
106typedef enum WINPR_C23_ENUM_TYPE(uint32_t)
107{
108#if defined(WITH_GFX_AV1)
109 RDPGFX_CAPVERSION_FRDP_1 = 0x00010000u,
110#endif
111#if defined(WITH_GFX_AV2)
112 RDPGFX_CAPVERSION_FRDP_2 = 0x00020000u,
114#endif
115 RDPGFX_CAPVERSION_8 = 0x00080004u,
116 RDPGFX_CAPVERSION_81 = 0x00080105u,
117 RDPGFX_CAPVERSION_10 = 0x000A0002u,
118 RDPGFX_CAPVERSION_101 = 0x000A0100u,
119 RDPGFX_CAPVERSION_102 = 0x000A0200u,
120 RDPGFX_CAPVERSION_103 = 0x000A0301u,
121 RDPGFX_CAPVERSION_104 = 0x000A0400u,
122 RDPGFX_CAPVERSION_105 = 0x000A0502u,
123 RDPGFX_CAPVERSION_106 =
124 0x000A0600u,
129 RDPGFX_CAPVERSION_106_ERR = 0x000A0601u,
130 RDPGFX_CAPVERSION_107 = 0x000A0701u,
131#if defined(WITH_GFX_AZURE)
132 RDPGFX_CAPVERSION_111 = 0x000b0101u,
133 RDPGFX_CAPVERSION_112 = 0x000b0200u,
134 RDPGFX_CAPVERSION_113 = 0x000b0300u,
135 RDPGFX_CAPVERSION_115 = 0x000b0500u
136#endif
137} RDPGFX_CAPVERSION;
138
139#define RDPGFX_CAPSET_BASE_SIZE 8
140
141typedef struct
142{
143 UINT32 version;
144 UINT32 length;
145 UINT32 flags;
147
148typedef enum WINPR_C23_ENUM_TYPE(uint32_t)
149{
150 RDPGFX_CAPS_FLAG_THINCLIENT = 0x00000001U, /* 8.0+ */
151 RDPGFX_CAPS_FLAG_SMALL_CACHE = 0x00000002U, /* 8.0+ */
152 RDPGFX_CAPS_FLAG_AVC420_ENABLED = 0x00000010U, /* 8.1+ */
153 RDPGFX_CAPS_FLAG_AVC_DISABLED = 0x00000020U, /* 10.0+ */
154 RDPGFX_CAPS_FLAG_AVC_THINCLIENT = 0x00000040U, /* 10.3+ */
155 RDPGFX_CAPS_FLAG_SCALEDMAP_DISABLE = 0x00000080U /* 10.7+ */
156#if defined(WITH_GFX_AZURE)
157 ,
158 RDPGFX_CAPS_FLAG_SCP_DISABLE = 0x00000100, /* 11.0+, undocumented, Azure only */
159 RDPGFX_CAPS_FLAG_HEVC_ENABLE = 0x00000400, /* 11.2+, undocumented */
160 RDPGFX_CAPS_FLAG_HEVC_I444 = 0x00002000 /* 11.5+, undocumented */
161#endif
162#if defined(WITH_GFX_AV1) || defined(WITH_GFX_AV2)
163 ,
164 /* Custom extension: only valid in the RDPGFX_CAPVERSION_FRDP_1 (AV1) and
165 * RDPGFX_CAPVERSION_FRDP_2 (AV2) capability sets, the same flags for both */
166 RDPGFX_CAPS_FLAG_AV1_I444_SUPPORTED = 0x10000000U,
167 RDPGFX_CAPS_FLAG_AV1_I444_DISABLED = 0x20000000U
168#endif
169} RDPGFX_CAPS_FLAG;
170
171typedef struct
172{
173 UINT32 version;
174 UINT32 capsDataLength;
175 UINT32 flags;
177
178typedef struct
179{
180 UINT32 version;
181 UINT32 capsDataLength;
182 UINT32 flags;
184
185typedef struct
186{
187 UINT32 version;
188 UINT32 capsDataLength;
189 UINT32 flags;
191
195typedef enum WINPR_C23_ENUM_TYPE(uint16_t)
196{
197 RDPGFX_CODECID_UNCOMPRESSED = 0x0000u,
198#if defined(WITH_GFX_AV1) || defined(WITH_GFX_AV2)
199 RDPGFX_CODECID_AV1 = 0x0001u,
201#endif
202 RDPGFX_CODECID_CAVIDEO = 0x0003u,
203 RDPGFX_CODECID_CLEARCODEC = 0x0008u,
204 RDPGFX_CODECID_CAPROGRESSIVE = 0x0009u,
205 RDPGFX_CODECID_PLANAR = 0x000Au,
206 RDPGFX_CODECID_AVC420 = 0x000Bu,
207 RDPGFX_CODECID_ALPHA = 0x000Cu,
208 RDPGFX_CODECID_CAPROGRESSIVE_V2 = 0x000Du,
209 RDPGFX_CODECID_AVC444 = 0x000Eu,
210 RDPGFX_CODECID_AVC444v2 = 0x000Fu,
211#if defined(WITH_GFX_AZURE)
212 RDPGFX_CODECID_HEVC420 = 0x0010u,
214 RDPGFX_CODECID_HEVC444 =
215 0x0012u,
217 RDPGFX_CODECID_MAX = 0x0012u
218#else
219 RDPGFX_CODECID_MAX = 0x0010u
220#endif
221} RDPGFX_CODECID;
222
223#define RDPGFX_WIRE_TO_SURFACE_PDU_1_SIZE 17
224
225typedef struct
226{
227 UINT16 surfaceId;
228 UINT16 codecId;
229 RDPGFX_PIXELFORMAT pixelFormat;
230 RECTANGLE_16 destRect;
231 UINT32 bitmapDataLength;
232 BYTE* bitmapData;
234
235#define RDPGFX_WIRE_TO_SURFACE_PDU_2_SIZE 13
236
237typedef struct
238{
239 UINT16 surfaceId;
240 UINT16 codecId;
241 UINT32 codecContextId;
242 RDPGFX_PIXELFORMAT pixelFormat;
243 UINT32 bitmapDataLength;
244 BYTE* bitmapData;
246
247typedef struct
248{
249 UINT32 surfaceId;
250 UINT32 codecId;
251 UINT32 contextId;
252 UINT32 format; /* FreeRDP color format. @see freerdp/codec/color.h */
253 UINT32 left;
254 UINT32 top;
255 UINT32 right;
256 UINT32 bottom;
257 UINT32 width;
258 UINT32 height;
259 UINT32 length;
260 BYTE* data;
261 void* extra;
263
264typedef struct
265{
266 UINT16 surfaceId;
267 UINT32 codecContextId;
269
270typedef struct
271{
272 UINT16 surfaceId;
273 RDPGFX_COLOR32 fillPixel;
274 UINT16 fillRectCount;
275 RECTANGLE_16* fillRects;
277
278typedef struct
279{
280 UINT16 surfaceIdSrc;
281 UINT16 surfaceIdDest;
282 RECTANGLE_16 rectSrc;
283 UINT16 destPtsCount;
284 RDPGFX_POINT16* destPts;
286
287typedef struct
288{
289 UINT16 surfaceId;
290 UINT64 cacheKey;
291 UINT16 cacheSlot;
292 RECTANGLE_16 rectSrc;
294
295typedef struct
296{
297 UINT16 cacheSlot;
298 UINT16 surfaceId;
299 UINT16 destPtsCount;
300 RDPGFX_POINT16* destPts;
302
303typedef struct
304{
305 UINT16 cacheSlot;
307
308typedef struct
309{
310 UINT16 surfaceId;
311 UINT16 width;
312 UINT16 height;
313 RDPGFX_PIXELFORMAT pixelFormat;
315
316typedef struct
317{
318 UINT16 surfaceId;
320
321#define RDPGFX_START_FRAME_PDU_SIZE 8
322
323typedef struct
324{
325 UINT32 timestamp;
326 UINT32 frameId;
328
329#define RDPGFX_END_FRAME_PDU_SIZE 4
330
331typedef struct
332{
333 UINT32 frameId;
335
336#define QUEUE_DEPTH_UNAVAILABLE 0x00000000
337#define SUSPEND_FRAME_ACKNOWLEDGEMENT 0xFFFFFFFF
338
339typedef struct
340{
341 UINT32 queueDepth;
342 UINT32 frameId;
343 UINT32 totalFramesDecoded;
345
346typedef struct
347{
348 UINT32 width;
349 UINT32 height;
350 UINT32 monitorCount;
351 MONITOR_DEF* monitorDefArray;
353
354typedef struct
355{
356 UINT16 surfaceId;
357 UINT16 reserved;
358 UINT32 outputOriginX;
359 UINT32 outputOriginY;
361
362typedef struct
363{
364 UINT16 surfaceId;
365 UINT16 reserved;
366 UINT32 outputOriginX;
367 UINT32 outputOriginY;
368 UINT32 targetWidth;
369 UINT32 targetHeight;
371
372typedef struct
373{
374 UINT64 cacheKey;
375 UINT32 bitmapLength;
377
378#define RDPGFX_CACHE_ENTRY_MAX_COUNT 5462
379
380typedef struct
381{
382 UINT16 cacheEntriesCount;
383 RDPGFX_CACHE_ENTRY_METADATA cacheEntries[RDPGFX_CACHE_ENTRY_MAX_COUNT];
385
386typedef struct
387{
388 UINT16 importedEntriesCount;
389 UINT16 cacheSlots[RDPGFX_CACHE_ENTRY_MAX_COUNT];
391
392typedef struct
393{
394 UINT16 capsSetCount;
395 RDPGFX_CAPSET* capsSets;
397
398typedef struct
399{
400 RDPGFX_CAPSET* capsSet;
402
403typedef struct
404{
405 UINT16 surfaceId;
406 UINT64 windowId;
407 UINT32 mappedWidth;
408 UINT32 mappedHeight;
410
411typedef struct
412{
413 UINT16 surfaceId;
414 UINT64 windowId;
415 UINT32 mappedWidth;
416 UINT32 mappedHeight;
417 UINT32 targetWidth;
418 UINT32 targetHeight;
420
421/* H264 */
422
423typedef struct
424{
425 BYTE qpVal;
426 BYTE qualityVal;
427
428 BYTE qp;
429 BYTE r;
430 BYTE p;
432
433typedef struct
434{
435 UINT32 numRegionRects;
436 RECTANGLE_16* regionRects;
437 RDPGFX_H264_QUANT_QUALITY* quantQualityVals;
439
440typedef struct
441{
443 UINT32 length;
444 BYTE* data;
446
447typedef struct
448{
449 UINT32 cbAvc420EncodedBitstream1;
450 BYTE LC;
451 RDPGFX_AVC420_BITMAP_STREAM bitstream[2];
453
454typedef struct
455{
457 UINT32 cbNalSizes; // (4 to 2048, multiple of 4)
458 UINT32* nalSize; //[cbNalSizes / 4]
459 INT16 frameAttributes; // (11.5; bit 0 = key frame, negative for not supported)
460 UINT32 length;
461 BYTE* data;
463
464typedef struct
465{
466 UINT32 frameId;
467 UINT32 timestamp;
468 UINT16 timeDiffSE;
469 UINT16 timeDiffEDR;
471
472#ifdef __cplusplus
473}
474#endif
475#endif /* FREERDP_CHANNEL_RDPGFX_H */