mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-08 01:36:47 +08:00
ScaleDown odd functions adjust math so last pixel is half width source.
existing test passes out/Release/libyuv_unittest --gtest_filter=*Blend* --libyuv_width=33 --libyuv_height=16 new test added BUG=libyuv:705 TEST=LibYUVScaleTest.TestScaleOdd Change-Id: Ica91812aee2e4ed9bcc18df4962b089c2e4ae704 Reviewed-on: https://chromium-review.googlesource.com/524932 Reviewed-by: Cheng Wang <wangcheng@google.com> Commit-Queue: Frank Barchard <fbarchard@google.com>
This commit is contained in:
parent
b97406775c
commit
44abf70187
@ -1,6 +1,6 @@
|
||||
Name: libyuv
|
||||
URL: http://code.google.com/p/libyuv/
|
||||
Version: 1658
|
||||
Version: 1659
|
||||
License: BSD
|
||||
License File: LICENSE
|
||||
|
||||
|
||||
@ -11,6 +11,6 @@
|
||||
#ifndef INCLUDE_LIBYUV_VERSION_H_
|
||||
#define INCLUDE_LIBYUV_VERSION_H_
|
||||
|
||||
#define LIBYUV_VERSION 1658
|
||||
#define LIBYUV_VERSION 1659
|
||||
|
||||
#endif // INCLUDE_LIBYUV_VERSION_H_
|
||||
|
||||
@ -22,11 +22,12 @@ extern "C" {
|
||||
#define CANY(NAMEANY, TERP_SIMD, TERP_C, BPP, MASK) \
|
||||
void NAMEANY(uint8* dst_ptr, const uint8* src_ptr, int dst_width, int x, \
|
||||
int dx) { \
|
||||
int r = dst_width & MASK; \
|
||||
int n = dst_width & ~MASK; \
|
||||
if (n > 0) { \
|
||||
TERP_SIMD(dst_ptr, src_ptr, n, x, dx); \
|
||||
} \
|
||||
TERP_C(dst_ptr + n * BPP, src_ptr, dst_width & MASK, x + n * dx, dx); \
|
||||
TERP_C(dst_ptr + n * BPP, src_ptr, r, x + n * dx, dx); \
|
||||
}
|
||||
|
||||
#ifdef HAS_SCALEFILTERCOLS_NEON
|
||||
@ -45,10 +46,11 @@ CANY(ScaleARGBFilterCols_Any_NEON,
|
||||
#undef CANY
|
||||
|
||||
// Fixed scale down.
|
||||
// Mask may be non-power of 2, so use MOD
|
||||
#define SDANY(NAMEANY, SCALEROWDOWN_SIMD, SCALEROWDOWN_C, FACTOR, BPP, MASK) \
|
||||
void NAMEANY(const uint8* src_ptr, ptrdiff_t src_stride, uint8* dst_ptr, \
|
||||
int dst_width) { \
|
||||
int r = (int)((unsigned int)dst_width % (MASK + 1)); \
|
||||
int r = (int)((unsigned int)dst_width % (MASK + 1)); /* NOLINT */ \
|
||||
int n = dst_width - r; \
|
||||
if (n > 0) { \
|
||||
SCALEROWDOWN_SIMD(src_ptr, src_stride, dst_ptr, n); \
|
||||
@ -63,13 +65,13 @@ CANY(ScaleARGBFilterCols_Any_NEON,
|
||||
#define SDODD(NAMEANY, SCALEROWDOWN_SIMD, SCALEROWDOWN_C, FACTOR, BPP, MASK) \
|
||||
void NAMEANY(const uint8* src_ptr, ptrdiff_t src_stride, uint8* dst_ptr, \
|
||||
int dst_width) { \
|
||||
int r = (int)((unsigned int)(dst_width - 1) % (MASK + 1)); \
|
||||
int n = dst_width - r; \
|
||||
int r = (int)((unsigned int)(dst_width - 1) % (MASK + 1)); /* NOLINT */ \
|
||||
int n = (dst_width - 1) - r; \
|
||||
if (n > 0) { \
|
||||
SCALEROWDOWN_SIMD(src_ptr, src_stride, dst_ptr, n); \
|
||||
} \
|
||||
SCALEROWDOWN_C(src_ptr + (n * FACTOR) * BPP, src_stride, \
|
||||
dst_ptr + n * BPP, r); \
|
||||
dst_ptr + n * BPP, r + 1); \
|
||||
}
|
||||
|
||||
#ifdef HAS_SCALEROWDOWN2_SSSE3
|
||||
@ -353,8 +355,8 @@ SDANY(ScaleARGBRowDown2Box_Any_MSA,
|
||||
#define SDAANY(NAMEANY, SCALEROWDOWN_SIMD, SCALEROWDOWN_C, BPP, MASK) \
|
||||
void NAMEANY(const uint8* src_ptr, ptrdiff_t src_stride, int src_stepx, \
|
||||
uint8* dst_ptr, int dst_width) { \
|
||||
int r = (int)((unsigned int)dst_width % (MASK + 1)); \
|
||||
int n = dst_width - r; \
|
||||
int r = dst_width & MASK; \
|
||||
int n = dst_width & ~MASK; \
|
||||
if (n > 0) { \
|
||||
SCALEROWDOWN_SIMD(src_ptr, src_stride, src_stepx, dst_ptr, n); \
|
||||
} \
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
#include "../unit_test/unit_test.h"
|
||||
#include "libyuv/cpu_id.h"
|
||||
#include "libyuv/scale.h"
|
||||
#include "libyuv/scale_row.h" // For ScaleRowDown2Box_Odd_C
|
||||
|
||||
#define STRINGIZE(line) #line
|
||||
#define FILELINESTR(file, line) file ":" STRINGIZE(line)
|
||||
@ -364,4 +365,89 @@ TEST_SCALETO(Scale, 1280, 720)
|
||||
#undef TEST_SCALETO1
|
||||
#undef TEST_SCALETO
|
||||
|
||||
#ifdef HAS_SCALEROWDOWN2_SSSE3
|
||||
TEST_F(LibYUVScaleTest, TestScaleOdd) {
|
||||
SIMD_ALIGNED(uint8 orig_pixels[128 * 2]);
|
||||
SIMD_ALIGNED(uint8 dst_pixels_opt[64]);
|
||||
SIMD_ALIGNED(uint8 dst_pixels_c[64]);
|
||||
memset(orig_pixels, 0, sizeof(orig_pixels));
|
||||
memset(dst_pixels_opt, 0, sizeof(dst_pixels_opt));
|
||||
memset(dst_pixels_c, 0, sizeof(dst_pixels_c));
|
||||
|
||||
// TL
|
||||
orig_pixels[0] = 255u;
|
||||
orig_pixels[1] = 0u;
|
||||
orig_pixels[128 + 0] = 0u;
|
||||
orig_pixels[128 + 1] = 0u;
|
||||
// TR
|
||||
orig_pixels[2] = 0u;
|
||||
orig_pixels[3] = 100u;
|
||||
orig_pixels[128 + 2] = 0u;
|
||||
orig_pixels[128 + 3] = 0u;
|
||||
// BL
|
||||
orig_pixels[4] = 0u;
|
||||
orig_pixels[5] = 0u;
|
||||
orig_pixels[128 + 4] = 50u;
|
||||
orig_pixels[128 + 5] = 0u;
|
||||
// BR
|
||||
orig_pixels[6] = 0u;
|
||||
orig_pixels[7] = 0u;
|
||||
orig_pixels[128 + 6] = 0u;
|
||||
orig_pixels[128 + 7] = 20u;
|
||||
// Odd
|
||||
orig_pixels[126] = 4u;
|
||||
orig_pixels[127] = 255u;
|
||||
orig_pixels[128 + 126] = 16u;
|
||||
orig_pixels[128 + 127] = 255u;
|
||||
|
||||
// Test regular half size.
|
||||
ScaleRowDown2Box_C(orig_pixels, 128, dst_pixels_c, 64);
|
||||
|
||||
EXPECT_EQ(64u, dst_pixels_c[0]);
|
||||
EXPECT_EQ(25u, dst_pixels_c[1]);
|
||||
EXPECT_EQ(13u, dst_pixels_c[2]);
|
||||
EXPECT_EQ(5u, dst_pixels_c[3]);
|
||||
EXPECT_EQ(0u, dst_pixels_c[4]);
|
||||
EXPECT_EQ(133u, dst_pixels_c[63]);
|
||||
|
||||
// Test Odd width version - Last pixel is just 1 horizontal pixel.
|
||||
ScaleRowDown2Box_Odd_C(orig_pixels, 128, dst_pixels_c, 64);
|
||||
|
||||
EXPECT_EQ(64u, dst_pixels_c[0]);
|
||||
EXPECT_EQ(25u, dst_pixels_c[1]);
|
||||
EXPECT_EQ(13u, dst_pixels_c[2]);
|
||||
EXPECT_EQ(5u, dst_pixels_c[3]);
|
||||
EXPECT_EQ(0u, dst_pixels_c[4]);
|
||||
EXPECT_EQ(10u, dst_pixels_c[63]);
|
||||
|
||||
// Test one pixel less, should skip the last pixel.
|
||||
memset(dst_pixels_c, 0, sizeof(dst_pixels_c));
|
||||
ScaleRowDown2Box_Odd_C(orig_pixels, 128, dst_pixels_c, 63);
|
||||
|
||||
EXPECT_EQ(64u, dst_pixels_c[0]);
|
||||
EXPECT_EQ(25u, dst_pixels_c[1]);
|
||||
EXPECT_EQ(13u, dst_pixels_c[2]);
|
||||
EXPECT_EQ(5u, dst_pixels_c[3]);
|
||||
EXPECT_EQ(0u, dst_pixels_c[4]);
|
||||
EXPECT_EQ(0u, dst_pixels_c[63]);
|
||||
|
||||
// Test regular half size SSSE3.
|
||||
ScaleRowDown2Box_SSSE3(orig_pixels, 128, dst_pixels_opt, 64);
|
||||
|
||||
EXPECT_EQ(64u, dst_pixels_opt[0]);
|
||||
EXPECT_EQ(25u, dst_pixels_opt[1]);
|
||||
EXPECT_EQ(13u, dst_pixels_opt[2]);
|
||||
EXPECT_EQ(5u, dst_pixels_opt[3]);
|
||||
EXPECT_EQ(0u, dst_pixels_opt[4]);
|
||||
EXPECT_EQ(133u, dst_pixels_opt[63]);
|
||||
|
||||
// Compare C and SSSE3 match.
|
||||
ScaleRowDown2Box_Odd_C(orig_pixels, 128, dst_pixels_c, 64);
|
||||
ScaleRowDown2Box_Odd_SSSE3(orig_pixels, 128, dst_pixels_opt, 64);
|
||||
for (int i = 0; i < 64; ++i) {
|
||||
EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
|
||||
}
|
||||
}
|
||||
#endif // HAS_SCALEROWDOWN2_SSSE3
|
||||
|
||||
} // namespace libyuv
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user