X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=ycbcr_input_test.cpp;h=ee77e4c35e07314aee7fc21153efc4635613e78f;hp=4ff263ab2e401947af95e3099912196919a9e0cd;hb=58baca01a920dd4aab103c5797019d95a20f4baa;hpb=9b95345e8e1dde29991638ed69def0cf187e28de diff --git a/ycbcr_input_test.cpp b/ycbcr_input_test.cpp index 4ff263a..ee77e4c 100644 --- a/ycbcr_input_test.cpp +++ b/ycbcr_input_test.cpp @@ -1,14 +1,17 @@ // Unit tests for YCbCrInput. -// FIXME: This class really ought to support mipmaps. +#include #include #include "effect_chain.h" #include "gtest/gtest.h" #include "test_util.h" +#include "util.h" #include "ycbcr_input.h" -TEST(YCbCrInput, Simple444) { +namespace movit { + +TEST(YCbCrInputTest, Simple444) { const int width = 1; const int height = 5; @@ -61,7 +64,7 @@ TEST(YCbCrInput, Simple444) { expect_equal(expected_data, out_data, 4 * width, height, 0.025, 0.002); } -TEST(YCbCrInput, FullRangeRec601) { +TEST(YCbCrInputTest, FullRangeRec601) { const int width = 1; const int height = 5; @@ -115,7 +118,7 @@ TEST(YCbCrInput, FullRangeRec601) { expect_equal(expected_data, out_data, 4 * width, height, 0.025, 0.002); } -TEST(YCbCrInput, Rec709) { +TEST(YCbCrInputTest, Rec709) { const int width = 1; const int height = 5; @@ -168,7 +171,7 @@ TEST(YCbCrInput, Rec709) { expect_equal(expected_data, out_data, 4 * width, height, 0.025, 0.002); } -TEST(YCbCrInput, Rec2020) { +TEST(YCbCrInputTest, Rec2020) { const int width = 1; const int height = 5; @@ -223,7 +226,7 @@ TEST(YCbCrInput, Rec2020) { expect_equal(expected_data, out_data, 4 * width, height, 0.025, 0.002); } -TEST(YCbCrInput, Subsampling420) { +TEST(YCbCrInputTest, Subsampling420) { const int width = 4; const int height = 4; @@ -284,7 +287,7 @@ TEST(YCbCrInput, Subsampling420) { expect_equal(expected_data, out_data, width, height, 0.01, 0.001); } -TEST(YCbCrInput, Subsampling420WithNonCenteredSamples) { +TEST(YCbCrInputTest, Subsampling420WithNonCenteredSamples) { const int width = 4; const int height = 4; @@ -346,7 +349,7 @@ TEST(YCbCrInput, Subsampling420WithNonCenteredSamples) { } // Yes, some 4:2:2 formats actually have this craziness. -TEST(YCbCrInput, DifferentCbAndCrPositioning) { +TEST(YCbCrInputTest, DifferentCbAndCrPositioning) { const int width = 4; const int height = 4; @@ -415,3 +418,62 @@ TEST(YCbCrInput, DifferentCbAndCrPositioning) { tester.run(out_data, GL_BLUE, COLORSPACE_sRGB, GAMMA_sRGB); expect_equal(expected_data_blue, out_data, width, height, 0.01, 0.001); } + +TEST(YCbCrInputTest, PBO) { + 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 data[width * height * 3] = { + 16, 235, 81, 145, 41, + 128, 128, 90, 54, 240, + 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]; + + GLuint pbo; + glGenBuffers(1, &pbo); + glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, pbo); + glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, width * height * 3, data, GL_STREAM_DRAW); + glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0); + + 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.cb_x_position = 0.5f; + ycbcr_format.cb_y_position = 0.5f; + ycbcr_format.cr_x_position = 0.5f; + ycbcr_format.cr_y_position = 0.5f; + + YCbCrInput *input = new YCbCrInput(format, ycbcr_format, width, height); + input->set_pixel_data(0, (unsigned char *)BUFFER_OFFSET(0), pbo); + input->set_pixel_data(1, (unsigned char *)BUFFER_OFFSET(width * height), pbo); + input->set_pixel_data(2, (unsigned char *)BUFFER_OFFSET(width * height * 2), pbo); + 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); + + glDeleteBuffers(1, &pbo); +} + +} // namespace movit