mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-07 01:06:46 +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
|
Name: libyuv
|
||||||
URL: http://code.google.com/p/libyuv/
|
URL: http://code.google.com/p/libyuv/
|
||||||
Version: 1734
|
Version: 1735
|
||||||
License: BSD
|
License: BSD
|
||||||
License File: LICENSE
|
License File: LICENSE
|
||||||
|
|
||||||
|
|||||||
@ -250,6 +250,28 @@ int ARGBToNV21(const uint8_t* src_argb,
|
|||||||
int width,
|
int width,
|
||||||
int height);
|
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.
|
// Convert ARGB To NV21.
|
||||||
LIBYUV_API
|
LIBYUV_API
|
||||||
int ARGBToNV21(const uint8_t* src_argb,
|
int ARGBToNV21(const uint8_t* src_argb,
|
||||||
|
|||||||
@ -3375,11 +3375,11 @@ void UYVYToUV422Row_Any_MMI(const uint8_t* src_ptr,
|
|||||||
int width);
|
int width);
|
||||||
void SwapUVRow_C(const uint8_t* src_uv, uint8_t* dst_vu, 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_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_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_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 AYUVToYRow_C(const uint8_t* src_ayuv, uint8_t* dst_y, int width);
|
||||||
void AYUVToUVRow_C(const uint8_t* src_ayuv,
|
void AYUVToUVRow_C(const uint8_t* src_ayuv,
|
||||||
int stride_ayuv,
|
int stride_ayuv,
|
||||||
|
|||||||
@ -11,6 +11,6 @@
|
|||||||
#ifndef INCLUDE_LIBYUV_VERSION_H_
|
#ifndef INCLUDE_LIBYUV_VERSION_H_
|
||||||
#define INCLUDE_LIBYUV_VERSION_H_
|
#define INCLUDE_LIBYUV_VERSION_H_
|
||||||
|
|
||||||
#define LIBYUV_VERSION 1734
|
#define LIBYUV_VERSION 1735
|
||||||
|
|
||||||
#endif // INCLUDE_LIBYUV_VERSION_H_
|
#endif // INCLUDE_LIBYUV_VERSION_H_
|
||||||
|
|||||||
@ -572,6 +572,326 @@ int ARGBToNV21(const uint8_t* src_argb,
|
|||||||
return 0;
|
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.
|
// Convert ARGB to YUY2.
|
||||||
LIBYUV_API
|
LIBYUV_API
|
||||||
int ARGBToYUY2(const uint8_t* src_argb,
|
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) {
|
void SwapUVRow_C(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
|
||||||
int x;
|
int x;
|
||||||
for (x = 0; x < width; ++x) {
|
for (x = 0; x < width; ++x) {
|
||||||
|
|||||||
@ -6793,12 +6793,11 @@ void NV21ToYUV24Row_AVX2(const uint8_t* src_y,
|
|||||||
#ifdef HAS_SWAPUVROW_SSSE3
|
#ifdef HAS_SWAPUVROW_SSSE3
|
||||||
|
|
||||||
// Shuffle table for reversing the bytes.
|
// Shuffle table for reversing the bytes.
|
||||||
static const uvec8 kShuffleUVToVU = {1u, 0u, 3u, 2u, 5u, 4u, 7u, 6u,
|
static const uvec8 kShuffleUVToVU = {1u, 0u, 3u, 2u, 5u, 4u, 7u, 6u,
|
||||||
9u, 8u, 11u, 10u, 13u, 12u, 15u, 14u};
|
9u, 8u, 11u, 10u, 13u, 12u, 15u, 14u};
|
||||||
|
|
||||||
void SwapUVRow_SSSE3(const uint8_t* src_uv,
|
// Convert UV plane of NV12 to VU of NV21.
|
||||||
uint8_t* dst_vu,
|
void SwapUVRow_SSSE3(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
|
||||||
int width) {
|
|
||||||
asm volatile(
|
asm volatile(
|
||||||
|
|
||||||
"movdqu %3,%%xmm5 \n"
|
"movdqu %3,%%xmm5 \n"
|
||||||
@ -6815,18 +6814,16 @@ void SwapUVRow_SSSE3(const uint8_t* src_uv,
|
|||||||
"lea 0x20(%1),%1 \n"
|
"lea 0x20(%1),%1 \n"
|
||||||
"sub $0x10,%2 \n"
|
"sub $0x10,%2 \n"
|
||||||
"jg 1b \n"
|
"jg 1b \n"
|
||||||
: "+r"(src_uv), // %0
|
: "+r"(src_uv), // %0
|
||||||
"+r"(dst_vu), // %1
|
"+r"(dst_vu), // %1
|
||||||
"+r"(width) // %2
|
"+r"(width) // %2
|
||||||
: "m"(kShuffleUVToVU) // %3
|
: "m"(kShuffleUVToVU) // %3
|
||||||
: "memory", "cc", "xmm0", "xmm1", "xmm5");
|
: "memory", "cc", "xmm0", "xmm1", "xmm5");
|
||||||
}
|
}
|
||||||
#endif // HAS_SWAPUVROW_SSSE3
|
#endif // HAS_SWAPUVROW_SSSE3
|
||||||
|
|
||||||
#ifdef HAS_SWAPUVROW_AVX2
|
#ifdef HAS_SWAPUVROW_AVX2
|
||||||
void SwapUVRow_AVX2(const uint8_t* src_uv,
|
void SwapUVRow_AVX2(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
|
||||||
uint8_t* dst_vu,
|
|
||||||
int width) {
|
|
||||||
asm volatile(
|
asm volatile(
|
||||||
|
|
||||||
"vbroadcastf128 %3,%%ymm5 \n"
|
"vbroadcastf128 %3,%%ymm5 \n"
|
||||||
@ -6844,10 +6841,10 @@ void SwapUVRow_AVX2(const uint8_t* src_uv,
|
|||||||
"sub $0x20,%2 \n"
|
"sub $0x20,%2 \n"
|
||||||
"jg 1b \n"
|
"jg 1b \n"
|
||||||
"vzeroupper \n"
|
"vzeroupper \n"
|
||||||
: "+r"(src_uv), // %0
|
: "+r"(src_uv), // %0
|
||||||
"+r"(dst_vu), // %1
|
"+r"(dst_vu), // %1
|
||||||
"+r"(width) // %2
|
"+r"(width) // %2
|
||||||
: "m"(kShuffleUVToVU) // %3
|
: "m"(kShuffleUVToVU) // %3
|
||||||
: "memory", "cc", "xmm0", "xmm1", "xmm5");
|
: "memory", "cc", "xmm0", "xmm1", "xmm5");
|
||||||
}
|
}
|
||||||
#endif // HAS_SWAPUVROW_AVX2
|
#endif // HAS_SWAPUVROW_AVX2
|
||||||
|
|||||||
@ -2867,7 +2867,7 @@ void AYUVToYRow_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width) {
|
|||||||
: "cc", "memory", "q0", "q1", "q2", "q3");
|
: "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) {
|
void SwapUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"1: \n"
|
"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");
|
: "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) {
|
void SwapUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"1: \n"
|
"1: \n"
|
||||||
|
|||||||
@ -1594,9 +1594,9 @@ __declspec(naked) void ARGBToUVJRow_AVX2(const uint8_t* src_argb0,
|
|||||||
mov edx, [esp + 8 + 12] // dst_u
|
mov edx, [esp + 8 + 12] // dst_u
|
||||||
mov edi, [esp + 8 + 16] // dst_v
|
mov edi, [esp + 8 + 16] // dst_v
|
||||||
mov ecx, [esp + 8 + 20] // width
|
mov ecx, [esp + 8 + 20] // width
|
||||||
vbroadcastf128 ymm5, xmmword ptr kAddUV128
|
vbroadcastf128 ymm5, xmmword ptr kAddUVJ128
|
||||||
vbroadcastf128 ymm6, xmmword ptr kARGBToV
|
vbroadcastf128 ymm6, xmmword ptr kARGBToVJ
|
||||||
vbroadcastf128 ymm7, xmmword ptr kARGBToU
|
vbroadcastf128 ymm7, xmmword ptr kARGBToUJ
|
||||||
sub edi, edx // stride from u to v
|
sub edi, edx // stride from u to v
|
||||||
|
|
||||||
convertloop:
|
convertloop:
|
||||||
|
|||||||
@ -37,6 +37,11 @@
|
|||||||
#define ARM_YUV_ERROR 0
|
#define ARM_YUV_ERROR 0
|
||||||
#endif
|
#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 {
|
namespace libyuv {
|
||||||
|
|
||||||
// Alias to copy pixels as is
|
// Alias to copy pixels as is
|
||||||
@ -395,82 +400,82 @@ TESTPLANARTOBP(I422, 2, 1, NV21, 2, 2)
|
|||||||
TESTPLANARTOBP(I444, 1, 1, NV21, 2, 2)
|
TESTPLANARTOBP(I444, 1, 1, NV21, 2, 2)
|
||||||
TESTPLANARTOBP(I400, 2, 2, NV21, 2, 2)
|
TESTPLANARTOBP(I400, 2, 2, NV21, 2, 2)
|
||||||
|
|
||||||
#define TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
|
#define TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
|
||||||
FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, W1280, N, NEG, \
|
FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, W1280, N, NEG, \
|
||||||
OFF, DOY) \
|
OFF, DOY) \
|
||||||
TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \
|
TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \
|
||||||
const int kWidth = ((W1280) > 0) ? (W1280) : 1; \
|
const int kWidth = ((W1280) > 0) ? (W1280) : 1; \
|
||||||
const int kHeight = benchmark_height_; \
|
const int kHeight = benchmark_height_; \
|
||||||
align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
|
align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
|
||||||
align_buffer_page_end(src_uv, 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \
|
align_buffer_page_end(src_uv, 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \
|
||||||
SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \
|
||||||
OFF); \
|
OFF); \
|
||||||
align_buffer_page_end(dst_y_c, kWidth* kHeight); \
|
align_buffer_page_end(dst_y_c, kWidth* kHeight); \
|
||||||
align_buffer_page_end(dst_uv_c, 2 * SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
align_buffer_page_end(dst_uv_c, 2 * SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
||||||
SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
||||||
align_buffer_page_end(dst_y_opt, kWidth* kHeight); \
|
align_buffer_page_end(dst_y_opt, kWidth* kHeight); \
|
||||||
align_buffer_page_end(dst_uv_opt, 2 * SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
align_buffer_page_end(dst_uv_opt, 2 * SUBSAMPLE(kWidth, SUBSAMP_X) * \
|
||||||
SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
||||||
for (int i = 0; i < kHeight; ++i) \
|
for (int i = 0; i < kHeight; ++i) \
|
||||||
for (int j = 0; j < kWidth; ++j) \
|
for (int j = 0; j < kWidth; ++j) \
|
||||||
src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \
|
src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \
|
||||||
for (int i = 0; i < SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); ++i) { \
|
for (int i = 0; i < SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); ++i) { \
|
||||||
for (int j = 0; j < 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X); ++j) { \
|
for (int j = 0; j < 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X); ++j) { \
|
||||||
src_uv[(i * 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \
|
src_uv[(i * 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \
|
||||||
(fastrand() & 0xff); \
|
(fastrand() & 0xff); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
memset(dst_y_c, 1, kWidth* kHeight); \
|
memset(dst_y_c, 1, kWidth* kHeight); \
|
||||||
memset(dst_uv_c, 2, \
|
memset(dst_uv_c, 2, \
|
||||||
2 * SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
2 * SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
||||||
memset(dst_y_opt, 101, kWidth* kHeight); \
|
memset(dst_y_opt, 101, kWidth* kHeight); \
|
||||||
memset(dst_uv_opt, 102, \
|
memset(dst_uv_opt, 102, \
|
||||||
2 * SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
2 * SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \
|
||||||
MaskCpuFlags(disable_cpu_flags_); \
|
MaskCpuFlags(disable_cpu_flags_); \
|
||||||
SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
||||||
src_y + OFF, kWidth, src_uv + OFF, \
|
src_y + OFF, kWidth, src_uv + OFF, \
|
||||||
2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X), DOY ? dst_y_c : NULL, kWidth, \
|
2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X), DOY ? dst_y_c : NULL, kWidth, \
|
||||||
dst_uv_c, 2 * SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, NEG kHeight); \
|
dst_uv_c, 2 * SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, NEG kHeight); \
|
||||||
MaskCpuFlags(benchmark_cpu_info_); \
|
MaskCpuFlags(benchmark_cpu_info_); \
|
||||||
for (int i = 0; i < benchmark_iterations_; ++i) { \
|
for (int i = 0; i < benchmark_iterations_; ++i) { \
|
||||||
SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
SRC_FMT_PLANAR##To##FMT_PLANAR( \
|
||||||
src_y + OFF, kWidth, src_uv + OFF, \
|
src_y + OFF, kWidth, src_uv + OFF, \
|
||||||
2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X), DOY ? dst_y_opt : NULL, \
|
2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X), DOY ? dst_y_opt : NULL, \
|
||||||
kWidth, dst_uv_opt, 2 * SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, \
|
kWidth, dst_uv_opt, 2 * SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, \
|
||||||
NEG kHeight); \
|
NEG kHeight); \
|
||||||
} \
|
} \
|
||||||
int max_diff = 0; \
|
int max_diff = 0; \
|
||||||
if (DOY) { \
|
if (DOY) { \
|
||||||
for (int i = 0; i < kHeight; ++i) { \
|
for (int i = 0; i < kHeight; ++i) { \
|
||||||
for (int j = 0; j < kWidth; ++j) { \
|
for (int j = 0; j < kWidth; ++j) { \
|
||||||
int abs_diff = abs(static_cast<int>(dst_y_c[i * kWidth + j]) - \
|
int abs_diff = abs(static_cast<int>(dst_y_c[i * kWidth + j]) - \
|
||||||
static_cast<int>(dst_y_opt[i * kWidth + j])); \
|
static_cast<int>(dst_y_opt[i * kWidth + j])); \
|
||||||
if (abs_diff > max_diff) { \
|
if (abs_diff > max_diff) { \
|
||||||
max_diff = abs_diff; \
|
max_diff = abs_diff; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
EXPECT_LE(max_diff, 1); \
|
EXPECT_LE(max_diff, 1); \
|
||||||
} \
|
} \
|
||||||
for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \
|
for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \
|
||||||
for (int j = 0; j < 2 * SUBSAMPLE(kWidth, SUBSAMP_X); ++j) { \
|
for (int j = 0; j < 2 * SUBSAMPLE(kWidth, SUBSAMP_X); ++j) { \
|
||||||
int abs_diff = \
|
int abs_diff = \
|
||||||
abs(static_cast<int>( \
|
abs(static_cast<int>( \
|
||||||
dst_uv_c[i * 2 * SUBSAMPLE(kWidth, SUBSAMP_X) + j]) - \
|
dst_uv_c[i * 2 * SUBSAMPLE(kWidth, SUBSAMP_X) + j]) - \
|
||||||
static_cast<int>( \
|
static_cast<int>( \
|
||||||
dst_uv_opt[i * 2 * SUBSAMPLE(kWidth, SUBSAMP_X) + j])); \
|
dst_uv_opt[i * 2 * SUBSAMPLE(kWidth, SUBSAMP_X) + j])); \
|
||||||
if (abs_diff > max_diff) { \
|
if (abs_diff > max_diff) { \
|
||||||
max_diff = abs_diff; \
|
max_diff = abs_diff; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
EXPECT_LE(max_diff, 1); \
|
EXPECT_LE(max_diff, 1); \
|
||||||
free_aligned_buffer_page_end(dst_y_c); \
|
free_aligned_buffer_page_end(dst_y_c); \
|
||||||
free_aligned_buffer_page_end(dst_uv_c); \
|
free_aligned_buffer_page_end(dst_uv_c); \
|
||||||
free_aligned_buffer_page_end(dst_y_opt); \
|
free_aligned_buffer_page_end(dst_y_opt); \
|
||||||
free_aligned_buffer_page_end(dst_uv_opt); \
|
free_aligned_buffer_page_end(dst_uv_opt); \
|
||||||
free_aligned_buffer_page_end(src_y); \
|
free_aligned_buffer_page_end(src_y); \
|
||||||
free_aligned_buffer_page_end(src_uv); \
|
free_aligned_buffer_page_end(src_uv); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TESTBIPLANARTOBP(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
|
#define TESTBIPLANARTOBP(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
|
||||||
@ -679,13 +684,15 @@ TESTPLANARTOB(I420, 2, 2, RAW, 3, 3, 1)
|
|||||||
TESTPLANARTOB(I420, 2, 2, RGB24, 3, 3, 1)
|
TESTPLANARTOB(I420, 2, 2, RGB24, 3, 3, 1)
|
||||||
TESTPLANARTOB(H420, 2, 2, RAW, 3, 3, 1)
|
TESTPLANARTOB(H420, 2, 2, RAW, 3, 3, 1)
|
||||||
TESTPLANARTOB(H420, 2, 2, RGB24, 3, 3, 1)
|
TESTPLANARTOB(H420, 2, 2, RGB24, 3, 3, 1)
|
||||||
|
#ifdef LITTLE_ENDIAN_TEST
|
||||||
TESTPLANARTOB(I420, 2, 2, RGB565, 2, 2, 1)
|
TESTPLANARTOB(I420, 2, 2, RGB565, 2, 2, 1)
|
||||||
TESTPLANARTOB(J420, 2, 2, RGB565, 2, 2, 1)
|
TESTPLANARTOB(J420, 2, 2, RGB565, 2, 2, 1)
|
||||||
TESTPLANARTOB(H420, 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, ARGB1555, 2, 2, 1)
|
||||||
TESTPLANARTOB(I420, 2, 2, ARGB4444, 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)
|
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, ARGB, 4, 4, 1)
|
||||||
TESTPLANARTOB(J422, 2, 1, ABGR, 4, 4, 1)
|
TESTPLANARTOB(J422, 2, 1, ABGR, 4, 4, 1)
|
||||||
TESTPLANARTOB(H422, 2, 1, ARGB, 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(I422, 2, 1, UYVY, 2, 4, 1)
|
||||||
TESTPLANARTOB(I420, 2, 2, I400, 1, 1, 1)
|
TESTPLANARTOB(I420, 2, 2, I400, 1, 1, 1)
|
||||||
TESTPLANARTOB(J420, 2, 2, J400, 1, 1, 1)
|
TESTPLANARTOB(J420, 2, 2, J400, 1, 1, 1)
|
||||||
|
#ifdef LITTLE_ENDIAN_TEST
|
||||||
TESTPLANARTOB(I420, 2, 2, AR30, 4, 4, 1)
|
TESTPLANARTOB(I420, 2, 2, AR30, 4, 4, 1)
|
||||||
TESTPLANARTOB(H420, 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, \
|
#define TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
|
||||||
YALIGN, W1280, DIFF, N, NEG, OFF, ATTEN) \
|
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(NV21, 2, 2, RGB24, RGB24, 3, 2)
|
||||||
TESTBIPLANARTOB(NV12, 2, 2, RAW, RAW, 3, 2)
|
TESTBIPLANARTOB(NV12, 2, 2, RAW, RAW, 3, 2)
|
||||||
TESTBIPLANARTOB(NV21, 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)
|
TESTBIPLANARTOB(NV12, 2, 2, RGB565, RGB565, 2, 9)
|
||||||
|
#endif
|
||||||
TESTBIPLANARTOB(NV21, 2, 2, YUV24, RAW, 3, 2)
|
TESTBIPLANARTOB(NV21, 2, 2, YUV24, RAW, 3, 2)
|
||||||
|
|
||||||
#ifdef DO_THREE_PLANES
|
#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, I444, 1, 1, 2)
|
||||||
TESTATOPLANAR(ARGB, 4, 1, J420, 2, 2, ARM_YUV_ERROR)
|
TESTATOPLANAR(ARGB, 4, 1, J420, 2, 2, ARM_YUV_ERROR)
|
||||||
TESTATOPLANAR(ARGB, 4, 1, J422, 2, 1, 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(ARGB1555, 2, 1, I420, 2, 2, 15)
|
||||||
TESTATOPLANAR(ARGB4444, 2, 1, I420, 2, 2, 17)
|
TESTATOPLANAR(ARGB4444, 2, 1, I420, 2, 2, 17)
|
||||||
|
#endif
|
||||||
TESTATOPLANAR(BGRA, 4, 1, I420, 2, 2, 4)
|
TESTATOPLANAR(BGRA, 4, 1, I420, 2, 2, 4)
|
||||||
TESTATOPLANAR(I400, 1, 1, I420, 2, 2, 2)
|
TESTATOPLANAR(I400, 1, 1, I420, 2, 2, 2)
|
||||||
TESTATOPLANAR(J400, 1, 1, J420, 2, 2, 2)
|
TESTATOPLANAR(J400, 1, 1, J420, 2, 2, 2)
|
||||||
TESTATOPLANAR(RAW, 3, 1, I420, 2, 2, 4)
|
TESTATOPLANAR(RAW, 3, 1, I420, 2, 2, 4)
|
||||||
TESTATOPLANAR(RGB24, 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, ARM_YUV_ERROR)
|
||||||
TESTATOPLANAR(RGB24, 3, 1, J420, 2, 2, 10)
|
#ifdef LITTLE_ENDIAN_TEST
|
||||||
TESTATOPLANAR(RGB565, 2, 1, I420, 2, 2, 5)
|
TESTATOPLANAR(RGB565, 2, 1, I420, 2, 2, 5)
|
||||||
|
#endif
|
||||||
TESTATOPLANAR(RGBA, 4, 1, I420, 2, 2, 4)
|
TESTATOPLANAR(RGBA, 4, 1, I420, 2, 2, 4)
|
||||||
TESTATOPLANAR(UYVY, 2, 1, I420, 2, 2, 2)
|
TESTATOPLANAR(UYVY, 2, 1, I420, 2, 2, 2)
|
||||||
TESTATOPLANAR(UYVY, 2, 1, I422, 2, 1, 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, NV12, 2, 2)
|
||||||
TESTATOBIPLANAR(ARGB, 1, 4, NV21, 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(YUY2, 2, 4, NV12, 2, 2)
|
||||||
TESTATOBIPLANAR(UYVY, 2, 4, NV12, 2, 2)
|
TESTATOBIPLANAR(UYVY, 2, 4, NV12, 2, 2)
|
||||||
TESTATOBIPLANAR(AYUV, 1, 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.
|
// 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, ABGR, 4, 4, 1, 0)
|
||||||
TESTATOB(AB30, 4, 4, 1, ARGB, 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)
|
TESTATOB(ABGR, 4, 4, 1, AR30, 4, 4, 1, 0)
|
||||||
|
#endif
|
||||||
TESTATOB(ABGR, 4, 4, 1, ARGB, 4, 4, 1, 0)
|
TESTATOB(ABGR, 4, 4, 1, ARGB, 4, 4, 1, 0)
|
||||||
|
#ifdef LITTLE_ENDIAN_TEST
|
||||||
TESTATOB(AR30, 4, 4, 1, AB30, 4, 4, 1, 0)
|
TESTATOB(AR30, 4, 4, 1, AB30, 4, 4, 1, 0)
|
||||||
|
#endif
|
||||||
TESTATOB(AR30, 4, 4, 1, ABGR, 4, 4, 1, 0)
|
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, AR30, 4, 4, 1, 0)
|
||||||
TESTATOB(AR30, 4, 4, 1, ARGB, 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)
|
TESTATOB(ARGB, 4, 4, 1, ABGR, 4, 4, 1, 0)
|
||||||
|
#ifdef LITTLE_ENDIAN_TEST
|
||||||
TESTATOB(ARGB, 4, 4, 1, AR30, 4, 4, 1, 0)
|
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, ARGB, 4, 4, 1, 0)
|
||||||
TESTATOB(ARGB, 4, 4, 1, ARGB1555, 2, 2, 1, 0)
|
TESTATOB(ARGB, 4, 4, 1, ARGB1555, 2, 2, 1, 0)
|
||||||
TESTATOB(ARGB, 4, 4, 1, ARGB4444, 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, J400, 1, 1, 1, 2)
|
||||||
TESTATOB(ARGB, 4, 4, 1, RAW, 3, 3, 1, 0)
|
TESTATOB(ARGB, 4, 4, 1, RAW, 3, 3, 1, 0)
|
||||||
TESTATOB(ARGB, 4, 4, 1, RGB24, 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)
|
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, RGBA, 4, 4, 1, 0)
|
||||||
TESTATOB(ARGB, 4, 4, 1, UYVY, 2, 4, 1, 4)
|
TESTATOB(ARGB, 4, 4, 1, UYVY, 2, 4, 1, 4)
|
||||||
TESTATOB(ARGB, 4, 4, 1, YUY2, 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(RAW, 3, 3, 1, RGB24, 3, 3, 1, 0)
|
||||||
TESTATOB(RGB24, 3, 3, 1, ARGB, 4, 4, 1, 0)
|
TESTATOB(RGB24, 3, 3, 1, ARGB, 4, 4, 1, 0)
|
||||||
TESTATOB(RGB24, 3, 3, 1, J400, 1, 1, 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)
|
TESTATOB(RGB565, 2, 2, 1, ARGB, 4, 4, 1, 0)
|
||||||
|
#endif
|
||||||
TESTATOB(RGBA, 4, 4, 1, ARGB, 4, 4, 1, 0)
|
TESTATOB(RGBA, 4, 4, 1, ARGB, 4, 4, 1, 0)
|
||||||
TESTATOB(UYVY, 2, 4, 1, ARGB, 4, 4, 1, ARM_YUV_ERROR)
|
TESTATOB(UYVY, 2, 4, 1, ARGB, 4, 4, 1, ARM_YUV_ERROR)
|
||||||
TESTATOB(YUY2, 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, \
|
TESTATOBDRANDOM(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
|
||||||
HEIGHT_B, DIFF)
|
HEIGHT_B, DIFF)
|
||||||
|
|
||||||
|
#ifdef LITTLE_ENDIAN_TEST
|
||||||
TESTATOBD(ARGB, 4, 4, 1, RGB565, 2, 2, 1, 0)
|
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) \
|
#define TESTSYMI(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A, W1280, N, NEG, OFF) \
|
||||||
TEST_F(LibYUVConvertTest, FMT_ATOB##_Symetric##N) { \
|
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, \
|
TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
|
||||||
YALIGN, benchmark_width_, DIFF, _Opt, +, 0, FMT_C, BPP_C)
|
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)
|
TESTPLANARTOBD(I420, 2, 2, RGB565, 2, 2, 1, 9, ARGB, 4)
|
||||||
|
#endif
|
||||||
#define TESTPTOB(NAME, UYVYTOI420, UYVYTONV12) \
|
#define TESTPTOB(NAME, UYVYTOI420, UYVYTONV12) \
|
||||||
TEST_F(LibYUVConvertTest, NAME) { \
|
TEST_F(LibYUVConvertTest, NAME) { \
|
||||||
const int kWidth = benchmark_width_; \
|
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, RGB24, 1, 3, RAW, 3)
|
||||||
TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, RAW, 3)
|
TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, RAW, 3)
|
||||||
TESTPLANARTOE(H420, 2, 2, RAW, 1, 3, ARGB, 4)
|
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, RGB565, 2)
|
||||||
TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB1555, 2)
|
TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB1555, 2)
|
||||||
TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB4444, 2)
|
TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB4444, 2)
|
||||||
TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, RGB565, 2)
|
TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, RGB565, 2)
|
||||||
|
#endif
|
||||||
TESTPLANARTOE(J422, 2, 1, ARGB, 1, 4, ARGB, 4)
|
TESTPLANARTOE(J422, 2, 1, ARGB, 1, 4, ARGB, 4)
|
||||||
TESTPLANARTOE(J422, 2, 1, ABGR, 1, 4, ARGB, 4)
|
TESTPLANARTOE(J422, 2, 1, ABGR, 1, 4, ARGB, 4)
|
||||||
TESTPLANARTOE(H422, 2, 1, ARGB, 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)
|
_Opt, +, 0, FMT_C, BPP_C)
|
||||||
|
|
||||||
// Caveat: Destination needs to be 4 bytes
|
// Caveat: Destination needs to be 4 bytes
|
||||||
|
#ifdef LITTLE_ENDIAN_TEST
|
||||||
TESTPLANETOE(ARGB, 1, 4, AR30, 1, 4, ARGB, 4)
|
TESTPLANETOE(ARGB, 1, 4, AR30, 1, 4, ARGB, 4)
|
||||||
TESTPLANETOE(ABGR, 1, 4, AR30, 1, 4, ABGR, 4)
|
TESTPLANETOE(ABGR, 1, 4, AR30, 1, 4, ABGR, 4)
|
||||||
TESTPLANETOE(AR30, 1, 4, ARGB, 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(ABGR, 1, 4, AB30, 1, 4, ABGR, 4)
|
||||||
TESTPLANETOE(AB30, 1, 4, ARGB, 1, 4, ABGR, 4)
|
TESTPLANETOE(AB30, 1, 4, ARGB, 1, 4, ABGR, 4)
|
||||||
TESTPLANETOE(AB30, 1, 4, ABGR, 1, 4, ARGB, 4)
|
TESTPLANETOE(AB30, 1, 4, ABGR, 1, 4, ARGB, 4)
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST_F(LibYUVConvertTest, RotateWithARGBSource) {
|
TEST_F(LibYUVConvertTest, RotateWithARGBSource) {
|
||||||
// 2x2 frames
|
// 2x2 frames
|
||||||
@ -2858,12 +2893,16 @@ TEST_F(LibYUVConvertTest, ABGRToAR30Row_Opt) {
|
|||||||
|
|
||||||
TESTPLANAR16TOB(I010, 2, 2, ARGB, 4, 4, 1, 2)
|
TESTPLANAR16TOB(I010, 2, 2, ARGB, 4, 4, 1, 2)
|
||||||
TESTPLANAR16TOB(I010, 2, 2, ABGR, 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, AR30, 4, 4, 1, 2)
|
||||||
TESTPLANAR16TOB(I010, 2, 2, AB30, 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, ARGB, 4, 4, 1, 2)
|
||||||
TESTPLANAR16TOB(H010, 2, 2, ABGR, 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, AR30, 4, 4, 1, 2)
|
||||||
TESTPLANAR16TOB(H010, 2, 2, AB30, 4, 4, 1, 2)
|
TESTPLANAR16TOB(H010, 2, 2, AB30, 4, 4, 1, 2)
|
||||||
|
#endif
|
||||||
|
|
||||||
static int Clamp(int y) {
|
static int Clamp(int y) {
|
||||||
if (y < 0) {
|
if (y < 0) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user