summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Bankoski <jimbankoski@google.com>2016-07-15 08:27:34 -0700
committerJim Bankoski <jimbankoski@google.com>2016-07-15 08:27:34 -0700
commit0dc69c70f70bb320101064fa0dc0643e3d266f57 (patch)
tree0e809b8bb0bbdb227fd2a4cad3954e3730f25590
parent7eec1f31b50e05f6fe06bccda8db08d75a6ff0f2 (diff)
downloadlibvpx-0dc69c70f70bb320101064fa0dc0643e3d266f57.tar
libvpx-0dc69c70f70bb320101064fa0dc0643e3d266f57.tar.gz
libvpx-0dc69c70f70bb320101064fa0dc0643e3d266f57.tar.bz2
libvpx-0dc69c70f70bb320101064fa0dc0643e3d266f57.zip
postproc : fix function parameters for noise functions.
Change-Id: I582b6307f28bfc987dcf8910379a52c6f679173c
-rw-r--r--test/add_noise_test.cc66
-rw-r--r--vp8/common/postproc.c18
-rw-r--r--vp8/common/postproc.h6
-rw-r--r--vp9/common/vp9_postproc.c18
-rw-r--r--vp9/common/vp9_postproc.h6
-rw-r--r--vpx_dsp/add_noise.c19
-rw-r--r--vpx_dsp/mips/add_noise_msa.c15
-rw-r--r--vpx_dsp/postproc.h2
-rw-r--r--vpx_dsp/vpx_dsp_rtcd_defs.pl2
-rw-r--r--vpx_dsp/x86/add_noise_sse2.asm41
10 files changed, 78 insertions, 115 deletions
diff --git a/test/add_noise_test.cc b/test/add_noise_test.cc
index 35aaadfa7..271ce340e 100644
--- a/test/add_noise_test.cc
+++ b/test/add_noise_test.cc
@@ -18,11 +18,12 @@
namespace {
+static const int kNoiseSize = 3072;
+
// TODO(jimbankoski): make width and height integers not unsigned.
-typedef void (*AddNoiseFunc)(unsigned char *start, char *noise,
- char blackclamp[16], char whiteclamp[16],
- char bothclamp[16], unsigned int width,
- unsigned int height, int pitch);
+typedef void (*AddNoiseFunc)(uint8_t *start, const int8_t *noise,
+ int blackclamp, int whiteclamp,
+ int width, int height, int pitch);
class AddNoiseTest
: public ::testing::TestWithParam<AddNoiseFunc> {
@@ -42,26 +43,18 @@ double stddev6(char a, char b, char c, char d, char e, char f) {
}
TEST_P(AddNoiseTest, CheckNoiseAdded) {
- DECLARE_ALIGNED(16, char, blackclamp[16]);
- DECLARE_ALIGNED(16, char, whiteclamp[16]);
- DECLARE_ALIGNED(16, char, bothclamp[16]);
const int width = 64;
const int height = 64;
const int image_size = width * height;
- char noise[3072];
- const int clamp = vpx_setup_noise(4.4, sizeof(noise), noise);
-
- for (int i = 0; i < 16; i++) {
- blackclamp[i] = clamp;
- whiteclamp[i] = clamp;
- bothclamp[i] = 2 * clamp;
- }
+ int8_t noise[kNoiseSize];
+ const int clamp = vpx_setup_noise(4.4, noise, kNoiseSize);
+ uint8_t *const s = reinterpret_cast<uint8_t *>(vpx_calloc(image_size,
+ sizeof(*s)));
+ ASSERT_TRUE(s != NULL);
+ memset(s, 99, image_size * sizeof(*s));
- uint8_t *const s = reinterpret_cast<uint8_t *>(vpx_calloc(image_size, 1));
- memset(s, 99, image_size);
-
- ASM_REGISTER_STATE_CHECK(GetParam()(s, noise, blackclamp, whiteclamp,
- bothclamp, width, height, width));
+ ASM_REGISTER_STATE_CHECK(GetParam()(s, noise, clamp, clamp,
+ width, height, width));
// Check to make sure we don't end up having either the same or no added
// noise either vertically or horizontally.
@@ -79,8 +72,8 @@ TEST_P(AddNoiseTest, CheckNoiseAdded) {
// Initialize pixels in the image to 255 and check for roll over.
memset(s, 255, image_size);
- ASM_REGISTER_STATE_CHECK(GetParam()(s, noise, blackclamp, whiteclamp,
- bothclamp, width, height, width));
+ ASM_REGISTER_STATE_CHECK(GetParam()(s, noise, clamp, clamp,
+ width, height, width));
// Check to make sure don't roll over.
for (int i = 0; i < image_size; ++i) {
@@ -90,8 +83,8 @@ TEST_P(AddNoiseTest, CheckNoiseAdded) {
// Initialize pixels in the image to 0 and check for roll under.
memset(s, 0, image_size);
- ASM_REGISTER_STATE_CHECK(GetParam()(s, noise, blackclamp, whiteclamp,
- bothclamp, width, height, width));
+ ASM_REGISTER_STATE_CHECK(GetParam()(s, noise, clamp, clamp,
+ width, height, width));
// Check to make sure don't roll under.
for (int i = 0; i < image_size; ++i) {
@@ -102,35 +95,26 @@ TEST_P(AddNoiseTest, CheckNoiseAdded) {
}
TEST_P(AddNoiseTest, CheckCvsAssembly) {
- DECLARE_ALIGNED(16, char, blackclamp[16]);
- DECLARE_ALIGNED(16, char, whiteclamp[16]);
- DECLARE_ALIGNED(16, char, bothclamp[16]);
const int width = 64;
const int height = 64;
const int image_size = width * height;
- char noise[3072];
-
- const int clamp = vpx_setup_noise(4.4, sizeof(noise), noise);
-
- for (int i = 0; i < 16; i++) {
- blackclamp[i] = clamp;
- whiteclamp[i] = clamp;
- bothclamp[i] = 2 * clamp;
- }
+ int8_t noise[kNoiseSize];
+ const int clamp = vpx_setup_noise(4.4, noise, kNoiseSize);
uint8_t *const s = reinterpret_cast<uint8_t *>(vpx_calloc(image_size, 1));
uint8_t *const d = reinterpret_cast<uint8_t *>(vpx_calloc(image_size, 1));
+ ASSERT_TRUE(s != NULL);
+ ASSERT_TRUE(d != NULL);
memset(s, 99, image_size);
memset(d, 99, image_size);
srand(0);
- ASM_REGISTER_STATE_CHECK(GetParam()(s, noise, blackclamp, whiteclamp,
- bothclamp, width, height, width));
+ ASM_REGISTER_STATE_CHECK(
+ GetParam()(s, noise, clamp, clamp, width, height, width));
srand(0);
- ASM_REGISTER_STATE_CHECK(vpx_plane_add_noise_c(d, noise, blackclamp,
- whiteclamp, bothclamp,
- width, height, width));
+ ASM_REGISTER_STATE_CHECK(
+ vpx_plane_add_noise_c(d, noise, clamp, clamp, width, height, width));
for (int i = 0; i < image_size; ++i) {
EXPECT_EQ(static_cast<int>(s[i]), static_cast<int>(d[i])) << "i = " << i;
diff --git a/vp8/common/postproc.c b/vp8/common/postproc.c
index 05e2bfc60..5468f2441 100644
--- a/vp8/common/postproc.c
+++ b/vp8/common/postproc.c
@@ -491,19 +491,12 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t
|| oci->postproc_state.last_noise != noise_level)
{
double sigma;
- int clamp, i;
struct postproc_state *ppstate = &oci->postproc_state;
vp8_clear_system_state();
sigma = noise_level + .5 + .6 * q / 63.0;
- clamp = vpx_setup_noise(sigma, sizeof(ppstate->noise),
- ppstate->noise);
- for (i = 0; i < 16; i++)
- {
- ppstate->blackclamp[i] = clamp;
- ppstate->whiteclamp[i] = clamp;
- ppstate->bothclamp[i] = 2 * clamp;
- }
-
+ oci->postproc_state.clamp = vpx_setup_noise(sigma,
+ ppstate->noise,
+ sizeof(ppstate->noise));
ppstate->last_q = q;
ppstate->last_noise = noise_level;
}
@@ -511,9 +504,8 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t
vpx_plane_add_noise
(oci->post_proc_buffer.y_buffer,
oci->postproc_state.noise,
- oci->postproc_state.blackclamp,
- oci->postproc_state.whiteclamp,
- oci->postproc_state.bothclamp,
+ oci->postproc_state.clamp,
+ oci->postproc_state.clamp,
oci->post_proc_buffer.y_width, oci->post_proc_buffer.y_height,
oci->post_proc_buffer.y_stride);
}
diff --git a/vp8/common/postproc.h b/vp8/common/postproc.h
index 0fa12a7c6..77c4a047d 100644
--- a/vp8/common/postproc.h
+++ b/vp8/common/postproc.h
@@ -17,12 +17,10 @@ struct postproc_state
{
int last_q;
int last_noise;
- char noise[3072];
+ int8_t noise[3072];
int last_base_qindex;
int last_frame_valid;
- DECLARE_ALIGNED(16, char, blackclamp[16]);
- DECLARE_ALIGNED(16, char, whiteclamp[16]);
- DECLARE_ALIGNED(16, char, bothclamp[16]);
+ int clamp;
};
#include "onyxc_int.h"
#include "ppflags.h"
diff --git a/vp9/common/vp9_postproc.c b/vp9/common/vp9_postproc.c
index 15f6e2c00..6adaf04d7 100644
--- a/vp9/common/vp9_postproc.c
+++ b/vp9/common/vp9_postproc.c
@@ -412,29 +412,21 @@ int vp9_post_proc_frame(struct VP9Common *cm,
ppstate->last_base_qindex = cm->base_qindex;
ppstate->last_frame_valid = 1;
-
if (flags & VP9D_ADDNOISE) {
const int noise_level = ppflags->noise_level;
if (ppstate->last_q != q ||
ppstate->last_noise != noise_level) {
double sigma;
- int clamp, i;
vpx_clear_system_state();
sigma = noise_level + .5 + .6 * q / 63.0;
- clamp = vpx_setup_noise(sigma, sizeof(ppstate->noise),
- ppstate->noise);
-
- for (i = 0; i < 16; i++) {
- ppstate->blackclamp[i] = clamp;
- ppstate->whiteclamp[i] = clamp;
- ppstate->bothclamp[i] = 2 * clamp;
- }
+ ppstate->clamp = vpx_setup_noise(sigma, ppstate->noise,
+ sizeof(ppstate->noise));
ppstate->last_q = q;
ppstate->last_noise = noise_level;
}
- vpx_plane_add_noise(ppbuf->y_buffer, ppstate->noise, ppstate->blackclamp,
- ppstate->whiteclamp, ppstate->bothclamp,
- ppbuf->y_width, ppbuf->y_height, ppbuf->y_stride);
+ vpx_plane_add_noise(ppbuf->y_buffer, ppstate->noise, ppstate->clamp,
+ ppstate->clamp, ppbuf->y_width, ppbuf->y_height,
+ ppbuf->y_stride);
}
*dest = *ppbuf;
diff --git a/vp9/common/vp9_postproc.h b/vp9/common/vp9_postproc.h
index 60e6f5232..5a4eb8d2c 100644
--- a/vp9/common/vp9_postproc.h
+++ b/vp9/common/vp9_postproc.h
@@ -25,14 +25,12 @@ extern "C" {
struct postproc_state {
int last_q;
int last_noise;
- char noise[3072];
+ int8_t noise[3072];
int last_base_qindex;
int last_frame_valid;
MODE_INFO *prev_mip;
MODE_INFO *prev_mi;
- DECLARE_ALIGNED(16, char, blackclamp[16]);
- DECLARE_ALIGNED(16, char, whiteclamp[16]);
- DECLARE_ALIGNED(16, char, bothclamp[16]);
+ int clamp;
uint8_t *limits;
};
diff --git a/vpx_dsp/add_noise.c b/vpx_dsp/add_noise.c
index 4ae67a813..4808e79d2 100644
--- a/vpx_dsp/add_noise.c
+++ b/vpx_dsp/add_noise.c
@@ -17,23 +17,20 @@
#include "vpx/vpx_integer.h"
#include "vpx_ports/mem.h"
-void vpx_plane_add_noise_c(uint8_t *start, char *noise,
- char blackclamp[16],
- char whiteclamp[16],
- char bothclamp[16],
- unsigned int width, unsigned int height, int pitch) {
+void vpx_plane_add_noise_c(uint8_t *start, const int8_t *noise, int blackclamp,
+ int whiteclamp, int width, int height, int pitch) {
unsigned int i, j;
-
+ int bothclamp = blackclamp + whiteclamp;
for (i = 0; i < height; ++i) {
uint8_t *pos = start + i * pitch;
- char *ref = (char *)(noise + (rand() & 0xff)); // NOLINT
+ const int8_t *ref = (const int8_t *)(noise + (rand() & 0xff)); // NOLINT
for (j = 0; j < width; ++j) {
int v = pos[j];
- v = clamp(v - blackclamp[0], 0, 255);
- v = clamp(v + bothclamp[0], 0, 255);
- v = clamp(v - whiteclamp[0], 0, 255);
+ v = clamp(v - blackclamp, 0, 255);
+ v = clamp(v + bothclamp, 0, 255);
+ v = clamp(v - whiteclamp, 0, 255);
pos[j] = v + ref[j];
}
@@ -45,7 +42,7 @@ static double gaussian(double sigma, double mu, double x) {
(exp(-(x - mu) * (x - mu) / (2 * sigma * sigma)));
}
-int vpx_setup_noise(double sigma, int size, char *noise) {
+int vpx_setup_noise(double sigma, int8_t *noise, int size) {
char char_dist[256];
int next = 0, i, j;
diff --git a/vpx_dsp/mips/add_noise_msa.c b/vpx_dsp/mips/add_noise_msa.c
index 366770c0d..c66c93c58 100644
--- a/vpx_dsp/mips/add_noise_msa.c
+++ b/vpx_dsp/mips/add_noise_msa.c
@@ -11,17 +11,16 @@
#include <stdlib.h>
#include "./macros_msa.h"
-void vpx_plane_add_noise_msa(uint8_t *start_ptr, char *noise,
- char blackclamp[16], char whiteclamp[16],
- char bothclamp[16], uint32_t width,
- uint32_t height, int32_t pitch) {
+void vpx_plane_add_noise_msa(uint8_t *start_ptr, const int8_t *noise,
+ int blackclamp, int whiteclamp,
+ int width, int height, int32_t pitch) {
uint32_t i, j;
for (i = 0; i < height / 2; ++i) {
uint8_t *pos0_ptr = start_ptr + (2 * i) * pitch;
- int8_t *ref0_ptr = (int8_t *)(noise + (rand() & 0xff));
+ const int8_t *ref0_ptr = noise + (rand() & 0xff);
uint8_t *pos1_ptr = start_ptr + (2 * i + 1) * pitch;
- int8_t *ref1_ptr = (int8_t *)(noise + (rand() & 0xff));
+ const int8_t *ref1_ptr = noise + (rand() & 0xff);
for (j = width / 16; j--;) {
v16i8 temp00_s, temp01_s;
v16u8 temp00, temp01, black_clamp, white_clamp;
@@ -32,8 +31,8 @@ void vpx_plane_add_noise_msa(uint8_t *start_ptr, char *noise,
ref0 = LD_UB(ref0_ptr);
pos1 = LD_UB(pos1_ptr);
ref1 = LD_UB(ref1_ptr);
- black_clamp = (v16u8)__msa_fill_b(blackclamp[0]);
- white_clamp = (v16u8)__msa_fill_b(whiteclamp[0]);
+ black_clamp = (v16u8)__msa_fill_b(blackclamp);
+ white_clamp = (v16u8)__msa_fill_b(whiteclamp);
temp00 = (pos0 < black_clamp);
pos0 = __msa_bmnz_v(pos0, black_clamp, temp00);
temp01 = (pos1 < black_clamp);
diff --git a/vpx_dsp/postproc.h b/vpx_dsp/postproc.h
index 78d11b186..43cb5c8e8 100644
--- a/vpx_dsp/postproc.h
+++ b/vpx_dsp/postproc.h
@@ -16,7 +16,7 @@ extern "C" {
#endif
// Fills a noise buffer with gaussian noise strength determined by sigma.
-int vpx_setup_noise(double sigma, int size, char *noise);
+int vpx_setup_noise(double sigma, int8_t *noise, int size);
#ifdef __cplusplus
}
diff --git a/vpx_dsp/vpx_dsp_rtcd_defs.pl b/vpx_dsp/vpx_dsp_rtcd_defs.pl
index 8736e4698..4d6e97582 100644
--- a/vpx_dsp/vpx_dsp_rtcd_defs.pl
+++ b/vpx_dsp/vpx_dsp_rtcd_defs.pl
@@ -1892,7 +1892,7 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
# Post Processing
#
if (vpx_config("CONFIG_POSTPROC") eq "yes" || vpx_config("CONFIG_VP9_POSTPROC") eq "yes") {
- add_proto qw/void vpx_plane_add_noise/, "uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch";
+ add_proto qw/void vpx_plane_add_noise/, "uint8_t *start, const int8_t *noise, int blackclamp, int whiteclamp, int width, int height, int pitch";
specialize qw/vpx_plane_add_noise sse2 msa/;
add_proto qw/void vpx_mbpost_proc_down/, "unsigned char *dst, int pitch, int rows, int cols,int flimit";
diff --git a/vpx_dsp/x86/add_noise_sse2.asm b/vpx_dsp/x86/add_noise_sse2.asm
index ff61b19ba..f758da22d 100644
--- a/vpx_dsp/x86/add_noise_sse2.asm
+++ b/vpx_dsp/x86/add_noise_sse2.asm
@@ -11,29 +11,32 @@
%include "vpx_ports/x86_abi_support.asm"
-;void vpx_plane_add_noise_sse2(unsigned char *start, unsigned char *noise,
-; unsigned char blackclamp[16],
-; unsigned char whiteclamp[16],
-; unsigned char bothclamp[16],
-; unsigned int width, unsigned int height,
-; int pitch)
+;void vpx_plane_add_noise_sse2(uint8_t *start, const int8_t *noise,
+; int blackclamp, int whiteclamp,
+; int width, int height, int pitch)
global sym(vpx_plane_add_noise_sse2) PRIVATE
sym(vpx_plane_add_noise_sse2):
push rbp
mov rbp, rsp
- SHADOW_ARGS_TO_STACK 8
+ SHADOW_ARGS_TO_STACK 7
GET_GOT rbx
push rsi
push rdi
- ; end prolog
- ; get the clamps in registers
- mov rdx, arg(2) ; blackclamp
- movdqu xmm3, [rdx]
- mov rdx, arg(3) ; whiteclamp
- movdqu xmm4, [rdx]
- mov rdx, arg(4) ; bothclamp
- movdqu xmm5, [rdx]
+ mov rdx, 0x01010101
+ mov rax, arg(2)
+ mul rdx
+ movd xmm3, rax
+ pshufd xmm3, xmm3, 0 ; xmm3 is 16 copies of char in blackclamp
+
+ mov rdx, 0x01010101
+ mov rax, arg(3)
+ mul rdx
+ movd xmm4, rax
+ pshufd xmm4, xmm4, 0 ; xmm4 is 16 copies of char in whiteclamp
+
+ movdqu xmm5, xmm3 ; both clamp = black clamp + white clamp
+ paddusb xmm5, xmm4
.addnoise_loop:
call sym(LIBVPX_RAND) WRT_PLT
@@ -42,9 +45,9 @@ sym(vpx_plane_add_noise_sse2):
add rcx, rax
mov rdi, rcx
- movsxd rcx, dword arg(5) ;[Width]
+ movsxd rcx, dword arg(4) ;[Width]
mov rsi, arg(0) ;Pos
- xor rax,rax
+ xor rax, rax
.addnoise_nextset:
movdqu xmm1,[rsi+rax] ; get the source
@@ -62,9 +65,9 @@ sym(vpx_plane_add_noise_sse2):
cmp rax, rcx
jl .addnoise_nextset
- movsxd rax, dword arg(7) ; Pitch
+ movsxd rax, dword arg(6) ; Pitch
add arg(0), rax ; Start += Pitch
- sub dword arg(6), 1 ; Height -= 1
+ sub dword arg(5), 1 ; Height -= 1
jg .addnoise_loop
; begin epilog