20#include <freerdp/config.h>
26#include "mf_mountain_lion.h"
28#define MF_INFO_DEFAULT_FPS 30
29#define MF_INFO_MAXPEERS 32
31static mfInfo* mfInfoInstance =
nullptr;
33int mf_info_lock(mfInfo* mfi)
35 int status = pthread_mutex_lock(&mfi->mutex);
51int mf_info_try_lock(mfInfo* mfi, UINT32 ms)
53 int status = pthread_mutex_trylock(&mfi->mutex);
73int mf_info_unlock(mfInfo* mfi)
75 int status = pthread_mutex_unlock(&mfi->mutex);
92static mfInfo* mf_info_init(
void)
94 mfInfo* mfi = (mfInfo*)calloc(1,
sizeof(mfInfo));
98 pthread_mutex_init(&mfi->mutex,
nullptr);
100 mfi->peers = (freerdp_peer**)calloc(MF_INFO_MAXPEERS,
sizeof(freerdp_peer*));
107 mfi->framesPerSecond = MF_INFO_DEFAULT_FPS;
108 mfi->input_disabled = FALSE;
114mfInfo* mf_info_get_instance(
void)
116 if (mfInfoInstance ==
nullptr)
117 mfInfoInstance = mf_info_init();
119 return mfInfoInstance;
122void mf_info_peer_register(mfInfo* mfi, mfPeerContext* context)
124 if (mf_info_lock(mfi) > 0)
128 if (mfi->peerCount == MF_INFO_MAXPEERS)
136 if (mfi->peerCount == 0)
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();
145 for (
int i = 0; i < MF_INFO_MAXPEERS; ++i)
148 if (mfi->peers[i] ==
nullptr)
155 mfi->peers[peerId] = ((rdpContext*)context)->peer;
156 mfi->peers[peerId]->pId = peerId;
163void mf_info_peer_unregister(mfInfo* mfi, mfPeerContext* context)
165 if (mf_info_lock(mfi) > 0)
169 peerId = ((rdpContext*)context)->peer->pId;
170 mfi->peers[peerId] =
nullptr;
173 if (mfi->peerCount == 0)
174 mf_mlion_stop_getting_screen_updates();
180BOOL mf_info_have_updates(mfInfo* mfi)
182 if (mfi->framesWaiting == 0)
188void mf_info_update_changes(mfInfo* mfi)
192void mf_info_find_invalid_region(mfInfo* mfi)
194 mf_mlion_get_dirty_region(&mfi->invalid);
197void mf_info_clear_invalid_region(mfInfo* mfi)
199 mf_mlion_clear_dirty_region();
200 mfi->invalid.height = 0;
201 mfi->invalid.width = 0;
204void mf_info_invalidate_full_screen(mfInfo* mfi)
208 mfi->invalid.height = mfi->servscreen_height;
209 mfi->invalid.width = mfi->servscreen_width;
212BOOL mf_info_have_invalid_region(mfInfo* mfi)
214 if (mfi->invalid.width * mfi->invalid.height == 0)
220void mf_info_getScreenData(mfInfo* mfi,
long* width,
long* height, BYTE** pBits,
int* pitch)
222 *width = mfi->invalid.width / mfi->scale;
223 *height = mfi->invalid.height / mfi->scale;
224 *pitch = mfi->servscreen_width * mfi->scale * 4;
226 mf_mlion_get_pixelData(mfi->invalid.x / mfi->scale, mfi->invalid.y / mfi->scale, *width,
229 *pBits = *pBits + (mfi->invalid.x * 4) + (*pitch * mfi->invalid.y);