mirror of
https://github.com/mpv-player/mpv
synced 2024-08-20 08:55:06 +02:00
vo: use new option update mechanism
This is still rather basic. run_reconfig() and run_control() update the options because it's needed for panscan (and other video scaling options), and fullscreen, border, ontop updates. In the old model, these options could be accessed only while both playback thread and VO threads were locked (i.e. during synchronous calls like vo_control()), so this should be sufficient in order not to miss any updates. In the future, a more fine-grained update mechanism could be added to handle these updates "exactly". x11_common.c contains an evil hack, as I see no reasonable way to handle this properly. The VO thread can't "lock" the main thread, so this is not simple.
This commit is contained in:
parent
423e53ba0b
commit
2c917219cf
@ -150,7 +150,7 @@ static const m_option_t mp_vo_opt_list[] = {
|
||||
{0}
|
||||
};
|
||||
|
||||
static const struct m_sub_options vo_sub_opts = {
|
||||
const struct m_sub_options vo_sub_opts = {
|
||||
.opts = mp_vo_opt_list,
|
||||
.size = sizeof(struct mp_vo_opts),
|
||||
.defaults = &(const struct mp_vo_opts){
|
||||
|
@ -335,5 +335,6 @@ typedef struct MPOpts {
|
||||
|
||||
extern const m_option_t mp_opts[];
|
||||
extern const struct MPOpts mp_default_opts;
|
||||
extern const struct m_sub_options vo_sub_opts;
|
||||
|
||||
#endif
|
||||
|
@ -225,7 +225,6 @@ static struct vo *vo_create(bool probing, struct mpv_global *global,
|
||||
*vo = (struct vo) {
|
||||
.log = mp_log_new(vo, log, name),
|
||||
.driver = desc.p,
|
||||
.opts = global->opts->vo,
|
||||
.global = global,
|
||||
.encode_lavc_ctx = ex->encode_lavc_ctx,
|
||||
.input_ctx = ex->input_ctx,
|
||||
@ -245,6 +244,9 @@ static struct vo *vo_create(bool probing, struct mpv_global *global,
|
||||
pthread_mutex_init(&vo->in->lock, NULL);
|
||||
pthread_cond_init(&vo->in->wakeup, NULL);
|
||||
|
||||
vo->opts_cache = m_config_cache_alloc(vo, global, &vo_sub_opts);
|
||||
vo->opts = vo->opts_cache->opts;
|
||||
|
||||
mp_input_set_mouse_transform(vo->input_ctx, NULL, NULL);
|
||||
if (vo->driver->encode != !!vo->encode_lavc_ctx)
|
||||
goto error;
|
||||
@ -503,6 +505,8 @@ static void run_reconfig(void *p)
|
||||
|
||||
struct vo_internal *in = vo->in;
|
||||
|
||||
m_config_cache_update(vo->opts_cache);
|
||||
|
||||
mp_image_params_get_dsize(params, &vo->dwidth, &vo->dheight);
|
||||
|
||||
talloc_free(vo->params);
|
||||
@ -541,6 +545,7 @@ static void run_control(void *p)
|
||||
struct vo *vo = pp[0];
|
||||
int request = (intptr_t)pp[1];
|
||||
void *data = pp[2];
|
||||
m_config_cache_update(vo->opts_cache);
|
||||
int ret = vo->driver->control(vo, request, data);
|
||||
if (pp[3])
|
||||
*(int *)pp[3] = ret;
|
||||
|
@ -312,9 +312,7 @@ struct vo {
|
||||
struct osd_state *osd;
|
||||
struct encode_lavc_context *encode_lavc_ctx;
|
||||
struct vo_internal *in;
|
||||
struct mp_vo_opts *opts;
|
||||
struct vo_extra extra;
|
||||
struct m_config *config;
|
||||
|
||||
// --- The following fields are generally only changed during initialization.
|
||||
|
||||
@ -329,6 +327,10 @@ struct vo {
|
||||
// --- The following fields can be accessed only by the VO thread, or from
|
||||
// anywhere _if_ the VO thread is suspended (use vo->dispatch).
|
||||
|
||||
struct m_config_cache *opts_cache; // cache for ->opts
|
||||
struct mp_vo_opts *opts;
|
||||
struct m_config *config; // config for ->priv
|
||||
|
||||
bool want_redraw; // redraw as soon as possible
|
||||
|
||||
// current window state
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "config.h"
|
||||
#include "misc/bstr.h"
|
||||
#include "options/options.h"
|
||||
#include "options/m_config.h"
|
||||
#include "common/common.h"
|
||||
#include "common/msg.h"
|
||||
#include "input/input.h"
|
||||
@ -977,6 +978,17 @@ static void vo_x11_update_composition_hint(struct vo *vo)
|
||||
XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&hint, 1);
|
||||
}
|
||||
|
||||
// Maximally awful hack to get MPOpts.vo.fullscreen set. The awful part is that
|
||||
// this sets a variable which is accessed by command.c without synchronization
|
||||
// (and which isn't supposed to need any). The need for this is that there's no
|
||||
// way to update this flag in any other way at all.
|
||||
static void set_global_fs_flag(struct vo *vo, int fs)
|
||||
{
|
||||
struct m_config *rootconfig = mp_get_root_config(vo->global);
|
||||
struct MPOpts *opts = rootconfig->optstruct;
|
||||
opts->vo->fullscreen = fs;
|
||||
}
|
||||
|
||||
static void vo_x11_check_net_wm_state_fullscreen_change(struct vo *vo)
|
||||
{
|
||||
struct vo_x11_state *x11 = vo->x11;
|
||||
@ -1002,6 +1014,7 @@ static void vo_x11_check_net_wm_state_fullscreen_change(struct vo *vo)
|
||||
{
|
||||
vo->opts->fullscreen = is_fullscreen;
|
||||
x11->fs = is_fullscreen;
|
||||
set_global_fs_flag(vo, is_fullscreen);
|
||||
|
||||
if (!is_fullscreen && (x11->pos_changed_during_fs ||
|
||||
x11->size_changed_during_fs))
|
||||
|
Loading…
Reference in New Issue
Block a user