From ee6033f2fe46a74211b2e43d1242495de32d0692 Mon Sep 17 00:00:00 2001 From: Comma Device Date: Thu, 21 Apr 2022 16:55:55 -0700 Subject: [PATCH] new libyuv --- selfdrive/camerad/cameras/camera_common.cc | 2 +- third_party/libyuv/build.txt | 2 +- third_party/libyuv/include/libyuv.h | 1 + .../libyuv/include/libyuv/basic_types.h | 108 +- third_party/libyuv/include/libyuv/compare.h | 89 +- .../libyuv/include/libyuv/compare_row.h | 84 +- third_party/libyuv/include/libyuv/convert.h | 918 ++- .../libyuv/include/libyuv/convert_argb.h | 2206 +++++- .../libyuv/include/libyuv/convert_from.h | 306 +- .../libyuv/include/libyuv/convert_from_argb.h | 338 +- third_party/libyuv/include/libyuv/cpu_id.h | 76 +- .../include/libyuv/loongson_intrinsics.h | 1949 +++++ .../libyuv/include/libyuv/macros_msa.h | 230 +- .../libyuv/include/libyuv/mjpeg_decoder.h | 29 +- .../libyuv/include/libyuv/planar_functions.h | 1094 ++- third_party/libyuv/include/libyuv/rotate.h | 215 +- .../libyuv/include/libyuv/rotate_argb.h | 10 +- .../libyuv/include/libyuv/rotate_row.h | 243 +- third_party/libyuv/include/libyuv/row.h | 6322 +++++++++++++---- third_party/libyuv/include/libyuv/scale.h | 295 +- .../libyuv/include/libyuv/scale_argb.h | 56 +- third_party/libyuv/include/libyuv/scale_rgb.h | 42 + third_party/libyuv/include/libyuv/scale_row.h | 1850 ++++- third_party/libyuv/include/libyuv/scale_uv.h | 51 + third_party/libyuv/include/libyuv/version.h | 2 +- .../libyuv/include/libyuv/video_common.h | 92 +- third_party/libyuv/larch64/lib/libyuv.a | Bin 499734 -> 791926 bytes 27 files changed, 13685 insertions(+), 2925 deletions(-) create mode 100644 third_party/libyuv/include/libyuv/loongson_intrinsics.h create mode 100644 third_party/libyuv/include/libyuv/scale_rgb.h create mode 100644 third_party/libyuv/include/libyuv/scale_uv.h diff --git a/selfdrive/camerad/cameras/camera_common.cc b/selfdrive/camerad/cameras/camera_common.cc index 7c4d2748f1..f3879bd2fe 100644 --- a/selfdrive/camerad/cameras/camera_common.cc +++ b/selfdrive/camerad/cameras/camera_common.cc @@ -260,7 +260,7 @@ kj::Array get_frame_image(const CameraBuf *b) { static kj::Array yuv420_to_jpeg(const CameraBuf *b, int thumbnail_width, int thumbnail_height) { // make the buffer big enough. jpeg_write_raw_data requires 16-pixels aligned height to be used. - std::unique_ptr buf(new uint8_t[(thumbnail_width * ((thumbnail_height + 15) & ~15) * 3) / 2]); + std::unique_ptr buf(new uint8_t[(thumbnail_width * ((thumbnail_height + 15) & ~15) * 3) / 2]); uint8_t *y_plane = buf.get(); uint8_t *u_plane = y_plane + thumbnail_width * thumbnail_height; uint8_t *v_plane = u_plane + (thumbnail_width * thumbnail_height) / 4; diff --git a/third_party/libyuv/build.txt b/third_party/libyuv/build.txt index 376e981ec7..50a319954e 100644 --- a/third_party/libyuv/build.txt +++ b/third_party/libyuv/build.txt @@ -1,4 +1,4 @@ git clone https://chromium.googlesource.com/libyuv/libyuv cd libyuv -git reset --hard 4a14cb2e81235ecd656e799aecaaf139db8ce4a2 cmake . +sudo make install diff --git a/third_party/libyuv/include/libyuv.h b/third_party/libyuv/include/libyuv.h index aeffd5ef7a..a06e1233ab 100644 --- a/third_party/libyuv/include/libyuv.h +++ b/third_party/libyuv/include/libyuv.h @@ -26,6 +26,7 @@ #include "libyuv/scale.h" #include "libyuv/scale_argb.h" #include "libyuv/scale_row.h" +#include "libyuv/scale_uv.h" #include "libyuv/version.h" #include "libyuv/video_common.h" diff --git a/third_party/libyuv/include/libyuv/basic_types.h b/third_party/libyuv/include/libyuv/basic_types.h index 5b760ee0d4..1bea67f2f2 100644 --- a/third_party/libyuv/include/libyuv/basic_types.h +++ b/third_party/libyuv/include/libyuv/basic_types.h @@ -11,79 +11,36 @@ #ifndef INCLUDE_LIBYUV_BASIC_TYPES_H_ #define INCLUDE_LIBYUV_BASIC_TYPES_H_ -#include // for NULL, size_t +#include // For size_t and NULL + +#if !defined(INT_TYPES_DEFINED) && !defined(GG_LONGLONG) +#define INT_TYPES_DEFINED #if defined(_MSC_VER) && (_MSC_VER < 1600) #include // for uintptr_t on x86 +typedef unsigned __int64 uint64_t; +typedef __int64 int64_t; +typedef unsigned int uint32_t; +typedef int int32_t; +typedef unsigned short uint16_t; +typedef short int16_t; +typedef unsigned char uint8_t; +typedef signed char int8_t; #else -#include // for uintptr_t -#endif - -#ifndef GG_LONGLONG -#ifndef INT_TYPES_DEFINED -#define INT_TYPES_DEFINED -#ifdef COMPILER_MSVC -typedef unsigned __int64 uint64; -typedef __int64 int64; -#ifndef INT64_C -#define INT64_C(x) x ## I64 -#endif -#ifndef UINT64_C -#define UINT64_C(x) x ## UI64 -#endif -#define INT64_F "I64" -#else // COMPILER_MSVC -#if defined(__LP64__) && !defined(__OpenBSD__) && !defined(__APPLE__) -typedef unsigned long uint64; // NOLINT -typedef long int64; // NOLINT -#ifndef INT64_C -#define INT64_C(x) x ## L -#endif -#ifndef UINT64_C -#define UINT64_C(x) x ## UL -#endif -#define INT64_F "l" -#else // defined(__LP64__) && !defined(__OpenBSD__) && !defined(__APPLE__) -typedef unsigned long long uint64; // NOLINT -typedef long long int64; // NOLINT -#ifndef INT64_C -#define INT64_C(x) x ## LL -#endif -#ifndef UINT64_C -#define UINT64_C(x) x ## ULL -#endif -#define INT64_F "ll" -#endif // __LP64__ -#endif // COMPILER_MSVC -typedef unsigned int uint32; -typedef int int32; -typedef unsigned short uint16; // NOLINT -typedef short int16; // NOLINT -typedef unsigned char uint8; -typedef signed char int8; +#include // for uintptr_t and C99 types +#endif // defined(_MSC_VER) && (_MSC_VER < 1600) +// Types are deprecated. Enable this macro for legacy types. +#ifdef LIBYUV_LEGACY_TYPES +typedef uint64_t uint64; +typedef int64_t int64; +typedef uint32_t uint32; +typedef int32_t int32; +typedef uint16_t uint16; +typedef int16_t int16; +typedef uint8_t uint8; +typedef int8_t int8; +#endif // LIBYUV_LEGACY_TYPES #endif // INT_TYPES_DEFINED -#endif // GG_LONGLONG - -// Detect compiler is for x86 or x64. -#if defined(__x86_64__) || defined(_M_X64) || \ - defined(__i386__) || defined(_M_IX86) -#define CPU_X86 1 -#endif -// Detect compiler is for ARM. -#if defined(__arm__) || defined(_M_ARM) -#define CPU_ARM 1 -#endif - -#ifndef ALIGNP -#ifdef __cplusplus -#define ALIGNP(p, t) \ - (reinterpret_cast(((reinterpret_cast(p) + \ - ((t) - 1)) & ~((t) - 1)))) -#else -#define ALIGNP(p, t) \ - ((uint8*)((((uintptr_t)(p) + ((t) - 1)) & ~((t) - 1)))) /* NOLINT */ -#endif -#endif #if !defined(LIBYUV_API) #if defined(_WIN32) || defined(__CYGWIN__) @@ -95,24 +52,17 @@ typedef signed char int8; #define LIBYUV_API #endif // LIBYUV_BUILDING_SHARED_LIBRARY #elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__APPLE__) && \ - (defined(LIBYUV_BUILDING_SHARED_LIBRARY) || \ - defined(LIBYUV_USING_SHARED_LIBRARY)) -#define LIBYUV_API __attribute__ ((visibility ("default"))) + (defined(LIBYUV_BUILDING_SHARED_LIBRARY) || \ + defined(LIBYUV_USING_SHARED_LIBRARY)) +#define LIBYUV_API __attribute__((visibility("default"))) #else #define LIBYUV_API #endif // __GNUC__ #endif // LIBYUV_API +// TODO(fbarchard): Remove bool macros. #define LIBYUV_BOOL int #define LIBYUV_FALSE 0 #define LIBYUV_TRUE 1 -// Visual C x86 or GCC little endian. -#if defined(__x86_64__) || defined(_M_X64) || \ - defined(__i386__) || defined(_M_IX86) || \ - defined(__arm__) || defined(_M_ARM) || \ - (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) -#define LIBYUV_LITTLE_ENDIAN -#endif - #endif // INCLUDE_LIBYUV_BASIC_TYPES_H_ diff --git a/third_party/libyuv/include/libyuv/compare.h b/third_party/libyuv/include/libyuv/compare.h index 550712de6e..3353ad71c6 100644 --- a/third_party/libyuv/include/libyuv/compare.h +++ b/third_party/libyuv/include/libyuv/compare.h @@ -20,55 +20,88 @@ extern "C" { // Compute a hash for specified memory. Seed of 5381 recommended. LIBYUV_API -uint32 HashDjb2(const uint8* src, uint64 count, uint32 seed); +uint32_t HashDjb2(const uint8_t* src, uint64_t count, uint32_t seed); + +// Hamming Distance +LIBYUV_API +uint64_t ComputeHammingDistance(const uint8_t* src_a, + const uint8_t* src_b, + int count); // Scan an opaque argb image and return fourcc based on alpha offset. // Returns FOURCC_ARGB, FOURCC_BGRA, or 0 if unknown. LIBYUV_API -uint32 ARGBDetect(const uint8* argb, int stride_argb, int width, int height); +uint32_t ARGBDetect(const uint8_t* argb, + int stride_argb, + int width, + int height); // Sum Square Error - used to compute Mean Square Error or PSNR. LIBYUV_API -uint64 ComputeSumSquareError(const uint8* src_a, - const uint8* src_b, int count); +uint64_t ComputeSumSquareError(const uint8_t* src_a, + const uint8_t* src_b, + int count); LIBYUV_API -uint64 ComputeSumSquareErrorPlane(const uint8* src_a, int stride_a, - const uint8* src_b, int stride_b, - int width, int height); +uint64_t ComputeSumSquareErrorPlane(const uint8_t* src_a, + int stride_a, + const uint8_t* src_b, + int stride_b, + int width, + int height); static const int kMaxPsnr = 128; LIBYUV_API -double SumSquareErrorToPsnr(uint64 sse, uint64 count); +double SumSquareErrorToPsnr(uint64_t sse, uint64_t count); LIBYUV_API -double CalcFramePsnr(const uint8* src_a, int stride_a, - const uint8* src_b, int stride_b, - int width, int height); +double CalcFramePsnr(const uint8_t* src_a, + int stride_a, + const uint8_t* src_b, + int stride_b, + int width, + int height); LIBYUV_API -double I420Psnr(const uint8* src_y_a, int stride_y_a, - const uint8* src_u_a, int stride_u_a, - const uint8* src_v_a, int stride_v_a, - const uint8* src_y_b, int stride_y_b, - const uint8* src_u_b, int stride_u_b, - const uint8* src_v_b, int stride_v_b, - int width, int height); +double I420Psnr(const uint8_t* src_y_a, + int stride_y_a, + const uint8_t* src_u_a, + int stride_u_a, + const uint8_t* src_v_a, + int stride_v_a, + const uint8_t* src_y_b, + int stride_y_b, + const uint8_t* src_u_b, + int stride_u_b, + const uint8_t* src_v_b, + int stride_v_b, + int width, + int height); LIBYUV_API -double CalcFrameSsim(const uint8* src_a, int stride_a, - const uint8* src_b, int stride_b, - int width, int height); +double CalcFrameSsim(const uint8_t* src_a, + int stride_a, + const uint8_t* src_b, + int stride_b, + int width, + int height); LIBYUV_API -double I420Ssim(const uint8* src_y_a, int stride_y_a, - const uint8* src_u_a, int stride_u_a, - const uint8* src_v_a, int stride_v_a, - const uint8* src_y_b, int stride_y_b, - const uint8* src_u_b, int stride_u_b, - const uint8* src_v_b, int stride_v_b, - int width, int height); +double I420Ssim(const uint8_t* src_y_a, + int stride_y_a, + const uint8_t* src_u_a, + int stride_u_a, + const uint8_t* src_v_a, + int stride_v_a, + const uint8_t* src_y_b, + int stride_y_b, + const uint8_t* src_u_b, + int stride_u_b, + const uint8_t* src_v_b, + int stride_v_b, + int width, + int height); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/compare_row.h b/third_party/libyuv/include/libyuv/compare_row.h index 781cad3e65..d8e82d721b 100644 --- a/third_party/libyuv/include/libyuv/compare_row.h +++ b/third_party/libyuv/include/libyuv/compare_row.h @@ -18,20 +18,23 @@ namespace libyuv { extern "C" { #endif -#if defined(__pnacl__) || defined(__CLR_VER) || \ - (defined(__i386__) && !defined(__SSE2__)) +#if defined(__pnacl__) || defined(__CLR_VER) || \ + (defined(__native_client__) && defined(__x86_64__)) || \ + (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) #define LIBYUV_DISABLE_X86 #endif +#if defined(__native_client__) +#define LIBYUV_DISABLE_NEON +#endif // MemorySanitizer does not support assembly code yet. http://crbug.com/344505 #if defined(__has_feature) #if __has_feature(memory_sanitizer) #define LIBYUV_DISABLE_X86 #endif #endif - // Visual C 2012 required for AVX2. -#if defined(_M_IX86) && !defined(__clang__) && \ - defined(_MSC_VER) && _MSC_VER >= 1700 +#if defined(_M_IX86) && !defined(__clang__) && defined(_MSC_VER) && \ + _MSC_VER >= 1700 #define VISUALC_HAS_AVX2 1 #endif // VisualStudio >= 2012 @@ -42,39 +45,82 @@ extern "C" { #endif // clang >= 3.4 #endif // __clang__ -#if !defined(LIBYUV_DISABLE_X86) && \ - defined(_M_IX86) && (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2)) -#define HAS_HASHDJB2_AVX2 -#endif - // The following are available for Visual C and GCC: #if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) || defined(_M_IX86))) + (defined(__x86_64__) || defined(__i386__) || defined(_M_IX86)) #define HAS_HASHDJB2_SSE41 #define HAS_SUMSQUAREERROR_SSE2 +#define HAS_HAMMINGDISTANCE_SSE42 #endif // The following are available for Visual C and clangcl 32 bit: -#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && \ +#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) && \ + !defined(__clang__) && \ (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2)) #define HAS_HASHDJB2_AVX2 #define HAS_SUMSQUAREERROR_AVX2 #endif +// The following are available for GCC and clangcl: +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) +#define HAS_HAMMINGDISTANCE_SSSE3 +#endif + +// The following are available for GCC and clangcl: +#if !defined(LIBYUV_DISABLE_X86) && defined(CLANG_HAS_AVX2) && \ + (defined(__x86_64__) || defined(__i386__)) +#define HAS_HAMMINGDISTANCE_AVX2 +#endif + // The following are available for Neon: #if !defined(LIBYUV_DISABLE_NEON) && \ (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__)) #define HAS_SUMSQUAREERROR_NEON +#define HAS_HAMMINGDISTANCE_NEON +#endif + +#if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) +#define HAS_HAMMINGDISTANCE_MSA +#define HAS_SUMSQUAREERROR_MSA #endif -uint32 SumSquareError_C(const uint8* src_a, const uint8* src_b, int count); -uint32 SumSquareError_SSE2(const uint8* src_a, const uint8* src_b, int count); -uint32 SumSquareError_AVX2(const uint8* src_a, const uint8* src_b, int count); -uint32 SumSquareError_NEON(const uint8* src_a, const uint8* src_b, int count); +uint32_t HammingDistance_C(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_SSE42(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_SSSE3(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_AVX2(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_NEON(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t HammingDistance_MSA(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_C(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_SSE2(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_AVX2(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_NEON(const uint8_t* src_a, + const uint8_t* src_b, + int count); +uint32_t SumSquareError_MSA(const uint8_t* src_a, + const uint8_t* src_b, + int count); -uint32 HashDjb2_C(const uint8* src, int count, uint32 seed); -uint32 HashDjb2_SSE41(const uint8* src, int count, uint32 seed); -uint32 HashDjb2_AVX2(const uint8* src, int count, uint32 seed); +uint32_t HashDjb2_C(const uint8_t* src, int count, uint32_t seed); +uint32_t HashDjb2_SSE41(const uint8_t* src, int count, uint32_t seed); +uint32_t HashDjb2_AVX2(const uint8_t* src, int count, uint32_t seed); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/convert.h b/third_party/libyuv/include/libyuv/convert.h index d44485847b..5c2954f4c3 100644 --- a/third_party/libyuv/include/libyuv/convert.h +++ b/third_party/libyuv/include/libyuv/convert.h @@ -16,8 +16,8 @@ #include "libyuv/rotate.h" // For enum RotationMode. // TODO(fbarchard): fix WebRTC source to include following libyuv headers: -#include "libyuv/convert_argb.h" // For WebRTC I420ToARGB. b/620 -#include "libyuv/convert_from.h" // For WebRTC ConvertFromI420. b/620 +#include "libyuv/convert_argb.h" // For WebRTC I420ToARGB. b/620 +#include "libyuv/convert_from.h" // For WebRTC ConvertFromI420. b/620 #include "libyuv/planar_functions.h" // For WebRTC I420Rect, CopyPlane. b/618 #ifdef __cplusplus @@ -27,196 +27,835 @@ extern "C" { // Convert I444 to I420. LIBYUV_API -int I444ToI420(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int I444ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I444 to NV12. +LIBYUV_API +int I444ToNV12(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert I444 to NV21. +LIBYUV_API +int I444ToNV21(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); // Convert I422 to I420. LIBYUV_API -int I422ToI420(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int I422ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I422 to I444. +LIBYUV_API +int I422ToI444(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I422 to I210. +LIBYUV_API +int I422ToI210(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert MM21 to NV12. +LIBYUV_API +int MM21ToNV12(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); -// Convert I411 to I420. +// Convert MM21 to I420. LIBYUV_API -int I411ToI420(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int MM21ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I422 to NV21. +LIBYUV_API +int I422ToNV21(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); // Copy I420 to I420. #define I420ToI420 I420Copy LIBYUV_API -int I420Copy(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int I420Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I420 to I444. +LIBYUV_API +int I420ToI444(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Copy I010 to I010 +#define I010ToI010 I010Copy +#define H010ToH010 I010Copy +LIBYUV_API +int I010Copy(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert 10 bit YUV to 8 bit +#define H010ToH420 I010ToI420 +LIBYUV_API +int I010ToI420(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define H210ToH422 I210ToI422 +LIBYUV_API +int I210ToI422(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define H410ToH444 I410ToI444 +LIBYUV_API +int I410ToI444(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define H012ToH420 I012ToI420 +LIBYUV_API +int I012ToI420(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define H212ToH422 I212ToI422 +LIBYUV_API +int I212ToI422(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define H412ToH444 I412ToI444 +LIBYUV_API +int I412ToI444(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define I412ToI012 I410ToI010 +#define H410ToH010 I410ToI010 +#define H412ToH012 I410ToI010 +LIBYUV_API +int I410ToI010(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define I212ToI012 I210ToI010 +#define H210ToH010 I210ToI010 +#define H212ToH012 I210ToI010 +LIBYUV_API +int I210ToI010(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I010 to I410 +LIBYUV_API +int I010ToI410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I012 to I412 +#define I012ToI412 I010ToI410 + +// Convert I210 to I410 +LIBYUV_API +int I210ToI410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I212 to I412 +#define I212ToI412 I210ToI410 + +// Convert I010 to P010 +LIBYUV_API +int I010ToP010(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert I210 to P210 +LIBYUV_API +int I210ToP210(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert I012 to P012 +LIBYUV_API +int I012ToP012(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert I212 to P212 +LIBYUV_API +int I212ToP212(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); // Convert I400 (grey) to I420. LIBYUV_API -int I400ToI420(const uint8* src_y, int src_stride_y, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int I400ToI420(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I400 (grey) to NV21. +LIBYUV_API +int I400ToNV21(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); #define J400ToJ420 I400ToI420 // Convert NV12 to I420. LIBYUV_API -int NV12ToI420(const uint8* src_y, int src_stride_y, - const uint8* src_uv, int src_stride_uv, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int NV12ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Convert NV21 to I420. LIBYUV_API -int NV21ToI420(const uint8* src_y, int src_stride_y, - const uint8* src_vu, int src_stride_vu, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int NV21ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert NV12 to NV24. +LIBYUV_API +int NV12ToNV24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert NV16 to NV24. +LIBYUV_API +int NV16ToNV24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert P010 to P410. +LIBYUV_API +int P010ToP410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert P012 to P412. +#define P012ToP412 P010ToP410 + +// Convert P016 to P416. +#define P016ToP416 P010ToP410 + +// Convert P210 to P410. +LIBYUV_API +int P210ToP410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert P212 to P412. +#define P212ToP412 P210ToP410 + +// Convert P216 to P416. +#define P216ToP416 P210ToP410 // Convert YUY2 to I420. LIBYUV_API -int YUY2ToI420(const uint8* src_yuy2, int src_stride_yuy2, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int YUY2ToI420(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Convert UYVY to I420. LIBYUV_API -int UYVYToI420(const uint8* src_uyvy, int src_stride_uyvy, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int UYVYToI420(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert AYUV to NV12. +LIBYUV_API +int AYUVToNV12(const uint8_t* src_ayuv, + int src_stride_ayuv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); -// Convert M420 to I420. +// Convert AYUV to NV21. LIBYUV_API -int M420ToI420(const uint8* src_m420, int src_stride_m420, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int AYUVToNV21(const uint8_t* src_ayuv, + int src_stride_ayuv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); // Convert Android420 to I420. LIBYUV_API -int Android420ToI420(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - int pixel_stride_uv, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int Android420ToI420(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_pixel_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // ARGB little endian (bgra in memory) to I420. LIBYUV_API -int ARGBToI420(const uint8* src_frame, int src_stride_frame, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int ARGBToI420(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // BGRA little endian (argb in memory) to I420. LIBYUV_API -int BGRAToI420(const uint8* src_frame, int src_stride_frame, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int BGRAToI420(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // ABGR little endian (rgba in memory) to I420. LIBYUV_API -int ABGRToI420(const uint8* src_frame, int src_stride_frame, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int ABGRToI420(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // RGBA little endian (abgr in memory) to I420. LIBYUV_API -int RGBAToI420(const uint8* src_frame, int src_stride_frame, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int RGBAToI420(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // RGB little endian (bgr in memory) to I420. LIBYUV_API -int RGB24ToI420(const uint8* src_frame, int src_stride_frame, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int RGB24ToI420(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGB little endian (bgr in memory) to J420. +LIBYUV_API +int RGB24ToJ420(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // RGB big endian (rgb in memory) to I420. LIBYUV_API -int RAWToI420(const uint8* src_frame, int src_stride_frame, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int RAWToI420(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGB big endian (rgb in memory) to J420. +LIBYUV_API +int RAWToJ420(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // RGB16 (RGBP fourcc) little endian to I420. LIBYUV_API -int RGB565ToI420(const uint8* src_frame, int src_stride_frame, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int RGB565ToI420(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // RGB15 (RGBO fourcc) little endian to I420. LIBYUV_API -int ARGB1555ToI420(const uint8* src_frame, int src_stride_frame, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int ARGB1555ToI420(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // RGB12 (R444 fourcc) little endian to I420. LIBYUV_API -int ARGB4444ToI420(const uint8* src_frame, int src_stride_frame, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int ARGB4444ToI420(const uint8_t* src_argb4444, + int src_stride_argb4444, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// RGB little endian (bgr in memory) to J400. +LIBYUV_API +int RGB24ToJ400(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_yj, + int dst_stride_yj, + int width, + int height); + +// RGB big endian (rgb in memory) to J400. +LIBYUV_API +int RAWToJ400(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_yj, + int dst_stride_yj, + int width, + int height); -#ifdef HAVE_JPEG // src_width/height provided by capture. // dst_width/height for clipping determine final size. LIBYUV_API -int MJPGToI420(const uint8* sample, size_t sample_size, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int src_width, int src_height, - int dst_width, int dst_height); +int MJPGToI420(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int src_width, + int src_height, + int dst_width, + int dst_height); + +// JPEG to NV21 +LIBYUV_API +int MJPGToNV21(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int src_width, + int src_height, + int dst_width, + int dst_height); + +// JPEG to NV12 +LIBYUV_API +int MJPGToNV12(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int src_width, + int src_height, + int dst_width, + int dst_height); // Query size of MJPG in pixels. LIBYUV_API -int MJPGSize(const uint8* sample, size_t sample_size, - int* width, int* height); -#endif +int MJPGSize(const uint8_t* sample, + size_t sample_size, + int* width, + int* height); // Convert camera sample to I420 with cropping, rotation and vertical flip. // "src_size" is needed to parse MJPG. @@ -238,18 +877,25 @@ int MJPGSize(const uint8* sample, size_t sample_size, // Must be less than or equal to src_width/src_height // Cropping parameters are pre-rotation. // "rotation" can be 0, 90, 180 or 270. -// "format" is a fourcc. ie 'I420', 'YUY2' +// "fourcc" is a fourcc. ie 'I420', 'YUY2' // Returns 0 for successful; -1 for invalid parameter. Non-zero for failure. LIBYUV_API -int ConvertToI420(const uint8* src_frame, size_t src_size, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int crop_x, int crop_y, - int src_width, int src_height, - int crop_width, int crop_height, +int ConvertToI420(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int crop_x, + int crop_y, + int src_width, + int src_height, + int crop_width, + int crop_height, enum RotationMode rotation, - uint32 format); + uint32_t fourcc); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/convert_argb.h b/third_party/libyuv/include/libyuv/convert_argb.h index dc03ac8d5d..f66d20ce19 100644 --- a/third_party/libyuv/include/libyuv/convert_argb.h +++ b/third_party/libyuv/include/libyuv/convert_argb.h @@ -14,274 +14,2139 @@ #include "libyuv/basic_types.h" #include "libyuv/rotate.h" // For enum RotationMode. - -// TODO(fbarchard): This set of functions should exactly match convert.h -// TODO(fbarchard): Add tests. Create random content of right size and convert -// with C vs Opt and or to I420 and compare. -// TODO(fbarchard): Some of these functions lack parameter setting. +#include "libyuv/scale.h" // For enum FilterMode. #ifdef __cplusplus namespace libyuv { extern "C" { #endif +// Conversion matrix for YUV to RGB +LIBYUV_API extern const struct YuvConstants kYuvI601Constants; // BT.601 +LIBYUV_API extern const struct YuvConstants kYuvJPEGConstants; // BT.601 full +LIBYUV_API extern const struct YuvConstants kYuvH709Constants; // BT.709 +LIBYUV_API extern const struct YuvConstants kYuvF709Constants; // BT.709 full +LIBYUV_API extern const struct YuvConstants kYuv2020Constants; // BT.2020 +LIBYUV_API extern const struct YuvConstants kYuvV2020Constants; // BT.2020 full + +// Conversion matrix for YVU to BGR +LIBYUV_API extern const struct YuvConstants kYvuI601Constants; // BT.601 +LIBYUV_API extern const struct YuvConstants kYvuJPEGConstants; // BT.601 full +LIBYUV_API extern const struct YuvConstants kYvuH709Constants; // BT.709 +LIBYUV_API extern const struct YuvConstants kYvuF709Constants; // BT.709 full +LIBYUV_API extern const struct YuvConstants kYvu2020Constants; // BT.2020 +LIBYUV_API extern const struct YuvConstants kYvuV2020Constants; // BT.2020 full + +// Macros for end swapped destination Matrix conversions. +// Swap UV and pass mirrored kYvuJPEGConstants matrix. +// TODO(fbarchard): Add macro for each Matrix function. +#define kYuvI601ConstantsVU kYvuI601Constants +#define kYuvJPEGConstantsVU kYvuJPEGConstants +#define kYuvH709ConstantsVU kYvuH709Constants +#define kYuvF709ConstantsVU kYvuF709Constants +#define kYuv2020ConstantsVU kYvu2020Constants +#define kYuvV2020ConstantsVU kYvuV2020Constants + +#define NV12ToABGRMatrix(a, b, c, d, e, f, g, h, i) \ + NV21ToARGBMatrix(a, b, c, d, e, f, g##VU, h, i) +#define NV21ToABGRMatrix(a, b, c, d, e, f, g, h, i) \ + NV12ToARGBMatrix(a, b, c, d, e, f, g##VU, h, i) +#define NV12ToRAWMatrix(a, b, c, d, e, f, g, h, i) \ + NV21ToRGB24Matrix(a, b, c, d, e, f, g##VU, h, i) +#define NV21ToRAWMatrix(a, b, c, d, e, f, g, h, i) \ + NV12ToRGB24Matrix(a, b, c, d, e, f, g##VU, h, i) +#define I010ToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k) \ + I010ToARGBMatrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I210ToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k) \ + I210ToARGBMatrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I410ToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k) \ + I410ToARGBMatrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I010ToAB30Matrix(a, b, c, d, e, f, g, h, i, j, k) \ + I010ToAR30Matrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I210ToAB30Matrix(a, b, c, d, e, f, g, h, i, j, k) \ + I210ToAR30Matrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I410ToAB30Matrix(a, b, c, d, e, f, g, h, i, j, k) \ + I410ToAR30Matrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I420AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) +#define I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I422AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) +#define I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I444AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) +#define I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I010AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) +#define I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I210AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) +#define I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I410AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) + // Alias. #define ARGBToARGB ARGBCopy // Copy ARGB to ARGB. LIBYUV_API -int ARGBCopy(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBCopy(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Convert I420 to ARGB. LIBYUV_API -int I420ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int I420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I420 to ABGR. +LIBYUV_API +int I420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert J420 to ARGB. +LIBYUV_API +int J420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); -// Duplicate prototype for function in convert_from.h for remoting. +// Convert J420 to ABGR. +LIBYUV_API +int J420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert H420 to ARGB. LIBYUV_API -int I420ToABGR(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int H420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert H420 to ABGR. +LIBYUV_API +int H420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert U420 to ARGB. +LIBYUV_API +int U420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert U420 to ABGR. +LIBYUV_API +int U420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); // Convert I422 to ARGB. LIBYUV_API -int I422ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int I422ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I422 to ABGR. +LIBYUV_API +int I422ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert J422 to ARGB. +LIBYUV_API +int J422ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert J422 to ABGR. +LIBYUV_API +int J422ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert H422 to ARGB. +LIBYUV_API +int H422ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert H422 to ABGR. +LIBYUV_API +int H422ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert U422 to ARGB. +LIBYUV_API +int U422ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert U422 to ABGR. +LIBYUV_API +int U422ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); // Convert I444 to ARGB. LIBYUV_API -int I444ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int I444ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I444 to ABGR. +LIBYUV_API +int I444ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); // Convert J444 to ARGB. LIBYUV_API -int J444ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int J444ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); -// Convert I444 to ABGR. +// Convert J444 to ABGR. +LIBYUV_API +int J444ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert H444 to ARGB. +LIBYUV_API +int H444ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert H444 to ABGR. +LIBYUV_API +int H444ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert U444 to ARGB. +LIBYUV_API +int U444ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert U444 to ABGR. +LIBYUV_API +int U444ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert I010 to ARGB. +LIBYUV_API +int I010ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I010 to ABGR. +LIBYUV_API +int I010ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert H010 to ARGB. +LIBYUV_API +int H010ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert H010 to ABGR. +LIBYUV_API +int H010ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert U010 to ARGB. +LIBYUV_API +int U010ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert U010 to ABGR. +LIBYUV_API +int U010ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert I210 to ARGB. +LIBYUV_API +int I210ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I210 to ABGR. +LIBYUV_API +int I210ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert H210 to ARGB. +LIBYUV_API +int H210ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert H210 to ABGR. +LIBYUV_API +int H210ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert U210 to ARGB. LIBYUV_API -int I444ToABGR(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_abgr, int dst_stride_abgr, - int width, int height); +int U210ToARGB(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); -// Convert I411 to ARGB. +// Convert U210 to ABGR. LIBYUV_API -int I411ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int U210ToABGR(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); // Convert I420 with Alpha to preattenuated ARGB. LIBYUV_API -int I420AlphaToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - const uint8* src_a, int src_stride_a, - uint8* dst_argb, int dst_stride_argb, - int width, int height, int attenuate); +int I420AlphaToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int attenuate); // Convert I420 with Alpha to preattenuated ABGR. LIBYUV_API -int I420AlphaToABGR(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - const uint8* src_a, int src_stride_a, - uint8* dst_abgr, int dst_stride_abgr, - int width, int height, int attenuate); +int I420AlphaToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height, + int attenuate); + +// Convert I422 with Alpha to preattenuated ARGB. +LIBYUV_API +int I422AlphaToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int attenuate); + +// Convert I422 with Alpha to preattenuated ABGR. +LIBYUV_API +int I422AlphaToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height, + int attenuate); + +// Convert I444 with Alpha to preattenuated ARGB. +LIBYUV_API +int I444AlphaToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int attenuate); + +// Convert I444 with Alpha to preattenuated ABGR. +LIBYUV_API +int I444AlphaToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height, + int attenuate); // Convert I400 (grey) to ARGB. Reverse of ARGBToI400. LIBYUV_API -int I400ToARGB(const uint8* src_y, int src_stride_y, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int I400ToARGB(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Convert J400 (jpeg grey) to ARGB. LIBYUV_API -int J400ToARGB(const uint8* src_y, int src_stride_y, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int J400ToARGB(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Alias. #define YToARGB I400ToARGB // Convert NV12 to ARGB. LIBYUV_API -int NV12ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_uv, int src_stride_uv, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int NV12ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Convert NV21 to ARGB. LIBYUV_API -int NV21ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_vu, int src_stride_vu, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int NV21ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); -// Convert M420 to ARGB. +// Convert NV12 to ABGR. LIBYUV_API -int M420ToARGB(const uint8* src_m420, int src_stride_m420, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int NV12ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert NV21 to ABGR. +LIBYUV_API +int NV21ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert NV12 to RGB24. +LIBYUV_API +int NV12ToRGB24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +// Convert NV21 to RGB24. +LIBYUV_API +int NV21ToRGB24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +// Convert NV21 to YUV24. +LIBYUV_API +int NV21ToYUV24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_yuv24, + int dst_stride_yuv24, + int width, + int height); + +// Convert NV12 to RAW. +LIBYUV_API +int NV12ToRAW(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); + +// Convert NV21 to RAW. +LIBYUV_API +int NV21ToRAW(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); // Convert YUY2 to ARGB. LIBYUV_API -int YUY2ToARGB(const uint8* src_yuy2, int src_stride_yuy2, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int YUY2ToARGB(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Convert UYVY to ARGB. LIBYUV_API -int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int UYVYToARGB(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); -// Convert J420 to ARGB. +// Convert I010 to AR30. LIBYUV_API -int J420ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int I010ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); -// Convert J422 to ARGB. +// Convert H010 to AR30. LIBYUV_API -int J422ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int H010ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); -// Convert J420 to ABGR. +// Convert I010 to AB30. LIBYUV_API -int J420ToABGR(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_abgr, int dst_stride_abgr, - int width, int height); +int I010ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); -// Convert J422 to ABGR. +// Convert H010 to AB30. LIBYUV_API -int J422ToABGR(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_abgr, int dst_stride_abgr, - int width, int height); +int H010ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); -// Convert H420 to ARGB. +// Convert U010 to AR30. LIBYUV_API -int H420ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int U010ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); -// Convert H422 to ARGB. +// Convert U010 to AB30. LIBYUV_API -int H422ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int U010ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); -// Convert H420 to ABGR. +// Convert I210 to AR30. LIBYUV_API -int H420ToABGR(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_abgr, int dst_stride_abgr, - int width, int height); +int I210ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); -// Convert H422 to ABGR. +// Convert I210 to AB30. +LIBYUV_API +int I210ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// Convert H210 to AR30. +LIBYUV_API +int H210ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert H210 to AB30. LIBYUV_API -int H422ToABGR(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_abgr, int dst_stride_abgr, - int width, int height); +int H210ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// Convert U210 to AR30. +LIBYUV_API +int U210ToAR30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert U210 to AB30. +LIBYUV_API +int U210ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); // BGRA little endian (argb in memory) to ARGB. LIBYUV_API -int BGRAToARGB(const uint8* src_frame, int src_stride_frame, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int BGRAToARGB(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // ABGR little endian (rgba in memory) to ARGB. LIBYUV_API -int ABGRToARGB(const uint8* src_frame, int src_stride_frame, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ABGRToARGB(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // RGBA little endian (abgr in memory) to ARGB. LIBYUV_API -int RGBAToARGB(const uint8* src_frame, int src_stride_frame, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int RGBAToARGB(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Deprecated function name. #define BG24ToARGB RGB24ToARGB // RGB little endian (bgr in memory) to ARGB. LIBYUV_API -int RGB24ToARGB(const uint8* src_frame, int src_stride_frame, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int RGB24ToARGB(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // RGB big endian (rgb in memory) to ARGB. LIBYUV_API -int RAWToARGB(const uint8* src_frame, int src_stride_frame, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int RAWToARGB(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// RGB big endian (rgb in memory) to RGBA. +LIBYUV_API +int RAWToRGBA(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_rgba, + int dst_stride_rgba, + int width, + int height); // RGB16 (RGBP fourcc) little endian to ARGB. LIBYUV_API -int RGB565ToARGB(const uint8* src_frame, int src_stride_frame, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int RGB565ToARGB(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // RGB15 (RGBO fourcc) little endian to ARGB. LIBYUV_API -int ARGB1555ToARGB(const uint8* src_frame, int src_stride_frame, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGB1555ToARGB(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // RGB12 (R444 fourcc) little endian to ARGB. LIBYUV_API -int ARGB4444ToARGB(const uint8* src_frame, int src_stride_frame, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGB4444ToARGB(const uint8_t* src_argb4444, + int src_stride_argb4444, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Aliases +#define AB30ToARGB AR30ToABGR +#define AB30ToABGR AR30ToARGB +#define AB30ToAR30 AR30ToAB30 + +// Convert AR30 To ARGB. +LIBYUV_API +int AR30ToARGB(const uint8_t* src_ar30, + int src_stride_ar30, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert AR30 To ABGR. +LIBYUV_API +int AR30ToABGR(const uint8_t* src_ar30, + int src_stride_ar30, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert AR30 To AB30. +LIBYUV_API +int AR30ToAB30(const uint8_t* src_ar30, + int src_stride_ar30, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// Convert AR64 to ARGB. +LIBYUV_API +int AR64ToARGB(const uint16_t* src_ar64, + int src_stride_ar64, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert AB64 to ABGR. +#define AB64ToABGR AR64ToARGB + +// Convert AB64 to ARGB. +LIBYUV_API +int AB64ToARGB(const uint16_t* src_ab64, + int src_stride_ab64, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert AR64 to ABGR. +#define AR64ToABGR AB64ToARGB + +// Convert AR64 To AB64. +LIBYUV_API +int AR64ToAB64(const uint16_t* src_ar64, + int src_stride_ar64, + uint16_t* dst_ab64, + int dst_stride_ab64, + int width, + int height); + +// Convert AB64 To AR64. +#define AB64ToAR64 AR64ToAB64 -#ifdef HAVE_JPEG // src_width/height provided by capture // dst_width/height for clipping determine final size. LIBYUV_API -int MJPGToARGB(const uint8* sample, size_t sample_size, - uint8* dst_argb, int dst_stride_argb, - int src_width, int src_height, - int dst_width, int dst_height); -#endif +int MJPGToARGB(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_argb, + int dst_stride_argb, + int src_width, + int src_height, + int dst_width, + int dst_height); + +// Convert Android420 to ARGB. +LIBYUV_API +int Android420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_pixel_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert Android420 to ABGR. +LIBYUV_API +int Android420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_pixel_stride_uv, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert NV12 to RGB565. +LIBYUV_API +int NV12ToRGB565(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +// Convert I422 to BGRA. +LIBYUV_API +int I422ToBGRA(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_bgra, + int dst_stride_bgra, + int width, + int height); + +// Convert I422 to ABGR. +LIBYUV_API +int I422ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +// Convert I422 to RGBA. +LIBYUV_API +int I422ToRGBA(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgba, + int dst_stride_rgba, + int width, + int height); + +LIBYUV_API +int I420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +LIBYUV_API +int I420ToBGRA(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_bgra, + int dst_stride_bgra, + int width, + int height); + +LIBYUV_API +int I420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); + +LIBYUV_API +int I420ToRGBA(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgba, + int dst_stride_rgba, + int width, + int height); + +LIBYUV_API +int I420ToRGB24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +LIBYUV_API +int I420ToRAW(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); + +LIBYUV_API +int H420ToRGB24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +LIBYUV_API +int H420ToRAW(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); + +LIBYUV_API +int J420ToRGB24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +LIBYUV_API +int J420ToRAW(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); + +LIBYUV_API +int I420ToRGB565(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +LIBYUV_API +int J420ToRGB565(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +LIBYUV_API +int H420ToRGB565(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +LIBYUV_API +int I422ToRGB565(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); + +// Convert I420 To RGB565 with 4x4 dither matrix (16 bytes). +// Values in dither matrix from 0 to 7 recommended. +// The order of the dither matrix is first byte is upper left. + +LIBYUV_API +int I420ToRGB565Dither(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + const uint8_t* dither4x4, + int width, + int height); + +LIBYUV_API +int I420ToARGB1555(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb1555, + int dst_stride_argb1555, + int width, + int height); + +LIBYUV_API +int I420ToARGB4444(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb4444, + int dst_stride_argb4444, + int width, + int height); + +// Convert I420 to AR30. +LIBYUV_API +int I420ToAR30(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert I420 to AB30. +LIBYUV_API +int I420ToAB30(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// Convert H420 to AR30. +LIBYUV_API +int H420ToAR30(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert H420 to AB30. +LIBYUV_API +int H420ToAB30(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + +// Convert I420 to ARGB with matrix. +LIBYUV_API +int I420ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I422 to ARGB with matrix. +LIBYUV_API +int I422ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I444 to ARGB with matrix. +LIBYUV_API +int I444ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert 10 bit 420 YUV to ARGB with matrix. +LIBYUV_API +int I010ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert 10 bit 420 YUV to ARGB with matrix. +LIBYUV_API +int I210ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert 10 bit 444 YUV to ARGB with matrix. +LIBYUV_API +int I410ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert 10 bit YUV to ARGB with matrix. +LIBYUV_API +int I010ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// multiply 12 bit yuv into high bits to allow any number of bits. +LIBYUV_API +int I012ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert 12 bit YUV to ARGB with matrix. +LIBYUV_API +int I012ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert 10 bit 422 YUV to ARGB with matrix. +LIBYUV_API +int I210ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert 10 bit 444 YUV to ARGB with matrix. +LIBYUV_API +int I410ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert P010 to ARGB with matrix. +LIBYUV_API +int P010ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert P210 to ARGB with matrix. +LIBYUV_API +int P210ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert P010 to AR30 with matrix. +LIBYUV_API +int P010ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert P210 to AR30 with matrix. +LIBYUV_API +int P210ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// P012 and P010 use most significant bits so the conversion is the same. +// Convert P012 to ARGB with matrix. +#define P012ToARGBMatrix P010ToARGBMatrix +// Convert P012 to AR30 with matrix. +#define P012ToAR30Matrix P010ToAR30Matrix +// Convert P212 to ARGB with matrix. +#define P212ToARGBMatrix P210ToARGBMatrix +// Convert P212 to AR30 with matrix. +#define P212ToAR30Matrix P210ToAR30Matrix + +// Convert P016 to ARGB with matrix. +#define P016ToARGBMatrix P010ToARGBMatrix +// Convert P016 to AR30 with matrix. +#define P016ToAR30Matrix P010ToAR30Matrix +// Convert P216 to ARGB with matrix. +#define P216ToARGBMatrix P210ToARGBMatrix +// Convert P216 to AR30 with matrix. +#define P216ToAR30Matrix P210ToAR30Matrix + +// Convert I420 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I420AlphaToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert I422 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I422AlphaToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert I444 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I444AlphaToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert I010 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I010AlphaToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert I210 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I210AlphaToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert I410 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I410AlphaToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert NV12 to ARGB with matrix. +LIBYUV_API +int NV12ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert NV21 to ARGB with matrix. +LIBYUV_API +int NV21ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert NV12 to RGB565 with matrix. +LIBYUV_API +int NV12ToRGB565Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert NV12 to RGB24 with matrix. +LIBYUV_API +int NV12ToRGB24Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert NV21 to RGB24 with matrix. +LIBYUV_API +int NV21ToRGB24Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert Android420 to ARGB with matrix. +LIBYUV_API +int Android420ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_pixel_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I422 to RGBA with matrix. +LIBYUV_API +int I422ToRGBAMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgba, + int dst_stride_rgba, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I420 to RGBA with matrix. +LIBYUV_API +int I420ToRGBAMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgba, + int dst_stride_rgba, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I420 to RGB24 with matrix. +LIBYUV_API +int I420ToRGB24Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I420 to RGB565 with specified color matrix. +LIBYUV_API +int I420ToRGB565Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I420 to AR30 with matrix. +LIBYUV_API +int I420ToAR30Matrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I400 (grey) to ARGB. Reverse of ARGBToI400. +LIBYUV_API +int I400ToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert I420 to ARGB with matrix and UV filter mode. +LIBYUV_API +int I420ToARGBMatrixFilter(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + enum FilterMode filter); + +// Convert I422 to ARGB with matrix and UV filter mode. +LIBYUV_API +int I422ToARGBMatrixFilter(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + enum FilterMode filter); + +// Convert I010 to AR30 with matrix and UV filter mode. +LIBYUV_API +int I010ToAR30MatrixFilter(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height, + enum FilterMode filter); + +// Convert I210 to AR30 with matrix and UV filter mode. +LIBYUV_API +int I210ToAR30MatrixFilter(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height, + enum FilterMode filter); + +// Convert I010 to ARGB with matrix and UV filter mode. +LIBYUV_API +int I010ToARGBMatrixFilter(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + enum FilterMode filter); + +// Convert I210 to ARGB with matrix and UV filter mode. +LIBYUV_API +int I210ToARGBMatrixFilter(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + enum FilterMode filter); + +// Convert I420 with Alpha to attenuated ARGB with matrix and UV filter mode. +LIBYUV_API +int I420AlphaToARGBMatrixFilter(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate, + enum FilterMode filter); + +// Convert I422 with Alpha to attenuated ARGB with matrix and UV filter mode. +LIBYUV_API +int I422AlphaToARGBMatrixFilter(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate, + enum FilterMode filter); + +// Convert I010 with Alpha to attenuated ARGB with matrix and UV filter mode. +LIBYUV_API +int I010AlphaToARGBMatrixFilter(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate, + enum FilterMode filter); + +// Convert I210 with Alpha to attenuated ARGB with matrix and UV filter mode. +LIBYUV_API +int I210AlphaToARGBMatrixFilter(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate, + enum FilterMode filter); + +// Convert P010 to ARGB with matrix and UV filter mode. +LIBYUV_API +int P010ToARGBMatrixFilter(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + enum FilterMode filter); + +// Convert P210 to ARGB with matrix and UV filter mode. +LIBYUV_API +int P210ToARGBMatrixFilter(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + enum FilterMode filter); + +// Convert P010 to AR30 with matrix and UV filter mode. +LIBYUV_API +int P010ToAR30MatrixFilter(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height, + enum FilterMode filter); + +// Convert P210 to AR30 with matrix and UV filter mode. +LIBYUV_API +int P210ToAR30MatrixFilter(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height, + enum FilterMode filter); // Convert camera sample to ARGB with cropping, rotation and vertical flip. -// "src_size" is needed to parse MJPG. +// "sample_size" is needed to parse MJPG. // "dst_stride_argb" number of bytes in a row of the dst_argb plane. // Normally this would be the same as dst_width, with recommended alignment // to 16 bytes for better efficiency. @@ -300,16 +2165,21 @@ int MJPGToARGB(const uint8* sample, size_t sample_size, // Must be less than or equal to src_width/src_height // Cropping parameters are pre-rotation. // "rotation" can be 0, 90, 180 or 270. -// "format" is a fourcc. ie 'I420', 'YUY2' +// "fourcc" is a fourcc. ie 'I420', 'YUY2' // Returns 0 for successful; -1 for invalid parameter. Non-zero for failure. LIBYUV_API -int ConvertToARGB(const uint8* src_frame, size_t src_size, - uint8* dst_argb, int dst_stride_argb, - int crop_x, int crop_y, - int src_width, int src_height, - int crop_width, int crop_height, +int ConvertToARGB(const uint8_t* sample, + size_t sample_size, + uint8_t* dst_argb, + int dst_stride_argb, + int crop_x, + int crop_y, + int src_width, + int src_height, + int crop_width, + int crop_height, enum RotationMode rotation, - uint32 format); + uint32_t fourcc); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/convert_from.h b/third_party/libyuv/include/libyuv/convert_from.h index 59c40474f1..32f42a6330 100644 --- a/third_party/libyuv/include/libyuv/convert_from.h +++ b/third_party/libyuv/include/libyuv/convert_from.h @@ -21,155 +21,179 @@ extern "C" { // See Also convert.h for conversions from formats to I420. -// I420Copy in convert to I420ToI420. - -LIBYUV_API -int I420ToI422(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); - -LIBYUV_API -int I420ToI444(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); - -LIBYUV_API -int I420ToI411(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +// Convert 8 bit YUV to 10 bit. +#define H420ToH010 I420ToI010 +LIBYUV_API +int I420ToI010(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert 8 bit YUV to 12 bit. +#define H420ToH012 I420ToI012 +LIBYUV_API +int I420ToI012(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +LIBYUV_API +int I420ToI422(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +LIBYUV_API +int I420ToI444(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Copy to I400. Source can be I420, I422, I444, I400, NV12 or NV21. LIBYUV_API -int I400Copy(const uint8* src_y, int src_stride_y, - uint8* dst_y, int dst_stride_y, - int width, int height); - -LIBYUV_API -int I420ToNV12(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_uv, int dst_stride_uv, - int width, int height); - -LIBYUV_API -int I420ToNV21(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_vu, int dst_stride_vu, - int width, int height); - -LIBYUV_API -int I420ToYUY2(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - int width, int height); - -LIBYUV_API -int I420ToUYVY(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - int width, int height); - -LIBYUV_API -int I420ToARGB(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); - -LIBYUV_API -int I420ToBGRA(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); - -LIBYUV_API -int I420ToABGR(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_argb, int dst_stride_argb, - int width, int height); - -LIBYUV_API -int I420ToRGBA(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_rgba, int dst_stride_rgba, - int width, int height); - -LIBYUV_API -int I420ToRGB24(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - int width, int height); - -LIBYUV_API -int I420ToRAW(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - int width, int height); - -LIBYUV_API -int I420ToRGB565(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - int width, int height); - -// Convert I420 To RGB565 with 4x4 dither matrix (16 bytes). -// Values in dither matrix from 0 to 7 recommended. -// The order of the dither matrix is first byte is upper left. - -LIBYUV_API -int I420ToRGB565Dither(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - const uint8* dither4x4, int width, int height); - -LIBYUV_API -int I420ToARGB1555(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - int width, int height); - -LIBYUV_API -int I420ToARGB4444(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - int width, int height); +int I400Copy(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +LIBYUV_API +int I420ToNV12(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +LIBYUV_API +int I420ToNV21(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); + +LIBYUV_API +int I420ToYUY2(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_yuy2, + int dst_stride_yuy2, + int width, + int height); + +LIBYUV_API +int I420ToUYVY(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uyvy, + int dst_stride_uyvy, + int width, + int height); + +// The following are from convert_argb.h +// DEPRECATED: The prototypes will be removed in future. Use convert_argb.h + +// Convert I420 to ARGB. +LIBYUV_API +int I420ToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert I420 to ABGR. +LIBYUV_API +int I420ToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); // Convert I420 to specified format. // "dst_sample_stride" is bytes in a row for the destination. Pass 0 if the // buffer has contiguous rows. Can be negative. A multiple of 16 is optimal. LIBYUV_API -int ConvertFromI420(const uint8* y, int y_stride, - const uint8* u, int u_stride, - const uint8* v, int v_stride, - uint8* dst_sample, int dst_sample_stride, - int width, int height, - uint32 format); +int ConvertFromI420(const uint8_t* y, + int y_stride, + const uint8_t* u, + int u_stride, + const uint8_t* v, + int v_stride, + uint8_t* dst_sample, + int dst_sample_stride, + int width, + int height, + uint32_t fourcc); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/convert_from_argb.h b/third_party/libyuv/include/libyuv/convert_from_argb.h index 8d7f02f8c4..2a488838a9 100644 --- a/third_party/libyuv/include/libyuv/convert_from_argb.h +++ b/third_party/libyuv/include/libyuv/convert_from_argb.h @@ -21,166 +21,322 @@ extern "C" { // Copy ARGB to ARGB. #define ARGBToARGB ARGBCopy LIBYUV_API -int ARGBCopy(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBCopy(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Convert ARGB To BGRA. LIBYUV_API -int ARGBToBGRA(const uint8* src_argb, int src_stride_argb, - uint8* dst_bgra, int dst_stride_bgra, - int width, int height); +int ARGBToBGRA(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_bgra, + int dst_stride_bgra, + int width, + int height); // Convert ARGB To ABGR. LIBYUV_API -int ARGBToABGR(const uint8* src_argb, int src_stride_argb, - uint8* dst_abgr, int dst_stride_abgr, - int width, int height); +int ARGBToABGR(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height); // Convert ARGB To RGBA. LIBYUV_API -int ARGBToRGBA(const uint8* src_argb, int src_stride_argb, - uint8* dst_rgba, int dst_stride_rgba, - int width, int height); +int ARGBToRGBA(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_rgba, + int dst_stride_rgba, + int width, + int height); + +// Aliases +#define ARGBToAB30 ABGRToAR30 +#define ABGRToAB30 ARGBToAR30 + +// Convert ABGR To AR30. +LIBYUV_API +int ABGRToAR30(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Convert ARGB To AR30. +LIBYUV_API +int ARGBToAR30(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height); + +// Aliases +#define ABGRToRGB24 ARGBToRAW +#define ABGRToRAW ARGBToRGB24 // Convert ARGB To RGB24. LIBYUV_API -int ARGBToRGB24(const uint8* src_argb, int src_stride_argb, - uint8* dst_rgb24, int dst_stride_rgb24, - int width, int height); +int ARGBToRGB24(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); // Convert ARGB To RAW. LIBYUV_API -int ARGBToRAW(const uint8* src_argb, int src_stride_argb, - uint8* dst_rgb, int dst_stride_rgb, - int width, int height); +int ARGBToRAW(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_raw, + int dst_stride_raw, + int width, + int height); // Convert ARGB To RGB565. LIBYUV_API -int ARGBToRGB565(const uint8* src_argb, int src_stride_argb, - uint8* dst_rgb565, int dst_stride_rgb565, - int width, int height); +int ARGBToRGB565(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + int width, + int height); // Convert ARGB To RGB565 with 4x4 dither matrix (16 bytes). // Values in dither matrix from 0 to 7 recommended. // The order of the dither matrix is first byte is upper left. // TODO(fbarchard): Consider pointer to 2d array for dither4x4. -// const uint8(*dither)[4][4]; +// const uint8_t(*dither)[4][4]; LIBYUV_API -int ARGBToRGB565Dither(const uint8* src_argb, int src_stride_argb, - uint8* dst_rgb565, int dst_stride_rgb565, - const uint8* dither4x4, int width, int height); +int ARGBToRGB565Dither(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_rgb565, + int dst_stride_rgb565, + const uint8_t* dither4x4, + int width, + int height); // Convert ARGB To ARGB1555. LIBYUV_API -int ARGBToARGB1555(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb1555, int dst_stride_argb1555, - int width, int height); +int ARGBToARGB1555(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb1555, + int dst_stride_argb1555, + int width, + int height); // Convert ARGB To ARGB4444. LIBYUV_API -int ARGBToARGB4444(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb4444, int dst_stride_argb4444, - int width, int height); +int ARGBToARGB4444(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb4444, + int dst_stride_argb4444, + int width, + int height); // Convert ARGB To I444. LIBYUV_API -int ARGBToI444(const uint8* src_argb, int src_stride_argb, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int ARGBToI444(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert ARGB to AR64. +LIBYUV_API +int ARGBToAR64(const uint8_t* src_argb, + int src_stride_argb, + uint16_t* dst_ar64, + int dst_stride_ar64, + int width, + int height); + +// Convert ABGR to AB64. +#define ABGRToAB64 ARGBToAR64 + +// Convert ARGB to AB64. +LIBYUV_API +int ARGBToAB64(const uint8_t* src_argb, + int src_stride_argb, + uint16_t* dst_ab64, + int dst_stride_ab64, + int width, + int height); + +// Convert ABGR to AR64. +#define ABGRToAR64 ARGBToAB64 // Convert ARGB To I422. LIBYUV_API -int ARGBToI422(const uint8* src_argb, int src_stride_argb, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int ARGBToI422(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Convert ARGB To I420. (also in convert.h) LIBYUV_API -int ARGBToI420(const uint8* src_argb, int src_stride_argb, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int ARGBToI420(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Convert ARGB to J420. (JPeg full range I420). LIBYUV_API -int ARGBToJ420(const uint8* src_argb, int src_stride_argb, - uint8* dst_yj, int dst_stride_yj, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int ARGBToJ420(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_yj, + int dst_stride_yj, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Convert ARGB to J422. LIBYUV_API -int ARGBToJ422(const uint8* src_argb, int src_stride_argb, - uint8* dst_yj, int dst_stride_yj, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int ARGBToJ422(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_yj, + int dst_stride_yj, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); -// Convert ARGB To I411. +// Convert ARGB to J400. (JPeg full range). LIBYUV_API -int ARGBToI411(const uint8* src_argb, int src_stride_argb, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int ARGBToJ400(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_yj, + int dst_stride_yj, + int width, + int height); -// Convert ARGB to J400. (JPeg full range). +// Convert RGBA to J400. (JPeg full range). LIBYUV_API -int ARGBToJ400(const uint8* src_argb, int src_stride_argb, - uint8* dst_yj, int dst_stride_yj, - int width, int height); +int RGBAToJ400(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_yj, + int dst_stride_yj, + int width, + int height); // Convert ARGB to I400. LIBYUV_API -int ARGBToI400(const uint8* src_argb, int src_stride_argb, - uint8* dst_y, int dst_stride_y, - int width, int height); +int ARGBToI400(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); // Convert ARGB to G. (Reverse of J400toARGB, which replicates G back to ARGB) LIBYUV_API -int ARGBToG(const uint8* src_argb, int src_stride_argb, - uint8* dst_g, int dst_stride_g, - int width, int height); +int ARGBToG(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_g, + int dst_stride_g, + int width, + int height); // Convert ARGB To NV12. LIBYUV_API -int ARGBToNV12(const uint8* src_argb, int src_stride_argb, - uint8* dst_y, int dst_stride_y, - uint8* dst_uv, int dst_stride_uv, - int width, int height); +int ARGBToNV12(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); // Convert ARGB To NV21. LIBYUV_API -int ARGBToNV21(const uint8* src_argb, int src_stride_argb, - uint8* dst_y, int dst_stride_y, - uint8* dst_vu, int dst_stride_vu, - int width, int height); +int ARGBToNV21(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); -// Convert ARGB To NV21. +// Convert ABGR To NV12. LIBYUV_API -int ARGBToNV21(const uint8* src_argb, int src_stride_argb, - uint8* dst_y, int dst_stride_y, - uint8* dst_vu, int dst_stride_vu, - int width, int height); +int ABGRToNV12(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert ABGR To NV21. +LIBYUV_API +int ABGRToNV21(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); // Convert ARGB To YUY2. LIBYUV_API -int ARGBToYUY2(const uint8* src_argb, int src_stride_argb, - uint8* dst_yuy2, int dst_stride_yuy2, - int width, int height); +int ARGBToYUY2(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_yuy2, + int dst_stride_yuy2, + int width, + int height); // Convert ARGB To UYVY. LIBYUV_API -int ARGBToUYVY(const uint8* src_argb, int src_stride_argb, - uint8* dst_uyvy, int dst_stride_uyvy, - int width, int height); +int ARGBToUYVY(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_uyvy, + int dst_stride_uyvy, + int width, + int height); + +// RAW to JNV21 full range NV21 +LIBYUV_API +int RAWToJNV21(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/cpu_id.h b/third_party/libyuv/include/libyuv/cpu_id.h index 7c6c9aeb00..fb90c6c737 100644 --- a/third_party/libyuv/include/libyuv/cpu_id.h +++ b/third_party/libyuv/include/libyuv/cpu_id.h @@ -31,47 +31,93 @@ static const int kCpuHasX86 = 0x10; static const int kCpuHasSSE2 = 0x20; static const int kCpuHasSSSE3 = 0x40; static const int kCpuHasSSE41 = 0x80; -static const int kCpuHasSSE42 = 0x100; +static const int kCpuHasSSE42 = 0x100; // unused at this time. static const int kCpuHasAVX = 0x200; static const int kCpuHasAVX2 = 0x400; static const int kCpuHasERMS = 0x800; static const int kCpuHasFMA3 = 0x1000; -static const int kCpuHasAVX3 = 0x2000; -// 0x2000, 0x4000, 0x8000 reserved for future X86 flags. +static const int kCpuHasF16C = 0x2000; +static const int kCpuHasGFNI = 0x4000; +static const int kCpuHasAVX512BW = 0x8000; +static const int kCpuHasAVX512VL = 0x10000; +static const int kCpuHasAVX512VNNI = 0x20000; +static const int kCpuHasAVX512VBMI = 0x40000; +static const int kCpuHasAVX512VBMI2 = 0x80000; +static const int kCpuHasAVX512VBITALG = 0x100000; +static const int kCpuHasAVX512VPOPCNTDQ = 0x200000; // These flags are only valid on MIPS processors. -static const int kCpuHasMIPS = 0x10000; -static const int kCpuHasDSPR2 = 0x20000; -static const int kCpuHasMSA = 0x40000; +static const int kCpuHasMIPS = 0x400000; +static const int kCpuHasMSA = 0x800000; -// Internal function used to auto-init. -LIBYUV_API -int InitCpuFlags(void); +// These flags are only valid on LOONGARCH processors. +static const int kCpuHasLOONGARCH = 0x2000000; +static const int kCpuHasLSX = 0x4000000; +static const int kCpuHasLASX = 0x8000000; -// Internal function for parsing /proc/cpuinfo. +// Optional init function. TestCpuFlag does an auto-init. +// Returns cpu_info flags. LIBYUV_API -int ArmCpuCaps(const char* cpuinfo_name); +int InitCpuFlags(void); // Detect CPU has SSE2 etc. // Test_flag parameter should be one of kCpuHas constants above. -// returns non-zero if instruction set is detected +// Returns non-zero if instruction set is detected static __inline int TestCpuFlag(int test_flag) { LIBYUV_API extern int cpu_info_; - return (!cpu_info_ ? InitCpuFlags() : cpu_info_) & test_flag; +#ifdef __ATOMIC_RELAXED + int cpu_info = __atomic_load_n(&cpu_info_, __ATOMIC_RELAXED); +#else + int cpu_info = cpu_info_; +#endif + return (!cpu_info ? InitCpuFlags() : cpu_info) & test_flag; } +// Internal function for parsing /proc/cpuinfo. +LIBYUV_API +int ArmCpuCaps(const char* cpuinfo_name); +LIBYUV_API +int MipsCpuCaps(const char* cpuinfo_name); + // For testing, allow CPU flags to be disabled. // ie MaskCpuFlags(~kCpuHasSSSE3) to disable SSSE3. // MaskCpuFlags(-1) to enable all cpu specific optimizations. // MaskCpuFlags(1) to disable all cpu specific optimizations. +// MaskCpuFlags(0) to reset state so next call will auto init. +// Returns cpu_info flags. LIBYUV_API -void MaskCpuFlags(int enable_flags); +int MaskCpuFlags(int enable_flags); + +// Sets the CPU flags to |cpu_flags|, bypassing the detection code. |cpu_flags| +// should be a valid combination of the kCpuHas constants above and include +// kCpuInitialized. Use this method when running in a sandboxed process where +// the detection code might fail (as it might access /proc/cpuinfo). In such +// cases the cpu_info can be obtained from a non sandboxed process by calling +// InitCpuFlags() and passed to the sandboxed process (via command line +// parameters, IPC...) which can then call this method to initialize the CPU +// flags. +// Notes: +// - when specifying 0 for |cpu_flags|, the auto initialization is enabled +// again. +// - enabling CPU features that are not supported by the CPU will result in +// undefined behavior. +// TODO(fbarchard): consider writing a helper function that translates from +// other library CPU info to libyuv CPU info and add a .md doc that explains +// CPU detection. +static __inline void SetCpuFlags(int cpu_flags) { + LIBYUV_API extern int cpu_info_; +#ifdef __ATOMIC_RELAXED + __atomic_store_n(&cpu_info_, cpu_flags, __ATOMIC_RELAXED); +#else + cpu_info_ = cpu_flags; +#endif +} // Low level cpuid for X86. Returns zeros on other CPUs. // eax is the info type that you want. // ecx is typically the cpu number, and should normally be zero. LIBYUV_API -void CpuId(uint32 eax, uint32 ecx, uint32* cpu_info); +void CpuId(int info_eax, int info_ecx, int* cpu_info); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/loongson_intrinsics.h b/third_party/libyuv/include/libyuv/loongson_intrinsics.h new file mode 100644 index 0000000000..1d613defb1 --- /dev/null +++ b/third_party/libyuv/include/libyuv/loongson_intrinsics.h @@ -0,0 +1,1949 @@ +/* + * Copyright 2022 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_LOONGSON_INTRINSICS_H +#define INCLUDE_LIBYUV_LOONGSON_INTRINSICS_H + +/* + * Copyright (c) 2022 Loongson Technology Corporation Limited + * All rights reserved. + * Contributed by Shiyou Yin + * Xiwei Gu + * Lu Wang + * + * This file is a header file for loongarch builtin extension. + * + */ + +#ifndef LOONGSON_INTRINSICS_H +#define LOONGSON_INTRINSICS_H + +/** + * MAJOR version: Macro usage changes. + * MINOR version: Add new functions, or bug fixes. + * MICRO version: Comment changes or implementation changes. + */ +#define LSOM_VERSION_MAJOR 1 +#define LSOM_VERSION_MINOR 1 +#define LSOM_VERSION_MICRO 0 + +#define DUP2_ARG1(_INS, _IN0, _IN1, _OUT0, _OUT1) \ + { \ + _OUT0 = _INS(_IN0); \ + _OUT1 = _INS(_IN1); \ + } + +#define DUP2_ARG2(_INS, _IN0, _IN1, _IN2, _IN3, _OUT0, _OUT1) \ + { \ + _OUT0 = _INS(_IN0, _IN1); \ + _OUT1 = _INS(_IN2, _IN3); \ + } + +#define DUP2_ARG3(_INS, _IN0, _IN1, _IN2, _IN3, _IN4, _IN5, _OUT0, _OUT1) \ + { \ + _OUT0 = _INS(_IN0, _IN1, _IN2); \ + _OUT1 = _INS(_IN3, _IN4, _IN5); \ + } + +#define DUP4_ARG1(_INS, _IN0, _IN1, _IN2, _IN3, _OUT0, _OUT1, _OUT2, _OUT3) \ + { \ + DUP2_ARG1(_INS, _IN0, _IN1, _OUT0, _OUT1); \ + DUP2_ARG1(_INS, _IN2, _IN3, _OUT2, _OUT3); \ + } + +#define DUP4_ARG2(_INS, _IN0, _IN1, _IN2, _IN3, _IN4, _IN5, _IN6, _IN7, _OUT0, \ + _OUT1, _OUT2, _OUT3) \ + { \ + DUP2_ARG2(_INS, _IN0, _IN1, _IN2, _IN3, _OUT0, _OUT1); \ + DUP2_ARG2(_INS, _IN4, _IN5, _IN6, _IN7, _OUT2, _OUT3); \ + } + +#define DUP4_ARG3(_INS, _IN0, _IN1, _IN2, _IN3, _IN4, _IN5, _IN6, _IN7, _IN8, \ + _IN9, _IN10, _IN11, _OUT0, _OUT1, _OUT2, _OUT3) \ + { \ + DUP2_ARG3(_INS, _IN0, _IN1, _IN2, _IN3, _IN4, _IN5, _OUT0, _OUT1); \ + DUP2_ARG3(_INS, _IN6, _IN7, _IN8, _IN9, _IN10, _IN11, _OUT2, _OUT3); \ + } + +#ifdef __loongarch_sx +#include +/* + * ============================================================================= + * Description : Dot product & addition of byte vector elements + * Arguments : Inputs - in_c, in_h, in_l + * Outputs - out + * Return Type - halfword + * Details : Signed byte elements from in_h are multiplied by + * signed byte elements from in_l, and then added adjacent to + * each other to get results with the twice size of input. + * Then the results plus to signed half-word elements from in_c. + * Example : out = __lsx_vdp2add_h_b(in_c, in_h, in_l) + * in_c : 1,2,3,4, 1,2,3,4 + * in_h : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * in_l : 8,7,6,5, 4,3,2,1, 8,7,6,5, 4,3,2,1 + * out : 23,40,41,26, 23,40,41,26 + * ============================================================================= + */ +static inline __m128i __lsx_vdp2add_h_b(__m128i in_c, + __m128i in_h, + __m128i in_l) { + __m128i out; + + out = __lsx_vmaddwev_h_b(in_c, in_h, in_l); + out = __lsx_vmaddwod_h_b(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product & addition of byte vector elements + * Arguments : Inputs - in_c, in_h, in_l + * Outputs - out + * Return Type - halfword + * Details : Unsigned byte elements from in_h are multiplied by + * unsigned byte elements from in_l, and then added adjacent to + * each other to get results with the twice size of input. + * The results plus to signed half-word elements from in_c. + * Example : out = __lsx_vdp2add_h_bu(in_c, in_h, in_l) + * in_c : 1,2,3,4, 1,2,3,4 + * in_h : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * in_l : 8,7,6,5, 4,3,2,1, 8,7,6,5, 4,3,2,1 + * out : 23,40,41,26, 23,40,41,26 + * ============================================================================= + */ +static inline __m128i __lsx_vdp2add_h_bu(__m128i in_c, + __m128i in_h, + __m128i in_l) { + __m128i out; + + out = __lsx_vmaddwev_h_bu(in_c, in_h, in_l); + out = __lsx_vmaddwod_h_bu(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product & addition of byte vector elements + * Arguments : Inputs - in_c, in_h, in_l + * Outputs - out + * Return Type - halfword + * Details : Unsigned byte elements from in_h are multiplied by + * signed byte elements from in_l, and then added adjacent to + * each other to get results with the twice size of input. + * The results plus to signed half-word elements from in_c. + * Example : out = __lsx_vdp2add_h_bu_b(in_c, in_h, in_l) + * in_c : 1,1,1,1, 1,1,1,1 + * in_h : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * in_l : -1,-2,-3,-4, -5,-6,-7,-8, 1,2,3,4, 5,6,7,8 + * out : -4,-24,-60,-112, 6,26,62,114 + * ============================================================================= + */ +static inline __m128i __lsx_vdp2add_h_bu_b(__m128i in_c, + __m128i in_h, + __m128i in_l) { + __m128i out; + + out = __lsx_vmaddwev_h_bu_b(in_c, in_h, in_l); + out = __lsx_vmaddwod_h_bu_b(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product & addition of half-word vector elements + * Arguments : Inputs - in_c, in_h, in_l + * Outputs - out + * Return Type - __m128i + * Details : Signed half-word elements from in_h are multiplied by + * signed half-word elements from in_l, and then added adjacent to + * each other to get results with the twice size of input. + * Then the results plus to signed word elements from in_c. + * Example : out = __lsx_vdp2add_h_b(in_c, in_h, in_l) + * in_c : 1,2,3,4 + * in_h : 1,2,3,4, 5,6,7,8 + * in_l : 8,7,6,5, 4,3,2,1 + * out : 23,40,41,26 + * ============================================================================= + */ +static inline __m128i __lsx_vdp2add_w_h(__m128i in_c, + __m128i in_h, + __m128i in_l) { + __m128i out; + + out = __lsx_vmaddwev_w_h(in_c, in_h, in_l); + out = __lsx_vmaddwod_w_h(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of byte vector elements + * Arguments : Inputs - in_h, in_l + * Outputs - out + * Return Type - halfword + * Details : Signed byte elements from in_h are multiplied by + * signed byte elements from in_l, and then added adjacent to + * each other to get results with the twice size of input. + * Example : out = __lsx_vdp2_h_b(in_h, in_l) + * in_h : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * in_l : 8,7,6,5, 4,3,2,1, 8,7,6,5, 4,3,2,1 + * out : 22,38,38,22, 22,38,38,22 + * ============================================================================= + */ +static inline __m128i __lsx_vdp2_h_b(__m128i in_h, __m128i in_l) { + __m128i out; + + out = __lsx_vmulwev_h_b(in_h, in_l); + out = __lsx_vmaddwod_h_b(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of byte vector elements + * Arguments : Inputs - in_h, in_l + * Outputs - out + * Return Type - halfword + * Details : Unsigned byte elements from in_h are multiplied by + * unsigned byte elements from in_l, and then added adjacent to + * each other to get results with the twice size of input. + * Example : out = __lsx_vdp2_h_bu(in_h, in_l) + * in_h : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * in_l : 8,7,6,5, 4,3,2,1, 8,7,6,5, 4,3,2,1 + * out : 22,38,38,22, 22,38,38,22 + * ============================================================================= + */ +static inline __m128i __lsx_vdp2_h_bu(__m128i in_h, __m128i in_l) { + __m128i out; + + out = __lsx_vmulwev_h_bu(in_h, in_l); + out = __lsx_vmaddwod_h_bu(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of byte vector elements + * Arguments : Inputs - in_h, in_l + * Outputs - out + * Return Type - halfword + * Details : Unsigned byte elements from in_h are multiplied by + * signed byte elements from in_l, and then added adjacent to + * each other to get results with the twice size of input. + * Example : out = __lsx_vdp2_h_bu_b(in_h, in_l) + * in_h : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * in_l : 8,7,6,5, 4,3,2,1, 8,7,6,5, 4,3,2,-1 + * out : 22,38,38,22, 22,38,38,6 + * ============================================================================= + */ +static inline __m128i __lsx_vdp2_h_bu_b(__m128i in_h, __m128i in_l) { + __m128i out; + + out = __lsx_vmulwev_h_bu_b(in_h, in_l); + out = __lsx_vmaddwod_h_bu_b(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of byte vector elements + * Arguments : Inputs - in_h, in_l + * Outputs - out + * Return Type - halfword + * Details : Signed byte elements from in_h are multiplied by + * signed byte elements from in_l, and then added adjacent to + * each other to get results with the twice size of input. + * Example : out = __lsx_vdp2_w_h(in_h, in_l) + * in_h : 1,2,3,4, 5,6,7,8 + * in_l : 8,7,6,5, 4,3,2,1 + * out : 22,38,38,22 + * ============================================================================= + */ +static inline __m128i __lsx_vdp2_w_h(__m128i in_h, __m128i in_l) { + __m128i out; + + out = __lsx_vmulwev_w_h(in_h, in_l); + out = __lsx_vmaddwod_w_h(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Clip all halfword elements of input vector between min & max + * out = ((_in) < (min)) ? (min) : (((_in) > (max)) ? (max) : + * (_in)) + * Arguments : Inputs - _in (input vector) + * - min (min threshold) + * - max (max threshold) + * Outputs - out (output vector with clipped elements) + * Return Type - signed halfword + * Example : out = __lsx_vclip_h(_in) + * _in : -8,2,280,249, -8,255,280,249 + * min : 1,1,1,1, 1,1,1,1 + * max : 9,9,9,9, 9,9,9,9 + * out : 1,2,9,9, 1,9,9,9 + * ============================================================================= + */ +static inline __m128i __lsx_vclip_h(__m128i _in, __m128i min, __m128i max) { + __m128i out; + + out = __lsx_vmax_h(min, _in); + out = __lsx_vmin_h(max, out); + return out; +} + +/* + * ============================================================================= + * Description : Set each element of vector between 0 and 255 + * Arguments : Inputs - _in + * Outputs - out + * Return Type - halfword + * Details : Signed byte elements from _in are clamped between 0 and 255. + * Example : out = __lsx_vclip255_h(_in) + * _in : -8,255,280,249, -8,255,280,249 + * out : 0,255,255,249, 0,255,255,249 + * ============================================================================= + */ +static inline __m128i __lsx_vclip255_h(__m128i _in) { + __m128i out; + + out = __lsx_vmaxi_h(_in, 0); + out = __lsx_vsat_hu(out, 7); + return out; +} + +/* + * ============================================================================= + * Description : Set each element of vector between 0 and 255 + * Arguments : Inputs - _in + * Outputs - out + * Return Type - word + * Details : Signed byte elements from _in are clamped between 0 and 255. + * Example : out = __lsx_vclip255_w(_in) + * _in : -8,255,280,249 + * out : 0,255,255,249 + * ============================================================================= + */ +static inline __m128i __lsx_vclip255_w(__m128i _in) { + __m128i out; + + out = __lsx_vmaxi_w(_in, 0); + out = __lsx_vsat_wu(out, 7); + return out; +} + +/* + * ============================================================================= + * Description : Swap two variables + * Arguments : Inputs - _in0, _in1 + * Outputs - _in0, _in1 (in-place) + * Details : Swapping of two input variables using xor + * Example : LSX_SWAP(_in0, _in1) + * _in0 : 1,2,3,4 + * _in1 : 5,6,7,8 + * _in0(out) : 5,6,7,8 + * _in1(out) : 1,2,3,4 + * ============================================================================= + */ +#define LSX_SWAP(_in0, _in1) \ + { \ + _in0 = __lsx_vxor_v(_in0, _in1); \ + _in1 = __lsx_vxor_v(_in0, _in1); \ + _in0 = __lsx_vxor_v(_in0, _in1); \ + } + +/* + * ============================================================================= + * Description : Transpose 4x4 block with word elements in vectors + * Arguments : Inputs - in0, in1, in2, in3 + * Outputs - out0, out1, out2, out3 + * Details : + * Example : + * 1, 2, 3, 4 1, 5, 9,13 + * 5, 6, 7, 8 to 2, 6,10,14 + * 9,10,11,12 =====> 3, 7,11,15 + * 13,14,15,16 4, 8,12,16 + * ============================================================================= + */ +#define LSX_TRANSPOSE4x4_W(_in0, _in1, _in2, _in3, _out0, _out1, _out2, _out3) \ + { \ + __m128i _t0, _t1, _t2, _t3; \ + \ + _t0 = __lsx_vilvl_w(_in1, _in0); \ + _t1 = __lsx_vilvh_w(_in1, _in0); \ + _t2 = __lsx_vilvl_w(_in3, _in2); \ + _t3 = __lsx_vilvh_w(_in3, _in2); \ + _out0 = __lsx_vilvl_d(_t2, _t0); \ + _out1 = __lsx_vilvh_d(_t2, _t0); \ + _out2 = __lsx_vilvl_d(_t3, _t1); \ + _out3 = __lsx_vilvh_d(_t3, _t1); \ + } + +/* + * ============================================================================= + * Description : Transpose 8x8 block with byte elements in vectors + * Arguments : Inputs - _in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7 + * Outputs - _out0, _out1, _out2, _out3, _out4, _out5, _out6, + * _out7 + * Details : The rows of the matrix become columns, and the columns + * become rows. + * Example : LSX_TRANSPOSE8x8_B + * _in0 : 00,01,02,03,04,05,06,07, 00,00,00,00,00,00,00,00 + * _in1 : 10,11,12,13,14,15,16,17, 00,00,00,00,00,00,00,00 + * _in2 : 20,21,22,23,24,25,26,27, 00,00,00,00,00,00,00,00 + * _in3 : 30,31,32,33,34,35,36,37, 00,00,00,00,00,00,00,00 + * _in4 : 40,41,42,43,44,45,46,47, 00,00,00,00,00,00,00,00 + * _in5 : 50,51,52,53,54,55,56,57, 00,00,00,00,00,00,00,00 + * _in6 : 60,61,62,63,64,65,66,67, 00,00,00,00,00,00,00,00 + * _in7 : 70,71,72,73,74,75,76,77, 00,00,00,00,00,00,00,00 + * + * _ out0 : 00,10,20,30,40,50,60,70, 00,00,00,00,00,00,00,00 + * _ out1 : 01,11,21,31,41,51,61,71, 00,00,00,00,00,00,00,00 + * _ out2 : 02,12,22,32,42,52,62,72, 00,00,00,00,00,00,00,00 + * _ out3 : 03,13,23,33,43,53,63,73, 00,00,00,00,00,00,00,00 + * _ out4 : 04,14,24,34,44,54,64,74, 00,00,00,00,00,00,00,00 + * _ out5 : 05,15,25,35,45,55,65,75, 00,00,00,00,00,00,00,00 + * _ out6 : 06,16,26,36,46,56,66,76, 00,00,00,00,00,00,00,00 + * _ out7 : 07,17,27,37,47,57,67,77, 00,00,00,00,00,00,00,00 + * ============================================================================= + */ +#define LSX_TRANSPOSE8x8_B(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + __m128i zero = {0}; \ + __m128i shuf8 = {0x0F0E0D0C0B0A0908, 0x1716151413121110}; \ + __m128i _t0, _t1, _t2, _t3, _t4, _t5, _t6, _t7; \ + \ + _t0 = __lsx_vilvl_b(_in2, _in0); \ + _t1 = __lsx_vilvl_b(_in3, _in1); \ + _t2 = __lsx_vilvl_b(_in6, _in4); \ + _t3 = __lsx_vilvl_b(_in7, _in5); \ + _t4 = __lsx_vilvl_b(_t1, _t0); \ + _t5 = __lsx_vilvh_b(_t1, _t0); \ + _t6 = __lsx_vilvl_b(_t3, _t2); \ + _t7 = __lsx_vilvh_b(_t3, _t2); \ + _out0 = __lsx_vilvl_w(_t6, _t4); \ + _out2 = __lsx_vilvh_w(_t6, _t4); \ + _out4 = __lsx_vilvl_w(_t7, _t5); \ + _out6 = __lsx_vilvh_w(_t7, _t5); \ + _out1 = __lsx_vshuf_b(zero, _out0, shuf8); \ + _out3 = __lsx_vshuf_b(zero, _out2, shuf8); \ + _out5 = __lsx_vshuf_b(zero, _out4, shuf8); \ + _out7 = __lsx_vshuf_b(zero, _out6, shuf8); \ + } + +/* + * ============================================================================= + * Description : Transpose 8x8 block with half-word elements in vectors + * Arguments : Inputs - in0, in1, in2, in3, in4, in5, in6, in7 + * Outputs - out0, out1, out2, out3, out4, out5, out6, out7 + * Details : + * Example : + * 00,01,02,03,04,05,06,07 00,10,20,30,40,50,60,70 + * 10,11,12,13,14,15,16,17 01,11,21,31,41,51,61,71 + * 20,21,22,23,24,25,26,27 02,12,22,32,42,52,62,72 + * 30,31,32,33,34,35,36,37 to 03,13,23,33,43,53,63,73 + * 40,41,42,43,44,45,46,47 ======> 04,14,24,34,44,54,64,74 + * 50,51,52,53,54,55,56,57 05,15,25,35,45,55,65,75 + * 60,61,62,63,64,65,66,67 06,16,26,36,46,56,66,76 + * 70,71,72,73,74,75,76,77 07,17,27,37,47,57,67,77 + * ============================================================================= + */ +#define LSX_TRANSPOSE8x8_H(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + __m128i _s0, _s1, _t0, _t1, _t2, _t3, _t4, _t5, _t6, _t7; \ + \ + _s0 = __lsx_vilvl_h(_in6, _in4); \ + _s1 = __lsx_vilvl_h(_in7, _in5); \ + _t0 = __lsx_vilvl_h(_s1, _s0); \ + _t1 = __lsx_vilvh_h(_s1, _s0); \ + _s0 = __lsx_vilvh_h(_in6, _in4); \ + _s1 = __lsx_vilvh_h(_in7, _in5); \ + _t2 = __lsx_vilvl_h(_s1, _s0); \ + _t3 = __lsx_vilvh_h(_s1, _s0); \ + _s0 = __lsx_vilvl_h(_in2, _in0); \ + _s1 = __lsx_vilvl_h(_in3, _in1); \ + _t4 = __lsx_vilvl_h(_s1, _s0); \ + _t5 = __lsx_vilvh_h(_s1, _s0); \ + _s0 = __lsx_vilvh_h(_in2, _in0); \ + _s1 = __lsx_vilvh_h(_in3, _in1); \ + _t6 = __lsx_vilvl_h(_s1, _s0); \ + _t7 = __lsx_vilvh_h(_s1, _s0); \ + \ + _out0 = __lsx_vpickev_d(_t0, _t4); \ + _out2 = __lsx_vpickev_d(_t1, _t5); \ + _out4 = __lsx_vpickev_d(_t2, _t6); \ + _out6 = __lsx_vpickev_d(_t3, _t7); \ + _out1 = __lsx_vpickod_d(_t0, _t4); \ + _out3 = __lsx_vpickod_d(_t1, _t5); \ + _out5 = __lsx_vpickod_d(_t2, _t6); \ + _out7 = __lsx_vpickod_d(_t3, _t7); \ + } + +/* + * ============================================================================= + * Description : Transpose input 8x4 byte block into 4x8 + * Arguments : Inputs - _in0, _in1, _in2, _in3 (input 8x4 byte block) + * Outputs - _out0, _out1, _out2, _out3 (output 4x8 byte block) + * Return Type - as per RTYPE + * Details : The rows of the matrix become columns, and the columns become + * rows. + * Example : LSX_TRANSPOSE8x4_B + * _in0 : 00,01,02,03,00,00,00,00, 00,00,00,00,00,00,00,00 + * _in1 : 10,11,12,13,00,00,00,00, 00,00,00,00,00,00,00,00 + * _in2 : 20,21,22,23,00,00,00,00, 00,00,00,00,00,00,00,00 + * _in3 : 30,31,32,33,00,00,00,00, 00,00,00,00,00,00,00,00 + * _in4 : 40,41,42,43,00,00,00,00, 00,00,00,00,00,00,00,00 + * _in5 : 50,51,52,53,00,00,00,00, 00,00,00,00,00,00,00,00 + * _in6 : 60,61,62,63,00,00,00,00, 00,00,00,00,00,00,00,00 + * _in7 : 70,71,72,73,00,00,00,00, 00,00,00,00,00,00,00,00 + * + * _out0 : 00,10,20,30,40,50,60,70, 00,00,00,00,00,00,00,00 + * _out1 : 01,11,21,31,41,51,61,71, 00,00,00,00,00,00,00,00 + * _out2 : 02,12,22,32,42,52,62,72, 00,00,00,00,00,00,00,00 + * _out3 : 03,13,23,33,43,53,63,73, 00,00,00,00,00,00,00,00 + * ============================================================================= + */ +#define LSX_TRANSPOSE8x4_B(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3) \ + { \ + __m128i _tmp0_m, _tmp1_m, _tmp2_m, _tmp3_m; \ + \ + _tmp0_m = __lsx_vpackev_w(_in4, _in0); \ + _tmp1_m = __lsx_vpackev_w(_in5, _in1); \ + _tmp2_m = __lsx_vilvl_b(_tmp1_m, _tmp0_m); \ + _tmp0_m = __lsx_vpackev_w(_in6, _in2); \ + _tmp1_m = __lsx_vpackev_w(_in7, _in3); \ + \ + _tmp3_m = __lsx_vilvl_b(_tmp1_m, _tmp0_m); \ + _tmp0_m = __lsx_vilvl_h(_tmp3_m, _tmp2_m); \ + _tmp1_m = __lsx_vilvh_h(_tmp3_m, _tmp2_m); \ + \ + _out0 = __lsx_vilvl_w(_tmp1_m, _tmp0_m); \ + _out2 = __lsx_vilvh_w(_tmp1_m, _tmp0_m); \ + _out1 = __lsx_vilvh_d(_out2, _out0); \ + _out3 = __lsx_vilvh_d(_out0, _out2); \ + } + +/* + * ============================================================================= + * Description : Transpose 16x8 block with byte elements in vectors + * Arguments : Inputs - in0, in1, in2, in3, in4, in5, in6, in7, in8 + * in9, in10, in11, in12, in13, in14, in15 + * Outputs - out0, out1, out2, out3, out4, out5, out6, out7 + * Details : + * Example : + * 000,001,002,003,004,005,006,007 + * 008,009,010,011,012,013,014,015 + * 016,017,018,019,020,021,022,023 + * 024,025,026,027,028,029,030,031 + * 032,033,034,035,036,037,038,039 + * 040,041,042,043,044,045,046,047 000,008,...,112,120 + * 048,049,050,051,052,053,054,055 001,009,...,113,121 + * 056,057,058,059,060,061,062,063 to 002,010,...,114,122 + * 064,068,066,067,068,069,070,071 =====> 003,011,...,115,123 + * 072,073,074,075,076,077,078,079 004,012,...,116,124 + * 080,081,082,083,084,085,086,087 005,013,...,117,125 + * 088,089,090,091,092,093,094,095 006,014,...,118,126 + * 096,097,098,099,100,101,102,103 007,015,...,119,127 + * 104,105,106,107,108,109,110,111 + * 112,113,114,115,116,117,118,119 + * 120,121,122,123,124,125,126,127 + * ============================================================================= + */ +#define LSX_TRANSPOSE16x8_B(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _in8, _in9, _in10, _in11, _in12, _in13, _in14, \ + _in15, _out0, _out1, _out2, _out3, _out4, _out5, \ + _out6, _out7) \ + { \ + __m128i _tmp0, _tmp1, _tmp2, _tmp3, _tmp4, _tmp5, _tmp6, _tmp7; \ + __m128i _t0, _t1, _t2, _t3, _t4, _t5, _t6, _t7; \ + DUP4_ARG2(__lsx_vilvl_b, _in2, _in0, _in3, _in1, _in6, _in4, _in7, _in5, \ + _tmp0, _tmp1, _tmp2, _tmp3); \ + DUP4_ARG2(__lsx_vilvl_b, _in10, _in8, _in11, _in9, _in14, _in12, _in15, \ + _in13, _tmp4, _tmp5, _tmp6, _tmp7); \ + DUP2_ARG2(__lsx_vilvl_b, _tmp1, _tmp0, _tmp3, _tmp2, _t0, _t2); \ + DUP2_ARG2(__lsx_vilvh_b, _tmp1, _tmp0, _tmp3, _tmp2, _t1, _t3); \ + DUP2_ARG2(__lsx_vilvl_b, _tmp5, _tmp4, _tmp7, _tmp6, _t4, _t6); \ + DUP2_ARG2(__lsx_vilvh_b, _tmp5, _tmp4, _tmp7, _tmp6, _t5, _t7); \ + DUP2_ARG2(__lsx_vilvl_w, _t2, _t0, _t3, _t1, _tmp0, _tmp4); \ + DUP2_ARG2(__lsx_vilvh_w, _t2, _t0, _t3, _t1, _tmp2, _tmp6); \ + DUP2_ARG2(__lsx_vilvl_w, _t6, _t4, _t7, _t5, _tmp1, _tmp5); \ + DUP2_ARG2(__lsx_vilvh_w, _t6, _t4, _t7, _t5, _tmp3, _tmp7); \ + DUP2_ARG2(__lsx_vilvl_d, _tmp1, _tmp0, _tmp3, _tmp2, _out0, _out2); \ + DUP2_ARG2(__lsx_vilvh_d, _tmp1, _tmp0, _tmp3, _tmp2, _out1, _out3); \ + DUP2_ARG2(__lsx_vilvl_d, _tmp5, _tmp4, _tmp7, _tmp6, _out4, _out6); \ + DUP2_ARG2(__lsx_vilvh_d, _tmp5, _tmp4, _tmp7, _tmp6, _out5, _out7); \ + } + +/* + * ============================================================================= + * Description : Butterfly of 4 input vectors + * Arguments : Inputs - in0, in1, in2, in3 + * Outputs - out0, out1, out2, out3 + * Details : Butterfly operation + * Example : + * out0 = in0 + in3; + * out1 = in1 + in2; + * out2 = in1 - in2; + * out3 = in0 - in3; + * ============================================================================= + */ +#define LSX_BUTTERFLY_4_B(_in0, _in1, _in2, _in3, _out0, _out1, _out2, _out3) \ + { \ + _out0 = __lsx_vadd_b(_in0, _in3); \ + _out1 = __lsx_vadd_b(_in1, _in2); \ + _out2 = __lsx_vsub_b(_in1, _in2); \ + _out3 = __lsx_vsub_b(_in0, _in3); \ + } +#define LSX_BUTTERFLY_4_H(_in0, _in1, _in2, _in3, _out0, _out1, _out2, _out3) \ + { \ + _out0 = __lsx_vadd_h(_in0, _in3); \ + _out1 = __lsx_vadd_h(_in1, _in2); \ + _out2 = __lsx_vsub_h(_in1, _in2); \ + _out3 = __lsx_vsub_h(_in0, _in3); \ + } +#define LSX_BUTTERFLY_4_W(_in0, _in1, _in2, _in3, _out0, _out1, _out2, _out3) \ + { \ + _out0 = __lsx_vadd_w(_in0, _in3); \ + _out1 = __lsx_vadd_w(_in1, _in2); \ + _out2 = __lsx_vsub_w(_in1, _in2); \ + _out3 = __lsx_vsub_w(_in0, _in3); \ + } +#define LSX_BUTTERFLY_4_D(_in0, _in1, _in2, _in3, _out0, _out1, _out2, _out3) \ + { \ + _out0 = __lsx_vadd_d(_in0, _in3); \ + _out1 = __lsx_vadd_d(_in1, _in2); \ + _out2 = __lsx_vsub_d(_in1, _in2); \ + _out3 = __lsx_vsub_d(_in0, _in3); \ + } + +/* + * ============================================================================= + * Description : Butterfly of 8 input vectors + * Arguments : Inputs - _in0, _in1, _in2, _in3, ~ + * Outputs - _out0, _out1, _out2, _out3, ~ + * Details : Butterfly operation + * Example : + * _out0 = _in0 + _in7; + * _out1 = _in1 + _in6; + * _out2 = _in2 + _in5; + * _out3 = _in3 + _in4; + * _out4 = _in3 - _in4; + * _out5 = _in2 - _in5; + * _out6 = _in1 - _in6; + * _out7 = _in0 - _in7; + * ============================================================================= + */ +#define LSX_BUTTERFLY_8_B(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + _out0 = __lsx_vadd_b(_in0, _in7); \ + _out1 = __lsx_vadd_b(_in1, _in6); \ + _out2 = __lsx_vadd_b(_in2, _in5); \ + _out3 = __lsx_vadd_b(_in3, _in4); \ + _out4 = __lsx_vsub_b(_in3, _in4); \ + _out5 = __lsx_vsub_b(_in2, _in5); \ + _out6 = __lsx_vsub_b(_in1, _in6); \ + _out7 = __lsx_vsub_b(_in0, _in7); \ + } + +#define LSX_BUTTERFLY_8_H(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + _out0 = __lsx_vadd_h(_in0, _in7); \ + _out1 = __lsx_vadd_h(_in1, _in6); \ + _out2 = __lsx_vadd_h(_in2, _in5); \ + _out3 = __lsx_vadd_h(_in3, _in4); \ + _out4 = __lsx_vsub_h(_in3, _in4); \ + _out5 = __lsx_vsub_h(_in2, _in5); \ + _out6 = __lsx_vsub_h(_in1, _in6); \ + _out7 = __lsx_vsub_h(_in0, _in7); \ + } + +#define LSX_BUTTERFLY_8_W(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + _out0 = __lsx_vadd_w(_in0, _in7); \ + _out1 = __lsx_vadd_w(_in1, _in6); \ + _out2 = __lsx_vadd_w(_in2, _in5); \ + _out3 = __lsx_vadd_w(_in3, _in4); \ + _out4 = __lsx_vsub_w(_in3, _in4); \ + _out5 = __lsx_vsub_w(_in2, _in5); \ + _out6 = __lsx_vsub_w(_in1, _in6); \ + _out7 = __lsx_vsub_w(_in0, _in7); \ + } + +#define LSX_BUTTERFLY_8_D(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + _out0 = __lsx_vadd_d(_in0, _in7); \ + _out1 = __lsx_vadd_d(_in1, _in6); \ + _out2 = __lsx_vadd_d(_in2, _in5); \ + _out3 = __lsx_vadd_d(_in3, _in4); \ + _out4 = __lsx_vsub_d(_in3, _in4); \ + _out5 = __lsx_vsub_d(_in2, _in5); \ + _out6 = __lsx_vsub_d(_in1, _in6); \ + _out7 = __lsx_vsub_d(_in0, _in7); \ + } + +#endif // LSX + +#ifdef __loongarch_asx +#include +/* + * ============================================================================= + * Description : Dot product of byte vector elements + * Arguments : Inputs - in_h, in_l + * Output - out + * Return Type - signed halfword + * Details : Unsigned byte elements from in_h are multiplied with + * unsigned byte elements from in_l producing a result + * twice the size of input i.e. signed halfword. + * Then this multiplied results of adjacent odd-even elements + * are added to the out vector + * Example : See out = __lasx_xvdp2_w_h(in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2_h_bu(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvmulwev_h_bu(in_h, in_l); + out = __lasx_xvmaddwod_h_bu(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of byte vector elements + * Arguments : Inputs - in_h, in_l + * Output - out + * Return Type - signed halfword + * Details : Signed byte elements from in_h are multiplied with + * signed byte elements from in_l producing a result + * twice the size of input i.e. signed halfword. + * Then this multiplication results of adjacent odd-even elements + * are added to the out vector + * Example : See out = __lasx_xvdp2_w_h(in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2_h_b(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvmulwev_h_b(in_h, in_l); + out = __lasx_xvmaddwod_h_b(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of halfword vector elements + * Arguments : Inputs - in_h, in_l + * Output - out + * Return Type - signed word + * Details : Signed halfword elements from in_h are multiplied with + * signed halfword elements from in_l producing a result + * twice the size of input i.e. signed word. + * Then this multiplied results of adjacent odd-even elements + * are added to the out vector. + * Example : out = __lasx_xvdp2_w_h(in_h, in_l) + * in_h : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * in_l : 8,7,6,5, 4,3,2,1, 8,7,6,5, 4,3,2,1 + * out : 22,38,38,22, 22,38,38,22 + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2_w_h(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvmulwev_w_h(in_h, in_l); + out = __lasx_xvmaddwod_w_h(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of word vector elements + * Arguments : Inputs - in_h, in_l + * Output - out + * Return Type - signed double + * Details : Signed word elements from in_h are multiplied with + * signed word elements from in_l producing a result + * twice the size of input i.e. signed double-word. + * Then this multiplied results of adjacent odd-even elements + * are added to the out vector. + * Example : See out = __lasx_xvdp2_w_h(in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2_d_w(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvmulwev_d_w(in_h, in_l); + out = __lasx_xvmaddwod_d_w(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of halfword vector elements + * Arguments : Inputs - in_h, in_l + * Output - out + * Return Type - signed word + * Details : Unsigned halfword elements from in_h are multiplied with + * signed halfword elements from in_l producing a result + * twice the size of input i.e. unsigned word. + * Multiplication result of adjacent odd-even elements + * are added to the out vector + * Example : See out = __lasx_xvdp2_w_h(in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2_w_hu_h(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvmulwev_w_hu_h(in_h, in_l); + out = __lasx_xvmaddwod_w_hu_h(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product & addition of byte vector elements + * Arguments : Inputs - in_h, in_l + * Output - out + * Return Type - halfword + * Details : Signed byte elements from in_h are multiplied with + * signed byte elements from in_l producing a result + * twice the size of input i.e. signed halfword. + * Then this multiplied results of adjacent odd-even elements + * are added to the in_c vector. + * Example : See out = __lasx_xvdp2add_w_h(in_c, in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2add_h_b(__m256i in_c, + __m256i in_h, + __m256i in_l) { + __m256i out; + + out = __lasx_xvmaddwev_h_b(in_c, in_h, in_l); + out = __lasx_xvmaddwod_h_b(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product & addition of byte vector elements + * Arguments : Inputs - in_h, in_l + * Output - out + * Return Type - halfword + * Details : Unsigned byte elements from in_h are multiplied with + * unsigned byte elements from in_l producing a result + * twice the size of input i.e. signed halfword. + * Then this multiplied results of adjacent odd-even elements + * are added to the in_c vector. + * Example : See out = __lasx_xvdp2add_w_h(in_c, in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2add_h_bu(__m256i in_c, + __m256i in_h, + __m256i in_l) { + __m256i out; + + out = __lasx_xvmaddwev_h_bu(in_c, in_h, in_l); + out = __lasx_xvmaddwod_h_bu(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product & addition of byte vector elements + * Arguments : Inputs - in_h, in_l + * Output - out + * Return Type - halfword + * Details : Unsigned byte elements from in_h are multiplied with + * signed byte elements from in_l producing a result + * twice the size of input i.e. signed halfword. + * Then this multiplied results of adjacent odd-even elements + * are added to the in_c vector. + * Example : See out = __lasx_xvdp2add_w_h(in_c, in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2add_h_bu_b(__m256i in_c, + __m256i in_h, + __m256i in_l) { + __m256i out; + + out = __lasx_xvmaddwev_h_bu_b(in_c, in_h, in_l); + out = __lasx_xvmaddwod_h_bu_b(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of halfword vector elements + * Arguments : Inputs - in_c, in_h, in_l + * Output - out + * Return Type - per RTYPE + * Details : Signed halfword elements from in_h are multiplied with + * signed halfword elements from in_l producing a result + * twice the size of input i.e. signed word. + * Multiplication result of adjacent odd-even elements + * are added to the in_c vector. + * Example : out = __lasx_xvdp2add_w_h(in_c, in_h, in_l) + * in_c : 1,2,3,4, 1,2,3,4 + * in_h : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8, + * in_l : 8,7,6,5, 4,3,2,1, 8,7,6,5, 4,3,2,1, + * out : 23,40,41,26, 23,40,41,26 + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2add_w_h(__m256i in_c, + __m256i in_h, + __m256i in_l) { + __m256i out; + + out = __lasx_xvmaddwev_w_h(in_c, in_h, in_l); + out = __lasx_xvmaddwod_w_h(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of halfword vector elements + * Arguments : Inputs - in_c, in_h, in_l + * Output - out + * Return Type - signed word + * Details : Unsigned halfword elements from in_h are multiplied with + * unsigned halfword elements from in_l producing a result + * twice the size of input i.e. signed word. + * Multiplication result of adjacent odd-even elements + * are added to the in_c vector. + * Example : See out = __lasx_xvdp2add_w_h(in_c, in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2add_w_hu(__m256i in_c, + __m256i in_h, + __m256i in_l) { + __m256i out; + + out = __lasx_xvmaddwev_w_hu(in_c, in_h, in_l); + out = __lasx_xvmaddwod_w_hu(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of halfword vector elements + * Arguments : Inputs - in_c, in_h, in_l + * Output - out + * Return Type - signed word + * Details : Unsigned halfword elements from in_h are multiplied with + * signed halfword elements from in_l producing a result + * twice the size of input i.e. signed word. + * Multiplication result of adjacent odd-even elements + * are added to the in_c vector + * Example : See out = __lasx_xvdp2add_w_h(in_c, in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2add_w_hu_h(__m256i in_c, + __m256i in_h, + __m256i in_l) { + __m256i out; + + out = __lasx_xvmaddwev_w_hu_h(in_c, in_h, in_l); + out = __lasx_xvmaddwod_w_hu_h(out, in_h, in_l); + return out; +} + +/* + * ============================================================================= + * Description : Vector Unsigned Dot Product and Subtract + * Arguments : Inputs - in_c, in_h, in_l + * Output - out + * Return Type - signed halfword + * Details : Unsigned byte elements from in_h are multiplied with + * unsigned byte elements from in_l producing a result + * twice the size of input i.e. signed halfword. + * Multiplication result of adjacent odd-even elements + * are added together and subtracted from double width elements + * in_c vector. + * Example : See out = __lasx_xvdp2sub_w_h(in_c, in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2sub_h_bu(__m256i in_c, + __m256i in_h, + __m256i in_l) { + __m256i out; + + out = __lasx_xvmulwev_h_bu(in_h, in_l); + out = __lasx_xvmaddwod_h_bu(out, in_h, in_l); + out = __lasx_xvsub_h(in_c, out); + return out; +} + +/* + * ============================================================================= + * Description : Vector Signed Dot Product and Subtract + * Arguments : Inputs - in_c, in_h, in_l + * Output - out + * Return Type - signed word + * Details : Signed halfword elements from in_h are multiplied with + * Signed halfword elements from in_l producing a result + * twice the size of input i.e. signed word. + * Multiplication result of adjacent odd-even elements + * are added together and subtracted from double width elements + * in_c vector. + * Example : out = __lasx_xvdp2sub_w_h(in_c, in_h, in_l) + * in_c : 0,0,0,0, 0,0,0,0 + * in_h : 3,1,3,0, 0,0,0,1, 0,0,1,1, 0,0,0,1 + * in_l : 2,1,1,0, 1,0,0,0, 0,0,1,0, 1,0,0,1 + * out : -7,-3,0,0, 0,-1,0,-1 + * ============================================================================= + */ +static inline __m256i __lasx_xvdp2sub_w_h(__m256i in_c, + __m256i in_h, + __m256i in_l) { + __m256i out; + + out = __lasx_xvmulwev_w_h(in_h, in_l); + out = __lasx_xvmaddwod_w_h(out, in_h, in_l); + out = __lasx_xvsub_w(in_c, out); + return out; +} + +/* + * ============================================================================= + * Description : Dot product of halfword vector elements + * Arguments : Inputs - in_h, in_l + * Output - out + * Return Type - signed word + * Details : Signed halfword elements from in_h are multiplied with + * signed halfword elements from in_l producing a result + * four times the size of input i.e. signed doubleword. + * Then this multiplication results of four adjacent elements + * are added together and stored to the out vector. + * Example : out = __lasx_xvdp4_d_h(in_h, in_l) + * in_h : 3,1,3,0, 0,0,0,1, 0,0,1,-1, 0,0,0,1 + * in_l : -2,1,1,0, 1,0,0,0, 0,0,1, 0, 1,0,0,1 + * out : -2,0,1,1 + * ============================================================================= + */ +static inline __m256i __lasx_xvdp4_d_h(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvmulwev_w_h(in_h, in_l); + out = __lasx_xvmaddwod_w_h(out, in_h, in_l); + out = __lasx_xvhaddw_d_w(out, out); + return out; +} + +/* + * ============================================================================= + * Description : The high half of the vector elements are expanded and + * added after being doubled. + * Arguments : Inputs - in_h, in_l + * Output - out + * Details : The in_h vector and the in_l vector are added after the + * higher half of the two-fold sign extension (signed byte + * to signed halfword) and stored to the out vector. + * Example : See out = __lasx_xvaddwh_w_h(in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvaddwh_h_b(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvilvh_b(in_h, in_l); + out = __lasx_xvhaddw_h_b(out, out); + return out; +} + +/* + * ============================================================================= + * Description : The high half of the vector elements are expanded and + * added after being doubled. + * Arguments : Inputs - in_h, in_l + * Output - out + * Details : The in_h vector and the in_l vector are added after the + * higher half of the two-fold sign extension (signed halfword + * to signed word) and stored to the out vector. + * Example : out = __lasx_xvaddwh_w_h(in_h, in_l) + * in_h : 3, 0,3,0, 0,0,0,-1, 0,0,1,-1, 0,0,0,1 + * in_l : 2,-1,1,2, 1,0,0, 0, 1,0,1, 0, 1,0,0,1 + * out : 1,0,0,-1, 1,0,0, 2 + * ============================================================================= + */ +static inline __m256i __lasx_xvaddwh_w_h(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvilvh_h(in_h, in_l); + out = __lasx_xvhaddw_w_h(out, out); + return out; +} + +/* + * ============================================================================= + * Description : The low half of the vector elements are expanded and + * added after being doubled. + * Arguments : Inputs - in_h, in_l + * Output - out + * Details : The in_h vector and the in_l vector are added after the + * lower half of the two-fold sign extension (signed byte + * to signed halfword) and stored to the out vector. + * Example : See out = __lasx_xvaddwl_w_h(in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvaddwl_h_b(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvilvl_b(in_h, in_l); + out = __lasx_xvhaddw_h_b(out, out); + return out; +} + +/* + * ============================================================================= + * Description : The low half of the vector elements are expanded and + * added after being doubled. + * Arguments : Inputs - in_h, in_l + * Output - out + * Details : The in_h vector and the in_l vector are added after the + * lower half of the two-fold sign extension (signed halfword + * to signed word) and stored to the out vector. + * Example : out = __lasx_xvaddwl_w_h(in_h, in_l) + * in_h : 3, 0,3,0, 0,0,0,-1, 0,0,1,-1, 0,0,0,1 + * in_l : 2,-1,1,2, 1,0,0, 0, 1,0,1, 0, 1,0,0,1 + * out : 5,-1,4,2, 1,0,2,-1 + * ============================================================================= + */ +static inline __m256i __lasx_xvaddwl_w_h(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvilvl_h(in_h, in_l); + out = __lasx_xvhaddw_w_h(out, out); + return out; +} + +/* + * ============================================================================= + * Description : The low half of the vector elements are expanded and + * added after being doubled. + * Arguments : Inputs - in_h, in_l + * Output - out + * Details : The out vector and the out vector are added after the + * lower half of the two-fold zero extension (unsigned byte + * to unsigned halfword) and stored to the out vector. + * Example : See out = __lasx_xvaddwl_w_h(in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvaddwl_h_bu(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvilvl_b(in_h, in_l); + out = __lasx_xvhaddw_hu_bu(out, out); + return out; +} + +/* + * ============================================================================= + * Description : The low half of the vector elements are expanded and + * added after being doubled. + * Arguments : Inputs - in_h, in_l + * Output - out + * Details : The in_l vector after double zero extension (unsigned byte to + * signed halfword),added to the in_h vector. + * Example : See out = __lasx_xvaddw_w_w_h(in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvaddw_h_h_bu(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvsllwil_hu_bu(in_l, 0); + out = __lasx_xvadd_h(in_h, out); + return out; +} + +/* + * ============================================================================= + * Description : The low half of the vector elements are expanded and + * added after being doubled. + * Arguments : Inputs - in_h, in_l + * Output - out + * Details : The in_l vector after double sign extension (signed halfword to + * signed word), added to the in_h vector. + * Example : out = __lasx_xvaddw_w_w_h(in_h, in_l) + * in_h : 0, 1,0,0, -1,0,0,1, + * in_l : 2,-1,1,2, 1,0,0,0, 0,0,1,0, 1,0,0,1, + * out : 2, 0,1,2, -1,0,1,1, + * ============================================================================= + */ +static inline __m256i __lasx_xvaddw_w_w_h(__m256i in_h, __m256i in_l) { + __m256i out; + + out = __lasx_xvsllwil_w_h(in_l, 0); + out = __lasx_xvadd_w(in_h, out); + return out; +} + +/* + * ============================================================================= + * Description : Multiplication and addition calculation after expansion + * of the lower half of the vector. + * Arguments : Inputs - in_c, in_h, in_l + * Output - out + * Details : The in_h vector and the in_l vector are multiplied after + * the lower half of the two-fold sign extension (signed halfword + * to signed word), and the result is added to the vector in_c, + * then stored to the out vector. + * Example : out = __lasx_xvmaddwl_w_h(in_c, in_h, in_l) + * in_c : 1,2,3,4, 5,6,7,8 + * in_h : 1,2,3,4, 1,2,3,4, 5,6,7,8, 5,6,7,8 + * in_l : 200, 300, 400, 500, 2000, 3000, 4000, 5000, + * -200,-300,-400,-500, -2000,-3000,-4000,-5000 + * out : 201, 602,1203,2004, -995, -1794,-2793,-3992 + * ============================================================================= + */ +static inline __m256i __lasx_xvmaddwl_w_h(__m256i in_c, + __m256i in_h, + __m256i in_l) { + __m256i tmp0, tmp1, out; + + tmp0 = __lasx_xvsllwil_w_h(in_h, 0); + tmp1 = __lasx_xvsllwil_w_h(in_l, 0); + tmp0 = __lasx_xvmul_w(tmp0, tmp1); + out = __lasx_xvadd_w(tmp0, in_c); + return out; +} + +/* + * ============================================================================= + * Description : Multiplication and addition calculation after expansion + * of the higher half of the vector. + * Arguments : Inputs - in_c, in_h, in_l + * Output - out + * Details : The in_h vector and the in_l vector are multiplied after + * the higher half of the two-fold sign extension (signed + * halfword to signed word), and the result is added to + * the vector in_c, then stored to the out vector. + * Example : See out = __lasx_xvmaddwl_w_h(in_c, in_h, in_l) + * ============================================================================= + */ +static inline __m256i __lasx_xvmaddwh_w_h(__m256i in_c, + __m256i in_h, + __m256i in_l) { + __m256i tmp0, tmp1, out; + + tmp0 = __lasx_xvilvh_h(in_h, in_h); + tmp1 = __lasx_xvilvh_h(in_l, in_l); + tmp0 = __lasx_xvmulwev_w_h(tmp0, tmp1); + out = __lasx_xvadd_w(tmp0, in_c); + return out; +} + +/* + * ============================================================================= + * Description : Multiplication calculation after expansion of the lower + * half of the vector. + * Arguments : Inputs - in_h, in_l + * Output - out + * Details : The in_h vector and the in_l vector are multiplied after + * the lower half of the two-fold sign extension (signed + * halfword to signed word), then stored to the out vector. + * Example : out = __lasx_xvmulwl_w_h(in_h, in_l) + * in_h : 3,-1,3,0, 0,0,0,-1, 0,0,1,-1, 0,0,0,1 + * in_l : 2,-1,1,2, 1,0,0, 0, 0,0,1, 0, 1,0,0,1 + * out : 6,1,3,0, 0,0,1,0 + * ============================================================================= + */ +static inline __m256i __lasx_xvmulwl_w_h(__m256i in_h, __m256i in_l) { + __m256i tmp0, tmp1, out; + + tmp0 = __lasx_xvsllwil_w_h(in_h, 0); + tmp1 = __lasx_xvsllwil_w_h(in_l, 0); + out = __lasx_xvmul_w(tmp0, tmp1); + return out; +} + +/* + * ============================================================================= + * Description : Multiplication calculation after expansion of the lower + * half of the vector. + * Arguments : Inputs - in_h, in_l + * Output - out + * Details : The in_h vector and the in_l vector are multiplied after + * the lower half of the two-fold sign extension (signed + * halfword to signed word), then stored to the out vector. + * Example : out = __lasx_xvmulwh_w_h(in_h, in_l) + * in_h : 3,-1,3,0, 0,0,0,-1, 0,0,1,-1, 0,0,0,1 + * in_l : 2,-1,1,2, 1,0,0, 0, 0,0,1, 0, 1,0,0,1 + * out : 0,0,0,0, 0,0,0,1 + * ============================================================================= + */ +static inline __m256i __lasx_xvmulwh_w_h(__m256i in_h, __m256i in_l) { + __m256i tmp0, tmp1, out; + + tmp0 = __lasx_xvilvh_h(in_h, in_h); + tmp1 = __lasx_xvilvh_h(in_l, in_l); + out = __lasx_xvmulwev_w_h(tmp0, tmp1); + return out; +} + +/* + * ============================================================================= + * Description : The low half of the vector elements are added to the high half + * after being doubled, then saturated. + * Arguments : Inputs - in_h, in_l + * Output - out + * Details : The in_h vector adds the in_l vector after the lower half of + * the two-fold zero extension (unsigned byte to unsigned + * halfword) and then saturated. The results are stored to the out + * vector. + * Example : out = __lasx_xvsaddw_hu_hu_bu(in_h, in_l) + * in_h : 2,65532,1,2, 1,0,0,0, 0,0,1,0, 1,0,0,1 + * in_l : 3,6,3,0, 0,0,0,1, 0,0,1,1, 0,0,0,1, 3,18,3,0, 0,0,0,1, 0,0,1,1, + * 0,0,0,1 + * out : 5,65535,4,2, 1,0,0,1, 3,18,4,0, 1,0,0,2, + * ============================================================================= + */ +static inline __m256i __lasx_xvsaddw_hu_hu_bu(__m256i in_h, __m256i in_l) { + __m256i tmp1, out; + __m256i zero = {0}; + + tmp1 = __lasx_xvilvl_b(zero, in_l); + out = __lasx_xvsadd_hu(in_h, tmp1); + return out; +} + +/* + * ============================================================================= + * Description : Clip all halfword elements of input vector between min & max + * out = ((in) < (min)) ? (min) : (((in) > (max)) ? (max) : (in)) + * Arguments : Inputs - in (input vector) + * - min (min threshold) + * - max (max threshold) + * Outputs - in (output vector with clipped elements) + * Return Type - signed halfword + * Example : out = __lasx_xvclip_h(in, min, max) + * in : -8,2,280,249, -8,255,280,249, 4,4,4,4, 5,5,5,5 + * min : 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1 + * max : 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9 + * out : 1,2,9,9, 1,9,9,9, 4,4,4,4, 5,5,5,5 + * ============================================================================= + */ +static inline __m256i __lasx_xvclip_h(__m256i in, __m256i min, __m256i max) { + __m256i out; + + out = __lasx_xvmax_h(min, in); + out = __lasx_xvmin_h(max, out); + return out; +} + +/* + * ============================================================================= + * Description : Clip all signed halfword elements of input vector + * between 0 & 255 + * Arguments : Inputs - in (input vector) + * Outputs - out (output vector with clipped elements) + * Return Type - signed halfword + * Example : See out = __lasx_xvclip255_w(in) + * ============================================================================= + */ +static inline __m256i __lasx_xvclip255_h(__m256i in) { + __m256i out; + + out = __lasx_xvmaxi_h(in, 0); + out = __lasx_xvsat_hu(out, 7); + return out; +} + +/* + * ============================================================================= + * Description : Clip all signed word elements of input vector + * between 0 & 255 + * Arguments : Inputs - in (input vector) + * Output - out (output vector with clipped elements) + * Return Type - signed word + * Example : out = __lasx_xvclip255_w(in) + * in : -8,255,280,249, -8,255,280,249 + * out : 0,255,255,249, 0,255,255,249 + * ============================================================================= + */ +static inline __m256i __lasx_xvclip255_w(__m256i in) { + __m256i out; + + out = __lasx_xvmaxi_w(in, 0); + out = __lasx_xvsat_wu(out, 7); + return out; +} + +/* + * ============================================================================= + * Description : Indexed halfword element values are replicated to all + * elements in output vector. If 'idx < 8' use xvsplati_l_*, + * if 'idx >= 8' use xvsplati_h_*. + * Arguments : Inputs - in, idx + * Output - out + * Details : Idx element value from in vector is replicated to all + * elements in out vector. + * Valid index range for halfword operation is 0-7 + * Example : out = __lasx_xvsplati_l_h(in, idx) + * in : 20,10,11,12, 13,14,15,16, 0,0,2,0, 0,0,0,0 + * idx : 0x02 + * out : 11,11,11,11, 11,11,11,11, 11,11,11,11, 11,11,11,11 + * ============================================================================= + */ +static inline __m256i __lasx_xvsplati_l_h(__m256i in, int idx) { + __m256i out; + + out = __lasx_xvpermi_q(in, in, 0x02); + out = __lasx_xvreplve_h(out, idx); + return out; +} + +/* + * ============================================================================= + * Description : Indexed halfword element values are replicated to all + * elements in output vector. If 'idx < 8' use xvsplati_l_*, + * if 'idx >= 8' use xvsplati_h_*. + * Arguments : Inputs - in, idx + * Output - out + * Details : Idx element value from in vector is replicated to all + * elements in out vector. + * Valid index range for halfword operation is 0-7 + * Example : out = __lasx_xvsplati_h_h(in, idx) + * in : 20,10,11,12, 13,14,15,16, 0,2,0,0, 0,0,0,0 + * idx : 0x09 + * out : 2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2 + * ============================================================================= + */ +static inline __m256i __lasx_xvsplati_h_h(__m256i in, int idx) { + __m256i out; + + out = __lasx_xvpermi_q(in, in, 0x13); + out = __lasx_xvreplve_h(out, idx); + return out; +} + +/* + * ============================================================================= + * Description : Transpose 4x4 block with double-word elements in vectors + * Arguments : Inputs - _in0, _in1, _in2, _in3 + * Outputs - _out0, _out1, _out2, _out3 + * Example : LASX_TRANSPOSE4x4_D + * _in0 : 1,2,3,4 + * _in1 : 1,2,3,4 + * _in2 : 1,2,3,4 + * _in3 : 1,2,3,4 + * + * _out0 : 1,1,1,1 + * _out1 : 2,2,2,2 + * _out2 : 3,3,3,3 + * _out3 : 4,4,4,4 + * ============================================================================= + */ +#define LASX_TRANSPOSE4x4_D(_in0, _in1, _in2, _in3, _out0, _out1, _out2, \ + _out3) \ + { \ + __m256i _tmp0, _tmp1, _tmp2, _tmp3; \ + _tmp0 = __lasx_xvilvl_d(_in1, _in0); \ + _tmp1 = __lasx_xvilvh_d(_in1, _in0); \ + _tmp2 = __lasx_xvilvl_d(_in3, _in2); \ + _tmp3 = __lasx_xvilvh_d(_in3, _in2); \ + _out0 = __lasx_xvpermi_q(_tmp2, _tmp0, 0x20); \ + _out2 = __lasx_xvpermi_q(_tmp2, _tmp0, 0x31); \ + _out1 = __lasx_xvpermi_q(_tmp3, _tmp1, 0x20); \ + _out3 = __lasx_xvpermi_q(_tmp3, _tmp1, 0x31); \ + } + +/* + * ============================================================================= + * Description : Transpose 8x8 block with word elements in vectors + * Arguments : Inputs - _in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7 + * Outputs - _out0, _out1, _out2, _out3, _out4, _out5, _out6, + * _out7 + * Example : LASX_TRANSPOSE8x8_W + * _in0 : 1,2,3,4,5,6,7,8 + * _in1 : 2,2,3,4,5,6,7,8 + * _in2 : 3,2,3,4,5,6,7,8 + * _in3 : 4,2,3,4,5,6,7,8 + * _in4 : 5,2,3,4,5,6,7,8 + * _in5 : 6,2,3,4,5,6,7,8 + * _in6 : 7,2,3,4,5,6,7,8 + * _in7 : 8,2,3,4,5,6,7,8 + * + * _out0 : 1,2,3,4,5,6,7,8 + * _out1 : 2,2,2,2,2,2,2,2 + * _out2 : 3,3,3,3,3,3,3,3 + * _out3 : 4,4,4,4,4,4,4,4 + * _out4 : 5,5,5,5,5,5,5,5 + * _out5 : 6,6,6,6,6,6,6,6 + * _out6 : 7,7,7,7,7,7,7,7 + * _out7 : 8,8,8,8,8,8,8,8 + * ============================================================================= + */ +#define LASX_TRANSPOSE8x8_W(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + __m256i _s0_m, _s1_m; \ + __m256i _tmp0_m, _tmp1_m, _tmp2_m, _tmp3_m; \ + __m256i _tmp4_m, _tmp5_m, _tmp6_m, _tmp7_m; \ + \ + _s0_m = __lasx_xvilvl_w(_in2, _in0); \ + _s1_m = __lasx_xvilvl_w(_in3, _in1); \ + _tmp0_m = __lasx_xvilvl_w(_s1_m, _s0_m); \ + _tmp1_m = __lasx_xvilvh_w(_s1_m, _s0_m); \ + _s0_m = __lasx_xvilvh_w(_in2, _in0); \ + _s1_m = __lasx_xvilvh_w(_in3, _in1); \ + _tmp2_m = __lasx_xvilvl_w(_s1_m, _s0_m); \ + _tmp3_m = __lasx_xvilvh_w(_s1_m, _s0_m); \ + _s0_m = __lasx_xvilvl_w(_in6, _in4); \ + _s1_m = __lasx_xvilvl_w(_in7, _in5); \ + _tmp4_m = __lasx_xvilvl_w(_s1_m, _s0_m); \ + _tmp5_m = __lasx_xvilvh_w(_s1_m, _s0_m); \ + _s0_m = __lasx_xvilvh_w(_in6, _in4); \ + _s1_m = __lasx_xvilvh_w(_in7, _in5); \ + _tmp6_m = __lasx_xvilvl_w(_s1_m, _s0_m); \ + _tmp7_m = __lasx_xvilvh_w(_s1_m, _s0_m); \ + _out0 = __lasx_xvpermi_q(_tmp4_m, _tmp0_m, 0x20); \ + _out1 = __lasx_xvpermi_q(_tmp5_m, _tmp1_m, 0x20); \ + _out2 = __lasx_xvpermi_q(_tmp6_m, _tmp2_m, 0x20); \ + _out3 = __lasx_xvpermi_q(_tmp7_m, _tmp3_m, 0x20); \ + _out4 = __lasx_xvpermi_q(_tmp4_m, _tmp0_m, 0x31); \ + _out5 = __lasx_xvpermi_q(_tmp5_m, _tmp1_m, 0x31); \ + _out6 = __lasx_xvpermi_q(_tmp6_m, _tmp2_m, 0x31); \ + _out7 = __lasx_xvpermi_q(_tmp7_m, _tmp3_m, 0x31); \ + } + +/* + * ============================================================================= + * Description : Transpose input 16x8 byte block + * Arguments : Inputs - _in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, + * _in8, _in9, _in10, _in11, _in12, _in13, _in14, _in15 + * (input 16x8 byte block) + * Outputs - _out0, _out1, _out2, _out3, _out4, _out5, _out6, + * _out7 (output 8x16 byte block) + * Details : The rows of the matrix become columns, and the columns become + * rows. + * Example : See LASX_TRANSPOSE16x8_H + * ============================================================================= + */ +#define LASX_TRANSPOSE16x8_B(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _in8, _in9, _in10, _in11, _in12, _in13, _in14, \ + _in15, _out0, _out1, _out2, _out3, _out4, _out5, \ + _out6, _out7) \ + { \ + __m256i _tmp0_m, _tmp1_m, _tmp2_m, _tmp3_m; \ + __m256i _tmp4_m, _tmp5_m, _tmp6_m, _tmp7_m; \ + \ + _tmp0_m = __lasx_xvilvl_b(_in2, _in0); \ + _tmp1_m = __lasx_xvilvl_b(_in3, _in1); \ + _tmp2_m = __lasx_xvilvl_b(_in6, _in4); \ + _tmp3_m = __lasx_xvilvl_b(_in7, _in5); \ + _tmp4_m = __lasx_xvilvl_b(_in10, _in8); \ + _tmp5_m = __lasx_xvilvl_b(_in11, _in9); \ + _tmp6_m = __lasx_xvilvl_b(_in14, _in12); \ + _tmp7_m = __lasx_xvilvl_b(_in15, _in13); \ + _out0 = __lasx_xvilvl_b(_tmp1_m, _tmp0_m); \ + _out1 = __lasx_xvilvh_b(_tmp1_m, _tmp0_m); \ + _out2 = __lasx_xvilvl_b(_tmp3_m, _tmp2_m); \ + _out3 = __lasx_xvilvh_b(_tmp3_m, _tmp2_m); \ + _out4 = __lasx_xvilvl_b(_tmp5_m, _tmp4_m); \ + _out5 = __lasx_xvilvh_b(_tmp5_m, _tmp4_m); \ + _out6 = __lasx_xvilvl_b(_tmp7_m, _tmp6_m); \ + _out7 = __lasx_xvilvh_b(_tmp7_m, _tmp6_m); \ + _tmp0_m = __lasx_xvilvl_w(_out2, _out0); \ + _tmp2_m = __lasx_xvilvh_w(_out2, _out0); \ + _tmp4_m = __lasx_xvilvl_w(_out3, _out1); \ + _tmp6_m = __lasx_xvilvh_w(_out3, _out1); \ + _tmp1_m = __lasx_xvilvl_w(_out6, _out4); \ + _tmp3_m = __lasx_xvilvh_w(_out6, _out4); \ + _tmp5_m = __lasx_xvilvl_w(_out7, _out5); \ + _tmp7_m = __lasx_xvilvh_w(_out7, _out5); \ + _out0 = __lasx_xvilvl_d(_tmp1_m, _tmp0_m); \ + _out1 = __lasx_xvilvh_d(_tmp1_m, _tmp0_m); \ + _out2 = __lasx_xvilvl_d(_tmp3_m, _tmp2_m); \ + _out3 = __lasx_xvilvh_d(_tmp3_m, _tmp2_m); \ + _out4 = __lasx_xvilvl_d(_tmp5_m, _tmp4_m); \ + _out5 = __lasx_xvilvh_d(_tmp5_m, _tmp4_m); \ + _out6 = __lasx_xvilvl_d(_tmp7_m, _tmp6_m); \ + _out7 = __lasx_xvilvh_d(_tmp7_m, _tmp6_m); \ + } + +/* + * ============================================================================= + * Description : Transpose input 16x8 byte block + * Arguments : Inputs - _in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, + * _in8, _in9, _in10, _in11, _in12, _in13, _in14, _in15 + * (input 16x8 byte block) + * Outputs - _out0, _out1, _out2, _out3, _out4, _out5, _out6, + * _out7 (output 8x16 byte block) + * Details : The rows of the matrix become columns, and the columns become + * rows. + * Example : LASX_TRANSPOSE16x8_H + * _in0 : 1,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in1 : 2,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in2 : 3,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in3 : 4,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in4 : 5,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in5 : 6,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in6 : 7,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in7 : 8,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in8 : 9,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in9 : 1,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in10 : 0,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in11 : 2,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in12 : 3,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in13 : 7,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in14 : 5,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * _in15 : 6,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0 + * + * _out0 : 1,2,3,4,5,6,7,8,9,1,0,2,3,7,5,6 + * _out1 : 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 + * _out2 : 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 + * _out3 : 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 + * _out4 : 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 + * _out5 : 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 + * _out6 : 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + * _out7 : 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 + * ============================================================================= + */ +#define LASX_TRANSPOSE16x8_H(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _in8, _in9, _in10, _in11, _in12, _in13, _in14, \ + _in15, _out0, _out1, _out2, _out3, _out4, _out5, \ + _out6, _out7) \ + { \ + __m256i _tmp0_m, _tmp1_m, _tmp2_m, _tmp3_m; \ + __m256i _tmp4_m, _tmp5_m, _tmp6_m, _tmp7_m; \ + __m256i _t0, _t1, _t2, _t3, _t4, _t5, _t6, _t7; \ + \ + _tmp0_m = __lasx_xvilvl_h(_in2, _in0); \ + _tmp1_m = __lasx_xvilvl_h(_in3, _in1); \ + _tmp2_m = __lasx_xvilvl_h(_in6, _in4); \ + _tmp3_m = __lasx_xvilvl_h(_in7, _in5); \ + _tmp4_m = __lasx_xvilvl_h(_in10, _in8); \ + _tmp5_m = __lasx_xvilvl_h(_in11, _in9); \ + _tmp6_m = __lasx_xvilvl_h(_in14, _in12); \ + _tmp7_m = __lasx_xvilvl_h(_in15, _in13); \ + _t0 = __lasx_xvilvl_h(_tmp1_m, _tmp0_m); \ + _t1 = __lasx_xvilvh_h(_tmp1_m, _tmp0_m); \ + _t2 = __lasx_xvilvl_h(_tmp3_m, _tmp2_m); \ + _t3 = __lasx_xvilvh_h(_tmp3_m, _tmp2_m); \ + _t4 = __lasx_xvilvl_h(_tmp5_m, _tmp4_m); \ + _t5 = __lasx_xvilvh_h(_tmp5_m, _tmp4_m); \ + _t6 = __lasx_xvilvl_h(_tmp7_m, _tmp6_m); \ + _t7 = __lasx_xvilvh_h(_tmp7_m, _tmp6_m); \ + _tmp0_m = __lasx_xvilvl_d(_t2, _t0); \ + _tmp2_m = __lasx_xvilvh_d(_t2, _t0); \ + _tmp4_m = __lasx_xvilvl_d(_t3, _t1); \ + _tmp6_m = __lasx_xvilvh_d(_t3, _t1); \ + _tmp1_m = __lasx_xvilvl_d(_t6, _t4); \ + _tmp3_m = __lasx_xvilvh_d(_t6, _t4); \ + _tmp5_m = __lasx_xvilvl_d(_t7, _t5); \ + _tmp7_m = __lasx_xvilvh_d(_t7, _t5); \ + _out0 = __lasx_xvpermi_q(_tmp1_m, _tmp0_m, 0x20); \ + _out1 = __lasx_xvpermi_q(_tmp3_m, _tmp2_m, 0x20); \ + _out2 = __lasx_xvpermi_q(_tmp5_m, _tmp4_m, 0x20); \ + _out3 = __lasx_xvpermi_q(_tmp7_m, _tmp6_m, 0x20); \ + \ + _tmp0_m = __lasx_xvilvh_h(_in2, _in0); \ + _tmp1_m = __lasx_xvilvh_h(_in3, _in1); \ + _tmp2_m = __lasx_xvilvh_h(_in6, _in4); \ + _tmp3_m = __lasx_xvilvh_h(_in7, _in5); \ + _tmp4_m = __lasx_xvilvh_h(_in10, _in8); \ + _tmp5_m = __lasx_xvilvh_h(_in11, _in9); \ + _tmp6_m = __lasx_xvilvh_h(_in14, _in12); \ + _tmp7_m = __lasx_xvilvh_h(_in15, _in13); \ + _t0 = __lasx_xvilvl_h(_tmp1_m, _tmp0_m); \ + _t1 = __lasx_xvilvh_h(_tmp1_m, _tmp0_m); \ + _t2 = __lasx_xvilvl_h(_tmp3_m, _tmp2_m); \ + _t3 = __lasx_xvilvh_h(_tmp3_m, _tmp2_m); \ + _t4 = __lasx_xvilvl_h(_tmp5_m, _tmp4_m); \ + _t5 = __lasx_xvilvh_h(_tmp5_m, _tmp4_m); \ + _t6 = __lasx_xvilvl_h(_tmp7_m, _tmp6_m); \ + _t7 = __lasx_xvilvh_h(_tmp7_m, _tmp6_m); \ + _tmp0_m = __lasx_xvilvl_d(_t2, _t0); \ + _tmp2_m = __lasx_xvilvh_d(_t2, _t0); \ + _tmp4_m = __lasx_xvilvl_d(_t3, _t1); \ + _tmp6_m = __lasx_xvilvh_d(_t3, _t1); \ + _tmp1_m = __lasx_xvilvl_d(_t6, _t4); \ + _tmp3_m = __lasx_xvilvh_d(_t6, _t4); \ + _tmp5_m = __lasx_xvilvl_d(_t7, _t5); \ + _tmp7_m = __lasx_xvilvh_d(_t7, _t5); \ + _out4 = __lasx_xvpermi_q(_tmp1_m, _tmp0_m, 0x20); \ + _out5 = __lasx_xvpermi_q(_tmp3_m, _tmp2_m, 0x20); \ + _out6 = __lasx_xvpermi_q(_tmp5_m, _tmp4_m, 0x20); \ + _out7 = __lasx_xvpermi_q(_tmp7_m, _tmp6_m, 0x20); \ + } + +/* + * ============================================================================= + * Description : Transpose 4x4 block with halfword elements in vectors + * Arguments : Inputs - _in0, _in1, _in2, _in3 + * Outputs - _out0, _out1, _out2, _out3 + * Return Type - signed halfword + * Details : The rows of the matrix become columns, and the columns become + * rows. + * Example : See LASX_TRANSPOSE8x8_H + * ============================================================================= + */ +#define LASX_TRANSPOSE4x4_H(_in0, _in1, _in2, _in3, _out0, _out1, _out2, \ + _out3) \ + { \ + __m256i _s0_m, _s1_m; \ + \ + _s0_m = __lasx_xvilvl_h(_in1, _in0); \ + _s1_m = __lasx_xvilvl_h(_in3, _in2); \ + _out0 = __lasx_xvilvl_w(_s1_m, _s0_m); \ + _out2 = __lasx_xvilvh_w(_s1_m, _s0_m); \ + _out1 = __lasx_xvilvh_d(_out0, _out0); \ + _out3 = __lasx_xvilvh_d(_out2, _out2); \ + } + +/* + * ============================================================================= + * Description : Transpose input 8x8 byte block + * Arguments : Inputs - _in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7 + * (input 8x8 byte block) + * Outputs - _out0, _out1, _out2, _out3, _out4, _out5, _out6, + * _out7 (output 8x8 byte block) + * Example : See LASX_TRANSPOSE8x8_H + * ============================================================================= + */ +#define LASX_TRANSPOSE8x8_B(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + __m256i _tmp0_m, _tmp1_m, _tmp2_m, _tmp3_m; \ + __m256i _tmp4_m, _tmp5_m, _tmp6_m, _tmp7_m; \ + _tmp0_m = __lasx_xvilvl_b(_in2, _in0); \ + _tmp1_m = __lasx_xvilvl_b(_in3, _in1); \ + _tmp2_m = __lasx_xvilvl_b(_in6, _in4); \ + _tmp3_m = __lasx_xvilvl_b(_in7, _in5); \ + _tmp4_m = __lasx_xvilvl_b(_tmp1_m, _tmp0_m); \ + _tmp5_m = __lasx_xvilvh_b(_tmp1_m, _tmp0_m); \ + _tmp6_m = __lasx_xvilvl_b(_tmp3_m, _tmp2_m); \ + _tmp7_m = __lasx_xvilvh_b(_tmp3_m, _tmp2_m); \ + _out0 = __lasx_xvilvl_w(_tmp6_m, _tmp4_m); \ + _out2 = __lasx_xvilvh_w(_tmp6_m, _tmp4_m); \ + _out4 = __lasx_xvilvl_w(_tmp7_m, _tmp5_m); \ + _out6 = __lasx_xvilvh_w(_tmp7_m, _tmp5_m); \ + _out1 = __lasx_xvbsrl_v(_out0, 8); \ + _out3 = __lasx_xvbsrl_v(_out2, 8); \ + _out5 = __lasx_xvbsrl_v(_out4, 8); \ + _out7 = __lasx_xvbsrl_v(_out6, 8); \ + } + +/* + * ============================================================================= + * Description : Transpose 8x8 block with halfword elements in vectors. + * Arguments : Inputs - _in0, _in1, ~ + * Outputs - _out0, _out1, ~ + * Details : The rows of the matrix become columns, and the columns become + * rows. + * Example : LASX_TRANSPOSE8x8_H + * _in0 : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * _in1 : 8,2,3,4, 5,6,7,8, 8,2,3,4, 5,6,7,8 + * _in2 : 8,2,3,4, 5,6,7,8, 8,2,3,4, 5,6,7,8 + * _in3 : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * _in4 : 9,2,3,4, 5,6,7,8, 9,2,3,4, 5,6,7,8 + * _in5 : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * _in6 : 1,2,3,4, 5,6,7,8, 1,2,3,4, 5,6,7,8 + * _in7 : 9,2,3,4, 5,6,7,8, 9,2,3,4, 5,6,7,8 + * + * _out0 : 1,8,8,1, 9,1,1,9, 1,8,8,1, 9,1,1,9 + * _out1 : 2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2 + * _out2 : 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3 + * _out3 : 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4 + * _out4 : 5,5,5,5, 5,5,5,5, 5,5,5,5, 5,5,5,5 + * _out5 : 6,6,6,6, 6,6,6,6, 6,6,6,6, 6,6,6,6 + * _out6 : 7,7,7,7, 7,7,7,7, 7,7,7,7, 7,7,7,7 + * _out7 : 8,8,8,8, 8,8,8,8, 8,8,8,8, 8,8,8,8 + * ============================================================================= + */ +#define LASX_TRANSPOSE8x8_H(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + __m256i _s0_m, _s1_m; \ + __m256i _tmp0_m, _tmp1_m, _tmp2_m, _tmp3_m; \ + __m256i _tmp4_m, _tmp5_m, _tmp6_m, _tmp7_m; \ + \ + _s0_m = __lasx_xvilvl_h(_in6, _in4); \ + _s1_m = __lasx_xvilvl_h(_in7, _in5); \ + _tmp0_m = __lasx_xvilvl_h(_s1_m, _s0_m); \ + _tmp1_m = __lasx_xvilvh_h(_s1_m, _s0_m); \ + _s0_m = __lasx_xvilvh_h(_in6, _in4); \ + _s1_m = __lasx_xvilvh_h(_in7, _in5); \ + _tmp2_m = __lasx_xvilvl_h(_s1_m, _s0_m); \ + _tmp3_m = __lasx_xvilvh_h(_s1_m, _s0_m); \ + \ + _s0_m = __lasx_xvilvl_h(_in2, _in0); \ + _s1_m = __lasx_xvilvl_h(_in3, _in1); \ + _tmp4_m = __lasx_xvilvl_h(_s1_m, _s0_m); \ + _tmp5_m = __lasx_xvilvh_h(_s1_m, _s0_m); \ + _s0_m = __lasx_xvilvh_h(_in2, _in0); \ + _s1_m = __lasx_xvilvh_h(_in3, _in1); \ + _tmp6_m = __lasx_xvilvl_h(_s1_m, _s0_m); \ + _tmp7_m = __lasx_xvilvh_h(_s1_m, _s0_m); \ + \ + _out0 = __lasx_xvpickev_d(_tmp0_m, _tmp4_m); \ + _out2 = __lasx_xvpickev_d(_tmp1_m, _tmp5_m); \ + _out4 = __lasx_xvpickev_d(_tmp2_m, _tmp6_m); \ + _out6 = __lasx_xvpickev_d(_tmp3_m, _tmp7_m); \ + _out1 = __lasx_xvpickod_d(_tmp0_m, _tmp4_m); \ + _out3 = __lasx_xvpickod_d(_tmp1_m, _tmp5_m); \ + _out5 = __lasx_xvpickod_d(_tmp2_m, _tmp6_m); \ + _out7 = __lasx_xvpickod_d(_tmp3_m, _tmp7_m); \ + } + +/* + * ============================================================================= + * Description : Butterfly of 4 input vectors + * Arguments : Inputs - _in0, _in1, _in2, _in3 + * Outputs - _out0, _out1, _out2, _out3 + * Details : Butterfly operation + * Example : LASX_BUTTERFLY_4 + * _out0 = _in0 + _in3; + * _out1 = _in1 + _in2; + * _out2 = _in1 - _in2; + * _out3 = _in0 - _in3; + * ============================================================================= + */ +#define LASX_BUTTERFLY_4_B(_in0, _in1, _in2, _in3, _out0, _out1, _out2, _out3) \ + { \ + _out0 = __lasx_xvadd_b(_in0, _in3); \ + _out1 = __lasx_xvadd_b(_in1, _in2); \ + _out2 = __lasx_xvsub_b(_in1, _in2); \ + _out3 = __lasx_xvsub_b(_in0, _in3); \ + } +#define LASX_BUTTERFLY_4_H(_in0, _in1, _in2, _in3, _out0, _out1, _out2, _out3) \ + { \ + _out0 = __lasx_xvadd_h(_in0, _in3); \ + _out1 = __lasx_xvadd_h(_in1, _in2); \ + _out2 = __lasx_xvsub_h(_in1, _in2); \ + _out3 = __lasx_xvsub_h(_in0, _in3); \ + } +#define LASX_BUTTERFLY_4_W(_in0, _in1, _in2, _in3, _out0, _out1, _out2, _out3) \ + { \ + _out0 = __lasx_xvadd_w(_in0, _in3); \ + _out1 = __lasx_xvadd_w(_in1, _in2); \ + _out2 = __lasx_xvsub_w(_in1, _in2); \ + _out3 = __lasx_xvsub_w(_in0, _in3); \ + } +#define LASX_BUTTERFLY_4_D(_in0, _in1, _in2, _in3, _out0, _out1, _out2, _out3) \ + { \ + _out0 = __lasx_xvadd_d(_in0, _in3); \ + _out1 = __lasx_xvadd_d(_in1, _in2); \ + _out2 = __lasx_xvsub_d(_in1, _in2); \ + _out3 = __lasx_xvsub_d(_in0, _in3); \ + } + +/* + * ============================================================================= + * Description : Butterfly of 8 input vectors + * Arguments : Inputs - _in0, _in1, _in2, _in3, ~ + * Outputs - _out0, _out1, _out2, _out3, ~ + * Details : Butterfly operation + * Example : LASX_BUTTERFLY_8 + * _out0 = _in0 + _in7; + * _out1 = _in1 + _in6; + * _out2 = _in2 + _in5; + * _out3 = _in3 + _in4; + * _out4 = _in3 - _in4; + * _out5 = _in2 - _in5; + * _out6 = _in1 - _in6; + * _out7 = _in0 - _in7; + * ============================================================================= + */ +#define LASX_BUTTERFLY_8_B(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + _out0 = __lasx_xvadd_b(_in0, _in7); \ + _out1 = __lasx_xvadd_b(_in1, _in6); \ + _out2 = __lasx_xvadd_b(_in2, _in5); \ + _out3 = __lasx_xvadd_b(_in3, _in4); \ + _out4 = __lasx_xvsub_b(_in3, _in4); \ + _out5 = __lasx_xvsub_b(_in2, _in5); \ + _out6 = __lasx_xvsub_b(_in1, _in6); \ + _out7 = __lasx_xvsub_b(_in0, _in7); \ + } + +#define LASX_BUTTERFLY_8_H(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + _out0 = __lasx_xvadd_h(_in0, _in7); \ + _out1 = __lasx_xvadd_h(_in1, _in6); \ + _out2 = __lasx_xvadd_h(_in2, _in5); \ + _out3 = __lasx_xvadd_h(_in3, _in4); \ + _out4 = __lasx_xvsub_h(_in3, _in4); \ + _out5 = __lasx_xvsub_h(_in2, _in5); \ + _out6 = __lasx_xvsub_h(_in1, _in6); \ + _out7 = __lasx_xvsub_h(_in0, _in7); \ + } + +#define LASX_BUTTERFLY_8_W(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + _out0 = __lasx_xvadd_w(_in0, _in7); \ + _out1 = __lasx_xvadd_w(_in1, _in6); \ + _out2 = __lasx_xvadd_w(_in2, _in5); \ + _out3 = __lasx_xvadd_w(_in3, _in4); \ + _out4 = __lasx_xvsub_w(_in3, _in4); \ + _out5 = __lasx_xvsub_w(_in2, _in5); \ + _out6 = __lasx_xvsub_w(_in1, _in6); \ + _out7 = __lasx_xvsub_w(_in0, _in7); \ + } + +#define LASX_BUTTERFLY_8_D(_in0, _in1, _in2, _in3, _in4, _in5, _in6, _in7, \ + _out0, _out1, _out2, _out3, _out4, _out5, _out6, \ + _out7) \ + { \ + _out0 = __lasx_xvadd_d(_in0, _in7); \ + _out1 = __lasx_xvadd_d(_in1, _in6); \ + _out2 = __lasx_xvadd_d(_in2, _in5); \ + _out3 = __lasx_xvadd_d(_in3, _in4); \ + _out4 = __lasx_xvsub_d(_in3, _in4); \ + _out5 = __lasx_xvsub_d(_in2, _in5); \ + _out6 = __lasx_xvsub_d(_in1, _in6); \ + _out7 = __lasx_xvsub_d(_in0, _in7); \ + } + +#endif // LASX + +/* + * ============================================================================= + * Description : Print out elements in vector. + * Arguments : Inputs - RTYPE, _element_num, _in0, _enter + * Outputs - + * Details : Print out '_element_num' elements in 'RTYPE' vector '_in0', if + * '_enter' is TRUE, prefix "\nVP:" will be added first. + * Example : VECT_PRINT(v4i32,4,in0,1); // in0: 1,2,3,4 + * VP:1,2,3,4, + * ============================================================================= + */ +#define VECT_PRINT(RTYPE, element_num, in0, enter) \ + { \ + RTYPE _tmp0 = (RTYPE)in0; \ + int _i = 0; \ + if (enter) \ + printf("\nVP:"); \ + for (_i = 0; _i < element_num; _i++) \ + printf("%d,", _tmp0[_i]); \ + } + +#endif /* LOONGSON_INTRINSICS_H */ +#endif /* INCLUDE_LIBYUV_LOONGSON_INTRINSICS_H */ diff --git a/third_party/libyuv/include/libyuv/macros_msa.h b/third_party/libyuv/include/libyuv/macros_msa.h index 92ed21c385..b9a44fcced 100644 --- a/third_party/libyuv/include/libyuv/macros_msa.h +++ b/third_party/libyuv/include/libyuv/macros_msa.h @@ -12,15 +12,153 @@ #define INCLUDE_LIBYUV_MACROS_MSA_H_ #if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) -#include #include +#include + +#if (__mips_isa_rev >= 6) +#define LW(psrc) \ + ({ \ + const uint8_t* psrc_lw_m = (const uint8_t*)(psrc); \ + uint32_t val_m; \ + asm volatile("lw %[val_m], %[psrc_lw_m] \n" \ + : [val_m] "=r"(val_m) \ + : [psrc_lw_m] "m"(*psrc_lw_m)); \ + val_m; \ + }) + +#if (__mips == 64) +#define LD(psrc) \ + ({ \ + const uint8_t* psrc_ld_m = (const uint8_t*)(psrc); \ + uint64_t val_m = 0; \ + asm volatile("ld %[val_m], %[psrc_ld_m] \n" \ + : [val_m] "=r"(val_m) \ + : [psrc_ld_m] "m"(*psrc_ld_m)); \ + val_m; \ + }) +#else // !(__mips == 64) +#define LD(psrc) \ + ({ \ + const uint8_t* psrc_ld_m = (const uint8_t*)(psrc); \ + uint32_t val0_m, val1_m; \ + uint64_t val_m = 0; \ + val0_m = LW(psrc_ld_m); \ + val1_m = LW(psrc_ld_m + 4); \ + val_m = (uint64_t)(val1_m); /* NOLINT */ \ + val_m = (uint64_t)((val_m << 32) & 0xFFFFFFFF00000000); /* NOLINT */ \ + val_m = (uint64_t)(val_m | (uint64_t)val0_m); /* NOLINT */ \ + val_m; \ + }) +#endif // (__mips == 64) + +#define SW(val, pdst) \ + ({ \ + uint8_t* pdst_sw_m = (uint8_t*)(pdst); /* NOLINT */ \ + uint32_t val_m = (val); \ + asm volatile("sw %[val_m], %[pdst_sw_m] \n" \ + : [pdst_sw_m] "=m"(*pdst_sw_m) \ + : [val_m] "r"(val_m)); \ + }) + +#if (__mips == 64) +#define SD(val, pdst) \ + ({ \ + uint8_t* pdst_sd_m = (uint8_t*)(pdst); /* NOLINT */ \ + uint64_t val_m = (val); \ + asm volatile("sd %[val_m], %[pdst_sd_m] \n" \ + : [pdst_sd_m] "=m"(*pdst_sd_m) \ + : [val_m] "r"(val_m)); \ + }) +#else // !(__mips == 64) +#define SD(val, pdst) \ + ({ \ + uint8_t* pdst_sd_m = (uint8_t*)(pdst); /* NOLINT */ \ + uint32_t val0_m, val1_m; \ + val0_m = (uint32_t)((val)&0x00000000FFFFFFFF); \ + val1_m = (uint32_t)(((val) >> 32) & 0x00000000FFFFFFFF); \ + SW(val0_m, pdst_sd_m); \ + SW(val1_m, pdst_sd_m + 4); \ + }) +#endif // !(__mips == 64) +#else // !(__mips_isa_rev >= 6) +#define LW(psrc) \ + ({ \ + uint8_t* psrc_lw_m = (uint8_t*)(psrc); \ + uint32_t val_lw_m; \ + \ + __asm__ volatile( \ + "lwr %[val_lw_m], 0(%[psrc_lw_m]) \n\t" \ + "lwl %[val_lw_m], 3(%[psrc_lw_m]) \n\t" \ + \ + : [val_lw_m] "=&r"(val_lw_m) \ + : [psrc_lw_m] "r"(psrc_lw_m)); \ + \ + val_lw_m; \ + }) -#define LD_B(RTYPE, psrc) *((RTYPE*)(psrc)) /* NOLINT */ -#define LD_UB(...) LD_B(v16u8, __VA_ARGS__) +#if (__mips == 64) +#define LD(psrc) \ + ({ \ + uint8_t* psrc_ld_m = (uint8_t*)(psrc); \ + uint64_t val_ld_m = 0; \ + \ + __asm__ volatile( \ + "ldr %[val_ld_m], 0(%[psrc_ld_m]) \n\t" \ + "ldl %[val_ld_m], 7(%[psrc_ld_m]) \n\t" \ + \ + : [val_ld_m] "=&r"(val_ld_m) \ + : [psrc_ld_m] "r"(psrc_ld_m)); \ + \ + val_ld_m; \ + }) +#else // !(__mips == 64) +#define LD(psrc) \ + ({ \ + const uint8_t* psrc_ld_m = (const uint8_t*)(psrc); \ + uint32_t val0_m, val1_m; \ + uint64_t val_m = 0; \ + val0_m = LW(psrc_ld_m); \ + val1_m = LW(psrc_ld_m + 4); \ + val_m = (uint64_t)(val1_m); /* NOLINT */ \ + val_m = (uint64_t)((val_m << 32) & 0xFFFFFFFF00000000); /* NOLINT */ \ + val_m = (uint64_t)(val_m | (uint64_t)val0_m); /* NOLINT */ \ + val_m; \ + }) +#endif // (__mips == 64) -#define ST_B(RTYPE, in, pdst) *((RTYPE*)(pdst)) = (in) /* NOLINT */ +#define SW(val, pdst) \ + ({ \ + uint8_t* pdst_sw_m = (uint8_t*)(pdst); /* NOLINT */ \ + uint32_t val_m = (val); \ + asm volatile("usw %[val_m], %[pdst_sw_m] \n" \ + : [pdst_sw_m] "=m"(*pdst_sw_m) \ + : [val_m] "r"(val_m)); \ + }) + +#define SD(val, pdst) \ + ({ \ + uint8_t* pdst_sd_m = (uint8_t*)(pdst); /* NOLINT */ \ + uint32_t val0_m, val1_m; \ + val0_m = (uint32_t)((val)&0x00000000FFFFFFFF); \ + val1_m = (uint32_t)(((val) >> 32) & 0x00000000FFFFFFFF); \ + SW(val0_m, pdst_sd_m); \ + SW(val1_m, pdst_sd_m + 4); \ + }) +#endif // (__mips_isa_rev >= 6) + +// TODO(fbarchard): Consider removing __VAR_ARGS versions. +#define LD_B(RTYPE, psrc) *((RTYPE*)(psrc)) /* NOLINT */ +#define LD_UB(...) LD_B(const v16u8, __VA_ARGS__) + +#define LD_H(RTYPE, psrc) *((RTYPE*)(psrc)) /* NOLINT */ +#define LD_UH(...) LD_H(const v8u16, __VA_ARGS__) + +#define ST_B(RTYPE, in, pdst) *((RTYPE*)(pdst)) = (in) /* NOLINT */ #define ST_UB(...) ST_B(v16u8, __VA_ARGS__) +#define ST_H(RTYPE, in, pdst) *((RTYPE*)(pdst)) = (in) /* NOLINT */ +#define ST_UH(...) ST_H(v8u16, __VA_ARGS__) + /* Description : Load two vectors with 16 'byte' sized elements Arguments : Inputs - psrc, stride Outputs - out0, out1 @@ -28,17 +166,19 @@ Details : Load 16 byte elements in 'out0' from (psrc) Load 16 byte elements in 'out1' from (psrc + stride) */ -#define LD_B2(RTYPE, psrc, stride, out0, out1) { \ - out0 = LD_B(RTYPE, (psrc)); \ - out1 = LD_B(RTYPE, (psrc) + stride); \ -} -#define LD_UB2(...) LD_B2(v16u8, __VA_ARGS__) - -#define LD_B4(RTYPE, psrc, stride, out0, out1, out2, out3) { \ - LD_B2(RTYPE, (psrc), stride, out0, out1); \ - LD_B2(RTYPE, (psrc) + 2 * stride , stride, out2, out3); \ -} -#define LD_UB4(...) LD_B4(v16u8, __VA_ARGS__) +#define LD_B2(RTYPE, psrc, stride, out0, out1) \ + { \ + out0 = LD_B(RTYPE, (psrc)); \ + out1 = LD_B(RTYPE, (psrc) + stride); \ + } +#define LD_UB2(...) LD_B2(const v16u8, __VA_ARGS__) + +#define LD_B4(RTYPE, psrc, stride, out0, out1, out2, out3) \ + { \ + LD_B2(RTYPE, (psrc), stride, out0, out1); \ + LD_B2(RTYPE, (psrc) + 2 * stride, stride, out2, out3); \ + } +#define LD_UB4(...) LD_B4(const v16u8, __VA_ARGS__) /* Description : Store two vectors with stride each having 16 'byte' sized elements @@ -46,18 +186,33 @@ Details : Store 16 byte elements from 'in0' to (pdst) Store 16 byte elements from 'in1' to (pdst + stride) */ -#define ST_B2(RTYPE, in0, in1, pdst, stride) { \ - ST_B(RTYPE, in0, (pdst)); \ - ST_B(RTYPE, in1, (pdst) + stride); \ -} +#define ST_B2(RTYPE, in0, in1, pdst, stride) \ + { \ + ST_B(RTYPE, in0, (pdst)); \ + ST_B(RTYPE, in1, (pdst) + stride); \ + } #define ST_UB2(...) ST_B2(v16u8, __VA_ARGS__) -# -#define ST_B4(RTYPE, in0, in1, in2, in3, pdst, stride) { \ - ST_B2(RTYPE, in0, in1, (pdst), stride); \ - ST_B2(RTYPE, in2, in3, (pdst) + 2 * stride, stride); \ -} + +#define ST_B4(RTYPE, in0, in1, in2, in3, pdst, stride) \ + { \ + ST_B2(RTYPE, in0, in1, (pdst), stride); \ + ST_B2(RTYPE, in2, in3, (pdst) + 2 * stride, stride); \ + } #define ST_UB4(...) ST_B4(v16u8, __VA_ARGS__) -# + +/* Description : Store vectors of 8 halfword elements with stride + Arguments : Inputs - in0, in1, pdst, stride + Details : Store 8 halfword elements from 'in0' to (pdst) + Store 8 halfword elements from 'in1' to (pdst + stride) +*/ +#define ST_H2(RTYPE, in0, in1, pdst, stride) \ + { \ + ST_H(RTYPE, in0, (pdst)); \ + ST_H(RTYPE, in1, (pdst) + stride); \ + } +#define ST_UH2(...) ST_H2(v8u16, __VA_ARGS__) + +// TODO(fbarchard): Consider using __msa_vshf_b and __msa_ilvr_b directly. /* Description : Shuffle byte vector elements as per mask vector Arguments : Inputs - in0, in1, in2, in3, mask0, mask1 Outputs - out0, out1 @@ -65,12 +220,27 @@ Details : Byte elements from 'in0' & 'in1' are copied selectively to 'out0' as per control vector 'mask0' */ -#define VSHF_B2(RTYPE, in0, in1, in2, in3, mask0, mask1, out0, out1) { \ - out0 = (RTYPE) __msa_vshf_b((v16i8) mask0, (v16i8) in1, (v16i8) in0); \ - out1 = (RTYPE) __msa_vshf_b((v16i8) mask1, (v16i8) in3, (v16i8) in2); \ -} +#define VSHF_B2(RTYPE, in0, in1, in2, in3, mask0, mask1, out0, out1) \ + { \ + out0 = (RTYPE)__msa_vshf_b((v16i8)mask0, (v16i8)in1, (v16i8)in0); \ + out1 = (RTYPE)__msa_vshf_b((v16i8)mask1, (v16i8)in3, (v16i8)in2); \ + } #define VSHF_B2_UB(...) VSHF_B2(v16u8, __VA_ARGS__) -#endif /* !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) */ +/* Description : Interleave both left and right half of input vectors + Arguments : Inputs - in0, in1 + Outputs - out0, out1 + Return Type - as per RTYPE + Details : Right half of byte elements from 'in0' and 'in1' are + interleaved and written to 'out0' +*/ +#define ILVRL_B2(RTYPE, in0, in1, out0, out1) \ + { \ + out0 = (RTYPE)__msa_ilvr_b((v16i8)in0, (v16i8)in1); \ + out1 = (RTYPE)__msa_ilvl_b((v16i8)in0, (v16i8)in1); \ + } +#define ILVRL_B2_UB(...) ILVRL_B2(v16u8, __VA_ARGS__) + +#endif /* !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) */ #endif // INCLUDE_LIBYUV_MACROS_MSA_H_ diff --git a/third_party/libyuv/include/libyuv/mjpeg_decoder.h b/third_party/libyuv/include/libyuv/mjpeg_decoder.h index 4975bae5b7..275f8d4c18 100644 --- a/third_party/libyuv/include/libyuv/mjpeg_decoder.h +++ b/third_party/libyuv/include/libyuv/mjpeg_decoder.h @@ -26,25 +26,24 @@ namespace libyuv { extern "C" { #endif -LIBYUV_BOOL ValidateJpeg(const uint8* sample, size_t sample_size); +LIBYUV_BOOL ValidateJpeg(const uint8_t* sample, size_t sample_size); #ifdef __cplusplus } // extern "C" #endif -static const uint32 kUnknownDataSize = 0xFFFFFFFF; +static const uint32_t kUnknownDataSize = 0xFFFFFFFF; enum JpegSubsamplingType { kJpegYuv420, kJpegYuv422, - kJpegYuv411, kJpegYuv444, kJpegYuv400, kJpegUnknown }; struct Buffer { - const uint8* data; + const uint8_t* data; int len; }; @@ -66,7 +65,7 @@ struct SetJmpErrorMgr; class LIBYUV_API MJpegDecoder { public: typedef void (*CallbackFunction)(void* opaque, - const uint8* const* data, + const uint8_t* const* data, const int* strides, int rows); @@ -86,7 +85,7 @@ class LIBYUV_API MJpegDecoder { // If return value is LIBYUV_TRUE, then the values for all the following // getters are populated. // src_len is the size of the compressed mjpeg frame in bytes. - LIBYUV_BOOL LoadFrame(const uint8* src, size_t src_len); + LIBYUV_BOOL LoadFrame(const uint8_t* src, size_t src_len); // Returns width of the last loaded frame in pixels. int GetWidth(); @@ -139,18 +138,22 @@ class LIBYUV_API MJpegDecoder { // at least GetComponentSize(i). The pointers in planes are incremented // to point to after the end of the written data. // TODO(fbarchard): Add dst_x, dst_y to allow specific rect to be decoded. - LIBYUV_BOOL DecodeToBuffers(uint8** planes, int dst_width, int dst_height); + LIBYUV_BOOL DecodeToBuffers(uint8_t** planes, int dst_width, int dst_height); // Decodes the entire image and passes the data via repeated calls to a // callback function. Each call will get the data for a whole number of // image scanlines. // TODO(fbarchard): Add dst_x, dst_y to allow specific rect to be decoded. - LIBYUV_BOOL DecodeToCallback(CallbackFunction fn, void* opaque, - int dst_width, int dst_height); + LIBYUV_BOOL DecodeToCallback(CallbackFunction fn, + void* opaque, + int dst_width, + int dst_height); // The helper function which recognizes the jpeg sub-sampling type. static JpegSubsamplingType JpegSubsamplingTypeHelper( - int* subsample_x, int* subsample_y, int number_of_components); + int* subsample_x, + int* subsample_y, + int number_of_components); private: void AllocOutputBuffers(int num_outbufs); @@ -159,7 +162,7 @@ class LIBYUV_API MJpegDecoder { LIBYUV_BOOL StartDecode(); LIBYUV_BOOL FinishDecode(); - void SetScanlinePointers(uint8** data); + void SetScanlinePointers(uint8_t** data); LIBYUV_BOOL DecodeImcuRow(); int GetComponentScanlinePadding(int component); @@ -178,11 +181,11 @@ class LIBYUV_API MJpegDecoder { // Temporaries used to point to scanline outputs. int num_outbufs_; // Outermost size of all arrays below. - uint8*** scanlines_; + uint8_t*** scanlines_; int* scanlines_sizes_; // Temporary buffer used for decoding when we can't decode directly to the // output buffers. Large enough for just one iMCU row. - uint8** databuf_; + uint8_t** databuf_; int* databuf_strides_; }; diff --git a/third_party/libyuv/include/libyuv/planar_functions.h b/third_party/libyuv/include/libyuv/planar_functions.h index 1b57b29261..972ca9e324 100644 --- a/third_party/libyuv/include/libyuv/planar_functions.h +++ b/third_party/libyuv/include/libyuv/planar_functions.h @@ -22,102 +22,457 @@ namespace libyuv { extern "C" { #endif +// TODO(fbarchard): Move cpu macros to row.h +#if defined(__pnacl__) || defined(__CLR_VER) || \ + (defined(__native_client__) && defined(__x86_64__)) || \ + (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) +#define LIBYUV_DISABLE_X86 +#endif +// MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) +#define LIBYUV_DISABLE_X86 +#endif +#endif +// The following are available on all x86 platforms: +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) +#define HAS_ARGBAFFINEROW_SSE2 +#endif + // Copy a plane of data. LIBYUV_API -void CopyPlane(const uint8* src_y, int src_stride_y, - uint8* dst_y, int dst_stride_y, - int width, int height); +void CopyPlane(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +LIBYUV_API +void CopyPlane_16(const uint16_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + int width, + int height); LIBYUV_API -void CopyPlane_16(const uint16* src_y, int src_stride_y, - uint16* dst_y, int dst_stride_y, - int width, int height); +void Convert16To8Plane(const uint16_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int scale, // 16384 for 10 bits + int width, + int height); + +LIBYUV_API +void Convert8To16Plane(const uint8_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + int scale, // 1024 for 10 bits + int width, + int height); // Set a plane of data to a 32 bit value. LIBYUV_API -void SetPlane(uint8* dst_y, int dst_stride_y, - int width, int height, - uint32 value); +void SetPlane(uint8_t* dst_y, + int dst_stride_y, + int width, + int height, + uint32_t value); + +// Convert a plane of tiles of 16 x H to linear. +LIBYUV_API +void DetilePlane(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height, + int tile_height); + +// Convert a UV plane of tiles of 16 x H into linear U and V planes. +LIBYUV_API +void DetileSplitUVPlane(const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + int tile_height); // Split interleaved UV plane into separate U and V planes. LIBYUV_API -void SplitUVPlane(const uint8* src_uv, int src_stride_uv, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +void SplitUVPlane(const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Merge separate U and V planes into one interleaved UV plane. LIBYUV_API -void MergeUVPlane(const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_uv, int dst_stride_uv, - int width, int height); +void MergeUVPlane(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Split interleaved msb UV plane into separate lsb U and V planes. +LIBYUV_API +void SplitUVPlane_16(const uint16_t* src_uv, + int src_stride_uv, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height, + int depth); + +// Merge separate lsb U and V planes into one interleaved msb UV plane. +LIBYUV_API +void MergeUVPlane_16(const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height, + int depth); + +// Convert lsb plane to msb plane +LIBYUV_API +void ConvertToMSBPlane_16(const uint16_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + int width, + int height, + int depth); + +// Convert msb plane to lsb plane +LIBYUV_API +void ConvertToLSBPlane_16(const uint16_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + int width, + int height, + int depth); + +// Scale U and V to half width and height and merge into interleaved UV plane. +// width and height are source size, allowing odd sizes. +// Use for converting I444 or I422 to NV12. +LIBYUV_API +void HalfMergeUVPlane(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Swap U and V channels in interleaved UV plane. +LIBYUV_API +void SwapUVPlane(const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); + +// Split interleaved RGB plane into separate R, G and B planes. +LIBYUV_API +void SplitRGBPlane(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_r, + int dst_stride_r, + uint8_t* dst_g, + int dst_stride_g, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); + +// Merge separate R, G and B planes into one interleaved RGB plane. +LIBYUV_API +void MergeRGBPlane(const uint8_t* src_r, + int src_stride_r, + const uint8_t* src_g, + int src_stride_g, + const uint8_t* src_b, + int src_stride_b, + uint8_t* dst_rgb, + int dst_stride_rgb, + int width, + int height); + +// Split interleaved ARGB plane into separate R, G, B and A planes. +// dst_a can be NULL to discard alpha plane. +LIBYUV_API +void SplitARGBPlane(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_r, + int dst_stride_r, + uint8_t* dst_g, + int dst_stride_g, + uint8_t* dst_b, + int dst_stride_b, + uint8_t* dst_a, + int dst_stride_a, + int width, + int height); + +// Merge separate R, G, B and A planes into one interleaved ARGB plane. +// src_a can be NULL to fill opaque value to alpha. +LIBYUV_API +void MergeARGBPlane(const uint8_t* src_r, + int src_stride_r, + const uint8_t* src_g, + int src_stride_g, + const uint8_t* src_b, + int src_stride_b, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Merge separate 'depth' bit R, G and B planes stored in lsb +// into one interleaved XR30 plane. +// depth should in range [10, 16] +LIBYUV_API +void MergeXR30Plane(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height, + int depth); + +// Merge separate 'depth' bit R, G, B and A planes stored in lsb +// into one interleaved AR64 plane. +// src_a can be NULL to fill opaque value to alpha. +// depth should in range [1, 16] +LIBYUV_API +void MergeAR64Plane(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + const uint16_t* src_a, + int src_stride_a, + uint16_t* dst_ar64, + int dst_stride_ar64, + int width, + int height, + int depth); + +// Merge separate 'depth' bit R, G, B and A planes stored in lsb +// into one interleaved ARGB plane. +// src_a can be NULL to fill opaque value to alpha. +// depth should in range [8, 16] +LIBYUV_API +void MergeARGB16To8Plane(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int depth); // Copy I400. Supports inverting. LIBYUV_API -int I400ToI400(const uint8* src_y, int src_stride_y, - uint8* dst_y, int dst_stride_y, - int width, int height); +int I400ToI400(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); #define J400ToJ400 I400ToI400 // Copy I422 to I422. #define I422ToI422 I422Copy LIBYUV_API -int I422Copy(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int I422Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Copy I444 to I444. #define I444ToI444 I444Copy LIBYUV_API -int I444Copy(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int I444Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Copy I210 to I210. +#define I210ToI210 I210Copy +LIBYUV_API +int I210Copy(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Copy NV12. Supports inverting. +int NV12Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Copy NV21. Supports inverting. +int NV21Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); // Convert YUY2 to I422. LIBYUV_API -int YUY2ToI422(const uint8* src_yuy2, int src_stride_yuy2, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int YUY2ToI422(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Convert UYVY to I422. LIBYUV_API -int UYVYToI422(const uint8* src_uyvy, int src_stride_uyvy, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int UYVYToI422(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +LIBYUV_API +int YUY2ToNV12(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); LIBYUV_API -int YUY2ToNV12(const uint8* src_yuy2, int src_stride_yuy2, - uint8* dst_y, int dst_stride_y, - uint8* dst_uv, int dst_stride_uv, - int width, int height); +int UYVYToNV12(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert NV21 to NV12. +LIBYUV_API +int NV21ToNV12(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); LIBYUV_API -int UYVYToNV12(const uint8* src_uyvy, int src_stride_uyvy, - uint8* dst_y, int dst_stride_y, - uint8* dst_uv, int dst_stride_uv, - int width, int height); +int YUY2ToY(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); // Convert I420 to I400. (calls CopyPlane ignoring u/v). LIBYUV_API -int I420ToI400(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - int width, int height); +int I420ToI400(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); // Alias #define J420ToJ400 I420ToI400 @@ -125,13 +480,20 @@ int I420ToI400(const uint8* src_y, int src_stride_y, // I420 mirror. LIBYUV_API -int I420Mirror(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int I420Mirror(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Alias #define I400ToI400Mirror I400Mirror @@ -139,87 +501,134 @@ int I420Mirror(const uint8* src_y, int src_stride_y, // I400 mirror. A single plane is mirrored horizontally. // Pass negative height to achieve 180 degree rotation. LIBYUV_API -int I400Mirror(const uint8* src_y, int src_stride_y, - uint8* dst_y, int dst_stride_y, - int width, int height); +int I400Mirror(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +// Alias +#define NV12ToNV12Mirror NV12Mirror + +// NV12 mirror. +LIBYUV_API +int NV12Mirror(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); // Alias #define ARGBToARGBMirror ARGBMirror // ARGB mirror. LIBYUV_API -int ARGBMirror(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBMirror(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); -// Convert NV12 to RGB565. -LIBYUV_API -int NV12ToRGB565(const uint8* src_y, int src_stride_y, - const uint8* src_uv, int src_stride_uv, - uint8* dst_rgb565, int dst_stride_rgb565, - int width, int height); +// Alias +#define RGB24ToRGB24Mirror RGB24Mirror -// I422ToARGB is in convert_argb.h -// Convert I422 to BGRA. +// RGB24 mirror. LIBYUV_API -int I422ToBGRA(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_bgra, int dst_stride_bgra, - int width, int height); - -// Convert I422 to ABGR. +int RGB24Mirror(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); + +// Mirror a plane of data. LIBYUV_API -int I422ToABGR(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_abgr, int dst_stride_abgr, - int width, int height); - -// Convert I422 to RGBA. +void MirrorPlane(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); + +// Mirror a plane of UV data. LIBYUV_API -int I422ToRGBA(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_rgba, int dst_stride_rgba, - int width, int height); +void MirrorUVPlane(const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); // Alias #define RGB24ToRAW RAWToRGB24 LIBYUV_API -int RAWToRGB24(const uint8* src_raw, int src_stride_raw, - uint8* dst_rgb24, int dst_stride_rgb24, - int width, int height); +int RAWToRGB24(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_rgb24, + int dst_stride_rgb24, + int width, + int height); // Draw a rectangle into I420. LIBYUV_API -int I420Rect(uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int x, int y, int width, int height, - int value_y, int value_u, int value_v); +int I420Rect(uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int x, + int y, + int width, + int height, + int value_y, + int value_u, + int value_v); // Draw a rectangle into ARGB. LIBYUV_API -int ARGBRect(uint8* dst_argb, int dst_stride_argb, - int x, int y, int width, int height, uint32 value); +int ARGBRect(uint8_t* dst_argb, + int dst_stride_argb, + int dst_x, + int dst_y, + int width, + int height, + uint32_t value); // Convert ARGB to gray scale ARGB. LIBYUV_API -int ARGBGrayTo(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBGrayTo(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Make a rectangle of ARGB gray scale. LIBYUV_API -int ARGBGray(uint8* dst_argb, int dst_stride_argb, - int x, int y, int width, int height); +int ARGBGray(uint8_t* dst_argb, + int dst_stride_argb, + int dst_x, + int dst_y, + int width, + int height); // Make a rectangle of ARGB Sepia tone. LIBYUV_API -int ARGBSepia(uint8* dst_argb, int dst_stride_argb, - int x, int y, int width, int height); +int ARGBSepia(uint8_t* dst_argb, + int dst_stride_argb, + int dst_x, + int dst_y, + int width, + int height); // Apply a matrix rotation to each ARGB pixel. // matrix_argb is 4 signed ARGB values. -128 to 127 representing -2 to 2. @@ -228,10 +637,13 @@ int ARGBSepia(uint8* dst_argb, int dst_stride_argb, // The next 4 coefficients apply to B, G, R, A and produce R of the output. // The last 4 coefficients apply to B, G, R, A and produce A of the output. LIBYUV_API -int ARGBColorMatrix(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - const int8* matrix_argb, - int width, int height); +int ARGBColorMatrix(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + const int8_t* matrix_argb, + int width, + int height); // Deprecated. Use ARGBColorMatrix instead. // Apply a matrix rotation to each ARGB pixel. @@ -240,32 +652,47 @@ int ARGBColorMatrix(const uint8* src_argb, int src_stride_argb, // The next 4 coefficients apply to B, G, R, A and produce G of the output. // The last 4 coefficients apply to B, G, R, A and produce R of the output. LIBYUV_API -int RGBColorMatrix(uint8* dst_argb, int dst_stride_argb, - const int8* matrix_rgb, - int x, int y, int width, int height); +int RGBColorMatrix(uint8_t* dst_argb, + int dst_stride_argb, + const int8_t* matrix_rgb, + int dst_x, + int dst_y, + int width, + int height); // Apply a color table each ARGB pixel. // Table contains 256 ARGB values. LIBYUV_API -int ARGBColorTable(uint8* dst_argb, int dst_stride_argb, - const uint8* table_argb, - int x, int y, int width, int height); +int ARGBColorTable(uint8_t* dst_argb, + int dst_stride_argb, + const uint8_t* table_argb, + int dst_x, + int dst_y, + int width, + int height); // Apply a color table each ARGB pixel but preserve destination alpha. // Table contains 256 ARGB values. LIBYUV_API -int RGBColorTable(uint8* dst_argb, int dst_stride_argb, - const uint8* table_argb, - int x, int y, int width, int height); +int RGBColorTable(uint8_t* dst_argb, + int dst_stride_argb, + const uint8_t* table_argb, + int dst_x, + int dst_y, + int width, + int height); // Apply a luma/color table each ARGB pixel but preserve destination alpha. // Table contains 32768 values indexed by [Y][C] where 7 it 7 bit luma from // RGB (YJ style) and C is an 8 bit color component (R, G or B). LIBYUV_API -int ARGBLumaColorTable(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - const uint8* luma_rgb_table, - int width, int height); +int ARGBLumaColorTable(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + const uint8_t* luma, + int width, + int height); // Apply a 3 term polynomial to ARGB values. // poly points to a 4x4 matrix. The first row is constants. The 2nd row is @@ -276,54 +703,84 @@ int ARGBLumaColorTable(const uint8* src_argb, int src_stride_argb, // A polynomial approximation can be dirived using software such as 'R'. LIBYUV_API -int ARGBPolynomial(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, +int ARGBPolynomial(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, const float* poly, - int width, int height); + int width, + int height); // Convert plane of 16 bit shorts to half floats. // Source values are multiplied by scale before storing as half float. LIBYUV_API -int HalfFloatPlane(const uint16* src_y, int src_stride_y, - uint16* dst_y, int dst_stride_y, +int HalfFloatPlane(const uint16_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, float scale, - int width, int height); + int width, + int height); + +// Convert a buffer of bytes to floats, scale the values and store as floats. +LIBYUV_API +int ByteToFloat(const uint8_t* src_y, float* dst_y, float scale, int width); // Quantize a rectangle of ARGB. Alpha unaffected. // scale is a 16 bit fractional fixed point scaler between 0 and 65535. // interval_size should be a value between 1 and 255. // interval_offset should be a value between 0 and 255. LIBYUV_API -int ARGBQuantize(uint8* dst_argb, int dst_stride_argb, - int scale, int interval_size, int interval_offset, - int x, int y, int width, int height); +int ARGBQuantize(uint8_t* dst_argb, + int dst_stride_argb, + int scale, + int interval_size, + int interval_offset, + int dst_x, + int dst_y, + int width, + int height); // Copy ARGB to ARGB. LIBYUV_API -int ARGBCopy(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBCopy(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Copy Alpha channel of ARGB to alpha of ARGB. LIBYUV_API -int ARGBCopyAlpha(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBCopyAlpha(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Extract the alpha channel from ARGB. LIBYUV_API -int ARGBExtractAlpha(const uint8* src_argb, int src_stride_argb, - uint8* dst_a, int dst_stride_a, - int width, int height); +int ARGBExtractAlpha(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_a, + int dst_stride_a, + int width, + int height); // Copy Y channel to Alpha of ARGB. LIBYUV_API -int ARGBCopyYToAlpha(const uint8* src_y, int src_stride_y, - uint8* dst_argb, int dst_stride_argb, - int width, int height); - -typedef void (*ARGBBlendRow)(const uint8* src_argb0, const uint8* src_argb1, - uint8* dst_argb, int width); +int ARGBCopyYToAlpha(const uint8_t* src_y, + int src_stride_y, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +typedef void (*ARGBBlendRow)(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); // Get function to Alpha Blend ARGB pixels and store to destination. LIBYUV_API @@ -333,92 +790,143 @@ ARGBBlendRow GetARGBBlend(); // Source is pre-multiplied by alpha using ARGBAttenuate. // Alpha of destination is set to 255. LIBYUV_API -int ARGBBlend(const uint8* src_argb0, int src_stride_argb0, - const uint8* src_argb1, int src_stride_argb1, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBBlend(const uint8_t* src_argb0, + int src_stride_argb0, + const uint8_t* src_argb1, + int src_stride_argb1, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Alpha Blend plane and store to destination. // Source is not pre-multiplied by alpha. LIBYUV_API -int BlendPlane(const uint8* src_y0, int src_stride_y0, - const uint8* src_y1, int src_stride_y1, - const uint8* alpha, int alpha_stride, - uint8* dst_y, int dst_stride_y, - int width, int height); +int BlendPlane(const uint8_t* src_y0, + int src_stride_y0, + const uint8_t* src_y1, + int src_stride_y1, + const uint8_t* alpha, + int alpha_stride, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); // Alpha Blend YUV images and store to destination. // Source is not pre-multiplied by alpha. // Alpha is full width x height and subsampled to half size to apply to UV. LIBYUV_API -int I420Blend(const uint8* src_y0, int src_stride_y0, - const uint8* src_u0, int src_stride_u0, - const uint8* src_v0, int src_stride_v0, - const uint8* src_y1, int src_stride_y1, - const uint8* src_u1, int src_stride_u1, - const uint8* src_v1, int src_stride_v1, - const uint8* alpha, int alpha_stride, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); +int I420Blend(const uint8_t* src_y0, + int src_stride_y0, + const uint8_t* src_u0, + int src_stride_u0, + const uint8_t* src_v0, + int src_stride_v0, + const uint8_t* src_y1, + int src_stride_y1, + const uint8_t* src_u1, + int src_stride_u1, + const uint8_t* src_v1, + int src_stride_v1, + const uint8_t* alpha, + int alpha_stride, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); // Multiply ARGB image by ARGB image. Shifted down by 8. Saturates to 255. LIBYUV_API -int ARGBMultiply(const uint8* src_argb0, int src_stride_argb0, - const uint8* src_argb1, int src_stride_argb1, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBMultiply(const uint8_t* src_argb0, + int src_stride_argb0, + const uint8_t* src_argb1, + int src_stride_argb1, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Add ARGB image with ARGB image. Saturates to 255. LIBYUV_API -int ARGBAdd(const uint8* src_argb0, int src_stride_argb0, - const uint8* src_argb1, int src_stride_argb1, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBAdd(const uint8_t* src_argb0, + int src_stride_argb0, + const uint8_t* src_argb1, + int src_stride_argb1, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Subtract ARGB image (argb1) from ARGB image (argb0). Saturates to 0. LIBYUV_API -int ARGBSubtract(const uint8* src_argb0, int src_stride_argb0, - const uint8* src_argb1, int src_stride_argb1, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBSubtract(const uint8_t* src_argb0, + int src_stride_argb0, + const uint8_t* src_argb1, + int src_stride_argb1, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Convert I422 to YUY2. LIBYUV_API -int I422ToYUY2(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - int width, int height); +int I422ToYUY2(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_yuy2, + int dst_stride_yuy2, + int width, + int height); // Convert I422 to UYVY. LIBYUV_API -int I422ToUYVY(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - int width, int height); +int I422ToUYVY(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uyvy, + int dst_stride_uyvy, + int width, + int height); // Convert unattentuated ARGB to preattenuated ARGB. LIBYUV_API -int ARGBAttenuate(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBAttenuate(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Convert preattentuated ARGB to unattenuated ARGB. LIBYUV_API -int ARGBUnattenuate(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBUnattenuate(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Internal function - do not call directly. // Computes table of cumulative sum for image where the value is the sum // of all values above and to the left of the entry. Used by ARGBBlur. LIBYUV_API -int ARGBComputeCumulativeSum(const uint8* src_argb, int src_stride_argb, - int32* dst_cumsum, int dst_stride32_cumsum, - int width, int height); +int ARGBComputeCumulativeSum(const uint8_t* src_argb, + int src_stride_argb, + int32_t* dst_cumsum, + int dst_stride32_cumsum, + int width, + int height); // Blur ARGB image. // dst_cumsum table of width * (height + 1) * 16 bytes aligned to @@ -427,99 +935,157 @@ int ARGBComputeCumulativeSum(const uint8* src_argb, int src_stride_argb, // radius is number of pixels around the center. e.g. 1 = 3x3. 2=5x5. // Blur is optimized for radius of 5 (11x11) or less. LIBYUV_API -int ARGBBlur(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int32* dst_cumsum, int dst_stride32_cumsum, - int width, int height, int radius); +int ARGBBlur(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int32_t* dst_cumsum, + int dst_stride32_cumsum, + int width, + int height, + int radius); + +// Gaussian 5x5 blur a float plane. +// Coefficients of 1, 4, 6, 4, 1. +// Each destination pixel is a blur of the 5x5 +// pixels from the source. +// Source edges are clamped. +LIBYUV_API +int GaussPlane_F32(const float* src, + int src_stride, + float* dst, + int dst_stride, + int width, + int height); // Multiply ARGB image by ARGB value. LIBYUV_API -int ARGBShade(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height, uint32 value); +int ARGBShade(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + uint32_t value); // Interpolate between two images using specified amount of interpolation // (0 to 255) and store to destination. // 'interpolation' is specified as 8 bit fraction where 0 means 100% src0 // and 255 means 1% src0 and 99% src1. LIBYUV_API -int InterpolatePlane(const uint8* src0, int src_stride0, - const uint8* src1, int src_stride1, - uint8* dst, int dst_stride, - int width, int height, int interpolation); +int InterpolatePlane(const uint8_t* src0, + int src_stride0, + const uint8_t* src1, + int src_stride1, + uint8_t* dst, + int dst_stride, + int width, + int height, + int interpolation); // Interpolate between two ARGB images using specified amount of interpolation // Internally calls InterpolatePlane with width * 4 (bpp). LIBYUV_API -int ARGBInterpolate(const uint8* src_argb0, int src_stride_argb0, - const uint8* src_argb1, int src_stride_argb1, - uint8* dst_argb, int dst_stride_argb, - int width, int height, int interpolation); +int ARGBInterpolate(const uint8_t* src_argb0, + int src_stride_argb0, + const uint8_t* src_argb1, + int src_stride_argb1, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int interpolation); // Interpolate between two YUV images using specified amount of interpolation // Internally calls InterpolatePlane on each plane where the U and V planes // are half width and half height. LIBYUV_API -int I420Interpolate(const uint8* src0_y, int src0_stride_y, - const uint8* src0_u, int src0_stride_u, - const uint8* src0_v, int src0_stride_v, - const uint8* src1_y, int src1_stride_y, - const uint8* src1_u, int src1_stride_u, - const uint8* src1_v, int src1_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height, int interpolation); - -#if defined(__pnacl__) || defined(__CLR_VER) || \ - (defined(__i386__) && !defined(__SSE2__)) -#define LIBYUV_DISABLE_X86 -#endif -// MemorySanitizer does not support assembly code yet. http://crbug.com/344505 -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) -#define LIBYUV_DISABLE_X86 -#endif -#endif -// The following are available on all x86 platforms: -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) -#define HAS_ARGBAFFINEROW_SSE2 -#endif +int I420Interpolate(const uint8_t* src0_y, + int src0_stride_y, + const uint8_t* src0_u, + int src0_stride_u, + const uint8_t* src0_v, + int src0_stride_v, + const uint8_t* src1_y, + int src1_stride_y, + const uint8_t* src1_u, + int src1_stride_u, + const uint8_t* src1_v, + int src1_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + int interpolation); // Row function for copying pixels from a source with a slope to a row // of destination. Useful for scaling, rotation, mirror, texture mapping. LIBYUV_API -void ARGBAffineRow_C(const uint8* src_argb, int src_argb_stride, - uint8* dst_argb, const float* uv_dudv, int width); +void ARGBAffineRow_C(const uint8_t* src_argb, + int src_argb_stride, + uint8_t* dst_argb, + const float* uv_dudv, + int width); +// TODO(fbarchard): Move ARGBAffineRow_SSE2 to row.h LIBYUV_API -void ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride, - uint8* dst_argb, const float* uv_dudv, int width); +void ARGBAffineRow_SSE2(const uint8_t* src_argb, + int src_argb_stride, + uint8_t* dst_argb, + const float* uv_dudv, + int width); // Shuffle ARGB channel order. e.g. BGRA to ARGB. -// shuffler is 16 bytes and must be aligned. +// shuffler is 16 bytes. +LIBYUV_API +int ARGBShuffle(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_argb, + int dst_stride_argb, + const uint8_t* shuffler, + int width, + int height); + +// Shuffle AR64 channel order. e.g. AR64 to AB64. +// shuffler is 16 bytes. LIBYUV_API -int ARGBShuffle(const uint8* src_bgra, int src_stride_bgra, - uint8* dst_argb, int dst_stride_argb, - const uint8* shuffler, int width, int height); +int AR64Shuffle(const uint16_t* src_ar64, + int src_stride_ar64, + uint16_t* dst_ar64, + int dst_stride_ar64, + const uint8_t* shuffler, + int width, + int height); // Sobel ARGB effect with planar output. LIBYUV_API -int ARGBSobelToPlane(const uint8* src_argb, int src_stride_argb, - uint8* dst_y, int dst_stride_y, - int width, int height); +int ARGBSobelToPlane(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_y, + int dst_stride_y, + int width, + int height); // Sobel ARGB effect. LIBYUV_API -int ARGBSobel(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBSobel(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); // Sobel ARGB effect w/ Sobel X, Sobel, Sobel Y in ARGB. LIBYUV_API -int ARGBSobelXY(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int width, int height); +int ARGBSobelXY(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/rotate.h b/third_party/libyuv/include/libyuv/rotate.h index 8a2da9a5aa..684ed5e6de 100644 --- a/third_party/libyuv/include/libyuv/rotate.h +++ b/third_party/libyuv/include/libyuv/rotate.h @@ -20,8 +20,8 @@ extern "C" { // Supported rotation. typedef enum RotationMode { - kRotate0 = 0, // No rotation. - kRotate90 = 90, // Rotate 90 degrees clockwise. + kRotate0 = 0, // No rotation. + kRotate90 = 90, // Rotate 90 degrees clockwise. kRotate180 = 180, // Rotate 180 degrees. kRotate270 = 270, // Rotate 270 degrees clockwise. @@ -33,81 +33,196 @@ typedef enum RotationMode { // Rotate I420 frame. LIBYUV_API -int I420Rotate(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int src_width, int src_height, enum RotationMode mode); +int I420Rotate(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + enum RotationMode mode); + +// Rotate I422 frame. +LIBYUV_API +int I422Rotate(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + enum RotationMode mode); + +// Rotate I444 frame. +LIBYUV_API +int I444Rotate(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + enum RotationMode mode); // Rotate NV12 input and store in I420. LIBYUV_API -int NV12ToI420Rotate(const uint8* src_y, int src_stride_y, - const uint8* src_uv, int src_stride_uv, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int src_width, int src_height, enum RotationMode mode); +int NV12ToI420Rotate(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + enum RotationMode mode); + +// Convert Android420 to I420 with rotation. +// "rotation" can be 0, 90, 180 or 270. +LIBYUV_API +int Android420ToI420Rotate(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_pixel_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + enum RotationMode rotation); // Rotate a plane by 0, 90, 180, or 270. LIBYUV_API -int RotatePlane(const uint8* src, int src_stride, - uint8* dst, int dst_stride, - int src_width, int src_height, enum RotationMode mode); +int RotatePlane(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height, + enum RotationMode mode); // Rotate planes by 90, 180, 270. Deprecated. LIBYUV_API -void RotatePlane90(const uint8* src, int src_stride, - uint8* dst, int dst_stride, - int width, int height); - -LIBYUV_API -void RotatePlane180(const uint8* src, int src_stride, - uint8* dst, int dst_stride, - int width, int height); +void RotatePlane90(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height); LIBYUV_API -void RotatePlane270(const uint8* src, int src_stride, - uint8* dst, int dst_stride, - int width, int height); +void RotatePlane180(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height); LIBYUV_API -void RotateUV90(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, - int width, int height); +void RotatePlane270(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height); // Rotations for when U and V are interleaved. -// These functions take one input pointer and +// These functions take one UV input pointer and // split the data into two buffers while -// rotating them. Deprecated. +// rotating them. +// width and height expected to be half size for NV12. +LIBYUV_API +int SplitRotateUV(const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + enum RotationMode mode); + +LIBYUV_API +void SplitRotateUV90(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); + LIBYUV_API -void RotateUV180(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, - int width, int height); +void SplitRotateUV180(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); LIBYUV_API -void RotateUV270(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, - int width, int height); +void SplitRotateUV270(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); // The 90 and 270 functions are based on transposes. // Doing a transpose with reversing the read/write // order will result in a rotation by +- 90 degrees. // Deprecated. LIBYUV_API -void TransposePlane(const uint8* src, int src_stride, - uint8* dst, int dst_stride, - int width, int height); +void TransposePlane(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height); LIBYUV_API -void TransposeUV(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, - int width, int height); +void SplitTransposeUV(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/rotate_argb.h b/third_party/libyuv/include/libyuv/rotate_argb.h index 21fe7e1807..20432949ab 100644 --- a/third_party/libyuv/include/libyuv/rotate_argb.h +++ b/third_party/libyuv/include/libyuv/rotate_argb.h @@ -21,9 +21,13 @@ extern "C" { // Rotate ARGB frame LIBYUV_API -int ARGBRotate(const uint8* src_argb, int src_stride_argb, - uint8* dst_argb, int dst_stride_argb, - int src_width, int src_height, enum RotationMode mode); +int ARGBRotate(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_argb, + int dst_stride_argb, + int src_width, + int src_height, + enum RotationMode mode); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/rotate_row.h b/third_party/libyuv/include/libyuv/rotate_row.h index 6abd201677..aa8528a925 100644 --- a/third_party/libyuv/include/libyuv/rotate_row.h +++ b/third_party/libyuv/include/libyuv/rotate_row.h @@ -18,100 +18,203 @@ namespace libyuv { extern "C" { #endif -#if defined(__pnacl__) || defined(__CLR_VER) || \ - (defined(__i386__) && !defined(__SSE2__)) +#if defined(__pnacl__) || defined(__CLR_VER) || \ + (defined(__native_client__) && defined(__x86_64__)) || \ + (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) #define LIBYUV_DISABLE_X86 #endif +#if defined(__native_client__) +#define LIBYUV_DISABLE_NEON +#endif // MemorySanitizer does not support assembly code yet. http://crbug.com/344505 #if defined(__has_feature) #if __has_feature(memory_sanitizer) #define LIBYUV_DISABLE_X86 #endif #endif -// The following are available for Visual C and clangcl 32 bit: -#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) +// The following are available for Visual C 32 bit: +#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) && \ + !defined(__clang__) #define HAS_TRANSPOSEWX8_SSSE3 #define HAS_TRANSPOSEUVWX8_SSE2 #endif -// The following are available for GCC 32 or 64 bit but not NaCL for 64 bit: -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__i386__) || (defined(__x86_64__) && !defined(__native_client__))) +// The following are available for GCC 32 or 64 bit: +#if !defined(LIBYUV_DISABLE_X86) && (defined(__i386__) || defined(__x86_64__)) #define HAS_TRANSPOSEWX8_SSSE3 #endif -// The following are available for 64 bit GCC but not NaCL: -#if !defined(LIBYUV_DISABLE_X86) && !defined(__native_client__) && \ - defined(__x86_64__) +// The following are available for 64 bit GCC: +#if !defined(LIBYUV_DISABLE_X86) && defined(__x86_64__) #define HAS_TRANSPOSEWX8_FAST_SSSE3 #define HAS_TRANSPOSEUVWX8_SSE2 #endif -#if !defined(LIBYUV_DISABLE_NEON) && !defined(__native_client__) && \ +#if !defined(LIBYUV_DISABLE_NEON) && \ (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__)) #define HAS_TRANSPOSEWX8_NEON #define HAS_TRANSPOSEUVWX8_NEON #endif -#if !defined(LIBYUV_DISABLE_MIPS) && !defined(__native_client__) && \ - defined(__mips__) && \ - defined(__mips_dsp) && (__mips_dsp_rev >= 2) -#define HAS_TRANSPOSEWX8_DSPR2 -#define HAS_TRANSPOSEUVWX8_DSPR2 -#endif // defined(__mips__) - -void TransposeWxH_C(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width, int height); - -void TransposeWx8_C(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width); -void TransposeWx8_NEON(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width); -void TransposeWx8_SSSE3(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width); -void TransposeWx8_Fast_SSSE3(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width); -void TransposeWx8_DSPR2(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width); -void TransposeWx8_Fast_DSPR2(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width); - -void TransposeWx8_Any_NEON(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width); -void TransposeWx8_Any_SSSE3(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width); -void TransposeWx8_Fast_Any_SSSE3(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width); -void TransposeWx8_Any_DSPR2(const uint8* src, int src_stride, - uint8* dst, int dst_stride, int width); - -void TransposeUVWxH_C(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, - int width, int height); - -void TransposeUVWx8_C(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, int width); -void TransposeUVWx8_SSE2(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, int width); -void TransposeUVWx8_NEON(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, int width); -void TransposeUVWx8_DSPR2(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, int width); - -void TransposeUVWx8_Any_SSE2(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, int width); -void TransposeUVWx8_Any_NEON(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, int width); -void TransposeUVWx8_Any_DSPR2(const uint8* src, int src_stride, - uint8* dst_a, int dst_stride_a, - uint8* dst_b, int dst_stride_b, int width); +#if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) +#define HAS_TRANSPOSEWX16_MSA +#define HAS_TRANSPOSEUVWX16_MSA +#endif + +#if !defined(LIBYUV_DISABLE_LSX) && defined(__loongarch_sx) +#define HAS_TRANSPOSEWX16_LSX +#define HAS_TRANSPOSEUVWX16_LSX +#endif + +void TransposeWxH_C(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width, + int height); + +void TransposeWx8_C(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx16_C(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_NEON(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_SSSE3(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_Fast_SSSE3(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx16_MSA(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx16_LSX(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); + +void TransposeWx8_Any_NEON(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_Any_SSSE3(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx8_Fast_Any_SSSE3(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx16_Any_MSA(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); +void TransposeWx16_Any_LSX(const uint8_t* src, + int src_stride, + uint8_t* dst, + int dst_stride, + int width); + +void TransposeUVWxH_C(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height); + +void TransposeUVWx8_C(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx16_C(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx8_SSE2(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx8_NEON(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx16_MSA(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx16_LSX(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); + +void TransposeUVWx8_Any_SSE2(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx8_Any_NEON(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx16_Any_MSA(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); +void TransposeUVWx16_Any_LSX(const uint8_t* src, + int src_stride, + uint8_t* dst_a, + int dst_stride_a, + uint8_t* dst_b, + int dst_stride_b, + int width); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/row.h b/third_party/libyuv/include/libyuv/row.h index b810221ec7..ae9f595c82 100644 --- a/third_party/libyuv/include/libyuv/row.h +++ b/third_party/libyuv/include/libyuv/row.h @@ -20,34 +20,20 @@ namespace libyuv { extern "C" { #endif -#define IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a) - 1))) - -#define align_buffer_64(var, size) \ - uint8* var##_mem = (uint8*)(malloc((size) + 63)); /* NOLINT */ \ - uint8* var = (uint8*)(((intptr_t)(var##_mem) + 63) & ~63) /* NOLINT */ - -#define free_aligned_buffer_64(var) \ - free(var##_mem); \ - var = 0 - -#if defined(__pnacl__) || defined(__CLR_VER) || \ - (defined(__i386__) && !defined(__SSE2__)) +#if defined(__pnacl__) || defined(__CLR_VER) || \ + (defined(__native_client__) && defined(__x86_64__)) || \ + (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) #define LIBYUV_DISABLE_X86 #endif +#if defined(__native_client__) +#define LIBYUV_DISABLE_NEON +#endif // MemorySanitizer does not support assembly code yet. http://crbug.com/344505 #if defined(__has_feature) #if __has_feature(memory_sanitizer) #define LIBYUV_DISABLE_X86 #endif #endif -// True if compiling for SSSE3 as a requirement. -#if defined(__SSSE3__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 3)) -#define LIBYUV_SSSE3_ONLY -#endif - -#if defined(__native_client__) -#define LIBYUV_DISABLE_NEON -#endif // clang >= 3.5.0 required for Arm64. #if defined(__clang__) && defined(__aarch64__) && !defined(LIBYUV_DISABLE_NEON) #if (__clang_major__ < 3) || (__clang_major__ == 3 && (__clang_minor__ < 5)) @@ -69,9 +55,18 @@ extern "C" { #endif // clang >= 3.4 #endif // __clang__ +// clang >= 6.0.0 required for AVX512. +#if defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) +// clang in xcode follows a different versioning scheme. +// TODO(fbarchard): fix xcode 9 ios b/789. +#if (__clang_major__ >= 7) && !defined(__APPLE__) +#define CLANG_HAS_AVX512 1 +#endif // clang >= 7 +#endif // __clang__ + // Visual C 2012 required for AVX2. -#if defined(_M_IX86) && !defined(__clang__) && \ - defined(_MSC_VER) && _MSC_VER >= 1700 +#if defined(_M_IX86) && !defined(__clang__) && defined(_MSC_VER) && \ + _MSC_VER >= 1700 #define VISUALC_HAS_AVX2 1 #endif // VisualStudio >= 2012 @@ -79,12 +74,14 @@ extern "C" { #if !defined(LIBYUV_DISABLE_X86) && \ (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) // Conversions: -#define HAS_ABGRTOUVROW_SSSE3 #define HAS_ABGRTOYROW_SSSE3 +#if !defined(LIBYUV_BIT_EXACT) +#define HAS_ABGRTOUVROW_SSSE3 +#endif #define HAS_ARGB1555TOARGBROW_SSE2 #define HAS_ARGB4444TOARGBROW_SSE2 +#define HAS_ARGBEXTRACTALPHAROW_SSE2 #define HAS_ARGBSETROW_X86 -#define HAS_ARGBSHUFFLEROW_SSE2 #define HAS_ARGBSHUFFLEROW_SSSE3 #define HAS_ARGBTOARGB1555ROW_SSE2 #define HAS_ARGBTOARGB4444ROW_SSE2 @@ -92,18 +89,19 @@ extern "C" { #define HAS_ARGBTORGB24ROW_SSSE3 #define HAS_ARGBTORGB565DITHERROW_SSE2 #define HAS_ARGBTORGB565ROW_SSE2 +#define HAS_ARGBTOYJROW_SSSE3 +#define HAS_ARGBTOYROW_SSSE3 +#define HAS_BGRATOYROW_SSSE3 +#if !defined(LIBYUV_BIT_EXACT) #define HAS_ARGBTOUV444ROW_SSSE3 #define HAS_ARGBTOUVJROW_SSSE3 #define HAS_ARGBTOUVROW_SSSE3 -#define HAS_ARGBTOYJROW_SSSE3 -#define HAS_ARGBTOYROW_SSSE3 -#define HAS_ARGBEXTRACTALPHAROW_SSE2 #define HAS_BGRATOUVROW_SSSE3 -#define HAS_BGRATOYROW_SSSE3 +#endif #define HAS_COPYROW_ERMS #define HAS_COPYROW_SSE2 #define HAS_H422TOARGBROW_SSSE3 -#define HAS_I400TOARGBROW_SSE2 +#define HAS_HALFFLOATROW_SSE2 #define HAS_I422TOARGB1555ROW_SSSE3 #define HAS_I422TOARGB4444ROW_SSSE3 #define HAS_I422TOARGBROW_SSSE3 @@ -117,18 +115,24 @@ extern "C" { #define HAS_J422TOARGBROW_SSSE3 #define HAS_MERGEUVROW_SSE2 #define HAS_MIRRORROW_SSSE3 -#define HAS_MIRRORUVROW_SSSE3 +#define HAS_MIRRORSPLITUVROW_SSSE3 #define HAS_NV12TOARGBROW_SSSE3 +#define HAS_NV12TORGB24ROW_SSSE3 #define HAS_NV12TORGB565ROW_SSSE3 #define HAS_NV21TOARGBROW_SSSE3 +#define HAS_NV21TORGB24ROW_SSSE3 #define HAS_RAWTOARGBROW_SSSE3 #define HAS_RAWTORGB24ROW_SSSE3 -#define HAS_RAWTOYROW_SSSE3 #define HAS_RGB24TOARGBROW_SSSE3 -#define HAS_RGB24TOYROW_SSSE3 #define HAS_RGB565TOARGBROW_SSE2 -#define HAS_RGBATOUVROW_SSSE3 +#define HAS_RAWTOYROW_SSSE3 +#define HAS_RGB24TOYROW_SSSE3 #define HAS_RGBATOYROW_SSSE3 +#if !defined(LIBYUV_BIT_EXACT) +#define HAS_RGB24TOYJROW_SSSE3 +#define HAS_RAWTOYJROW_SSSE3 +#define HAS_RGBATOUVROW_SSSE3 +#endif #define HAS_SETROW_ERMS #define HAS_SETROW_X86 #define HAS_SPLITUVROW_SSE2 @@ -144,7 +148,9 @@ extern "C" { // Effects: #define HAS_ARGBADDROW_SSE2 #define HAS_ARGBAFFINEROW_SSE2 +#if !defined(LIBYUV_BIT_EXACT) #define HAS_ARGBATTENUATEROW_SSSE3 +#endif #define HAS_ARGBBLENDROW_SSSE3 #define HAS_ARGBCOLORMATRIXROW_SSSE3 #define HAS_ARGBCOLORTABLEROW_X86 @@ -173,41 +179,39 @@ extern "C" { // The following functions fail on gcc/clang 32 bit with fpic and framepointer. // caveat: clangcl uses row_win.cc which works. -#if defined(NDEBUG) || !(defined(_DEBUG) && defined(__i386__)) || \ - !defined(__i386__) || defined(_MSC_VER) -// TODO(fbarchard): fix build error on x86 debug -// https://code.google.com/p/libyuv/issues/detail?id=524 -#define HAS_I411TOARGBROW_SSSE3 +#if defined(__x86_64__) || !defined(__pic__) || defined(__clang__) || \ + defined(_MSC_VER) // TODO(fbarchard): fix build error on android_full_debug=1 // https://code.google.com/p/libyuv/issues/detail?id=517 #define HAS_I422ALPHATOARGBROW_SSSE3 +#define HAS_I444ALPHATOARGBROW_SSSE3 #endif #endif // The following are available on all x86 platforms, but // require VS2012, clang 3.4 or gcc 4.7. -// The code supports NaCL but requires a new compiler and validator. -#if !defined(LIBYUV_DISABLE_X86) && (defined(VISUALC_HAS_AVX2) || \ - defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2)) +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \ + defined(GCC_HAS_AVX2)) #define HAS_ARGBCOPYALPHAROW_AVX2 #define HAS_ARGBCOPYYTOALPHAROW_AVX2 +#define HAS_ARGBEXTRACTALPHAROW_AVX2 #define HAS_ARGBMIRRORROW_AVX2 #define HAS_ARGBPOLYNOMIALROW_AVX2 #define HAS_ARGBSHUFFLEROW_AVX2 #define HAS_ARGBTORGB565DITHERROW_AVX2 -#define HAS_ARGBTOUVJROW_AVX2 -#define HAS_ARGBTOUVROW_AVX2 #define HAS_ARGBTOYJROW_AVX2 +#define HAS_RAWTOYJROW_AVX2 +#define HAS_RGB24TOYJROW_AVX2 #define HAS_ARGBTOYROW_AVX2 +#if !defined(LIBYUV_BIT_EXACT) +#define HAS_ARGBTOUVJROW_AVX2 +#define HAS_ARGBTOUVROW_AVX2 +#endif #define HAS_COPYROW_AVX #define HAS_H422TOARGBROW_AVX2 -#define HAS_I400TOARGBROW_AVX2 -#if !(defined(_DEBUG) && defined(__i386__)) -// TODO(fbarchard): fix build error on android_full_debug=1 -// https://code.google.com/p/libyuv/issues/detail?id=517 -#define HAS_I422ALPHATOARGBROW_AVX2 -#endif -#define HAS_I411TOARGBROW_AVX2 +#define HAS_HALFFLOATROW_AVX2 +// #define HAS_HALFFLOATROW_F16C // Enable to test halffloat cast #define HAS_I422TOARGB1555ROW_AVX2 #define HAS_I422TOARGB4444ROW_AVX2 #define HAS_I422TOARGBROW_AVX2 @@ -220,8 +224,10 @@ extern "C" { #define HAS_MERGEUVROW_AVX2 #define HAS_MIRRORROW_AVX2 #define HAS_NV12TOARGBROW_AVX2 +#define HAS_NV12TORGB24ROW_AVX2 #define HAS_NV12TORGB565ROW_AVX2 #define HAS_NV21TOARGBROW_AVX2 +#define HAS_NV21TORGB24ROW_AVX2 #define HAS_SPLITUVROW_AVX2 #define HAS_UYVYTOARGBROW_AVX2 #define HAS_UYVYTOUV422ROW_AVX2 @@ -231,21 +237,30 @@ extern "C" { #define HAS_YUY2TOUV422ROW_AVX2 #define HAS_YUY2TOUVROW_AVX2 #define HAS_YUY2TOYROW_AVX2 -#define HAS_HALFFLOATROW_AVX2 // Effects: #define HAS_ARGBADDROW_AVX2 +#if !defined(LIBYUV_BIT_EXACT) #define HAS_ARGBATTENUATEROW_AVX2 +#endif #define HAS_ARGBMULTIPLYROW_AVX2 #define HAS_ARGBSUBTRACTROW_AVX2 #define HAS_ARGBUNATTENUATEROW_AVX2 #define HAS_BLENDPLANEROW_AVX2 + +#if defined(__x86_64__) || !defined(__pic__) || defined(__clang__) || \ + defined(_MSC_VER) +// TODO(fbarchard): fix build error on android_full_debug=1 +// https://code.google.com/p/libyuv/issues/detail?id=517 +#define HAS_I422ALPHATOARGBROW_AVX2 +#define HAS_I444ALPHATOARGBROW_AVX2 +#endif #endif -// The following are available for AVX2 Visual C and clangcl 32 bit: +// The following are available for AVX2 Visual C 32 bit: // TODO(fbarchard): Port to gcc. -#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && \ - (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2)) +#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) && \ + !defined(__clang__) && defined(VISUALC_HAS_AVX2) #define HAS_ARGB1555TOARGBROW_AVX2 #define HAS_ARGB4444TOARGBROW_AVX2 #define HAS_ARGBTOARGB1555ROW_AVX2 @@ -258,15 +273,138 @@ extern "C" { // The following are also available on x64 Visual C. #if !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER) && defined(_M_X64) && \ (!defined(__clang__) || defined(__SSSE3__)) +#define HAS_I444ALPHATOARGBROW_SSSE3 +#define HAS_I444TOARGBROW_SSSE3 #define HAS_I422ALPHATOARGBROW_SSSE3 #define HAS_I422TOARGBROW_SSSE3 #endif -// The following are available on gcc x86 platforms: -// TODO(fbarchard): Port to Visual C. +// The following are available for gcc/clang x86 platforms: +// TODO(fbarchard): Port to Visual C +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) +#define HAS_ABGRTOAR30ROW_SSSE3 +#define HAS_ARGBTOAR30ROW_SSSE3 +#define HAS_ARGBTOAR64ROW_SSSE3 +#define HAS_ARGBTOAB64ROW_SSSE3 +#define HAS_AR64TOARGBROW_SSSE3 +#define HAS_AB64TOARGBROW_SSSE3 +#define HAS_CONVERT16TO8ROW_SSSE3 +#define HAS_CONVERT8TO16ROW_SSE2 +#define HAS_DETILEROW_SSE2 +#define HAS_DETILESPLITUVROW_SSSE3 +#define HAS_HALFMERGEUVROW_SSSE3 +#define HAS_I210TOAR30ROW_SSSE3 +#define HAS_I210TOARGBROW_SSSE3 +#define HAS_I212TOAR30ROW_SSSE3 +#define HAS_I212TOARGBROW_SSSE3 +#define HAS_I400TOARGBROW_SSE2 +#define HAS_I422TOAR30ROW_SSSE3 +#define HAS_I410TOAR30ROW_SSSE3 +#define HAS_I410TOARGBROW_SSSE3 +#define HAS_MERGEARGBROW_SSE2 +#define HAS_MERGEXRGBROW_SSE2 +#define HAS_MERGERGBROW_SSSE3 +#define HAS_MIRRORUVROW_SSSE3 +#define HAS_NV21TOYUV24ROW_SSSE3 +#define HAS_P210TOAR30ROW_SSSE3 +#define HAS_P210TOARGBROW_SSSE3 +#define HAS_P410TOAR30ROW_SSSE3 +#define HAS_P410TOARGBROW_SSSE3 +#define HAS_RAWTORGBAROW_SSSE3 +#define HAS_RGB24MIRRORROW_SSSE3 +#if !defined(LIBYUV_BIT_EXACT) +#define HAS_RGBATOYJROW_SSSE3 +#endif +#define HAS_SPLITARGBROW_SSE2 +#define HAS_SPLITARGBROW_SSSE3 +#define HAS_SPLITXRGBROW_SSE2 +#define HAS_SPLITXRGBROW_SSSE3 +#define HAS_SPLITRGBROW_SSSE3 +#define HAS_SWAPUVROW_SSSE3 + +#if defined(__x86_64__) || !defined(__pic__) +// TODO(fbarchard): fix build error on android_full_debug=1 +// https://code.google.com/p/libyuv/issues/detail?id=517 +#define HAS_I210ALPHATOARGBROW_SSSE3 +#define HAS_I410ALPHATOARGBROW_SSSE3 +#endif +#endif + +// The following are available for AVX2 gcc/clang x86 platforms: +// TODO(fbarchard): Port to Visual C +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || defined(__i386__)) && \ + (defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2)) +#define HAS_ABGRTOAR30ROW_AVX2 +#if !defined(LIBYUV_BIT_EXACT) +#define HAS_ABGRTOUVROW_AVX2 +#define HAS_ABGRTOYROW_AVX2 +#endif +#define HAS_ARGBTOAR30ROW_AVX2 +#define HAS_ARGBTORAWROW_AVX2 +#define HAS_ARGBTORGB24ROW_AVX2 +#define HAS_ARGBTOAR64ROW_AVX2 +#define HAS_ARGBTOAB64ROW_AVX2 +#define HAS_AR64TOARGBROW_AVX2 +#define HAS_AB64TOARGBROW_AVX2 +#define HAS_CONVERT16TO8ROW_AVX2 +#define HAS_CONVERT8TO16ROW_AVX2 +#define HAS_DIVIDEROW_16_AVX2 +#define HAS_HALFMERGEUVROW_AVX2 +#define HAS_MERGEAR64ROW_AVX2 +#define HAS_MERGEARGB16TO8ROW_AVX2 +#define HAS_MERGEARGBROW_AVX2 +#define HAS_MERGEXR30ROW_AVX2 +#define HAS_MERGEXR64ROW_AVX2 +#define HAS_MERGEXRGB16TO8ROW_AVX2 +#define HAS_MERGEXRGBROW_AVX2 +#define HAS_NV21TOYUV24ROW_AVX2 +#define HAS_I210TOAR30ROW_AVX2 +#define HAS_I210TOARGBROW_AVX2 +#define HAS_I212TOAR30ROW_AVX2 +#define HAS_I212TOARGBROW_AVX2 +#define HAS_I400TOARGBROW_AVX2 +#define HAS_I410TOAR30ROW_AVX2 +#define HAS_I410TOARGBROW_AVX2 +#define HAS_P210TOAR30ROW_AVX2 +#define HAS_P210TOARGBROW_AVX2 +#define HAS_P410TOAR30ROW_AVX2 +#define HAS_P410TOARGBROW_AVX2 +#define HAS_I422TOAR30ROW_AVX2 +#define HAS_I422TOUYVYROW_AVX2 +#define HAS_I422TOYUY2ROW_AVX2 +#define HAS_MERGEUVROW_16_AVX2 +#define HAS_MIRRORUVROW_AVX2 +#define HAS_MULTIPLYROW_16_AVX2 +#if !defined(LIBYUV_BIT_EXACT) +#define HAS_RGBATOYJROW_AVX2 +#endif +#define HAS_SPLITARGBROW_AVX2 +#define HAS_SPLITXRGBROW_AVX2 +#define HAS_SPLITUVROW_16_AVX2 +#define HAS_SWAPUVROW_AVX2 + +#if defined(__x86_64__) || !defined(__pic__) +// TODO(fbarchard): fix build error on android_full_debug=1 +// https://code.google.com/p/libyuv/issues/detail?id=517 +#define HAS_I210ALPHATOARGBROW_AVX2 +#define HAS_I410ALPHATOARGBROW_AVX2 +#endif +#endif + +// The following are available for AVX512 clang x86 platforms: +// TODO(fbarchard): Port to GCC and Visual C +// TODO(fbarchard): re-enable HAS_ARGBTORGB24ROW_AVX512VBMI. Issue libyuv:789 #if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) -#define HAS_HALFFLOATROW_SSE2 + (defined(__x86_64__) || defined(__i386__)) && (defined(CLANG_HAS_AVX512)) +#define HAS_ARGBTORGB24ROW_AVX512VBMI +#endif + +// The following are available for AVX512 clang x64 platforms: +// TODO(fbarchard): Port to x86 +#if !defined(LIBYUV_DISABLE_X86) && defined(__x86_64__) && \ + (defined(CLANG_HAS_AVX512)) +#define HAS_I422TOARGBROW_AVX512BW #endif // The following are available on Neon platforms: @@ -280,6 +418,7 @@ extern "C" { #define HAS_ARGB4444TOARGBROW_NEON #define HAS_ARGB4444TOUVROW_NEON #define HAS_ARGB4444TOYROW_NEON +#define HAS_ARGBEXTRACTALPHAROW_NEON #define HAS_ARGBSETROW_NEON #define HAS_ARGBTOARGB1555ROW_NEON #define HAS_ARGBTOARGB4444ROW_NEON @@ -287,18 +426,29 @@ extern "C" { #define HAS_ARGBTORGB24ROW_NEON #define HAS_ARGBTORGB565DITHERROW_NEON #define HAS_ARGBTORGB565ROW_NEON -#define HAS_ARGBTOUV411ROW_NEON +#define HAS_ARGBTOAR64ROW_NEON +#define HAS_ARGBTOAB64ROW_NEON +#define HAS_AR64TOARGBROW_NEON +#define HAS_AB64TOARGBROW_NEON #define HAS_ARGBTOUV444ROW_NEON #define HAS_ARGBTOUVJROW_NEON #define HAS_ARGBTOUVROW_NEON #define HAS_ARGBTOYJROW_NEON #define HAS_ARGBTOYROW_NEON -#define HAS_ARGBEXTRACTALPHAROW_NEON +#define HAS_AYUVTOUVROW_NEON +#define HAS_AYUVTOVUROW_NEON +#define HAS_AYUVTOYROW_NEON #define HAS_BGRATOUVROW_NEON #define HAS_BGRATOYROW_NEON +#define HAS_BYTETOFLOATROW_NEON #define HAS_COPYROW_NEON +#define HAS_DETILEROW_NEON +#define HAS_DETILESPLITUVROW_NEON +#define HAS_DIVIDEROW_16_NEON +#define HAS_HALFFLOATROW_NEON +#define HAS_HALFMERGEUVROW_NEON #define HAS_I400TOARGBROW_NEON -#define HAS_I411TOARGBROW_NEON +#define HAS_I444ALPHATOARGBROW_NEON #define HAS_I422ALPHATOARGBROW_NEON #define HAS_I422TOARGB1555ROW_NEON #define HAS_I422TOARGB4444ROW_NEON @@ -310,26 +460,50 @@ extern "C" { #define HAS_I422TOYUY2ROW_NEON #define HAS_I444TOARGBROW_NEON #define HAS_J400TOARGBROW_NEON +#define HAS_MERGEAR64ROW_NEON +#define HAS_MERGEARGB16TO8ROW_NEON +#define HAS_MERGEARGBROW_NEON +#define HAS_MERGEXR30ROW_NEON +#define HAS_MERGEXR64ROW_NEON +#define HAS_MERGEXRGB16TO8ROW_NEON +#define HAS_MERGEXRGBROW_NEON #define HAS_MERGEUVROW_NEON +#define HAS_MERGEUVROW_16_NEON #define HAS_MIRRORROW_NEON #define HAS_MIRRORUVROW_NEON +#define HAS_MIRRORSPLITUVROW_NEON +#define HAS_MULTIPLYROW_16_NEON #define HAS_NV12TOARGBROW_NEON +#define HAS_NV12TORGB24ROW_NEON #define HAS_NV12TORGB565ROW_NEON #define HAS_NV21TOARGBROW_NEON +#define HAS_NV21TORGB24ROW_NEON +#define HAS_NV21TOYUV24ROW_NEON #define HAS_RAWTOARGBROW_NEON #define HAS_RAWTORGB24ROW_NEON +#define HAS_RAWTORGBAROW_NEON #define HAS_RAWTOUVROW_NEON +#define HAS_RAWTOUVJROW_NEON +#define HAS_RAWTOYJROW_NEON #define HAS_RAWTOYROW_NEON #define HAS_RGB24TOARGBROW_NEON #define HAS_RGB24TOUVROW_NEON +#define HAS_RGB24TOUVJROW_NEON +#define HAS_RGB24TOYJROW_NEON #define HAS_RGB24TOYROW_NEON #define HAS_RGB565TOARGBROW_NEON #define HAS_RGB565TOUVROW_NEON #define HAS_RGB565TOYROW_NEON #define HAS_RGBATOUVROW_NEON +#define HAS_RGBATOYJROW_NEON #define HAS_RGBATOYROW_NEON #define HAS_SETROW_NEON +#define HAS_SPLITARGBROW_NEON +#define HAS_SPLITXRGBROW_NEON +#define HAS_SPLITRGBROW_NEON #define HAS_SPLITUVROW_NEON +#define HAS_SPLITUVROW_16_NEON +#define HAS_SWAPUVROW_NEON #define HAS_UYVYTOARGBROW_NEON #define HAS_UYVYTOUV422ROW_NEON #define HAS_UYVYTOUVROW_NEON @@ -346,6 +520,7 @@ extern "C" { #define HAS_ARGBCOLORMATRIXROW_NEON #define HAS_ARGBGRAYROW_NEON #define HAS_ARGBMIRRORROW_NEON +#define HAS_RGB24MIRRORROW_NEON #define HAS_ARGBMULTIPLYROW_NEON #define HAS_ARGBQUANTIZEROW_NEON #define HAS_ARGBSEPIAROW_NEON @@ -360,22 +535,195 @@ extern "C" { #define HAS_SOBELYROW_NEON #endif -// The following are available on Mips platforms: -#if !defined(LIBYUV_DISABLE_MIPS) && defined(__mips__) && \ - (_MIPS_SIM == _MIPS_SIM_ABI32) && (__mips_isa_rev < 6) -#define HAS_COPYROW_MIPS -#if defined(__mips_dsp) && (__mips_dsp_rev >= 2) -#define HAS_I422TOARGBROW_DSPR2 -#define HAS_INTERPOLATEROW_DSPR2 -#define HAS_MIRRORROW_DSPR2 -#define HAS_MIRRORUVROW_DSPR2 -#define HAS_SPLITUVROW_DSPR2 -#endif +// The following are available on AArch64 platforms: +#if !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__) +#define HAS_SCALESUMSAMPLES_NEON +#define HAS_GAUSSROW_F32_NEON +#define HAS_GAUSSCOL_F32_NEON #endif - #if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) -#define HAS_MIRRORROW_MSA +#define HAS_ABGRTOUVROW_MSA +#define HAS_ABGRTOYROW_MSA +#define HAS_ARGB1555TOARGBROW_MSA +#define HAS_ARGB1555TOUVROW_MSA +#define HAS_ARGB1555TOYROW_MSA +#define HAS_ARGB4444TOARGBROW_MSA +#define HAS_ARGBADDROW_MSA +#define HAS_ARGBATTENUATEROW_MSA +#define HAS_ARGBBLENDROW_MSA +#define HAS_ARGBCOLORMATRIXROW_MSA +#define HAS_ARGBEXTRACTALPHAROW_MSA +#define HAS_ARGBGRAYROW_MSA #define HAS_ARGBMIRRORROW_MSA +#define HAS_ARGBMULTIPLYROW_MSA +#define HAS_ARGBQUANTIZEROW_MSA +#define HAS_ARGBSEPIAROW_MSA +#define HAS_ARGBSETROW_MSA +#define HAS_ARGBSHADEROW_MSA +#define HAS_ARGBSHUFFLEROW_MSA +#define HAS_ARGBSUBTRACTROW_MSA +#define HAS_ARGBTOARGB1555ROW_MSA +#define HAS_ARGBTOARGB4444ROW_MSA +#define HAS_ARGBTORAWROW_MSA +#define HAS_ARGBTORGB24ROW_MSA +#define HAS_ARGBTORGB565DITHERROW_MSA +#define HAS_ARGBTORGB565ROW_MSA +#define HAS_ARGBTOUV444ROW_MSA +#define HAS_ARGBTOUVJROW_MSA +#define HAS_ARGBTOUVROW_MSA +#define HAS_ARGBTOYJROW_MSA +#define HAS_ARGBTOYROW_MSA +#define HAS_BGRATOUVROW_MSA +#define HAS_BGRATOYROW_MSA +#define HAS_HALFFLOATROW_MSA +#define HAS_I400TOARGBROW_MSA +#define HAS_I422TOUYVYROW_MSA +#define HAS_I422TOYUY2ROW_MSA +#define HAS_I422TOARGBROW_MSA +#define HAS_I422TORGBAROW_MSA +#define HAS_I422ALPHATOARGBROW_MSA +#define HAS_I422TORGB24ROW_MSA +#define HAS_I422TORGB565ROW_MSA +#define HAS_I422TOARGB4444ROW_MSA +#define HAS_I422TOARGB1555ROW_MSA +#define HAS_NV12TOARGBROW_MSA +#define HAS_NV12TORGB565ROW_MSA +#define HAS_NV21TOARGBROW_MSA +#define HAS_YUY2TOARGBROW_MSA +#define HAS_UYVYTOARGBROW_MSA +#define HAS_I444TOARGBROW_MSA +#define HAS_INTERPOLATEROW_MSA +#define HAS_J400TOARGBROW_MSA +#define HAS_MERGEUVROW_MSA +#define HAS_MIRRORROW_MSA +#define HAS_MIRRORUVROW_MSA +#define HAS_MIRRORSPLITUVROW_MSA +#define HAS_RAWTOARGBROW_MSA +#define HAS_RAWTORGB24ROW_MSA +#define HAS_RAWTOUVROW_MSA +#define HAS_RAWTOYROW_MSA +#define HAS_RGB24TOARGBROW_MSA +#define HAS_RGB24TOUVROW_MSA +#define HAS_RGB24TOYROW_MSA +#define HAS_RGB565TOARGBROW_MSA +#define HAS_RGB565TOUVROW_MSA +#define HAS_RGB565TOYROW_MSA +#define HAS_RGBATOUVROW_MSA +#define HAS_RGBATOYROW_MSA +#define HAS_SETROW_MSA +#define HAS_SOBELROW_MSA +#define HAS_SOBELTOPLANEROW_MSA +#define HAS_SOBELXROW_MSA +#define HAS_SOBELXYROW_MSA +#define HAS_SOBELYROW_MSA +#define HAS_SPLITUVROW_MSA +#define HAS_UYVYTOUVROW_MSA +#define HAS_UYVYTOYROW_MSA +#define HAS_YUY2TOUV422ROW_MSA +#define HAS_YUY2TOUVROW_MSA +#define HAS_YUY2TOYROW_MSA +#endif + +#if !defined(LIBYUV_DISABLE_LSX) && defined(__loongarch_sx) +#define HAS_ARGB4444TOARGBROW_LSX +#define HAS_ARGB1555TOARGBROW_LSX +#define HAS_RGB565TOARGBROW_LSX +#define HAS_RGB24TOARGBROW_LSX +#define HAS_RAWTOARGBROW_LSX +#define HAS_ARGB1555TOYROW_LSX +#define HAS_ARGB1555TOUVROW_LSX +#define HAS_RGB565TOYROW_LSX +#define HAS_RGB565TOUVROW_LSX +#define HAS_RGB24TOYROW_LSX +#define HAS_RGB24TOUVROW_LSX +#define HAS_RAWTOYROW_LSX +#define HAS_RAWTOUVROW_LSX +#define HAS_NV12TOARGBROW_LSX +#define HAS_NV12TORGB565ROW_LSX +#define HAS_NV21TOARGBROW_LSX +#define HAS_SOBELROW_LSX +#define HAS_SOBELTOPLANEROW_LSX +#define HAS_SOBELXYROW_LSX +#define HAS_ARGBTOYJROW_LSX +#define HAS_BGRATOYROW_LSX +#define HAS_BGRATOUVROW_LSX +#define HAS_ABGRTOYROW_LSX +#define HAS_ABGRTOUVROW_LSX +#define HAS_RGBATOYROW_LSX +#define HAS_RGBATOUVROW_LSX +#define HAS_ARGBTOUVJROW_LSX +#define HAS_I444TOARGBROW_LSX +#define HAS_I400TOARGBROW_LSX +#define HAS_J400TOARGBROW_LSX +#define HAS_YUY2TOARGBROW_LSX +#define HAS_UYVYTOARGBROW_LSX +#define HAS_INTERPOLATEROW_LSX +#define HAS_ARGBSETROW_LSX +#define HAS_RAWTORGB24ROW_LSX +#define HAS_MERGEUVROW_LSX +#define HAS_ARGBEXTRACTALPHAROW_LSX +#define HAS_ARGBBLENDROW_LSX +#define HAS_ARGBQUANTIZEROW_LSX +#define HAS_ARGBCOLORMATRIXROW_LSX +#define HAS_SPLITUVROW_LSX +#define HAS_SETROW_LSX +#define HAS_MIRRORSPLITUVROW_LSX +#endif + +#if !defined(LIBYUV_DISABLE_LASX) && defined(__loongarch_asx) +#define HAS_I422TOARGBROW_LASX +#define HAS_I422TORGBAROW_LASX +#define HAS_I422ALPHATOARGBROW_LASX +#define HAS_I422TOYUY2ROW_LASX +#define HAS_I422TOUYVYROW_LASX +#define HAS_MIRRORROW_LASX +#define HAS_MIRRORUVROW_LASX +#define HAS_ARGBMIRRORROW_LASX +#define HAS_I422TORGB24ROW_LASX +#define HAS_I422TORGB565ROW_LASX +#define HAS_I422TOARGB4444ROW_LASX +#define HAS_I422TOARGB1555ROW_LASX +#define HAS_YUY2TOUVROW_LASX +#define HAS_YUY2TOYROW_LASX +#define HAS_YUY2TOUV422ROW_LASX +#define HAS_UYVYTOYROW_LASX +#define HAS_UYVYTOUVROW_LASX +#define HAS_UYVYTOUV422ROW_LASX +#define HAS_ARGBTOYROW_LASX +#define HAS_ARGBTOUVROW_LASX +#define HAS_ARGBTORGB24ROW_LASX +#define HAS_ARGBTORAWROW_LASX +#define HAS_ARGBTORGB565ROW_LASX +#define HAS_ARGBTOARGB1555ROW_LASX +#define HAS_ARGBTOARGB4444ROW_LASX +#define HAS_ARGBTOUV444ROW_LASX +#define HAS_ARGBMULTIPLYROW_LASX +#define HAS_ARGBADDROW_LASX +#define HAS_ARGBSUBTRACTROW_LASX +#define HAS_ARGBATTENUATEROW_LASX +#define HAS_ARGBTORGB565DITHERROW_LASX +#define HAS_ARGBSHUFFLEROW_LASX +#define HAS_ARGBSHADEROW_LASX +#define HAS_ARGBGRAYROW_LASX +#define HAS_ARGBSEPIAROW_LASX +#define HAS_ARGB4444TOARGBROW_LASX +#define HAS_ARGB1555TOARGBROW_LASX +#define HAS_RGB565TOARGBROW_LASX +#define HAS_RGB24TOARGBROW_LASX +#define HAS_RAWTOARGBROW_LASX +#define HAS_ARGB1555TOYROW_LASX +#define HAS_ARGB1555TOUVROW_LASX +#define HAS_RGB565TOYROW_LASX +#define HAS_RGB565TOUVROW_LASX +#define HAS_RGB24TOYROW_LASX +#define HAS_RGB24TOUVROW_LASX +#define HAS_RAWTOYROW_LASX +#define HAS_RAWTOUVROW_LASX +#define HAS_NV12TOARGBROW_LASX +#define HAS_NV12TORGB565ROW_LASX +#define HAS_NV21TOARGBROW_LASX +#define HAS_ARGBTOYJROW_LASX +#define HAS_ARGBTOUVJROW_LASX #endif #if defined(_MSC_VER) && !defined(__CLR_VER) && !defined(__clang__) @@ -384,18 +732,20 @@ extern "C" { #else #define SIMD_ALIGNED(var) __declspec(align(16)) var #endif -typedef __declspec(align(16)) int16 vec16[8]; -typedef __declspec(align(16)) int32 vec32[4]; -typedef __declspec(align(16)) int8 vec8[16]; -typedef __declspec(align(16)) uint16 uvec16[8]; -typedef __declspec(align(16)) uint32 uvec32[4]; -typedef __declspec(align(16)) uint8 uvec8[16]; -typedef __declspec(align(32)) int16 lvec16[16]; -typedef __declspec(align(32)) int32 lvec32[8]; -typedef __declspec(align(32)) int8 lvec8[32]; -typedef __declspec(align(32)) uint16 ulvec16[16]; -typedef __declspec(align(32)) uint32 ulvec32[8]; -typedef __declspec(align(32)) uint8 ulvec8[32]; +#define LIBYUV_NOINLINE __declspec(noinline) +typedef __declspec(align(16)) int16_t vec16[8]; +typedef __declspec(align(16)) int32_t vec32[4]; +typedef __declspec(align(16)) float vecf32[4]; +typedef __declspec(align(16)) int8_t vec8[16]; +typedef __declspec(align(16)) uint16_t uvec16[8]; +typedef __declspec(align(16)) uint32_t uvec32[4]; +typedef __declspec(align(16)) uint8_t uvec8[16]; +typedef __declspec(align(32)) int16_t lvec16[16]; +typedef __declspec(align(32)) int32_t lvec32[8]; +typedef __declspec(align(32)) int8_t lvec8[32]; +typedef __declspec(align(32)) uint16_t ulvec16[16]; +typedef __declspec(align(32)) uint32_t ulvec32[8]; +typedef __declspec(align(32)) uint8_t ulvec8[32]; #elif !defined(__pnacl__) && (defined(__GNUC__) || defined(__clang__)) // Caveat GCC 4.2 to 4.7 have a known issue using vectors with const. #if defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2) @@ -403,83 +753,72 @@ typedef __declspec(align(32)) uint8 ulvec8[32]; #else #define SIMD_ALIGNED(var) var __attribute__((aligned(16))) #endif -typedef int16 __attribute__((vector_size(16))) vec16; -typedef int32 __attribute__((vector_size(16))) vec32; -typedef int8 __attribute__((vector_size(16))) vec8; -typedef uint16 __attribute__((vector_size(16))) uvec16; -typedef uint32 __attribute__((vector_size(16))) uvec32; -typedef uint8 __attribute__((vector_size(16))) uvec8; -typedef int16 __attribute__((vector_size(32))) lvec16; -typedef int32 __attribute__((vector_size(32))) lvec32; -typedef int8 __attribute__((vector_size(32))) lvec8; -typedef uint16 __attribute__((vector_size(32))) ulvec16; -typedef uint32 __attribute__((vector_size(32))) ulvec32; -typedef uint8 __attribute__((vector_size(32))) ulvec8; +#define LIBYUV_NOINLINE __attribute__((noinline)) +typedef int16_t __attribute__((vector_size(16))) vec16; +typedef int32_t __attribute__((vector_size(16))) vec32; +typedef float __attribute__((vector_size(16))) vecf32; +typedef int8_t __attribute__((vector_size(16))) vec8; +typedef uint16_t __attribute__((vector_size(16))) uvec16; +typedef uint32_t __attribute__((vector_size(16))) uvec32; +typedef uint8_t __attribute__((vector_size(16))) uvec8; +typedef int16_t __attribute__((vector_size(32))) lvec16; +typedef int32_t __attribute__((vector_size(32))) lvec32; +typedef int8_t __attribute__((vector_size(32))) lvec8; +typedef uint16_t __attribute__((vector_size(32))) ulvec16; +typedef uint32_t __attribute__((vector_size(32))) ulvec32; +typedef uint8_t __attribute__((vector_size(32))) ulvec8; #else #define SIMD_ALIGNED(var) var -typedef int16 vec16[8]; -typedef int32 vec32[4]; -typedef int8 vec8[16]; -typedef uint16 uvec16[8]; -typedef uint32 uvec32[4]; -typedef uint8 uvec8[16]; -typedef int16 lvec16[16]; -typedef int32 lvec32[8]; -typedef int8 lvec8[32]; -typedef uint16 ulvec16[16]; -typedef uint32 ulvec32[8]; -typedef uint8 ulvec8[32]; +#define LIBYUV_NOINLINE +typedef int16_t vec16[8]; +typedef int32_t vec32[4]; +typedef float vecf32[4]; +typedef int8_t vec8[16]; +typedef uint16_t uvec16[8]; +typedef uint32_t uvec32[4]; +typedef uint8_t uvec8[16]; +typedef int16_t lvec16[16]; +typedef int32_t lvec32[8]; +typedef int8_t lvec8[32]; +typedef uint16_t ulvec16[16]; +typedef uint32_t ulvec32[8]; +typedef uint8_t ulvec8[32]; #endif -#if defined(__aarch64__) -// This struct is for Arm64 color conversion. -struct YuvConstants { - uvec16 kUVToRB; - uvec16 kUVToRB2; - uvec16 kUVToG; - uvec16 kUVToG2; - vec16 kUVBiasBGR; - vec32 kYToRgb; -}; -#elif defined(__arm__) -// This struct is for ArmV7 color conversion. +#if defined(__aarch64__) || defined(__arm__) +// This struct is for ARM color conversion. struct YuvConstants { - uvec8 kUVToRB; - uvec8 kUVToG; - vec16 kUVBiasBGR; - vec32 kYToRgb; + uvec8 kUVCoeff; + vec16 kRGBCoeffBias; }; #else // This struct is for Intel color conversion. struct YuvConstants { - int8 kUVToB[32]; - int8 kUVToG[32]; - int8 kUVToR[32]; - int16 kUVBiasB[16]; - int16 kUVBiasG[16]; - int16 kUVBiasR[16]; - int16 kYToRgb[16]; + uint8_t kUVToB[32]; + uint8_t kUVToG[32]; + uint8_t kUVToR[32]; + int16_t kYToRgb[16]; + int16_t kYBiasToRgb[16]; }; // Offsets into YuvConstants structure -#define KUVTOB 0 -#define KUVTOG 32 -#define KUVTOR 64 -#define KUVBIASB 96 -#define KUVBIASG 128 -#define KUVBIASR 160 -#define KYTORGB 192 +#define KUVTOB 0 +#define KUVTOG 32 +#define KUVTOR 64 +#define KYTORGB 96 +#define KYBIASTORGB 128 + #endif -// Conversion matrix for YUV to RGB -extern const struct YuvConstants SIMD_ALIGNED(kYuvI601Constants); // BT.601 -extern const struct YuvConstants SIMD_ALIGNED(kYuvJPEGConstants); // JPeg -extern const struct YuvConstants SIMD_ALIGNED(kYuvH709Constants); // BT.709 +#define IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a)-1))) -// Conversion matrix for YVU to BGR -extern const struct YuvConstants SIMD_ALIGNED(kYvuI601Constants); // BT.601 -extern const struct YuvConstants SIMD_ALIGNED(kYvuJPEGConstants); // JPeg -extern const struct YuvConstants SIMD_ALIGNED(kYvuH709Constants); // BT.709 +#define align_buffer_64(var, size) \ + uint8_t* var##_mem = (uint8_t*)(malloc((size) + 63)); /* NOLINT */ \ + uint8_t* var = (uint8_t*)(((intptr_t)(var##_mem) + 63) & ~63) /* NOLINT */ + +#define free_aligned_buffer_64(var) \ + free(var##_mem); \ + var = 0 #if defined(__APPLE__) || defined(__x86_64__) || defined(__llvm__) #define OMITFP @@ -493,1467 +832,4646 @@ extern const struct YuvConstants SIMD_ALIGNED(kYvuH709Constants); // BT.709 #else #define LABELALIGN #endif -#if defined(__native_client__) && defined(__x86_64__) -// r14 is used for MEMOP macros. -#define NACL_R14 "r14", -#define BUNDLELOCK ".bundle_lock\n" -#define BUNDLEUNLOCK ".bundle_unlock\n" -#define MEMACCESS(base) "%%nacl:(%%r15,%q" #base ")" -#define MEMACCESS2(offset, base) "%%nacl:" #offset "(%%r15,%q" #base ")" -#define MEMLEA(offset, base) #offset "(%q" #base ")" -#define MEMLEA3(offset, index, scale) \ - #offset "(,%q" #index "," #scale ")" -#define MEMLEA4(offset, base, index, scale) \ - #offset "(%q" #base ",%q" #index "," #scale ")" -#define MEMMOVESTRING(s, d) "%%nacl:(%q" #s "),%%nacl:(%q" #d "), %%r15" -#define MEMSTORESTRING(reg, d) "%%" #reg ",%%nacl:(%q" #d "), %%r15" -#define MEMOPREG(opcode, offset, base, index, scale, reg) \ - BUNDLELOCK \ - "lea " #offset "(%q" #base ",%q" #index "," #scale "),%%r14d\n" \ - #opcode " (%%r15,%%r14),%%" #reg "\n" \ - BUNDLEUNLOCK -#define MEMOPMEM(opcode, reg, offset, base, index, scale) \ - BUNDLELOCK \ - "lea " #offset "(%q" #base ",%q" #index "," #scale "),%%r14d\n" \ - #opcode " %%" #reg ",(%%r15,%%r14)\n" \ - BUNDLEUNLOCK -#define MEMOPARG(opcode, offset, base, index, scale, arg) \ - BUNDLELOCK \ - "lea " #offset "(%q" #base ",%q" #index "," #scale "),%%r14d\n" \ - #opcode " (%%r15,%%r14),%" #arg "\n" \ - BUNDLEUNLOCK -#define VMEMOPREG(opcode, offset, base, index, scale, reg1, reg2) \ - BUNDLELOCK \ - "lea " #offset "(%q" #base ",%q" #index "," #scale "),%%r14d\n" \ - #opcode " (%%r15,%%r14),%%" #reg1 ",%%" #reg2 "\n" \ - BUNDLEUNLOCK -#define VEXTOPMEM(op, sel, reg, offset, base, index, scale) \ - BUNDLELOCK \ - "lea " #offset "(%q" #base ",%q" #index "," #scale "),%%r14d\n" \ - #op " $" #sel ",%%" #reg ",(%%r15,%%r14)\n" \ - BUNDLEUNLOCK -#else // defined(__native_client__) && defined(__x86_64__) -#define NACL_R14 -#define BUNDLEALIGN -#define MEMACCESS(base) "(%" #base ")" -#define MEMACCESS2(offset, base) #offset "(%" #base ")" -#define MEMLEA(offset, base) #offset "(%" #base ")" -#define MEMLEA3(offset, index, scale) \ - #offset "(,%" #index "," #scale ")" -#define MEMLEA4(offset, base, index, scale) \ - #offset "(%" #base ",%" #index "," #scale ")" -#define MEMMOVESTRING(s, d) -#define MEMSTORESTRING(reg, d) -#define MEMOPREG(opcode, offset, base, index, scale, reg) \ - #opcode " " #offset "(%" #base ",%" #index "," #scale "),%%" #reg "\n" -#define MEMOPMEM(opcode, reg, offset, base, index, scale) \ - #opcode " %%" #reg ","#offset "(%" #base ",%" #index "," #scale ")\n" -#define MEMOPARG(opcode, offset, base, index, scale, arg) \ - #opcode " " #offset "(%" #base ",%" #index "," #scale "),%" #arg "\n" -#define VMEMOPREG(opcode, offset, base, index, scale, reg1, reg2) \ - #opcode " " #offset "(%" #base ",%" #index "," #scale "),%%" #reg1 ",%%" \ - #reg2 "\n" -#define VEXTOPMEM(op, sel, reg, offset, base, index, scale) \ - #op " $" #sel ",%%" #reg ","#offset "(%" #base ",%" #index "," #scale ")\n" -#endif // defined(__native_client__) && defined(__x86_64__) - -#if defined(__arm__) || defined(__aarch64__) -#undef MEMACCESS -#if defined(__native_client__) -#define MEMACCESS(base) ".p2align 3\nbic %" #base ", #0xc0000000\n" -#else -#define MEMACCESS(base) -#endif + +// Intel Code Analizer markers. Insert IACA_START IACA_END around code to be +// measured and then run with iaca -64 libyuv_unittest. +// IACA_ASM_START amd IACA_ASM_END are equivalents that can be used within +// inline assembly blocks. +// example of iaca: +// ~/iaca-lin64/bin/iaca.sh -64 -analysis LATENCY out/Release/libyuv_unittest + +#if defined(__x86_64__) || defined(__i386__) + +#define IACA_ASM_START \ + ".byte 0x0F, 0x0B\n" \ + " movl $111, %%ebx\n" \ + ".byte 0x64, 0x67, 0x90\n" + +#define IACA_ASM_END \ + " movl $222, %%ebx\n" \ + ".byte 0x64, 0x67, 0x90\n" \ + ".byte 0x0F, 0x0B\n" + +#define IACA_SSC_MARK(MARK_ID) \ + __asm__ __volatile__("\n\t movl $" #MARK_ID \ + ", %%ebx" \ + "\n\t .byte 0x64, 0x67, 0x90" \ + : \ + : \ + : "memory"); + +#define IACA_UD_BYTES __asm__ __volatile__("\n\t .byte 0x0F, 0x0B"); + +#else /* Visual C */ +#define IACA_UD_BYTES \ + { __asm _emit 0x0F __asm _emit 0x0B } + +#define IACA_SSC_MARK(x) \ + { __asm mov ebx, x __asm _emit 0x64 __asm _emit 0x67 __asm _emit 0x90 } + +#define IACA_VC64_START __writegsbyte(111, 111); +#define IACA_VC64_END __writegsbyte(222, 222); #endif -void I444ToARGBRow_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +#define IACA_START \ + { \ + IACA_UD_BYTES \ + IACA_SSC_MARK(111) \ + } +#define IACA_END \ + { \ + IACA_SSC_MARK(222) \ + IACA_UD_BYTES \ + } + +void I444ToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I422ToARGBRow_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I422AlphaToARGBRow_NEON(const uint8* y_buf, - const uint8* u_buf, - const uint8* v_buf, - const uint8* a_buf, - uint8* dst_argb, +void I444AlphaToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I422ToARGBRow_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I411ToARGBRow_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I422ToRGBARow_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgba, +void I422AlphaToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgba, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB24Row_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgb24, +void I422ToRGB24Row_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb24, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB565Row_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgb565, +void I422ToRGB565Row_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB1555Row_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb1555, +void I422ToARGB1555Row_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB4444Row_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb4444, +void I422ToARGB4444Row_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, const struct YuvConstants* yuvconstants, int width); -void NV12ToARGBRow_NEON(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, +void NV12ToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void NV12ToRGB565Row_NEON(const uint8* src_y, - const uint8* src_uv, - uint8* dst_rgb565, +void NV12ToRGB565Row_NEON(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, const struct YuvConstants* yuvconstants, int width); -void NV21ToARGBRow_NEON(const uint8* src_y, - const uint8* src_vu, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void YUY2ToARGBRow_NEON(const uint8* src_yuy2, - uint8* dst_argb, +void NV21ToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void UYVYToARGBRow_NEON(const uint8* src_uyvy, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); - -void ARGBToYRow_AVX2(const uint8* src_argb, uint8* dst_y, int width); -void ARGBToYRow_Any_AVX2(const uint8* src_argb, uint8* dst_y, int width); -void ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int width); -void ARGBToYJRow_AVX2(const uint8* src_argb, uint8* dst_y, int width); -void ARGBToYJRow_Any_AVX2(const uint8* src_argb, uint8* dst_y, int width); -void ARGBToYJRow_SSSE3(const uint8* src_argb, uint8* dst_y, int width); -void BGRAToYRow_SSSE3(const uint8* src_bgra, uint8* dst_y, int width); -void ABGRToYRow_SSSE3(const uint8* src_abgr, uint8* dst_y, int width); -void RGBAToYRow_SSSE3(const uint8* src_rgba, uint8* dst_y, int width); -void RGB24ToYRow_SSSE3(const uint8* src_rgb24, uint8* dst_y, int width); -void RAWToYRow_SSSE3(const uint8* src_raw, uint8* dst_y, int width); -void ARGBToYRow_NEON(const uint8* src_argb, uint8* dst_y, int width); -void ARGBToYJRow_NEON(const uint8* src_argb, uint8* dst_y, int width); -void ARGBToUV444Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v, - int width); -void ARGBToUV411Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v, - int width); -void ARGBToUVRow_NEON(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVJRow_NEON(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void BGRAToUVRow_NEON(const uint8* src_bgra, int src_stride_bgra, - uint8* dst_u, uint8* dst_v, int width); -void ABGRToUVRow_NEON(const uint8* src_abgr, int src_stride_abgr, - uint8* dst_u, uint8* dst_v, int width); -void RGBAToUVRow_NEON(const uint8* src_rgba, int src_stride_rgba, - uint8* dst_u, uint8* dst_v, int width); -void RGB24ToUVRow_NEON(const uint8* src_rgb24, int src_stride_rgb24, - uint8* dst_u, uint8* dst_v, int width); -void RAWToUVRow_NEON(const uint8* src_raw, int src_stride_raw, - uint8* dst_u, uint8* dst_v, int width); -void RGB565ToUVRow_NEON(const uint8* src_rgb565, int src_stride_rgb565, - uint8* dst_u, uint8* dst_v, int width); -void ARGB1555ToUVRow_NEON(const uint8* src_argb1555, int src_stride_argb1555, - uint8* dst_u, uint8* dst_v, int width); -void ARGB4444ToUVRow_NEON(const uint8* src_argb4444, int src_stride_argb4444, - uint8* dst_u, uint8* dst_v, int width); -void BGRAToYRow_NEON(const uint8* src_bgra, uint8* dst_y, int width); -void ABGRToYRow_NEON(const uint8* src_abgr, uint8* dst_y, int width); -void RGBAToYRow_NEON(const uint8* src_rgba, uint8* dst_y, int width); -void RGB24ToYRow_NEON(const uint8* src_rgb24, uint8* dst_y, int width); -void RAWToYRow_NEON(const uint8* src_raw, uint8* dst_y, int width); -void RGB565ToYRow_NEON(const uint8* src_rgb565, uint8* dst_y, int width); -void ARGB1555ToYRow_NEON(const uint8* src_argb1555, uint8* dst_y, int width); -void ARGB4444ToYRow_NEON(const uint8* src_argb4444, uint8* dst_y, int width); -void ARGBToYRow_C(const uint8* src_argb, uint8* dst_y, int width); -void ARGBToYJRow_C(const uint8* src_argb, uint8* dst_y, int width); -void BGRAToYRow_C(const uint8* src_bgra, uint8* dst_y, int width); -void ABGRToYRow_C(const uint8* src_abgr, uint8* dst_y, int width); -void RGBAToYRow_C(const uint8* src_rgba, uint8* dst_y, int width); -void RGB24ToYRow_C(const uint8* src_rgb24, uint8* dst_y, int width); -void RAWToYRow_C(const uint8* src_raw, uint8* dst_y, int width); -void RGB565ToYRow_C(const uint8* src_rgb565, uint8* dst_y, int width); -void ARGB1555ToYRow_C(const uint8* src_argb1555, uint8* dst_y, int width); -void ARGB4444ToYRow_C(const uint8* src_argb4444, uint8* dst_y, int width); -void ARGBToYRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int width); -void ARGBToYJRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int width); -void BGRAToYRow_Any_SSSE3(const uint8* src_bgra, uint8* dst_y, int width); -void ABGRToYRow_Any_SSSE3(const uint8* src_abgr, uint8* dst_y, int width); -void RGBAToYRow_Any_SSSE3(const uint8* src_rgba, uint8* dst_y, int width); -void RGB24ToYRow_Any_SSSE3(const uint8* src_rgb24, uint8* dst_y, int width); -void RAWToYRow_Any_SSSE3(const uint8* src_raw, uint8* dst_y, int width); -void ARGBToYRow_Any_NEON(const uint8* src_argb, uint8* dst_y, int width); -void ARGBToYJRow_Any_NEON(const uint8* src_argb, uint8* dst_y, int width); -void BGRAToYRow_Any_NEON(const uint8* src_bgra, uint8* dst_y, int width); -void ABGRToYRow_Any_NEON(const uint8* src_abgr, uint8* dst_y, int width); -void RGBAToYRow_Any_NEON(const uint8* src_rgba, uint8* dst_y, int width); -void RGB24ToYRow_Any_NEON(const uint8* src_rgb24, uint8* dst_y, int width); -void RAWToYRow_Any_NEON(const uint8* src_raw, uint8* dst_y, int width); -void RGB565ToYRow_Any_NEON(const uint8* src_rgb565, uint8* dst_y, int width); -void ARGB1555ToYRow_Any_NEON(const uint8* src_argb1555, uint8* dst_y, - int width); -void ARGB4444ToYRow_Any_NEON(const uint8* src_argb4444, uint8* dst_y, - int width); - -void ARGBToUVRow_AVX2(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVJRow_AVX2(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVRow_SSSE3(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVJRow_SSSE3(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void BGRAToUVRow_SSSE3(const uint8* src_bgra, int src_stride_bgra, - uint8* dst_u, uint8* dst_v, int width); -void ABGRToUVRow_SSSE3(const uint8* src_abgr, int src_stride_abgr, - uint8* dst_u, uint8* dst_v, int width); -void RGBAToUVRow_SSSE3(const uint8* src_rgba, int src_stride_rgba, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVRow_Any_AVX2(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVJRow_Any_AVX2(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVRow_Any_SSSE3(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVJRow_Any_SSSE3(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void BGRAToUVRow_Any_SSSE3(const uint8* src_bgra, int src_stride_bgra, - uint8* dst_u, uint8* dst_v, int width); -void ABGRToUVRow_Any_SSSE3(const uint8* src_abgr, int src_stride_abgr, - uint8* dst_u, uint8* dst_v, int width); -void RGBAToUVRow_Any_SSSE3(const uint8* src_rgba, int src_stride_rgba, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUV444Row_Any_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v, - int width); -void ARGBToUV411Row_Any_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v, - int width); -void ARGBToUVRow_Any_NEON(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVJRow_Any_NEON(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void BGRAToUVRow_Any_NEON(const uint8* src_bgra, int src_stride_bgra, - uint8* dst_u, uint8* dst_v, int width); -void ABGRToUVRow_Any_NEON(const uint8* src_abgr, int src_stride_abgr, - uint8* dst_u, uint8* dst_v, int width); -void RGBAToUVRow_Any_NEON(const uint8* src_rgba, int src_stride_rgba, - uint8* dst_u, uint8* dst_v, int width); -void RGB24ToUVRow_Any_NEON(const uint8* src_rgb24, int src_stride_rgb24, - uint8* dst_u, uint8* dst_v, int width); -void RAWToUVRow_Any_NEON(const uint8* src_raw, int src_stride_raw, - uint8* dst_u, uint8* dst_v, int width); -void RGB565ToUVRow_Any_NEON(const uint8* src_rgb565, int src_stride_rgb565, - uint8* dst_u, uint8* dst_v, int width); -void ARGB1555ToUVRow_Any_NEON(const uint8* src_argb1555, - int src_stride_argb1555, - uint8* dst_u, uint8* dst_v, int width); -void ARGB4444ToUVRow_Any_NEON(const uint8* src_argb4444, - int src_stride_argb4444, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVRow_C(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUVJRow_C(const uint8* src_argb, int src_stride_argb, - uint8* dst_u, uint8* dst_v, int width); -void BGRAToUVRow_C(const uint8* src_bgra, int src_stride_bgra, - uint8* dst_u, uint8* dst_v, int width); -void ABGRToUVRow_C(const uint8* src_abgr, int src_stride_abgr, - uint8* dst_u, uint8* dst_v, int width); -void RGBAToUVRow_C(const uint8* src_rgba, int src_stride_rgba, - uint8* dst_u, uint8* dst_v, int width); -void RGB24ToUVRow_C(const uint8* src_rgb24, int src_stride_rgb24, - uint8* dst_u, uint8* dst_v, int width); -void RAWToUVRow_C(const uint8* src_raw, int src_stride_raw, - uint8* dst_u, uint8* dst_v, int width); -void RGB565ToUVRow_C(const uint8* src_rgb565, int src_stride_rgb565, - uint8* dst_u, uint8* dst_v, int width); -void ARGB1555ToUVRow_C(const uint8* src_argb1555, int src_stride_argb1555, - uint8* dst_u, uint8* dst_v, int width); -void ARGB4444ToUVRow_C(const uint8* src_argb4444, int src_stride_argb4444, - uint8* dst_u, uint8* dst_v, int width); - -void ARGBToUV444Row_SSSE3(const uint8* src_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUV444Row_Any_SSSE3(const uint8* src_argb, - uint8* dst_u, uint8* dst_v, int width); - -void ARGBToUV444Row_C(const uint8* src_argb, - uint8* dst_u, uint8* dst_v, int width); -void ARGBToUV411Row_C(const uint8* src_argb, - uint8* dst_u, uint8* dst_v, int width); - -void MirrorRow_AVX2(const uint8* src, uint8* dst, int width); -void MirrorRow_SSSE3(const uint8* src, uint8* dst, int width); -void MirrorRow_NEON(const uint8* src, uint8* dst, int width); -void MirrorRow_DSPR2(const uint8* src, uint8* dst, int width); -void MirrorRow_MSA(const uint8* src, uint8* dst, int width); -void MirrorRow_C(const uint8* src, uint8* dst, int width); -void MirrorRow_Any_AVX2(const uint8* src, uint8* dst, int width); -void MirrorRow_Any_SSSE3(const uint8* src, uint8* dst, int width); -void MirrorRow_Any_SSE2(const uint8* src, uint8* dst, int width); -void MirrorRow_Any_NEON(const uint8* src, uint8* dst, int width); -void MirrorRow_Any_MSA(const uint8* src, uint8* dst, int width); - -void MirrorUVRow_SSSE3(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); -void MirrorUVRow_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); -void MirrorUVRow_DSPR2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); -void MirrorUVRow_C(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int width); - -void ARGBMirrorRow_AVX2(const uint8* src, uint8* dst, int width); -void ARGBMirrorRow_SSE2(const uint8* src, uint8* dst, int width); -void ARGBMirrorRow_NEON(const uint8* src, uint8* dst, int width); -void ARGBMirrorRow_MSA(const uint8* src, uint8* dst, int width); -void ARGBMirrorRow_C(const uint8* src, uint8* dst, int width); -void ARGBMirrorRow_Any_AVX2(const uint8* src, uint8* dst, int width); -void ARGBMirrorRow_Any_SSE2(const uint8* src, uint8* dst, int width); -void ARGBMirrorRow_Any_NEON(const uint8* src, uint8* dst, int width); -void ARGBMirrorRow_Any_MSA(const uint8* src, uint8* dst, int width); - -void SplitUVRow_C(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int width); -void SplitUVRow_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); -void SplitUVRow_AVX2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); -void SplitUVRow_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); -void SplitUVRow_DSPR2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); -void SplitUVRow_Any_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); -void SplitUVRow_Any_AVX2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); -void SplitUVRow_Any_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); -void SplitUVRow_Any_DSPR2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, - int width); - -void MergeUVRow_C(const uint8* src_u, const uint8* src_v, uint8* dst_uv, - int width); -void MergeUVRow_SSE2(const uint8* src_u, const uint8* src_v, uint8* dst_uv, - int width); -void MergeUVRow_AVX2(const uint8* src_u, const uint8* src_v, uint8* dst_uv, - int width); -void MergeUVRow_NEON(const uint8* src_u, const uint8* src_v, uint8* dst_uv, - int width); -void MergeUVRow_Any_SSE2(const uint8* src_u, const uint8* src_v, uint8* dst_uv, - int width); -void MergeUVRow_Any_AVX2(const uint8* src_u, const uint8* src_v, uint8* dst_uv, - int width); -void MergeUVRow_Any_NEON(const uint8* src_u, const uint8* src_v, uint8* dst_uv, - int width); - -void CopyRow_SSE2(const uint8* src, uint8* dst, int count); -void CopyRow_AVX(const uint8* src, uint8* dst, int count); -void CopyRow_ERMS(const uint8* src, uint8* dst, int count); -void CopyRow_NEON(const uint8* src, uint8* dst, int count); -void CopyRow_MIPS(const uint8* src, uint8* dst, int count); -void CopyRow_C(const uint8* src, uint8* dst, int count); -void CopyRow_Any_SSE2(const uint8* src, uint8* dst, int count); -void CopyRow_Any_AVX(const uint8* src, uint8* dst, int count); -void CopyRow_Any_NEON(const uint8* src, uint8* dst, int count); - -void CopyRow_16_C(const uint16* src, uint16* dst, int count); - -void ARGBCopyAlphaRow_C(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBCopyAlphaRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBCopyAlphaRow_AVX2(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBCopyAlphaRow_Any_SSE2(const uint8* src_argb, uint8* dst_argb, - int width); -void ARGBCopyAlphaRow_Any_AVX2(const uint8* src_argb, uint8* dst_argb, - int width); - -void ARGBExtractAlphaRow_C(const uint8* src_argb, uint8* dst_a, int width); -void ARGBExtractAlphaRow_SSE2(const uint8* src_argb, uint8* dst_a, int width); -void ARGBExtractAlphaRow_NEON(const uint8* src_argb, uint8* dst_a, int width); -void ARGBExtractAlphaRow_Any_SSE2(const uint8* src_argb, uint8* dst_a, - int width); -void ARGBExtractAlphaRow_Any_NEON(const uint8* src_argb, uint8* dst_a, - int width); - -void ARGBCopyYToAlphaRow_C(const uint8* src_y, uint8* dst_argb, int width); -void ARGBCopyYToAlphaRow_SSE2(const uint8* src_y, uint8* dst_argb, int width); -void ARGBCopyYToAlphaRow_AVX2(const uint8* src_y, uint8* dst_argb, int width); -void ARGBCopyYToAlphaRow_Any_SSE2(const uint8* src_y, uint8* dst_argb, - int width); -void ARGBCopyYToAlphaRow_Any_AVX2(const uint8* src_y, uint8* dst_argb, - int width); - -void SetRow_C(uint8* dst, uint8 v8, int count); -void SetRow_X86(uint8* dst, uint8 v8, int count); -void SetRow_ERMS(uint8* dst, uint8 v8, int count); -void SetRow_NEON(uint8* dst, uint8 v8, int count); -void SetRow_Any_X86(uint8* dst, uint8 v8, int count); -void SetRow_Any_NEON(uint8* dst, uint8 v8, int count); - -void ARGBSetRow_C(uint8* dst_argb, uint32 v32, int count); -void ARGBSetRow_X86(uint8* dst_argb, uint32 v32, int count); -void ARGBSetRow_NEON(uint8* dst_argb, uint32 v32, int count); -void ARGBSetRow_Any_NEON(uint8* dst_argb, uint32 v32, int count); - -// ARGBShufflers for BGRAToARGB etc. -void ARGBShuffleRow_C(const uint8* src_argb, uint8* dst_argb, - const uint8* shuffler, int width); -void ARGBShuffleRow_SSE2(const uint8* src_argb, uint8* dst_argb, - const uint8* shuffler, int width); -void ARGBShuffleRow_SSSE3(const uint8* src_argb, uint8* dst_argb, - const uint8* shuffler, int width); -void ARGBShuffleRow_AVX2(const uint8* src_argb, uint8* dst_argb, - const uint8* shuffler, int width); -void ARGBShuffleRow_NEON(const uint8* src_argb, uint8* dst_argb, - const uint8* shuffler, int width); -void ARGBShuffleRow_Any_SSE2(const uint8* src_argb, uint8* dst_argb, - const uint8* shuffler, int width); -void ARGBShuffleRow_Any_SSSE3(const uint8* src_argb, uint8* dst_argb, - const uint8* shuffler, int width); -void ARGBShuffleRow_Any_AVX2(const uint8* src_argb, uint8* dst_argb, - const uint8* shuffler, int width); -void ARGBShuffleRow_Any_NEON(const uint8* src_argb, uint8* dst_argb, - const uint8* shuffler, int width); - -void RGB24ToARGBRow_SSSE3(const uint8* src_rgb24, uint8* dst_argb, int width); -void RAWToARGBRow_SSSE3(const uint8* src_raw, uint8* dst_argb, int width); -void RAWToRGB24Row_SSSE3(const uint8* src_raw, uint8* dst_rgb24, int width); -void RGB565ToARGBRow_SSE2(const uint8* src_rgb565, uint8* dst_argb, int width); -void ARGB1555ToARGBRow_SSE2(const uint8* src_argb1555, uint8* dst_argb, - int width); -void ARGB4444ToARGBRow_SSE2(const uint8* src_argb4444, uint8* dst_argb, - int width); -void RGB565ToARGBRow_AVX2(const uint8* src_rgb565, uint8* dst_argb, int width); -void ARGB1555ToARGBRow_AVX2(const uint8* src_argb1555, uint8* dst_argb, - int width); -void ARGB4444ToARGBRow_AVX2(const uint8* src_argb4444, uint8* dst_argb, - int width); - -void RGB24ToARGBRow_NEON(const uint8* src_rgb24, uint8* dst_argb, int width); -void RAWToARGBRow_NEON(const uint8* src_raw, uint8* dst_argb, int width); -void RAWToRGB24Row_NEON(const uint8* src_raw, uint8* dst_rgb24, int width); -void RGB565ToARGBRow_NEON(const uint8* src_rgb565, uint8* dst_argb, int width); -void ARGB1555ToARGBRow_NEON(const uint8* src_argb1555, uint8* dst_argb, - int width); -void ARGB4444ToARGBRow_NEON(const uint8* src_argb4444, uint8* dst_argb, - int width); -void RGB24ToARGBRow_C(const uint8* src_rgb24, uint8* dst_argb, int width); -void RAWToARGBRow_C(const uint8* src_raw, uint8* dst_argb, int width); -void RAWToRGB24Row_C(const uint8* src_raw, uint8* dst_rgb24, int width); -void RGB565ToARGBRow_C(const uint8* src_rgb, uint8* dst_argb, int width); -void ARGB1555ToARGBRow_C(const uint8* src_argb, uint8* dst_argb, int width); -void ARGB4444ToARGBRow_C(const uint8* src_argb, uint8* dst_argb, int width); -void RGB24ToARGBRow_Any_SSSE3(const uint8* src_rgb24, uint8* dst_argb, - int width); -void RAWToARGBRow_Any_SSSE3(const uint8* src_raw, uint8* dst_argb, int width); -void RAWToRGB24Row_Any_SSSE3(const uint8* src_raw, uint8* dst_rgb24, int width); - -void RGB565ToARGBRow_Any_SSE2(const uint8* src_rgb565, uint8* dst_argb, - int width); -void ARGB1555ToARGBRow_Any_SSE2(const uint8* src_argb1555, uint8* dst_argb, - int width); -void ARGB4444ToARGBRow_Any_SSE2(const uint8* src_argb4444, uint8* dst_argb, - int width); -void RGB565ToARGBRow_Any_AVX2(const uint8* src_rgb565, uint8* dst_argb, - int width); -void ARGB1555ToARGBRow_Any_AVX2(const uint8* src_argb1555, uint8* dst_argb, - int width); -void ARGB4444ToARGBRow_Any_AVX2(const uint8* src_argb4444, uint8* dst_argb, - int width); - -void RGB24ToARGBRow_Any_NEON(const uint8* src_rgb24, uint8* dst_argb, - int width); -void RAWToARGBRow_Any_NEON(const uint8* src_raw, uint8* dst_argb, int width); -void RAWToRGB24Row_Any_NEON(const uint8* src_raw, uint8* dst_rgb24, int width); -void RGB565ToARGBRow_Any_NEON(const uint8* src_rgb565, uint8* dst_argb, - int width); -void ARGB1555ToARGBRow_Any_NEON(const uint8* src_argb1555, uint8* dst_argb, - int width); -void ARGB4444ToARGBRow_Any_NEON(const uint8* src_argb4444, uint8* dst_argb, - int width); - -void ARGBToRGB24Row_SSSE3(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRAWRow_SSSE3(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRGB565Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB1555Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB4444Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int width); - -void ARGBToRGB565DitherRow_C(const uint8* src_argb, uint8* dst_rgb, - const uint32 dither4, int width); -void ARGBToRGB565DitherRow_SSE2(const uint8* src_argb, uint8* dst_rgb, - const uint32 dither4, int width); -void ARGBToRGB565DitherRow_AVX2(const uint8* src_argb, uint8* dst_rgb, - const uint32 dither4, int width); - -void ARGBToRGB565Row_AVX2(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB1555Row_AVX2(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB4444Row_AVX2(const uint8* src_argb, uint8* dst_rgb, int width); - -void ARGBToRGB24Row_NEON(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRAWRow_NEON(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRGB565Row_NEON(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB1555Row_NEON(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB4444Row_NEON(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRGB565DitherRow_NEON(const uint8* src_argb, uint8* dst_rgb, - const uint32 dither4, int width); - -void ARGBToRGBARow_C(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRGB24Row_C(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRAWRow_C(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRGB565Row_C(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB1555Row_C(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB4444Row_C(const uint8* src_argb, uint8* dst_rgb, int width); - -void J400ToARGBRow_SSE2(const uint8* src_y, uint8* dst_argb, int width); -void J400ToARGBRow_AVX2(const uint8* src_y, uint8* dst_argb, int width); -void J400ToARGBRow_NEON(const uint8* src_y, uint8* dst_argb, int width); -void J400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int width); -void J400ToARGBRow_Any_SSE2(const uint8* src_y, uint8* dst_argb, int width); -void J400ToARGBRow_Any_AVX2(const uint8* src_y, uint8* dst_argb, int width); -void J400ToARGBRow_Any_NEON(const uint8* src_y, uint8* dst_argb, int width); - -void I444ToARGBRow_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I422ToARGBRow_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I422ToARGBRow_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I422AlphaToARGBRow_C(const uint8* y_buf, - const uint8* u_buf, - const uint8* v_buf, - const uint8* a_buf, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I411ToARGBRow_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void NV12ToARGBRow_C(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void NV12ToRGB565Row_C(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void NV21ToARGBRow_C(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void YUY2ToARGBRow_C(const uint8* src_yuy2, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void UYVYToARGBRow_C(const uint8* src_uyvy, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I422ToRGBARow_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgba, - const struct YuvConstants* yuvconstants, - int width); -void I422ToRGB24Row_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgb24, - const struct YuvConstants* yuvconstants, - int width); -void I422ToARGB4444Row_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb4444, +void NV12ToRGB24Row_NEON(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb24, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB1555Row_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb4444, +void NV21ToRGB24Row_NEON(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_rgb24, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB565Row_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgb565, - const struct YuvConstants* yuvconstants, - int width); -void I422ToARGBRow_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void NV21ToYUV24Row_NEON(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void YUY2ToARGBRow_NEON(const uint8_t* src_yuy2, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I422ToARGBRow_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void UYVYToARGBRow_NEON(const uint8_t* src_uyvy, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I422ToRGBARow_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I444ToARGBRow_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_LSX(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); + +void I422ToARGBRow_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_LASX(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I444ToARGBRow_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I444ToARGBRow_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToRGBARow_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_LASX(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I444ToARGBRow_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I444ToARGBRow_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422AlphaToARGBRow_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_LASX(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I422ToARGBRow_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToRGB24Row_LASX(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I422AlphaToARGBRow_SSSE3(const uint8* y_buf, - const uint8* u_buf, - const uint8* v_buf, - const uint8* a_buf, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I422AlphaToARGBRow_AVX2(const uint8* y_buf, - const uint8* u_buf, - const uint8* v_buf, - const uint8* a_buf, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I422ToARGBRow_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToRGB565Row_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, const struct YuvConstants* yuvconstants, int width); -void I411ToARGBRow_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToRGB565Row_LASX(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_LASX(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_LASX(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_MSA(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_MSA(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, const struct YuvConstants* yuvconstants, int width); -void I411ToARGBRow_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void NV21ToARGBRow_MSA(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_MSA(const uint8_t* src_yuy2, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_MSA(const uint8_t* src_uyvy, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); + +void NV12ToARGBRow_LSX(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_LASX(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void NV12ToARGBRow_SSSE3(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, +void NV12ToRGB565Row_LSX(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, const struct YuvConstants* yuvconstants, int width); -void NV12ToARGBRow_AVX2(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void NV12ToRGB565Row_SSSE3(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void NV12ToRGB565Row_AVX2(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, +void NV12ToRGB565Row_LASX(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, const struct YuvConstants* yuvconstants, int width); -void NV21ToARGBRow_SSSE3(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void NV21ToARGBRow_AVX2(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, +void NV21ToARGBRow_LSX(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_LASX(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void YUY2ToARGBRow_SSSE3(const uint8* src_yuy2, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void UYVYToARGBRow_SSSE3(const uint8* src_uyvy, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, +void YUY2ToARGBRow_LSX(const uint8_t* src_yuy2, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_LSX(const uint8_t* src_uyvy, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); + +void ARGBToYRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ARGBToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ABGRToYRow_AVX2(const uint8_t* src_abgr, uint8_t* dst_y, int width); +void ABGRToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ARGBToYJRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ARGBToYJRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGBAToYJRow_AVX2(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void RGBAToYJRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYJRow_SSSE3(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void BGRAToYRow_SSSE3(const uint8_t* src_bgra, uint8_t* dst_y, int width); +void ABGRToYRow_SSSE3(const uint8_t* src_abgr, uint8_t* dst_y, int width); +void RGBAToYRow_SSSE3(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void RGB24ToYRow_SSSE3(const uint8_t* src_rgb24, uint8_t* dst_y, int width); +void RGB24ToYJRow_SSSE3(const uint8_t* src_rgb24, uint8_t* dst_yj, int width); +void RAWToYRow_SSSE3(const uint8_t* src_raw, uint8_t* dst_y, int width); +void RAWToYJRow_SSSE3(const uint8_t* src_raw, uint8_t* dst_yj, int width); +void RGB24ToYJRow_AVX2(const uint8_t* src_rgb24, uint8_t* dst_yj, int width); +void RAWToYJRow_AVX2(const uint8_t* src_raw, uint8_t* dst_yj, int width); +void ARGBToYRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ARGBToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGBAToYJRow_NEON(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void ARGBToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width); +void ARGBToYJRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width); +void ARGBToYRow_LASX(const uint8_t* src_argb0, uint8_t* dst_y, int width); +void ARGBToYJRow_LSX(const uint8_t* src_argb0, uint8_t* dst_y, int width); +void ARGBToYJRow_LASX(const uint8_t* src_argb0, uint8_t* dst_y, int width); +void ARGBToUV444Row_NEON(const uint8_t* src_argb, + uint8_t* dst_u, + uint8_t* dst_v, int width); -void YUY2ToARGBRow_AVX2(const uint8* src_yuy2, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void UYVYToARGBRow_AVX2(const uint8* src_uyvy, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, +void ARGBToUVRow_NEON(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_MSA(const uint8_t* src_argb, + uint8_t* dst_u, + uint8_t* dst_v, int width); -void I422ToRGBARow_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgba, - const struct YuvConstants* yuvconstants, - int width); -void I422ToARGB4444Row_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void ARGBToUVRow_MSA(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_LASX(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_LASX(const uint8_t* src_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_NEON(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_NEON(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_NEON(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_NEON(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_NEON(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_NEON(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVJRow_NEON(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVJRow_NEON(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_NEON(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_NEON(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB4444ToUVRow_NEON(const uint8_t* src_argb4444, + int src_stride_argb4444, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_MSA(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_MSA(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_MSA(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_LSX(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_LSX(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_LSX(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_LSX(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_LASX(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_LSX(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_LASX(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_LSX(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_LASX(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_LSX(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_LASX(const uint8_t* src_rgb24, + int src_stride_rgb24, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_LSX(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_LASX(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToYRow_NEON(const uint8_t* src_bgra, uint8_t* dst_y, int width); +void ABGRToYRow_NEON(const uint8_t* src_abgr, uint8_t* dst_y, int width); +void RGBAToYRow_NEON(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void RGB24ToYRow_NEON(const uint8_t* src_rgb24, uint8_t* dst_y, int width); +void RGB24ToYJRow_NEON(const uint8_t* src_rgb24, uint8_t* dst_yj, int width); +void RAWToYRow_NEON(const uint8_t* src_raw, uint8_t* dst_y, int width); +void RAWToYJRow_NEON(const uint8_t* src_raw, uint8_t* dst_yj, int width); +void RGB565ToYRow_NEON(const uint8_t* src_rgb565, uint8_t* dst_y, int width); +void ARGB1555ToYRow_NEON(const uint8_t* src_argb1555, + uint8_t* dst_y, + int width); +void ARGB4444ToYRow_NEON(const uint8_t* src_argb4444, + uint8_t* dst_y, + int width); +void BGRAToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width); +void ABGRToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGBAToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGB24ToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RAWToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width); +void RGB565ToYRow_MSA(const uint8_t* src_rgb565, uint8_t* dst_y, int width); +void ARGB1555ToYRow_MSA(const uint8_t* src_argb1555, uint8_t* dst_y, int width); + +void BGRAToYRow_LSX(const uint8_t* src_bgra, uint8_t* dst_y, int width); +void ABGRToYRow_LSX(const uint8_t* src_abgr, uint8_t* dst_y, int width); +void RGBAToYRow_LSX(const uint8_t* src_rgba, uint8_t* dst_y, int width); +void ARGB1555ToYRow_LSX(const uint8_t* src_argb1555, uint8_t* dst_y, int width); +void ARGB1555ToYRow_LASX(const uint8_t* src_argb1555, + uint8_t* dst_y, + int width); +void RGB565ToYRow_LSX(const uint8_t* src_rgb565, uint8_t* dst_y, int width); +void RGB565ToYRow_LASX(const uint8_t* src_rgb565, uint8_t* dst_y, int width); +void RGB24ToYRow_LSX(const uint8_t* src_rgb24, uint8_t* dst_y, int width); +void RGB24ToYRow_LASX(const uint8_t* src_rgb24, uint8_t* dst_y, int width); +void RAWToYRow_LSX(const uint8_t* src_raw, uint8_t* dst_y, int width); +void RAWToYRow_LASX(const uint8_t* src_raw, uint8_t* dst_y, int width); + +void ARGBToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void ARGBToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RGBAToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void BGRAToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void ABGRToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RGBAToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RGB24ToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RGB24ToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RAWToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RAWToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RGB565ToYRow_C(const uint8_t* src_rgb565, uint8_t* dst_y, int width); +void ARGB1555ToYRow_C(const uint8_t* src_argb1555, uint8_t* dst_y, int width); +void ARGB4444ToYRow_C(const uint8_t* src_argb4444, uint8_t* dst_y, int width); +void ARGBToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYJRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void BGRAToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ABGRToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYJRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYJRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYJRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYJRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYJRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void BGRAToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ABGRToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYJRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYJRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB565ToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGB1555ToYRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToYRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void BGRAToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ABGRToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB565ToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGB1555ToYRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void BGRAToYRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ABGRToYRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGBAToYRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB565ToYRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGB1555ToYRow_Any_LSX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void RGB565ToYRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB24ToYRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYJRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToYRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToYRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGB1555ToYRow_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGBToUVRow_AVX2(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_AVX2(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_AVX2(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_SSSE3(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_SSSE3(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_SSSE3(const uint8_t* src_bgra, + int src_stride_bgra, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_SSSE3(const uint8_t* src_abgr, + int src_stride_abgr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_SSSE3(const uint8_t* src_rgba, + int src_stride_rgba, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_Any_AVX2(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_Any_AVX2(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_AVX2(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_Any_SSSE3(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_SSSE3(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_Any_SSSE3(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_Any_SSSE3(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_Any_SSSE3(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_Any_LASX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVJRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVJRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB4444ToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_Any_LSX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_Any_LSX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_Any_LSX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_LSX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_Any_LASX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_Any_LSX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_Any_LASX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_Any_LSX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_Any_LASX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_Any_LSX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_Any_LASX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_Any_LSX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_Any_LASX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUVJRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void BGRAToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ABGRToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGBAToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB24ToUVJRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RAWToUVJRow_C(const uint8_t* src_rgb, + int src_stride_rgb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void RGB565ToUVRow_C(const uint8_t* src_rgb565, + int src_stride_rgb565, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB1555ToUVRow_C(const uint8_t* src_argb1555, + int src_stride_argb1555, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGB4444ToUVRow_C(const uint8_t* src_argb4444, + int src_stride_argb4444, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void ARGBToUV444Row_SSSE3(const uint8_t* src_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void ARGBToUV444Row_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void ARGBToUV444Row_C(const uint8_t* src_argb, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void MirrorRow_AVX2(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_SSSE3(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_NEON(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_MSA(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_LASX(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_C(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorRow_Any_SSE2(const uint8_t* src, uint8_t* dst, int width); +void MirrorRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorUVRow_AVX2(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_SSSE3(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_MSA(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_LASX(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_C(const uint8_t* src_uv, uint8_t* dst_uv, int width); +void MirrorUVRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorUVRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorUVRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorUVRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void MirrorUVRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); + +void MirrorSplitUVRow_SSSE3(const uint8_t* src, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void MirrorSplitUVRow_NEON(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void MirrorSplitUVRow_MSA(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void MirrorSplitUVRow_LSX(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void MirrorSplitUVRow_C(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void ARGBMirrorRow_AVX2(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_NEON(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBMirrorRow_MSA(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_LASX(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_C(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBMirrorRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBMirrorRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBMirrorRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBMirrorRow_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void RGB24MirrorRow_SSSE3(const uint8_t* src_rgb24, + uint8_t* dst_rgb24, + int width); +void RGB24MirrorRow_NEON(const uint8_t* src_rgb24, + uint8_t* dst_rgb24, + int width); +void RGB24MirrorRow_C(const uint8_t* src_rgb24, uint8_t* dst_rgb24, int width); +void RGB24MirrorRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB24MirrorRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void SplitUVRow_C(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_SSE2(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_AVX2(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_NEON(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_MSA(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_LSX(const uint8_t* src_uv, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SplitUVRow_Any_LSX(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void DetileRow_C(const uint8_t* src, + ptrdiff_t src_tile_stride, + uint8_t* dst, + int width); + +void DetileRow_NEON(const uint8_t* src, + ptrdiff_t src_tile_stride, + uint8_t* dst, + int width); +void DetileRow_Any_NEON(const uint8_t* src, + ptrdiff_t src_tile_stride, + uint8_t* dst, + int width); +void DetileRow_SSE2(const uint8_t* src, + ptrdiff_t src_tile_stride, + uint8_t* dst, + int width); +void DetileRow_Any_SSE2(const uint8_t* src, + ptrdiff_t src_tile_stride, + uint8_t* dst, + int width); +void DetileSplitUVRow_C(const uint8_t* src_uv, + ptrdiff_t src_tile_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void DetileSplitUVRow_SSSE3(const uint8_t* src_uv, + ptrdiff_t src_tile_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void DetileSplitUVRow_Any_SSSE3(const uint8_t* src_uv, + ptrdiff_t src_tile_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void DetileSplitUVRow_NEON(const uint8_t* src_uv, + ptrdiff_t src_tile_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void DetileSplitUVRow_Any_NEON(const uint8_t* src_uv, + ptrdiff_t src_tile_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void MergeUVRow_C(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_SSE2(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_AVX2(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_NEON(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_MSA(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_LSX(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uv, + int width); +void MergeUVRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void MergeUVRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void MergeUVRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void MergeUVRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void MergeUVRow_Any_LSX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); + +void HalfMergeUVRow_C(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int width); + +void HalfMergeUVRow_NEON(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int width); + +void HalfMergeUVRow_SSSE3(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int width); + +void HalfMergeUVRow_AVX2(const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_uv, + int width); + +void SplitRGBRow_C(const uint8_t* src_rgb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitRGBRow_SSSE3(const uint8_t* src_rgb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitRGBRow_NEON(const uint8_t* src_rgb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitRGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitRGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); + +void MergeRGBRow_C(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_rgb, + int width); +void MergeRGBRow_SSSE3(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_rgb, + int width); +void MergeRGBRow_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_rgb, + int width); +void MergeRGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void MergeRGBRow_Any_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_rgb, + int width); +void MergeARGBRow_C(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width); +void MergeARGBRow_SSE2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width); +void MergeARGBRow_AVX2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width); +void MergeARGBRow_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width); +void MergeARGBRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + int width); +void MergeARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + int width); +void MergeARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + int width); +void SplitARGBRow_C(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_NEON(const uint8_t* src_rgba, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void MergeXRGBRow_C(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width); +void MergeXRGBRow_SSE2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width); +void MergeXRGBRow_AVX2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width); +void MergeXRGBRow_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width); +void MergeXRGBRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void MergeXRGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void MergeXRGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void SplitXRGBRow_C(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_NEON(const uint8_t* src_rgba, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); + +void MergeXR30Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int depth, + int width); +void MergeAR64Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint16_t* dst_ar64, + int depth, + int width); +void MergeARGB16To8Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR64Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint16_t* dst_ar64, + int depth, + int width); +void MergeXRGB16To8Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR30Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int depth, + int width); +void MergeAR64Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint16_t* dst_ar64, + int depth, + int width); +void MergeARGB16To8Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR64Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint16_t* dst_ar64, + int depth, + int width); +void MergeXRGB16To8Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR30Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int depth, + int width); +void MergeXR30Row_10_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int /* depth */, + int width); +void MergeAR64Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint16_t* dst_ar64, + int depth, + int width); +void MergeARGB16To8Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR64Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint16_t* dst_ar64, + int depth, + int width); +void MergeXRGB16To8Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR30Row_Any_AVX2(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeAR64Row_Any_AVX2(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + const uint16_t* a_buf, + uint16_t* dst_ptr, + int depth, + int width); +void MergeXR64Row_Any_AVX2(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint16_t* dst_ptr, + int depth, + int width); +void MergeARGB16To8Row_Any_AVX2(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeXRGB16To8Row_Any_AVX2(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeXR30Row_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeXR30Row_10_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeAR64Row_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + const uint16_t* a_buf, + uint16_t* dst_ptr, + int depth, + int width); +void MergeARGB16To8Row_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeXR64Row_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint16_t* dst_ptr, + int depth, + int width); +void MergeXRGB16To8Row_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint8_t* dst_ptr, + int depth, + int width); + +void MergeUVRow_16_C(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int depth, + int width); +void MergeUVRow_16_AVX2(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int depth, + int width); +void MergeUVRow_16_Any_AVX2(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int depth, + int width); +void MergeUVRow_16_NEON(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int depth, + int width); +void MergeUVRow_16_Any_NEON(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int depth, + int width); + +void SplitUVRow_16_C(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width); +void SplitUVRow_16_AVX2(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width); +void SplitUVRow_16_Any_AVX2(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width); +void SplitUVRow_16_NEON(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width); +void SplitUVRow_16_Any_NEON(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width); + +void MultiplyRow_16_C(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void MultiplyRow_16_AVX2(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void MultiplyRow_16_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); +void MultiplyRow_16_NEON(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void MultiplyRow_16_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); + +void DivideRow_16_C(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void DivideRow_16_AVX2(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void DivideRow_16_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); +void DivideRow_16_NEON(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void DivideRow_16_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); + +void Convert8To16Row_C(const uint8_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void Convert8To16Row_SSE2(const uint8_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void Convert8To16Row_AVX2(const uint8_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void Convert8To16Row_Any_SSE2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); +void Convert8To16Row_Any_AVX2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); + +void Convert16To8Row_C(const uint16_t* src_y, + uint8_t* dst_y, + int scale, + int width); +void Convert16To8Row_SSSE3(const uint16_t* src_y, + uint8_t* dst_y, + int scale, + int width); +void Convert16To8Row_AVX2(const uint16_t* src_y, + uint8_t* dst_y, + int scale, + int width); +void Convert16To8Row_Any_SSSE3(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int scale, + int width); +void Convert16To8Row_Any_AVX2(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int scale, + int width); + +void CopyRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void CopyRow_AVX(const uint8_t* src, uint8_t* dst, int width); +void CopyRow_ERMS(const uint8_t* src, uint8_t* dst, int width); +void CopyRow_NEON(const uint8_t* src, uint8_t* dst, int width); +void CopyRow_MIPS(const uint8_t* src, uint8_t* dst, int count); +void CopyRow_C(const uint8_t* src, uint8_t* dst, int count); +void CopyRow_Any_SSE2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void CopyRow_Any_AVX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void CopyRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); + +void CopyRow_16_C(const uint16_t* src, uint16_t* dst, int count); + +void ARGBCopyAlphaRow_C(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyAlphaRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyAlphaRow_AVX2(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyAlphaRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBCopyAlphaRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGBExtractAlphaRow_C(const uint8_t* src_argb, uint8_t* dst_a, int width); +void ARGBExtractAlphaRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_a, + int width); +void ARGBExtractAlphaRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_a, + int width); +void ARGBExtractAlphaRow_NEON(const uint8_t* src_argb, + uint8_t* dst_a, + int width); +void ARGBExtractAlphaRow_MSA(const uint8_t* src_argb, + uint8_t* dst_a, + int width); +void ARGBExtractAlphaRow_LSX(const uint8_t* src_argb, + uint8_t* dst_a, + int width); +void ARGBExtractAlphaRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBExtractAlphaRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBExtractAlphaRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBExtractAlphaRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBExtractAlphaRow_Any_LSX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGBCopyYToAlphaRow_C(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyYToAlphaRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyYToAlphaRow_AVX2(const uint8_t* src, uint8_t* dst, int width); +void ARGBCopyYToAlphaRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBCopyYToAlphaRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void SetRow_C(uint8_t* dst, uint8_t v8, int width); +void SetRow_MSA(uint8_t* dst, uint8_t v8, int width); +void SetRow_X86(uint8_t* dst, uint8_t v8, int width); +void SetRow_ERMS(uint8_t* dst, uint8_t v8, int width); +void SetRow_NEON(uint8_t* dst, uint8_t v8, int width); +void SetRow_LSX(uint8_t* dst, uint8_t v8, int width); +void SetRow_Any_X86(uint8_t* dst_ptr, uint8_t v32, int width); +void SetRow_Any_NEON(uint8_t* dst_ptr, uint8_t v32, int width); +void SetRow_Any_LSX(uint8_t* dst_ptr, uint8_t v32, int width); + +void ARGBSetRow_C(uint8_t* dst_argb, uint32_t v32, int width); +void ARGBSetRow_X86(uint8_t* dst_argb, uint32_t v32, int width); +void ARGBSetRow_NEON(uint8_t* dst, uint32_t v32, int width); +void ARGBSetRow_Any_NEON(uint8_t* dst_ptr, uint32_t v32, int width); +void ARGBSetRow_MSA(uint8_t* dst_argb, uint32_t v32, int width); +void ARGBSetRow_Any_MSA(uint8_t* dst_ptr, uint32_t v32, int width); +void ARGBSetRow_LSX(uint8_t* dst_argb, uint32_t v32, int width); +void ARGBSetRow_Any_LSX(uint8_t* dst_ptr, uint32_t v32, int width); + +// ARGBShufflers for BGRAToARGB etc. +void ARGBShuffleRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_NEON(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_MSA(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_LASX(const uint8_t* src_argb, + uint8_t* dst_argb, + const uint8_t* shuffler, + int width); +void ARGBShuffleRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint8_t* param, + int width); +void ARGBShuffleRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint8_t* param, + int width); +void ARGBShuffleRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint8_t* param, + int width); +void ARGBShuffleRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint8_t* param, + int width); +void ARGBShuffleRow_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint8_t* param, + int width); + +void RGB24ToARGBRow_SSSE3(const uint8_t* src_rgb24, + uint8_t* dst_argb, + int width); +void RAWToARGBRow_SSSE3(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToRGBARow_SSSE3(const uint8_t* src_raw, uint8_t* dst_rgba, int width); +void RAWToRGB24Row_SSSE3(const uint8_t* src_raw, uint8_t* dst_rgb24, int width); +void RGB565ToARGBRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGB1555ToARGBRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGB4444ToARGBRow_SSE2(const uint8_t* src, uint8_t* dst, int width); +void RGB565ToARGBRow_AVX2(const uint8_t* src_rgb565, + uint8_t* dst_argb, + int width); +void ARGB1555ToARGBRow_AVX2(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_AVX2(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); + +void RGB24ToARGBRow_NEON(const uint8_t* src_rgb24, + uint8_t* dst_argb, + int width); +void RGB24ToARGBRow_MSA(const uint8_t* src_rgb24, uint8_t* dst_argb, int width); +void RGB24ToARGBRow_LSX(const uint8_t* src_rgb24, uint8_t* dst_argb, int width); +void RGB24ToARGBRow_LASX(const uint8_t* src_rgb24, + uint8_t* dst_argb, + int width); +void RAWToARGBRow_NEON(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToRGBARow_NEON(const uint8_t* src_raw, uint8_t* dst_rgba, int width); +void RAWToARGBRow_MSA(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToARGBRow_LSX(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToARGBRow_LASX(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToRGB24Row_NEON(const uint8_t* src_raw, uint8_t* dst_rgb24, int width); +void RAWToRGB24Row_MSA(const uint8_t* src_raw, uint8_t* dst_rgb24, int width); +void RAWToRGB24Row_LSX(const uint8_t* src_raw, uint8_t* dst_rgb24, int width); +void RGB565ToARGBRow_NEON(const uint8_t* src_rgb565, + uint8_t* dst_argb, + int width); +void RGB565ToARGBRow_MSA(const uint8_t* src_rgb565, + uint8_t* dst_argb, + int width); +void RGB565ToARGBRow_LSX(const uint8_t* src_rgb565, + uint8_t* dst_argb, + int width); +void RGB565ToARGBRow_LASX(const uint8_t* src_rgb565, + uint8_t* dst_argb, + int width); +void ARGB1555ToARGBRow_NEON(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB1555ToARGBRow_MSA(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB1555ToARGBRow_LSX(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB1555ToARGBRow_LASX(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_NEON(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_MSA(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_LSX(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_LASX(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); +void RGB24ToARGBRow_C(const uint8_t* src_rgb24, uint8_t* dst_argb, int width); +void RAWToARGBRow_C(const uint8_t* src_raw, uint8_t* dst_argb, int width); +void RAWToRGBARow_C(const uint8_t* src_raw, uint8_t* dst_rgba, int width); +void RAWToRGB24Row_C(const uint8_t* src_raw, uint8_t* dst_rgb24, int width); +void RGB565ToARGBRow_C(const uint8_t* src_rgb565, uint8_t* dst_argb, int width); +void ARGB1555ToARGBRow_C(const uint8_t* src_argb1555, + uint8_t* dst_argb, + int width); +void ARGB4444ToARGBRow_C(const uint8_t* src_argb4444, + uint8_t* dst_argb, + int width); +void AR30ToARGBRow_C(const uint8_t* src_ar30, uint8_t* dst_argb, int width); +void AR30ToABGRRow_C(const uint8_t* src_ar30, uint8_t* dst_abgr, int width); +void ARGBToAR30Row_C(const uint8_t* src_argb, uint8_t* dst_ar30, int width); +void AR30ToAB30Row_C(const uint8_t* src_ar30, uint8_t* dst_ab30, int width); + +void RGB24ToARGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToARGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToRGBARow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToRGB24Row_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void RGB565ToARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB565ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void RGB24ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB24ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB24ToARGBRow_Any_LSX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB24ToARGBRow_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToARGBRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToRGBARow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToARGBRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToARGBRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToARGBRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToRGB24Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RAWToRGB24Row_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RAWToRGB24Row_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void RGB565ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB565ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB565ToARGBRow_Any_LSX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void RGB565ToARGBRow_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_LSX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB1555ToARGBRow_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGB4444ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToARGBRow_Any_LSX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGB4444ToARGBRow_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void ARGBToRGB24Row_SSSE3(const uint8_t* src, uint8_t* dst, int width); +void ARGBToRAWRow_SSSE3(const uint8_t* src, uint8_t* dst, int width); +void ARGBToRGB565Row_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGBToARGB1555Row_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ARGBToARGB4444Row_SSE2(const uint8_t* src, uint8_t* dst, int width); +void ABGRToAR30Row_SSSE3(const uint8_t* src, uint8_t* dst, int width); +void ARGBToAR30Row_SSSE3(const uint8_t* src, uint8_t* dst, int width); + +void ARGBToRAWRow_AVX2(const uint8_t* src, uint8_t* dst, int width); +void ARGBToRGB24Row_AVX2(const uint8_t* src, uint8_t* dst, int width); + +void ARGBToRGB24Row_AVX512VBMI(const uint8_t* src, uint8_t* dst, int width); + +void ARGBToRGB565DitherRow_C(const uint8_t* src_argb, + uint8_t* dst_rgb, + const uint32_t dither4, + int width); +void ARGBToRGB565DitherRow_SSE2(const uint8_t* src, + uint8_t* dst, + const uint32_t dither4, + int width); +void ARGBToRGB565DitherRow_AVX2(const uint8_t* src, + uint8_t* dst, + const uint32_t dither4, + int width); + +void ARGBToRGB565Row_AVX2(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToARGB1555Row_AVX2(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ARGBToARGB4444Row_AVX2(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ABGRToAR30Row_AVX2(const uint8_t* src, uint8_t* dst, int width); +void ARGBToAR30Row_AVX2(const uint8_t* src, uint8_t* dst, int width); + +void ARGBToRGB24Row_NEON(const uint8_t* src_argb, + uint8_t* dst_rgb24, + int width); +void ARGBToRAWRow_NEON(const uint8_t* src_argb, uint8_t* dst_raw, int width); +void ARGBToRGB565Row_NEON(const uint8_t* src_argb, + uint8_t* dst_rgb565, + int width); +void ARGBToARGB1555Row_NEON(const uint8_t* src_argb, + uint8_t* dst_argb1555, + int width); +void ARGBToARGB4444Row_NEON(const uint8_t* src_argb, + uint8_t* dst_argb4444, + int width); +void ARGBToRGB565DitherRow_NEON(const uint8_t* src_argb, + uint8_t* dst_rgb, + const uint32_t dither4, + int width); +void ARGBToRGB24Row_MSA(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRAWRow_MSA(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRGB565Row_MSA(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToARGB1555Row_MSA(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ARGBToARGB4444Row_MSA(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ARGBToRGB565DitherRow_MSA(const uint8_t* src_argb, + uint8_t* dst_rgb, + const uint32_t dither4, + int width); +void ARGBToRGB565DitherRow_LASX(const uint8_t* src_argb, + uint8_t* dst_rgb, + const uint32_t dither4, + int width); + +void ARGBToRGB24Row_LASX(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRAWRow_LASX(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRGB565Row_LASX(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToARGB1555Row_LASX(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); +void ARGBToARGB4444Row_LASX(const uint8_t* src_argb, + uint8_t* dst_rgb, + int width); + +void ARGBToRGBARow_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRGB24Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRAWRow_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToRGB565Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToARGB1555Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ARGBToARGB4444Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); +void ABGRToAR30Row_C(const uint8_t* src_abgr, uint8_t* dst_ar30, int width); +void ARGBToAR30Row_C(const uint8_t* src_argb, uint8_t* dst_ar30, int width); + +void ARGBToAR64Row_C(const uint8_t* src_argb, uint16_t* dst_ar64, int width); +void ARGBToAB64Row_C(const uint8_t* src_argb, uint16_t* dst_ab64, int width); +void AR64ToARGBRow_C(const uint16_t* src_ar64, uint8_t* dst_argb, int width); +void AB64ToARGBRow_C(const uint16_t* src_ab64, uint8_t* dst_argb, int width); +void AR64ShuffleRow_C(const uint8_t* src_ar64, + uint8_t* dst_ar64, + const uint8_t* shuffler, + int width); +void ARGBToAR64Row_SSSE3(const uint8_t* src_argb, + uint16_t* dst_ar64, + int width); +void ARGBToAB64Row_SSSE3(const uint8_t* src_argb, + uint16_t* dst_ab64, + int width); +void AR64ToARGBRow_SSSE3(const uint16_t* src_ar64, + uint8_t* dst_argb, + int width); +void AB64ToARGBRow_SSSE3(const uint16_t* src_ab64, + uint8_t* dst_argb, + int width); +void ARGBToAR64Row_AVX2(const uint8_t* src_argb, uint16_t* dst_ar64, int width); +void ARGBToAB64Row_AVX2(const uint8_t* src_argb, uint16_t* dst_ab64, int width); +void AR64ToARGBRow_AVX2(const uint16_t* src_ar64, uint8_t* dst_argb, int width); +void AB64ToARGBRow_AVX2(const uint16_t* src_ab64, uint8_t* dst_argb, int width); +void ARGBToAR64Row_NEON(const uint8_t* src_argb, uint16_t* dst_ar64, int width); +void ARGBToAB64Row_NEON(const uint8_t* src_argb, uint16_t* dst_ab64, int width); +void AR64ToARGBRow_NEON(const uint16_t* src_ar64, uint8_t* dst_argb, int width); +void AB64ToARGBRow_NEON(const uint16_t* src_ab64, uint8_t* dst_argb, int width); +void ARGBToAR64Row_Any_SSSE3(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void ARGBToAB64Row_Any_SSSE3(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void AR64ToARGBRow_Any_SSSE3(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); +void AB64ToARGBRow_Any_SSSE3(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToAR64Row_Any_AVX2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void ARGBToAB64Row_Any_AVX2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void AR64ToARGBRow_Any_AVX2(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); +void AB64ToARGBRow_Any_AVX2(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToAR64Row_Any_NEON(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void ARGBToAB64Row_Any_NEON(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void AR64ToARGBRow_Any_NEON(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); +void AB64ToARGBRow_Any_NEON(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); + +void J400ToARGBRow_SSE2(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_AVX2(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_MSA(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_LSX(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_C(const uint8_t* src_y, uint8_t* dst_argb, int width); +void J400ToARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void J400ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void J400ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void J400ToARGBRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void J400ToARGBRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); + +void I444ToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422ToAR30Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I210ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I212ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I212ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I410ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I410ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I210AlphaToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + const uint16_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I410AlphaToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + const uint16_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I444AlphaToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_C(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_C(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_C(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToYUV24Row_C(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void YUY2ToARGBRow_C(const uint8_t* src_yuy2, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_C(const uint8_t* src_uyvy, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void P210ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); + +void I422ToRGBARow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_AVX512BW(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); + +void I422ToAR30Row_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I210ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I212ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I212ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I410ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I410ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I210AlphaToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I410AlphaToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422ToAR30Row_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I210ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I212ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I212ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I410ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I410ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I210AlphaToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I410AlphaToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444AlphaToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444AlphaToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB4444Row_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void NV12ToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_AVX2(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_AVX2(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_rgb24, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToYUV24Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void NV21ToYUV24Row_AVX2(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void NV12ToRGB565Row_AVX2(const uint8_t* src_y, + const uint8_t* src_uv, + uint8_t* dst_rgb565, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* vu_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* vu_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_SSSE3(const uint8_t* yuy2_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_SSSE3(const uint8_t* uyvy_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_AVX2(const uint8_t* yuy2_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_AVX2(const uint8_t* uyvy_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); + +void P210ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P210ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); + +void I422ToRGBARow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_rgba, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb4444, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB1555Row_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToARGB1555Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB1555Row_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToARGB1555Row_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_argb1555, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB565Row_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToRGB565Row_SSSE3(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB565Row_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToRGB565Row_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb565, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB24Row_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgb24, +void I422ToRGB24Row_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_rgb24, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB24Row_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgb24, +void I422ToRGB24Row_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_rgb24, const struct YuvConstants* yuvconstants, int width); -void I422ToARGBRow_Any_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToRGBARow_Any_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToARGBRow_Any_AVX512BW(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I444ToARGBRow_Any_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I444ToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I444ToARGBRow_Any_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I444ToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToARGBRow_Any_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToAR30Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210ToAR30Row_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I212ToAR30Row_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I212ToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422AlphaToARGBRow_Any_SSSE3(const uint8* y_buf, - const uint8* u_buf, - const uint8* v_buf, - const uint8* a_buf, - uint8* dst_argb, +void I410ToAR30Row_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410ToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210AlphaToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410AlphaToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToAR30Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210ToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210ToAR30Row_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I212ToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I212ToAR30Row_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410ToAR30Row_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410ToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210AlphaToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410AlphaToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I444AlphaToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I444AlphaToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422AlphaToARGBRow_Any_AVX2(const uint8* y_buf, - const uint8* u_buf, - const uint8* v_buf, - const uint8* a_buf, - uint8* dst_argb, +void I422AlphaToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I411ToARGBRow_Any_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void NV12ToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I411ToARGBRow_Any_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void NV12ToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void NV12ToARGBRow_Any_SSSE3(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, +void NV21ToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void NV12ToARGBRow_Any_AVX2(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, +void NV21ToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void NV21ToARGBRow_Any_SSSE3(const uint8* src_y, - const uint8* src_vu, - uint8* dst_argb, +void NV12ToRGB24Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB24Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void NV21ToARGBRow_Any_AVX2(const uint8* src_y, - const uint8* src_vu, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void NV12ToRGB565Row_Any_SSSE3(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, +void NV21ToRGB24Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToYUV24Row_Any_SSSE3(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void NV21ToYUV24Row_Any_AVX2(const uint8_t* src_y, + const uint8_t* src_vu, + uint8_t* dst_yuv24, + int width); +void NV12ToRGB565Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void NV12ToRGB565Row_Any_AVX2(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, +void NV12ToRGB565Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void YUY2ToARGBRow_Any_SSSE3(const uint8* src_yuy2, - uint8* dst_argb, +void YUY2ToARGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P210ToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void UYVYToARGBRow_Any_SSSE3(const uint8* src_uyvy, - uint8* dst_argb, +void P410ToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void YUY2ToARGBRow_Any_AVX2(const uint8* src_yuy2, - uint8* dst_argb, +void P210ToAR30Row_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P210ToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_Any_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void UYVYToARGBRow_Any_AVX2(const uint8* src_uyvy, - uint8* dst_argb, +void P410ToAR30Row_Any_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToRGBARow_Any_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgba, +void I422ToRGBARow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB4444Row_Any_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgba, +void I422ToARGB4444Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB4444Row_Any_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgba, +void I422ToARGB4444Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB1555Row_Any_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgba, +void I422ToARGB1555Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB1555Row_Any_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgba, +void I422ToARGB1555Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB565Row_Any_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgba, +void I422ToRGB565Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB565Row_Any_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_rgba, +void I422ToRGB565Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB24Row_Any_SSSE3(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToRGB24Row_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB24Row_Any_AVX2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToRGB24Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int width); -void I400ToARGBRow_SSE2(const uint8* src_y, uint8* dst_argb, int width); -void I400ToARGBRow_AVX2(const uint8* src_y, uint8* dst_argb, int width); -void I400ToARGBRow_NEON(const uint8* src_y, uint8* dst_argb, int width); -void I400ToARGBRow_Any_SSE2(const uint8* src_y, uint8* dst_argb, int width); -void I400ToARGBRow_Any_AVX2(const uint8* src_y, uint8* dst_argb, int width); -void I400ToARGBRow_Any_NEON(const uint8* src_y, uint8* dst_argb, int width); +void I400ToARGBRow_C(const uint8_t* src_y, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_SSE2(const uint8_t* y_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_AVX2(const uint8_t* y_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_NEON(const uint8_t* src_y, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_MSA(const uint8_t* src_y, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_LSX(const uint8_t* src_y, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* param, + int width); +void I400ToARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* param, + int width); +void I400ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* param, + int width); +void I400ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I400ToARGBRow_Any_LSX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); // ARGB preattenuated alpha blend. -void ARGBBlendRow_SSSE3(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBBlendRow_NEON(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBBlendRow_C(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); +void ARGBBlendRow_SSSE3(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBBlendRow_NEON(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBBlendRow_MSA(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBBlendRow_LSX(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBBlendRow_C(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); // Unattenuated planar alpha blend. -void BlendPlaneRow_SSSE3(const uint8* src0, const uint8* src1, - const uint8* alpha, uint8* dst, int width); -void BlendPlaneRow_Any_SSSE3(const uint8* src0, const uint8* src1, - const uint8* alpha, uint8* dst, int width); -void BlendPlaneRow_AVX2(const uint8* src0, const uint8* src1, - const uint8* alpha, uint8* dst, int width); -void BlendPlaneRow_Any_AVX2(const uint8* src0, const uint8* src1, - const uint8* alpha, uint8* dst, int width); -void BlendPlaneRow_C(const uint8* src0, const uint8* src1, - const uint8* alpha, uint8* dst, int width); +void BlendPlaneRow_SSSE3(const uint8_t* src0, + const uint8_t* src1, + const uint8_t* alpha, + uint8_t* dst, + int width); +void BlendPlaneRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void BlendPlaneRow_AVX2(const uint8_t* src0, + const uint8_t* src1, + const uint8_t* alpha, + uint8_t* dst, + int width); +void BlendPlaneRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void BlendPlaneRow_C(const uint8_t* src0, + const uint8_t* src1, + const uint8_t* alpha, + uint8_t* dst, + int width); // ARGB multiply images. Same API as Blend, but these require // pointer and width alignment for SSE2. -void ARGBMultiplyRow_C(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBMultiplyRow_SSE2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBMultiplyRow_Any_SSE2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBMultiplyRow_AVX2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBMultiplyRow_Any_AVX2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBMultiplyRow_NEON(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBMultiplyRow_Any_NEON(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); +void ARGBMultiplyRow_C(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_SSE2(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBMultiplyRow_AVX2(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBMultiplyRow_NEON(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBMultiplyRow_MSA(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBMultiplyRow_LASX(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBMultiplyRow_Any_LASX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); // ARGB add images. -void ARGBAddRow_C(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBAddRow_SSE2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBAddRow_Any_SSE2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBAddRow_AVX2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBAddRow_Any_AVX2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBAddRow_NEON(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBAddRow_Any_NEON(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); +void ARGBAddRow_C(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_SSE2(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBAddRow_AVX2(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBAddRow_NEON(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBAddRow_MSA(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBAddRow_LASX(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBAddRow_Any_LASX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); + +// ARGB subtract images. Same API as Blend, but these require +// pointer and width alignment for SSE2. +void ARGBSubtractRow_C(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_SSE2(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBSubtractRow_AVX2(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBSubtractRow_NEON(const uint8_t* src_argb, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBSubtractRow_MSA(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void ARGBSubtractRow_LASX(const uint8_t* src_argb0, + const uint8_t* src_argb1, + uint8_t* dst_argb, + int width); +void ARGBSubtractRow_Any_LASX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); + +void ARGBToRGB24Row_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRAWRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRGB565Row_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB1555Row_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB4444Row_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ABGRToAR30Row_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToAR30Row_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRAWRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToRGB24Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRGB24Row_Any_AVX512VBMI(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRGB565DitherRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint32_t param, + int width); +void ARGBToRGB565DitherRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint32_t param, + int width); -// ARGB subtract images. Same API as Blend, but these require -// pointer and width alignment for SSE2. -void ARGBSubtractRow_C(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBSubtractRow_SSE2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBSubtractRow_Any_SSE2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBSubtractRow_AVX2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBSubtractRow_Any_AVX2(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBSubtractRow_NEON(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); -void ARGBSubtractRow_Any_NEON(const uint8* src_argb, const uint8* src_argb1, - uint8* dst_argb, int width); - -void ARGBToRGB24Row_Any_SSSE3(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRAWRow_Any_SSSE3(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRGB565Row_Any_SSE2(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB1555Row_Any_SSE2(const uint8* src_argb, uint8* dst_rgb, +void ARGBToRGB565Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB1555Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); -void ARGBToARGB4444Row_Any_SSE2(const uint8* src_argb, uint8* dst_rgb, +void ARGBToARGB4444Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); +void ABGRToAR30Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToAR30Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); -void ARGBToRGB565DitherRow_Any_SSE2(const uint8* src_argb, uint8* dst_rgb, - const uint32 dither4, int width); -void ARGBToRGB565DitherRow_Any_AVX2(const uint8* src_argb, uint8* dst_rgb, - const uint32 dither4, int width); - -void ARGBToRGB565Row_Any_AVX2(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB1555Row_Any_AVX2(const uint8* src_argb, uint8* dst_rgb, +void ARGBToRGB24Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRAWRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToRGB565Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB1555Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); -void ARGBToARGB4444Row_Any_AVX2(const uint8* src_argb, uint8* dst_rgb, +void ARGBToARGB4444Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); +void ARGBToRGB565DitherRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint32_t param, + int width); +void ARGBToRGB24Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRAWRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToRGB565Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB1555Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB4444Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRGB565DitherRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint32_t param, + int width); +void ARGBToRGB565DitherRow_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const uint32_t param, + int width); -void ARGBToRGB24Row_Any_NEON(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRAWRow_Any_NEON(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToRGB565Row_Any_NEON(const uint8* src_argb, uint8* dst_rgb, int width); -void ARGBToARGB1555Row_Any_NEON(const uint8* src_argb, uint8* dst_rgb, +void ARGBToRGB24Row_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToRAWRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void ARGBToRGB565Row_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToARGB1555Row_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); -void ARGBToARGB4444Row_Any_NEON(const uint8* src_argb, uint8* dst_rgb, +void ARGBToARGB4444Row_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); -void ARGBToRGB565DitherRow_Any_NEON(const uint8* src_argb, uint8* dst_rgb, - const uint32 dither4, int width); -void I444ToARGBRow_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I444ToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToARGBRow_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422AlphaToARGBRow_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - const uint8* src_a, - uint8* dst_argb, +void I444AlphaToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I411ToARGBRow_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I422ToRGBARow_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422AlphaToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB24Row_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToRGB24Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB4444Row_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToARGB4444Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToARGB1555Row_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToARGB1555Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToRGB565Row_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, +void I422ToRGB565Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void NV12ToARGBRow_Any_NEON(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, +void NV12ToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void NV21ToARGBRow_Any_NEON(const uint8* src_y, - const uint8* src_vu, - uint8* dst_argb, +void NV21ToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void NV12ToRGB565Row_Any_NEON(const uint8* src_y, - const uint8* src_uv, - uint8* dst_argb, +void NV12ToRGB24Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToRGB24Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToYUV24Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void NV12ToRGB565Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void YUY2ToARGBRow_Any_NEON(const uint8* src_yuy2, - uint8* dst_argb, +void YUY2ToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void UYVYToARGBRow_Any_NEON(const uint8* src_uyvy, - uint8* dst_argb, +void UYVYToARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void I422ToARGBRow_DSPR2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, +void P210ToARGBRow_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P210ToARGBRow_Any_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_Any_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_Any_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_Any_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I444ToARGBRow_Any_LSX(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGBRow_Any_LASX(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGBARow_Any_LASX(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422AlphaToARGBRow_Any_LASX(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB24Row_Any_LASX(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToRGB565Row_Any_LASX(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB4444Row_Any_LASX(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I422ToARGB1555Row_Any_LASX(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); + +void NV12ToARGBRow_Any_LSX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToARGBRow_Any_LASX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_Any_LSX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV12ToRGB565Row_Any_LASX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_Any_LSX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void NV21ToARGBRow_Any_LASX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void YUY2ToARGBRow_Any_LSX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void UYVYToARGBRow_Any_LSX(const uint8_t* src_ptr, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); + +void YUY2ToYRow_AVX2(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToUVRow_AVX2(const uint8_t* src_yuy2, + int stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_AVX2(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, int width); -void I422ToARGBRow_DSPR2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_argb, - const struct YuvConstants* yuvconstants, +void YUY2ToYRow_SSE2(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToUVRow_SSE2(const uint8_t* src_yuy2, + int stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_SSE2(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_NEON(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToUVRow_NEON(const uint8_t* src_yuy2, + int stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_NEON(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_MSA(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToYRow_LASX(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToUVRow_MSA(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUVRow_LASX(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_MSA(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_LASX(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_C(const uint8_t* src_yuy2, uint8_t* dst_y, int width); +void YUY2ToUVRow_C(const uint8_t* src_yuy2, + int src_stride_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_C(const uint8_t* src_yuy2, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void YUY2ToUVRow_Any_AVX2(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_Any_SSE2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void YUY2ToUVRow_Any_SSE2(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void YUY2ToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void YUY2ToYRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void YUY2ToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUVRow_Any_LASX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void YUY2ToUV422Row_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_AVX2(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_AVX2(const uint8_t* src_uyvy, + int stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_AVX2(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_SSE2(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_SSE2(const uint8_t* src_uyvy, + int stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_SSE2(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_AVX2(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_AVX2(const uint8_t* src_uyvy, + int stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_AVX2(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_NEON(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_NEON(const uint8_t* src_uyvy, + int stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_NEON(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, int width); +void UYVYToYRow_MSA(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToYRow_LASX(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_MSA(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUVRow_LASX(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_MSA(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_LASX(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); + +void UYVYToYRow_C(const uint8_t* src_uyvy, uint8_t* dst_y, int width); +void UYVYToUVRow_C(const uint8_t* src_uyvy, + int src_stride_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_C(const uint8_t* src_uyvy, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void UYVYToUVRow_Any_AVX2(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_Any_SSE2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void UYVYToUVRow_Any_SSE2(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void UYVYToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToYRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void UYVYToYRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void UYVYToUVRow_Any_MSA(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUVRow_Any_LASX(const uint8_t* src_ptr, + int src_stride_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void UYVYToUV422Row_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_u, + uint8_t* dst_v, + int width); +void SwapUVRow_C(const uint8_t* src_uv, uint8_t* dst_vu, int width); +void SwapUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_vu, int width); +void SwapUVRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void SwapUVRow_SSSE3(const uint8_t* src_uv, uint8_t* dst_vu, int width); +void SwapUVRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void SwapUVRow_AVX2(const uint8_t* src_uv, uint8_t* dst_vu, int width); +void SwapUVRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void AYUVToYRow_C(const uint8_t* src_ayuv, uint8_t* dst_y, int width); +void AYUVToUVRow_C(const uint8_t* src_ayuv, + int src_stride_ayuv, + uint8_t* dst_uv, + int width); +void AYUVToVURow_C(const uint8_t* src_ayuv, + int src_stride_ayuv, + uint8_t* dst_vu, + int width); +void AYUVToYRow_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width); +void AYUVToUVRow_NEON(const uint8_t* src_ayuv, + int src_stride_ayuv, + uint8_t* dst_uv, + int width); +void AYUVToVURow_NEON(const uint8_t* src_ayuv, + int src_stride_ayuv, + uint8_t* dst_vu, + int width); +void AYUVToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void AYUVToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_vu, + int width); +void AYUVToVURow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_vu, + int width); -void YUY2ToYRow_AVX2(const uint8* src_yuy2, uint8* dst_y, int width); -void YUY2ToUVRow_AVX2(const uint8* src_yuy2, int stride_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToUV422Row_AVX2(const uint8* src_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToYRow_SSE2(const uint8* src_yuy2, uint8* dst_y, int width); -void YUY2ToUVRow_SSE2(const uint8* src_yuy2, int stride_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToUV422Row_SSE2(const uint8* src_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToYRow_NEON(const uint8* src_yuy2, uint8* dst_y, int width); -void YUY2ToUVRow_NEON(const uint8* src_yuy2, int stride_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToUV422Row_NEON(const uint8* src_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToYRow_C(const uint8* src_yuy2, uint8* dst_y, int width); -void YUY2ToUVRow_C(const uint8* src_yuy2, int stride_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToUV422Row_C(const uint8* src_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToYRow_Any_AVX2(const uint8* src_yuy2, uint8* dst_y, int width); -void YUY2ToUVRow_Any_AVX2(const uint8* src_yuy2, int stride_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToUV422Row_Any_AVX2(const uint8* src_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToYRow_Any_SSE2(const uint8* src_yuy2, uint8* dst_y, int width); -void YUY2ToUVRow_Any_SSE2(const uint8* src_yuy2, int stride_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToUV422Row_Any_SSE2(const uint8* src_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToYRow_Any_NEON(const uint8* src_yuy2, uint8* dst_y, int width); -void YUY2ToUVRow_Any_NEON(const uint8* src_yuy2, int stride_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void YUY2ToUV422Row_Any_NEON(const uint8* src_yuy2, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToYRow_AVX2(const uint8* src_uyvy, uint8* dst_y, int width); -void UYVYToUVRow_AVX2(const uint8* src_uyvy, int stride_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToUV422Row_AVX2(const uint8* src_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToYRow_SSE2(const uint8* src_uyvy, uint8* dst_y, int width); -void UYVYToUVRow_SSE2(const uint8* src_uyvy, int stride_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToUV422Row_SSE2(const uint8* src_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToYRow_AVX2(const uint8* src_uyvy, uint8* dst_y, int width); -void UYVYToUVRow_AVX2(const uint8* src_uyvy, int stride_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToUV422Row_AVX2(const uint8* src_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToYRow_NEON(const uint8* src_uyvy, uint8* dst_y, int width); -void UYVYToUVRow_NEON(const uint8* src_uyvy, int stride_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToUV422Row_NEON(const uint8* src_uyvy, - uint8* dst_u, uint8* dst_v, int width); - -void UYVYToYRow_C(const uint8* src_uyvy, uint8* dst_y, int width); -void UYVYToUVRow_C(const uint8* src_uyvy, int stride_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToUV422Row_C(const uint8* src_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToYRow_Any_AVX2(const uint8* src_uyvy, uint8* dst_y, int width); -void UYVYToUVRow_Any_AVX2(const uint8* src_uyvy, int stride_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToUV422Row_Any_AVX2(const uint8* src_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToYRow_Any_SSE2(const uint8* src_uyvy, uint8* dst_y, int width); -void UYVYToUVRow_Any_SSE2(const uint8* src_uyvy, int stride_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToUV422Row_Any_SSE2(const uint8* src_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToYRow_Any_NEON(const uint8* src_uyvy, uint8* dst_y, int width); -void UYVYToUVRow_Any_NEON(const uint8* src_uyvy, int stride_uyvy, - uint8* dst_u, uint8* dst_v, int width); -void UYVYToUV422Row_Any_NEON(const uint8* src_uyvy, - uint8* dst_u, uint8* dst_v, int width); - -void I422ToYUY2Row_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_yuy2, int width); -void I422ToUYVYRow_C(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_uyvy, int width); -void I422ToYUY2Row_SSE2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_yuy2, int width); -void I422ToUYVYRow_SSE2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_uyvy, int width); -void I422ToYUY2Row_Any_SSE2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_yuy2, int width); -void I422ToUYVYRow_Any_SSE2(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_uyvy, int width); -void I422ToYUY2Row_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_yuy2, int width); -void I422ToUYVYRow_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_uyvy, int width); -void I422ToYUY2Row_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_yuy2, int width); -void I422ToUYVYRow_Any_NEON(const uint8* src_y, - const uint8* src_u, - const uint8* src_v, - uint8* dst_uyvy, int width); +void I422ToYUY2Row_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_frame, + int width); +void I422ToUYVYRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_frame, + int width); +void I422ToYUY2Row_SSE2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_yuy2, + int width); +void I422ToUYVYRow_SSE2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uyvy, + int width); +void I422ToYUY2Row_Any_SSE2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToUYVYRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToYUY2Row_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_yuy2, + int width); +void I422ToUYVYRow_AVX2(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uyvy, + int width); +void I422ToYUY2Row_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToUYVYRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToYUY2Row_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_yuy2, + int width); +void I422ToUYVYRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uyvy, + int width); +void I422ToYUY2Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToUYVYRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToYUY2Row_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_yuy2, + int width); +void I422ToYUY2Row_LASX(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_yuy2, + int width); +void I422ToUYVYRow_MSA(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uyvy, + int width); +void I422ToUYVYRow_LASX(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dst_uyvy, + int width); +void I422ToYUY2Row_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToYUY2Row_Any_LASX(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToUYVYRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void I422ToUYVYRow_Any_LASX(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); // Effects related row functions. -void ARGBAttenuateRow_C(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBAttenuateRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBAttenuateRow_AVX2(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBAttenuateRow_NEON(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBAttenuateRow_Any_SSE2(const uint8* src_argb, uint8* dst_argb, - int width); -void ARGBAttenuateRow_Any_SSSE3(const uint8* src_argb, uint8* dst_argb, +void ARGBAttenuateRow_C(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBAttenuateRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBAttenuateRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBAttenuateRow_NEON(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBAttenuateRow_MSA(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBAttenuateRow_LASX(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBAttenuateRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); -void ARGBAttenuateRow_Any_AVX2(const uint8* src_argb, uint8* dst_argb, +void ARGBAttenuateRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); -void ARGBAttenuateRow_Any_NEON(const uint8* src_argb, uint8* dst_argb, +void ARGBAttenuateRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBAttenuateRow_Any_MSA(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBAttenuateRow_Any_LASX(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); // Inverse table for unattenuate, shared by C and SSE2. -extern const uint32 fixed_invtbl8[256]; -void ARGBUnattenuateRow_C(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBUnattenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBUnattenuateRow_AVX2(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBUnattenuateRow_Any_SSE2(const uint8* src_argb, uint8* dst_argb, +extern const uint32_t fixed_invtbl8[256]; +void ARGBUnattenuateRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBUnattenuateRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBUnattenuateRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_argb, + int width); +void ARGBUnattenuateRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); -void ARGBUnattenuateRow_Any_AVX2(const uint8* src_argb, uint8* dst_argb, +void ARGBUnattenuateRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, int width); -void ARGBGrayRow_C(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBGrayRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width); -void ARGBGrayRow_NEON(const uint8* src_argb, uint8* dst_argb, int width); - -void ARGBSepiaRow_C(uint8* dst_argb, int width); -void ARGBSepiaRow_SSSE3(uint8* dst_argb, int width); -void ARGBSepiaRow_NEON(uint8* dst_argb, int width); - -void ARGBColorMatrixRow_C(const uint8* src_argb, uint8* dst_argb, - const int8* matrix_argb, int width); -void ARGBColorMatrixRow_SSSE3(const uint8* src_argb, uint8* dst_argb, - const int8* matrix_argb, int width); -void ARGBColorMatrixRow_NEON(const uint8* src_argb, uint8* dst_argb, - const int8* matrix_argb, int width); - -void ARGBColorTableRow_C(uint8* dst_argb, const uint8* table_argb, int width); -void ARGBColorTableRow_X86(uint8* dst_argb, const uint8* table_argb, int width); - -void RGBColorTableRow_C(uint8* dst_argb, const uint8* table_argb, int width); -void RGBColorTableRow_X86(uint8* dst_argb, const uint8* table_argb, int width); - -void ARGBQuantizeRow_C(uint8* dst_argb, int scale, int interval_size, - int interval_offset, int width); -void ARGBQuantizeRow_SSE2(uint8* dst_argb, int scale, int interval_size, - int interval_offset, int width); -void ARGBQuantizeRow_NEON(uint8* dst_argb, int scale, int interval_size, - int interval_offset, int width); - -void ARGBShadeRow_C(const uint8* src_argb, uint8* dst_argb, int width, - uint32 value); -void ARGBShadeRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width, - uint32 value); -void ARGBShadeRow_NEON(const uint8* src_argb, uint8* dst_argb, int width, - uint32 value); +void ARGBGrayRow_C(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBGrayRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBGrayRow_NEON(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBGrayRow_MSA(const uint8_t* src_argb, uint8_t* dst_argb, int width); +void ARGBGrayRow_LASX(const uint8_t* src_argb, uint8_t* dst_argb, int width); + +void ARGBSepiaRow_C(uint8_t* dst_argb, int width); +void ARGBSepiaRow_SSSE3(uint8_t* dst_argb, int width); +void ARGBSepiaRow_NEON(uint8_t* dst_argb, int width); +void ARGBSepiaRow_MSA(uint8_t* dst_argb, int width); +void ARGBSepiaRow_LASX(uint8_t* dst_argb, int width); + +void ARGBColorMatrixRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + const int8_t* matrix_argb, + int width); +void ARGBColorMatrixRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_argb, + const int8_t* matrix_argb, + int width); +void ARGBColorMatrixRow_NEON(const uint8_t* src_argb, + uint8_t* dst_argb, + const int8_t* matrix_argb, + int width); +void ARGBColorMatrixRow_MSA(const uint8_t* src_argb, + uint8_t* dst_argb, + const int8_t* matrix_argb, + int width); +void ARGBColorMatrixRow_LSX(const uint8_t* src_argb, + uint8_t* dst_argb, + const int8_t* matrix_argb, + int width); + +void ARGBColorTableRow_C(uint8_t* dst_argb, + const uint8_t* table_argb, + int width); +void ARGBColorTableRow_X86(uint8_t* dst_argb, + const uint8_t* table_argb, + int width); + +void RGBColorTableRow_C(uint8_t* dst_argb, + const uint8_t* table_argb, + int width); +void RGBColorTableRow_X86(uint8_t* dst_argb, + const uint8_t* table_argb, + int width); + +void ARGBQuantizeRow_C(uint8_t* dst_argb, + int scale, + int interval_size, + int interval_offset, + int width); +void ARGBQuantizeRow_SSE2(uint8_t* dst_argb, + int scale, + int interval_size, + int interval_offset, + int width); +void ARGBQuantizeRow_NEON(uint8_t* dst_argb, + int scale, + int interval_size, + int interval_offset, + int width); +void ARGBQuantizeRow_MSA(uint8_t* dst_argb, + int scale, + int interval_size, + int interval_offset, + int width); +void ARGBQuantizeRow_LSX(uint8_t* dst_argb, + int scale, + int interval_size, + int interval_offset, + int width); + +void ARGBShadeRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + uint32_t value); +void ARGBShadeRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + uint32_t value); +void ARGBShadeRow_NEON(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + uint32_t value); +void ARGBShadeRow_MSA(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + uint32_t value); +void ARGBShadeRow_LASX(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + uint32_t value); // Used for blur. -void CumulativeSumToAverageRow_SSE2(const int32* topleft, const int32* botleft, - int width, int area, uint8* dst, int count); -void ComputeCumulativeSumRow_SSE2(const uint8* row, int32* cumsum, - const int32* previous_cumsum, int width); +void CumulativeSumToAverageRow_SSE2(const int32_t* topleft, + const int32_t* botleft, + int width, + int area, + uint8_t* dst, + int count); +void ComputeCumulativeSumRow_SSE2(const uint8_t* row, + int32_t* cumsum, + const int32_t* previous_cumsum, + int width); -void CumulativeSumToAverageRow_C(const int32* topleft, const int32* botleft, - int width, int area, uint8* dst, int count); -void ComputeCumulativeSumRow_C(const uint8* row, int32* cumsum, - const int32* previous_cumsum, int width); +void CumulativeSumToAverageRow_C(const int32_t* tl, + const int32_t* bl, + int w, + int area, + uint8_t* dst, + int count); +void ComputeCumulativeSumRow_C(const uint8_t* row, + int32_t* cumsum, + const int32_t* previous_cumsum, + int width); LIBYUV_API -void ARGBAffineRow_C(const uint8* src_argb, int src_argb_stride, - uint8* dst_argb, const float* uv_dudv, int width); +void ARGBAffineRow_C(const uint8_t* src_argb, + int src_argb_stride, + uint8_t* dst_argb, + const float* uv_dudv, + int width); LIBYUV_API -void ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride, - uint8* dst_argb, const float* uv_dudv, int width); +void ARGBAffineRow_SSE2(const uint8_t* src_argb, + int src_argb_stride, + uint8_t* dst_argb, + const float* src_dudv, + int width); // Used for I420Scale, ARGBScale, and ARGBInterpolate. -void InterpolateRow_C(uint8* dst_ptr, const uint8* src_ptr, - ptrdiff_t src_stride_ptr, - int width, int source_y_fraction); -void InterpolateRow_SSSE3(uint8* dst_ptr, const uint8* src_ptr, - ptrdiff_t src_stride_ptr, int width, +void InterpolateRow_C(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int width, + int source_y_fraction); +void InterpolateRow_SSSE3(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int dst_width, int source_y_fraction); -void InterpolateRow_AVX2(uint8* dst_ptr, const uint8* src_ptr, - ptrdiff_t src_stride_ptr, int width, +void InterpolateRow_AVX2(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int dst_width, int source_y_fraction); -void InterpolateRow_NEON(uint8* dst_ptr, const uint8* src_ptr, - ptrdiff_t src_stride_ptr, int width, +void InterpolateRow_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int dst_width, int source_y_fraction); -void InterpolateRow_DSPR2(uint8* dst_ptr, const uint8* src_ptr, - ptrdiff_t src_stride_ptr, int width, - int source_y_fraction); -void InterpolateRow_Any_NEON(uint8* dst_ptr, const uint8* src_ptr, - ptrdiff_t src_stride_ptr, int width, +void InterpolateRow_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int width, + int source_y_fraction); +void InterpolateRow_LSX(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride, + int width, + int source_y_fraction); +void InterpolateRow_Any_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride_ptr, + int width, int source_y_fraction); -void InterpolateRow_Any_SSSE3(uint8* dst_ptr, const uint8* src_ptr, - ptrdiff_t src_stride_ptr, int width, +void InterpolateRow_Any_SSSE3(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride_ptr, + int width, int source_y_fraction); -void InterpolateRow_Any_AVX2(uint8* dst_ptr, const uint8* src_ptr, - ptrdiff_t src_stride_ptr, int width, +void InterpolateRow_Any_AVX2(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride_ptr, + int width, int source_y_fraction); -void InterpolateRow_Any_DSPR2(uint8* dst_ptr, const uint8* src_ptr, - ptrdiff_t src_stride_ptr, int width, - int source_y_fraction); +void InterpolateRow_Any_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride_ptr, + int width, + int source_y_fraction); +void InterpolateRow_Any_LSX(uint8_t* dst_ptr, + const uint8_t* src_ptr, + ptrdiff_t src_stride_ptr, + int width, + int source_y_fraction); -void InterpolateRow_16_C(uint16* dst_ptr, const uint16* src_ptr, - ptrdiff_t src_stride_ptr, - int width, int source_y_fraction); +void InterpolateRow_16_C(uint16_t* dst_ptr, + const uint16_t* src_ptr, + ptrdiff_t src_stride, + int width, + int source_y_fraction); // Sobel images. -void SobelXRow_C(const uint8* src_y0, const uint8* src_y1, const uint8* src_y2, - uint8* dst_sobelx, int width); -void SobelXRow_SSE2(const uint8* src_y0, const uint8* src_y1, - const uint8* src_y2, uint8* dst_sobelx, int width); -void SobelXRow_NEON(const uint8* src_y0, const uint8* src_y1, - const uint8* src_y2, uint8* dst_sobelx, int width); -void SobelYRow_C(const uint8* src_y0, const uint8* src_y1, - uint8* dst_sobely, int width); -void SobelYRow_SSE2(const uint8* src_y0, const uint8* src_y1, - uint8* dst_sobely, int width); -void SobelYRow_NEON(const uint8* src_y0, const uint8* src_y1, - uint8* dst_sobely, int width); -void SobelRow_C(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_argb, int width); -void SobelRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_argb, int width); -void SobelRow_NEON(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_argb, int width); -void SobelToPlaneRow_C(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_y, int width); -void SobelToPlaneRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_y, int width); -void SobelToPlaneRow_NEON(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_y, int width); -void SobelXYRow_C(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_argb, int width); -void SobelXYRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_argb, int width); -void SobelXYRow_NEON(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_argb, int width); -void SobelRow_Any_SSE2(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_argb, int width); -void SobelRow_Any_NEON(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_argb, int width); -void SobelToPlaneRow_Any_SSE2(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_y, int width); -void SobelToPlaneRow_Any_NEON(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_y, int width); -void SobelXYRow_Any_SSE2(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_argb, int width); -void SobelXYRow_Any_NEON(const uint8* src_sobelx, const uint8* src_sobely, - uint8* dst_argb, int width); - -void ARGBPolynomialRow_C(const uint8* src_argb, - uint8* dst_argb, const float* poly, - int width); -void ARGBPolynomialRow_SSE2(const uint8* src_argb, - uint8* dst_argb, const float* poly, - int width); -void ARGBPolynomialRow_AVX2(const uint8* src_argb, - uint8* dst_argb, const float* poly, +void SobelXRow_C(const uint8_t* src_y0, + const uint8_t* src_y1, + const uint8_t* src_y2, + uint8_t* dst_sobelx, + int width); +void SobelXRow_SSE2(const uint8_t* src_y0, + const uint8_t* src_y1, + const uint8_t* src_y2, + uint8_t* dst_sobelx, + int width); +void SobelXRow_NEON(const uint8_t* src_y0, + const uint8_t* src_y1, + const uint8_t* src_y2, + uint8_t* dst_sobelx, + int width); +void SobelXRow_MSA(const uint8_t* src_y0, + const uint8_t* src_y1, + const uint8_t* src_y2, + uint8_t* dst_sobelx, + int width); +void SobelYRow_C(const uint8_t* src_y0, + const uint8_t* src_y1, + uint8_t* dst_sobely, + int width); +void SobelYRow_SSE2(const uint8_t* src_y0, + const uint8_t* src_y1, + uint8_t* dst_sobely, + int width); +void SobelYRow_NEON(const uint8_t* src_y0, + const uint8_t* src_y1, + uint8_t* dst_sobely, + int width); +void SobelYRow_MSA(const uint8_t* src_y0, + const uint8_t* src_y1, + uint8_t* dst_sobely, + int width); +void SobelRow_C(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelRow_SSE2(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelRow_NEON(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelRow_MSA(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelRow_LSX(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelToPlaneRow_C(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_y, + int width); +void SobelToPlaneRow_SSE2(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_y, + int width); +void SobelToPlaneRow_NEON(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_y, + int width); +void SobelToPlaneRow_MSA(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_y, + int width); +void SobelToPlaneRow_LSX(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_y, + int width); +void SobelXYRow_C(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelXYRow_SSE2(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelXYRow_NEON(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelXYRow_MSA(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelXYRow_LSX(const uint8_t* src_sobelx, + const uint8_t* src_sobely, + uint8_t* dst_argb, + int width); +void SobelRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelRow_Any_LSX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelToPlaneRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelToPlaneRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelToPlaneRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelToPlaneRow_Any_LSX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelXYRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelXYRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelXYRow_Any_MSA(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); +void SobelXYRow_Any_LSX(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, + int width); + +void ARGBPolynomialRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + const float* poly, + int width); +void ARGBPolynomialRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_argb, + const float* poly, + int width); +void ARGBPolynomialRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_argb, + const float* poly, int width); // Scale and convert to half float. -void HalfFloatRow_C(const uint16* src, uint16* dst, float scale, int width); -void HalfFloatRow_AVX2(const uint16* src, uint16* dst, float scale, int width); -void HalfFloatRow_Any_AVX2(const uint16* src, uint16* dst, float scale, +void HalfFloatRow_C(const uint16_t* src, uint16_t* dst, float scale, int width); +void HalfFloatRow_SSE2(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_SSE2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, + int width); +void HalfFloatRow_AVX2(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, int width); -void HalfFloatRow_SSE2(const uint16* src, uint16* dst, float scale, int width); -void HalfFloatRow_Any_SSE2(const uint16* src, uint16* dst, float scale, +void HalfFloatRow_F16C(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_F16C(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloat1Row_F16C(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloat1Row_Any_F16C(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_NEON(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, int width); +void HalfFloat1Row_NEON(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloat1Row_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, + int width); +void HalfFloatRow_MSA(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_MSA(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, + int width); +void HalfFloatRow_LSX(const uint16_t* src, + uint16_t* dst, + float scale, + int width); +void HalfFloatRow_Any_LSX(const uint16_t* src_ptr, + uint16_t* dst_ptr, + float param, + int width); +void ByteToFloatRow_C(const uint8_t* src, float* dst, float scale, int width); +void ByteToFloatRow_NEON(const uint8_t* src, + float* dst, + float scale, + int width); +void ByteToFloatRow_Any_NEON(const uint8_t* src_ptr, + float* dst_ptr, + float param, + int width); -void ARGBLumaColorTableRow_C(const uint8* src_argb, uint8* dst_argb, int width, - const uint8* luma, uint32 lumacoeff); -void ARGBLumaColorTableRow_SSSE3(const uint8* src_argb, uint8* dst_argb, +void ARGBLumaColorTableRow_C(const uint8_t* src_argb, + uint8_t* dst_argb, + int width, + const uint8_t* luma, + uint32_t lumacoeff); +void ARGBLumaColorTableRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_argb, int width, - const uint8* luma, uint32 lumacoeff); + const uint8_t* luma, + uint32_t lumacoeff); + +float ScaleMaxSamples_C(const float* src, float* dst, float scale, int width); +float ScaleMaxSamples_NEON(const float* src, + float* dst, + float scale, + int width); +float ScaleSumSamples_C(const float* src, float* dst, float scale, int width); +float ScaleSumSamples_NEON(const float* src, + float* dst, + float scale, + int width); +void ScaleSamples_C(const float* src, float* dst, float scale, int width); +void ScaleSamples_NEON(const float* src, float* dst, float scale, int width); + +void GaussRow_F32_NEON(const float* src, float* dst, int width); +void GaussRow_F32_C(const float* src, float* dst, int width); + +void GaussCol_F32_NEON(const float* src0, + const float* src1, + const float* src2, + const float* src3, + const float* src4, + float* dst, + int width); + +void GaussCol_F32_C(const float* src0, + const float* src1, + const float* src2, + const float* src3, + const float* src4, + float* dst, + int width); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/scale.h b/third_party/libyuv/include/libyuv/scale.h index ae14694598..443f89c2f9 100644 --- a/third_party/libyuv/include/libyuv/scale.h +++ b/third_party/libyuv/include/libyuv/scale.h @@ -20,25 +20,45 @@ extern "C" { // Supported filtering. typedef enum FilterMode { - kFilterNone = 0, // Point sample; Fastest. - kFilterLinear = 1, // Filter horizontally only. + kFilterNone = 0, // Point sample; Fastest. + kFilterLinear = 1, // Filter horizontally only. kFilterBilinear = 2, // Faster than box, but lower quality scaling down. - kFilterBox = 3 // Highest quality. + kFilterBox = 3 // Highest quality. } FilterModeEnum; // Scale a YUV plane. LIBYUV_API -void ScalePlane(const uint8* src, int src_stride, - int src_width, int src_height, - uint8* dst, int dst_stride, - int dst_width, int dst_height, +void ScalePlane(const uint8_t* src, + int src_stride, + int src_width, + int src_height, + uint8_t* dst, + int dst_stride, + int dst_width, + int dst_height, enum FilterMode filtering); LIBYUV_API -void ScalePlane_16(const uint16* src, int src_stride, - int src_width, int src_height, - uint16* dst, int dst_stride, - int dst_width, int dst_height, +void ScalePlane_16(const uint16_t* src, + int src_stride, + int src_width, + int src_height, + uint16_t* dst, + int dst_stride, + int dst_width, + int dst_height, + enum FilterMode filtering); + +// Sample is expected to be in the low 12 bits. +LIBYUV_API +void ScalePlane_12(const uint16_t* src, + int src_stride, + int src_width, + int src_height, + uint16_t* dst, + int dst_stride, + int dst_width, + int dst_height, enum FilterMode filtering); // Scales a YUV 4:2:0 image from the src width and height to the @@ -52,43 +72,240 @@ void ScalePlane_16(const uint16* src, int src_stride, // Returns 0 if successful. LIBYUV_API -int I420Scale(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - int src_width, int src_height, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int dst_width, int dst_height, +int I420Scale(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, enum FilterMode filtering); LIBYUV_API -int I420Scale_16(const uint16* src_y, int src_stride_y, - const uint16* src_u, int src_stride_u, - const uint16* src_v, int src_stride_v, - int src_width, int src_height, - uint16* dst_y, int dst_stride_y, - uint16* dst_u, int dst_stride_u, - uint16* dst_v, int dst_stride_v, - int dst_width, int dst_height, +int I420Scale_16(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, enum FilterMode filtering); -#ifdef __cplusplus -// Legacy API. Deprecated. LIBYUV_API -int Scale(const uint8* src_y, const uint8* src_u, const uint8* src_v, - int src_stride_y, int src_stride_u, int src_stride_v, - int src_width, int src_height, - uint8* dst_y, uint8* dst_u, uint8* dst_v, - int dst_stride_y, int dst_stride_u, int dst_stride_v, - int dst_width, int dst_height, - LIBYUV_BOOL interpolate); +int I420Scale_12(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + +// Scales a YUV 4:4:4 image from the src width and height to the +// dst width and height. +// If filtering is kFilterNone, a simple nearest-neighbor algorithm is +// used. This produces basic (blocky) quality at the fastest speed. +// If filtering is kFilterBilinear, interpolation is used to produce a better +// quality image, at the expense of speed. +// If filtering is kFilterBox, averaging is used to produce ever better +// quality image, at further expense of speed. +// Returns 0 if successful. + +LIBYUV_API +int I444Scale(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + +LIBYUV_API +int I444Scale_16(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + +LIBYUV_API +int I444Scale_12(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + +// Scales a YUV 4:2:2 image from the src width and height to the +// dst width and height. +// If filtering is kFilterNone, a simple nearest-neighbor algorithm is +// used. This produces basic (blocky) quality at the fastest speed. +// If filtering is kFilterBilinear, interpolation is used to produce a better +// quality image, at the expense of speed. +// If filtering is kFilterBox, averaging is used to produce ever better +// quality image, at further expense of speed. +// Returns 0 if successful. +LIBYUV_API +int I422Scale(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); +LIBYUV_API +int I422Scale_16(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + +LIBYUV_API +int I422Scale_12(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + +// Scales an NV12 image from the src width and height to the +// dst width and height. +// If filtering is kFilterNone, a simple nearest-neighbor algorithm is +// used. This produces basic (blocky) quality at the fastest speed. +// If filtering is kFilterBilinear, interpolation is used to produce a better +// quality image, at the expense of speed. +// kFilterBox is not supported for the UV channel and will be treated as +// bilinear. +// Returns 0 if successful. + +LIBYUV_API +int NV12Scale(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + int src_width, + int src_height, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int dst_width, + int dst_height, + enum FilterMode filtering); + +#ifdef __cplusplus // Legacy API. Deprecated. LIBYUV_API -int ScaleOffset(const uint8* src_i420, int src_width, int src_height, - uint8* dst_i420, int dst_width, int dst_height, int dst_yoffset, - LIBYUV_BOOL interpolate); +int Scale(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + int src_stride_y, + int src_stride_u, + int src_stride_v, + int src_width, + int src_height, + uint8_t* dst_y, + uint8_t* dst_u, + uint8_t* dst_v, + int dst_stride_y, + int dst_stride_u, + int dst_stride_v, + int dst_width, + int dst_height, + LIBYUV_BOOL interpolate); // For testing, allow disabling of specialized scalers. LIBYUV_API diff --git a/third_party/libyuv/include/libyuv/scale_argb.h b/third_party/libyuv/include/libyuv/scale_argb.h index 35cd191c0f..7641f18e34 100644 --- a/third_party/libyuv/include/libyuv/scale_argb.h +++ b/third_party/libyuv/include/libyuv/scale_argb.h @@ -20,32 +20,52 @@ extern "C" { #endif LIBYUV_API -int ARGBScale(const uint8* src_argb, int src_stride_argb, - int src_width, int src_height, - uint8* dst_argb, int dst_stride_argb, - int dst_width, int dst_height, +int ARGBScale(const uint8_t* src_argb, + int src_stride_argb, + int src_width, + int src_height, + uint8_t* dst_argb, + int dst_stride_argb, + int dst_width, + int dst_height, enum FilterMode filtering); // Clipped scale takes destination rectangle coordinates for clip values. LIBYUV_API -int ARGBScaleClip(const uint8* src_argb, int src_stride_argb, - int src_width, int src_height, - uint8* dst_argb, int dst_stride_argb, - int dst_width, int dst_height, - int clip_x, int clip_y, int clip_width, int clip_height, +int ARGBScaleClip(const uint8_t* src_argb, + int src_stride_argb, + int src_width, + int src_height, + uint8_t* dst_argb, + int dst_stride_argb, + int dst_width, + int dst_height, + int clip_x, + int clip_y, + int clip_width, + int clip_height, enum FilterMode filtering); // Scale with YUV conversion to ARGB and clipping. LIBYUV_API -int YUVToARGBScaleClip(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint32 src_fourcc, - int src_width, int src_height, - uint8* dst_argb, int dst_stride_argb, - uint32 dst_fourcc, - int dst_width, int dst_height, - int clip_x, int clip_y, int clip_width, int clip_height, +int YUVToARGBScaleClip(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint32_t src_fourcc, + int src_width, + int src_height, + uint8_t* dst_argb, + int dst_stride_argb, + uint32_t dst_fourcc, + int dst_width, + int dst_height, + int clip_x, + int clip_y, + int clip_width, + int clip_height, enum FilterMode filtering); #ifdef __cplusplus diff --git a/third_party/libyuv/include/libyuv/scale_rgb.h b/third_party/libyuv/include/libyuv/scale_rgb.h new file mode 100644 index 0000000000..d17c39fd6e --- /dev/null +++ b/third_party/libyuv/include/libyuv/scale_rgb.h @@ -0,0 +1,42 @@ +/* + * Copyright 2022 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_SCALE_RGB_H_ +#define INCLUDE_LIBYUV_SCALE_RGB_H_ + +#include "libyuv/basic_types.h" +#include "libyuv/scale.h" // For FilterMode + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// RGB can be RAW, RGB24 or YUV24 +// RGB scales 24 bit images by converting a row at a time to ARGB +// and using ARGB row functions to scale, then convert to RGB. +// TODO(fbarchard): Allow input/output formats to be specified. +LIBYUV_API +int RGBScale(const uint8_t* src_rgb, + int src_stride_rgb, + int src_width, + int src_height, + uint8_t* dst_rgb, + int dst_stride_rgb, + int dst_width, + int dst_height, + enum FilterMode filtering); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_SCALE_UV_H_ diff --git a/third_party/libyuv/include/libyuv/scale_row.h b/third_party/libyuv/include/libyuv/scale_row.h index 791fbf7d05..cc1c906195 100644 --- a/third_party/libyuv/include/libyuv/scale_row.h +++ b/third_party/libyuv/include/libyuv/scale_row.h @@ -19,17 +19,20 @@ namespace libyuv { extern "C" { #endif -#if defined(__pnacl__) || defined(__CLR_VER) || \ - (defined(__i386__) && !defined(__SSE2__)) +#if defined(__pnacl__) || defined(__CLR_VER) || \ + (defined(__native_client__) && defined(__x86_64__)) || \ + (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) #define LIBYUV_DISABLE_X86 #endif +#if defined(__native_client__) +#define LIBYUV_DISABLE_NEON +#endif // MemorySanitizer does not support assembly code yet. http://crbug.com/344505 #if defined(__has_feature) #if __has_feature(memory_sanitizer) #define LIBYUV_DISABLE_X86 #endif #endif - // GCC >= 4.7.0 required for AVX2. #if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) #if (__GNUC__ > 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7)) @@ -45,8 +48,8 @@ extern "C" { #endif // __clang__ // Visual C 2012 required for AVX2. -#if defined(_M_IX86) && !defined(__clang__) && \ - defined(_MSC_VER) && _MSC_VER >= 1700 +#if defined(_M_IX86) && !defined(__clang__) && defined(_MSC_VER) && \ + _MSC_VER >= 1700 #define VISUALC_HAS_AVX2 1 #endif // VisualStudio >= 2012 @@ -55,6 +58,7 @@ extern "C" { (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) #define HAS_FIXEDDIV1_X86 #define HAS_FIXEDDIV_X86 +#define HAS_SCALEADDROW_SSE2 #define HAS_SCALEARGBCOLS_SSE2 #define HAS_SCALEARGBCOLSUP2_SSE2 #define HAS_SCALEARGBFILTERCOLS_SSSE3 @@ -66,23 +70,62 @@ extern "C" { #define HAS_SCALEROWDOWN34_SSSE3 #define HAS_SCALEROWDOWN38_SSSE3 #define HAS_SCALEROWDOWN4_SSSE3 -#define HAS_SCALEADDROW_SSE2 +#endif + +// The following are available for gcc/clang x86 platforms: +// TODO(fbarchard): Port to Visual C +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) +#define HAS_SCALEUVROWDOWN2BOX_SSSE3 +#define HAS_SCALEROWUP2LINEAR_SSE2 +#define HAS_SCALEROWUP2LINEAR_SSSE3 +#define HAS_SCALEROWUP2BILINEAR_SSE2 +#define HAS_SCALEROWUP2BILINEAR_SSSE3 +#define HAS_SCALEROWUP2LINEAR_12_SSSE3 +#define HAS_SCALEROWUP2BILINEAR_12_SSSE3 +#define HAS_SCALEROWUP2LINEAR_16_SSE2 +#define HAS_SCALEROWUP2BILINEAR_16_SSE2 +#define HAS_SCALEUVROWUP2LINEAR_SSSE3 +#define HAS_SCALEUVROWUP2BILINEAR_SSSE3 +#define HAS_SCALEUVROWUP2LINEAR_16_SSE41 +#define HAS_SCALEUVROWUP2BILINEAR_16_SSE41 +#endif + +// The following are available for gcc/clang x86 platforms, but +// require clang 3.4 or gcc 4.7. +// TODO(fbarchard): Port to Visual C +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || defined(__i386__)) && \ + (defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2)) +#define HAS_SCALEUVROWDOWN2BOX_AVX2 +#define HAS_SCALEROWUP2LINEAR_AVX2 +#define HAS_SCALEROWUP2BILINEAR_AVX2 +#define HAS_SCALEROWUP2LINEAR_12_AVX2 +#define HAS_SCALEROWUP2BILINEAR_12_AVX2 +#define HAS_SCALEROWUP2LINEAR_16_AVX2 +#define HAS_SCALEROWUP2BILINEAR_16_AVX2 +#define HAS_SCALEUVROWUP2LINEAR_AVX2 +#define HAS_SCALEUVROWUP2BILINEAR_AVX2 +#define HAS_SCALEUVROWUP2LINEAR_16_AVX2 +#define HAS_SCALEUVROWUP2BILINEAR_16_AVX2 #endif // The following are available on all x86 platforms, but // require VS2012, clang 3.4 or gcc 4.7. // The code supports NaCL but requires a new compiler and validator. -#if !defined(LIBYUV_DISABLE_X86) && (defined(VISUALC_HAS_AVX2) || \ - defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2)) +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \ + defined(GCC_HAS_AVX2)) #define HAS_SCALEADDROW_AVX2 #define HAS_SCALEROWDOWN2_AVX2 #define HAS_SCALEROWDOWN4_AVX2 #endif // The following are available on Neon platforms: -#if !defined(LIBYUV_DISABLE_NEON) && !defined(__native_client__) && \ +#if !defined(LIBYUV_DISABLE_NEON) && \ (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__)) +#define HAS_SCALEADDROW_NEON #define HAS_SCALEARGBCOLS_NEON +#define HAS_SCALEARGBFILTERCOLS_NEON #define HAS_SCALEARGBROWDOWN2_NEON #define HAS_SCALEARGBROWDOWNEVEN_NEON #define HAS_SCALEFILTERCOLS_NEON @@ -90,410 +133,1559 @@ extern "C" { #define HAS_SCALEROWDOWN34_NEON #define HAS_SCALEROWDOWN38_NEON #define HAS_SCALEROWDOWN4_NEON -#define HAS_SCALEARGBFILTERCOLS_NEON +#define HAS_SCALEUVROWDOWN2BOX_NEON +#define HAS_SCALEUVROWDOWNEVEN_NEON +#define HAS_SCALEROWUP2LINEAR_NEON +#define HAS_SCALEROWUP2BILINEAR_NEON +#define HAS_SCALEROWUP2LINEAR_12_NEON +#define HAS_SCALEROWUP2BILINEAR_12_NEON +#define HAS_SCALEROWUP2LINEAR_16_NEON +#define HAS_SCALEROWUP2BILINEAR_16_NEON +#define HAS_SCALEUVROWUP2LINEAR_NEON +#define HAS_SCALEUVROWUP2BILINEAR_NEON +#define HAS_SCALEUVROWUP2LINEAR_16_NEON +#define HAS_SCALEUVROWUP2BILINEAR_16_NEON #endif -// The following are available on Mips platforms: -#if !defined(LIBYUV_DISABLE_MIPS) && !defined(__native_client__) && \ - defined(__mips__) && defined(__mips_dsp) && (__mips_dsp_rev >= 2) -#define HAS_SCALEROWDOWN2_DSPR2 -#define HAS_SCALEROWDOWN4_DSPR2 -#define HAS_SCALEROWDOWN34_DSPR2 -#define HAS_SCALEROWDOWN38_DSPR2 +#if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) +#define HAS_SCALEADDROW_MSA +#define HAS_SCALEARGBCOLS_MSA +#define HAS_SCALEARGBFILTERCOLS_MSA +#define HAS_SCALEARGBROWDOWN2_MSA +#define HAS_SCALEARGBROWDOWNEVEN_MSA +#define HAS_SCALEFILTERCOLS_MSA +#define HAS_SCALEROWDOWN2_MSA +#define HAS_SCALEROWDOWN34_MSA +#define HAS_SCALEROWDOWN38_MSA +#define HAS_SCALEROWDOWN4_MSA +#endif + +#if !defined(LIBYUV_DISABLE_LSX) && defined(__loongarch_sx) +#define HAS_SCALEARGBROWDOWN2_LSX +#define HAS_SCALEARGBROWDOWNEVEN_LSX +#define HAS_SCALEROWDOWN2_LSX +#define HAS_SCALEROWDOWN4_LSX +#define HAS_SCALEROWDOWN38_LSX +#define HAS_SCALEFILTERCOLS_LSX +#define HAS_SCALEADDROW_LSX +#define HAS_SCALEARGBCOLS_LSX +#define HAS_SCALEARGBFILTERCOLS_LSX +#define HAS_SCALEROWDOWN34_LSX #endif // Scale ARGB vertically with bilinear interpolation. void ScalePlaneVertical(int src_height, - int dst_width, int dst_height, - int src_stride, int dst_stride, - const uint8* src_argb, uint8* dst_argb, - int x, int y, int dy, - int bpp, enum FilterMode filtering); + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint8_t* src_argb, + uint8_t* dst_argb, + int x, + int y, + int dy, + int bpp, + enum FilterMode filtering); void ScalePlaneVertical_16(int src_height, - int dst_width, int dst_height, - int src_stride, int dst_stride, - const uint16* src_argb, uint16* dst_argb, - int x, int y, int dy, - int wpp, enum FilterMode filtering); + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint16_t* src_argb, + uint16_t* dst_argb, + int x, + int y, + int dy, + int wpp, + enum FilterMode filtering); // Simplify the filtering based on scale factors. -enum FilterMode ScaleFilterReduce(int src_width, int src_height, - int dst_width, int dst_height, +enum FilterMode ScaleFilterReduce(int src_width, + int src_height, + int dst_width, + int dst_height, enum FilterMode filtering); // Divide num by div and return as 16.16 fixed point result. int FixedDiv_C(int num, int div); int FixedDiv_X86(int num, int div); +int FixedDiv_MIPS(int num, int div); // Divide num - 1 by div - 1 and return as 16.16 fixed point result. int FixedDiv1_C(int num, int div); int FixedDiv1_X86(int num, int div); +int FixedDiv1_MIPS(int num, int div); #ifdef HAS_FIXEDDIV_X86 #define FixedDiv FixedDiv_X86 #define FixedDiv1 FixedDiv1_X86 +#elif defined HAS_FIXEDDIV_MIPS +#define FixedDiv FixedDiv_MIPS +#define FixedDiv1 FixedDiv1_MIPS #else #define FixedDiv FixedDiv_C #define FixedDiv1 FixedDiv1_C #endif // Compute slope values for stepping. -void ScaleSlope(int src_width, int src_height, - int dst_width, int dst_height, +void ScaleSlope(int src_width, + int src_height, + int dst_width, + int dst_height, enum FilterMode filtering, - int* x, int* y, int* dx, int* dy); - -void ScaleRowDown2_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown2_16_C(const uint16* src_ptr, ptrdiff_t src_stride, - uint16* dst, int dst_width); -void ScaleRowDown2Linear_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown2Linear_16_C(const uint16* src_ptr, ptrdiff_t src_stride, - uint16* dst, int dst_width); -void ScaleRowDown2Box_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown2Box_Odd_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown2Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, - uint16* dst, int dst_width); -void ScaleRowDown4_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown4_16_C(const uint16* src_ptr, ptrdiff_t src_stride, - uint16* dst, int dst_width); -void ScaleRowDown4Box_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown4Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, - uint16* dst, int dst_width); -void ScaleRowDown34_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown34_16_C(const uint16* src_ptr, ptrdiff_t src_stride, - uint16* dst, int dst_width); -void ScaleRowDown34_0_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* d, int dst_width); -void ScaleRowDown34_0_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, - uint16* d, int dst_width); -void ScaleRowDown34_1_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* d, int dst_width); -void ScaleRowDown34_1_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, - uint16* d, int dst_width); -void ScaleCols_C(uint8* dst_ptr, const uint8* src_ptr, - int dst_width, int x, int dx); -void ScaleCols_16_C(uint16* dst_ptr, const uint16* src_ptr, - int dst_width, int x, int dx); -void ScaleColsUp2_C(uint8* dst_ptr, const uint8* src_ptr, - int dst_width, int, int); -void ScaleColsUp2_16_C(uint16* dst_ptr, const uint16* src_ptr, - int dst_width, int, int); -void ScaleFilterCols_C(uint8* dst_ptr, const uint8* src_ptr, - int dst_width, int x, int dx); -void ScaleFilterCols_16_C(uint16* dst_ptr, const uint16* src_ptr, - int dst_width, int x, int dx); -void ScaleFilterCols64_C(uint8* dst_ptr, const uint8* src_ptr, - int dst_width, int x, int dx); -void ScaleFilterCols64_16_C(uint16* dst_ptr, const uint16* src_ptr, - int dst_width, int x, int dx); -void ScaleRowDown38_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown38_16_C(const uint16* src_ptr, ptrdiff_t src_stride, - uint16* dst, int dst_width); -void ScaleRowDown38_3_Box_C(const uint8* src_ptr, + int* x, + int* y, + int* dx, + int* dy); + +void ScaleRowDown2_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown2Linear_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Linear_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown2Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Box_Odd_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown4_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown4Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown34_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown34_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown34_0_Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* d, + int dst_width); +void ScaleRowDown34_0_Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* d, + int dst_width); +void ScaleRowDown34_1_Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* d, + int dst_width); +void ScaleRowDown34_1_Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* d, + int dst_width); + +void ScaleRowUp2_Linear_C(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_C(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_Any_C(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_Any_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_Any_C(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_Any_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); + +void ScaleCols_C(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleCols_16_C(uint16_t* dst_ptr, + const uint16_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleColsUp2_C(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int, + int); +void ScaleColsUp2_16_C(uint16_t* dst_ptr, + const uint16_t* src_ptr, + int dst_width, + int, + int); +void ScaleFilterCols_C(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleFilterCols_16_C(uint16_t* dst_ptr, + const uint16_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleFilterCols64_C(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x32, + int dx); +void ScaleFilterCols64_16_C(uint16_t* dst_ptr, + const uint16_t* src_ptr, + int dst_width, + int x32, + int dx); +void ScaleRowDown38_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown38_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst, + int dst_width); +void ScaleRowDown38_3_Box_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_C(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown38_3_Box_16_C(const uint16* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_16_C(const uint16_t* src_ptr, ptrdiff_t src_stride, - uint16* dst_ptr, int dst_width); -void ScaleRowDown38_2_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown38_2_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, - uint16* dst_ptr, int dst_width); -void ScaleAddRow_C(const uint8* src_ptr, uint16* dst_ptr, int src_width); -void ScaleAddRow_16_C(const uint16* src_ptr, uint32* dst_ptr, int src_width); -void ScaleARGBRowDown2_C(const uint8* src_argb, + uint16_t* dst_ptr, + int dst_width); +void ScaleAddRow_C(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleAddRow_16_C(const uint16_t* src_ptr, + uint32_t* dst_ptr, + int src_width); +void ScaleARGBRowDown2_C(const uint8_t* src_argb, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDown2Linear_C(const uint8* src_argb, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Linear_C(const uint8_t* src_argb, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDown2Box_C(const uint8* src_argb, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDownEven_C(const uint8* src_argb, ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Box_C(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEven_C(const uint8_t* src_argb, + ptrdiff_t src_stride, int src_stepx, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDownEvenBox_C(const uint8* src_argb, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEvenBox_C(const uint8_t* src_argb, ptrdiff_t src_stride, int src_stepx, - uint8* dst_argb, int dst_width); -void ScaleARGBCols_C(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); -void ScaleARGBCols64_C(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); -void ScaleARGBColsUp2_C(uint8* dst_argb, const uint8* src_argb, - int dst_width, int, int); -void ScaleARGBFilterCols_C(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); -void ScaleARGBFilterCols64_C(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); + uint8_t* dst_argb, + int dst_width); +void ScaleARGBCols_C(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBCols64_C(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x32, + int dx); +void ScaleARGBColsUp2_C(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int, + int); +void ScaleARGBFilterCols_C(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols64_C(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x32, + int dx); +void ScaleUVRowDown2_C(const uint8_t* src_uv, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Linear_C(const uint8_t* src_uv, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_C(const uint8_t* src_uv, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEven_C(const uint8_t* src_uv, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEvenBox_C(const uint8_t* src_uv, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); + +void ScaleUVRowUp2_Linear_C(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_Any_C(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_Any_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_C(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_Any_C(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_Any_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); + +void ScaleUVCols_C(uint8_t* dst_uv, + const uint8_t* src_uv, + int dst_width, + int x, + int dx); +void ScaleUVCols64_C(uint8_t* dst_uv, + const uint8_t* src_uv, + int dst_width, + int x32, + int dx); +void ScaleUVColsUp2_C(uint8_t* dst_uv, + const uint8_t* src_uv, + int dst_width, + int, + int); +void ScaleUVFilterCols_C(uint8_t* dst_uv, + const uint8_t* src_uv, + int dst_width, + int x, + int dx); +void ScaleUVFilterCols64_C(uint8_t* dst_uv, + const uint8_t* src_uv, + int dst_width, + int x32, + int dx); // Specialized scalers for x86. -void ScaleRowDown2_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2Linear_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2Box_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2Linear_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2Box_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown4_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown4Box_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown4_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown4Box_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); - -void ScaleRowDown34_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown34_1_Box_SSSE3(const uint8* src_ptr, +void ScaleRowDown2_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +void ScaleRowDown34_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_SSSE3(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown34_0_Box_SSSE3(const uint8* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_SSSE3(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown38_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown38_3_Box_SSSE3(const uint8* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_SSSE3(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown38_2_Box_SSSE3(const uint8* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_SSSE3(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2_Any_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2Linear_Any_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2Box_Any_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2Box_Odd_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2_Any_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2Linear_Any_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2Box_Any_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown2Box_Odd_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown4_Any_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown4Box_Any_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown4_Any_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown4Box_Any_AVX2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); - -void ScaleRowDown34_Any_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown34_1_Box_Any_SSSE3(const uint8* src_ptr, + uint8_t* dst_ptr, + int dst_width); + +void ScaleRowUp2_Linear_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_SSSE3(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_SSSE3(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_SSE2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_SSE2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_Any_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_Any_SSSE3(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_Any_SSSE3(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_Any_SSE2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_Any_SSSE3(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_Any_SSSE3(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown34_0_Box_Any_SSSE3(const uint8* src_ptr, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_Any_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_Any_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); + +void ScaleRowDown2_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Odd_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Odd_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +void ScaleRowDown34_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_Any_SSSE3(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown38_Any_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown38_3_Box_Any_SSSE3(const uint8* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_Any_SSSE3(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown38_2_Box_Any_SSSE3(const uint8* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_Any_SSSE3(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); - -void ScaleAddRow_SSE2(const uint8* src_ptr, uint16* dst_ptr, int src_width); -void ScaleAddRow_AVX2(const uint8* src_ptr, uint16* dst_ptr, int src_width); -void ScaleAddRow_Any_SSE2(const uint8* src_ptr, uint16* dst_ptr, int src_width); -void ScaleAddRow_Any_AVX2(const uint8* src_ptr, uint16* dst_ptr, int src_width); + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); -void ScaleFilterCols_SSSE3(uint8* dst_ptr, const uint8* src_ptr, - int dst_width, int x, int dx); -void ScaleColsUp2_SSE2(uint8* dst_ptr, const uint8* src_ptr, - int dst_width, int x, int dx); +void ScaleAddRow_SSE2(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleAddRow_AVX2(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleAddRow_Any_SSE2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width); +void ScaleAddRow_Any_AVX2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width); +void ScaleFilterCols_SSSE3(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleColsUp2_SSE2(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); // ARGB Column functions -void ScaleARGBCols_SSE2(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); -void ScaleARGBFilterCols_SSSE3(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); -void ScaleARGBColsUp2_SSE2(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); -void ScaleARGBFilterCols_NEON(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); -void ScaleARGBCols_NEON(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); -void ScaleARGBFilterCols_Any_NEON(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); -void ScaleARGBCols_Any_NEON(uint8* dst_argb, const uint8* src_argb, - int dst_width, int x, int dx); +void ScaleARGBCols_SSE2(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_SSSE3(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBColsUp2_SSE2(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_NEON(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBCols_NEON(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_Any_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBCols_Any_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_MSA(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBCols_MSA(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_Any_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBCols_Any_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); // ARGB Row functions -void ScaleARGBRowDown2_SSE2(const uint8* src_argb, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDown2Linear_SSE2(const uint8* src_argb, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDown2Box_SSE2(const uint8* src_argb, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleARGBRowDown2Linear_NEON(const uint8* src_argb, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleARGBRowDown2_Any_SSE2(const uint8* src_argb, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDown2Linear_Any_SSE2(const uint8* src_argb, +void ScaleARGBRowDown2_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Linear_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Box_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleARGBRowDown2Linear_NEON(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleARGBRowDown2_MSA(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Linear_MSA(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Box_MSA(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2_LSX(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Linear_LSX(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2Box_LSX(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDown2_Any_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Linear_Any_SSE2(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDown2Box_Any_SSE2(const uint8* src_argb, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDown2_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleARGBRowDown2Linear_Any_NEON(const uint8* src_argb, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Box_Any_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Linear_Any_NEON(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDown2Box_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); - -void ScaleARGBRowDownEven_SSE2(const uint8* src_argb, ptrdiff_t src_stride, - int src_stepx, uint8* dst_argb, int dst_width); -void ScaleARGBRowDownEvenBox_SSE2(const uint8* src_argb, ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Linear_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Linear_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDown2Box_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEven_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEvenBox_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, int src_stepx, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDownEven_NEON(const uint8* src_argb, ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEven_NEON(const uint8_t* src_argb, + ptrdiff_t src_stride, int src_stepx, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDownEvenBox_NEON(const uint8* src_argb, ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEvenBox_NEON(const uint8_t* src_argb, + ptrdiff_t src_stride, int src_stepx, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDownEven_Any_SSE2(const uint8* src_argb, ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEven_MSA(const uint8_t* src_argb, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEvenBox_MSA(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEven_LSX(const uint8_t* src_argb, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEvenBox_LSX(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width); +void ScaleARGBRowDownEven_Any_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, int src_stepx, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDownEvenBox_Any_SSE2(const uint8* src_argb, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEvenBox_Any_SSE2(const uint8_t* src_ptr, ptrdiff_t src_stride, int src_stepx, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDownEven_Any_NEON(const uint8* src_argb, ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEven_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, int src_stepx, - uint8* dst_argb, int dst_width); -void ScaleARGBRowDownEvenBox_Any_NEON(const uint8* src_argb, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEvenBox_Any_NEON(const uint8_t* src_ptr, ptrdiff_t src_stride, int src_stepx, - uint8* dst_argb, int dst_width); + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEven_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEvenBox_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEven_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleARGBRowDownEvenBox_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); + +// UV Row functions +void ScaleUVRowDown2_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Linear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleUVRowDown2Linear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleUVRowDown2_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Linear_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDown2_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Linear_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Box_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Box_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Linear_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Linear_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDown2Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEven_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEvenBox_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEven_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEvenBox_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEven_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEvenBox_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_uv, + int dst_width); +void ScaleUVRowDownEven_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEvenBox_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEven_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEvenBox_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEven_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int32_t src_stepx, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowDownEvenBox_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_ptr, + int dst_width); + +void ScaleUVRowUp2_Linear_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_SSE41(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_SSE41(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_Any_SSE41(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_Any_SSE41(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_Any_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_Any_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); // ScaleRowDown2Box also used by planar functions // NEON downscalers with interpolation. // Note - not static due to reuse in convert for 444 to 420. -void ScaleRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown2Linear_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); - -void ScaleRowDown4_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown4Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); +void ScaleRowDown2_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Linear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); + +void ScaleRowDown4_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); // Down scale from 4 to 3 pixels. Use the neon multilane read/write // to load up the every 4th pixel into a 4 different registers. // Point samples 32 pixels to 24 pixels. -void ScaleRowDown34_NEON(const uint8* src_ptr, +void ScaleRowDown34_NEON(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown34_0_Box_NEON(const uint8* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_NEON(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown34_1_Box_NEON(const uint8* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_NEON(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); + uint8_t* dst_ptr, + int dst_width); // 32 -> 12 -void ScaleRowDown38_NEON(const uint8* src_ptr, +void ScaleRowDown38_NEON(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); + uint8_t* dst_ptr, + int dst_width); // 32x3 -> 12x1 -void ScaleRowDown38_3_Box_NEON(const uint8* src_ptr, +void ScaleRowDown38_3_Box_NEON(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); + uint8_t* dst_ptr, + int dst_width); // 32x2 -> 12x1 -void ScaleRowDown38_2_Box_NEON(const uint8* src_ptr, +void ScaleRowDown38_2_Box_NEON(const uint8_t* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); - -void ScaleRowDown2_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown2Linear_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown2Box_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown2Box_Odd_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown4_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown4Box_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown34_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown34_0_Box_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown34_1_Box_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); + uint8_t* dst_ptr, + int dst_width); + +void ScaleRowDown2_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Odd_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); // 32 -> 12 -void ScaleRowDown38_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); +void ScaleRowDown38_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); // 32x3 -> 12x1 -void ScaleRowDown38_3_Box_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); +void ScaleRowDown38_3_Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); // 32x2 -> 12x1 -void ScaleRowDown38_2_Box_Any_NEON(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); - -void ScaleAddRow_NEON(const uint8* src_ptr, uint16* dst_ptr, int src_width); -void ScaleAddRow_Any_NEON(const uint8* src_ptr, uint16* dst_ptr, int src_width); - -void ScaleFilterCols_NEON(uint8* dst_ptr, const uint8* src_ptr, - int dst_width, int x, int dx); - -void ScaleFilterCols_Any_NEON(uint8* dst_ptr, const uint8* src_ptr, - int dst_width, int x, int dx); - -void ScaleRowDown2_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown2Box_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown4_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown4Box_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown34_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown34_0_Box_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* d, int dst_width); -void ScaleRowDown34_1_Box_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* d, int dst_width); -void ScaleRowDown38_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst, int dst_width); -void ScaleRowDown38_2_Box_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); -void ScaleRowDown38_3_Box_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, - uint8* dst_ptr, int dst_width); +void ScaleRowDown38_2_Box_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +void ScaleRowUp2_Linear_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_Any_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_Any_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); + +void ScaleAddRow_NEON(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleAddRow_Any_NEON(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width); + +void ScaleFilterCols_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); + +void ScaleFilterCols_Any_NEON(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); + +void ScaleRowDown2_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Linear_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown38_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown38_2_Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleAddRow_MSA(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleFilterCols_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleRowDown34_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown34_0_Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* d, + int dst_width); +void ScaleRowDown34_1_Box_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* d, + int dst_width); + +void ScaleRowDown2_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleAddRow_Any_MSA(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width); +void ScaleFilterCols_Any_MSA(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleRowDown34_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_Any_MSA(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); + +void ScaleRowDown2_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Linear_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown2Box_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown4Box_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown38_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown38_2_Box_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleAddRow_LSX(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); +void ScaleFilterCols_LSX(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_LSX(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleARGBCols_LSX(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx); +void ScaleRowDown34_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst, + int dst_width); +void ScaleRowDown34_0_Box_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* d, + int dst_width); +void ScaleRowDown34_1_Box_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* d, + int dst_width); +void ScaleRowDown2_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Linear_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown2Box_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown4Box_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_2_Box_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown38_3_Box_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleAddRow_Any_LSX(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width); +void ScaleFilterCols_Any_LSX(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBCols_Any_LSX(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleARGBFilterCols_Any_LSX(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx); +void ScaleRowDown34_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_0_Box_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowDown34_1_Box_Any_LSX(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/include/libyuv/scale_uv.h b/third_party/libyuv/include/libyuv/scale_uv.h new file mode 100644 index 0000000000..8e74e3195b --- /dev/null +++ b/third_party/libyuv/include/libyuv/scale_uv.h @@ -0,0 +1,51 @@ +/* + * Copyright 2020 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_SCALE_UV_H_ +#define INCLUDE_LIBYUV_SCALE_UV_H_ + +#include "libyuv/basic_types.h" +#include "libyuv/scale.h" // For FilterMode + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +LIBYUV_API +int UVScale(const uint8_t* src_uv, + int src_stride_uv, + int src_width, + int src_height, + uint8_t* dst_uv, + int dst_stride_uv, + int dst_width, + int dst_height, + enum FilterMode filtering); + +// Scale a 16 bit UV image. +// This function is currently incomplete, it can't handle all cases. +LIBYUV_API +int UVScale_16(const uint16_t* src_uv, + int src_stride_uv, + int src_width, + int src_height, + uint16_t* dst_uv, + int dst_stride_uv, + int dst_width, + int dst_height, + enum FilterMode filtering); + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif + +#endif // INCLUDE_LIBYUV_SCALE_UV_H_ diff --git a/third_party/libyuv/include/libyuv/version.h b/third_party/libyuv/include/libyuv/version.h index 3a8f6337ca..a2d9fce0d3 100644 --- a/third_party/libyuv/include/libyuv/version.h +++ b/third_party/libyuv/include/libyuv/version.h @@ -11,6 +11,6 @@ #ifndef INCLUDE_LIBYUV_VERSION_H_ #define INCLUDE_LIBYUV_VERSION_H_ -#define LIBYUV_VERSION 1622 +#define LIBYUV_VERSION 1822 #endif // INCLUDE_LIBYUV_VERSION_H_ diff --git a/third_party/libyuv/include/libyuv/video_common.h b/third_party/libyuv/include/libyuv/video_common.h index cb425426a2..32b8a5210b 100644 --- a/third_party/libyuv/include/libyuv/video_common.h +++ b/third_party/libyuv/include/libyuv/video_common.h @@ -28,13 +28,14 @@ extern "C" { // Needs to be a macro otherwise the OS X compiler complains when the kFormat* // constants are used in a switch. #ifdef __cplusplus -#define FOURCC(a, b, c, d) ( \ - (static_cast(a)) | (static_cast(b) << 8) | \ - (static_cast(c) << 16) | (static_cast(d) << 24)) +#define FOURCC(a, b, c, d) \ + ((static_cast(a)) | (static_cast(b) << 8) | \ + (static_cast(c) << 16) | /* NOLINT */ \ + (static_cast(d) << 24)) /* NOLINT */ #else -#define FOURCC(a, b, c, d) ( \ - ((uint32)(a)) | ((uint32)(b) << 8) | /* NOLINT */ \ - ((uint32)(c) << 16) | ((uint32)(d) << 24)) /* NOLINT */ +#define FOURCC(a, b, c, d) \ + (((uint32_t)(a)) | ((uint32_t)(b) << 8) | /* NOLINT */ \ + ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24)) /* NOLINT */ #endif // Some pages discussing FourCC codes: @@ -49,49 +50,69 @@ extern "C" { // Secondary formats are converted in 2 steps. // Auxilliary formats call primary converters. enum FourCC { - // 9 Primary YUV formats: 5 planar, 2 biplanar, 2 packed. + // 10 Primary YUV formats: 5 planar, 2 biplanar, 2 packed. FOURCC_I420 = FOURCC('I', '4', '2', '0'), FOURCC_I422 = FOURCC('I', '4', '2', '2'), FOURCC_I444 = FOURCC('I', '4', '4', '4'), - FOURCC_I411 = FOURCC('I', '4', '1', '1'), FOURCC_I400 = FOURCC('I', '4', '0', '0'), FOURCC_NV21 = FOURCC('N', 'V', '2', '1'), FOURCC_NV12 = FOURCC('N', 'V', '1', '2'), FOURCC_YUY2 = FOURCC('Y', 'U', 'Y', '2'), FOURCC_UYVY = FOURCC('U', 'Y', 'V', 'Y'), + FOURCC_I010 = FOURCC('I', '0', '1', '0'), // bt.601 10 bit 420 + FOURCC_I210 = FOURCC('I', '2', '1', '0'), // bt.601 10 bit 422 - // 2 Secondary YUV formats: row biplanar. + // 1 Secondary YUV format: row biplanar. deprecated. FOURCC_M420 = FOURCC('M', '4', '2', '0'), - FOURCC_Q420 = FOURCC('Q', '4', '2', '0'), // deprecated. - // 9 Primary RGB formats: 4 32 bpp, 2 24 bpp, 3 16 bpp. + // 13 Primary RGB formats: 4 32 bpp, 2 24 bpp, 3 16 bpp, 1 10 bpc 2 64 bpp FOURCC_ARGB = FOURCC('A', 'R', 'G', 'B'), FOURCC_BGRA = FOURCC('B', 'G', 'R', 'A'), FOURCC_ABGR = FOURCC('A', 'B', 'G', 'R'), + FOURCC_AR30 = FOURCC('A', 'R', '3', '0'), // 10 bit per channel. 2101010. + FOURCC_AB30 = FOURCC('A', 'B', '3', '0'), // ABGR version of 10 bit + FOURCC_AR64 = FOURCC('A', 'R', '6', '4'), // 16 bit per channel. + FOURCC_AB64 = FOURCC('A', 'B', '6', '4'), // ABGR version of 16 bit FOURCC_24BG = FOURCC('2', '4', 'B', 'G'), - FOURCC_RAW = FOURCC('r', 'a', 'w', ' '), + FOURCC_RAW = FOURCC('r', 'a', 'w', ' '), FOURCC_RGBA = FOURCC('R', 'G', 'B', 'A'), FOURCC_RGBP = FOURCC('R', 'G', 'B', 'P'), // rgb565 LE. FOURCC_RGBO = FOURCC('R', 'G', 'B', 'O'), // argb1555 LE. FOURCC_R444 = FOURCC('R', '4', '4', '4'), // argb4444 LE. - // 4 Secondary RGB formats: 4 Bayer Patterns. deprecated. - FOURCC_RGGB = FOURCC('R', 'G', 'G', 'B'), - FOURCC_BGGR = FOURCC('B', 'G', 'G', 'R'), - FOURCC_GRBG = FOURCC('G', 'R', 'B', 'G'), - FOURCC_GBRG = FOURCC('G', 'B', 'R', 'G'), - // 1 Primary Compressed YUV format. FOURCC_MJPG = FOURCC('M', 'J', 'P', 'G'), - // 5 Auxiliary YUV variations: 3 with U and V planes are swapped, 1 Alias. + // 14 Auxiliary YUV variations: 3 with U and V planes are swapped, 1 Alias. FOURCC_YV12 = FOURCC('Y', 'V', '1', '2'), FOURCC_YV16 = FOURCC('Y', 'V', '1', '6'), FOURCC_YV24 = FOURCC('Y', 'V', '2', '4'), FOURCC_YU12 = FOURCC('Y', 'U', '1', '2'), // Linux version of I420. - FOURCC_J420 = FOURCC('J', '4', '2', '0'), - FOURCC_J400 = FOURCC('J', '4', '0', '0'), // unofficial fourcc - FOURCC_H420 = FOURCC('H', '4', '2', '0'), // unofficial fourcc + FOURCC_J420 = + FOURCC('J', '4', '2', '0'), // jpeg (bt.601 full), unofficial fourcc + FOURCC_J422 = + FOURCC('J', '4', '2', '2'), // jpeg (bt.601 full), unofficial fourcc + FOURCC_J444 = + FOURCC('J', '4', '4', '4'), // jpeg (bt.601 full), unofficial fourcc + FOURCC_J400 = + FOURCC('J', '4', '0', '0'), // jpeg (bt.601 full), unofficial fourcc + FOURCC_F420 = FOURCC('F', '4', '2', '0'), // bt.709 full, unofficial fourcc + FOURCC_F422 = FOURCC('F', '4', '2', '2'), // bt.709 full, unofficial fourcc + FOURCC_F444 = FOURCC('F', '4', '4', '4'), // bt.709 full, unofficial fourcc + FOURCC_H420 = FOURCC('H', '4', '2', '0'), // bt.709, unofficial fourcc + FOURCC_H422 = FOURCC('H', '4', '2', '2'), // bt.709, unofficial fourcc + FOURCC_H444 = FOURCC('H', '4', '4', '4'), // bt.709, unofficial fourcc + FOURCC_U420 = FOURCC('U', '4', '2', '0'), // bt.2020, unofficial fourcc + FOURCC_U422 = FOURCC('U', '4', '2', '2'), // bt.2020, unofficial fourcc + FOURCC_U444 = FOURCC('U', '4', '4', '4'), // bt.2020, unofficial fourcc + FOURCC_F010 = FOURCC('F', '0', '1', '0'), // bt.709 full range 10 bit 420 + FOURCC_H010 = FOURCC('H', '0', '1', '0'), // bt.709 10 bit 420 + FOURCC_U010 = FOURCC('U', '0', '1', '0'), // bt.2020 10 bit 420 + FOURCC_F210 = FOURCC('F', '2', '1', '0'), // bt.709 full range 10 bit 422 + FOURCC_H210 = FOURCC('H', '2', '1', '0'), // bt.709 10 bit 422 + FOURCC_U210 = FOURCC('U', '2', '1', '0'), // bt.2020 10 bit 422 + FOURCC_P010 = FOURCC('P', '0', '1', '0'), + FOURCC_P210 = FOURCC('P', '2', '1', '0'), // 14 Auxiliary aliases. CanonicalFourCC() maps these to canonical fourcc. FOURCC_IYUV = FOURCC('I', 'Y', 'U', 'V'), // Alias for I420. @@ -112,7 +133,13 @@ enum FourCC { FOURCC_L565 = FOURCC('L', '5', '6', '5'), // Alias for RGBP. FOURCC_5551 = FOURCC('5', '5', '5', '1'), // Alias for RGBO. - // 1 Auxiliary compressed YUV format set aside for capturer. + // deprecated formats. Not supported, but defined for backward compatibility. + FOURCC_I411 = FOURCC('I', '4', '1', '1'), + FOURCC_Q420 = FOURCC('Q', '4', '2', '0'), + FOURCC_RGGB = FOURCC('R', 'G', 'G', 'B'), + FOURCC_BGGR = FOURCC('B', 'G', 'G', 'R'), + FOURCC_GRBG = FOURCC('G', 'R', 'B', 'G'), + FOURCC_GBRG = FOURCC('G', 'B', 'R', 'G'), FOURCC_H264 = FOURCC('H', '2', '6', '4'), // Match any fourcc. @@ -130,14 +157,18 @@ enum FourCCBpp { FOURCC_BPP_NV12 = 12, FOURCC_BPP_YUY2 = 16, FOURCC_BPP_UYVY = 16, - FOURCC_BPP_M420 = 12, + FOURCC_BPP_M420 = 12, // deprecated FOURCC_BPP_Q420 = 12, FOURCC_BPP_ARGB = 32, FOURCC_BPP_BGRA = 32, FOURCC_BPP_ABGR = 32, FOURCC_BPP_RGBA = 32, + FOURCC_BPP_AR30 = 32, + FOURCC_BPP_AB30 = 32, + FOURCC_BPP_AR64 = 64, + FOURCC_BPP_AB64 = 64, FOURCC_BPP_24BG = 24, - FOURCC_BPP_RAW = 24, + FOURCC_BPP_RAW = 24, FOURCC_BPP_RGBP = 16, FOURCC_BPP_RGBO = 16, FOURCC_BPP_R444 = 16, @@ -152,6 +183,13 @@ enum FourCCBpp { FOURCC_BPP_J420 = 12, FOURCC_BPP_J400 = 8, FOURCC_BPP_H420 = 12, + FOURCC_BPP_H422 = 16, + FOURCC_BPP_I010 = 15, + FOURCC_BPP_I210 = 20, + FOURCC_BPP_H010 = 15, + FOURCC_BPP_H210 = 20, + FOURCC_BPP_P010 = 15, + FOURCC_BPP_P210 = 20, FOURCC_BPP_MJPG = 0, // 0 means unknown. FOURCC_BPP_H264 = 0, FOURCC_BPP_IYUV = 12, @@ -170,11 +208,11 @@ enum FourCCBpp { FOURCC_BPP_CM24 = 24, // Match any fourcc. - FOURCC_BPP_ANY = 0, // 0 means unknown. + FOURCC_BPP_ANY = 0, // 0 means unknown. }; // Converts fourcc aliases into canonical ones. -LIBYUV_API uint32 CanonicalFourCC(uint32 fourcc); +LIBYUV_API uint32_t CanonicalFourCC(uint32_t fourcc); #ifdef __cplusplus } // extern "C" diff --git a/third_party/libyuv/larch64/lib/libyuv.a b/third_party/libyuv/larch64/lib/libyuv.a index fdbcda2517a96c5191112488e3634f328801b358..402463a694f7e157d35161f0ba2ce0c14f028aec 100644 GIT binary patch literal 791926 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

stc&#yZ-6 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

L9GllVN*^8=#Ky@J1uG}POt1=ruD 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�>A4fFE|PtoO#>55ChoyV&?} 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