summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-08-20 21:35:45 +0200
committerwm4 <wm4@nowhere>2014-08-20 21:35:45 +0200
commit7758c15e95c1cc4b16ca309e0760e51aad423b29 (patch)
tree0f132495d9a9e4fe20f333986f74a0e9c0223965
parent09897bed7f6905427dd35196b3c17aa7d3d066ab (diff)
downloadmpv-7758c15e95c1cc4b16ca309e0760e51aad423b29.tar.bz2
mpv-7758c15e95c1cc4b16ca309e0760e51aad423b29.tar.xz
video: don't assume query_format is thread-safe
Although it's probably safe for most VOs, there's no guarantee.
-rw-r--r--player/playloop.c2
-rw-r--r--player/video.c7
-rw-r--r--video/out/vo.c15
-rw-r--r--video/out/vo.h1
4 files changed, 19 insertions, 6 deletions
diff --git a/player/playloop.c b/player/playloop.c
index a8c47d8e66..f7f92a2eda 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -771,7 +771,7 @@ void handle_force_window(struct MPContext *mpctx, bool reconfig)
// Pick whatever works
int config_format = 0;
for (int fmt = IMGFMT_START; fmt < IMGFMT_END; fmt++) {
- if (vo->driver->query_format(vo, fmt)) {
+ if (vo_query_format(vo, fmt)) {
config_format = fmt;
break;
}
diff --git a/player/video.c b/player/video.c
index ffe24e621c..fd998014d5 100644
--- a/player/video.c
+++ b/player/video.c
@@ -91,10 +91,8 @@ void update_fps(struct MPContext *mpctx)
static void set_allowed_vo_formats(struct vf_chain *c, struct vo *vo)
{
- for (int fmt = IMGFMT_START; fmt < IMGFMT_END; fmt++) {
- c->allowed_output_formats[fmt - IMGFMT_START] =
- vo->driver->query_format(vo, fmt);
- }
+ for (int fmt = IMGFMT_START; fmt < IMGFMT_END; fmt++)
+ c->allowed_output_formats[fmt - IMGFMT_START] = vo_query_format(vo, fmt);
}
static int try_filter(struct MPContext *mpctx, struct mp_image_params params,
@@ -575,7 +573,6 @@ static int update_video(struct MPContext *mpctx, double endpts)
}
- //bool vo_framedrop = !!mpctx->video_out->driver->flip_page_timed;
bool vo_framedrop = !!(mpctx->opts->frame_dropping & 1);
int min_frames = vo_framedrop ? 2 : 1; // framedrop needs duration
diff --git a/video/out/vo.c b/video/out/vo.c
index f920e12da8..c348a37f24 100644
--- a/video/out/vo.c
+++ b/video/out/vo.c
@@ -748,6 +748,21 @@ bool vo_has_frame(struct vo *vo)
return vo->in->hasframe;
}
+static void run_query_format(void *p)
+{
+ void **pp = p;
+ struct vo *vo = pp[0];
+ *(int *)pp[2] = vo->driver->query_format(vo, *(int *)pp[1]);
+}
+
+int vo_query_format(struct vo *vo, int format)
+{
+ int ret;
+ void *p[] = {vo, &format, &ret};
+ mp_dispatch_run(vo->in->dispatch, run_query_format, p);
+ return ret;
+}
+
// Calculate the appropriate source and destination rectangle to
// get a correctly scaled picture, including pan-scan.
// out_src: visible part of the video
diff --git a/video/out/vo.h b/video/out/vo.h
index a384ed5ad6..9e70bde310 100644
--- a/video/out/vo.h
+++ b/video/out/vo.h
@@ -288,6 +288,7 @@ void vo_seek_reset(struct vo *vo);
void vo_destroy(struct vo *vo);
void vo_set_paused(struct vo *vo, bool paused);
int64_t vo_get_drop_count(struct vo *vo);
+int vo_query_format(struct vo *vo, int format);
void vo_set_flip_queue_offset(struct vo *vo, int64_t us);
int64_t vo_get_vsync_interval(struct vo *vo);