402 lines
8.8 KiB
C
402 lines
8.8 KiB
C
/**
|
|
* FreeRDP: A Remote Desktop Protocol Implementation
|
|
* Graphics Pipeline Extension
|
|
*
|
|
* Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#ifndef FREERDP_CHANNEL_RDPGFX_H
|
|
#define FREERDP_CHANNEL_RDPGFX_H
|
|
|
|
#include <freerdp/api.h>
|
|
#include <freerdp/dvc.h>
|
|
#include <freerdp/types.h>
|
|
|
|
#define RDPGFX_DVC_CHANNEL_NAME "Microsoft::Windows::RDS::Graphics"
|
|
|
|
/**
|
|
* Common Data Types
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 x;
|
|
UINT16 y;
|
|
} RDPGFX_POINT16;
|
|
|
|
typedef struct
|
|
{
|
|
BYTE B;
|
|
BYTE G;
|
|
BYTE R;
|
|
BYTE XA;
|
|
} RDPGFX_COLOR32;
|
|
|
|
#define GFX_PIXEL_FORMAT_XRGB_8888 0x20
|
|
#define GFX_PIXEL_FORMAT_ARGB_8888 0x21
|
|
|
|
typedef BYTE RDPGFX_PIXELFORMAT;
|
|
|
|
#define RDPGFX_CMDID_UNUSED_0000 0x0000
|
|
#define RDPGFX_CMDID_WIRETOSURFACE_1 0x0001
|
|
#define RDPGFX_CMDID_WIRETOSURFACE_2 0x0002
|
|
#define RDPGFX_CMDID_DELETEENCODINGCONTEXT 0x0003
|
|
#define RDPGFX_CMDID_SOLIDFILL 0x0004
|
|
#define RDPGFX_CMDID_SURFACETOSURFACE 0x0005
|
|
#define RDPGFX_CMDID_SURFACETOCACHE 0x0006
|
|
#define RDPGFX_CMDID_CACHETOSURFACE 0x0007
|
|
#define RDPGFX_CMDID_EVICTCACHEENTRY 0x0008
|
|
#define RDPGFX_CMDID_CREATESURFACE 0x0009
|
|
#define RDPGFX_CMDID_DELETESURFACE 0x000A
|
|
#define RDPGFX_CMDID_STARTFRAME 0x000B
|
|
#define RDPGFX_CMDID_ENDFRAME 0x000C
|
|
#define RDPGFX_CMDID_FRAMEACKNOWLEDGE 0x000D
|
|
#define RDPGFX_CMDID_RESETGRAPHICS 0x000E
|
|
#define RDPGFX_CMDID_MAPSURFACETOOUTPUT 0x000F
|
|
#define RDPGFX_CMDID_CACHEIMPORTOFFER 0x0010
|
|
#define RDPGFX_CMDID_CACHEIMPORTREPLY 0x0011
|
|
#define RDPGFX_CMDID_CAPSADVERTISE 0x0012
|
|
#define RDPGFX_CMDID_CAPSCONFIRM 0x0013
|
|
#define RDPGFX_CMDID_UNUSED_0014 0x0014
|
|
#define RDPGFX_CMDID_MAPSURFACETOWINDOW 0x0015
|
|
#define RDPGFX_CMDID_QOEFRAMEACKNOWLEDGE 0x0016
|
|
#define RDPGFX_CMDID_MAPSURFACETOSCALEDOUTPUT 0x0017
|
|
#define RDPGFX_CMDID_MAPSURFACETOSCALEDWINDOW 0x0018
|
|
|
|
#define RDPGFX_HEADER_SIZE 8
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 cmdId;
|
|
UINT16 flags;
|
|
UINT32 pduLength;
|
|
} RDPGFX_HEADER;
|
|
|
|
/**
|
|
* Capability Sets [MS-RDPEGFX] 2.2.3
|
|
*/
|
|
|
|
#define RDPGFX_CAPVERSION_8 0x00080004 /** [MS-RDPEGFX] 2.2.3.1 */
|
|
#define RDPGFX_CAPVERSION_81 0x00080105 /** [MS-RDPEGFX] 2.2.3.2 */
|
|
#define RDPGFX_CAPVERSION_10 0x000A0002 /** [MS-RDPEGFX] 2.2.3.3 */
|
|
#define RDPGFX_CAPVERSION_101 0x000A0100 /** [MS-RDPEGFX] 2.2.3.4 */
|
|
#define RDPGFX_CAPVERSION_102 0x000A0200 /** [MS-RDPEGFX] 2.2.3.5 */
|
|
#define RDPGFX_CAPVERSION_103 0x000A0301 /** [MS-RDPEGFX] 2.2.3.6 */
|
|
#define RDPGFX_CAPVERSION_104 0x000A0400 /** [MS-RDPEGFX] 2.2.3.7 */
|
|
#define RDPGFX_CAPVERSION_105 0x000A0502 /** [MS-RDPEGFX] 2.2.3.8 */
|
|
#define RDPGFX_CAPVERSION_106 \
|
|
0x000A0600 /** [MS-RDPEGFX] 2.2.3.9 (the value in the doc is wrong, see \
|
|
* [MS-RDPEGFX]-180912-errata] \
|
|
* Since this is/was documented for a long time, also define \
|
|
* the incorrect value in case some server actually uses it. \
|
|
*/
|
|
#define RDPGFX_CAPVERSION_106_ERR 0x000A0601
|
|
#define RDPGFX_CAPVERSION_107 0x000A0701 /** [MS-RDPEGFX] 2.2.3.10 */
|
|
|
|
#define RDPGFX_NUMBER_CAPSETS 11
|
|
#define RDPGFX_CAPSET_BASE_SIZE 8
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 version;
|
|
UINT32 length;
|
|
UINT32 flags;
|
|
} RDPGFX_CAPSET;
|
|
|
|
#define RDPGFX_CAPS_FLAG_THINCLIENT 0x00000001U /* 8.0+ */
|
|
#define RDPGFX_CAPS_FLAG_SMALL_CACHE 0x00000002U /* 8.0+ */
|
|
#define RDPGFX_CAPS_FLAG_AVC420_ENABLED 0x00000010U /* 8.1+ */
|
|
#define RDPGFX_CAPS_FLAG_AVC_DISABLED 0x00000020U /* 10.0+ */
|
|
#define RDPGFX_CAPS_FLAG_AVC_THINCLIENT 0x00000040U /* 10.3+ */
|
|
#define RDPGFX_CAPS_FLAG_SCALEDMAP_DISABLE 0x00000080U /* 10.7+ */
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 version;
|
|
UINT32 capsDataLength;
|
|
UINT32 flags;
|
|
} RDPGFX_CAPSET_VERSION8;
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 version;
|
|
UINT32 capsDataLength;
|
|
UINT32 flags;
|
|
} RDPGFX_CAPSET_VERSION81;
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 version;
|
|
UINT32 capsDataLength;
|
|
UINT32 flags;
|
|
} RDPGFX_CAPSET_VERSION10;
|
|
|
|
/**
|
|
* Graphics Messages
|
|
*/
|
|
|
|
#define RDPGFX_CODECID_UNCOMPRESSED 0x0000
|
|
#define RDPGFX_CODECID_CAVIDEO 0x0003
|
|
#define RDPGFX_CODECID_CLEARCODEC 0x0008
|
|
#define RDPGFX_CODECID_PLANAR 0x000A
|
|
#define RDPGFX_CODECID_AVC420 0x000B
|
|
#define RDPGFX_CODECID_ALPHA 0x000C
|
|
#define RDPGFX_CODECID_AVC444 0x000E
|
|
#define RDPGFX_CODECID_AVC444v2 0x000F
|
|
|
|
#define RDPGFX_WIRE_TO_SURFACE_PDU_1_SIZE 17
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
UINT16 codecId;
|
|
RDPGFX_PIXELFORMAT pixelFormat;
|
|
RECTANGLE_16 destRect;
|
|
UINT32 bitmapDataLength;
|
|
BYTE* bitmapData;
|
|
} RDPGFX_WIRE_TO_SURFACE_PDU_1;
|
|
|
|
#define RDPGFX_CODECID_CAPROGRESSIVE 0x0009
|
|
#define RDPGFX_CODECID_CAPROGRESSIVE_V2 0x000D
|
|
|
|
#define RDPGFX_WIRE_TO_SURFACE_PDU_2_SIZE 13
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
UINT16 codecId;
|
|
UINT32 codecContextId;
|
|
RDPGFX_PIXELFORMAT pixelFormat;
|
|
UINT32 bitmapDataLength;
|
|
BYTE* bitmapData;
|
|
} RDPGFX_WIRE_TO_SURFACE_PDU_2;
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 surfaceId;
|
|
UINT32 codecId;
|
|
UINT32 contextId;
|
|
UINT32 format; /* FreeRDP color format. @see freerdp/codec/color.h */
|
|
UINT32 left;
|
|
UINT32 top;
|
|
UINT32 right;
|
|
UINT32 bottom;
|
|
UINT32 width;
|
|
UINT32 height;
|
|
UINT32 length;
|
|
BYTE* data;
|
|
void* extra;
|
|
} RDPGFX_SURFACE_COMMAND;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
UINT32 codecContextId;
|
|
} RDPGFX_DELETE_ENCODING_CONTEXT_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
RDPGFX_COLOR32 fillPixel;
|
|
UINT16 fillRectCount;
|
|
RECTANGLE_16* fillRects;
|
|
} RDPGFX_SOLID_FILL_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceIdSrc;
|
|
UINT16 surfaceIdDest;
|
|
RECTANGLE_16 rectSrc;
|
|
UINT16 destPtsCount;
|
|
RDPGFX_POINT16* destPts;
|
|
} RDPGFX_SURFACE_TO_SURFACE_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
UINT64 cacheKey;
|
|
UINT16 cacheSlot;
|
|
RECTANGLE_16 rectSrc;
|
|
} RDPGFX_SURFACE_TO_CACHE_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 cacheSlot;
|
|
UINT16 surfaceId;
|
|
UINT16 destPtsCount;
|
|
RDPGFX_POINT16* destPts;
|
|
} RDPGFX_CACHE_TO_SURFACE_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 cacheSlot;
|
|
} RDPGFX_EVICT_CACHE_ENTRY_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
UINT16 width;
|
|
UINT16 height;
|
|
RDPGFX_PIXELFORMAT pixelFormat;
|
|
} RDPGFX_CREATE_SURFACE_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
} RDPGFX_DELETE_SURFACE_PDU;
|
|
|
|
#define RDPGFX_START_FRAME_PDU_SIZE 8
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 timestamp;
|
|
UINT32 frameId;
|
|
} RDPGFX_START_FRAME_PDU;
|
|
|
|
#define RDPGFX_END_FRAME_PDU_SIZE 4
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 frameId;
|
|
} RDPGFX_END_FRAME_PDU;
|
|
|
|
#define QUEUE_DEPTH_UNAVAILABLE 0x00000000
|
|
#define SUSPEND_FRAME_ACKNOWLEDGEMENT 0xFFFFFFFF
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 queueDepth;
|
|
UINT32 frameId;
|
|
UINT32 totalFramesDecoded;
|
|
} RDPGFX_FRAME_ACKNOWLEDGE_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 width;
|
|
UINT32 height;
|
|
UINT32 monitorCount;
|
|
MONITOR_DEF* monitorDefArray;
|
|
} RDPGFX_RESET_GRAPHICS_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
UINT16 reserved;
|
|
UINT32 outputOriginX;
|
|
UINT32 outputOriginY;
|
|
} RDPGFX_MAP_SURFACE_TO_OUTPUT_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
UINT16 reserved;
|
|
UINT32 outputOriginX;
|
|
UINT32 outputOriginY;
|
|
UINT32 targetWidth;
|
|
UINT32 targetHeight;
|
|
} RDPGFX_MAP_SURFACE_TO_SCALED_OUTPUT_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT64 cacheKey;
|
|
UINT32 bitmapLength;
|
|
} RDPGFX_CACHE_ENTRY_METADATA;
|
|
|
|
#define RDPGFX_CACHE_ENTRY_MAX_COUNT 5462
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 cacheEntriesCount;
|
|
RDPGFX_CACHE_ENTRY_METADATA cacheEntries[RDPGFX_CACHE_ENTRY_MAX_COUNT];
|
|
} RDPGFX_CACHE_IMPORT_OFFER_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 importedEntriesCount;
|
|
UINT16 cacheSlots[RDPGFX_CACHE_ENTRY_MAX_COUNT];
|
|
} RDPGFX_CACHE_IMPORT_REPLY_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 capsSetCount;
|
|
RDPGFX_CAPSET* capsSets;
|
|
} RDPGFX_CAPS_ADVERTISE_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
RDPGFX_CAPSET* capsSet;
|
|
} RDPGFX_CAPS_CONFIRM_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
UINT64 windowId;
|
|
UINT32 mappedWidth;
|
|
UINT32 mappedHeight;
|
|
} RDPGFX_MAP_SURFACE_TO_WINDOW_PDU;
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 surfaceId;
|
|
UINT64 windowId;
|
|
UINT32 mappedWidth;
|
|
UINT32 mappedHeight;
|
|
UINT32 targetWidth;
|
|
UINT32 targetHeight;
|
|
} RDPGFX_MAP_SURFACE_TO_SCALED_WINDOW_PDU;
|
|
|
|
/* H264 */
|
|
|
|
typedef struct
|
|
{
|
|
BYTE qpVal;
|
|
BYTE qualityVal;
|
|
|
|
BYTE qp;
|
|
BYTE r;
|
|
BYTE p;
|
|
} RDPGFX_H264_QUANT_QUALITY;
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 numRegionRects;
|
|
RECTANGLE_16* regionRects;
|
|
RDPGFX_H264_QUANT_QUALITY* quantQualityVals;
|
|
} RDPGFX_H264_METABLOCK;
|
|
|
|
typedef struct
|
|
{
|
|
RDPGFX_H264_METABLOCK meta;
|
|
UINT32 length;
|
|
BYTE* data;
|
|
} RDPGFX_AVC420_BITMAP_STREAM;
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 cbAvc420EncodedBitstream1;
|
|
BYTE LC;
|
|
RDPGFX_AVC420_BITMAP_STREAM bitstream[2];
|
|
} RDPGFX_AVC444_BITMAP_STREAM;
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 frameId;
|
|
UINT32 timestamp;
|
|
UINT16 timeDiffSE;
|
|
UINT16 timeDiffEDR;
|
|
} RDPGFX_QOE_FRAME_ACKNOWLEDGE_PDU;
|
|
|
|
#endif /* FREERDP_CHANNEL_RDPGFX_H */
|