1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-29 18:42:09 +00:00

vo: don't access global options unsynchronized

And since there's no proper fine-grained option change notification
mechanism yet, intercept updates to "framedrop" manually.
This commit is contained in:
wm4 2016-09-08 18:53:20 +02:00
parent c3097422f2
commit a2fce5ba26
2 changed files with 21 additions and 6 deletions

View File

@ -2673,6 +2673,16 @@ static int mp_property_display_fps(void *ctx, struct m_property *prop,
return m_property_double_ro(action, arg, fps);
}
static int mp_property_framedrop(void *ctx, struct m_property *prop,
int action, void *arg)
{
MPContext *mpctx = ctx;
int ret = mp_property_generic_option(mpctx, prop, action, arg);
if (action == M_PROPERTY_SET && ret == M_PROPERTY_OK && mpctx->video_out)
vo_event(mpctx->video_out, VO_EVENT_WIN_STATE);
return ret;
}
static int mp_property_estimated_display_fps(void *ctx, struct m_property *prop,
int action, void *arg)
{
@ -3881,6 +3891,7 @@ static const struct m_property mp_properties_base[] = {
{"display-fps", mp_property_display_fps},
{"estimated-display-fps", mp_property_estimated_display_fps},
{"vsync-jitter", mp_property_vsync_jitter},
{"framedrop", mp_property_framedrop},
{"working-directory", mp_property_cwd},

View File

@ -156,6 +156,7 @@ struct vo_internal {
int req_frames; // VO's requested value of num_frames
double display_fps;
int opt_framedrop;
};
static void forget_frames(struct vo *vo);
@ -458,12 +459,15 @@ static void update_display_fps(struct vo *vo)
pthread_mutex_unlock(&in->lock);
double display_fps = 0;
if (vo->global->opts->frame_drop_fps > 0) {
display_fps = vo->global->opts->frame_drop_fps;
} else {
mp_read_option_raw(vo->global, "framedrop", &m_option_type_choice,
&in->opt_framedrop);
double display_fps;
mp_read_option_raw(vo->global, "display-fps", &m_option_type_double,
&display_fps);
if (display_fps <= 0)
vo->driver->control(vo, VOCTRL_GET_DISPLAY_FPS, &display_fps);
}
pthread_mutex_lock(&in->lock);
@ -763,7 +767,7 @@ static bool render_frame(struct vo *vo)
in->dropped_frame &= !frame->display_synced;
in->dropped_frame &= !(vo->driver->caps & VO_CAP_FRAMEDROP);
in->dropped_frame &= (vo->global->opts->frame_dropping & 1);
in->dropped_frame &= (in->opt_framedrop & 1);
// Even if we're hopelessly behind, rather degrade to 10 FPS playback,
// instead of just freezing the display forever.
in->dropped_frame &= now - in->prev_vsync < 100 * 1000;