1 /**
2  * FreeRDP: A Remote Desktop Protocol Implementation
3  * Graphics Pipeline Extension
4  *
5  * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 
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 
27 #define RDPGFX_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::Graphics"
28 
29 /**
30  * Common Data Types
31  */
32 
33 struct _RDPGFX_POINT16
34 {
35 	UINT16 x;
36 	UINT16 y;
37 };
38 typedef struct _RDPGFX_POINT16 RDPGFX_POINT16;
39 
40 struct _RDPGFX_COLOR32
41 {
42 	BYTE B;
43 	BYTE G;
44 	BYTE R;
45 	BYTE XA;
46 };
47 typedef struct _RDPGFX_COLOR32 RDPGFX_COLOR32;
48 
49 #define GFX_PIXEL_FORMAT_XRGB_8888 0x20
50 #define GFX_PIXEL_FORMAT_ARGB_8888 0x21
51 
52 typedef BYTE RDPGFX_PIXELFORMAT;
53 
54 #define RDPGFX_CMDID_UNUSED_0000 0x0000
55 #define RDPGFX_CMDID_WIRETOSURFACE_1 0x0001
56 #define RDPGFX_CMDID_WIRETOSURFACE_2 0x0002
57 #define RDPGFX_CMDID_DELETEENCODINGCONTEXT 0x0003
58 #define RDPGFX_CMDID_SOLIDFILL 0x0004
59 #define RDPGFX_CMDID_SURFACETOSURFACE 0x0005
60 #define RDPGFX_CMDID_SURFACETOCACHE 0x0006
61 #define RDPGFX_CMDID_CACHETOSURFACE 0x0007
62 #define RDPGFX_CMDID_EVICTCACHEENTRY 0x0008
63 #define RDPGFX_CMDID_CREATESURFACE 0x0009
64 #define RDPGFX_CMDID_DELETESURFACE 0x000A
65 #define RDPGFX_CMDID_STARTFRAME 0x000B
66 #define RDPGFX_CMDID_ENDFRAME 0x000C
67 #define RDPGFX_CMDID_FRAMEACKNOWLEDGE 0x000D
68 #define RDPGFX_CMDID_RESETGRAPHICS 0x000E
69 #define RDPGFX_CMDID_MAPSURFACETOOUTPUT 0x000F
70 #define RDPGFX_CMDID_CACHEIMPORTOFFER 0x0010
71 #define RDPGFX_CMDID_CACHEIMPORTREPLY 0x0011
72 #define RDPGFX_CMDID_CAPSADVERTISE 0x0012
73 #define RDPGFX_CMDID_CAPSCONFIRM 0x0013
74 #define RDPGFX_CMDID_UNUSED_0014 0x0014
75 #define RDPGFX_CMDID_MAPSURFACETOWINDOW 0x0015
76 #define RDPGFX_CMDID_QOEFRAMEACKNOWLEDGE 0x0016
77 #define RDPGFX_CMDID_MAPSURFACETOSCALEDOUTPUT 0x0017
78 #define RDPGFX_CMDID_MAPSURFACETOSCALEDWINDOW 0x0018
79 
80 #define RDPGFX_HEADER_SIZE 8
81 
82 struct _RDPGFX_HEADER
83 {
84 	UINT16 cmdId;
85 	UINT16 flags;
86 	UINT32 pduLength;
87 };
88 typedef struct _RDPGFX_HEADER RDPGFX_HEADER;
89 
90 /**
91  * Capability Sets [MS-RDPEGFX] 2.2.3
92  */
93 
94 #define RDPGFX_CAPVERSION_8 0x00080004   /** [MS-RDPEGFX] 2.2.3.1 */
95 #define RDPGFX_CAPVERSION_81 0x00080105  /** [MS-RDPEGFX] 2.2.3.2 */
96 #define RDPGFX_CAPVERSION_10 0x000A0002  /** [MS-RDPEGFX] 2.2.3.3 */
97 #define RDPGFX_CAPVERSION_101 0x000A0100 /** [MS-RDPEGFX] 2.2.3.4 */
98 #define RDPGFX_CAPVERSION_102 0x000A0200 /** [MS-RDPEGFX] 2.2.3.5 */
99 #define RDPGFX_CAPVERSION_103 0x000A0301 /** [MS-RDPEGFX] 2.2.3.6 */
100 #define RDPGFX_CAPVERSION_104 0x000A0400 /** [MS-RDPEGFX] 2.2.3.7 */
101 #define RDPGFX_CAPVERSION_105 0x000A0502 /** [MS-RDPEGFX] 2.2.3.8 */
102 #define RDPGFX_CAPVERSION_106                                           \
103 	0x000A0600 /** [MS-RDPEGFX] 2.2.3.9, [MS-RDPEGFX-errata] 2018-12-10 \
104 	            */
105 
106 #define RDPGFX_NUMBER_CAPSETS 9
107 #define RDPGFX_CAPSET_BASE_SIZE 8
108 
109 struct _RDPGFX_CAPSET
110 {
111 	UINT32 version;
112 	UINT32 length;
113 	UINT32 flags;
114 };
115 typedef struct _RDPGFX_CAPSET RDPGFX_CAPSET;
116 
117 #define RDPGFX_CAPS_FLAG_THINCLIENT 0x00000001U     /* 8.0+ */
118 #define RDPGFX_CAPS_FLAG_SMALL_CACHE 0x00000002U    /* 8.0+ */
119 #define RDPGFX_CAPS_FLAG_AVC420_ENABLED 0x00000010U /* 8.1+ */
120 #define RDPGFX_CAPS_FLAG_AVC_DISABLED 0x00000020U   /* 10.0+ */
121 #define RDPGFX_CAPS_FLAG_AVC_THINCLIENT 0x00000040U /* 10.3+ */
122 
123 struct _RDPGFX_CAPSET_VERSION8
124 {
125 	UINT32 version;
126 	UINT32 capsDataLength;
127 	UINT32 flags;
128 };
129 typedef struct _RDPGFX_CAPSET_VERSION8 RDPGFX_CAPSET_VERSION8;
130 
131 struct _RDPGFX_CAPSET_VERSION81
132 {
133 	UINT32 version;
134 	UINT32 capsDataLength;
135 	UINT32 flags;
136 };
137 typedef struct _RDPGFX_CAPSET_VERSION81 RDPGFX_CAPSET_VERSION81;
138 
139 struct _RDPGFX_CAPSET_VERSION10
140 {
141 	UINT32 version;
142 	UINT32 capsDataLength;
143 	UINT32 flags;
144 };
145 typedef struct _RDPGFX_CAPSET_VERSION10 RDPGFX_CAPSET_VERSION10;
146 
147 /**
148  * Graphics Messages
149  */
150 
151 #define RDPGFX_CODECID_UNCOMPRESSED 0x0000
152 #define RDPGFX_CODECID_CAVIDEO 0x0003
153 #define RDPGFX_CODECID_CLEARCODEC 0x0008
154 #define RDPGFX_CODECID_PLANAR 0x000A
155 #define RDPGFX_CODECID_AVC420 0x000B
156 #define RDPGFX_CODECID_ALPHA 0x000C
157 #define RDPGFX_CODECID_AVC444 0x000E
158 #define RDPGFX_CODECID_AVC444v2 0x000F
159 
160 #define RDPGFX_WIRE_TO_SURFACE_PDU_1_SIZE 17
161 
162 struct _RDPGFX_WIRE_TO_SURFACE_PDU_1
163 {
164 	UINT16 surfaceId;
165 	UINT16 codecId;
166 	RDPGFX_PIXELFORMAT pixelFormat;
167 	RECTANGLE_16 destRect;
168 	UINT32 bitmapDataLength;
169 	BYTE* bitmapData;
170 };
171 typedef struct _RDPGFX_WIRE_TO_SURFACE_PDU_1 RDPGFX_WIRE_TO_SURFACE_PDU_1;
172 
173 #define RDPGFX_CODECID_CAPROGRESSIVE 0x0009
174 #define RDPGFX_CODECID_CAPROGRESSIVE_V2 0x000D
175 
176 #define RDPGFX_WIRE_TO_SURFACE_PDU_2_SIZE 13
177 
178 struct _RDPGFX_WIRE_TO_SURFACE_PDU_2
179 {
180 	UINT16 surfaceId;
181 	UINT16 codecId;
182 	UINT32 codecContextId;
183 	RDPGFX_PIXELFORMAT pixelFormat;
184 	UINT32 bitmapDataLength;
185 	BYTE* bitmapData;
186 };
187 typedef struct _RDPGFX_WIRE_TO_SURFACE_PDU_2 RDPGFX_WIRE_TO_SURFACE_PDU_2;
188 
189 struct _RDPGFX_SURFACE_COMMAND
190 {
191 	UINT32 surfaceId;
192 	UINT32 codecId;
193 	UINT32 contextId;
194 	UINT32 format; /* FreeRDP color format. @see freerdp/codec/color.h */
195 	UINT32 left;
196 	UINT32 top;
197 	UINT32 right;
198 	UINT32 bottom;
199 	UINT32 width;
200 	UINT32 height;
201 	UINT32 length;
202 	BYTE* data;
203 	void* extra;
204 };
205 typedef struct _RDPGFX_SURFACE_COMMAND RDPGFX_SURFACE_COMMAND;
206 
207 struct _RDPGFX_DELETE_ENCODING_CONTEXT_PDU
208 {
209 	UINT16 surfaceId;
210 	UINT32 codecContextId;
211 };
212 typedef struct _RDPGFX_DELETE_ENCODING_CONTEXT_PDU RDPGFX_DELETE_ENCODING_CONTEXT_PDU;
213 
214 struct _RDPGFX_SOLID_FILL_PDU
215 {
216 	UINT16 surfaceId;
217 	RDPGFX_COLOR32 fillPixel;
218 	UINT16 fillRectCount;
219 	RECTANGLE_16* fillRects;
220 };
221 typedef struct _RDPGFX_SOLID_FILL_PDU RDPGFX_SOLID_FILL_PDU;
222 
223 struct _RDPGFX_SURFACE_TO_SURFACE_PDU
224 {
225 	UINT16 surfaceIdSrc;
226 	UINT16 surfaceIdDest;
227 	RECTANGLE_16 rectSrc;
228 	UINT16 destPtsCount;
229 	RDPGFX_POINT16* destPts;
230 };
231 typedef struct _RDPGFX_SURFACE_TO_SURFACE_PDU RDPGFX_SURFACE_TO_SURFACE_PDU;
232 
233 struct _RDPGFX_SURFACE_TO_CACHE_PDU
234 {
235 	UINT16 surfaceId;
236 	UINT64 cacheKey;
237 	UINT16 cacheSlot;
238 	RECTANGLE_16 rectSrc;
239 };
240 typedef struct _RDPGFX_SURFACE_TO_CACHE_PDU RDPGFX_SURFACE_TO_CACHE_PDU;
241 
242 struct _RDPGFX_CACHE_TO_SURFACE_PDU
243 {
244 	UINT16 cacheSlot;
245 	UINT16 surfaceId;
246 	UINT16 destPtsCount;
247 	RDPGFX_POINT16* destPts;
248 };
249 typedef struct _RDPGFX_CACHE_TO_SURFACE_PDU RDPGFX_CACHE_TO_SURFACE_PDU;
250 
251 struct _RDPGFX_EVICT_CACHE_ENTRY_PDU
252 {
253 	UINT16 cacheSlot;
254 };
255 typedef struct _RDPGFX_EVICT_CACHE_ENTRY_PDU RDPGFX_EVICT_CACHE_ENTRY_PDU;
256 
257 struct _RDPGFX_CREATE_SURFACE_PDU
258 {
259 	UINT16 surfaceId;
260 	UINT16 width;
261 	UINT16 height;
262 	RDPGFX_PIXELFORMAT pixelFormat;
263 };
264 typedef struct _RDPGFX_CREATE_SURFACE_PDU RDPGFX_CREATE_SURFACE_PDU;
265 
266 struct _RDPGFX_DELETE_SURFACE_PDU
267 {
268 	UINT16 surfaceId;
269 };
270 typedef struct _RDPGFX_DELETE_SURFACE_PDU RDPGFX_DELETE_SURFACE_PDU;
271 
272 #define RDPGFX_START_FRAME_PDU_SIZE 8
273 
274 struct _RDPGFX_START_FRAME_PDU
275 {
276 	UINT32 timestamp;
277 	UINT32 frameId;
278 };
279 typedef struct _RDPGFX_START_FRAME_PDU RDPGFX_START_FRAME_PDU;
280 
281 #define RDPGFX_END_FRAME_PDU_SIZE 4
282 
283 struct _RDPGFX_END_FRAME_PDU
284 {
285 	UINT32 frameId;
286 };
287 typedef struct _RDPGFX_END_FRAME_PDU RDPGFX_END_FRAME_PDU;
288 
289 #define QUEUE_DEPTH_UNAVAILABLE 0x00000000
290 #define SUSPEND_FRAME_ACKNOWLEDGEMENT 0xFFFFFFFF
291 
292 struct _RDPGFX_FRAME_ACKNOWLEDGE_PDU
293 {
294 	UINT32 queueDepth;
295 	UINT32 frameId;
296 	UINT32 totalFramesDecoded;
297 };
298 typedef struct _RDPGFX_FRAME_ACKNOWLEDGE_PDU RDPGFX_FRAME_ACKNOWLEDGE_PDU;
299 
300 struct _RDPGFX_RESET_GRAPHICS_PDU
301 {
302 	UINT32 width;
303 	UINT32 height;
304 	UINT32 monitorCount;
305 	MONITOR_DEF* monitorDefArray;
306 };
307 typedef struct _RDPGFX_RESET_GRAPHICS_PDU RDPGFX_RESET_GRAPHICS_PDU;
308 
309 struct _RDPGFX_MAP_SURFACE_TO_OUTPUT_PDU
310 {
311 	UINT16 surfaceId;
312 	UINT16 reserved;
313 	UINT32 outputOriginX;
314 	UINT32 outputOriginY;
315 };
316 typedef struct _RDPGFX_MAP_SURFACE_TO_OUTPUT_PDU RDPGFX_MAP_SURFACE_TO_OUTPUT_PDU;
317 
318 struct _RDPGFX_MAP_SURFACE_TO_SCALED_OUTPUT_PDU
319 {
320 	UINT16 surfaceId;
321 	UINT16 reserved;
322 	UINT32 outputOriginX;
323 	UINT32 outputOriginY;
324 	UINT32 targetWidth;
325 	UINT32 targetHeight;
326 };
327 typedef struct _RDPGFX_MAP_SURFACE_TO_SCALED_OUTPUT_PDU RDPGFX_MAP_SURFACE_TO_SCALED_OUTPUT_PDU;
328 
329 struct _RDPGFX_CACHE_ENTRY_METADATA
330 {
331 	UINT64 cacheKey;
332 	UINT32 bitmapLength;
333 };
334 typedef struct _RDPGFX_CACHE_ENTRY_METADATA RDPGFX_CACHE_ENTRY_METADATA;
335 
336 struct _RDPGFX_CACHE_IMPORT_OFFER_PDU
337 {
338 	UINT16 cacheEntriesCount;
339 	RDPGFX_CACHE_ENTRY_METADATA* cacheEntries;
340 };
341 typedef struct _RDPGFX_CACHE_IMPORT_OFFER_PDU RDPGFX_CACHE_IMPORT_OFFER_PDU;
342 
343 struct _RDPGFX_CACHE_IMPORT_REPLY_PDU
344 {
345 	UINT16 importedEntriesCount;
346 	UINT16* cacheSlots;
347 };
348 typedef struct _RDPGFX_CACHE_IMPORT_REPLY_PDU RDPGFX_CACHE_IMPORT_REPLY_PDU;
349 
350 struct _RDPGFX_CAPS_ADVERTISE_PDU
351 {
352 	UINT16 capsSetCount;
353 	RDPGFX_CAPSET* capsSets;
354 };
355 typedef struct _RDPGFX_CAPS_ADVERTISE_PDU RDPGFX_CAPS_ADVERTISE_PDU;
356 
357 struct _RDPGFX_CAPS_CONFIRM_PDU
358 {
359 	RDPGFX_CAPSET* capsSet;
360 };
361 typedef struct _RDPGFX_CAPS_CONFIRM_PDU RDPGFX_CAPS_CONFIRM_PDU;
362 
363 struct _RDPGFX_MAP_SURFACE_TO_WINDOW_PDU
364 {
365 	UINT16 surfaceId;
366 	UINT64 windowId;
367 	UINT32 mappedWidth;
368 	UINT32 mappedHeight;
369 };
370 typedef struct _RDPGFX_MAP_SURFACE_TO_WINDOW_PDU RDPGFX_MAP_SURFACE_TO_WINDOW_PDU;
371 
372 struct _RDPGFX_MAP_SURFACE_TO_SCALED_WINDOW_PDU
373 {
374 	UINT16 surfaceId;
375 	UINT64 windowId;
376 	UINT32 mappedWidth;
377 	UINT32 mappedHeight;
378 	UINT32 targetWidth;
379 	UINT32 targetHeight;
380 };
381 typedef struct _RDPGFX_MAP_SURFACE_TO_SCALED_WINDOW_PDU RDPGFX_MAP_SURFACE_TO_SCALED_WINDOW_PDU;
382 
383 /* H264 */
384 
385 struct _RDPGFX_H264_QUANT_QUALITY
386 {
387 	BYTE qpVal;
388 	BYTE qualityVal;
389 
390 	BYTE qp;
391 	BYTE r;
392 	BYTE p;
393 };
394 typedef struct _RDPGFX_H264_QUANT_QUALITY RDPGFX_H264_QUANT_QUALITY;
395 
396 struct _RDPGFX_H264_METABLOCK
397 {
398 	UINT32 numRegionRects;
399 	RECTANGLE_16* regionRects;
400 	RDPGFX_H264_QUANT_QUALITY* quantQualityVals;
401 };
402 typedef struct _RDPGFX_H264_METABLOCK RDPGFX_H264_METABLOCK;
403 
404 struct _RDPGFX_AVC420_BITMAP_STREAM
405 {
406 	RDPGFX_H264_METABLOCK meta;
407 	UINT32 length;
408 	BYTE* data;
409 };
410 typedef struct _RDPGFX_AVC420_BITMAP_STREAM RDPGFX_AVC420_BITMAP_STREAM;
411 
412 struct _RDPGFX_AVC444_BITMAP_STREAM
413 {
414 	UINT32 cbAvc420EncodedBitstream1;
415 	BYTE LC;
416 	RDPGFX_AVC420_BITMAP_STREAM bitstream[2];
417 };
418 typedef struct _RDPGFX_AVC444_BITMAP_STREAM RDPGFX_AVC444_BITMAP_STREAM;
419 
420 struct _RDPGFX_QOE_FRAME_ACKNOWLEDGE_PDU
421 {
422 	UINT32 frameId;
423 	UINT32 timestamp;
424 	UINT16 timeDiffSE;
425 	UINT16 timeDiffEDR;
426 };
427 typedef struct _RDPGFX_QOE_FRAME_ACKNOWLEDGE_PDU RDPGFX_QOE_FRAME_ACKNOWLEDGE_PDU;
428 
429 #endif /* FREERDP_CHANNEL_RDPGFX_H */
430