aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmake/treedata/common/tests.txt1
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/test/CMakeLists.txt3
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/test/TestConversionMatrix.cpp168
3 files changed, 172 insertions, 0 deletions
diff --git a/cmake/treedata/common/tests.txt b/cmake/treedata/common/tests.txt
index 9573812a5a..e7d03c5f56 100644
--- a/cmake/treedata/common/tests.txt
+++ b/cmake/treedata/common/tests.txt
@@ -1,5 +1,6 @@
xbmc/addons/test test/addons
xbmc/cores/AudioEngine/Sinks/test test/audioengine_sinks
+xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/test test/videoshaders
xbmc/filesystem/test test/filesystem
xbmc/interfaces/python/test test/python
xbmc/music/tags/test test/music_tags
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/test/CMakeLists.txt b/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/test/CMakeLists.txt
new file mode 100644
index 0000000000..5acdc099d9
--- /dev/null
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/test/CMakeLists.txt
@@ -0,0 +1,3 @@
+set(SOURCES TestConversionMatrix.cpp)
+
+core_add_test_library(videoshaders_test)
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/test/TestConversionMatrix.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/test/TestConversionMatrix.cpp
new file mode 100644
index 0000000000..d57c6838f1
--- /dev/null
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/test/TestConversionMatrix.cpp
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2005-2020 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+
+#include "cores/VideoPlayer/VideoRenderers/VideoShaders/ConversionMatrix.h"
+
+#include <iostream>
+
+#include <gtest/gtest.h>
+
+// clang-format off
+
+namespace
+{
+
+constexpr bool DEBUG_PRINT{false};
+
+void DebugPrint(Matrix3 matrix)
+{
+ if (!DEBUG_PRINT)
+ return;
+
+ std::cout << std::fixed;
+
+ std::cout << "===== Matrix Start =====" << std::endl;
+
+ for (unsigned int i = 0; i < 3; i++)
+ {
+ std::cout << std::setprecision(10)
+ << "{" << matrix[i][0] << ", "
+ << matrix[i][1] << ", "
+ << matrix[i][2] << "}," << std::endl;
+ }
+
+ std::cout << "===== Matrix End =====" << std::endl;
+}
+
+void DebugPrint(Matrix4 matrix)
+{
+ if (!DEBUG_PRINT)
+ return;
+
+ std::cout << std::fixed;
+
+ std::cout << "===== Matrix Start =====" << std::endl;
+
+ for (unsigned int i = 0; i < 4; i++)
+ {
+ std::cout << std::setprecision(10)
+ << "{" << matrix[i][0] << ", "
+ << matrix[i][1] << ", "
+ << matrix[i][2] << ", "
+ << matrix[i][3] << "}," << std::endl;
+ }
+
+ std::cout << "===== Matrix End =====" << std::endl;
+}
+
+std::array<std::array<float, 4>, 4> bt709_8bit =
+{{
+ {1.1643834114, 1.1643834114, 1.1643834114, 0.0000000000},
+ {0.0000000000, -0.2132485956, 2.1124014854, 0.0000000000},
+ {1.7927408218, -0.5329092145, 0.0000000000, 0.0000000000},
+ {-0.9729449749, 0.3014826477, -1.1334021091, 1.0000000000}
+}};
+
+Matrix4 bt709Mat_8bit(bt709_8bit);
+
+std::array<std::array<float, 4>, 4> bt709_10bit =
+{{
+ {1.1643834114, 1.1643834114, 1.1643834114, 0.0000000000},
+ {0.0000000000, -0.2132485956, 2.1124014854, 0.0000000000},
+ {1.7927408218, -0.5329092145, 0.0000000000, 0.0000000000},
+ {-0.9729449749, 0.3014826477, -1.1334021091, 1.0000000000},
+}};
+
+Matrix4 bt709Mat_10bit(bt709_10bit);
+
+std::array<std::array<float, 4>, 4> bt709_10bit_texture =
+{{
+ {74.5922470093, 74.5922470093, 74.5922470093, 0.0000000000},
+ {0.0000000000, -13.6610431671, 135.3237915039, 0.0000000000},
+ {114.8458175659, -34.1390075684, 0.0000000000, 0.0000000000},
+ {-0.9729449749, 0.3014826477, -1.1334021091, 1.0000000000},
+}};
+
+Matrix4 bt709Mat_10bit_texture(bt709_10bit_texture);
+
+std::array<std::array<float, 3>, 3> bt601_to_bt709 =
+{{
+ {1.0440435410, -0.0000000230, 0.0000000056},
+ {-0.0440433398, 0.9999997616, 0.0117934495},
+ {-0.0000000298, -0.0000000075, 0.9882065654},
+}};
+
+Matrix3 bt601_to_bt709_Mat(bt601_to_bt709);
+
+std::array<std::array<float, 3>, 3> bt2020_to_bt709 =
+{{
+ {1.6604905128, -0.1245504916, -0.0181507617},
+ {-0.5876411796, 1.1328998804, -0.1005788445},
+ {-0.0728498399, -0.0083493963, 1.1187294722},
+}};
+
+Matrix3 bt2020_to_bt709_Mat(bt2020_to_bt709);
+
+} // namespace
+
+TEST(TestConvertMatrix, YUV2RGB)
+{
+ CConvertMatrix convMat;
+ convMat.SetSourceColorSpace(AVCOL_SPC_BT709)
+ .SetSourceLimitedRange(true);
+
+ convMat.SetDestinationBlack(0.0f)
+ .SetDestinationContrast(1.0f)
+ .SetDestinationLimitedRange(false);
+
+ Matrix4 yuvMat;
+
+ convMat.SetSourceBitDepth(8)
+ .SetSourceTextureBitDepth(8);
+ yuvMat = convMat.GetYuvMat();
+ DebugPrint(yuvMat);
+
+ EXPECT_EQ(bt709Mat_8bit, yuvMat);
+
+ convMat.SetSourceBitDepth(10)
+ .SetSourceTextureBitDepth(8);
+ yuvMat = convMat.GetYuvMat();
+ DebugPrint(yuvMat);
+
+ EXPECT_EQ(bt709Mat_10bit, yuvMat);
+
+ convMat.SetSourceBitDepth(10)
+ .SetSourceTextureBitDepth(10);
+ yuvMat = convMat.GetYuvMat();
+ DebugPrint(yuvMat);
+
+ EXPECT_EQ(bt709Mat_10bit_texture, yuvMat);
+}
+
+TEST(TestConvertMatrix, ColorSpaceConversion)
+{
+ CConvertMatrix convMat;
+ Matrix3 primMat;
+
+ convMat.SetSourceColorPrimaries(AVCOL_PRI_BT470BG)
+ .SetDestinationColorPrimaries(AVCOL_PRI_BT709);
+ primMat = convMat.GetPrimMat();
+ DebugPrint(primMat);
+
+ EXPECT_EQ(bt601_to_bt709_Mat, primMat);
+
+ convMat.SetSourceColorPrimaries(AVCOL_PRI_BT2020)
+ .SetDestinationColorPrimaries(AVCOL_PRI_BT709);
+ primMat = convMat.GetPrimMat();
+ DebugPrint(primMat);
+
+ EXPECT_EQ(bt2020_to_bt709_Mat, primMat);
+}
+
+// clang-format on