8#ifndef META_OCEAN_CV_FRAME_CONVERTER_YUV_24_H
9#define META_OCEAN_CV_FRAME_CONVERTER_YUV_24_H
47 static inline void convertYUV24ToBGR24(
const uint8_t* source, uint8_t* target,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int targetPaddingElements,
Worker* worker =
nullptr);
62 static inline void convertYUV24ToBGRA32Precision6Bit(
const uint8_t* source, uint8_t* target,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int targetPaddingElements,
const uint8_t alphaValue = 0xFF,
Worker* worker =
nullptr);
76 static inline void convertYUV24ToRGB24(
const uint8_t* source, uint8_t* target,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int targetPaddingElements,
Worker* worker =
nullptr);
90 static inline void convertYUV24ToRGB24Precision6Bit(
const uint8_t* source, uint8_t* target,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int targetPaddingElements,
Worker* worker =
nullptr);
103 static inline void convertYUV24ToY8(
const uint8_t* source, uint8_t* target,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int targetPaddingElements,
Worker* worker =
nullptr);
117 static inline void convertYUV24LimitedRangeToY8LimitedRange(
const uint8_t* source, uint8_t* target,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int targetPaddingElements,
Worker* worker =
nullptr);
131 static inline void convertYUV24FullRangeToY8FullRange(
const uint8_t* source, uint8_t* target,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int targetPaddingElements,
Worker* worker =
nullptr);
144 static inline void convertYUV24ToYUV24(
const uint8_t* source, uint8_t* target,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int targetPaddingElements,
Worker* worker =
nullptr);
157 static inline void convertYUV24ToYVU24(
const uint8_t* source, uint8_t* target,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int targetPaddingElements,
Worker* worker =
nullptr);
174 static inline void convertYUV24ToY_U_V12(
const uint8_t* source, uint8_t* yTarget, uint8_t* uTarget, uint8_t* vTarget,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int yTargetPaddingElements,
const unsigned int uTargetPaddingElements,
const unsigned int vTargetPaddingElements,
Worker* worker =
nullptr);
185 static inline void convertYUV24ToRGB24Pixel(
const uint8_t y,
const uint8_t u,
const uint8_t v, uint8_t& r, uint8_t& g, uint8_t& b);
189#if defined(OCEAN_HARDWARE_NEON_VERSION) && OCEAN_HARDWARE_NEON_VERSION >= 10
207 static OCEAN_FORCE_INLINE
void convert16PixelsYUV24ToRGB24Precision6BitNEON(
const uint8_t*
const source, uint8_t*
const target);
215 ocean_assert(source !=
nullptr && target !=
nullptr);
216 ocean_assert(width >= 1u && height >= 1u);
218 const unsigned int sourceStrideElements = width * 3u + sourcePaddingElements;
219 const unsigned int targetStrideElements = width * 3u + targetPaddingElements;
233 const int parameters[12] = {1192, 1192, 1192, 2066, -400, 0, 0, -833, 1634, -277, 135, -223};
235 const bool areContinuous = sourcePaddingElements == 0u && targetPaddingElements == 0u;
237 FrameConverter::convertGenericPixelFormat(source, target, width, height, sourceStrideElements, targetStrideElements, flag,
CV::FrameChannels::convertRow3ChannelsTo3Channels8BitPerChannel10BitPrecision, CV::FrameChannels::reverseRowPixelOrderInPlace<uint8_t, 3u>, areContinuous, parameters, worker);
242 ocean_assert(source !=
nullptr && target !=
nullptr);
243 ocean_assert(width >= 1u && height >= 1u);
245 const unsigned int sourceStrideElements = width * 3u + sourcePaddingElements;
246 const unsigned int targetStrideElements = width * 4u + targetPaddingElements;
260 const int parameters[13] = {64, 64, 64, 111, -22, 0, 0, -45, 88, 0, 128, 128, int(alphaValue)};
262 const bool areContinuous = sourcePaddingElements == 0u && targetPaddingElements == 0u;
264 FrameConverter::convertGenericPixelFormat(source, target, width, height, sourceStrideElements, targetStrideElements, flag,
CV::FrameChannels::convertRow3ChannelsTo4Channels8BitPerChannel6BitPrecision, CV::FrameChannels::reverseRowPixelOrderInPlace<uint8_t, 4u>, areContinuous, parameters, worker);
269 ocean_assert(source !=
nullptr && target !=
nullptr);
270 ocean_assert(width >= 1u && height >= 1u);
272 const unsigned int sourceStrideElements = width * 3u + sourcePaddingElements;
273 const unsigned int targetStrideElements = width * 3u + targetPaddingElements;
287 const int parameters[12] = {1192, 1192, 1192, 0, -400, 2066, 1634, -833, 0, -223, 135, -277};
289 const bool areContinuous = sourcePaddingElements == 0u && targetPaddingElements == 0u;
291 FrameConverter::convertGenericPixelFormat(source, target, width, height, sourceStrideElements, targetStrideElements, flag,
CV::FrameChannels::convertRow3ChannelsTo3Channels8BitPerChannel10BitPrecision, CV::FrameChannels::reverseRowPixelOrderInPlace<uint8_t, 3u>, areContinuous, parameters, worker);
296 ocean_assert(source !=
nullptr && target !=
nullptr);
297 ocean_assert(width >= 1u && height >= 1u);
299 const unsigned int sourceStrideElements = width * 3u + sourcePaddingElements;
300 const unsigned int targetStrideElements = width * 3u + targetPaddingElements;
302#if defined(OCEAN_USE_HARDCODED_YUV24_TO_RGB24_CONVERTER) && OCEAN_HARDWARE_NEON_VERSION >= 10
306 FrameConverter::convertGenericPixelFormat(source, target, width, height, sourceStrideElements, targetStrideElements, flag,
FrameConverterYUV24::convertYUV24ToRGB24RowPrecision6BitNEON, CV::FrameChannels::reverseRowPixelOrderInPlace<uint8_t, 3u>,
nullptr, worker);
314 const int parameters[12] = {64, 64, 64, 0, -22, 111, 88, -45, 0, 0, 128, 128};
316 const bool areContinuous = sourcePaddingElements == 0u && targetPaddingElements == 0u;
318 FrameConverter::convertGenericPixelFormat(source, target, width, height, sourceStrideElements, targetStrideElements, flag,
CV::FrameChannels::convertRow3ChannelsTo3Channels8BitPerChannel6BitPrecision, CV::FrameChannels::reverseRowPixelOrderInPlace<uint8_t, 3u>, areContinuous, parameters, worker);
325 ocean_assert(source !=
nullptr && target !=
nullptr);
326 ocean_assert(width >= 1u && height >= 1u);
332 constexpr unsigned int shufflePattern = 0x0u;
334 FrameChannels::shuffleChannels<uint8_t, 3u, 1u, shufflePattern>(source, target, width, height, flag, sourcePaddingElements, targetPaddingElements, worker);
339 convertYUV24ToY8(source, target, width, height, flag, sourcePaddingElements, targetPaddingElements, worker);
344 convertYUV24ToY8(source, target, width, height, flag, sourcePaddingElements, targetPaddingElements, worker);
349 ocean_assert(source !=
nullptr && target !=
nullptr);
350 ocean_assert(width >= 1u && height >= 1u);
352 FrameChannels::transformGeneric<uint8_t, 3u>(source, target, width, height, flag, sourcePaddingElements, targetPaddingElements, worker);
357 ocean_assert(source !=
nullptr && target !=
nullptr);
358 ocean_assert(width >= 1u && height >= 1u);
365 constexpr unsigned int shufflePattern = 0x120u;
367 FrameChannels::shuffleChannels<uint8_t, 3u, 3u, shufflePattern>(source, target, width, height, flag, sourcePaddingElements, targetPaddingElements, worker);
370inline void FrameConverterYUV24::convertYUV24ToY_U_V12(
const uint8_t* source, uint8_t* yTarget, uint8_t* uTarget, uint8_t* vTarget,
const unsigned int width,
const unsigned int height,
const ConversionFlag flag,
const unsigned int sourcePaddingElements,
const unsigned int yTargetPaddingElements,
const unsigned int uTargetPaddingElements,
const unsigned int vTargetPaddingElements,
Worker* worker)
372 ocean_assert(source !=
nullptr && yTarget !=
nullptr && uTarget !=
nullptr && vTarget !=
nullptr);
374 ocean_assert(width >= 2u && width % 2u == 0u);
375 ocean_assert(height >= 2u && height % 2u == 0u);
377 if (width < 2u || height < 2u || width % 2u != 0u || height % 2u != 0u)
382 const unsigned int options[4] = {sourcePaddingElements, yTargetPaddingElements, uTargetPaddingElements, vTargetPaddingElements};
391 FrameConverter::convertArbitraryPixelFormat((
const void**)(&source), targets, width, height, flag, 2u, FrameConverter::mapTwoRows_1Plane3Channels_To_1Plane1ChannelAnd2Planes1ChannelDownsampled2x2_8BitPerChannel<0u, 1u, 2u>, options, worker);
396 const int y_ = (y - 16) * 298 + 128;
397 const int u_ = u - 128;
398 const int v_ = v - 128;
400 r = (uint8_t)(
minmax(0, (y_ + 409 * v_) >> 8, 255));
401 g = (uint8_t)(
minmax(0, (y_ - 100 * u_ - 208 * v_) >> 8, 255));
402 b = (uint8_t)(
minmax(0, (y_ + 516 * u_) >> 8, 255));
405#if defined(OCEAN_HARDWARE_NEON_VERSION) && OCEAN_HARDWARE_NEON_VERSION >= 10
409 ocean_assert(source !=
nullptr && target !=
nullptr);
424 const uint8x8_t constant_128_u_8x8 = vdup_n_u8(128);
425 const int16x8_t constant_22_s_16x8 = vdupq_n_s16(-22);
426 const int16x8_t constant_111_s_16x8 = vdupq_n_s16(111);
427 const int16x8_t constant_88_s_16x8 = vdupq_n_s16(88);
428 const int16x8_t constant_45_s_16x8 = vdupq_n_s16(-45);
430 const uint8x16x3_t source_u_8x16x3 = vld3q_u8(source);
433 const int16x8_t sourceMultiplied0_low_s_16x8 = vreinterpretq_s16_u16(vshll_n_u8(vget_low_u8(source_u_8x16x3.val[0]), 6));
434 const int16x8_t source1_low_s_16x8 = vreinterpretq_s16_u16(vsubl_u8(vget_low_u8(source_u_8x16x3.val[1]), constant_128_u_8x8));
435 const int16x8_t source2_low_s_16x8 = vreinterpretq_s16_u16(vsubl_u8(vget_low_u8(source_u_8x16x3.val[2]), constant_128_u_8x8));
437 const int16x8_t sourceMultiplied0_high_s_16x8 = vreinterpretq_s16_u16(vshll_n_u8(vget_high_u8(source_u_8x16x3.val[0]), 6));
438 const int16x8_t source1_high_s_16x8 = vreinterpretq_s16_u16(vsubl_u8(vget_high_u8(source_u_8x16x3.val[1]), constant_128_u_8x8));
439 const int16x8_t source2_high_s_16x8 = vreinterpretq_s16_u16(vsubl_u8(vget_high_u8(source_u_8x16x3.val[2]), constant_128_u_8x8));
443 int16x8_t intermediateResults1_low_s_16x8 = vmlaq_s16(sourceMultiplied0_low_s_16x8, source1_low_s_16x8, constant_22_s_16x8);
444 int16x8_t intermediateResults2_low_s_16x8 = vmlaq_s16(sourceMultiplied0_low_s_16x8, source1_low_s_16x8, constant_111_s_16x8);
446 int16x8_t intermediateResults1_high_s_16x8 = vmlaq_s16(sourceMultiplied0_high_s_16x8, source1_high_s_16x8, constant_22_s_16x8);
447 int16x8_t intermediateResults2_high_s_16x8 = vmlaq_s16(sourceMultiplied0_high_s_16x8, source1_high_s_16x8, constant_111_s_16x8);
449 int16x8_t intermediateResults0_low_s_16x8 = vmlaq_s16(sourceMultiplied0_low_s_16x8, source2_low_s_16x8, constant_88_s_16x8);
450 intermediateResults1_low_s_16x8 = vmlaq_s16(intermediateResults1_low_s_16x8, source2_low_s_16x8, constant_45_s_16x8);
452 int16x8_t intermediateResults0_high_s_16x8 = vmlaq_s16(sourceMultiplied0_high_s_16x8, source2_high_s_16x8, constant_88_s_16x8);
453 intermediateResults1_high_s_16x8 = vmlaq_s16(intermediateResults1_high_s_16x8, source2_high_s_16x8, constant_45_s_16x8);
455 uint8x16x3_t results_u_8x16x3;
458 results_u_8x16x3.val[0] = vcombine_u8(vqrshrun_n_s16(intermediateResults0_low_s_16x8, 6), vqrshrun_n_s16(intermediateResults0_high_s_16x8, 6));
459 results_u_8x16x3.val[1] = vcombine_u8(vqrshrun_n_s16(intermediateResults1_low_s_16x8, 6), vqrshrun_n_s16(intermediateResults1_high_s_16x8, 6));
460 results_u_8x16x3.val[2] = vcombine_u8(vqrshrun_n_s16(intermediateResults2_low_s_16x8, 6), vqrshrun_n_s16(intermediateResults2_high_s_16x8, 6));
463 vst3q_u8(target, results_u_8x16x3);
static void convertRow3ChannelsTo3Channels8BitPerChannel6BitPrecision(const uint8_t *source, uint8_t *target, const size_t size, const void *parameters)
Converts a row of pixels with 3 channels to pixels with 3 channels by a linear combination of the thr...
static void convertRow3ChannelsTo4Channels8BitPerChannel6BitPrecision(const uint8_t *source, uint8_t *target, const size_t size, const void *parameters)
Converts a row of pixels with 3 channels to pixels with 4 channels by a linear combination of the thr...
static void convertRow3ChannelsTo3Channels8BitPerChannel10BitPrecision(const uint8_t *source, uint8_t *target, const size_t size, const void *parameters)
Converts a row of pixels with 3 channels to pixels with 3 channels by a linear combination of the thr...
This is the base class for all frame converter classes.
Definition FrameConverter.h:33
ConversionFlag
Definition of individual conversion flags.
Definition FrameConverter.h:40
static void convertGenericPixelFormat(const TSource *source, TTarget *target, const unsigned int width, const unsigned int height, const unsigned int sourceStrideElements, const unsigned int targetStrideElements, const ConversionFlag flag, const RowConversionFunction< TSource, TTarget > rowConversionFunction, const RowReversePixelOrderInPlaceFunction< TTarget > targetReversePixelOrderInPlaceFunction, const bool areContinuous, const void *options, Worker *worker)
Converts a frame with generic pixel format (e.g., RGBA32, BGR24, YUV24, ...) to a frame with generic ...
Definition FrameConverter.h:3509
static void convertArbitraryPixelFormat(const void **sources, void **targets, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int multipleRowsPerIteration, const MultipleRowsConversionFunction multipleRowsConversionFunction, const void *options, Worker *worker)
Converts a frame with arbitrary pixel format (e.g., Y_UV12, Y_VU12, YUYV16, ...) to a frame with arbi...
Definition FrameConverter.h:3532
This class provides functions to convert frames with YUV24 pixel format to other pixel formats.
Definition FrameConverterYUV24.h:32
static void convertYUV24ToYUV24(const uint8_t *source, uint8_t *target, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Converts a YUV 24 bit frame to a YUV 24 bit frame.
Definition FrameConverterYUV24.h:347
static OCEAN_FORCE_INLINE void convert16PixelsYUV24ToRGB24Precision6BitNEON(const uint8_t *const source, uint8_t *const target)
Converts 16 YUV24 pixels to 16 RGB24 pixels by using NEON instructions.
Definition FrameConverterYUV24.h:407
static void convertYUV24ToY8(const uint8_t *source, uint8_t *target, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Converts a YUV 24 bit frame to a Y 8 bit frame.
Definition FrameConverterYUV24.h:323
static void convertYUV24ToBGRA32Precision6Bit(const uint8_t *source, uint8_t *target, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, const uint8_t alphaValue=0xFF, Worker *worker=nullptr)
Converts a YUV 24 bit frame to a BGRA 32 bit frame with 6 bit precision.
Definition FrameConverterYUV24.h:240
static void convertYUV24ToBGR24(const uint8_t *source, uint8_t *target, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Converts a YUV 24 bit frame to a BGR 24 bit frame.
Definition FrameConverterYUV24.h:213
static void convertYUV24FullRangeToY8FullRange(const uint8_t *source, uint8_t *target, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Converts a full range YUV 24 bit frame to a full range Y 8 bit frame.
Definition FrameConverterYUV24.h:342
static void convertYUV24LimitedRangeToY8LimitedRange(const uint8_t *source, uint8_t *target, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Converts a limited range YUV 24 bit frame to a limited range Y 8 bit frame.
Definition FrameConverterYUV24.h:337
static void convertYUV24ToYVU24(const uint8_t *source, uint8_t *target, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Converts a YUV 24 bit frame to a YVU 24 bit frame.
Definition FrameConverterYUV24.h:355
static void convertYUV24ToRGB24RowPrecision6BitNEON(const uint8_t *source, uint8_t *target, const size_t size, const void *parameters)
Converts a YUV 24 bit row to a RGB 24 bit row by using NEON instructions.
static void convertYUV24ToRGB24(const uint8_t *source, uint8_t *target, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Converts a YUV 24 bit frame to a RGB 24 bit frame.
Definition FrameConverterYUV24.h:267
static void convertYUV24ToRGB24Precision6Bit(const uint8_t *source, uint8_t *target, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int targetPaddingElements, Worker *worker=nullptr)
Converts a YUV 24 bit frame to a RGB 24 bit frame with 6 bit precision.
Definition FrameConverterYUV24.h:294
static void convertYUV24ToRGB24Pixel(const uint8_t y, const uint8_t u, const uint8_t v, uint8_t &r, uint8_t &g, uint8_t &b)
Converts one YUV 24 bit pixel to a RGB 24 bit pixel.
Definition FrameConverterYUV24.h:394
static void convertYUV24ToY_U_V12(const uint8_t *source, uint8_t *yTarget, uint8_t *uTarget, uint8_t *vTarget, const unsigned int width, const unsigned int height, const ConversionFlag flag, const unsigned int sourcePaddingElements, const unsigned int yTargetPaddingElements, const unsigned int uTargetPaddingElements, const unsigned int vTargetPaddingElements, Worker *worker=nullptr)
Converts a YUV 24 bit frame to a Y_U_V 12 bit frame.
Definition FrameConverterYUV24.h:370
This class implements a worker able to distribute function calls over different threads.
Definition Worker.h:33
T minmax(const T &lowerBoundary, const T &value, const T &upperBoundary)
This function fits a given parameter into a specified value range.
Definition base/Utilities.h:973
The namespace covering the entire Ocean framework.
Definition Accessor.h:15