mirror of https://github.com/mpv-player/mpv
osd: fix possible misses of osd-dimensions property updates
check_obj_resize() in sub/osd.c calls mp_client_broadcast_event(), which calls notify_property_events(). This is pretty unexpected, because check_obj_resize() may be called from the VO thread. While that's sort of awful, it seems to be OK locking-wise. But it breaks an assumption in notify_property_events() that the core doesn't need to be woken up, which could possibly lead to a missed/delayed property update (although rather unlikely). Fix this by explicitly waking up the core when it's called from the OSD code.
This commit is contained in:
parent
a58585d5e0
commit
4a65c22c50
|
@ -779,6 +779,17 @@ void mp_client_broadcast_event(struct MPContext *mpctx, int event, void *data)
|
|||
pthread_mutex_unlock(&clients->lock);
|
||||
}
|
||||
|
||||
// Like mp_client_broadcast_event(), but can be called from any thread.
|
||||
// Avoid using this.
|
||||
void mp_client_broadcast_event_external(struct mp_client_api *api, int event,
|
||||
void *data)
|
||||
{
|
||||
struct MPContext *mpctx = api->mpctx;
|
||||
|
||||
mp_client_broadcast_event(mpctx, event, data);
|
||||
mp_wakeup_core(mpctx);
|
||||
}
|
||||
|
||||
// If client_name == NULL, then broadcast and free the event.
|
||||
int mp_client_send_event(struct MPContext *mpctx, const char *client_name,
|
||||
uint64_t reply_userdata, int event, void *data)
|
||||
|
|
|
@ -39,6 +39,9 @@ struct mpv_global *mp_client_get_global(struct mpv_handle *ctx);
|
|||
struct MPContext *mp_client_get_core(struct mpv_handle *ctx);
|
||||
struct MPContext *mp_client_api_get_core(struct mp_client_api *api);
|
||||
|
||||
void mp_client_broadcast_event_external(struct mp_client_api *api, int event,
|
||||
void *data);
|
||||
|
||||
// m_option.c
|
||||
void *node_get_alloc(struct mpv_node *node);
|
||||
|
||||
|
|
|
@ -242,8 +242,8 @@ static void check_obj_resize(struct osd_state *osd, struct mp_osd_res res,
|
|||
{
|
||||
if (!osd_res_equals(res, obj->vo_res)) {
|
||||
obj->vo_res = res;
|
||||
mp_client_broadcast_event(mp_client_api_get_core(osd->global->client_api),
|
||||
MP_EVENT_WIN_RESIZE, NULL);
|
||||
mp_client_broadcast_event_external(osd->global->client_api,
|
||||
MP_EVENT_WIN_RESIZE, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue