X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=colorspace_conversion_effect_test.cpp;h=1395140c81a480a910f8f8691efdae5256e50b04;hp=34793ab307add94320bb126aa3260f234bac21ba;hb=refs%2Ftags%2F1.1.1;hpb=696fae62e66f803a759afc004c3657ee84420bfe diff --git a/colorspace_conversion_effect_test.cpp b/colorspace_conversion_effect_test.cpp index 34793ab..1395140 100644 --- a/colorspace_conversion_effect_test.cpp +++ b/colorspace_conversion_effect_test.cpp @@ -1,10 +1,14 @@ -// Unit tests for ColorSpaceConversionEffect. +// Unit tests for ColorspaceConversionEffect. + +#include -#include "test_util.h" -#include "gtest/gtest.h" #include "colorspace_conversion_effect.h" +#include "gtest/gtest.h" +#include "test_util.h" + +namespace movit { -TEST(ColorSpaceConversionEffectTest, Reversible) { +TEST(ColorspaceConversionEffectTest, Reversible) { float data[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, @@ -16,18 +20,18 @@ TEST(ColorSpaceConversionEffectTest, Reversible) { float temp_data[4 * 6], out_data[4 * 6]; { - EffectChainTester tester(data, 1, 6, FORMAT_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR); + EffectChainTester tester(data, 1, 6, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR); tester.run(temp_data, GL_RGBA, COLORSPACE_REC_601_525, GAMMA_LINEAR); } { - EffectChainTester tester(temp_data, 1, 6, FORMAT_RGBA, COLORSPACE_REC_601_525, GAMMA_LINEAR); + EffectChainTester tester(temp_data, 1, 6, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_REC_601_525, GAMMA_LINEAR); tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR); } expect_equal(data, out_data, 4, 6); } -TEST(ColorSpaceConversionEffectTest, sRGB_Primaries) { +TEST(ColorspaceConversionEffectTest, sRGB_Primaries) { float data[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, @@ -37,7 +41,7 @@ TEST(ColorSpaceConversionEffectTest, sRGB_Primaries) { }; float out_data[4 * 5]; - EffectChainTester tester(data, 1, 5, FORMAT_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR); + EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR); tester.run(out_data, GL_RGBA, COLORSPACE_XYZ, GAMMA_LINEAR); // Black should stay black. @@ -85,7 +89,7 @@ TEST(ColorSpaceConversionEffectTest, sRGB_Primaries) { EXPECT_FLOAT_EQ(1.0f, out_data[4 * 4 + 3]); } -TEST(ColorSpaceConversionEffectTest, Rec601_525_Primaries) { +TEST(ColorspaceConversionEffectTest, Rec601_525_Primaries) { float data[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, @@ -95,7 +99,7 @@ TEST(ColorSpaceConversionEffectTest, Rec601_525_Primaries) { }; float out_data[4 * 5]; - EffectChainTester tester(data, 1, 5, FORMAT_RGBA, COLORSPACE_REC_601_525, GAMMA_LINEAR); + EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_REC_601_525, GAMMA_LINEAR); tester.run(out_data, GL_RGBA, COLORSPACE_XYZ, GAMMA_LINEAR); // Black should stay black. @@ -135,7 +139,7 @@ TEST(ColorSpaceConversionEffectTest, Rec601_525_Primaries) { EXPECT_FLOAT_EQ(1.0f, out_data[4 * 4 + 3]); } -TEST(ColorSpaceConversionEffectTest, Rec601_625_Primaries) { +TEST(ColorspaceConversionEffectTest, Rec601_625_Primaries) { float data[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, @@ -145,7 +149,7 @@ TEST(ColorSpaceConversionEffectTest, Rec601_625_Primaries) { }; float out_data[4 * 5]; - EffectChainTester tester(data, 1, 5, FORMAT_RGBA, COLORSPACE_REC_601_625, GAMMA_LINEAR); + EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_REC_601_625, GAMMA_LINEAR); tester.run(out_data, GL_RGBA, COLORSPACE_XYZ, GAMMA_LINEAR); // Black should stay black. @@ -185,7 +189,57 @@ TEST(ColorSpaceConversionEffectTest, Rec601_625_Primaries) { EXPECT_FLOAT_EQ(1.0f, out_data[4 * 4 + 3]); } -TEST(ColorSpaceConversionEffectTest, sRGBToRec601_525) { +TEST(ColorspaceConversionEffectTest, Rec2020_Primaries) { + float data[] = { + 0.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, + 1.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + }; + float out_data[4 * 5]; + + EffectChainTester tester(data, 1, 5, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_REC_2020, GAMMA_LINEAR); + tester.run(out_data, GL_RGBA, COLORSPACE_XYZ, GAMMA_LINEAR); + + // Black should stay black. + EXPECT_FLOAT_EQ(0.0f, out_data[0 * 4 + 0]); + EXPECT_FLOAT_EQ(0.0f, out_data[0 * 4 + 1]); + EXPECT_FLOAT_EQ(0.0f, out_data[0 * 4 + 2]); + EXPECT_FLOAT_EQ(1.0f, out_data[0 * 4 + 3]); + + // Convert the primaries from XYZ to xyz, and compare to the references + // given by Rec. 2020. + float white_xyz_sum = out_data[1 * 4 + 0] + out_data[1 * 4 + 1] + out_data[1 * 4 + 2]; + float white_x = out_data[1 * 4 + 0] / white_xyz_sum; + float white_y = out_data[1 * 4 + 1] / white_xyz_sum; + EXPECT_NEAR(0.3127, white_x, 1e-3); + EXPECT_NEAR(0.3290, white_y, 1e-3); + EXPECT_FLOAT_EQ(1.0f, out_data[1 * 4 + 3]); + + float red_xyz_sum = out_data[2 * 4 + 0] + out_data[2 * 4 + 1] + out_data[2 * 4 + 2]; + float red_x = out_data[2 * 4 + 0] / red_xyz_sum; + float red_y = out_data[2 * 4 + 1] / red_xyz_sum; + EXPECT_NEAR(0.708, red_x, 1e-3); + EXPECT_NEAR(0.292, red_y, 1e-3); + EXPECT_FLOAT_EQ(1.0f, out_data[2 * 4 + 3]); + + float green_xyz_sum = out_data[3 * 4 + 0] + out_data[3 * 4 + 1] + out_data[3 * 4 + 2]; + float green_x = out_data[3 * 4 + 0] / green_xyz_sum; + float green_y = out_data[3 * 4 + 1] / green_xyz_sum; + EXPECT_NEAR(0.170, green_x, 1e-3); + EXPECT_NEAR(0.797, green_y, 1e-3); + EXPECT_FLOAT_EQ(1.0f, out_data[3 * 4 + 3]); + + float blue_xyz_sum = out_data[4 * 4 + 0] + out_data[4 * 4 + 1] + out_data[4 * 4 + 2]; + float blue_x = out_data[4 * 4 + 0] / blue_xyz_sum; + float blue_y = out_data[4 * 4 + 1] / blue_xyz_sum; + EXPECT_NEAR(0.131, blue_x, 1e-3); + EXPECT_NEAR(0.046, blue_y, 1e-3); + EXPECT_FLOAT_EQ(1.0f, out_data[4 * 4 + 3]); +} + +TEST(ColorspaceConversionEffectTest, sRGBToRec601_525) { float data[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, @@ -221,8 +275,10 @@ TEST(ColorSpaceConversionEffectTest, sRGBToRec601_525) { }; float out_data[4 * 6]; - EffectChainTester tester(data, 1, 6, FORMAT_RGBA, COLORSPACE_sRGB, GAMMA_LINEAR); + EffectChainTester tester(data, 1, 6, FORMAT_RGBA_POSTMULTIPLIED_ALPHA, COLORSPACE_sRGB, GAMMA_LINEAR); tester.run(out_data, GL_RGBA, COLORSPACE_REC_601_525, GAMMA_LINEAR); expect_equal(expected_data, out_data, 4, 6); } + +} // namespace movit