summaryrefslogtreecommitdiffstats
path: root/src/multimedia/shaders/colortransfer.glsl
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2022-03-31 22:03:26 +0200
committerLars Knoll <lars.knoll@qt.io>2022-04-07 13:02:55 +0200
commit397c6f6328f09599233f7dd6da2c82d4762ec1e9 (patch)
tree8bd80b7dc05bc2aa7fc98935f8cfb86546ef6bf3 /src/multimedia/shaders/colortransfer.glsl
parent72947171a99fbc592d2687894749fec70aa31b2d (diff)
Add support for videos encoded with an HLG transfer function
Add support for HDR videos using a hybrid log gamma transfer function. Change-Id: I844e688daa7d8db8aa727ce2bc8e182b12c8a41d Reviewed-by: Rafael Roquetto <rafael.roquetto@qt.io>
Diffstat (limited to 'src/multimedia/shaders/colortransfer.glsl')
-rw-r--r--src/multimedia/shaders/colortransfer.glsl21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/multimedia/shaders/colortransfer.glsl b/src/multimedia/shaders/colortransfer.glsl
index 7af8c73d0..35c0f0e51 100644
--- a/src/multimedia/shaders/colortransfer.glsl
+++ b/src/multimedia/shaders/colortransfer.glsl
@@ -60,4 +60,25 @@ float convertPQFromLinear(float sig)
return pow(num/den, m2);
}
+// This implements support for HLG transfer functions, see also https://en.wikipedia.org/wiki/Hybrid_log–gamma
+
+
+vec4 convertHLGToLinear(vec4 rgba, float maxLum)
+{
+ const float a = 0.17883277;
+ const float b = 0.28466892; // = 1 - 4a
+ const float c = 0.55991073; // = 0.5 - a ln(4a)
+
+ bvec4 cutoff = lessThan(rgba, vec4(0.5));
+ vec4 low = rgba*rgba/3;
+ vec4 high = (exp((rgba - c)/a) + b)/12.;
+ rgba = mix(high, low, cutoff);
+
+ float lum = dot(rgba, vec4(0.2627, 0.6780, 0.0593, 0.));
+ float y = pow(lum, 0.2); // gamma-1 with gamma = 1.2
+
+ rgba *= y*maxLum;
+ return rgba;
+}
+
#endif