[vlc-devel] [vlc-commits] video_output: opengl: add BT.2020 decoding matrices
Steve Lhomme
robux4 at gmail.com
Sat Nov 4 09:35:58 CET 2017
On Fri, Nov 3, 2017 at 11:11 AM, Niklas Haas <git at videolan.org> wrote:
> vlc | branch: master | Niklas Haas <git at haasn.xyz> | Wed Nov 1 17:09:22 2017 +0100| [a4ef9238413a07976903b539041b8b1ed1d33a8f] | committer: Thomas Guillem
>
> video_output: opengl: add BT.2020 decoding matrices
>
> Generated the matrices using the following small program:
>
> #include <stdio.h>
> #include <libplacebo/colorspace.h>
>
> void main()
> {
> struct pl_color_repr repr = {
> .sys = PL_COLOR_SYSTEM_BT_2020_NC,
> .levels = PL_COLOR_LEVELS_TV,
> };
>
> struct pl_transform3x3 tf = pl_color_repr_decode(&repr, NULL);
> for (int i = 0; i < 3; i++) {
> printf("% .15f, % .15f, % .15f, % .15f ,\n",
> tf.mat.m[i][0], tf.mat.m[i][1], tf.mat.m[i][2], tf.c[i]);
> }
> }
>
> I've also verified that the BT.709 and BT.601 matrices are identical
> within an error margin of several orders of magnitude. (Probably due to
> floating point inaccuracy)
>
> P.s. VLC doesn't seem to distinguish between BT.2020-NC and BT.2020-CL,
> which I believe is a bug. But anyway, we can only easily handle
> BT.2020-NC anyway, so hard-code it as that. (BT.2020-CL support would
> require some more libplacebo integration)
>
> Signed-off-by: Thomas Guillem <thomas at gllm.fr>
>
>> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a4ef9238413a07976903b539041b8b1ed1d33a8f
> ---
>
> modules/video_output/opengl/fragment_shaders.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/modules/video_output/opengl/fragment_shaders.c b/modules/video_output/opengl/fragment_shaders.c
> index 9516dbd767..950bb9090b 100644
> --- a/modules/video_output/opengl/fragment_shaders.c
> +++ b/modules/video_output/opengl/fragment_shaders.c
> @@ -231,6 +231,11 @@ tc_yuv_base_init(opengl_tex_converter_t *tc, GLenum tex_target,
> 1.164383561643836, -0.21324861427373, -0.532909328559444, 0.301482665475862 ,
> 1.164383561643836, 2.112401785714286, 0.0000, -1.133402217873451 ,
> };
> + static const float matrix_bt2020_tv2full[12] = {
> + 1.164383530616760, 0.0000, 1.678674221038818, -0.915687978267670 ,
> + 1.164383530616760, -0.187326118350029, -0.650424420833588, 0.347458571195602 ,
> + 1.164383530616760, 2.141772270202637, 0.0000, -1.148145079612732 ,
> + };
Some values don't match the values I computed here:
http://git.videolan.org/?p=vlc.git;a=blob;f=modules/video_output/win32/direct3d11.c;h=5a105cc4a06a6e186f6abc1fa8db467dcc44f712;hb=HEAD#l2697
Also why is there 4 columns in the matrix ? The source is Y'CbCr.
And why does the luminance coefficients are different than for BT.709
or BT.601 ?
> const float *matrix;
> switch (yuv_space)
> @@ -238,6 +243,9 @@ tc_yuv_base_init(opengl_tex_converter_t *tc, GLenum tex_target,
> case COLOR_SPACE_BT601:
> matrix = matrix_bt601_tv2full;
> break;
> + case COLOR_SPACE_BT2020:
> + matrix = matrix_bt2020_tv2full;
> + break;
> default:
> matrix = matrix_bt709_tv2full;
> };
>
> _______________________________________________
> vlc-commits mailing list
> vlc-commits at videolan.org
> https://mailman.videolan.org/listinfo/vlc-commits
More information about the vlc-devel
mailing list