From 5cfcf2282a8f459e784b34b1fe34a1fa09208eff Mon Sep 17 00:00:00 2001 From: Zhaoliang Ma Date: Fri, 4 Dec 2020 21:34:26 +0800 Subject: [PATCH] modules/desktop_capture: replace memcpy with libyuv::CopyPlane According to our previous data from trace_event with using direct memcpy and libyuv::CopyPlane on chromebook atlas, the average cpu duration is 0.624ms and 0.541ms, so using libyuv::CopyPlane is 13.3% faster than direct memcpy. Bug: webrtc:12496 Change-Id: I1c41424b402a7eec34052c67933f2e88eaf0a8f4 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/196485 Reviewed-by: Tommi Commit-Queue: Tommi Cr-Commit-Position: refs/heads/master@{#33344} --- modules/desktop_capture/BUILD.gn | 1 + modules/desktop_capture/desktop_frame.cc | 17 +++++++---------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/modules/desktop_capture/BUILD.gn b/modules/desktop_capture/BUILD.gn index 0751441279..11e6cd3d8e 100644 --- a/modules/desktop_capture/BUILD.gn +++ b/modules/desktop_capture/BUILD.gn @@ -44,6 +44,7 @@ rtc_library("primitives") { "../../api:scoped_refptr", "../../rtc_base:checks", "../../rtc_base/system:rtc_export", + "//third_party/libyuv", ] if (!build_with_mozilla) { diff --git a/modules/desktop_capture/desktop_frame.cc b/modules/desktop_capture/desktop_frame.cc index fd10dd5d23..1d3e64892f 100644 --- a/modules/desktop_capture/desktop_frame.cc +++ b/modules/desktop_capture/desktop_frame.cc @@ -19,6 +19,7 @@ #include "modules/desktop_capture/desktop_capture_types.h" #include "modules/desktop_capture/desktop_geometry.h" #include "rtc_base/checks.h" +#include "third_party/libyuv/include/libyuv/planar_functions.h" namespace webrtc { @@ -44,11 +45,9 @@ void DesktopFrame::CopyPixelsFrom(const uint8_t* src_buffer, RTC_CHECK(DesktopRect::MakeSize(size()).ContainsRect(dest_rect)); uint8_t* dest = GetFrameDataAtPos(dest_rect.top_left()); - for (int y = 0; y < dest_rect.height(); ++y) { - memcpy(dest, src_buffer, DesktopFrame::kBytesPerPixel * dest_rect.width()); - src_buffer += src_stride; - dest += stride(); - } + libyuv::CopyPlane(src_buffer, src_stride, dest, stride(), + DesktopFrame::kBytesPerPixel * dest_rect.width(), + dest_rect.height()); } void DesktopFrame::CopyPixelsFrom(const DesktopFrame& src_frame, @@ -158,11 +157,9 @@ BasicDesktopFrame::~BasicDesktopFrame() { // static DesktopFrame* BasicDesktopFrame::CopyOf(const DesktopFrame& frame) { DesktopFrame* result = new BasicDesktopFrame(frame.size()); - for (int y = 0; y < frame.size().height(); ++y) { - memcpy(result->data() + y * result->stride(), - frame.data() + y * frame.stride(), - frame.size().width() * kBytesPerPixel); - } + libyuv::CopyPlane(result->data(), result->stride(), frame.data(), + frame.stride(), frame.size().width() * kBytesPerPixel, + frame.size().height()); result->CopyFrameInfoFrom(frame); return result; }