Ocean
Loading...
Searching...
No Matches
TestFrameChannels.h
Go to the documentation of this file.
1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8#ifndef META_OCEAN_TEST_TESTCV_TEST_FRAME_CHANNELS_H
9#define META_OCEAN_TEST_TESTCV_TEST_FRAME_CHANNELS_H
10
12
14
15#include "ocean/base/DataType.h"
17#include "ocean/base/RandomI.h"
19#include "ocean/base/Worker.h"
20
23
24namespace Ocean
25{
26
27namespace Test
28{
29
30namespace TestCV
31{
32
33/**
34 * This class implements a frame channels test.
35 * @ingroup testcv
36 */
37class OCEAN_TEST_CV_EXPORT TestFrameChannels
38{
39 public:
40
41 /**
42 * Tests all frame channels functions.
43 * @param width The width of the test frame in pixel, with range [1, infinity)
44 * @param height The height of the test frame in pixel, with range [1, infinity)
45 * @param testDuration The number of seconds for each test, with range (0, infinity)
46 * @param worker The worker object to distribute the computation
47 * @param selector Test selector for filtering sub-tests; default runs all tests
48 * @return True, if so
49 */
50 static bool test(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker, const TestSelector& selector = TestSelector());
51
52 /**
53 * Tests frame separation to one channel function.
54 * @param width The width of the test frame in pixel, with range [1, infinity)
55 * @param height The height of the test frame in pixel, with range [1, infinity)
56 * @param testDuration The number of seconds for each test, with range (0, infinity)
57 * @return True, if succeeded
58 */
59 static bool testSeparateTo1Channel(const unsigned int width, const unsigned int height, const double testDuration);
60
61 /**
62 * Tests frame zip channels function.
63 * @param width The width of the test frame in pixel, with range [1, infinity)
64 * @param height The height of the test frame in pixel, with range [1, infinity)
65 * @param testDuration The number of seconds for each test, with range (0, infinity)
66 * @return True, if succeeded
67 */
68 static bool testZipChannels(const unsigned int width, const unsigned int height, const double testDuration);
69
70 /**
71 * Tests the add channel function that adds a channel as new first channel.
72 * @param width The width of the test frame in pixel, with range [1, infinity)
73 * @param height The height of the test frame in pixel, with range [1, infinity)
74 * @param testDuration The number of seconds for each test, with range (0, infinity)
75 * @param worker The worker object to distribute the computation
76 * @return True, if so
77 */
78 static bool testAddFirstChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
79
80 /**
81 * Tests the add channel value function that adds a channel as new first channel.
82 * @param width The width of the test frame in pixel, with range [1, infinity)
83 * @param height The height of the test frame in pixel, with range [1, infinity)
84 * @param testDuration The number of seconds for each test, with range (0, infinity)
85 * @param worker The worker object to distribute the computation
86 * @return True, if so
87 */
88 static bool testAddFirstChannelValue(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
89
90 /**
91 * Tests the add channel function that adds a channel as new last channel.
92 * @param width The width of the test frame in pixel, with range [1, infinity)
93 * @param height The height of the test frame in pixel, with range [1, infinity)
94 * @param testDuration The number of seconds for each test, with range (0, infinity)
95 * @param worker The worker object to distribute the computation
96 * @return True, if so
97 */
98 static bool testAddLastChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
99
100 /**
101 * Tests the add channel value function that adds a channel as new last channel.
102 * @param width The width of the test frame in pixel, with range [1, infinity)
103 * @param height The height of the test frame in pixel, with range [1, infinity)
104 * @param testDuration The number of seconds for each test, with range (0, infinity)
105 * @param worker The worker object to distribute the computation
106 * @return True, if so
107 */
108 static bool testAddLastChannelValue(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
109
110 /**
111 * Tests the remove channel function that removes the first channel.
112 * @param width The width of the test frame in pixel, with range [1, infinity)
113 * @param height The height of the test frame in pixel, with range [1, infinity)
114 * @param testDuration The number of seconds for each test, with range (0, infinity)
115 * @param worker The worker object to distribute the computation
116 * @return True, if so
117 */
118 static bool testRemoveFirstChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
119
120 /**
121 * Tests the remove channel function that removes the last channel.
122 * @param width The width of the test frame in pixel, with range [1, infinity)
123 * @param height The height of the test frame in pixel, with range [1, infinity)
124 * @param testDuration The number of seconds for each test, with range (0, infinity)
125 * @param worker The worker object to distribute the computation
126 * @return True, if so
127 */
128 static bool testRemoveLastChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
129
130 /**
131 * Tests the copy channel function.
132 * @param width The width of the test frame in pixel, with range [1, infinity)
133 * @param height The height of the test frame in pixel, with range [1, infinity)
134 * @param testDuration The number of seconds for each test, with range (0, infinity)
135 * @param worker The worker object to distribute the computation
136 * @return True, if so
137 */
138 static bool testCopyChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
139
140 /**
141 * Tests the set channel function.
142 * @param width The width of the test frame in pixel, with range [1, infinity)
143 * @param height The height of the test frame in pixel, with range [1, infinity)
144 * @param testDuration The number of seconds for each test, with range (0, infinity)
145 * @param worker The worker object to distribute the computation
146 * @return True, if so
147 */
148 static bool testSetChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
149
150 /**
151 * Tests the advanced pixel modifier function
152 * @param width The width of the test frame in pixel, with range [1, infinity)
153 * @param height The height of the test frame in pixel, with range [1, infinity)
154 * @param testDuration The number of seconds for each test, with range (0, infinity)
155 * @param worker The worker object to distribute the computation
156 * @return True, if the test was successful
157 */
158 static bool testApplyAdvancedPixelModifier(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
159
160 /**
161 * Tests the advanced pixel modifier function for specifc element type and number of channels
162 * @param width The width of the test frame in pixel, with range [1, infinity)
163 * @param height The height of the test frame in pixel, with range [1, infinity)
164 * @param testDuration The number of seconds for each test, with range (0, infinity)
165 * @param worker The worker object to distribute the computation
166 * @return True, if the test was successful
167 * @tparam TElement The type that the test data will use, must be an integral type
168 * @tparam tChannels The number of channels that the test data will use, range: [1, 4]
169 * @tparam tFunction The pixel function that will be used for testing, must be valid
170 */
171 template <typename TElement, unsigned int tChannels, void (*tPixelFunction)(const TElement*, TElement*)>
172 static bool testApplyAdvancedPixelModifier(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
173
174 /**
175 * Test the pixel operator for two inputs and one output.
176 * @param testDuration The number of seconds for each test, with range (0, infinity)
177 * @param worker The worker object to distribute the computation
178 * @return True, if the test was successful, otherwise false
179 * @tparam TPrecision The type that the test data will use, must be an integral type
180 * @tparam tChannels The number of channels that the test data will use, range: [1, 4]
181 */
182 template <typename TPrecision, unsigned int tChannels>
183 static bool testApplyBivariateOperator(const double testDuration, Worker& worker);
184
185 /**
186 * Test the image transformation function for generic pixel formats.
187 * @param testDuration The number of seconds for each test, range: (0, infinity)
188 * @param worker A worker instance to test the parallelized version of the test function
189 * @return True if the test was successful, otherwise false
190 */
191 static bool testTransformGeneric(const double testDuration, Worker& worker);
192
193 /**
194 * Tests the image transformation function for a specific generic pixel format.
195 * @param width The width of the images to be tested, range: [1, infinity)
196 * @param height The height of the images to be tested, range: [1, infinity)
197 * @param testDuration The number of seconds for each test, range: (0, infinity)
198 * @param worker A worker instance to test the parallelized version of the test function
199 * @return True if the test was successful, otherwise false
200 * @tparam TElementType Type used for data of the images (will be used internally to generate random test data)
201 * @tparam tChannels The number of channels of the test images (will be used internally to generate random test data), range: [1, infinity)
202 */
203 template <typename TElementType, unsigned int tChannels>
204 static bool testTransformGeneric(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
205
206 /**
207 * Tests the conversion function from premultiplied alpha to straight alpha images.
208 * @param testDuration The number of seconds for each test, range: (0, infinity)
209 * @param worker A worker instance to test the parallelized version of the test function
210 * @return True if the test was successful, otherwise false
211 */
212 static bool testPremultipliedAlphaToStraightAlpha(const double testDuration, Worker& worker);
213
214 /**
215 * Tests the conversion function from straight alpha to premultiplied alpha images.
216 * @param testDuration The number of seconds for each test, range: (0, infinity)
217 * @param worker A worker instance to test the parallelized version of the test function
218 * @return True if the test was successful, otherwise false
219 */
220 static bool testStraightAlphaToPremultipliedAlpha(const double testDuration, Worker& worker);
221
222 /**
223 * Tests the image conversion function reversing the order of pixel channels.
224 * @param testDuration The number of seconds for each test, range: (0, infinity)
225 * @param worker A worker instance to test the parallelized version of the test function
226 * @return True if the test was successful, otherwise false
227 */
228 static bool testReverseChannelOrder(const double testDuration, Worker& worker);
229
230 /**
231 * Tests the image conversion function reversing the order of pixel channels for a specific data type and channel number.
232 * @param width The width of the images to be tested, with range [1, infinity)
233 * @param height The height of the images to be tested, with range [1, infinity)
234 * @param testDuration The number of seconds for each test, with range (0, infinity)
235 * @param worker A worker instance to test the parallelized version of the test function
236 * @return True if the test was successful, otherwise false
237 * @tparam T The data type of each pixel channel, e.g., 'unsigned char' or 'float'
238 * @tparam tChannels The number of channels of the test images, with range [1, infinity)
239 */
240 template <typename T, unsigned int tChannels>
241 static bool testReverseChannelOrder(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
242
243 /**
244 * Test the row-based pixel conversion from 3 channels to 1 channel.
245 * @param testDuration The number of seconds for each test, with range (0, infinity)
246 * @return True, if the test was successful, otherwise false
247 */
248 static bool testRowPixelConversion3ChannelsTo1Channel(const double testDuration);
249
250 /**
251 * Test the row-based pixel conversion from 3 channels to 3 channels with 6 bit precision.
252 * @param testDuration The number of seconds for each test, with range (0, infinity)
253 * @return True, if the test was successful, otherwise false
254 */
255 static bool testRowPixelConversion3ChannelsTo3Channels6BitPrecision(const double testDuration);
256
257 /**
258 * Test the row-based pixel conversion from 3 channels to 3 channels with 7 bit precision.
259 * @param testDuration The number of seconds for each test, with range (0, infinity)
260 * @return True, if the test was successful, otherwise false
261 */
262 static bool testRowPixelConversion3ChannelsTo3Channels7BitPrecision(const double testDuration);
263
264 /**
265 * Test the row-based pixel conversion from 3 channels to 3 channels with 10 bit precision.
266 * @param testDuration The number of seconds for each test, with range (0, infinity)
267 * @return True, if the test was successful, otherwise false
268 */
269 static bool testRowPixelConversion3ChannelsTo3Channels10BitPrecision(const double testDuration);
270
271 /**
272 * Test the row-based pixel conversion from 4 channels to 1 channel.
273 * @param testDuration The number of seconds for each test, with range (0, infinity)
274 * @return True, if the test was successful, otherwise false
275 */
276 static bool testRowPixelConversion4ChannelsTo1Channel(const double testDuration);
277
278 /**
279 * Test the row-based pixel conversion from 4 channels to 2 channel.
280 * @param testDuration The number of seconds for each test, with range (0, infinity)
281 * @return True, if the test was successful, otherwise false
282 */
283 static bool testRowPixelConversion4ChannelsTo2Channels(const double testDuration);
284
285 /**
286 * Test the row-based pixel conversion from 4 channels to 3 channel.
287 * @param testDuration The number of seconds for each test, with range (0, infinity)
288 * @return True, if the test was successful, otherwise false
289 */
290 static bool testRowPixelConversion4ChannelsTo3Channels(const double testDuration);
291
292 /**
293 * Test the row-based pixel reverse order function.
294 * @param testDuration The number of seconds for each test, with range (0, infinity)
295 * @return True, if the test was successful, otherwise false
296 */
297 static bool testReverseRowPixelOrder(const double testDuration);
298
299 /**
300 * Test the row-based pixel reverse order function.
301 * @param testDuration The number of seconds for each test, with range (0, infinity)
302 * @return True, if the test was successful, otherwise false
303 */
304 static bool testReverseRowChannelOrder(const double testDuration);
305
306 /**
307 * Test the row-based shuffling of pixel channels.
308 * @param testDuration The number of seconds for each test, with range (0, infinity)
309 * @return True, if the test was successful, otherwise false
310 */
311 static bool testShuffleRowChannels(const double testDuration);
312
313 /**
314 * Test the row-based shuffling of pixel channels and setting the last channel with constant value.
315 * @param testDuration The number of seconds for each test, with range (0, infinity)
316 * @return True, if the test was successful, otherwise false
317 */
318 static bool testShuffleRowChannelsAndSetLastChannelValue(const double testDuration);
319
320 /**
321 * Test the row-based narrowing of pixel with 16 bit channels.
322 * @param testDuration The number of seconds for each test, with range (0, infinity)
323 * @return True, if the test was successful, otherwise false
324 */
325 static bool testNarrowRow16BitPerChannels(const double testDuration);
326
327 /**
328 * Test function to be used with the test for the advanced pixel modifier
329 * @param source The pointer to the source pixel, must be valid
330 * @param target The pointer to the target pixel, must be valid
331 * @tparam TSource The type of the source
332 * @tparam TTarget The type of the target
333 */
334 template <typename TSource, typename TTarget, unsigned int tChannels>
335 static void testFunctionApplyAdvancedModifier(const TSource* source, TTarget* target);
336
337 protected:
338
339 /**
340 * Tests frame separation to one channel function.
341 * @param width The width of the test frame in pixel, with range [1, infinity)
342 * @param height The height of the test frame in pixel, with range [1, infinity)
343 * @param channels The number of channels the test frame has, with range [2, infinity)
344 * @param testDuration The number of seconds for each test, with range (0, infinity)
345 * @return True, if succeeded
346 * @tparam TSource The data type of the source elements
347 * @tparam TTarget The data type of the target elements
348 */
349 template <typename TSource, typename TTarget>
350 static bool testSeparateTo1Channel(const unsigned int width, const unsigned int height, const unsigned int channels, const double testDuration);
351
352 /**
353 * Tests zip channels function.
354 * @param width The width of the test frame in pixel, with range [1, infinity)
355 * @param height The height of the test frame in pixel, with range [1, infinity)
356 * @param channels The number of channels the test frame has, with range [2, infinity)
357 * @param testDuration The number of seconds for each test, with range (0, infinity)
358 * @return True, if succeeded
359 * @tparam TSource The data type of the source elements
360 * @tparam TTarget The data type of the target elements
361 */
362 template <typename TSource, typename TTarget>
363 static bool testZipChannels(const unsigned int width, const unsigned int height, const unsigned int channels, const double testDuration);
364
365 /**
366 * Tests the add channel function that adds a channel as new first channel.
367 * @param width The width of the test frame in pixel, with range [1, infinity)
368 * @param height The height of the test frame in pixel, with range [1, infinity)
369 * @param testDuration The number of seconds for each test, with range (0, infinity)
370 * @param worker The worker object to distribute the computation
371 * @return True, if so
372 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
373 * @tparam tSourceChannels The number of channels of the source frame, with range [1, infinity)
374 */
375 template <typename T, unsigned int tSourceChannels>
376 static bool testAddFirstChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
377
378 /**
379 * Tests the add channel value function that adds a channel as new first channel.
380 * @param width The width of the test frame in pixel, with range [1, infinity)
381 * @param height The height of the test frame in pixel, with range [1, infinity)
382 * @param testDuration The number of seconds for each test, with range (0, infinity)
383 * @param worker The worker object to distribute the computation
384 * @return True, if so
385 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
386 * @tparam tSourceChannels The number of channels of the source frame, with range [1, infinity)
387 */
388 template <typename T, unsigned int tSourceChannels>
389 static bool testAddFirstChannelValue(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
390
391 /**
392 * Tests the add channel function that adds a channel as new last channel.
393 * @param width The width of the test frame in pixel, with range [1, infinity)
394 * @param height The height of the test frame in pixel, with range [1, infinity)
395 * @param testDuration The number of seconds for each test, with range (0, infinity)
396 * @param worker The worker object to distribute the computation
397 * @return True, if so
398 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
399 * @tparam tSourceChannels The number of channels of the source frame, with range [1, infinity)
400 */
401 template <typename T, unsigned int tSourceChannels>
402 static bool testAddLastChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
403
404 /**
405 * Tests the add channel value function that adds a channel as new last channel.
406 * @param width The width of the test frame in pixel, with range [1, infinity)
407 * @param height The height of the test frame in pixel, with range [1, infinity)
408 * @param testDuration The number of seconds for each test, with range (0, infinity)
409 * @param worker The worker object to distribute the computation
410 * @return True, if so
411 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
412 * @tparam tSourceChannels The number of channels of the source frame, with range [1, infinity)
413 */
414 template <typename T, unsigned int tSourceChannels>
415 static bool testAddLastChannelValue(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
416
417 /**
418 * Tests the remove channel function that removes the first channel.
419 * @param width The width of the test frame in pixel, with range [1, infinity)
420 * @param height The height of the test frame in pixel, with range [1, infinity)
421 * @param testDuration The number of seconds for each test, with range (0, infinity)
422 * @param worker The worker object to distribute the computation
423 * @return True, if so
424 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
425 * @tparam tSourceChannels The number of channels of the source frame, with range [2, infinity)
426 */
427 template <typename T, unsigned int tSourceChannels>
428 static bool testRemoveFirstChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
429
430 /**
431 * Tests the remove channel function that removes the last channel.
432 * @param width The width of the test frame in pixel, with range [1, infinity)
433 * @param height The height of the test frame in pixel, with range [1, infinity)
434 * @param testDuration The number of seconds for each test, with range (0, infinity)
435 * @param worker The worker object to distribute the computation
436 * @return True, if so
437 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
438 * @tparam tSourceChannels The number of channels of the source frame, with range [2, infinity)
439 */
440 template <typename T, unsigned int tSourceChannels>
441 static bool testRemoveLastChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
442
443 /**
444 * Tests the copy channel function.
445 * @param width The width of the test frame in pixel, with range [1, infinity)
446 * @param height The height of the test frame in pixel, with range [1, infinity)
447 * @param testDuration The number of seconds for each test, with range (0, infinity)
448 * @param worker The worker object to distribute the computation
449 * @return True, if so
450 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
451 * @tparam tSourceChannels The number of channels of the source frame, with range [1, infinity)
452 * @tparam tTargetChannels The number of channels of the source frame, with range [1, infinity)
453 * @tparam tSourceChannelIndex The number of channels of the source frame, with range [1, tSourceChannels - 1]
454 * @tparam tTargetChannelIndex The number of channels of the source frame, with range [1, tTargetchannels - 1]
455 */
456 template <typename T, unsigned int tSourceChannels, unsigned int tTargetChannels, unsigned int tSourceChannelIndex, unsigned int tTargetChannelIndex>
457 static bool testCopyChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
458
459 /**
460 * Tests the set channel function.
461 * @param width The width of the test frame in pixel, with range [1, infinity)
462 * @param height The height of the test frame in pixel, with range [1, infinity)
463 * @param testDuration The number of seconds for each test, with range (0, infinity)
464 * @param worker The worker object to distribute the computation
465 * @return True, if so
466 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
467 * @tparam tChannel The number of channels of the source frame, with range [1, tChannels - 1]
468 * @tparam tChannels The number of channels of the frame, with range [1, infinity)
469 */
470 template <typename T, unsigned int tChannel, unsigned int tChannels>
471 static bool testSetChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker& worker);
472
473 /**
474 * Validates the add channel function that add a new channel as first channel.
475 * @param source The source frame to which the new channel will be added, must be valid
476 * @param sourceNewChannel The new channel to be added, must be valid
477 * @param target The target frame with added channel, must be valid
478 * @param sourceChannels The number of channels the source frame has, with range [1, infinity)
479 * @param width The width of both frames frame in pixel, with range [1, infinity)
480 * @param height The height of both frames frame in pixel, with range [1, infinity)
481 * @param flag The conversion type to be applied
482 * @param sourcePaddingElements Optional number of padding elements at the end of each source row, in elements, with range [0, infinity)
483 * @param sourceNewChannelPaddingElements Optional number of padding elements at the end of each new-channel-source row, in elements, with range [0, infinity)
484 * @param targetPaddingElements Optional number of padding elements at the end of each target row, in elements, with range [0, infinity)
485 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
486 */
487 template <typename T>
488 static bool validateAddFirstChannel(const T* source, const T* sourceNewChannel, const T* target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int sourceNewChannelPaddingElements, const unsigned int targetPaddingElements);
489
490 /**
491 * Validates the add channel value function that adds a new channel as first channel.
492 * @param source The source frame to which the new channel will be added, must be valid
493 * @param newChannelValue The value of the new channel
494 * @param target The target frame with added channel, must be valid
495 * @param sourceChannels The number of channels the source frame has, with range [1, infinity)
496 * @param width The width of both frames frame in pixel, with range [1, infinity)
497 * @param height The height of both frames frame in pixel, with range [1, infinity)
498 * @param flag The conversion type to be applied
499 * @param sourcePaddingElements Optional number of padding elements at the end of each source row, in elements, with range [0, infinity)
500 * @param targetPaddingElements Optional number of padding elements at the end of each target row, in elements, with range [0, infinity)
501 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
502 */
503 template <typename T>
504 static bool validateAddFirstChannelValue(const T* source, const T& newChannelValue, const T* target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements);
505
506 /**
507 * Validates the add channel function that add a new channel as last channel.
508 * @param source The source frame to which the new channel will be added, must be valid
509 * @param sourceNewChannel The new channel to be added, must be valid
510 * @param target The target frame with added channel, must be valid
511 * @param sourceChannels The number of channels the source frame has, with range [1, infinity)
512 * @param width The width of both frames frame in pixel, with range [1, infinity)
513 * @param height The height of both frames frame in pixel, with range [1, infinity)
514 * @param flag The conversion type to be applied
515 * @param sourcePaddingElements Optional number of padding elements at the end of each source row, in elements, with range [0, infinity)
516 * @param sourceNewChannelPaddingElements Optional number of padding elements at the end of each new-channel-source row, in elements, with range [0, infinity)
517 * @param targetPaddingElements Optional number of padding elements at the end of each target row, in elements, with range [0, infinity)
518 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
519 */
520 template <typename T>
521 static bool validateAddLastChannel(const T* source, const T* sourceNewChannel, const T* target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int sourceNewChannelPaddingElements, const unsigned int targetPaddingElements);
522
523 /**
524 * Validates the add channel value function that adds a new channel as last channel.
525 * @param source The source frame to which the new channel will be added, must be valid
526 * @param newChannelValue The value of the new channel
527 * @param target The target frame with added channel, must be valid
528 * @param sourceChannels The number of channels the source frame has, with range [1, infinity)
529 * @param width The width of both frames frame in pixel, with range [1, infinity)
530 * @param height The height of both frames frame in pixel, with range [1, infinity)
531 * @param flag The conversion type to be applied
532 * @param sourcePaddingElements Optional number of padding elements at the end of each source row, in elements, with range [0, infinity)
533 * @param targetPaddingElements Optional number of padding elements at the end of each target row, in elements, with range [0, infinity)
534 * @tparam T The data type of each pixel element, e.g., 'unsigned char' or 'float'
535 */
536 template <typename T>
537 static bool validateAddLastChannelValue(const T* source, const T& newChannelValue, const T* target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements);
538
539 /**
540 * Validates the advanced pixel modification function
541 * @param source The source frame that will be used for the validation, must be valid
542 * @param validationTarget The target frame that will be validated, must be valid
543 * @param conversionFlag The conversion flag that will be used for the validation
544 * @tparam TElement The type that the test data will use, must be an integral type
545 * @tparam tChannels The number of channels that the test data will use, range: [1, 4]
546 * @tparam tFunction The pixel function that will be used for testing, must be valid
547 */
548 template <typename TElement, unsigned int tChannels, void (*tPixelFunction)(const TElement*, TElement*)>
549 static bool validateApplyAdvancedPixelModifier(const Frame& source, const Frame& validationTarget, const CV::FrameConverter::ConversionFlag conversionFlag);
550
551 /**
552 * Validates the bivariate operator using subtraction
553 * @param source0 The first source frame, must be valid
554 * @param source1 The second source frame, must be valid
555 * @param target The target frame that will be validated, must be valid
556 * @param flag The conversion flag
557 * @tparam TSource0 Type of the first source
558 * @tparam TSource1 Type of the second source
559 * @tparam TTarget Type of the target
560 * @return True on successful validation, otherwise false
561 */
562 template <typename TSource0, typename TSource1, typename TTarget>
563 static bool validateApplyBivariateOperatorSubtract(const Frame& source0, const Frame& source1, const Frame& target, const CV::FrameChannels::ConversionFlag flag);
564
565 /**
566 * Validation function for image transformations like flipping and mirroring for a specific generic pixel format.
567 * @param source Pointer to the source data, must be valid
568 * @param target Pointer to the data to be tested, must be valid
569 * @param width The width of the images to be tested, range: [1, infinity)
570 * @param height The height of the images to be tested, range: [1, infinity)
571 * @param sourcePaddingElements The number of padding elements in the source image, range: [0, infinity)
572 * @param targetPaddingElements The number of padding elements in the test image, range: [0, infinity)
573 * @param flag Conversion flag, cf. @c CV::FrameConverter::ConversionFlag
574 * @return True if the test was successful, otherwise false
575 * @tparam TElementType Type used for data of the images (will be used internally to generate random test data)
576 * @tparam tChannels The number of channels of the test images (will be used internally to generate random test data), range: [1, infinity)
577 */
578 template <typename TElementType, unsigned int tChannels>
579 static bool validateTransformGeneric(const TElementType* source, const TElementType* target, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const CV::FrameConverter::ConversionFlag flag);
580
581 /**
582 * Validates the reversion of channels of frame pixels.
583 * @param source The source frame for which the channels will be reversed, must be valid
584 * @param target The target frame with reversed channels, must be valid
585 * @param width The width of the images to be tested, with range [1, infinity)
586 * @param height The height of the images to be tested, with range [1, infinity)
587 * @param channels The number of channels of the test images, with range [1, infinity)
588 * @param sourcePaddingElements The number of padding elements in the source image, witgh range [0, infinity)
589 * @param targetPaddingElements The number of padding elements in the test image, with range [0, infinity)
590 * @param flag The conversion flag which has been applied
591 * @return True if the test was successful, otherwise false
592 * @tparam T The data type of each pixel channel, e.g., 'unsigned char' or 'float'
593 */
594 template <typename T>
595 static bool validateReverseChannelOrder(const T* source, const T* target, const unsigned int width, const unsigned int height, const unsigned int channels, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const CV::FrameConverter::ConversionFlag flag);
596
597 /**
598 * Validates the remove channel function that removes the first channel.
599 * @param source The source frame from which the channel will be removed, must be valid
600 * @param target The target frame with removed channel, must be valid
601 * @param sourceChannels The number of channels of the source frame, with range [2, infinity)
602 * @param width The width of the original frame in pixel, with range [1, infinity)
603 * @param height The height of the original frame in pixel, with range [1, infinity)
604 * @param flag Conversion flag
605 * @param sourcePaddingElements The number of padding elements at the end of each row of the source image, in elements, with range [0, infinity)
606 * @param targetPaddingElements The number of padding elements at the end of each row of the target image, in elements, with range [0, infinity)
607 * @tparam T The data type of each pixel channel, e.g., 'unsigned char' or 'float'
608 */
609 template <typename T>
610 static bool validateRemoveFirstChannel(const T* source, const T* target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements);
611
612 /**
613 * Validates the remove channel function that removes the last channel.
614 * @param source The source frame from which the channel will be removed, must be valid
615 * @param target The target frame with removed channel, must be valid
616 * @param sourceChannels The number of channels of the source frame, with range [2, infinity)
617 * @param width The width of the original frame in pixel, with range [1, infinity)
618 * @param height The height of the original frame in pixel, with range [1, infinity)
619 * @param flag Conversion flag
620 * @param sourcePaddingElements The number of padding elements at the end of each row of the source image, in elements, with range [0, infinity)
621 * @param targetPaddingElements The number of padding elements at the end of each row of the target image, in elements, with range [0, infinity)
622 */
623 template <typename T>
624 static bool validateRemoveLastChannel(const T* source, const T* target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements);
625
626 /**
627 * Validates the copy channel function.
628 * @param source The source frame from which one channel will be copied, must be valid
629 * @param originalTarget The target frame before the channel has been copied, must be valid
630 * @param target The target frame to which the channel has been copied, must be valid
631 * @param sourceChannels The number of channels of the source frame, with range [1, infinity)
632 * @param targetChannels The number of channels of the target frame, with range [1, infinity)
633 * @param sourceChannelIndex The index of the source channel to be copied, with range [0, sourceChannels - 1]
634 * @param targetChannelIndex The index of the target channel which has received the copied channel, with range [0, targetChannels - 1]
635 * @param width The width of the original frame in pixel, with range [1, infinity)
636 * @param height The height of the original frame in pixel, with range [1, infinity)
637 * @param sourcePaddingElements The number of padding elements at the end of each row of the source image, in elements, with range [0, infinity)
638 * @param targetPaddingElements The number of padding elements at the end of each row of the target image, in elements, with range [0, infinity)
639 */
640 template <typename T>
641 static bool validateCopyChannel(const T* source, const T* originalTarget, const T* target, const unsigned int sourceChannels, const unsigned int targetChannels, const unsigned int sourceChannelIndex, const unsigned int targetChannelIndex, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements);
642
643 /**
644 * Validates the set channel function.
645 * @param originalFrame The frame before the channel has been set, must be valid
646 * @param frame The frame with modified channel, must be valid
647 * @param width The width of the original frame in pixel, with range [1, infinity)
648 * @param height The height of the original frame in pixel, with range [1, infinity)
649 * @param value The channel value that has been set
650 * @param channelIndex The index of the channel which has been set, with range [0, channels - 1]
651 * @param channels The number of channels of the frame, with range [1, infinity)
652 * @param framePaddingElements The number of padding elements at the end of each row of the image, in elements, with range [0, infinity)
653 */
654 template <typename T>
655 static bool validateSetChannel(const T* originalFrame, const T* frame, const unsigned int width, const unsigned int height, const T value, const unsigned int channelIndex, const unsigned int channels, const unsigned int framePaddingElements);
656
657 /**
658 * Validates the row-based pixel reverse order function for a specific data type and channel number.
659 * @param randomGenerator The random generator object to be used
660 * @return True, if succeeded
661 * @tparam T The data type of the each pixel element
662 * @tparam tChannels The number of channels per pixel, with range [1, infinity)
663 */
664 template <typename T, unsigned int tChannels>
665 static bool validateReverseRowPixelOrder(RandomGenerator& randomGenerator);
666
667 /**
668 * Validates the row-based channel reverse order function for a specific data type and channel number.
669 * @param randomGenerator The random generator object to be used
670 * @return True, if succeeded
671 * @tparam T The data type of the each pixel element
672 * @tparam tChannels The number of channels per pixel, with range [1, infinity)
673 */
674 template <typename T, unsigned int tChannels>
675 static bool validateReverseRowChannelOrder(RandomGenerator& randomGenerator);
676
677 /**
678 * Validates the row-based shuffle function for channels.
679 * @param randomGenerator The random generator object to be used
680 * @return True, if succeeded
681 * @tparam T Data type of each channel pixel value, e.g, 'unsigned char' or 'float'
682 * @tparam tSourceChannels The number of source data channels, with range [1, 8u]
683 * @tparam tTargetChannels The number of target data channels, with range [1, 8u]
684 * @tparam tShufflePattern Groups of four bits define the source channel, e.g., 0x76543210 defines the identity transformation, 0x01234567 defines the reverse transformation
685 */
686 template <typename T, unsigned int tSourceChannels, unsigned int tTargetChannels, unsigned int tShufflePattern>
687 static bool validateShuffleRowChannels(RandomGenerator& randomGenerator);
688
689 /**
690 * Validates the row-based shuffle and setting last channel with constant value function for channels.
691 * @param randomGenerator The random generator object to be used
692 * @return True, if succeeded
693 * @tparam T Data type of each channel pixel value, e.g, 'unsigned char' or 'float'
694 * @tparam tSourceChannels The number of source data channels, with range [1, 8u]
695 * @tparam tTargetChannels The number of target data channels, with range [2, 8u]
696 * @tparam tShufflePattern Groups of four bits define the source channel, e.g., 0x76543210 defines the identity transformation, 0x01234567 defines the reverse transformation
697 */
698 template <typename T, unsigned int tSourceChannels, unsigned int tTargetChannels, unsigned int tShufflePattern>
700
701 /**
702 * Validates the row-based narrow function for 16 bit channels.
703 * @param randomGenerator The random generator object to be used
704 * @return True, if succeeded
705 * @tparam tChannels The number of channels, with range [1, infinity)
706 */
707 template <unsigned int tChannels>
709
710 /**
711 * Collection of test operations for pixel operators.
712 * @tparam tChannels The number of frame channels, with range [1, infinity)
713 */
714 template <unsigned int tChannels>
716 {
717 /**
718 * Facilitates subtraction between two sources and stores the result to another destination
719 * Essentially, target = source0 - source1
720 * @param source0 The first source pixel, must be valid
721 * @param source1 The second source pixel must be valid
722 * @param target The location where the result will be stored (of the targer pixel), must be valid
723 */
724 template <typename TSource0, typename TSource1, typename TTarget>
725 static void subtract(const TSource0* source0, const TSource1* source1, TTarget* target);
726 };
727};
728
729template <unsigned int tChannels>
730template <typename TSource0, typename TSource1, typename TTarget>
731void TestFrameChannels::TestOperations<tChannels>::subtract(const TSource0* source0, const TSource1* source1, TTarget* target)
732{
733 static_assert(tChannels >= 1u, "Invalid channel number!");
734
735 ocean_assert(source0 != nullptr && source1 != nullptr && target != nullptr);
736
737 for (unsigned int c = 0u; c < tChannels; ++c)
738 {
739 target[c] = (TTarget)(source0[c] - source1[c]);
740 }
741};
742
743}
744
745}
746
747}
748
749#endif // META_OCEAN_TEST_TESTCV_TEST_FRAME_CHANNELS_H
ConversionFlag
Definition of individual conversion flags.
Definition FrameConverter.h:39
This class implements Ocean's image class.
Definition Frame.h:1879
This class implements a generator for random numbers.
Definition RandomGenerator.h:42
This class implements a frame channels test.
Definition TestFrameChannels.h:38
static bool validateRemoveLastChannel(const T *source, const T *target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements)
Validates the remove channel function that removes the last channel.
static bool testAddFirstChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the add channel function that adds a channel as new first channel.
static bool testAddFirstChannelValue(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the add channel value function that adds a channel as new first channel.
static bool testAddLastChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the add channel function that adds a channel as new last channel.
static bool testNarrowRow16BitPerChannels(const double testDuration)
Test the row-based narrowing of pixel with 16 bit channels.
static bool testRemoveFirstChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the remove channel function that removes the first channel.
static bool testStraightAlphaToPremultipliedAlpha(const double testDuration, Worker &worker)
Tests the conversion function from straight alpha to premultiplied alpha images.
static bool validateNarrowRow16BitPerChannels(RandomGenerator &randomGenerator)
Validates the row-based narrow function for 16 bit channels.
static bool testShuffleRowChannels(const double testDuration)
Test the row-based shuffling of pixel channels.
static bool validateReverseChannelOrder(const T *source, const T *target, const unsigned int width, const unsigned int height, const unsigned int channels, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const CV::FrameConverter::ConversionFlag flag)
Validates the reversion of channels of frame pixels.
static bool validateTransformGeneric(const TElementType *source, const TElementType *target, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const CV::FrameConverter::ConversionFlag flag)
Validation function for image transformations like flipping and mirroring for a specific generic pixe...
static bool testApplyBivariateOperator(const double testDuration, Worker &worker)
Test the pixel operator for two inputs and one output.
static bool testRowPixelConversion4ChannelsTo2Channels(const double testDuration)
Test the row-based pixel conversion from 4 channels to 2 channel.
static void testFunctionApplyAdvancedModifier(const TSource *source, TTarget *target)
Test function to be used with the test for the advanced pixel modifier.
static bool testReverseRowChannelOrder(const double testDuration)
Test the row-based pixel reverse order function.
static bool testReverseChannelOrder(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the image conversion function reversing the order of pixel channels for a specific data type an...
static bool testSeparateTo1Channel(const unsigned int width, const unsigned int height, const double testDuration)
Tests frame separation to one channel function.
static bool testTransformGeneric(const double testDuration, Worker &worker)
Test the image transformation function for generic pixel formats.
static bool validateAddLastChannel(const T *source, const T *sourceNewChannel, const T *target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int sourceNewChannelPaddingElements, const unsigned int targetPaddingElements)
Validates the add channel function that add a new channel as last channel.
static bool testRemoveFirstChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the remove channel function that removes the first channel.
static bool testRowPixelConversion4ChannelsTo1Channel(const double testDuration)
Test the row-based pixel conversion from 4 channels to 1 channel.
static bool testRemoveLastChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the remove channel function that removes the last channel.
static bool testApplyAdvancedPixelModifier(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the advanced pixel modifier function for specifc element type and number of channels.
static bool testAddLastChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the add channel function that adds a channel as new last channel.
static bool testSetChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the set channel function.
static bool testTransformGeneric(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the image transformation function for a specific generic pixel format.
static bool testReverseRowPixelOrder(const double testDuration)
Test the row-based pixel reverse order function.
static bool testRowPixelConversion3ChannelsTo1Channel(const double testDuration)
Test the row-based pixel conversion from 3 channels to 1 channel.
static bool validateShuffleRowAndSetLastChannelValueChannels(RandomGenerator &randomGenerator)
Validates the row-based shuffle and setting last channel with constant value function for channels.
static bool testCopyChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the copy channel function.
static bool validateShuffleRowChannels(RandomGenerator &randomGenerator)
Validates the row-based shuffle function for channels.
static bool testSeparateTo1Channel(const unsigned int width, const unsigned int height, const unsigned int channels, const double testDuration)
Tests frame separation to one channel function.
static bool testRowPixelConversion3ChannelsTo3Channels10BitPrecision(const double testDuration)
Test the row-based pixel conversion from 3 channels to 3 channels with 10 bit precision.
static bool test(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker, const TestSelector &selector=TestSelector())
Tests all frame channels functions.
static bool testZipChannels(const unsigned int width, const unsigned int height, const double testDuration)
Tests frame zip channels function.
static bool testShuffleRowChannelsAndSetLastChannelValue(const double testDuration)
Test the row-based shuffling of pixel channels and setting the last channel with constant value.
static bool validateApplyBivariateOperatorSubtract(const Frame &source0, const Frame &source1, const Frame &target, const CV::FrameChannels::ConversionFlag flag)
Validates the bivariate operator using subtraction.
static bool testCopyChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the copy channel function.
static bool testAddLastChannelValue(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the add channel value function that adds a channel as new last channel.
static bool testRemoveLastChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the remove channel function that removes the last channel.
static bool testAddFirstChannelValue(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the add channel value function that adds a channel as new first channel.
static bool testApplyAdvancedPixelModifier(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the advanced pixel modifier function.
static bool testRowPixelConversion3ChannelsTo3Channels7BitPrecision(const double testDuration)
Test the row-based pixel conversion from 3 channels to 3 channels with 7 bit precision.
static bool testPremultipliedAlphaToStraightAlpha(const double testDuration, Worker &worker)
Tests the conversion function from premultiplied alpha to straight alpha images.
static bool validateRemoveFirstChannel(const T *source, const T *target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements)
Validates the remove channel function that removes the first channel.
static bool validateAddLastChannelValue(const T *source, const T &newChannelValue, const T *target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements)
Validates the add channel value function that adds a new channel as last channel.
static bool testRowPixelConversion4ChannelsTo3Channels(const double testDuration)
Test the row-based pixel conversion from 4 channels to 3 channel.
static bool testSetChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the set channel function.
static bool testReverseChannelOrder(const double testDuration, Worker &worker)
Tests the image conversion function reversing the order of pixel channels.
static bool testAddLastChannelValue(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the add channel value function that adds a channel as new last channel.
static bool validateCopyChannel(const T *source, const T *originalTarget, const T *target, const unsigned int sourceChannels, const unsigned int targetChannels, const unsigned int sourceChannelIndex, const unsigned int targetChannelIndex, const unsigned int width, const unsigned int height, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements)
Validates the copy channel function.
static bool validateSetChannel(const T *originalFrame, const T *frame, const unsigned int width, const unsigned int height, const T value, const unsigned int channelIndex, const unsigned int channels, const unsigned int framePaddingElements)
Validates the set channel function.
static bool testRowPixelConversion3ChannelsTo3Channels6BitPrecision(const double testDuration)
Test the row-based pixel conversion from 3 channels to 3 channels with 6 bit precision.
static bool validateReverseRowPixelOrder(RandomGenerator &randomGenerator)
Validates the row-based pixel reverse order function for a specific data type and channel number.
static bool validateAddFirstChannelValue(const T *source, const T &newChannelValue, const T *target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements)
Validates the add channel value function that adds a new channel as first channel.
static bool validateAddFirstChannel(const T *source, const T *sourceNewChannel, const T *target, const unsigned int sourceChannels, const unsigned int width, const unsigned int height, const CV::FrameConverter::ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int sourceNewChannelPaddingElements, const unsigned int targetPaddingElements)
Validates the add channel function that add a new channel as first channel.
static bool validateApplyAdvancedPixelModifier(const Frame &source, const Frame &validationTarget, const CV::FrameConverter::ConversionFlag conversionFlag)
Validates the advanced pixel modification function.
static bool validateReverseRowChannelOrder(RandomGenerator &randomGenerator)
Validates the row-based channel reverse order function for a specific data type and channel number.
static bool testZipChannels(const unsigned int width, const unsigned int height, const unsigned int channels, const double testDuration)
Tests zip channels function.
static bool testAddFirstChannel(const unsigned int width, const unsigned int height, const double testDuration, Worker &worker)
Tests the add channel function that adds a channel as new first channel.
This class implements a test selector that parses test function strings and determines which tests sh...
Definition TestSelector.h:51
This class implements a worker able to distribute function calls over different threads.
Definition Worker.h:33
The namespace covering the entire Ocean framework.
Definition Accessor.h:15
Collection of test operations for pixel operators.
Definition TestFrameChannels.h:716
static void subtract(const TSource0 *source0, const TSource1 *source1, TTarget *target)
Facilitates subtraction between two sources and stores the result to another destination Essentially,...
Definition TestFrameChannels.h:731