mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-06 16:56:55 +08:00
Add ABGRToNV21 and ABGRToNV12
Fix ARGBToUVJRow_AVX2 constants for win32 BUG=libyuv:833, libyuv:839 Change-Id: Id4731a573d40d7a9b46fcc31c2fee295483e1ff6 Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/1739509 Commit-Queue: Frank Barchard <fbarchard@chromium.org> Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
This commit is contained in:
parent
a57b724ffb
commit
9b63884a3e
@ -1,6 +1,6 @@
|
||||
Name: libyuv
|
||||
URL: http://code.google.com/p/libyuv/
|
||||
Version: 1734
|
||||
Version: 1735
|
||||
License: BSD
|
||||
License File: LICENSE
|
||||
|
||||
|
||||
@ -250,6 +250,28 @@ int ARGBToNV21(const uint8_t* src_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert ABGR To NV12.
|
||||
LIBYUV_API
|
||||
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 NV21.
|
||||
LIBYUV_API
|
||||
int ARGBToNV21(const uint8_t* src_argb,
|
||||
|
||||
@ -3375,11 +3375,11 @@ void UYVYToUV422Row_Any_MMI(const uint8_t* src_ptr,
|
||||
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_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_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_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 stride_ayuv,
|
||||
|
||||
@ -11,6 +11,6 @@
|
||||
#ifndef INCLUDE_LIBYUV_VERSION_H_
|
||||
#define INCLUDE_LIBYUV_VERSION_H_
|
||||
|
||||
#define LIBYUV_VERSION 1734
|
||||
#define LIBYUV_VERSION 1735
|
||||
|
||||
#endif // INCLUDE_LIBYUV_VERSION_H_
|
||||
|
||||
@ -572,6 +572,326 @@ int ARGBToNV21(const uint8_t* src_argb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
LIBYUV_API
|
||||
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) {
|
||||
int y;
|
||||
int halfwidth = (width + 1) >> 1;
|
||||
void (*ABGRToUVRow)(const uint8_t* src_abgr0, int src_stride_abgr,
|
||||
uint8_t* dst_u, uint8_t* dst_v, int width) =
|
||||
ABGRToUVRow_C;
|
||||
void (*ABGRToYRow)(const uint8_t* src_abgr, uint8_t* dst_y, int width) =
|
||||
ABGRToYRow_C;
|
||||
void (*MergeUVRow_)(const uint8_t* src_u, const uint8_t* src_v,
|
||||
uint8_t* dst_uv, int width) = MergeUVRow_C;
|
||||
if (!src_abgr || !dst_y || !dst_uv || width <= 0 || height == 0) {
|
||||
return -1;
|
||||
}
|
||||
// Negative height means invert the image.
|
||||
if (height < 0) {
|
||||
height = -height;
|
||||
src_abgr = src_abgr + (height - 1) * src_stride_abgr;
|
||||
src_stride_abgr = -src_stride_abgr;
|
||||
}
|
||||
#if defined(HAS_ABGRTOYROW_SSSE3) && defined(HAS_ABGRTOUVROW_SSSE3)
|
||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
||||
ABGRToUVRow = ABGRToUVRow_Any_SSSE3;
|
||||
ABGRToYRow = ABGRToYRow_Any_SSSE3;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
ABGRToUVRow = ABGRToUVRow_SSSE3;
|
||||
ABGRToYRow = ABGRToYRow_SSSE3;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOYROW_AVX2) && defined(HAS_ABGRTOUVROW_AVX2)
|
||||
if (TestCpuFlag(kCpuHasAVX2)) {
|
||||
ABGRToUVRow = ABGRToUVRow_Any_AVX2;
|
||||
ABGRToYRow = ABGRToYRow_Any_AVX2;
|
||||
if (IS_ALIGNED(width, 32)) {
|
||||
ABGRToUVRow = ABGRToUVRow_AVX2;
|
||||
ABGRToYRow = ABGRToYRow_AVX2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOYROW_NEON)
|
||||
if (TestCpuFlag(kCpuHasNEON)) {
|
||||
ABGRToYRow = ABGRToYRow_Any_NEON;
|
||||
if (IS_ALIGNED(width, 8)) {
|
||||
ABGRToYRow = ABGRToYRow_NEON;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOUVROW_NEON)
|
||||
if (TestCpuFlag(kCpuHasNEON)) {
|
||||
ABGRToUVRow = ABGRToUVRow_Any_NEON;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
ABGRToUVRow = ABGRToUVRow_NEON;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOYROW_MSA)
|
||||
if (TestCpuFlag(kCpuHasMSA)) {
|
||||
ABGRToYRow = ABGRToYRow_Any_MSA;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
ABGRToYRow = ABGRToYRow_MSA;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOUVROW_MSA)
|
||||
if (TestCpuFlag(kCpuHasMSA)) {
|
||||
ABGRToUVRow = ABGRToUVRow_Any_MSA;
|
||||
if (IS_ALIGNED(width, 32)) {
|
||||
ABGRToUVRow = ABGRToUVRow_MSA;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOYROW_MMI)
|
||||
if (TestCpuFlag(kCpuHasMMI)) {
|
||||
ABGRToYRow = ABGRToYRow_Any_MMI;
|
||||
if (IS_ALIGNED(width, 8)) {
|
||||
ABGRToYRow = ABGRToYRow_MMI;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOUVROW_MMI)
|
||||
if (TestCpuFlag(kCpuHasMMI)) {
|
||||
ABGRToUVRow = ABGRToUVRow_Any_MMI;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
ABGRToUVRow = ABGRToUVRow_MMI;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_MERGEUVROW_SSE2)
|
||||
if (TestCpuFlag(kCpuHasSSE2)) {
|
||||
MergeUVRow_ = MergeUVRow_Any_SSE2;
|
||||
if (IS_ALIGNED(halfwidth, 16)) {
|
||||
MergeUVRow_ = MergeUVRow_SSE2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_MERGEUVROW_AVX2)
|
||||
if (TestCpuFlag(kCpuHasAVX2)) {
|
||||
MergeUVRow_ = MergeUVRow_Any_AVX2;
|
||||
if (IS_ALIGNED(halfwidth, 32)) {
|
||||
MergeUVRow_ = MergeUVRow_AVX2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_MERGEUVROW_NEON)
|
||||
if (TestCpuFlag(kCpuHasNEON)) {
|
||||
MergeUVRow_ = MergeUVRow_Any_NEON;
|
||||
if (IS_ALIGNED(halfwidth, 16)) {
|
||||
MergeUVRow_ = MergeUVRow_NEON;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_MERGEUVROW_MSA)
|
||||
if (TestCpuFlag(kCpuHasMSA)) {
|
||||
MergeUVRow_ = MergeUVRow_Any_MSA;
|
||||
if (IS_ALIGNED(halfwidth, 16)) {
|
||||
MergeUVRow_ = MergeUVRow_MSA;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_MERGEUVROW_MMI)
|
||||
if (TestCpuFlag(kCpuHasMMI)) {
|
||||
MergeUVRow_ = MergeUVRow_Any_MMI;
|
||||
if (IS_ALIGNED(halfwidth, 8)) {
|
||||
MergeUVRow_ = MergeUVRow_MMI;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
{
|
||||
// Allocate a rows of uv.
|
||||
align_buffer_64(row_u, ((halfwidth + 31) & ~31) * 2);
|
||||
uint8_t* row_v = row_u + ((halfwidth + 31) & ~31);
|
||||
|
||||
for (y = 0; y < height - 1; y += 2) {
|
||||
ABGRToUVRow(src_abgr, src_stride_abgr, row_u, row_v, width);
|
||||
MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
|
||||
ABGRToYRow(src_abgr, dst_y, width);
|
||||
ABGRToYRow(src_abgr + src_stride_abgr, dst_y + dst_stride_y, width);
|
||||
src_abgr += src_stride_abgr * 2;
|
||||
dst_y += dst_stride_y * 2;
|
||||
dst_uv += dst_stride_uv;
|
||||
}
|
||||
if (height & 1) {
|
||||
ABGRToUVRow(src_abgr, 0, row_u, row_v, width);
|
||||
MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
|
||||
ABGRToYRow(src_abgr, dst_y, width);
|
||||
}
|
||||
free_aligned_buffer_64(row_u);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Same as NV12 but U and V swapped.
|
||||
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) {
|
||||
int y;
|
||||
int halfwidth = (width + 1) >> 1;
|
||||
void (*ABGRToUVRow)(const uint8_t* src_abgr0, int src_stride_abgr,
|
||||
uint8_t* dst_u, uint8_t* dst_v, int width) =
|
||||
ABGRToUVRow_C;
|
||||
void (*ABGRToYRow)(const uint8_t* src_abgr, uint8_t* dst_y, int width) =
|
||||
ABGRToYRow_C;
|
||||
void (*MergeUVRow_)(const uint8_t* src_u, const uint8_t* src_v,
|
||||
uint8_t* dst_vu, int width) = MergeUVRow_C;
|
||||
if (!src_abgr || !dst_y || !dst_vu || width <= 0 || height == 0) {
|
||||
return -1;
|
||||
}
|
||||
// Negative height means invert the image.
|
||||
if (height < 0) {
|
||||
height = -height;
|
||||
src_abgr = src_abgr + (height - 1) * src_stride_abgr;
|
||||
src_stride_abgr = -src_stride_abgr;
|
||||
}
|
||||
#if defined(HAS_ABGRTOYROW_SSSE3) && defined(HAS_ABGRTOUVROW_SSSE3)
|
||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
||||
ABGRToUVRow = ABGRToUVRow_Any_SSSE3;
|
||||
ABGRToYRow = ABGRToYRow_Any_SSSE3;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
ABGRToUVRow = ABGRToUVRow_SSSE3;
|
||||
ABGRToYRow = ABGRToYRow_SSSE3;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOYROW_AVX2) && defined(HAS_ABGRTOUVROW_AVX2)
|
||||
if (TestCpuFlag(kCpuHasAVX2)) {
|
||||
ABGRToUVRow = ABGRToUVRow_Any_AVX2;
|
||||
ABGRToYRow = ABGRToYRow_Any_AVX2;
|
||||
if (IS_ALIGNED(width, 32)) {
|
||||
ABGRToUVRow = ABGRToUVRow_AVX2;
|
||||
ABGRToYRow = ABGRToYRow_AVX2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOYROW_NEON)
|
||||
if (TestCpuFlag(kCpuHasNEON)) {
|
||||
ABGRToYRow = ABGRToYRow_Any_NEON;
|
||||
if (IS_ALIGNED(width, 8)) {
|
||||
ABGRToYRow = ABGRToYRow_NEON;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOUVROW_NEON)
|
||||
if (TestCpuFlag(kCpuHasNEON)) {
|
||||
ABGRToUVRow = ABGRToUVRow_Any_NEON;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
ABGRToUVRow = ABGRToUVRow_NEON;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOYROW_MSA)
|
||||
if (TestCpuFlag(kCpuHasMSA)) {
|
||||
ABGRToYRow = ABGRToYRow_Any_MSA;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
ABGRToYRow = ABGRToYRow_MSA;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOUVROW_MSA)
|
||||
if (TestCpuFlag(kCpuHasMSA)) {
|
||||
ABGRToUVRow = ABGRToUVRow_Any_MSA;
|
||||
if (IS_ALIGNED(width, 32)) {
|
||||
ABGRToUVRow = ABGRToUVRow_MSA;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOYROW_MMI)
|
||||
if (TestCpuFlag(kCpuHasMMI)) {
|
||||
ABGRToYRow = ABGRToYRow_Any_MMI;
|
||||
if (IS_ALIGNED(width, 8)) {
|
||||
ABGRToYRow = ABGRToYRow_MMI;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ABGRTOUVROW_MMI)
|
||||
if (TestCpuFlag(kCpuHasMMI)) {
|
||||
ABGRToUVRow = ABGRToUVRow_Any_MMI;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
ABGRToUVRow = ABGRToUVRow_MMI;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAS_MERGEUVROW_SSE2)
|
||||
if (TestCpuFlag(kCpuHasSSE2)) {
|
||||
MergeUVRow_ = MergeUVRow_Any_SSE2;
|
||||
if (IS_ALIGNED(halfwidth, 16)) {
|
||||
MergeUVRow_ = MergeUVRow_SSE2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_MERGEUVROW_AVX2)
|
||||
if (TestCpuFlag(kCpuHasAVX2)) {
|
||||
MergeUVRow_ = MergeUVRow_Any_AVX2;
|
||||
if (IS_ALIGNED(halfwidth, 32)) {
|
||||
MergeUVRow_ = MergeUVRow_AVX2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_MERGEUVROW_NEON)
|
||||
if (TestCpuFlag(kCpuHasNEON)) {
|
||||
MergeUVRow_ = MergeUVRow_Any_NEON;
|
||||
if (IS_ALIGNED(halfwidth, 16)) {
|
||||
MergeUVRow_ = MergeUVRow_NEON;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_MERGEUVROW_MSA)
|
||||
if (TestCpuFlag(kCpuHasMSA)) {
|
||||
MergeUVRow_ = MergeUVRow_Any_MSA;
|
||||
if (IS_ALIGNED(halfwidth, 16)) {
|
||||
MergeUVRow_ = MergeUVRow_MSA;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_MERGEUVROW_MMI)
|
||||
if (TestCpuFlag(kCpuHasMMI)) {
|
||||
MergeUVRow_ = MergeUVRow_Any_MMI;
|
||||
if (IS_ALIGNED(halfwidth, 8)) {
|
||||
MergeUVRow_ = MergeUVRow_MMI;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
{
|
||||
// Allocate a rows of uv.
|
||||
align_buffer_64(row_u, ((halfwidth + 31) & ~31) * 2);
|
||||
uint8_t* row_v = row_u + ((halfwidth + 31) & ~31);
|
||||
|
||||
for (y = 0; y < height - 1; y += 2) {
|
||||
ABGRToUVRow(src_abgr, src_stride_abgr, row_u, row_v, width);
|
||||
MergeUVRow_(row_v, row_u, dst_vu, halfwidth);
|
||||
ABGRToYRow(src_abgr, dst_y, width);
|
||||
ABGRToYRow(src_abgr + src_stride_abgr, dst_y + dst_stride_y, width);
|
||||
src_abgr += src_stride_abgr * 2;
|
||||
dst_y += dst_stride_y * 2;
|
||||
dst_vu += dst_stride_vu;
|
||||
}
|
||||
if (height & 1) {
|
||||
ABGRToUVRow(src_abgr, 0, row_u, row_v, width);
|
||||
MergeUVRow_(row_v, row_u, dst_vu, halfwidth);
|
||||
ABGRToYRow(src_abgr, dst_y, width);
|
||||
}
|
||||
free_aligned_buffer_64(row_u);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Convert ARGB to YUY2.
|
||||
LIBYUV_API
|
||||
int ARGBToYUY2(const uint8_t* src_argb,
|
||||
|
||||
@ -3319,6 +3319,7 @@ void AYUVToYRow_C(const uint8_t* src_ayuv, uint8_t* dst_y, int width) {
|
||||
}
|
||||
}
|
||||
|
||||
// Convert UV plane of NV12 to VU of NV21.
|
||||
void SwapUVRow_C(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
|
||||
int x;
|
||||
for (x = 0; x < width; ++x) {
|
||||
|
||||
@ -6796,9 +6796,8 @@ void NV21ToYUV24Row_AVX2(const uint8_t* src_y,
|
||||
static const uvec8 kShuffleUVToVU = {1u, 0u, 3u, 2u, 5u, 4u, 7u, 6u,
|
||||
9u, 8u, 11u, 10u, 13u, 12u, 15u, 14u};
|
||||
|
||||
void SwapUVRow_SSSE3(const uint8_t* src_uv,
|
||||
uint8_t* dst_vu,
|
||||
int width) {
|
||||
// Convert UV plane of NV12 to VU of NV21.
|
||||
void SwapUVRow_SSSE3(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
|
||||
asm volatile(
|
||||
|
||||
"movdqu %3,%%xmm5 \n"
|
||||
@ -6824,9 +6823,7 @@ void SwapUVRow_SSSE3(const uint8_t* src_uv,
|
||||
#endif // HAS_SWAPUVROW_SSSE3
|
||||
|
||||
#ifdef HAS_SWAPUVROW_AVX2
|
||||
void SwapUVRow_AVX2(const uint8_t* src_uv,
|
||||
uint8_t* dst_vu,
|
||||
int width) {
|
||||
void SwapUVRow_AVX2(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
|
||||
asm volatile(
|
||||
|
||||
"vbroadcastf128 %3,%%ymm5 \n"
|
||||
|
||||
@ -2867,7 +2867,7 @@ void AYUVToYRow_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width) {
|
||||
: "cc", "memory", "q0", "q1", "q2", "q3");
|
||||
}
|
||||
|
||||
// Convert biplanar UV channel of NV12 to NV21
|
||||
// Convert UV plane of NV12 to VU of NV21.
|
||||
void SwapUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
|
||||
asm volatile(
|
||||
"1: \n"
|
||||
|
||||
@ -2969,7 +2969,7 @@ void AYUVToYRow_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width) {
|
||||
: "cc", "memory", "v0", "v1", "v2", "v3");
|
||||
}
|
||||
|
||||
// Convert biplanar UV channel of NV12 to NV21
|
||||
// Convert UV plane of NV12 to VU of NV21.
|
||||
void SwapUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
|
||||
asm volatile(
|
||||
"1: \n"
|
||||
|
||||
@ -1594,9 +1594,9 @@ __declspec(naked) void ARGBToUVJRow_AVX2(const uint8_t* src_argb0,
|
||||
mov edx, [esp + 8 + 12] // dst_u
|
||||
mov edi, [esp + 8 + 16] // dst_v
|
||||
mov ecx, [esp + 8 + 20] // width
|
||||
vbroadcastf128 ymm5, xmmword ptr kAddUV128
|
||||
vbroadcastf128 ymm6, xmmword ptr kARGBToV
|
||||
vbroadcastf128 ymm7, xmmword ptr kARGBToU
|
||||
vbroadcastf128 ymm5, xmmword ptr kAddUVJ128
|
||||
vbroadcastf128 ymm6, xmmword ptr kARGBToVJ
|
||||
vbroadcastf128 ymm7, xmmword ptr kARGBToUJ
|
||||
sub edi, edx // stride from u to v
|
||||
|
||||
convertloop:
|
||||
|
||||
@ -37,6 +37,11 @@
|
||||
#define ARM_YUV_ERROR 0
|
||||
#endif
|
||||
|
||||
// Some functions fail on big endian. Enable these tests on all cpus except PowerPC
|
||||
#if !defined(__powerpc__)
|
||||
#define LITTLE_ENDIAN_TEST 1
|
||||
#endif
|
||||
|
||||
namespace libyuv {
|
||||
|
||||
// Alias to copy pixels as is
|
||||
@ -679,13 +684,15 @@ TESTPLANARTOB(I420, 2, 2, RAW, 3, 3, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, RGB24, 3, 3, 1)
|
||||
TESTPLANARTOB(H420, 2, 2, RAW, 3, 3, 1)
|
||||
TESTPLANARTOB(H420, 2, 2, RGB24, 3, 3, 1)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTPLANARTOB(I420, 2, 2, RGB565, 2, 2, 1)
|
||||
TESTPLANARTOB(J420, 2, 2, RGB565, 2, 2, 1)
|
||||
TESTPLANARTOB(H420, 2, 2, RGB565, 2, 2, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, ARGB1555, 2, 2, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, ARGB4444, 2, 2, 1)
|
||||
TESTPLANARTOB(I422, 2, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(I422, 2, 1, RGB565, 2, 2, 1)
|
||||
#endif
|
||||
TESTPLANARTOB(I422, 2, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(J422, 2, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(J422, 2, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(H422, 2, 1, ARGB, 4, 4, 1)
|
||||
@ -702,8 +709,10 @@ TESTPLANARTOB(I422, 2, 1, YUY2, 2, 4, 1)
|
||||
TESTPLANARTOB(I422, 2, 1, UYVY, 2, 4, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, I400, 1, 1, 1)
|
||||
TESTPLANARTOB(J420, 2, 2, J400, 1, 1, 1)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTPLANARTOB(I420, 2, 2, AR30, 4, 4, 1)
|
||||
TESTPLANARTOB(H420, 2, 2, AR30, 4, 4, 1)
|
||||
#endif
|
||||
|
||||
#define TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
|
||||
YALIGN, W1280, DIFF, N, NEG, OFF, ATTEN) \
|
||||
@ -853,7 +862,9 @@ TESTBIPLANARTOB(NV12, 2, 2, RGB24, RGB24, 3, 2)
|
||||
TESTBIPLANARTOB(NV21, 2, 2, RGB24, RGB24, 3, 2)
|
||||
TESTBIPLANARTOB(NV12, 2, 2, RAW, RAW, 3, 2)
|
||||
TESTBIPLANARTOB(NV21, 2, 2, RAW, RAW, 3, 2)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTBIPLANARTOB(NV12, 2, 2, RGB565, RGB565, 2, 9)
|
||||
#endif
|
||||
TESTBIPLANARTOB(NV21, 2, 2, YUV24, RAW, 3, 2)
|
||||
|
||||
#ifdef DO_THREE_PLANES
|
||||
@ -987,16 +998,19 @@ TESTATOPLANAR(ARGB, 4, 1, I422, 2, 1, 2)
|
||||
TESTATOPLANAR(ARGB, 4, 1, I444, 1, 1, 2)
|
||||
TESTATOPLANAR(ARGB, 4, 1, J420, 2, 2, ARM_YUV_ERROR)
|
||||
TESTATOPLANAR(ARGB, 4, 1, J422, 2, 1, ARM_YUV_ERROR)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTATOPLANAR(ARGB1555, 2, 1, I420, 2, 2, 15)
|
||||
TESTATOPLANAR(ARGB4444, 2, 1, I420, 2, 2, 17)
|
||||
#endif
|
||||
TESTATOPLANAR(BGRA, 4, 1, I420, 2, 2, 4)
|
||||
TESTATOPLANAR(I400, 1, 1, I420, 2, 2, 2)
|
||||
TESTATOPLANAR(J400, 1, 1, J420, 2, 2, 2)
|
||||
TESTATOPLANAR(RAW, 3, 1, I420, 2, 2, 4)
|
||||
TESTATOPLANAR(RGB24, 3, 1, I420, 2, 2, 4)
|
||||
// TODO(fbarchard): Investigate high error on Win32.
|
||||
TESTATOPLANAR(RGB24, 3, 1, J420, 2, 2, 10)
|
||||
TESTATOPLANAR(RGB24, 3, 1, J420, 2, 2, ARM_YUV_ERROR)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTATOPLANAR(RGB565, 2, 1, I420, 2, 2, 5)
|
||||
#endif
|
||||
TESTATOPLANAR(RGBA, 4, 1, I420, 2, 2, 4)
|
||||
TESTATOPLANAR(UYVY, 2, 1, I420, 2, 2, 2)
|
||||
TESTATOPLANAR(UYVY, 2, 1, I422, 2, 1, 2)
|
||||
@ -1073,6 +1087,8 @@ TESTATOPLANAR(YUY2, 2, 1, I422, 2, 1, 2)
|
||||
|
||||
TESTATOBIPLANAR(ARGB, 1, 4, NV12, 2, 2)
|
||||
TESTATOBIPLANAR(ARGB, 1, 4, NV21, 2, 2)
|
||||
TESTATOBIPLANAR(ABGR, 1, 4, NV12, 2, 2)
|
||||
TESTATOBIPLANAR(ABGR, 1, 4, NV21, 2, 2)
|
||||
TESTATOBIPLANAR(YUY2, 2, 4, NV12, 2, 2)
|
||||
TESTATOBIPLANAR(UYVY, 2, 4, NV12, 2, 2)
|
||||
TESTATOBIPLANAR(AYUV, 1, 4, NV12, 2, 2)
|
||||
@ -1170,14 +1186,22 @@ TESTATOBIPLANAR(AYUV, 1, 4, NV21, 2, 2)
|
||||
// TODO(fbarchard): make ARM version of C code that matches NEON.
|
||||
TESTATOB(AB30, 4, 4, 1, ABGR, 4, 4, 1, 0)
|
||||
TESTATOB(AB30, 4, 4, 1, ARGB, 4, 4, 1, 0)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTATOB(ABGR, 4, 4, 1, AR30, 4, 4, 1, 0)
|
||||
#endif
|
||||
TESTATOB(ABGR, 4, 4, 1, ARGB, 4, 4, 1, 0)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTATOB(AR30, 4, 4, 1, AB30, 4, 4, 1, 0)
|
||||
#endif
|
||||
TESTATOB(AR30, 4, 4, 1, ABGR, 4, 4, 1, 0)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTATOB(AR30, 4, 4, 1, AR30, 4, 4, 1, 0)
|
||||
TESTATOB(AR30, 4, 4, 1, ARGB, 4, 4, 1, 0)
|
||||
#endif
|
||||
TESTATOB(ARGB, 4, 4, 1, ABGR, 4, 4, 1, 0)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTATOB(ARGB, 4, 4, 1, AR30, 4, 4, 1, 0)
|
||||
#endif
|
||||
TESTATOB(ARGB, 4, 4, 1, ARGB, 4, 4, 1, 0)
|
||||
TESTATOB(ARGB, 4, 4, 1, ARGB1555, 2, 2, 1, 0)
|
||||
TESTATOB(ARGB, 4, 4, 1, ARGB4444, 2, 2, 1, 0)
|
||||
@ -1187,7 +1211,9 @@ TESTATOB(ARGB, 4, 4, 1, I400, 1, 1, 1, 2)
|
||||
TESTATOB(ARGB, 4, 4, 1, J400, 1, 1, 1, 2)
|
||||
TESTATOB(ARGB, 4, 4, 1, RAW, 3, 3, 1, 0)
|
||||
TESTATOB(ARGB, 4, 4, 1, RGB24, 3, 3, 1, 0)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTATOB(ARGB, 4, 4, 1, RGB565, 2, 2, 1, 0)
|
||||
#endif
|
||||
TESTATOB(ARGB, 4, 4, 1, RGBA, 4, 4, 1, 0)
|
||||
TESTATOB(ARGB, 4, 4, 1, UYVY, 2, 4, 1, 4)
|
||||
TESTATOB(ARGB, 4, 4, 1, YUY2, 2, 4, 1, 4)
|
||||
@ -1203,7 +1229,9 @@ TESTATOB(RAW, 3, 3, 1, ARGB, 4, 4, 1, 0)
|
||||
TESTATOB(RAW, 3, 3, 1, RGB24, 3, 3, 1, 0)
|
||||
TESTATOB(RGB24, 3, 3, 1, ARGB, 4, 4, 1, 0)
|
||||
TESTATOB(RGB24, 3, 3, 1, J400, 1, 1, 1, 0)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTATOB(RGB565, 2, 2, 1, ARGB, 4, 4, 1, 0)
|
||||
#endif
|
||||
TESTATOB(RGBA, 4, 4, 1, ARGB, 4, 4, 1, 0)
|
||||
TESTATOB(UYVY, 2, 4, 1, ARGB, 4, 4, 1, ARM_YUV_ERROR)
|
||||
TESTATOB(YUY2, 2, 4, 1, ARGB, 4, 4, 1, ARM_YUV_ERROR)
|
||||
@ -1304,7 +1332,9 @@ TESTATOB(YUY2, 2, 4, 1, Y, 1, 1, 1, 0)
|
||||
TESTATOBDRANDOM(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
|
||||
HEIGHT_B, DIFF)
|
||||
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTATOBD(ARGB, 4, 4, 1, RGB565, 2, 2, 1, 0)
|
||||
#endif
|
||||
|
||||
#define TESTSYMI(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A, W1280, N, NEG, OFF) \
|
||||
TEST_F(LibYUVConvertTest, FMT_ATOB##_Symetric##N) { \
|
||||
@ -2401,8 +2431,9 @@ TEST_F(LibYUVConvertTest, TestDither) {
|
||||
TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
|
||||
YALIGN, benchmark_width_, DIFF, _Opt, +, 0, FMT_C, BPP_C)
|
||||
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTPLANARTOBD(I420, 2, 2, RGB565, 2, 2, 1, 9, ARGB, 4)
|
||||
|
||||
#endif
|
||||
#define TESTPTOB(NAME, UYVYTOI420, UYVYTONV12) \
|
||||
TEST_F(LibYUVConvertTest, NAME) { \
|
||||
const int kWidth = benchmark_width_; \
|
||||
@ -2542,10 +2573,12 @@ TESTPLANARTOE(H420, 2, 2, RAW, 1, 3, RGB24, 3)
|
||||
TESTPLANARTOE(H420, 2, 2, RGB24, 1, 3, RAW, 3)
|
||||
TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, RAW, 3)
|
||||
TESTPLANARTOE(H420, 2, 2, RAW, 1, 3, ARGB, 4)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB565, 2)
|
||||
TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB1555, 2)
|
||||
TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB4444, 2)
|
||||
TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, RGB565, 2)
|
||||
#endif
|
||||
TESTPLANARTOE(J422, 2, 1, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(J422, 2, 1, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(H422, 2, 1, ARGB, 1, 4, ARGB, 4)
|
||||
@ -2679,6 +2712,7 @@ TESTQPLANARTOE(I420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
|
||||
_Opt, +, 0, FMT_C, BPP_C)
|
||||
|
||||
// Caveat: Destination needs to be 4 bytes
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTPLANETOE(ARGB, 1, 4, AR30, 1, 4, ARGB, 4)
|
||||
TESTPLANETOE(ABGR, 1, 4, AR30, 1, 4, ABGR, 4)
|
||||
TESTPLANETOE(AR30, 1, 4, ARGB, 1, 4, ABGR, 4)
|
||||
@ -2687,6 +2721,7 @@ TESTPLANETOE(ARGB, 1, 4, AB30, 1, 4, ARGB, 4)
|
||||
TESTPLANETOE(ABGR, 1, 4, AB30, 1, 4, ABGR, 4)
|
||||
TESTPLANETOE(AB30, 1, 4, ARGB, 1, 4, ABGR, 4)
|
||||
TESTPLANETOE(AB30, 1, 4, ABGR, 1, 4, ARGB, 4)
|
||||
#endif
|
||||
|
||||
TEST_F(LibYUVConvertTest, RotateWithARGBSource) {
|
||||
// 2x2 frames
|
||||
@ -2858,12 +2893,16 @@ TEST_F(LibYUVConvertTest, ABGRToAR30Row_Opt) {
|
||||
|
||||
TESTPLANAR16TOB(I010, 2, 2, ARGB, 4, 4, 1, 2)
|
||||
TESTPLANAR16TOB(I010, 2, 2, ABGR, 4, 4, 1, 2)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTPLANAR16TOB(I010, 2, 2, AR30, 4, 4, 1, 2)
|
||||
TESTPLANAR16TOB(I010, 2, 2, AB30, 4, 4, 1, 2)
|
||||
#endif
|
||||
TESTPLANAR16TOB(H010, 2, 2, ARGB, 4, 4, 1, 2)
|
||||
TESTPLANAR16TOB(H010, 2, 2, ABGR, 4, 4, 1, 2)
|
||||
#ifdef LITTLE_ENDIAN_TEST
|
||||
TESTPLANAR16TOB(H010, 2, 2, AR30, 4, 4, 1, 2)
|
||||
TESTPLANAR16TOB(H010, 2, 2, AB30, 4, 4, 1, 2)
|
||||
#endif
|
||||
|
||||
static int Clamp(int y) {
|
||||
if (y < 0) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user