From fb7b66ecf1b9fa2bd6f41d99a39412bcc5b84790 Mon Sep 17 00:00:00 2001 From: Aman Karmani Date: Wed, 24 Nov 2021 23:10:47 -0800 Subject: sub/osd: use atomic for osd_state.force_video_pts this field is used only in a special vo draining edge case. switching to an atomic reduces osd->lock contention between the mpv core (in write_video) and vo threads which are managing osd rendering manually (such as vo_rpi). Signed-off-by: Aman Karmani --- sub/osd.c | 16 ++++++---------- sub/osd_state.h | 3 ++- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/sub/osd.c b/sub/osd.c index 297ad88fe8..6892925e25 100644 --- a/sub/osd.c +++ b/sub/osd.c @@ -124,7 +124,7 @@ struct osd_state *osd_create(struct mpv_global *global) .opts_cache = m_config_cache_alloc(osd, global, &mp_osd_render_sub_opts), .global = global, .log = mp_log_new(osd, global->log, "osd"), - .force_video_pts = MP_NOPTS_VALUE, + .force_video_pts = ATOMIC_VAR_INIT(MP_NOPTS_VALUE), .stats = stats_ctx_create(osd, global, "osd"), }; pthread_mutex_init(&osd->lock, NULL); @@ -210,17 +210,12 @@ void osd_set_render_subs_in_filter(struct osd_state *osd, bool s) void osd_set_force_video_pts(struct osd_state *osd, double video_pts) { - pthread_mutex_lock(&osd->lock); - osd->force_video_pts = video_pts; - pthread_mutex_unlock(&osd->lock); + atomic_store(&osd->force_video_pts, video_pts); } double osd_get_force_video_pts(struct osd_state *osd) { - pthread_mutex_lock(&osd->lock); - double pts = osd->force_video_pts; - pthread_mutex_unlock(&osd->lock); - return pts; + return atomic_load(&osd->force_video_pts); } void osd_set_progbar(struct osd_state *osd, struct osd_progbar_state *s) @@ -335,8 +330,9 @@ struct sub_bitmap_list *osd_render(struct osd_state *osd, struct mp_osd_res res, list->w = res.w; list->h = res.h; - if (osd->force_video_pts != MP_NOPTS_VALUE) - video_pts = osd->force_video_pts; + double force_video_pts = atomic_load(&osd->force_video_pts); + if (force_video_pts != MP_NOPTS_VALUE) + video_pts = force_video_pts; if (draw_flags & OSD_DRAW_SUB_FILTER) draw_flags |= OSD_DRAW_SUB_ONLY; diff --git a/sub/osd_state.h b/sub/osd_state.h index 056e54b1a8..fc6e515610 100644 --- a/sub/osd_state.h +++ b/sub/osd_state.h @@ -3,6 +3,7 @@ #include +#include "osdep/atomic.h" #include "osd.h" enum mp_osdtype { @@ -70,7 +71,7 @@ struct osd_state { struct osd_object *objs[MAX_OSD_PARTS]; bool render_subs_in_filter; - double force_video_pts; + mp_atomic_double force_video_pts; bool want_redraw; bool want_redraw_notification; -- cgit v1.2.3