summaryrefslogtreecommitdiffstats
path: root/video/out/gl_lcms.c
diff options
context:
space:
mode:
authorNiklas Haas <git@nand.wakku.to>2014-02-24 13:39:39 +0100
committerNiklas Haas <git@nand.wakku.to>2014-02-24 14:34:12 +0100
commit701c8c8254c22b2def38515a1d09dcdd94fea3d3 (patch)
tree469e007601bf208297cce966db3b4a57dbb24aae /video/out/gl_lcms.c
parente3f7d4f5ea67a74b2f47103974f11c35ad58d972 (diff)
downloadmpv-701c8c8254c22b2def38515a1d09dcdd94fea3d3.tar.bz2
mpv-701c8c8254c22b2def38515a1d09dcdd94fea3d3.tar.xz
vo_opengl: Add :icc-approx-gamma suboption to approximate BT.709 gamma
This uses the value of 1.95 as an approximation for the exact gamma curve, which replicates the behavior of popular video software including anything in the Apple ecosystem, as per issue #534.
Diffstat (limited to 'video/out/gl_lcms.c')
-rw-r--r--video/out/gl_lcms.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/video/out/gl_lcms.c b/video/out/gl_lcms.c
index a6f30e0126..6fd86d9874 100644
--- a/video/out/gl_lcms.c
+++ b/video/out/gl_lcms.c
@@ -73,6 +73,7 @@ const struct m_sub_options mp_icc_conf = {
OPT_STRING("icc-profile", profile, 0),
OPT_STRING("icc-cache", cache, 0),
OPT_INT("icc-intent", intent, 0),
+ OPT_FLAG("icc-approx-gamma", approx, 0),
OPT_STRING_VALIDATE("3dlut-size", size_str, 0, validate_3dlut_size_opt),
{0}
},
@@ -164,13 +165,22 @@ struct lut3d *mp_load_icc(struct mp_icc_opts *opts, struct mp_log *log,
.Blue = {0.15, 0.06, 1.0},
};
- /* Rec BT.709 defines the tone curve as:
- V = 1.099 * L^0.45 - 0.099 for L >= 0.018
- V = 4.500 * L for L < 0.018
-
- The 0.081 parameter comes from inserting 0.018 into the function */
- cmsToneCurve *tonecurve = cmsBuildParametricToneCurve(NULL, 4,
+ cmsToneCurve *tonecurve;
+ if (opts->approx) {
+ /* Apple's CMS, among other programs that rely on it, uses 1.95 as a
+ faster approximation of this curve. It's not quite correct, but the
+ option is provided for compatibility with such incorrect clips. */
+ tonecurve = cmsBuildGamma(NULL, 1.95);
+ } else {
+ /* Rec BT.709 defines the tone curve as:
+ V = 1.099 * L^0.45 - 0.099 for L >= 0.018
+ V = 4.500 * L for L < 0.018
+
+ The 0.081 parameter comes from inserting 0.018 into the function */
+ tonecurve = cmsBuildParametricToneCurve(NULL, 4,
(cmsFloat64Number[5]){1/0.45, 1/1.099, 0.099/1.099, 1/4.5, 0.081});
+ }
+
cmsHPROFILE vid_profile = cmsCreateRGBProfile(&d65, &bt709prim,
(cmsToneCurve*[3]){tonecurve, tonecurve, tonecurve});
cmsFreeToneCurve(tonecurve);