diff options
author | Aman Karmani <aman@tmm1.net> | 2021-11-24 23:10:47 -0800 |
---|---|---|
committer | Jan Ekström <jeebjp@gmail.com> | 2022-04-02 21:41:58 +0300 |
commit | fb7b66ecf1b9fa2bd6f41d99a39412bcc5b84790 (patch) | |
tree | 24ca5e2a04e6091e4ed0336348ac6db8269c1ce5 /sub/osd.c | |
parent | 76b9254b8ba36101a0a99ca28a76ca93140807f5 (diff) | |
download | mpv-fb7b66ecf1b9fa2bd6f41d99a39412bcc5b84790.tar.bz2 mpv-fb7b66ecf1b9fa2bd6f41d99a39412bcc5b84790.tar.xz |
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 <aman@tmm1.net>
Diffstat (limited to 'sub/osd.c')
-rw-r--r-- | sub/osd.c | 16 |
1 files changed, 6 insertions, 10 deletions
@@ -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; |