diff options
author | wm4 <wm4@nowhere> | 2017-12-29 17:19:25 +0100 |
---|---|---|
committer | Kevin Mitchell <kevmitch@gmail.com> | 2018-01-02 14:27:37 -0800 |
commit | 6aad532aa39481a8100910612fad039dd75236b9 (patch) | |
tree | 53c790d6c66917e66039c25a13cdf27f90bbf0d9 /sub/dec_sub.c | |
parent | 3bf7df4a5e1f46248c78e9e596cd8dab6ff57356 (diff) | |
download | mpv-6aad532aa39481a8100910612fad039dd75236b9.tar.bz2 mpv-6aad532aa39481a8100910612fad039dd75236b9.tar.xz |
options: move most subtitle and OSD rendering options to sub structs
Remove them from the big MPOpts struct and move them to their sub
structs. In the places where their fields are used, create a private
copy of the structs, instead of accessing the semi-deprecated global
option struct instance (mpv_global.opts) directly.
This actually makes accessing these options finally thread-safe. They
weren't even if they should have for years. (Including some potential
for undefined behavior when e.g. the OSD font was changed at runtime.)
This is mostly transparent. All options get moved around, but most users
of the options just need to access a different struct (changing sd.opts
to a different type changes a lot of uses, for example).
One thing which has to be considered and could cause potential
regressions is that the new option copies must be explicitly updated.
sub_update_opts() takes care of this for example.
Another thing is that writing to the option structs manually won't work,
because the changes won't be propagated to other copies. Apparently the
only affected case is the implementation of the sub-step command, which
tries to change sub_delay. Handle this one explicitly (osd_changed()
doesn't need to be called anymore, because changing the option triggers
UPDATE_OSD, and updates the OSD as a consequence). The way the option
value is propagated is rather hacky, but for now this will do.
Diffstat (limited to 'sub/dec_sub.c')
-rw-r--r-- | sub/dec_sub.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/sub/dec_sub.c b/sub/dec_sub.c index b9fdc7adb9..99acab33f2 100644 --- a/sub/dec_sub.c +++ b/sub/dec_sub.c @@ -26,6 +26,7 @@ #include "demux/demux.h" #include "sd.h" #include "dec_sub.h" +#include "options/m_config.h" #include "options/options.h" #include "common/global.h" #include "common/msg.h" @@ -48,7 +49,8 @@ struct dec_sub { struct mp_log *log; struct mpv_global *global; - struct MPOpts *opts; + struct mp_subtitle_opts *opts; + struct m_config_cache *opts_cache; struct mp_recorder_sink *recorder_sink; @@ -71,7 +73,7 @@ struct dec_sub { static void update_subtitle_speed(struct dec_sub *sub) { - struct MPOpts *opts = sub->opts; + struct mp_subtitle_opts *opts = sub->opts; sub->sub_speed = 1.0; if (sub->video_fps > 0 && sub->codec->frame_based > 0) { @@ -89,7 +91,7 @@ static void update_subtitle_speed(struct dec_sub *sub) // Return the subtitle PTS used for a given video PTS. static double pts_to_subtitle(struct dec_sub *sub, double pts) { - struct MPOpts *opts = sub->opts; + struct mp_subtitle_opts *opts = sub->opts; if (pts != MP_NOPTS_VALUE) pts = (pts - opts->sub_delay) / sub->sub_speed; @@ -99,7 +101,7 @@ static double pts_to_subtitle(struct dec_sub *sub, double pts) static double pts_from_subtitle(struct dec_sub *sub, double pts) { - struct MPOpts *opts = sub->opts; + struct mp_subtitle_opts *opts = sub->opts; if (pts != MP_NOPTS_VALUE) pts = pts * sub->sub_speed + opts->sub_delay; @@ -168,7 +170,7 @@ struct dec_sub *sub_create(struct mpv_global *global, struct sh_stream *sh, *sub = (struct dec_sub){ .log = mp_log_new(sub, global->log, "sub"), .global = global, - .opts = global->opts, + .opts_cache = m_config_cache_alloc(sub, global, &mp_subtitle_sub_opts), .sh = sh, .codec = sh->codec, .attachments = talloc_steal(sub, attachments), @@ -177,6 +179,7 @@ struct dec_sub *sub_create(struct mpv_global *global, struct sh_stream *sh, .start = MP_NOPTS_VALUE, .end = MP_NOPTS_VALUE, }; + sub->opts = sub->opts_cache->opts; mpthread_mutex_init_recursive(&sub->lock); sub->sd = init_decoder(sub); @@ -314,7 +317,7 @@ bool sub_read_packets(struct dec_sub *sub, double video_pts) void sub_get_bitmaps(struct dec_sub *sub, struct mp_osd_res dim, int format, double pts, struct sub_bitmaps *res) { - struct MPOpts *opts = sub->opts; + struct mp_subtitle_opts *opts = sub->opts; pts = pts_to_subtitle(sub, pts); @@ -334,7 +337,7 @@ void sub_get_bitmaps(struct dec_sub *sub, struct mp_osd_res dim, int format, char *sub_get_text(struct dec_sub *sub, double pts) { pthread_mutex_lock(&sub->lock); - struct MPOpts *opts = sub->opts; + struct mp_subtitle_opts *opts = sub->opts; char *text = NULL; pts = pts_to_subtitle(sub, pts); @@ -377,9 +380,6 @@ int sub_control(struct dec_sub *sub, enum sd_ctrl cmd, void *arg) sub->video_fps = *(double *)arg; update_subtitle_speed(sub); break; - case SD_CTRL_UPDATE_SPEED: - update_subtitle_speed(sub); - break; case SD_CTRL_SUB_STEP: { double *a = arg; double arg2[2] = {a[0], a[1]}; @@ -398,6 +398,14 @@ int sub_control(struct dec_sub *sub, enum sd_ctrl cmd, void *arg) return r; } +void sub_update_opts(struct dec_sub *sub) +{ + pthread_mutex_lock(&sub->lock); + if (m_config_cache_update(sub->opts_cache)) + update_subtitle_speed(sub); + pthread_mutex_unlock(&sub->lock); +} + void sub_set_recorder_sink(struct dec_sub *sub, struct mp_recorder_sink *sink) { pthread_mutex_lock(&sub->lock); |