From 4284bfab4594d4babb23123001ef63db7bebeccb Mon Sep 17 00:00:00 2001 From: Manuel Bottini Date: Wed, 26 Sep 2018 15:33:15 +0100 Subject: COMPMID-287: NEON colour convert to U8 Change-Id: I47033fa70881fd32b13266adb6ccbf10c202aabc Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/150344 Tested-by: bsgcomp Reviewed-by: Pablo Tello --- tests/benchmark/NEON/ColorConvert.cpp | 10 +++++++++ tests/validation/NEON/ColorConvert.cpp | 28 +++++++++++++++++++++++++ tests/validation/reference/ColorConvert.cpp | 4 ++++ tests/validation/reference/ColorConvertHelper.h | 27 ++++++++++++++++++++++++ 4 files changed, 69 insertions(+) (limited to 'tests') diff --git a/tests/benchmark/NEON/ColorConvert.cpp b/tests/benchmark/NEON/ColorConvert.cpp index 6aef5723d3..8223551635 100644 --- a/tests/benchmark/NEON/ColorConvert.cpp +++ b/tests/benchmark/NEON/ColorConvert.cpp @@ -47,6 +47,9 @@ const auto ColorConvert_RGBA_to_RGB = combine(framework::dataset::make("FormatTy const auto ColorConvert_RGB_to_RGBA = combine(framework::dataset::make("FormatType", { Format::RGB888 }), framework::dataset::make("FormatType", { Format::RGBA8888 })); +const auto ColorConvert_RGB_to_U8 = combine(framework::dataset::make("FormatType", { Format::RGB888 }), + framework::dataset::make("FormatType", { Format::U8 })); + const auto ColorConvert_YUYVDataset_to_RGBDataset = combine(YUYVDataset, RGBDataset); @@ -82,6 +85,13 @@ REGISTER_FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture, framework::Data REGISTER_FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGB_to_RGBA)); TEST_SUITE_END() +TEST_SUITE(RGBtoU8) +// *INDENT-OFF* +// clang-format off +REGISTER_FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_RGB_to_U8)); +REGISTER_FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGB_to_U8)); +TEST_SUITE_END() + TEST_SUITE(YUYV) // *INDENT-OFF* // clang-format off diff --git a/tests/validation/NEON/ColorConvert.cpp b/tests/validation/NEON/ColorConvert.cpp index c34df2b557..ecd95f23e0 100644 --- a/tests/validation/NEON/ColorConvert.cpp +++ b/tests/validation/NEON/ColorConvert.cpp @@ -52,6 +52,9 @@ const auto ColorConvert_RGBA_to_RGB = combine(framework::dataset::make("FormatTy const auto ColorConvert_RGB_to_RGBA = combine(framework::dataset::make("FormatType", { Format::RGB888 }), framework::dataset::make("FormatType", { Format::RGBA8888 })); +const auto ColorConvert_RGB_to_U8 = combine(framework::dataset::make("FormatType", { Format::RGB888 }), + framework::dataset::make("FormatType", { Format::U8 })); + const auto ColorConvert_YUYVDataset_to_RGBDataset = combine(YUYVDataset, RGBDataset); @@ -143,6 +146,12 @@ DATA_TEST_CASE(RGB, framework::DatasetMode::ALL, combine(concat(datasets::Small2 validate_configuration(shape, src_format, dst_format); } +DATA_TEST_CASE(RGBtoU8, framework::DatasetMode::ALL, combine(concat(datasets::Small2DShapes(), datasets::Large2DShapes()), ColorConvert_RGB_to_U8), + shape, src_format, dst_format) +{ + validate_configuration(shape, src_format, dst_format); +} + DATA_TEST_CASE(YUV, framework::DatasetMode::ALL, combine(concat(datasets::Small2DShapes(), datasets::Large2DShapes()), ColorConvert_YUYVDataset_to_RGBDataset), shape, src_format, dst_format) { @@ -213,6 +222,25 @@ FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture, framework::Data } TEST_SUITE_END() +TEST_SUITE(RGBtoU8) +FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_RGB_to_U8)) +{ + // Validate output + for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx) + { + validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]); + } +} +FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGB_to_U8)) +{ + // Validate output + for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx) + { + validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]); + } +} +TEST_SUITE_END() + TEST_SUITE(YUV) FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_YUYVDataset_to_RGBDataset)) { diff --git a/tests/validation/reference/ColorConvert.cpp b/tests/validation/reference/ColorConvert.cpp index 8047b34688..9090319a86 100644 --- a/tests/validation/reference/ColorConvert.cpp +++ b/tests/validation/reference/ColorConvert.cpp @@ -46,6 +46,7 @@ inline std::vector> create_image_planes(const TensorShape &shape switch(format) { + case Format::U8: case Format::RGB888: case Format::RGBA8888: case Format::YUYV422: @@ -102,6 +103,9 @@ std::vector> color_convert(const TensorShape &shape, const std:: case Format::RGBA8888: colorconvert_helper::detail::colorconvert_rgb_to_rgbx(tensor_planes[0], dst[0]); break; + case Format::U8: + colorconvert_helper::detail::colorconvert_rgb_to_u8(tensor_planes[0], dst[0]); + break; case Format::NV12: colorconvert_helper::detail::colorconvert_rgb_to_nv12(tensor_planes[0], dst); break; diff --git a/tests/validation/reference/ColorConvertHelper.h b/tests/validation/reference/ColorConvertHelper.h index 7a8b547486..b2ae6f2f80 100644 --- a/tests/validation/reference/ColorConvertHelper.h +++ b/tests/validation/reference/ColorConvertHelper.h @@ -48,6 +48,10 @@ constexpr float rgb2yuv_bt709_cu = 0.5389f; // C_v = 1 / (2 * (1 - K_r)) constexpr float rgb2yuv_bt709_cv = 0.6350f; +constexpr float rgb2u8_red_coef = 0.2126f; +constexpr float rgb2u8_green_coef = 0.7152f; +constexpr float rgb2u8_blue_coef = 0.0722f; + template inline void store_rgb_from_src(const SimpleTensor src, SimpleTensor &rvec, SimpleTensor &gvec, SimpleTensor &bvec) { @@ -218,6 +222,29 @@ inline void colorconvert_rgb_to_rgbx(const SimpleTensor src, SimpleTensor } } +template +inline void colorconvert_rgb_to_u8(const SimpleTensor src, SimpleTensor &dst) +{ + const int width = dst.shape().x(); + const int height = dst.shape().y(); + + for(int y = 0; y < height; ++y) + { + for(int x = 0; x < width; ++x) + { + const Coordinates src_coord{ x, y }; + const Coordinates dst_coord{ x, y }; + + const auto *src_pixel = reinterpret_cast(src(src_coord)); + auto *dst_pixel = reinterpret_cast(dst(dst_coord)); + + const float result = rgb2u8_red_coef * src_pixel[0] + rgb2u8_green_coef * src_pixel[1] + rgb2u8_blue_coef * src_pixel[2]; + + dst_pixel[0] = utility::clamp(result, 0, 255); + } + } +} + template inline void colorconvert_rgbx_to_rgb(const SimpleTensor src, SimpleTensor &dst) { -- cgit v1.2.1