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