Add a unit test for YCbCrInput (not done yet).
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 14 Oct 2012 23:42:40 +0000 (01:42 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 14 Oct 2012 23:42:40 +0000 (01:42 +0200)
.gitignore
Makefile
ycbcr_input_test.cpp [new file with mode: 0644]

index c2bc3d4..c654a3f 100644 (file)
@@ -21,6 +21,7 @@ diffusion_effect_test
 white_balance_effect_test
 lift_gamma_gain_effect_test
 flat_input_test
+ycbcr_input_test
 chain-*.frag
 movit.info
 coverage/
index 026fcb8..aed37a4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -27,6 +27,7 @@ TESTS += diffusion_effect_test
 TESTS += white_balance_effect_test
 TESTS += lift_gamma_gain_effect_test
 TESTS += flat_input_test
+TESTS += ycbcr_input_test
 
 # Core.
 LIB_OBJS=util.o widgets.o effect.o effect_chain.o
@@ -91,6 +92,8 @@ lift_gamma_gain_effect_test: lift_gamma_gain_effect_test.o $(TEST_OBJS) libmovit
        $(CXX) -o $@ $^ $(LDFLAGS)
 flat_input_test: flat_input_test.o $(TEST_OBJS) libmovit.a
        $(CXX) -o $@ $^ $(LDFLAGS)
+ycbcr_input_test: ycbcr_input_test.o $(TEST_OBJS) libmovit.a
+       $(CXX) -o $@ $^ $(LDFLAGS)
 
 OBJS=$(DEMO_OBJS) $(LIB_OBJS) $(TEST_OBJS) $(TESTS:=.o)
 
diff --git a/ycbcr_input_test.cpp b/ycbcr_input_test.cpp
new file mode 100644 (file)
index 0000000..0a0ec69
--- /dev/null
@@ -0,0 +1,57 @@
+// Unit tests for YCbCrInput.
+// FIXME: This class really ought to support mipmaps.
+
+#include "test_util.h"
+#include "gtest/gtest.h"
+#include "ycbcr_input.h"
+
+TEST(YCbCrInput, Simple444) {
+       const int width = 1;
+       const int height = 5;
+
+       // Pure-color test inputs, calculated with the formulas in Rec. 601
+       // section 2.5.4.
+       unsigned char y[width * height] = {
+               16, 235, 81, 145, 41,
+       };
+       unsigned char cb[width * height] = {
+               128, 128, 90, 54, 240,
+       };
+       unsigned char cr[width * height] = {
+               128, 128, 240, 34, 110,
+       };
+       float expected_data[4 * width * height] = {
+               0.0, 0.0, 0.0, 1.0,
+               1.0, 1.0, 1.0, 1.0,
+               1.0, 0.0, 0.0, 1.0,
+               0.0, 1.0, 0.0, 1.0,
+               0.0, 0.0, 1.0, 1.0,
+       };
+       float out_data[4 * width * height];
+
+       EffectChainTester tester(NULL, width, height);
+
+       ImageFormat format;
+       format.color_space = COLORSPACE_sRGB;
+       format.gamma_curve = GAMMA_sRGB;
+
+       YCbCrFormat ycbcr_format;
+       ycbcr_format.luma_coefficients = YCBCR_REC_601;
+       ycbcr_format.full_range = false;
+       ycbcr_format.chroma_subsampling_x = 1;
+       ycbcr_format.chroma_subsampling_y = 1;
+       ycbcr_format.chroma_x_position = 0.5f;
+       ycbcr_format.chroma_y_position = 0.5f;
+
+       YCbCrInput *input = new YCbCrInput(format, ycbcr_format, width, height);
+       input->set_pixel_data(0, y);
+       input->set_pixel_data(1, cb);
+       input->set_pixel_data(2, cr);
+       tester.get_chain()->add_input(input);
+
+       tester.run(out_data, GL_RGBA, COLORSPACE_sRGB, GAMMA_sRGB);
+
+       // Y'CbCr isn't 100% accurate (the input values are rounded),
+       // so we need some leeway.
+       expect_equal(expected_data, out_data, 4 * width, height, 0.025, 0.002);
+}