mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-07 17:26:49 +08:00
neon yuv matrix function
R=harryjin@google.com BUG=libyuv:488 Review URL: https://codereview.chromium.org/1337973002 .
This commit is contained in:
parent
602fdbef94
commit
67a9e30225
@ -1,6 +1,6 @@
|
||||
Name: libyuv
|
||||
URL: http://code.google.com/p/libyuv/
|
||||
Version: 1481
|
||||
Version: 1482
|
||||
License: BSD
|
||||
License File: LICENSE
|
||||
|
||||
|
||||
@ -304,7 +304,9 @@ extern "C" {
|
||||
#define HAS_I422TOARGB4444ROW_NEON
|
||||
#define HAS_I422TOARGBROW_NEON
|
||||
// TODO(fbarchard): Implement NEON version
|
||||
// #define HAS_I422TOARGBMATRIXROW_NEON
|
||||
#ifndef __aarch64__
|
||||
#define HAS_I422TOARGBMATRIXROW_NEON
|
||||
#endif
|
||||
// #define HAS_I422TOABGRMATRIXROW_NEON
|
||||
#define HAS_I422TOBGRAROW_NEON
|
||||
#define HAS_I422TORAWROW_NEON
|
||||
@ -442,6 +444,13 @@ struct YuvConstants {
|
||||
lvec16 kYToRgb;
|
||||
};
|
||||
|
||||
struct YuvConstantsNEON {
|
||||
uvec8 kUVToRB;
|
||||
uvec8 kUVToG;
|
||||
vec16 kUVBiasBGR;
|
||||
vec32 kYToRgb;
|
||||
};
|
||||
|
||||
#if defined(__APPLE__) || defined(__x86_64__) || defined(__llvm__)
|
||||
#define OMITFP
|
||||
#else
|
||||
@ -541,7 +550,7 @@ void I422ToARGBMatrixRow_NEON(const uint8* src_y,
|
||||
const uint8* src_u,
|
||||
const uint8* src_v,
|
||||
uint8* dst_argb,
|
||||
struct YuvConstants* YuvConstants,
|
||||
struct YuvConstantsNEON* YuvConstants,
|
||||
int width);
|
||||
void I422ToABGRMatrixRow_NEON(const uint8* src_y,
|
||||
const uint8* src_u,
|
||||
|
||||
@ -11,6 +11,6 @@
|
||||
#ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT
|
||||
#define INCLUDE_LIBYUV_VERSION_H_
|
||||
|
||||
#define LIBYUV_VERSION 1481
|
||||
#define LIBYUV_VERSION 1482
|
||||
|
||||
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
||||
|
||||
@ -2276,6 +2276,7 @@ void I422ToUYVYRow_C(const uint8* src_y,
|
||||
extern struct YuvConstants kYuvConstants;
|
||||
extern struct YuvConstants kYuvJConstants;
|
||||
extern struct YuvConstants kYuvHConstants;
|
||||
extern struct YuvConstantsNEON kYuvConstantsNEON;
|
||||
|
||||
#define ANYYUV(NAMEANY, ANY_SIMD, YUVCONSTANTS) \
|
||||
void NAMEANY(const uint8* y_buf, \
|
||||
@ -2286,6 +2287,12 @@ extern struct YuvConstants kYuvHConstants;
|
||||
ANY_SIMD(y_buf, u_buf, v_buf, dst_argb, &YUVCONSTANTS, width); \
|
||||
}
|
||||
|
||||
#ifdef HAS_I422TOARGBMATRIXROW_NEON
|
||||
ANYYUV(I422ToARGBRow_NEON, I422ToARGBMatrixRow_NEON, kYuvConstantsNEON)
|
||||
//ANYYUV(J422ToARGBRow_NEON, I422ToARGBMatrixRow_NEON, kYuvJConstantsNEON)
|
||||
//ANYYUV(H422ToARGBRow_NEON, I422ToARGBMatrixRow_NEON, kYuvHConstantsNEON)
|
||||
#endif
|
||||
|
||||
#ifdef HAS_I422TOARGBMATRIXROW_SSSE3
|
||||
ANYYUV(I422ToARGBRow_SSSE3, I422ToARGBMatrixRow_SSSE3, kYuvConstants)
|
||||
ANYYUV(J422ToARGBRow_SSSE3, I422ToARGBMatrixRow_SSSE3, kYuvJConstants)
|
||||
|
||||
@ -150,6 +150,13 @@ extern "C" {
|
||||
#define BG (UG * 128 + VG * 128 - YGB)
|
||||
#define BR (VR * 128 - YGB)
|
||||
|
||||
YuvConstantsNEON SIMD_ALIGNED(kYuvConstantsNEON) = {
|
||||
{ 128, 128, 128, 128, 102, 102, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 25, 25, 25, 25, 52, 52, 52, 52, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ BB, BG, BR, 0, 0, 0, 0, 0 },
|
||||
{ 0x0101 * YG, 0, 0, 0 }
|
||||
};
|
||||
|
||||
static uvec8 kUVToRB = { 128, 128, 128, 128, 102, 102, 102, 102,
|
||||
0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
static uvec8 kUVToG = { 25, 25, 25, 25, 52, 52, 52, 52,
|
||||
@ -196,11 +203,12 @@ void I444ToARGBRow_NEON(const uint8* src_y,
|
||||
);
|
||||
}
|
||||
|
||||
void I422ToARGBRow_NEON(const uint8* src_y,
|
||||
const uint8* src_u,
|
||||
const uint8* src_v,
|
||||
uint8* dst_argb,
|
||||
int width) {
|
||||
void I422ToARGBMatrixRow_NEON(const uint8* src_y,
|
||||
const uint8* src_u,
|
||||
const uint8* src_v,
|
||||
uint8* dst_argb,
|
||||
struct YuvConstantsNEON* YuvConstants,
|
||||
int width) {
|
||||
asm volatile (
|
||||
YUV422TORGB_SETUP_REG
|
||||
"1: \n"
|
||||
@ -216,10 +224,10 @@ void I422ToARGBRow_NEON(const uint8* src_y,
|
||||
"+r"(src_v), // %2
|
||||
"+r"(dst_argb), // %3
|
||||
"+r"(width) // %4
|
||||
: [kUVToRB]"r"(&kUVToRB), // %5
|
||||
[kUVToG]"r"(&kUVToG), // %6
|
||||
[kUVBiasBGR]"r"(&kUVBiasBGR),
|
||||
[kYToRgb]"r"(&kYToRgb)
|
||||
: [kUVToRB]"r"(&YuvConstants->kUVToRB), // %5
|
||||
[kUVToG]"r"(&YuvConstants->kUVToG), // %6
|
||||
[kUVBiasBGR]"r"(&YuvConstants->kUVBiasBGR),
|
||||
[kYToRgb]"r"(&YuvConstants->kYToRgb)
|
||||
: "cc", "memory", "q0", "q1", "q2", "q3", "q4",
|
||||
"q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
|
||||
);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user