modules/video_processing: replace copy memory with libyuv::CopyPlane

Bug: None
Change-Id: I4c41117028a6602e8d2cb627868d015422ef0b15
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/195487
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Commit-Queue: Zhaoliang Ma <zhaoliang.ma@intel.com>
Cr-Commit-Position: refs/heads/master@{#32724}
This commit is contained in:
Zhaoliang Ma 2020-11-27 23:23:38 +08:00 committed by Commit Bot
parent b3f1e0fdb4
commit a420547865
9 changed files with 7 additions and 91 deletions

View File

@ -27,26 +27,6 @@
namespace webrtc {
TEST(VideoDenoiserTest, CopyMem) {
std::unique_ptr<DenoiserFilter> df_c(DenoiserFilter::Create(false, nullptr));
std::unique_ptr<DenoiserFilter> df_sse_neon(
DenoiserFilter::Create(true, nullptr));
uint8_t src[16 * 16], dst[16 * 16];
for (int i = 0; i < 16; ++i) {
for (int j = 0; j < 16; ++j) {
src[i * 16 + j] = i * 16 + j;
}
}
memset(dst, 0, 16 * 16);
df_c->CopyMem16x16(src, 16, dst, 16);
EXPECT_EQ(0, memcmp(src, dst, 16 * 16));
memset(dst, 0, 16 * 16);
df_sse_neon->CopyMem16x16(src, 16, dst, 16);
EXPECT_EQ(0, memcmp(src, dst, 16 * 16));
}
TEST(VideoDenoiserTest, Variance) {
std::unique_ptr<DenoiserFilter> df_c(DenoiserFilter::Create(false, nullptr));
std::unique_ptr<DenoiserFilter> df_sse_neon(

View File

@ -30,11 +30,6 @@ class DenoiserFilter {
CpuType* cpu_type);
virtual ~DenoiserFilter() {}
virtual void CopyMem16x16(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride) = 0;
virtual uint32_t Variance16x8(const uint8_t* a,
int a_stride,
const uint8_t* b,

View File

@ -15,17 +15,6 @@
namespace webrtc {
void DenoiserFilterC::CopyMem16x16(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride) {
for (int i = 0; i < 16; i++) {
memcpy(dst, src, 16);
src += src_stride;
dst += dst_stride;
}
}
uint32_t DenoiserFilterC::Variance16x8(const uint8_t* a,
int a_stride,
const uint8_t* b,

View File

@ -20,10 +20,6 @@ namespace webrtc {
class DenoiserFilterC : public DenoiserFilter {
public:
DenoiserFilterC() {}
void CopyMem16x16(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride) override;
uint32_t Variance16x8(const uint8_t* a,
int a_stride,
const uint8_t* b,

View File

@ -64,19 +64,6 @@ static void VarianceNeonW8(const uint8_t* a,
static_cast<uint32_t>(HorizontalAddS32x4(vaddq_s32(v_sse_lo, v_sse_hi)));
}
void DenoiserFilterNEON::CopyMem16x16(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride) {
uint8x16_t qtmp;
for (int r = 0; r < 16; r++) {
qtmp = vld1q_u8(src);
vst1q_u8(dst, qtmp);
src += src_stride;
dst += dst_stride;
}
}
uint32_t DenoiserFilterNEON::Variance16x8(const uint8_t* a,
int a_stride,
const uint8_t* b,

View File

@ -18,10 +18,6 @@ namespace webrtc {
class DenoiserFilterNEON : public DenoiserFilter {
public:
DenoiserFilterNEON() {}
void CopyMem16x16(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride) override;
uint32_t Variance16x8(const uint8_t* a,
int a_stride,
const uint8_t* b,

View File

@ -100,18 +100,6 @@ static uint32_t AbsSumDiff16x1(__m128i acc_diff) {
return sum_diff;
}
// TODO(jackychen): Optimize this function using SSE2.
void DenoiserFilterSSE2::CopyMem16x16(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride) {
for (int i = 0; i < 16; i++) {
memcpy(dst, src, 16);
src += src_stride;
dst += dst_stride;
}
}
uint32_t DenoiserFilterSSE2::Variance16x8(const uint8_t* src,
int src_stride,
const uint8_t* ref,

View File

@ -20,10 +20,6 @@ namespace webrtc {
class DenoiserFilterSSE2 : public DenoiserFilter {
public:
DenoiserFilterSSE2() {}
void CopyMem16x16(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride) override;
uint32_t Variance16x8(const uint8_t* a,
int a_stride,
const uint8_t* b,

View File

@ -19,17 +19,6 @@
namespace webrtc {
#if DISPLAY || DISPLAYNEON
static void CopyMem8x8(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride) {
for (int i = 0; i < 8; i++) {
memcpy(dst, src, 8);
src += src_stride;
dst += dst_stride;
}
}
static void ShowRect(const std::unique_ptr<DenoiserFilter>& filter,
const std::unique_ptr<uint8_t[]>& d_status,
const std::unique_ptr<uint8_t[]>& moving_edge_red,
@ -58,16 +47,16 @@ static void ShowRect(const std::unique_ptr<DenoiserFilter>& filter,
memset(uv_tmp, 200, 8 * 8);
if (d_status[mb_index] == 1) {
// Paint to red.
CopyMem8x8(mb_src_u, stride_u_src, mb_dst_u, stride_u_dst);
CopyMem8x8(uv_tmp, 8, mb_dst_v, stride_v_dst);
libyuv::CopyPlane(mb_src_u, stride_u_src, mb_dst_u, stride_u_dst, 8, 8);
libyuv::CopyPlane(uv_tmp, 8, mb_dst_v, stride_v_dst, 8, 8);
} else if (moving_edge_red[mb_row * mb_cols_ + mb_col] &&
x_density[mb_col] * y_density[mb_row]) {
// Paint to blue.
CopyMem8x8(uv_tmp, 8, mb_dst_u, stride_u_dst);
CopyMem8x8(mb_src_v, stride_v_src, mb_dst_v, stride_v_dst);
libyuv::CopyPlane(uv_tmp, 8, mb_dst_u, stride_u_dst, 8, 8);
libyuv::CopyPlane(mb_src_v, stride_v_src, mb_dst_v, stride_v_dst, 8, 8);
} else {
CopyMem8x8(mb_src_u, stride_u_src, mb_dst_u, stride_u_dst);
CopyMem8x8(mb_src_v, stride_v_src, mb_dst_v, stride_v_dst);
libyuv::CopyPlane(mb_src_u, stride_u_src, mb_dst_u, stride_u_dst, 8, 8);
libyuv::CopyPlane(mb_src_v, stride_v_src, mb_dst_v, stride_v_dst, 8, 8);
}
}
}
@ -194,7 +183,7 @@ void VideoDenoiser::CopySrcOnMOB(const uint8_t* y_src,
(x_density_[mb_col] * y_density_[mb_row] &&
moving_object_[mb_row * mb_cols_ + mb_col])) {
// Copy y source.
filter_->CopyMem16x16(mb_src, stride_src, mb_dst, stride_dst);
libyuv::CopyPlane(mb_src, stride_src, mb_dst, stride_dst, 16, 16);
}
}
}