mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-06 16:56:55 +08:00
Internals of scale use ptrdiff_t to allow ARGBInterpolate to use stride between 2 images.
BUG=53 TEST=none Review URL: https://webrtc-codereview.appspot.com/695004 git-svn-id: http://libyuv.googlecode.com/svn/trunk@306 16f28f9a-4ce2-e073-06de-1de4eb20be90
This commit is contained in:
parent
4403be58ae
commit
452472dfc4
@ -1,6 +1,6 @@
|
|||||||
Name: libyuv
|
Name: libyuv
|
||||||
URL: http://code.google.com/p/libyuv/
|
URL: http://code.google.com/p/libyuv/
|
||||||
Version: 305
|
Version: 306
|
||||||
License: BSD
|
License: BSD
|
||||||
License File: LICENSE
|
License File: LICENSE
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,6 @@
|
|||||||
#ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT
|
#ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT
|
||||||
#define INCLUDE_LIBYUV_VERSION_H_
|
#define INCLUDE_LIBYUV_VERSION_H_
|
||||||
|
|
||||||
#define LIBYUV_VERSION 305
|
#define LIBYUV_VERSION 306
|
||||||
|
|
||||||
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
||||||
|
|||||||
@ -183,15 +183,15 @@ int I422ToI420(const uint8* src_y, int src_stride_y,
|
|||||||
// source in scale.cc
|
// source in scale.cc
|
||||||
#if !defined(YUV_DISABLE_ASM) && defined(__ARM_NEON__)
|
#if !defined(YUV_DISABLE_ASM) && defined(__ARM_NEON__)
|
||||||
#define HAS_SCALEROWDOWN2_NEON
|
#define HAS_SCALEROWDOWN2_NEON
|
||||||
void ScaleRowDown2Int_NEON(const uint8* src_ptr, int src_stride,
|
void ScaleRowDown2Int_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst, int dst_width);
|
uint8* dst, int dst_width);
|
||||||
#elif !defined(YUV_DISABLE_ASM) && \
|
#elif !defined(YUV_DISABLE_ASM) && \
|
||||||
(defined(_M_IX86) || defined(__x86_64__) || defined(__i386__))
|
(defined(_M_IX86) || defined(__x86_64__) || defined(__i386__))
|
||||||
|
|
||||||
void ScaleRowDown2Int_SSE2(const uint8* src_ptr, int src_stride,
|
void ScaleRowDown2Int_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width);
|
uint8* dst_ptr, int dst_width);
|
||||||
#endif
|
#endif
|
||||||
void ScaleRowDown2Int_C(const uint8* src_ptr, int src_stride,
|
void ScaleRowDown2Int_C(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width);
|
uint8* dst_ptr, int dst_width);
|
||||||
|
|
||||||
int I444ToI420(const uint8* src_y, int src_stride_y,
|
int I444ToI420(const uint8* src_y, int src_stride_y,
|
||||||
@ -212,7 +212,7 @@ int I444ToI420(const uint8* src_y, int src_stride_y,
|
|||||||
src_stride_v = -src_stride_v;
|
src_stride_v = -src_stride_v;
|
||||||
}
|
}
|
||||||
int halfwidth = (width + 1) >> 1;
|
int halfwidth = (width + 1) >> 1;
|
||||||
void (*ScaleRowDown2)(const uint8* src_ptr, int src_stride,
|
void (*ScaleRowDown2)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) = ScaleRowDown2Int_C;
|
uint8* dst_ptr, int dst_width) = ScaleRowDown2Int_C;
|
||||||
#if defined(HAS_SCALEROWDOWN2_NEON)
|
#if defined(HAS_SCALEROWDOWN2_NEON)
|
||||||
if (TestCpuFlag(kCpuHasNEON) &&
|
if (TestCpuFlag(kCpuHasNEON) &&
|
||||||
@ -785,8 +785,10 @@ int UYVYToI420(const uint8* src_uyvy, int src_stride_uyvy,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Visual C x86 or GCC little endian.
|
// Visual C x86 or GCC little endian.
|
||||||
#if defined(_M_X64) || defined(_M_IX86) || (defined(__BYTE_ORDER) && \
|
#if defined(__x86_64__) || defined(_M_X64) || \
|
||||||
(__BYTE_ORDER == __ORDER_LITTLE_ENDIAN__ || __BYTE_ORDER == __LITTLE_ENDIAN))
|
defined(__i386__) || defined(_M_IX86) || \
|
||||||
|
defined(__arm__) || defined(_M_ARM) || \
|
||||||
|
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
|
||||||
#define LIBYUV_LITTLE_ENDIAN
|
#define LIBYUV_LITTLE_ENDIAN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@ -402,8 +402,10 @@ static void I42xToUYVYRow_C(const uint8* src_y,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Visual C x86 or GCC little endian.
|
// Visual C x86 or GCC little endian.
|
||||||
#if defined(_M_X64) || defined(_M_IX86) || (defined(__BYTE_ORDER) && \
|
#if defined(__x86_64__) || defined(_M_X64) || \
|
||||||
(__BYTE_ORDER == __ORDER_LITTLE_ENDIAN__ || __BYTE_ORDER == __LITTLE_ENDIAN))
|
defined(__i386__) || defined(_M_IX86) || \
|
||||||
|
defined(__arm__) || defined(_M_ARM) || \
|
||||||
|
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
|
||||||
#define LIBYUV_LITTLE_ENDIAN
|
#define LIBYUV_LITTLE_ENDIAN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@ -1116,11 +1116,12 @@ int ARGBShade(const uint8* src_argb, int src_stride_argb,
|
|||||||
(defined(__x86_64__) || defined(__i386__)))
|
(defined(__x86_64__) || defined(__i386__)))
|
||||||
#define HAS_SCALEARGBFILTERROWS_SSSE3
|
#define HAS_SCALEARGBFILTERROWS_SSSE3
|
||||||
#endif
|
#endif
|
||||||
void ScaleARGBFilterRows_C(uint8* dst_ptr, const uint8* src_ptr, int src_stride,
|
void ScaleARGBFilterRows_C(uint8* dst_ptr,
|
||||||
|
const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
int dst_width, int source_y_fraction);
|
int dst_width, int source_y_fraction);
|
||||||
void ScaleARGBFilterRows_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
|
void ScaleARGBFilterRows_SSSE3(uint8* dst_ptr,
|
||||||
int src_stride, int dst_width,
|
const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
int source_y_fraction);
|
int dst_width, int source_y_fraction);
|
||||||
|
|
||||||
// Interpolate 2 ARGB images by specified amount (0 to 255).
|
// Interpolate 2 ARGB images by specified amount (0 to 255).
|
||||||
int ARGBInterpolate(const uint8* src_argb0, int src_stride_argb0,
|
int ARGBInterpolate(const uint8* src_argb0, int src_stride_argb0,
|
||||||
@ -1137,7 +1138,7 @@ int ARGBInterpolate(const uint8* src_argb0, int src_stride_argb0,
|
|||||||
dst_stride_argb = -dst_stride_argb;
|
dst_stride_argb = -dst_stride_argb;
|
||||||
}
|
}
|
||||||
void (*ScaleARGBFilterRows)(uint8* dst_ptr, const uint8* src_ptr,
|
void (*ScaleARGBFilterRows)(uint8* dst_ptr, const uint8* src_ptr,
|
||||||
int src_stride, int dst_width,
|
ptrdiff_t src_stride, int dst_width,
|
||||||
int source_y_fraction) = ScaleARGBFilterRows_C;
|
int source_y_fraction) = ScaleARGBFilterRows_C;
|
||||||
#if defined(HAS_SCALEARGBFILTERROWS_SSSE3)
|
#if defined(HAS_SCALEARGBFILTERROWS_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) &&
|
if (TestCpuFlag(kCpuHasSSSE3) &&
|
||||||
|
|||||||
162
source/scale.cc
162
source/scale.cc
@ -52,7 +52,7 @@ void SetUseReferenceImpl(bool use) {
|
|||||||
#if !defined(YUV_DISABLE_ASM) && defined(__ARM_NEON__)
|
#if !defined(YUV_DISABLE_ASM) && defined(__ARM_NEON__)
|
||||||
#define HAS_SCALEROWDOWN2_NEON
|
#define HAS_SCALEROWDOWN2_NEON
|
||||||
// Note - not static due to reuse in convert for 444 to 420.
|
// Note - not static due to reuse in convert for 444 to 420.
|
||||||
void ScaleRowDown2_NEON(const uint8* src_ptr, int /* src_stride */,
|
void ScaleRowDown2_NEON(const uint8* src_ptr, ptrdiff_t /* src_stride */,
|
||||||
uint8* dst, int dst_width) {
|
uint8* dst, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"1: \n"
|
"1: \n"
|
||||||
@ -69,7 +69,7 @@ void ScaleRowDown2_NEON(const uint8* src_ptr, int /* src_stride */,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScaleRowDown2Int_NEON(const uint8* src_ptr, int src_stride,
|
void ScaleRowDown2Int_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst, int dst_width) {
|
uint8* dst, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
// change the stride to row 2 pointer
|
// change the stride to row 2 pointer
|
||||||
@ -97,7 +97,7 @@ void ScaleRowDown2Int_NEON(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define HAS_SCALEROWDOWN4_NEON
|
#define HAS_SCALEROWDOWN4_NEON
|
||||||
static void ScaleRowDown4_NEON(const uint8* src_ptr, int /* src_stride */,
|
static void ScaleRowDown4_NEON(const uint8* src_ptr, ptrdiff_t /* src_stride */,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"1: \n"
|
"1: \n"
|
||||||
@ -116,7 +116,7 @@ static void ScaleRowDown4_NEON(const uint8* src_ptr, int /* src_stride */,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown4Int_NEON(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown4Int_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"add r4, %0, %3 \n"
|
"add r4, %0, %3 \n"
|
||||||
@ -155,7 +155,8 @@ static void ScaleRowDown4Int_NEON(const uint8* src_ptr, int src_stride,
|
|||||||
// Down scale from 4 to 3 pixels. Use the neon multilane read/write
|
// 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.
|
// to load up the every 4th pixel into a 4 different registers.
|
||||||
// Point samples 32 pixels to 24 pixels.
|
// Point samples 32 pixels to 24 pixels.
|
||||||
static void ScaleRowDown34_NEON(const uint8* src_ptr, int /* src_stride */,
|
static void ScaleRowDown34_NEON(const uint8* src_ptr,
|
||||||
|
ptrdiff_t /* src_stride */,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"1: \n"
|
"1: \n"
|
||||||
@ -172,7 +173,8 @@ static void ScaleRowDown34_NEON(const uint8* src_ptr, int /* src_stride */,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown34_0_Int_NEON(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_0_Int_NEON(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"vmov.u8 d24, #3 \n"
|
"vmov.u8 d24, #3 \n"
|
||||||
@ -227,7 +229,8 @@ static void ScaleRowDown34_0_Int_NEON(const uint8* src_ptr, int src_stride,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown34_1_Int_NEON(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_1_Int_NEON(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"vmov.u8 d24, #3 \n"
|
"vmov.u8 d24, #3 \n"
|
||||||
@ -279,7 +282,8 @@ const vec16 kMult38_Div9 =
|
|||||||
65536 / 18, 65536 / 18, 65536 / 18, 65536 / 18 };
|
65536 / 18, 65536 / 18, 65536 / 18, 65536 / 18 };
|
||||||
|
|
||||||
// 32 -> 12
|
// 32 -> 12
|
||||||
static void ScaleRowDown38_NEON(const uint8* src_ptr, int,
|
static void ScaleRowDown38_NEON(const uint8* src_ptr,
|
||||||
|
ptrdiff_t /* src_stride */,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"vld1.u8 {q3}, [%3] \n"
|
"vld1.u8 {q3}, [%3] \n"
|
||||||
@ -301,7 +305,7 @@ static void ScaleRowDown38_NEON(const uint8* src_ptr, int,
|
|||||||
|
|
||||||
// 32x3 -> 12x1
|
// 32x3 -> 12x1
|
||||||
static void OMITFP ScaleRowDown38_3_Int_NEON(const uint8* src_ptr,
|
static void OMITFP ScaleRowDown38_3_Int_NEON(const uint8* src_ptr,
|
||||||
int src_stride,
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"vld1.u16 {q13}, [%4] \n"
|
"vld1.u16 {q13}, [%4] \n"
|
||||||
@ -410,7 +414,8 @@ static void OMITFP ScaleRowDown38_3_Int_NEON(const uint8* src_ptr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 32x2 -> 12x1
|
// 32x2 -> 12x1
|
||||||
static void ScaleRowDown38_2_Int_NEON(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown38_2_Int_NEON(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"vld1.u16 {q13}, [%4] \n"
|
"vld1.u16 {q13}, [%4] \n"
|
||||||
@ -505,7 +510,7 @@ static void ScaleRowDown38_2_Int_NEON(const uint8* src_ptr, int src_stride,
|
|||||||
// 16x2 -> 16x1
|
// 16x2 -> 16x1
|
||||||
#define HAS_SCALEFILTERROWS_NEON
|
#define HAS_SCALEFILTERROWS_NEON
|
||||||
static void ScaleFilterRows_NEON(uint8* dst_ptr,
|
static void ScaleFilterRows_NEON(uint8* dst_ptr,
|
||||||
const uint8* src_ptr, int src_stride,
|
const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
int dst_width, int source_y_fraction) {
|
int dst_width, int source_y_fraction) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"cmp %4, #0 \n"
|
"cmp %4, #0 \n"
|
||||||
@ -658,7 +663,7 @@ CONST uvec16 kScaleAb2 =
|
|||||||
// Reads 32 pixels, throws half away and writes 16 pixels.
|
// Reads 32 pixels, throws half away and writes 16 pixels.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown2_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown2_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
mov eax, [esp + 4] // src_ptr
|
mov eax, [esp + 4] // src_ptr
|
||||||
@ -687,7 +692,7 @@ static void ScaleRowDown2_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Blends 32x2 rectangle to 16x1.
|
// Blends 32x2 rectangle to 16x1.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
void ScaleRowDown2Int_SSE2(const uint8* src_ptr, int src_stride,
|
void ScaleRowDown2Int_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -731,7 +736,8 @@ void ScaleRowDown2Int_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Reads 32 pixels, throws half away and writes 16 pixels.
|
// Reads 32 pixels, throws half away and writes 16 pixels.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown2_Unaligned_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown2_Unaligned_SSE2(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
mov eax, [esp + 4] // src_ptr
|
mov eax, [esp + 4] // src_ptr
|
||||||
@ -761,7 +767,7 @@ static void ScaleRowDown2_Unaligned_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown2Int_Unaligned_SSE2(const uint8* src_ptr,
|
static void ScaleRowDown2Int_Unaligned_SSE2(const uint8* src_ptr,
|
||||||
int src_stride,
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -806,7 +812,7 @@ static void ScaleRowDown2Int_Unaligned_SSE2(const uint8* src_ptr,
|
|||||||
// Point samples 32 pixels to 8 pixels.
|
// Point samples 32 pixels to 8 pixels.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 8 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 8 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown4_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown4_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
mov eax, [esp + 4] // src_ptr
|
mov eax, [esp + 4] // src_ptr
|
||||||
@ -837,7 +843,7 @@ static void ScaleRowDown4_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Blends 32x4 rectangle to 8x1.
|
// Blends 32x4 rectangle to 8x1.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 8 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 8 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown4Int_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown4Int_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -899,7 +905,7 @@ static void ScaleRowDown4Int_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Point samples 32 pixels to 4 pixels.
|
// Point samples 32 pixels to 4 pixels.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 4 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 4 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown8_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown8_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
mov eax, [esp + 4] // src_ptr
|
mov eax, [esp + 4] // src_ptr
|
||||||
@ -931,7 +937,7 @@ static void ScaleRowDown8_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Blends 32x8 rectangle to 4x1.
|
// Blends 32x8 rectangle to 4x1.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 4 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 4 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown8Int_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown8Int_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -1009,7 +1015,7 @@ static void ScaleRowDown8Int_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Note that movdqa+palign may be better than movdqu.
|
// Note that movdqa+palign may be better than movdqu.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 8 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 8 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown34_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
mov eax, [esp + 4] // src_ptr
|
mov eax, [esp + 4] // src_ptr
|
||||||
@ -1058,7 +1064,8 @@ static void ScaleRowDown34_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
// Note that movdqa+palign may be better than movdqu.
|
// Note that movdqa+palign may be better than movdqu.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 8 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 8 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown34_1_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_1_Int_SSSE3(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -1116,7 +1123,8 @@ static void ScaleRowDown34_1_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
// Note that movdqa+palign may be better than movdqu.
|
// Note that movdqa+palign may be better than movdqu.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 8 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 8 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown34_0_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_0_Int_SSSE3(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -1179,7 +1187,7 @@ static void ScaleRowDown34_0_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
|
|
||||||
// Scale 32 pixels to 12
|
// Scale 32 pixels to 12
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown38_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown38_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
mov eax, [esp + 4] // src_ptr
|
mov eax, [esp + 4] // src_ptr
|
||||||
@ -1211,7 +1219,8 @@ static void ScaleRowDown38_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
|
|
||||||
// Scale 16x3 pixels to 6x1 with interpolation
|
// Scale 16x3 pixels to 6x1 with interpolation
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown38_3_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown38_3_Int_SSSE3(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -1276,7 +1285,8 @@ static void ScaleRowDown38_3_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
|
|
||||||
// Scale 16x2 pixels to 6x1 with interpolation
|
// Scale 16x2 pixels to 6x1 with interpolation
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleRowDown38_2_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown38_2_Int_SSSE3(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -1322,7 +1332,7 @@ static void ScaleRowDown38_2_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
|
|
||||||
// Reads 16xN bytes and produces 16 shorts at a time.
|
// Reads 16xN bytes and produces 16 shorts at a time.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleAddRows_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleAddRows_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint16* dst_ptr, int src_width,
|
uint16* dst_ptr, int src_width,
|
||||||
int src_height) {
|
int src_height) {
|
||||||
__asm {
|
__asm {
|
||||||
@ -1388,7 +1398,7 @@ static void ScaleAddRows_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
#define HAS_SCALEFILTERROWS_SSE2_DISABLED
|
#define HAS_SCALEFILTERROWS_SSE2_DISABLED
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleFilterRows_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
static void ScaleFilterRows_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
||||||
int src_stride, int dst_width,
|
ptrdiff_t src_stride, int dst_width,
|
||||||
int source_y_fraction) {
|
int source_y_fraction) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -1479,7 +1489,7 @@ static void ScaleFilterRows_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
|||||||
#define HAS_SCALEFILTERROWS_SSSE3
|
#define HAS_SCALEFILTERROWS_SSSE3
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleFilterRows_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
|
static void ScaleFilterRows_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
|
||||||
int src_stride, int dst_width,
|
ptrdiff_t src_stride, int dst_width,
|
||||||
int source_y_fraction) {
|
int source_y_fraction) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -1570,7 +1580,7 @@ static void ScaleFilterRows_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
|
|||||||
// Generated using gcc disassembly on Visual C object file:
|
// Generated using gcc disassembly on Visual C object file:
|
||||||
// objdump -D yuvscaler.obj >yuvscaler.txt
|
// objdump -D yuvscaler.obj >yuvscaler.txt
|
||||||
#define HAS_SCALEROWDOWN2_SSE2
|
#define HAS_SCALEROWDOWN2_SSE2
|
||||||
static void ScaleRowDown2_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown2_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"pcmpeqb %%xmm5,%%xmm5 \n"
|
"pcmpeqb %%xmm5,%%xmm5 \n"
|
||||||
@ -1598,7 +1608,7 @@ static void ScaleRowDown2_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScaleRowDown2Int_SSE2(const uint8* src_ptr, int src_stride,
|
void ScaleRowDown2Int_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"pcmpeqb %%xmm5,%%xmm5 \n"
|
"pcmpeqb %%xmm5,%%xmm5 \n"
|
||||||
@ -1635,7 +1645,8 @@ void ScaleRowDown2Int_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
static void ScaleRowDown2_Unaligned_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown2_Unaligned_SSE2(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"pcmpeqb %%xmm5,%%xmm5 \n"
|
"pcmpeqb %%xmm5,%%xmm5 \n"
|
||||||
@ -1664,7 +1675,7 @@ static void ScaleRowDown2_Unaligned_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown2Int_Unaligned_SSE2(const uint8* src_ptr,
|
static void ScaleRowDown2Int_Unaligned_SSE2(const uint8* src_ptr,
|
||||||
int src_stride,
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"pcmpeqb %%xmm5,%%xmm5 \n"
|
"pcmpeqb %%xmm5,%%xmm5 \n"
|
||||||
@ -1703,7 +1714,7 @@ static void ScaleRowDown2Int_Unaligned_SSE2(const uint8* src_ptr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define HAS_SCALEROWDOWN4_SSE2
|
#define HAS_SCALEROWDOWN4_SSE2
|
||||||
static void ScaleRowDown4_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown4_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"pcmpeqb %%xmm5,%%xmm5 \n"
|
"pcmpeqb %%xmm5,%%xmm5 \n"
|
||||||
@ -1732,7 +1743,7 @@ static void ScaleRowDown4_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown4Int_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown4Int_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
intptr_t stridex3 = 0;
|
intptr_t stridex3 = 0;
|
||||||
asm volatile (
|
asm volatile (
|
||||||
@ -1787,7 +1798,7 @@ static void ScaleRowDown4Int_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define HAS_SCALEROWDOWN8_SSE2
|
#define HAS_SCALEROWDOWN8_SSE2
|
||||||
static void ScaleRowDown8_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown8_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"pcmpeqb %%xmm5,%%xmm5 \n"
|
"pcmpeqb %%xmm5,%%xmm5 \n"
|
||||||
@ -1817,7 +1828,7 @@ static void ScaleRowDown8_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown8Int_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown8Int_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
intptr_t stridex3 = 0;
|
intptr_t stridex3 = 0;
|
||||||
intptr_t row4 = 0;
|
intptr_t row4 = 0;
|
||||||
@ -1884,7 +1895,7 @@ static void ScaleRowDown8Int_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define HAS_SCALEROWDOWN34_SSSE3
|
#define HAS_SCALEROWDOWN34_SSSE3
|
||||||
static void ScaleRowDown34_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"movdqa %0,%%xmm3 \n"
|
"movdqa %0,%%xmm3 \n"
|
||||||
@ -1923,7 +1934,8 @@ static void ScaleRowDown34_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown34_1_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_1_Int_SSSE3(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"movdqa %0,%%xmm2 \n" // kShuf01
|
"movdqa %0,%%xmm2 \n" // kShuf01
|
||||||
@ -1989,7 +2001,8 @@ static void ScaleRowDown34_1_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown34_0_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_0_Int_SSSE3(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"movdqa %0,%%xmm2 \n" // kShuf01
|
"movdqa %0,%%xmm2 \n" // kShuf01
|
||||||
@ -2060,7 +2073,7 @@ static void ScaleRowDown34_0_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define HAS_SCALEROWDOWN38_SSSE3
|
#define HAS_SCALEROWDOWN38_SSSE3
|
||||||
static void ScaleRowDown38_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown38_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"movdqa %3,%%xmm4 \n"
|
"movdqa %3,%%xmm4 \n"
|
||||||
@ -2091,7 +2104,8 @@ static void ScaleRowDown38_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown38_2_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown38_2_Int_SSSE3(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"movdqa %0,%%xmm2 \n"
|
"movdqa %0,%%xmm2 \n"
|
||||||
@ -2136,7 +2150,8 @@ static void ScaleRowDown38_2_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown38_3_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown38_3_Int_SSSE3(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"movdqa %0,%%xmm2 \n"
|
"movdqa %0,%%xmm2 \n"
|
||||||
@ -2201,7 +2216,7 @@ static void ScaleRowDown38_3_Int_SSSE3(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define HAS_SCALEADDROWS_SSE2
|
#define HAS_SCALEADDROWS_SSE2
|
||||||
static void ScaleAddRows_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleAddRows_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint16* dst_ptr, int src_width, int src_height) {
|
uint16* dst_ptr, int src_width, int src_height) {
|
||||||
int tmp_height = 0;
|
int tmp_height = 0;
|
||||||
intptr_t tmp_src = 0;
|
intptr_t tmp_src = 0;
|
||||||
@ -2254,7 +2269,7 @@ static void ScaleAddRows_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Bilinear row filtering combines 16x2 -> 16x1. SSE2 version
|
// Bilinear row filtering combines 16x2 -> 16x1. SSE2 version
|
||||||
#define HAS_SCALEFILTERROWS_SSE2_DISABLED
|
#define HAS_SCALEFILTERROWS_SSE2_DISABLED
|
||||||
static void ScaleFilterRows_SSE2(uint8* dst_ptr,
|
static void ScaleFilterRows_SSE2(uint8* dst_ptr,
|
||||||
const uint8* src_ptr, int src_stride,
|
const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
int dst_width, int source_y_fraction) {
|
int dst_width, int source_y_fraction) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"sub %1,%0 \n"
|
"sub %1,%0 \n"
|
||||||
@ -2327,7 +2342,7 @@ static void ScaleFilterRows_SSE2(uint8* dst_ptr,
|
|||||||
// Bilinear row filtering combines 16x2 -> 16x1. SSSE3 version
|
// Bilinear row filtering combines 16x2 -> 16x1. SSSE3 version
|
||||||
#define HAS_SCALEFILTERROWS_SSSE3
|
#define HAS_SCALEFILTERROWS_SSSE3
|
||||||
static void ScaleFilterRows_SSSE3(uint8* dst_ptr,
|
static void ScaleFilterRows_SSSE3(uint8* dst_ptr,
|
||||||
const uint8* src_ptr, int src_stride,
|
const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
int dst_width, int source_y_fraction) {
|
int dst_width, int source_y_fraction) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"sub %1,%0 \n"
|
"sub %1,%0 \n"
|
||||||
@ -2396,7 +2411,7 @@ static void ScaleFilterRows_SSSE3(uint8* dst_ptr,
|
|||||||
#endif // defined(__x86_64__) || defined(__i386__)
|
#endif // defined(__x86_64__) || defined(__i386__)
|
||||||
|
|
||||||
// CPU agnostic row functions
|
// CPU agnostic row functions
|
||||||
static void ScaleRowDown2_C(const uint8* src_ptr, int,
|
static void ScaleRowDown2_C(const uint8* src_ptr, ptrdiff_t /* src_stride */,
|
||||||
uint8* dst, int dst_width) {
|
uint8* dst, int dst_width) {
|
||||||
uint8* dend = dst + dst_width - 1;
|
uint8* dend = dst + dst_width - 1;
|
||||||
do {
|
do {
|
||||||
@ -2410,7 +2425,7 @@ static void ScaleRowDown2_C(const uint8* src_ptr, int,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScaleRowDown2Int_C(const uint8* src_ptr, int src_stride,
|
void ScaleRowDown2Int_C(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst, int dst_width) {
|
uint8* dst, int dst_width) {
|
||||||
const uint8* s = src_ptr;
|
const uint8* s = src_ptr;
|
||||||
const uint8* t = src_ptr + src_stride;
|
const uint8* t = src_ptr + src_stride;
|
||||||
@ -2427,7 +2442,7 @@ void ScaleRowDown2Int_C(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown4_C(const uint8* src_ptr, int,
|
static void ScaleRowDown4_C(const uint8* src_ptr, ptrdiff_t /* src_stride */,
|
||||||
uint8* dst, int dst_width) {
|
uint8* dst, int dst_width) {
|
||||||
uint8* dend = dst + dst_width - 1;
|
uint8* dend = dst + dst_width - 1;
|
||||||
do {
|
do {
|
||||||
@ -2441,7 +2456,7 @@ static void ScaleRowDown4_C(const uint8* src_ptr, int,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown4Int_C(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown4Int_C(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst, int dst_width) {
|
uint8* dst, int dst_width) {
|
||||||
intptr_t stride = src_stride;
|
intptr_t stride = src_stride;
|
||||||
uint8* dend = dst + dst_width - 1;
|
uint8* dend = dst + dst_width - 1;
|
||||||
@ -2482,7 +2497,7 @@ static void ScaleRowDown4Int_C(const uint8* src_ptr, int src_stride,
|
|||||||
static const int kMaxOutputWidth = 640;
|
static const int kMaxOutputWidth = 640;
|
||||||
static const int kMaxRow12 = kMaxOutputWidth * 2;
|
static const int kMaxRow12 = kMaxOutputWidth * 2;
|
||||||
|
|
||||||
static void ScaleRowDown8_C(const uint8* src_ptr, int,
|
static void ScaleRowDown8_C(const uint8* src_ptr, ptrdiff_t /* src_stride */,
|
||||||
uint8* dst, int dst_width) {
|
uint8* dst, int dst_width) {
|
||||||
uint8* dend = dst + dst_width - 1;
|
uint8* dend = dst + dst_width - 1;
|
||||||
do {
|
do {
|
||||||
@ -2498,7 +2513,7 @@ static void ScaleRowDown8_C(const uint8* src_ptr, int,
|
|||||||
|
|
||||||
// Note calling code checks width is less than max and if not
|
// Note calling code checks width is less than max and if not
|
||||||
// uses ScaleRowDown8_C instead.
|
// uses ScaleRowDown8_C instead.
|
||||||
static void ScaleRowDown8Int_C(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown8Int_C(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst, int dst_width) {
|
uint8* dst, int dst_width) {
|
||||||
SIMD_ALIGNED(uint8 src_row[kMaxRow12 * 2]);
|
SIMD_ALIGNED(uint8 src_row[kMaxRow12 * 2]);
|
||||||
assert(dst_width <= kMaxOutputWidth);
|
assert(dst_width <= kMaxOutputWidth);
|
||||||
@ -2509,7 +2524,7 @@ static void ScaleRowDown8Int_C(const uint8* src_ptr, int src_stride,
|
|||||||
ScaleRowDown2Int_C(src_row, kMaxOutputWidth, dst, dst_width);
|
ScaleRowDown2Int_C(src_row, kMaxOutputWidth, dst, dst_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleRowDown34_C(const uint8* src_ptr, int,
|
static void ScaleRowDown34_C(const uint8* src_ptr, ptrdiff_t /* src_stride */,
|
||||||
uint8* dst, int dst_width) {
|
uint8* dst, int dst_width) {
|
||||||
assert((dst_width % 3 == 0) && (dst_width > 0));
|
assert((dst_width % 3 == 0) && (dst_width > 0));
|
||||||
uint8* dend = dst + dst_width;
|
uint8* dend = dst + dst_width;
|
||||||
@ -2523,7 +2538,7 @@ static void ScaleRowDown34_C(const uint8* src_ptr, int,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Filter rows 0 and 1 together, 3 : 1
|
// Filter rows 0 and 1 together, 3 : 1
|
||||||
static void ScaleRowDown34_0_Int_C(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_0_Int_C(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* d, int dst_width) {
|
uint8* d, int dst_width) {
|
||||||
assert((dst_width % 3 == 0) && (dst_width > 0));
|
assert((dst_width % 3 == 0) && (dst_width > 0));
|
||||||
const uint8* s = src_ptr;
|
const uint8* s = src_ptr;
|
||||||
@ -2546,7 +2561,7 @@ static void ScaleRowDown34_0_Int_C(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Filter rows 1 and 2 together, 1 : 1
|
// Filter rows 1 and 2 together, 1 : 1
|
||||||
static void ScaleRowDown34_1_Int_C(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_1_Int_C(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* d, int dst_width) {
|
uint8* d, int dst_width) {
|
||||||
assert((dst_width % 3 == 0) && (dst_width > 0));
|
assert((dst_width % 3 == 0) && (dst_width > 0));
|
||||||
const uint8* s = src_ptr;
|
const uint8* s = src_ptr;
|
||||||
@ -2615,7 +2630,8 @@ static void ScaleFilterCols34_C(uint8* dst_ptr, const uint8* src_ptr,
|
|||||||
|
|
||||||
#define HAS_SCALEROWDOWN34_SSE2_DISABLED
|
#define HAS_SCALEROWDOWN34_SSE2_DISABLED
|
||||||
// Filter rows 0 and 1 together, 3 : 1
|
// Filter rows 0 and 1 together, 3 : 1
|
||||||
static void ScaleRowDown34_0_Int_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_0_Int_SSE2(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
assert((dst_width % 3 == 0) && (dst_width > 0));
|
assert((dst_width % 3 == 0) && (dst_width > 0));
|
||||||
SIMD_ALIGNED(uint8 row[kMaxInputWidth]);
|
SIMD_ALIGNED(uint8 row[kMaxInputWidth]);
|
||||||
@ -2624,7 +2640,8 @@ static void ScaleRowDown34_0_Int_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Filter rows 1 and 2 together, 1 : 1
|
// Filter rows 1 and 2 together, 1 : 1
|
||||||
static void ScaleRowDown34_1_Int_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown34_1_Int_SSE2(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
assert((dst_width % 3 == 0) && (dst_width > 0));
|
assert((dst_width % 3 == 0) && (dst_width > 0));
|
||||||
SIMD_ALIGNED(uint8 row[kMaxInputWidth]);
|
SIMD_ALIGNED(uint8 row[kMaxInputWidth]);
|
||||||
@ -2633,7 +2650,7 @@ static void ScaleRowDown34_1_Int_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void ScaleRowDown38_C(const uint8* src_ptr, int,
|
static void ScaleRowDown38_C(const uint8* src_ptr, ptrdiff_t /* src_stride */,
|
||||||
uint8* dst, int dst_width) {
|
uint8* dst, int dst_width) {
|
||||||
assert(dst_width % 3 == 0);
|
assert(dst_width % 3 == 0);
|
||||||
for (int x = 0; x < dst_width; x += 3) {
|
for (int x = 0; x < dst_width; x += 3) {
|
||||||
@ -2646,7 +2663,8 @@ static void ScaleRowDown38_C(const uint8* src_ptr, int,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 8x3 -> 3x1
|
// 8x3 -> 3x1
|
||||||
static void ScaleRowDown38_3_Int_C(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown38_3_Int_C(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
assert((dst_width % 3 == 0) && (dst_width > 0));
|
assert((dst_width % 3 == 0) && (dst_width > 0));
|
||||||
intptr_t stride = src_stride;
|
intptr_t stride = src_stride;
|
||||||
@ -2671,7 +2689,7 @@ static void ScaleRowDown38_3_Int_C(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 8x2 -> 3x1
|
// 8x2 -> 3x1
|
||||||
static void ScaleRowDown38_2_Int_C(const uint8* src_ptr, int src_stride,
|
static void ScaleRowDown38_2_Int_C(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
assert((dst_width % 3 == 0) && (dst_width > 0));
|
assert((dst_width % 3 == 0) && (dst_width > 0));
|
||||||
intptr_t stride = src_stride;
|
intptr_t stride = src_stride;
|
||||||
@ -2692,7 +2710,7 @@ static void ScaleRowDown38_2_Int_C(const uint8* src_ptr, int src_stride,
|
|||||||
|
|
||||||
// C version 8x2 -> 8x1
|
// C version 8x2 -> 8x1
|
||||||
static void ScaleFilterRows_C(uint8* dst_ptr,
|
static void ScaleFilterRows_C(uint8* dst_ptr,
|
||||||
const uint8* src_ptr, int src_stride,
|
const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
int dst_width, int source_y_fraction) {
|
int dst_width, int source_y_fraction) {
|
||||||
assert(dst_width > 0);
|
assert(dst_width > 0);
|
||||||
int y1_fraction = source_y_fraction;
|
int y1_fraction = source_y_fraction;
|
||||||
@ -2715,7 +2733,7 @@ static void ScaleFilterRows_C(uint8* dst_ptr,
|
|||||||
dst_ptr[0] = dst_ptr[-1];
|
dst_ptr[0] = dst_ptr[-1];
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScaleAddRows_C(const uint8* src_ptr, int src_stride,
|
void ScaleAddRows_C(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint16* dst_ptr, int src_width, int src_height) {
|
uint16* dst_ptr, int src_width, int src_height) {
|
||||||
assert(src_width > 0);
|
assert(src_width > 0);
|
||||||
assert(src_height > 0);
|
assert(src_height > 0);
|
||||||
@ -2744,7 +2762,7 @@ static void ScalePlaneDown2(int src_width, int src_height,
|
|||||||
FilterMode filtering) {
|
FilterMode filtering) {
|
||||||
assert(IS_ALIGNED(src_width, 2));
|
assert(IS_ALIGNED(src_width, 2));
|
||||||
assert(IS_ALIGNED(src_height, 2));
|
assert(IS_ALIGNED(src_height, 2));
|
||||||
void (*ScaleRowDown2)(const uint8* src_ptr, int src_stride,
|
void (*ScaleRowDown2)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) =
|
uint8* dst_ptr, int dst_width) =
|
||||||
filtering ? ScaleRowDown2Int_C : ScaleRowDown2_C;
|
filtering ? ScaleRowDown2Int_C : ScaleRowDown2_C;
|
||||||
#if defined(HAS_SCALEROWDOWN2_NEON)
|
#if defined(HAS_SCALEROWDOWN2_NEON)
|
||||||
@ -2784,7 +2802,7 @@ static void ScalePlaneDown4(int src_width, int src_height,
|
|||||||
FilterMode filtering) {
|
FilterMode filtering) {
|
||||||
assert(IS_ALIGNED(src_width, 4));
|
assert(IS_ALIGNED(src_width, 4));
|
||||||
assert(IS_ALIGNED(src_height, 4));
|
assert(IS_ALIGNED(src_height, 4));
|
||||||
void (*ScaleRowDown4)(const uint8* src_ptr, int src_stride,
|
void (*ScaleRowDown4)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) =
|
uint8* dst_ptr, int dst_width) =
|
||||||
filtering ? ScaleRowDown4Int_C : ScaleRowDown4_C;
|
filtering ? ScaleRowDown4Int_C : ScaleRowDown4_C;
|
||||||
#if defined(HAS_SCALEROWDOWN4_NEON)
|
#if defined(HAS_SCALEROWDOWN4_NEON)
|
||||||
@ -2821,7 +2839,7 @@ static void ScalePlaneDown8(int src_width, int src_height,
|
|||||||
FilterMode filtering) {
|
FilterMode filtering) {
|
||||||
assert(IS_ALIGNED(src_width, 8));
|
assert(IS_ALIGNED(src_width, 8));
|
||||||
assert(IS_ALIGNED(src_height, 8));
|
assert(IS_ALIGNED(src_height, 8));
|
||||||
void (*ScaleRowDown8)(const uint8* src_ptr, int src_stride,
|
void (*ScaleRowDown8)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) =
|
uint8* dst_ptr, int dst_width) =
|
||||||
filtering && (dst_width <= kMaxOutputWidth) ?
|
filtering && (dst_width <= kMaxOutputWidth) ?
|
||||||
ScaleRowDown8Int_C : ScaleRowDown8_C;
|
ScaleRowDown8Int_C : ScaleRowDown8_C;
|
||||||
@ -2852,9 +2870,9 @@ static void ScalePlaneDown34(int src_width, int src_height,
|
|||||||
const uint8* src_ptr, uint8* dst_ptr,
|
const uint8* src_ptr, uint8* dst_ptr,
|
||||||
FilterMode filtering) {
|
FilterMode filtering) {
|
||||||
assert(dst_width % 3 == 0);
|
assert(dst_width % 3 == 0);
|
||||||
void (*ScaleRowDown34_0)(const uint8* src_ptr, int src_stride,
|
void (*ScaleRowDown34_0)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width);
|
uint8* dst_ptr, int dst_width);
|
||||||
void (*ScaleRowDown34_1)(const uint8* src_ptr, int src_stride,
|
void (*ScaleRowDown34_1)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width);
|
uint8* dst_ptr, int dst_width);
|
||||||
if (!filtering) {
|
if (!filtering) {
|
||||||
ScaleRowDown34_0 = ScaleRowDown34_C;
|
ScaleRowDown34_0 = ScaleRowDown34_C;
|
||||||
@ -2941,9 +2959,9 @@ static void ScalePlaneDown38(int src_width, int src_height,
|
|||||||
const uint8* src_ptr, uint8* dst_ptr,
|
const uint8* src_ptr, uint8* dst_ptr,
|
||||||
FilterMode filtering) {
|
FilterMode filtering) {
|
||||||
assert(dst_width % 3 == 0);
|
assert(dst_width % 3 == 0);
|
||||||
void (*ScaleRowDown38_3)(const uint8* src_ptr, int src_stride,
|
void (*ScaleRowDown38_3)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width);
|
uint8* dst_ptr, int dst_width);
|
||||||
void (*ScaleRowDown38_2)(const uint8* src_ptr, int src_stride,
|
void (*ScaleRowDown38_2)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width);
|
uint8* dst_ptr, int dst_width);
|
||||||
if (!filtering) {
|
if (!filtering) {
|
||||||
ScaleRowDown38_3 = ScaleRowDown38_C;
|
ScaleRowDown38_3 = ScaleRowDown38_C;
|
||||||
@ -2999,7 +3017,7 @@ static void ScalePlaneDown38(int src_width, int src_height,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static __inline uint32 SumBox(int iboxwidth, int iboxheight,
|
static __inline uint32 SumBox(int iboxwidth, int iboxheight,
|
||||||
int src_stride, const uint8* src_ptr) {
|
ptrdiff_t src_stride, const uint8* src_ptr) {
|
||||||
assert(iboxwidth > 0);
|
assert(iboxwidth > 0);
|
||||||
assert(iboxheight > 0);
|
assert(iboxheight > 0);
|
||||||
uint32 sum = 0u;
|
uint32 sum = 0u;
|
||||||
@ -3013,7 +3031,7 @@ static __inline uint32 SumBox(int iboxwidth, int iboxheight,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void ScalePlaneBoxRow_C(int dst_width, int boxheight,
|
static void ScalePlaneBoxRow_C(int dst_width, int boxheight,
|
||||||
int x, int dx, int src_stride,
|
int x, int dx, ptrdiff_t src_stride,
|
||||||
const uint8* src_ptr, uint8* dst_ptr) {
|
const uint8* src_ptr, uint8* dst_ptr) {
|
||||||
for (int i = 0; i < dst_width; ++i) {
|
for (int i = 0; i < dst_width; ++i) {
|
||||||
int ix = x >> 16;
|
int ix = x >> 16;
|
||||||
@ -3096,7 +3114,7 @@ static void ScalePlaneBox(int src_width, int src_height,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SIMD_ALIGNED(uint16 row[kMaxInputWidth]);
|
SIMD_ALIGNED(uint16 row[kMaxInputWidth]);
|
||||||
void (*ScaleAddRows)(const uint8* src_ptr, int src_stride,
|
void (*ScaleAddRows)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint16* dst_ptr, int src_width, int src_height)=
|
uint16* dst_ptr, int src_width, int src_height)=
|
||||||
ScaleAddRows_C;
|
ScaleAddRows_C;
|
||||||
void (*ScaleAddCols)(int dst_width, int boxheight, int x, int dx,
|
void (*ScaleAddCols)(int dst_width, int boxheight, int x, int dx,
|
||||||
@ -3186,7 +3204,7 @@ void ScalePlaneBilinear(int src_width, int src_height,
|
|||||||
} else {
|
} else {
|
||||||
SIMD_ALIGNED(uint8 row[kMaxInputWidth + 16]);
|
SIMD_ALIGNED(uint8 row[kMaxInputWidth + 16]);
|
||||||
void (*ScaleFilterRows)(uint8* dst_ptr, const uint8* src_ptr,
|
void (*ScaleFilterRows)(uint8* dst_ptr, const uint8* src_ptr,
|
||||||
int src_stride,
|
ptrdiff_t src_stride,
|
||||||
int dst_width, int source_y_fraction) =
|
int dst_width, int source_y_fraction) =
|
||||||
ScaleFilterRows_C;
|
ScaleFilterRows_C;
|
||||||
#if defined(HAS_SCALEFILTERROWS_NEON)
|
#if defined(HAS_SCALEFILTERROWS_NEON)
|
||||||
|
|||||||
@ -37,7 +37,7 @@ extern "C" {
|
|||||||
// Reads 8 pixels, throws half away and writes 4 even pixels (0, 2, 4, 6)
|
// Reads 8 pixels, throws half away and writes 4 even pixels (0, 2, 4, 6)
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleARGBRowDown2_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleARGBRowDown2_SSE2(const uint8* src_ptr, ptrdiff_t /* src_stride */,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
mov eax, [esp + 4] // src_ptr
|
mov eax, [esp + 4] // src_ptr
|
||||||
@ -63,7 +63,7 @@ static void ScaleARGBRowDown2_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Blends 8x2 rectangle to 4x1.
|
// Blends 8x2 rectangle to 4x1.
|
||||||
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
// Alignment requirement: src_ptr 16 byte aligned, dst_ptr 16 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleARGBRowDown2Int_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleARGBRowDown2Int_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -99,7 +99,7 @@ static void ScaleARGBRowDown2Int_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Reads 4 pixels at a time.
|
// Reads 4 pixels at a time.
|
||||||
// Alignment requirement: dst_ptr 16 byte aligned.
|
// Alignment requirement: dst_ptr 16 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
void ScaleARGBRowDownEven_SSE2(const uint8* src_ptr, int src_stride,
|
void ScaleARGBRowDownEven_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
int src_stepx,
|
int src_stepx,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
@ -137,7 +137,7 @@ void ScaleARGBRowDownEven_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Blends four 2x2 to 4x1.
|
// Blends four 2x2 to 4x1.
|
||||||
// Alignment requirement: dst_ptr 16 byte aligned.
|
// Alignment requirement: dst_ptr 16 byte aligned.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
static void ScaleARGBRowDownEvenInt_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleARGBRowDownEvenInt_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
int src_stepx,
|
int src_stepx,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
__asm {
|
__asm {
|
||||||
@ -188,7 +188,7 @@ static void ScaleARGBRowDownEvenInt_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
#define HAS_SCALEARGBFILTERROWS_SSE2_DISABLED
|
#define HAS_SCALEARGBFILTERROWS_SSE2_DISABLED
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
void ScaleARGBFilterRows_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
void ScaleARGBFilterRows_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
||||||
int src_stride, int dst_width,
|
ptrdiff_t src_stride, int dst_width,
|
||||||
int source_y_fraction) {
|
int source_y_fraction) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -276,7 +276,7 @@ void ScaleARGBFilterRows_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
|||||||
#define HAS_SCALEARGBFILTERROWS_SSSE3
|
#define HAS_SCALEARGBFILTERROWS_SSSE3
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
void ScaleARGBFilterRows_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
|
void ScaleARGBFilterRows_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
|
||||||
int src_stride, int dst_width,
|
ptrdiff_t src_stride, int dst_width,
|
||||||
int source_y_fraction) {
|
int source_y_fraction) {
|
||||||
__asm {
|
__asm {
|
||||||
push esi
|
push esi
|
||||||
@ -360,7 +360,8 @@ void ScaleARGBFilterRows_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
|
|||||||
// Generated using gcc disassembly on Visual C object file:
|
// Generated using gcc disassembly on Visual C object file:
|
||||||
// objdump -D yuvscaler.obj >yuvscaler.txt
|
// objdump -D yuvscaler.obj >yuvscaler.txt
|
||||||
#define HAS_SCALEARGBROWDOWN2_SSE2
|
#define HAS_SCALEARGBROWDOWN2_SSE2
|
||||||
static void ScaleARGBRowDown2_SSE2(const uint8* src_ptr, int ,
|
static void ScaleARGBRowDown2_SSE2(const uint8* src_ptr,
|
||||||
|
ptrdiff_t /* src_stride */,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
".p2align 4 \n"
|
".p2align 4 \n"
|
||||||
@ -384,7 +385,8 @@ static void ScaleARGBRowDown2_SSE2(const uint8* src_ptr, int ,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleARGBRowDown2Int_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleARGBRowDown2Int_SSE2(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
".p2align 4 \n"
|
".p2align 4 \n"
|
||||||
@ -418,7 +420,7 @@ static void ScaleARGBRowDown2Int_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
#define HAS_SCALEARGBROWDOWNEVEN_SSE2
|
#define HAS_SCALEARGBROWDOWNEVEN_SSE2
|
||||||
// Reads 4 pixels at a time.
|
// Reads 4 pixels at a time.
|
||||||
// Alignment requirement: dst_ptr 16 byte aligned.
|
// Alignment requirement: dst_ptr 16 byte aligned.
|
||||||
void ScaleARGBRowDownEven_SSE2(const uint8* src_ptr, int src_stride,
|
void ScaleARGBRowDownEven_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
int src_stepx,
|
int src_stepx,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
intptr_t src_stepx_x4 = static_cast<intptr_t>(src_stepx);
|
intptr_t src_stepx_x4 = static_cast<intptr_t>(src_stepx);
|
||||||
@ -455,8 +457,8 @@ void ScaleARGBRowDownEven_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
|
|
||||||
// Blends four 2x2 to 4x1.
|
// Blends four 2x2 to 4x1.
|
||||||
// Alignment requirement: dst_ptr 16 byte aligned.
|
// Alignment requirement: dst_ptr 16 byte aligned.
|
||||||
static void ScaleARGBRowDownEvenInt_SSE2(const uint8* src_ptr, int src_stride,
|
static void ScaleARGBRowDownEvenInt_SSE2(const uint8* src_ptr,
|
||||||
int src_stepx,
|
ptrdiff_t src_stride, int src_stepx,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
intptr_t src_stepx_x4 = static_cast<intptr_t>(src_stepx);
|
intptr_t src_stepx_x4 = static_cast<intptr_t>(src_stepx);
|
||||||
intptr_t src_stepx_x12 = 0;
|
intptr_t src_stepx_x12 = 0;
|
||||||
@ -505,7 +507,7 @@ static void ScaleARGBRowDownEvenInt_SSE2(const uint8* src_ptr, int src_stride,
|
|||||||
// Bilinear row filtering combines 4x2 -> 4x1. SSE2 version
|
// Bilinear row filtering combines 4x2 -> 4x1. SSE2 version
|
||||||
#define HAS_SCALEARGBFILTERROWS_SSE2_DISABLED
|
#define HAS_SCALEARGBFILTERROWS_SSE2_DISABLED
|
||||||
void ScaleARGBFilterRows_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
void ScaleARGBFilterRows_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
||||||
int src_stride, int dst_width,
|
ptrdiff_t src_stride, int dst_width,
|
||||||
int source_y_fraction) {
|
int source_y_fraction) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"sub %1,%0 \n"
|
"sub %1,%0 \n"
|
||||||
@ -577,7 +579,7 @@ void ScaleARGBFilterRows_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
|||||||
// Bilinear row filtering combines 4x2 -> 4x1. SSSE3 version
|
// Bilinear row filtering combines 4x2 -> 4x1. SSSE3 version
|
||||||
#define HAS_SCALEARGBFILTERROWS_SSSE3
|
#define HAS_SCALEARGBFILTERROWS_SSSE3
|
||||||
void ScaleARGBFilterRows_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
|
void ScaleARGBFilterRows_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
|
||||||
int src_stride, int dst_width,
|
ptrdiff_t src_stride, int dst_width,
|
||||||
int source_y_fraction) {
|
int source_y_fraction) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"sub %1,%0 \n"
|
"sub %1,%0 \n"
|
||||||
@ -643,7 +645,8 @@ void ScaleARGBFilterRows_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
|
|||||||
}
|
}
|
||||||
#endif // defined(__x86_64__) || defined(__i386__)
|
#endif // defined(__x86_64__) || defined(__i386__)
|
||||||
|
|
||||||
static void ScaleARGBRowDown2_C(const uint8* src_ptr, int,
|
static void ScaleARGBRowDown2_C(const uint8* src_ptr,
|
||||||
|
ptrdiff_t /* src_stride */,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
const uint32* src = reinterpret_cast<const uint32*>(src_ptr);
|
const uint32* src = reinterpret_cast<const uint32*>(src_ptr);
|
||||||
uint32* dst = reinterpret_cast<uint32*>(dst_ptr);
|
uint32* dst = reinterpret_cast<uint32*>(dst_ptr);
|
||||||
@ -659,7 +662,7 @@ static void ScaleARGBRowDown2_C(const uint8* src_ptr, int,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleARGBRowDown2Int_C(const uint8* src_ptr, int src_stride,
|
static void ScaleARGBRowDown2Int_C(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
for (int x = 0; x < dst_width; ++x) {
|
for (int x = 0; x < dst_width; ++x) {
|
||||||
dst_ptr[0] = (src_ptr[0] + src_ptr[4] +
|
dst_ptr[0] = (src_ptr[0] + src_ptr[4] +
|
||||||
@ -675,7 +678,7 @@ static void ScaleARGBRowDown2Int_C(const uint8* src_ptr, int src_stride,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScaleARGBRowDownEven_C(const uint8* src_ptr, int,
|
void ScaleARGBRowDownEven_C(const uint8* src_ptr, ptrdiff_t /* src_stride */,
|
||||||
int src_stepx,
|
int src_stepx,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
const uint32* src = reinterpret_cast<const uint32*>(src_ptr);
|
const uint32* src = reinterpret_cast<const uint32*>(src_ptr);
|
||||||
@ -692,7 +695,8 @@ void ScaleARGBRowDownEven_C(const uint8* src_ptr, int,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ScaleARGBRowDownEvenInt_C(const uint8* src_ptr, int src_stride,
|
static void ScaleARGBRowDownEvenInt_C(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
int src_stepx,
|
int src_stepx,
|
||||||
uint8* dst_ptr, int dst_width) {
|
uint8* dst_ptr, int dst_width) {
|
||||||
for (int x = 0; x < dst_width; ++x) {
|
for (int x = 0; x < dst_width; ++x) {
|
||||||
@ -749,7 +753,8 @@ static void ScaleARGBFilterCols_C(uint8* dst_ptr, const uint8* src_ptr,
|
|||||||
static const int kMaxInputWidth = 2560;
|
static const int kMaxInputWidth = 2560;
|
||||||
|
|
||||||
// C version 2x2 -> 2x1
|
// C version 2x2 -> 2x1
|
||||||
void ScaleARGBFilterRows_C(uint8* dst_ptr, const uint8* src_ptr, int src_stride,
|
void ScaleARGBFilterRows_C(uint8* dst_ptr, const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
int dst_width, int source_y_fraction) {
|
int dst_width, int source_y_fraction) {
|
||||||
assert(dst_width > 0);
|
assert(dst_width > 0);
|
||||||
int y1_fraction = source_y_fraction;
|
int y1_fraction = source_y_fraction;
|
||||||
@ -790,8 +795,8 @@ static void ScaleARGBDown2(int src_width, int src_height,
|
|||||||
FilterMode filtering) {
|
FilterMode filtering) {
|
||||||
assert(IS_ALIGNED(src_width, 2));
|
assert(IS_ALIGNED(src_width, 2));
|
||||||
assert(IS_ALIGNED(src_height, 2));
|
assert(IS_ALIGNED(src_height, 2));
|
||||||
void (*ScaleARGBRowDown2)(const uint8* src_ptr, int src_stride,
|
void (*ScaleARGBRowDown2)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
uint8* dst_ptr, int dst_width) =
|
uint8* dst_ptr, int dst_width) =
|
||||||
filtering ? ScaleARGBRowDown2Int_C : ScaleARGBRowDown2_C;
|
filtering ? ScaleARGBRowDown2Int_C : ScaleARGBRowDown2_C;
|
||||||
#if defined(HAS_SCALEARGBROWDOWN2_SSE2)
|
#if defined(HAS_SCALEARGBROWDOWN2_SSE2)
|
||||||
if (TestCpuFlag(kCpuHasSSE2) &&
|
if (TestCpuFlag(kCpuHasSSE2) &&
|
||||||
@ -825,7 +830,7 @@ static void ScaleARGBDownEven(int src_width, int src_height,
|
|||||||
FilterMode filtering) {
|
FilterMode filtering) {
|
||||||
assert(IS_ALIGNED(src_width, 2));
|
assert(IS_ALIGNED(src_width, 2));
|
||||||
assert(IS_ALIGNED(src_height, 2));
|
assert(IS_ALIGNED(src_height, 2));
|
||||||
void (*ScaleARGBRowDownEven)(const uint8* src_ptr, int src_stride,
|
void (*ScaleARGBRowDownEven)(const uint8* src_ptr, ptrdiff_t src_stride,
|
||||||
int src_step, uint8* dst_ptr, int dst_width) =
|
int src_step, uint8* dst_ptr, int dst_width) =
|
||||||
filtering ? ScaleARGBRowDownEvenInt_C : ScaleARGBRowDownEven_C;
|
filtering ? ScaleARGBRowDownEvenInt_C : ScaleARGBRowDownEven_C;
|
||||||
#if defined(HAS_SCALEARGBROWDOWNEVEN_SSE2)
|
#if defined(HAS_SCALEARGBROWDOWNEVEN_SSE2)
|
||||||
@ -861,7 +866,7 @@ static void ScaleARGBBilinear(int src_width, int src_height,
|
|||||||
assert(src_width <= kMaxInputWidth);
|
assert(src_width <= kMaxInputWidth);
|
||||||
SIMD_ALIGNED(uint8 row[kMaxInputWidth * 4 + 16]);
|
SIMD_ALIGNED(uint8 row[kMaxInputWidth * 4 + 16]);
|
||||||
void (*ScaleARGBFilterRows)(uint8* dst_ptr, const uint8* src_ptr,
|
void (*ScaleARGBFilterRows)(uint8* dst_ptr, const uint8* src_ptr,
|
||||||
int src_stride,
|
ptrdiff_t src_stride,
|
||||||
int dst_width, int source_y_fraction) =
|
int dst_width, int source_y_fraction) =
|
||||||
ScaleARGBFilterRows_C;
|
ScaleARGBFilterRows_C;
|
||||||
#if defined(HAS_SCALEARGBFILTERROWS_SSE2)
|
#if defined(HAS_SCALEARGBFILTERROWS_SSE2)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user