From: Steinar H. Gunderson Date: Sun, 14 Oct 2012 23:42:40 +0000 (+0200) Subject: Add a unit test for YCbCrInput (not done yet). X-Git-Tag: 1.0~235 X-Git-Url: https://git.sesse.net/?p=movit;a=commitdiff_plain;h=9bb98b7ce605f8648a0236cd18efd65a82b7920a Add a unit test for YCbCrInput (not done yet). --- diff --git a/.gitignore b/.gitignore index c2bc3d4..c654a3f 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/Makefile b/Makefile index 026fcb8..aed37a4 100644 --- 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 index 0000000..0a0ec69 --- /dev/null +++ b/ycbcr_input_test.cpp @@ -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); +}