FreeRDP
Loading...
Searching...
No Matches
utils/gfx.c
1
22#include <freerdp/utils/gfx.h>
23#include <freerdp/channels/rdpgfx.h>
24
25const char* rdpgfx_get_cmd_id_string(UINT16 cmdId)
26{
27#define EVCASE(x) \
28 case x: \
29 return #x
30 switch (cmdId)
31 {
32 EVCASE(RDPGFX_CMDID_UNUSED_0000);
33 EVCASE(RDPGFX_CMDID_WIRETOSURFACE_1);
34 EVCASE(RDPGFX_CMDID_WIRETOSURFACE_2);
35 EVCASE(RDPGFX_CMDID_DELETEENCODINGCONTEXT);
36 EVCASE(RDPGFX_CMDID_SOLIDFILL);
37 EVCASE(RDPGFX_CMDID_SURFACETOSURFACE);
38 EVCASE(RDPGFX_CMDID_SURFACETOCACHE);
39 EVCASE(RDPGFX_CMDID_CACHETOSURFACE);
40 EVCASE(RDPGFX_CMDID_EVICTCACHEENTRY);
41 EVCASE(RDPGFX_CMDID_CREATESURFACE);
42 EVCASE(RDPGFX_CMDID_DELETESURFACE);
43 EVCASE(RDPGFX_CMDID_STARTFRAME);
44 EVCASE(RDPGFX_CMDID_ENDFRAME);
45 EVCASE(RDPGFX_CMDID_FRAMEACKNOWLEDGE);
46 EVCASE(RDPGFX_CMDID_RESETGRAPHICS);
47 EVCASE(RDPGFX_CMDID_MAPSURFACETOOUTPUT);
48 EVCASE(RDPGFX_CMDID_CACHEIMPORTOFFER);
49 EVCASE(RDPGFX_CMDID_CACHEIMPORTREPLY);
50 EVCASE(RDPGFX_CMDID_CAPSADVERTISE);
51 EVCASE(RDPGFX_CMDID_CAPSCONFIRM);
52 EVCASE(RDPGFX_CMDID_UNUSED_0014);
53 EVCASE(RDPGFX_CMDID_MAPSURFACETOWINDOW);
54 EVCASE(RDPGFX_CMDID_QOEFRAMEACKNOWLEDGE);
55 EVCASE(RDPGFX_CMDID_MAPSURFACETOSCALEDOUTPUT);
56 EVCASE(RDPGFX_CMDID_MAPSURFACETOSCALEDWINDOW);
57 EVCASE(RDPGFX_CMDID_PROTECT_SURFACE);
58 EVCASE(RDPGFX_CMDID_WATERMARK);
59 default:
60 return "RDPGFX_CMDID_UNKNOWN";
61 }
62#undef EVCASE
63}
64
65const char* rdpgfx_get_codec_id_string(UINT16 codecId)
66{
67#define EVCASE(x) \
68 case x: \
69 return #x
70
71 switch (codecId)
72 {
73#if defined(WITH_GFX_AV1) || defined(WITH_GFX_AV2)
74 EVCASE(RDPGFX_CODECID_AV1);
75#endif
76 EVCASE(RDPGFX_CODECID_UNCOMPRESSED);
77 EVCASE(RDPGFX_CODECID_CAVIDEO);
78 EVCASE(RDPGFX_CODECID_CLEARCODEC);
79 EVCASE(RDPGFX_CODECID_PLANAR);
80 EVCASE(RDPGFX_CODECID_AVC420);
81 EVCASE(RDPGFX_CODECID_AVC444);
82 EVCASE(RDPGFX_CODECID_AVC444v2);
83#if defined(WITH_GFX_AZURE)
84 EVCASE(RDPGFX_CODECID_HEVC420);
85 EVCASE(RDPGFX_CODECID_HEVC444);
86#endif
87 EVCASE(RDPGFX_CODECID_ALPHA);
88 EVCASE(RDPGFX_CODECID_CAPROGRESSIVE);
89 EVCASE(RDPGFX_CODECID_CAPROGRESSIVE_V2);
90 default:
91 return "RDPGFX_CODECID_UNKNOWN";
92 }
93#undef EVCASE
94}
95
96const char* rdpgfx_caps_version_str(UINT32 capsVersion)
97{
98#define EVCASE(x) \
99 case x: \
100 return #x
101
102 switch (capsVersion)
103 {
104#if defined(WITH_GFX_AV1)
105 EVCASE(RDPGFX_CAPVERSION_FRDP_1);
106#endif
107#if defined(WITH_GFX_AV2)
108 EVCASE(RDPGFX_CAPVERSION_FRDP_2);
109#endif
110 EVCASE(RDPGFX_CAPVERSION_8);
111 EVCASE(RDPGFX_CAPVERSION_81);
112 EVCASE(RDPGFX_CAPVERSION_10);
113 EVCASE(RDPGFX_CAPVERSION_101);
114 EVCASE(RDPGFX_CAPVERSION_102);
115 EVCASE(RDPGFX_CAPVERSION_103);
116 EVCASE(RDPGFX_CAPVERSION_104);
117 EVCASE(RDPGFX_CAPVERSION_105);
118 EVCASE(RDPGFX_CAPVERSION_106);
119 EVCASE(RDPGFX_CAPVERSION_106_ERR);
120 EVCASE(RDPGFX_CAPVERSION_107);
121#if defined(WITH_GFX_AZURE)
122 EVCASE(RDPGFX_CAPVERSION_111);
123 EVCASE(RDPGFX_CAPVERSION_112);
124 EVCASE(RDPGFX_CAPVERSION_113);
125 EVCASE(RDPGFX_CAPVERSION_115);
126#endif
127 default:
128 return "RDPGFX_CAPVERSION_UNKNOWN";
129 }
130
131#undef EVCASE
132}
133
134static const char* rdpgfx_caps_flag_str_int(UINT32 flag)
135{
136#define EVCASE(x) \
137 case x: \
138 return #x
139
140 switch (flag)
141 {
142 EVCASE(RDPGFX_CAPS_FLAG_THINCLIENT);
143 EVCASE(RDPGFX_CAPS_FLAG_SMALL_CACHE);
144 EVCASE(RDPGFX_CAPS_FLAG_AVC420_ENABLED);
145 EVCASE(RDPGFX_CAPS_FLAG_AVC_DISABLED);
146 EVCASE(RDPGFX_CAPS_FLAG_AVC_THINCLIENT);
147 EVCASE(RDPGFX_CAPS_FLAG_SCALEDMAP_DISABLE);
148#if defined(WITH_GFX_AZURE)
149 EVCASE(RDPGFX_CAPS_FLAG_SCP_DISABLE);
150 EVCASE(RDPGFX_CAPS_FLAG_HEVC_ENABLE);
151 EVCASE(RDPGFX_CAPS_FLAG_HEVC_I444);
152#endif
153#if defined(WITH_GFX_AV1) || defined(WITH_GFX_AV2)
154 EVCASE(RDPGFX_CAPS_FLAG_AV1_I444_SUPPORTED);
155 EVCASE(RDPGFX_CAPS_FLAG_AV1_I444_DISABLED);
156#endif
157 default:
158 return "RDPGFX_CAPS_FLAG_UNKNOWN";
159 }
160
161#undef EVCASE
162}
163
164const char* rdpgfx_caps_flag_str(UINT32 flag)
165{
166 const char* val = rdpgfx_caps_flag_str_int(flag);
167 if (!val)
168 return nullptr;
169
170 const char prefix[] = "RDPGFX_CAPS_FLAG_";
171 if (strncmp(val, prefix, sizeof(prefix) - 1) != 0)
172 return val;
173 return &val[sizeof(prefix) - 1];
174}
175
176const char* rdpgfx_caps_flags_str(UINT32 flags, char* buffer, size_t length)
177{
178 if (length < 1)
179 return buffer;
180
181 WINPR_ASSERT(buffer);
182
183 buffer[0] = '{';
184 for (uint32_t x = 0; x < 32; x++)
185 {
186 uint32_t val = 1u << x;
187 if ((flags & val) != 0)
188 {
189 const char* flag = rdpgfx_caps_flag_str(val);
190 winpr_str_append(flag, &buffer[1], length - 1, "|");
191 }
192 }
193
194 char number[16] = WINPR_C_ARRAY_INIT;
195 (void)_snprintf(number, sizeof(number), "[0x%08" PRIx32 "]", flags);
196 winpr_str_append(number, buffer, length, "}");
197
198 return buffer;
199}