blob: e079bd12f3ad22892aaadf78039cf325d85af5f2 [file] [log] [blame]
Sanghoon Lee1fad27a2018-04-05 10:57:57 +01001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2017-2020 Arm Limited.
Sanghoon Lee1fad27a2018-04-05 10:57:57 +01003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "arm_compute/runtime/MultiImage.h"
25#include "arm_compute/runtime/NEON/functions/NEColorConvert.h"
26#include "arm_compute/runtime/Tensor.h"
27#include "arm_compute/runtime/TensorAllocator.h"
28#include "tests/NEON/Accessor.h"
29#include "tests/datasets/ShapeDatasets.h"
30#include "tests/framework/Asserts.h"
31#include "tests/framework/Macros.h"
32#include "tests/validation/Validation.h"
33#include "tests/validation/fixtures/ColorConvertFixture.h"
34
35namespace arm_compute
36{
37namespace test
38{
39namespace validation
40{
41namespace
42{
Sanghoon Leedec32a92018-06-29 10:52:57 +010043constexpr AbsoluteTolerance<uint8_t> tolerance_nv(2);
Manuel Bottinic971cf12020-02-06 15:40:27 +000044constexpr AbsoluteTolerance<uint8_t> tolerance_u8(2);
Sanghoon Leedec32a92018-06-29 10:52:57 +010045
Sanghoon Lee1fad27a2018-04-05 10:57:57 +010046// Input data sets
Sanghoon Leec7b82f12018-07-06 13:27:27 +010047const auto RGBDataset = framework::dataset::make("FormatType", { Format::RGB888, Format::RGBA8888 });
48const auto YUYVDataset = framework::dataset::make("FormatType", { Format::YUYV422, Format::UYVY422 });
Sanghoon Lee1fad27a2018-04-05 10:57:57 +010049
Sanghoon Leec7b82f12018-07-06 13:27:27 +010050const auto ColorConvert_RGBA_to_RGB = combine(framework::dataset::make("FormatType", { Format::RGBA8888 }),
51 framework::dataset::make("FormatType", { Format::RGB888 }));
Sanghoon Lee1fad27a2018-04-05 10:57:57 +010052
Sanghoon Leec7b82f12018-07-06 13:27:27 +010053const auto ColorConvert_RGB_to_RGBA = combine(framework::dataset::make("FormatType", { Format::RGB888 }),
54 framework::dataset::make("FormatType", { Format::RGBA8888 }));
Sanghoon Lee1fad27a2018-04-05 10:57:57 +010055
Manuel Bottini4284bfa2018-09-26 15:33:15 +010056const auto ColorConvert_RGB_to_U8 = combine(framework::dataset::make("FormatType", { Format::RGB888 }),
57 framework::dataset::make("FormatType", { Format::U8 }));
58
Sanghoon Leec7b82f12018-07-06 13:27:27 +010059const auto ColorConvert_YUYVDataset_to_RGBDataset = combine(YUYVDataset,
60 RGBDataset);
Sanghoon Leedec32a92018-06-29 10:52:57 +010061
Sanghoon Leec7b82f12018-07-06 13:27:27 +010062const auto ColorConvert_YUVPlanar_to_RGBDataset = combine(framework::dataset::make("FormatType", { Format::IYUV, Format::NV12, Format::NV21 }),
63 RGBDataset);
Sanghoon Leedec32a92018-06-29 10:52:57 +010064
Sanghoon Leec7b82f12018-07-06 13:27:27 +010065const auto ColorConvert_RGBDataset_to_NVDataset = combine(RGBDataset,
66 framework::dataset::make("FormatType", { Format::NV12, Format::IYUV, Format::YUV444 }));
67
68const auto ColorConvert_YUYVDataset_to_NVDataset = combine(YUYVDataset,
69 framework::dataset::make("FormatType", { Format::NV12, Format::IYUV }));
70
71const auto ColorConvert_NVDataset_to_YUVDataset = combine(framework::dataset::make("FormatType", { Format::NV12, Format::NV21 }),
72 framework::dataset::make("FormatType", { Format::IYUV, Format::YUV444 }));
Sanghoon Lee1fad27a2018-04-05 10:57:57 +010073} // namespace
74
75TEST_SUITE(NEON)
76TEST_SUITE(ColorConvert)
77
Sanghoon Leedec32a92018-06-29 10:52:57 +010078template <typename T>
79using NEColorConvertFixture = ColorConvertValidationFixture<MultiImage, Tensor, Accessor, NEColorConvert, T>;
80
Sanghoon Lee1fad27a2018-04-05 10:57:57 +010081TEST_SUITE(RGBA)
Sanghoon Leec7b82f12018-07-06 13:27:27 +010082FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_RGBA_to_RGB))
Sanghoon Lee1fad27a2018-04-05 10:57:57 +010083{
84 // Validate output
Sanghoon Leedec32a92018-06-29 10:52:57 +010085 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
86 {
87 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
88 }
Sanghoon Lee1fad27a2018-04-05 10:57:57 +010089}
Sanghoon Leedec32a92018-06-29 10:52:57 +010090
Sanghoon Leec7b82f12018-07-06 13:27:27 +010091FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGBA_to_RGB))
Sanghoon Lee1fad27a2018-04-05 10:57:57 +010092{
93 // Validate output
Sanghoon Leedec32a92018-06-29 10:52:57 +010094 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
95 {
96 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
97 }
Sanghoon Lee1fad27a2018-04-05 10:57:57 +010098}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000099TEST_SUITE_END() // RGBA
Sanghoon Lee1fad27a2018-04-05 10:57:57 +0100100
101TEST_SUITE(RGB)
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100102FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_RGB_to_RGBA))
Sanghoon Lee1fad27a2018-04-05 10:57:57 +0100103{
104 // Validate output
Sanghoon Leedec32a92018-06-29 10:52:57 +0100105 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
106 {
107 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
108 }
Sanghoon Lee1fad27a2018-04-05 10:57:57 +0100109}
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100110FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGB_to_RGBA))
111{
112 // Validate output
113 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
114 {
115 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
116 }
117}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000118TEST_SUITE_END() // RGB
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100119
Manuel Bottini4284bfa2018-09-26 15:33:15 +0100120TEST_SUITE(RGBtoU8)
121FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_RGB_to_U8))
122{
123 // Validate output
124 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
125 {
Manuel Bottinic971cf12020-02-06 15:40:27 +0000126 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx], tolerance_u8);
Manuel Bottini4284bfa2018-09-26 15:33:15 +0100127 }
128}
129FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGB_to_U8))
130{
131 // Validate output
132 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
133 {
Manuel Bottinic971cf12020-02-06 15:40:27 +0000134 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx], tolerance_u8);
Manuel Bottini4284bfa2018-09-26 15:33:15 +0100135 }
136}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000137TEST_SUITE_END() // RGBtoU8
Manuel Bottini4284bfa2018-09-26 15:33:15 +0100138
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100139TEST_SUITE(YUV)
140FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_YUYVDataset_to_RGBDataset))
141{
142 // Validate output
143 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
144 {
145 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
146 }
147}
148FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_YUYVDataset_to_RGBDataset))
149{
150 // Validate output
151 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
152 {
153 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
154 }
155}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000156TEST_SUITE_END() // YUV
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100157
158TEST_SUITE(YUVPlanar)
159FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_YUVPlanar_to_RGBDataset))
160{
161 // Validate output
162 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
163 {
164 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
165 }
166}
167FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_YUVPlanar_to_RGBDataset))
Sanghoon Lee1fad27a2018-04-05 10:57:57 +0100168{
169 // Validate output
Sanghoon Leedec32a92018-06-29 10:52:57 +0100170 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
171 {
172 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
173 }
174}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000175TEST_SUITE_END() // YUVPlanar
Sanghoon Leedec32a92018-06-29 10:52:57 +0100176
177TEST_SUITE(NV)
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100178FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_RGBDataset_to_NVDataset))
Sanghoon Leedec32a92018-06-29 10:52:57 +0100179{
180 // Validate output
181 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
182 {
183 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx], tolerance_nv);
184 }
185}
186
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100187FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_RGBDataset_to_NVDataset))
Sanghoon Leedec32a92018-06-29 10:52:57 +0100188{
189 // Validate output
190 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
191 {
192 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx], tolerance_nv);
193 }
194}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000195TEST_SUITE_END() // NV
Sanghoon Leedec32a92018-06-29 10:52:57 +0100196
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100197TEST_SUITE(YUYVtoNV)
198FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_YUYVDataset_to_NVDataset))
Sanghoon Leedec32a92018-06-29 10:52:57 +0100199{
200 // Validate output
201 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
202 {
203 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
204 }
205}
206
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100207FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_YUYVDataset_to_NVDataset))
Sanghoon Leedec32a92018-06-29 10:52:57 +0100208{
209 // Validate output
210 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
211 {
212 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
213 }
214}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000215TEST_SUITE_END() // YUYVtoNV
Sanghoon Leedec32a92018-06-29 10:52:57 +0100216
217TEST_SUITE(NVtoYUV)
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100218FIXTURE_DATA_TEST_CASE(RunSmall, NEColorConvertFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), ColorConvert_NVDataset_to_YUVDataset))
Sanghoon Leedec32a92018-06-29 10:52:57 +0100219{
220 // Validate output
221 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
222 {
223 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
224 }
225}
Sanghoon Leec7b82f12018-07-06 13:27:27 +0100226FIXTURE_DATA_TEST_CASE(RunLarge, NEColorConvertFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), ColorConvert_NVDataset_to_YUVDataset))
Sanghoon Leedec32a92018-06-29 10:52:57 +0100227{
228 // Validate output
229 for(unsigned int plane_idx = 0; plane_idx < _dst_num_planes; ++plane_idx)
230 {
231 validate(Accessor(*_target.plane(plane_idx)), _reference[plane_idx]);
232 }
Sanghoon Lee1fad27a2018-04-05 10:57:57 +0100233}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000234TEST_SUITE_END() // NVtoYUV
Sanghoon Lee1fad27a2018-04-05 10:57:57 +0100235
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000236TEST_SUITE_END() // ColorConvert
237TEST_SUITE_END() // NEON
Sanghoon Lee1fad27a2018-04-05 10:57:57 +0100238} // namespace validation
239} // namespace test
240} // namespace arm_compute