FreeRDP
Loading...
Searching...
No Matches
mf_info.c
1
20#include <freerdp/config.h>
21
22#include <stdlib.h>
23#include <errno.h>
24
25#include "mf_info.h"
26#include "mf_mountain_lion.h"
27
28#define MF_INFO_DEFAULT_FPS 30
29#define MF_INFO_MAXPEERS 32
30
31static mfInfo* mfInfoInstance = nullptr;
32
33int mf_info_lock(mfInfo* mfi)
34{
35 int status = pthread_mutex_lock(&mfi->mutex);
36
37 switch (status)
38 {
39 case 0:
40 return TRUE;
41 break;
42
43 default:
44 return -1;
45 break;
46 }
47
48 return 1;
49}
50
51int mf_info_try_lock(mfInfo* mfi, UINT32 ms)
52{
53 int status = pthread_mutex_trylock(&mfi->mutex);
54
55 switch (status)
56 {
57 case 0:
58 return TRUE;
59 break;
60
61 case EBUSY:
62 return FALSE;
63 break;
64
65 default:
66 return -1;
67 break;
68 }
69
70 return 1;
71}
72
73int mf_info_unlock(mfInfo* mfi)
74{
75 int status = pthread_mutex_unlock(&mfi->mutex);
76
77 switch (status)
78 {
79 case 0:
80 return TRUE;
81 break;
82
83 default:
84 return -1;
85 break;
86 }
87
88 return 1;
89}
90
91WINPR_ATTR_NODISCARD
92static mfInfo* mf_info_init(void)
93{
94 mfInfo* mfi = (mfInfo*)calloc(1, sizeof(mfInfo));
95
96 if (mfi != nullptr)
97 {
98 pthread_mutex_init(&mfi->mutex, nullptr);
99
100 mfi->peers = (freerdp_peer**)calloc(MF_INFO_MAXPEERS, sizeof(freerdp_peer*));
101 if (!mfi->peers)
102 {
103 free(mfi);
104 return nullptr;
105 }
106
107 mfi->framesPerSecond = MF_INFO_DEFAULT_FPS;
108 mfi->input_disabled = FALSE;
109 }
110
111 return mfi;
112}
113
114mfInfo* mf_info_get_instance(void)
115{
116 if (mfInfoInstance == nullptr)
117 mfInfoInstance = mf_info_init();
118
119 return mfInfoInstance;
120}
121
122void mf_info_peer_register(mfInfo* mfi, mfPeerContext* context)
123{
124 if (mf_info_lock(mfi) > 0)
125 {
126 int peerId;
127
128 if (mfi->peerCount == MF_INFO_MAXPEERS)
129 {
130 mf_info_unlock(mfi);
131 return;
132 }
133
134 context->info = mfi;
135
136 if (mfi->peerCount == 0)
137 {
138 mf_mlion_display_info(&mfi->servscreen_width, &mfi->servscreen_height, &mfi->scale);
139 mf_mlion_screen_updates_init();
140 mf_mlion_start_getting_screen_updates();
141 }
142
143 peerId = 0;
144
145 for (int i = 0; i < MF_INFO_MAXPEERS; ++i)
146 {
147 // empty index will be our peer id
148 if (mfi->peers[i] == nullptr)
149 {
150 peerId = i;
151 break;
152 }
153 }
154
155 mfi->peers[peerId] = ((rdpContext*)context)->peer;
156 mfi->peers[peerId]->pId = peerId;
157 mfi->peerCount++;
158
159 mf_info_unlock(mfi);
160 }
161}
162
163void mf_info_peer_unregister(mfInfo* mfi, mfPeerContext* context)
164{
165 if (mf_info_lock(mfi) > 0)
166 {
167 int peerId;
168
169 peerId = ((rdpContext*)context)->peer->pId;
170 mfi->peers[peerId] = nullptr;
171 mfi->peerCount--;
172
173 if (mfi->peerCount == 0)
174 mf_mlion_stop_getting_screen_updates();
175
176 mf_info_unlock(mfi);
177 }
178}
179
180BOOL mf_info_have_updates(mfInfo* mfi)
181{
182 if (mfi->framesWaiting == 0)
183 return FALSE;
184
185 return TRUE;
186}
187
188void mf_info_update_changes(mfInfo* mfi)
189{
190}
191
192void mf_info_find_invalid_region(mfInfo* mfi)
193{
194 mf_mlion_get_dirty_region(&mfi->invalid);
195}
196
197void mf_info_clear_invalid_region(mfInfo* mfi)
198{
199 mf_mlion_clear_dirty_region();
200 mfi->invalid.height = 0;
201 mfi->invalid.width = 0;
202}
203
204void mf_info_invalidate_full_screen(mfInfo* mfi)
205{
206 mfi->invalid.x = 0;
207 mfi->invalid.y = 0;
208 mfi->invalid.height = mfi->servscreen_height;
209 mfi->invalid.width = mfi->servscreen_width;
210}
211
212BOOL mf_info_have_invalid_region(mfInfo* mfi)
213{
214 if (mfi->invalid.width * mfi->invalid.height == 0)
215 return FALSE;
216
217 return TRUE;
218}
219
220void mf_info_getScreenData(mfInfo* mfi, long* width, long* height, BYTE** pBits, int* pitch)
221{
222 *width = mfi->invalid.width / mfi->scale;
223 *height = mfi->invalid.height / mfi->scale;
224 *pitch = mfi->servscreen_width * mfi->scale * 4;
225
226 mf_mlion_get_pixelData(mfi->invalid.x / mfi->scale, mfi->invalid.y / mfi->scale, *width,
227 *height, pBits);
228
229 *pBits = *pBits + (mfi->invalid.x * 4) + (*pitch * mfi->invalid.y);
230}