FreeRDP
Loading...
Searching...
No Matches
shadow_encoder.h
1
19#ifndef FREERDP_SERVER_SHADOW_ENCODER_H
20#define FREERDP_SERVER_SHADOW_ENCODER_H
21
22#include <winpr/crt.h>
23#include <winpr/stream.h>
24
25#include <freerdp/freerdp.h>
26#include <freerdp/codecs.h>
27
28#include <freerdp/server/shadow.h>
29
30/* GFX frames a client may have unacknowledged before it gets no new one, like xrdp's
31 * XRDP_GFX_FRAMES_IN_FLIGHT=8; FREERDP_SHADOW_GFX_FRAMES_IN_FLIGHT overrides it */
32#define SHADOW_GFX_FRAMES_IN_FLIGHT 8
33
35{
36 rdpShadowClient* client;
37 rdpShadowServer* server;
38
39 UINT32 width;
40 UINT32 height;
41 UINT32 codecs;
42
43 BYTE** grid;
44 UINT32 gridWidth;
45 UINT32 gridHeight;
46 BYTE* gridBuffer;
47 UINT32 maxTileWidth;
48 UINT32 maxTileHeight;
49
50 wStream* bs;
51
52 RFX_CONTEXT* rfx;
53 NSC_CONTEXT* nsc;
54 BITMAP_PLANAR_CONTEXT* planar;
55 BITMAP_INTERLEAVED_CONTEXT* interleaved;
56 H264_CONTEXT* h264;
57 PROGRESSIVE_CONTEXT* progressive;
58#if defined(WITH_GFX_AV1)
59 FREERDP_AV1_CONTEXT* av1;
60#endif
61#if defined(WITH_GFX_AV2)
62 FREERDP_AV2_CONTEXT* av2;
63#endif
64 UINT32 fps;
65 UINT32 maxFps;
66 BOOL frameAck;
67 UINT32 frameId;
68 UINT32 lastAckframeId;
69 UINT32 queueDepth;
70
71 /* GFX flow control (shadow_client.c): no new frame while maxInFlight frames are not
72 * acknowledged (0: no limit). gfxHeld: a round's damage waits in the client's region. */
73 UINT32 maxInFlight;
74 UINT64 lastAckTick;
75 BOOL gfxHeld;
76 BOOL everAcked; /* the client acknowledged a frame at least once */
77 BOOL warnedNoAck;
78 UINT32 statsMaxInFlight;
79 UINT64 statsHeld;
80 UINT64 statsLogged;
81
82 /* GFX RFX dirty tile skipping (shadow_rfx_dirty.c): snapshot of the last
83 * encoded content (BGRX copy sharing the surface geometry) plus per tile
84 * encoded flags. Only used by the GFX RFX path; a missing or mismatching
85 * snapshot encodes the frame in full. */
86 BYTE* gfxSnapshot;
87 BOOL* gfxTileEncoded;
88 UINT32 gfxSnapshotWidth;
89 UINT32 gfxSnapshotHeight;
90 UINT32 gfxSnapshotStep;
91 BOOL gfxSnapshotValid;
92};
93
94#ifdef __cplusplus
95extern "C"
96{
97#endif
98
99 WINPR_ATTR_NODISCARD int shadow_encoder_reset(rdpShadowEncoder* encoder);
100 WINPR_ATTR_NODISCARD int shadow_encoder_prepare(rdpShadowEncoder* encoder, UINT32 codecs);
101 WINPR_ATTR_NODISCARD UINT32 shadow_encoder_create_frame_id(rdpShadowEncoder* encoder);
102
103 void shadow_encoder_free(rdpShadowEncoder* encoder);
104
105 WINPR_ATTR_MALLOC(shadow_encoder_free, 1)
106 rdpShadowEncoder* shadow_encoder_new(rdpShadowClient* client);
107
108#ifdef __cplusplus
109}
110#endif
111
112#endif /* FREERDP_SERVER_SHADOW_ENCODER_H */