summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-03-24 23:30:12 +0100
committerwm4 <wm4@nowhere>2014-03-24 23:33:10 +0100
commit7f39b4655e76bf26a32a415b0c21bfd4102c6b31 (patch)
treebf88ceae97d2f28c61be2ff2c1c70c9b115eebe0
parent99044308b5820a450d5440f6c2a424cad02cb019 (diff)
downloadmpv-7f39b4655e76bf26a32a415b0c21bfd4102c6b31.tar.bz2
mpv-7f39b4655e76bf26a32a415b0c21bfd4102c6b31.tar.xz
vo_opengl: runtime icc profile switching
The changes in vo_opengl.c are merely for adding the icc options to the set of options than can be changed with the vo_cmdline command.
-rw-r--r--video/out/gl_video.c15
-rw-r--r--video/out/vo_opengl.c44
2 files changed, 40 insertions, 19 deletions
diff --git a/video/out/gl_video.c b/video/out/gl_video.c
index 204b8a8c70..56a56cb1ae 100644
--- a/video/out/gl_video.c
+++ b/video/out/gl_video.c
@@ -1214,12 +1214,17 @@ void gl_video_set_lut3d(struct gl_video *p, struct lut3d *lut3d)
{
GL *gl = p->gl;
- assert(!p->lut_3d_texture);
-
- if (!lut3d)
+ if (!lut3d) {
+ if (p->use_lut_3d) {
+ p->use_lut_3d = false;
+ reinit_rendering(p);
+ }
return;
+ }
+
+ if (!p->lut_3d_texture)
+ gl->GenTextures(1, &p->lut_3d_texture);
- gl->GenTextures(1, &p->lut_3d_texture);
gl->ActiveTexture(GL_TEXTURE0 + TEXUNIT_3DLUT);
gl->BindTexture(GL_TEXTURE_3D, p->lut_3d_texture);
gl->PixelStorei(GL_UNPACK_ALIGNMENT, 4);
@@ -1237,6 +1242,8 @@ void gl_video_set_lut3d(struct gl_video *p, struct lut3d *lut3d)
check_gl_features(p);
debug_check_gl(p, "after 3d lut creation");
+
+ reinit_rendering(p);
}
static void set_image_textures(struct gl_video *p, struct video_image *vimg,
diff --git a/video/out/vo_opengl.c b/video/out/vo_opengl.c
index 8fea170a55..8e117a48b6 100644
--- a/video/out/vo_opengl.c
+++ b/video/out/vo_opengl.c
@@ -262,27 +262,47 @@ static void unload_hwdec_driver(struct gl_priv *p)
}
}
+static bool update_icc_profile(struct gl_priv *p, struct mp_icc_opts *opts)
+{
+ struct lut3d *lut3d = NULL;
+ if (opts->profile) {
+ lut3d = mp_load_icc(opts, p->vo->log, p->vo->global);
+ if (!lut3d)
+ return false;
+ }
+ gl_video_set_lut3d(p->renderer, lut3d);
+ talloc_free(lut3d);
+ return true;
+}
+
static bool reparse_cmdline(struct gl_priv *p, char *args)
{
struct m_config *cfg = NULL;
- struct gl_video_opts *opts = NULL;
+ struct gl_priv *opts = NULL;
int r = 0;
+ // list of options which can be changed at runtime
+#define OPT_BASE_STRUCT struct gl_priv
+ static const struct m_option change_otps[] = {
+ OPT_SUBSTRUCT("", renderer_opts, gl_video_conf, 0),
+ OPT_SUBSTRUCT("", icc_opts, mp_icc_conf, 0),
+ {0}
+ };
+#undef OPT_BASE_STRUCT
+
if (strcmp(args, "-") == 0) {
- opts = p->renderer_opts;
+ opts = p;
} else {
const struct gl_priv *vodef = p->vo->driver->priv_defaults;
- const struct gl_video_opts *def =
- vodef ? vodef->renderer_opts : gl_video_conf.defaults;
- cfg = m_config_new(NULL, p->vo->log, sizeof(*opts), def,
- gl_video_conf.opts);
+ cfg = m_config_new(NULL, p->vo->log, sizeof(*opts), vodef, change_otps);
opts = cfg->optstruct;
r = m_config_parse_suboptions(cfg, "opengl", args);
}
if (r >= 0) {
mpgl_lock(p->glctx);
- gl_video_set_options(p->renderer, opts);
+ gl_video_set_options(p->renderer, opts->renderer_opts);
+ update_icc_profile(p, opts->icc_opts);
resize(p);
mpgl_unlock(p->glctx);
}
@@ -396,14 +416,8 @@ static int preinit(struct vo *vo)
gl_video_set_output_depth(p->renderer, p->glctx->depth_r, p->glctx->depth_g,
p->glctx->depth_b);
gl_video_set_options(p->renderer, p->renderer_opts);
-
- if (p->icc_opts->profile) {
- struct lut3d *lut3d = mp_load_icc(p->icc_opts, vo->log, vo->global);
- if (!lut3d)
- goto err_out;
- gl_video_set_lut3d(p->renderer, lut3d);
- talloc_free(lut3d);
- }
+ if (!update_icc_profile(p, p->icc_opts))
+ goto err_out;
mpgl_unset_context(p->glctx);