summaryrefslogtreecommitdiffstats
path: root/sub/osd.c
diff options
context:
space:
mode:
authorAman Karmani <aman@tmm1.net>2021-11-24 23:10:47 -0800
committerJan Ekström <jeebjp@gmail.com>2022-04-02 21:41:58 +0300
commitfb7b66ecf1b9fa2bd6f41d99a39412bcc5b84790 (patch)
tree24ca5e2a04e6091e4ed0336348ac6db8269c1ce5 /sub/osd.c
parent76b9254b8ba36101a0a99ca28a76ca93140807f5 (diff)
downloadmpv-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.c16
1 files changed, 6 insertions, 10 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;