diff options
author | wm4 <wm4@nowhere> | 2016-06-03 20:35:17 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2016-06-03 20:35:22 +0200 |
commit | 026b75e7f509d29d25f42cb335538f369fb6c381 (patch) | |
tree | 23bf7c8664e97cb040fe6c90efd7156b2aa1040b /video/out/opengl | |
parent | 2179879172be97541ceffdd7d29cba09c1ca9629 (diff) | |
download | mpv-026b75e7f509d29d25f42cb335538f369fb6c381.tar.bz2 mpv-026b75e7f509d29d25f42cb335538f369fb6c381.tar.xz |
vo_opengl: move all icc handling from vo_opengl.c to video.c
Originally, video.c did not access any CMS things (other than lut3d
being set on it), but this has changed. In practice, almost all accesses
to it have moved to video.c. vo_opengl only created it, and set the auto
icc profile path.
Complete the move.
Some things wrt. option handling are a bit fishy. (But when is this not
the case.)
icc-profile-auto was not tested, but the distributed human CI will take
care of it.
Diffstat (limited to 'video/out/opengl')
-rw-r--r-- | video/out/opengl/lcms.c | 2 | ||||
-rw-r--r-- | video/out/opengl/video.c | 31 | ||||
-rw-r--r-- | video/out/opengl/video.h | 7 |
3 files changed, 31 insertions, 9 deletions
diff --git a/video/out/opengl/lcms.c b/video/out/opengl/lcms.c index 7dc1b63220..374ddb0b4c 100644 --- a/video/out/opengl/lcms.c +++ b/video/out/opengl/lcms.c @@ -145,7 +145,7 @@ void gl_lcms_set_options(struct gl_lcms *p, struct mp_icc_opts *opts) // takes over ownership. void gl_lcms_set_memory_profile(struct gl_lcms *p, bstr *profile) { - if (!p->opts.profile_auto) { + if (!p->opts.profile_auto || (p->icc_path && p->icc_path[0])) { talloc_free(profile->start); return; } diff --git a/video/out/opengl/video.c b/video/out/opengl/video.c index c93bb67599..5c24bdbb1d 100644 --- a/video/out/opengl/video.c +++ b/video/out/opengl/video.c @@ -458,6 +458,7 @@ const struct m_sub_options gl_video_conf = { prescale_downscaling_threshold, 0, 0.0, 32.0), OPT_SUBSTRUCT("superxbr", superxbr_opts, superxbr_conf, 0), OPT_SUBSTRUCT("nnedi3", nnedi3_opts, nnedi3_conf, 0), + OPT_SUBSTRUCT("", icc_opts, mp_icc_conf, 0), OPT_REMOVED("approx-gamma", "this is always enabled now"), OPT_REMOVED("cscale-down", "chroma is never downscaled"), @@ -608,8 +609,12 @@ static void uninit_rendering(struct gl_video *p) gl_sc_reset_error(p->sc); } -void gl_video_update_profile(struct gl_video *p) +// Warning: profile.start must point to a ta allocation, and the function +// takes over ownership. +void gl_video_set_icc_profile(struct gl_video *p, bstr icc_data) { + gl_lcms_set_memory_profile(p->cms, &icc_data); + if (p->use_lut_3d) return; @@ -617,6 +622,11 @@ void gl_video_update_profile(struct gl_video *p) check_gl_features(p); } +bool gl_video_icc_auto_enabled(struct gl_video *p) +{ + return p->opts.icc_opts ? p->opts.icc_opts->profile_auto : false; +} + static bool gl_video_get_lut3d(struct gl_video *p, enum mp_csp_prim prim, enum mp_csp_trc trc) { @@ -3450,8 +3460,7 @@ void gl_video_set_osd_source(struct gl_video *p, struct osd_state *osd) reinit_osd(p); } -struct gl_video *gl_video_init(GL *gl, struct mp_log *log, struct mpv_global *g, - struct gl_lcms *cms) +struct gl_video *gl_video_init(GL *gl, struct mp_log *log, struct mpv_global *g) { if (gl->version < 210 && gl->es < 200) { mp_err(log, "At least OpenGL 2.1 or OpenGL ES 2.0 required.\n"); @@ -3463,7 +3472,7 @@ struct gl_video *gl_video_init(GL *gl, struct mp_log *log, struct mpv_global *g, .gl = gl, .global = g, .log = log, - .cms = cms, + .cms = gl_lcms_init(p, log, g), .opts = gl_video_opts_def, .texture_16bit_depth = 16, .sc = gl_sc_create(gl, log), @@ -3516,6 +3525,7 @@ static void assign_options(struct gl_video_opts *dst, struct gl_video_opts *src) talloc_free(dst->deband_opts); talloc_free(dst->superxbr_opts); talloc_free(dst->nnedi3_opts); + talloc_free(dst->icc_opts); *dst = *src; @@ -3529,7 +3539,12 @@ static void assign_options(struct gl_video_opts *dst, struct gl_video_opts *src) if (src->nnedi3_opts) { dst->nnedi3_opts = m_sub_options_copy(NULL, &nnedi3_conf, - src->nnedi3_opts); + src->nnedi3_opts); + } + + if (src->icc_opts) { + dst->icc_opts = m_sub_options_copy(NULL, &mp_icc_conf, + src->icc_opts); } for (int n = 0; n < SCALER_COUNT; n++) { @@ -3550,6 +3565,12 @@ void gl_video_set_options(struct gl_video *p, struct gl_video_opts *opts) { assign_options(&p->opts, opts); + if (p->opts.icc_opts) { + gl_lcms_set_options(p->cms, p->opts.icc_opts); + if (p->opts.icc_opts->profile && p->opts.icc_opts->profile[0]) + p->use_lut_3d = true; + } + check_gl_features(p); uninit_rendering(p); gl_video_setup_hooks(p); diff --git a/video/out/opengl/video.h b/video/out/opengl/video.h index 026d18526d..29a5ea9643 100644 --- a/video/out/opengl/video.h +++ b/video/out/opengl/video.h @@ -148,6 +148,7 @@ struct gl_video_opts { float prescale_downscaling_threshold; struct superxbr_opts *superxbr_opts; struct nnedi3_opts *nnedi3_opts; + struct mp_icc_opts *icc_opts; }; extern const struct m_sub_options gl_video_conf; @@ -157,15 +158,13 @@ extern const struct gl_video_opts gl_video_opts_def; struct gl_video; struct vo_frame; -struct gl_video *gl_video_init(GL *gl, struct mp_log *log, struct mpv_global *g, - struct gl_lcms *cms); +struct gl_video *gl_video_init(GL *gl, struct mp_log *log, struct mpv_global *g); void gl_video_uninit(struct gl_video *p); void gl_video_set_osd_source(struct gl_video *p, struct osd_state *osd); void gl_video_set_options(struct gl_video *p, struct gl_video_opts *opts); bool gl_video_check_format(struct gl_video *p, int mp_format); void gl_video_config(struct gl_video *p, struct mp_image_params *params); void gl_video_set_output_depth(struct gl_video *p, int r, int g, int b); -void gl_video_update_profile(struct gl_video *p); void gl_video_render_frame(struct gl_video *p, struct vo_frame *frame, int fbo); void gl_video_resize(struct gl_video *p, int vp_w, int vp_h, struct mp_rect *src, struct mp_rect *dst, @@ -179,6 +178,8 @@ void gl_video_set_debug(struct gl_video *p, bool enable); float gl_video_scale_ambient_lux(float lmin, float lmax, float rmin, float rmax, float lux); void gl_video_set_ambient_lux(struct gl_video *p, int lux); +void gl_video_set_icc_profile(struct gl_video *p, bstr icc_data); +bool gl_video_icc_auto_enabled(struct gl_video *p); void gl_video_set_gl_state(struct gl_video *p); void gl_video_unset_gl_state(struct gl_video *p); |