From e17aad2c1d18a9664e2578e04c771ffd8d0b3162 Mon Sep 17 00:00:00 2001 From: Sergio Garcia Murillo Date: Wed, 2 Oct 2024 14:03:08 +0200 Subject: [PATCH] Use rtc::Buffer for memory storage of EncodedImageBuffer The goal is to be able to write the rtc::Buffer by another utility (like rtc::ByteBufferWriter) and pass it into EncodedImageBuffer without memcpy. Bug: webrtc:42223344 Change-Id: Ieda55e77a36636e8cdff6ad6b7d078de0aeafec0 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/364243 Reviewed-by: Harald Alvestrand Reviewed-by: Danil Chapovalov Commit-Queue: Danil Chapovalov Cr-Commit-Position: refs/heads/main@{#43179} --- api/video/BUILD.gn | 1 + api/video/DEPS | 1 + api/video/encoded_image.cc | 41 +++++++++----------- api/video/encoded_image.h | 15 +++---- sdk/objc/unittests/RTCEncodedImage_xctest.mm | 4 +- 5 files changed, 30 insertions(+), 32 deletions(-) diff --git a/api/video/BUILD.gn b/api/video/BUILD.gn index 866757e440..106140e22f 100644 --- a/api/video/BUILD.gn +++ b/api/video/BUILD.gn @@ -158,6 +158,7 @@ rtc_library("encoded_image") { "..:refcountedbase", "..:rtp_packet_info", "..:scoped_refptr", + "../../rtc_base:buffer", "../../rtc_base:checks", "../../rtc_base:refcount", "../../rtc_base/system:rtc_export", diff --git a/api/video/DEPS b/api/video/DEPS index 1dd2943d1f..3fdcf0b434 100644 --- a/api/video/DEPS +++ b/api/video/DEPS @@ -5,6 +5,7 @@ specific_include_rules = { "+modules/video_coding/include/video_coding_defines.h", ], "encoded_image\.h" : [ + "+rtc_base/buffer.h", "+rtc_base/ref_count.h", ], diff --git a/api/video/encoded_image.cc b/api/video/encoded_image.cc index 3e6fa549f0..f6f8816204 100644 --- a/api/video/encoded_image.cc +++ b/api/video/encoded_image.cc @@ -19,52 +19,47 @@ #include "api/make_ref_counted.h" #include "api/scoped_refptr.h" #include "api/units/timestamp.h" +#include "rtc_base/buffer.h" #include "rtc_base/checks.h" namespace webrtc { -EncodedImageBuffer::EncodedImageBuffer(size_t size) : size_(size) { - buffer_ = static_cast(malloc(size)); -} +EncodedImageBuffer::EncodedImageBuffer(size_t size) : buffer_(size) {} EncodedImageBuffer::EncodedImageBuffer(const uint8_t* data, size_t size) - : EncodedImageBuffer(size) { - std::copy_n(data, size, buffer_); -} + : buffer_(data, size) {} -EncodedImageBuffer::~EncodedImageBuffer() { - free(buffer_); -} +EncodedImageBuffer::EncodedImageBuffer(rtc::Buffer buffer) + : buffer_(std::move(buffer)) {} // static -rtc::scoped_refptr EncodedImageBuffer::Create(size_t size) { - return rtc::make_ref_counted(size); +scoped_refptr EncodedImageBuffer::Create(size_t size) { + return make_ref_counted(size); } // static -rtc::scoped_refptr EncodedImageBuffer::Create( +scoped_refptr EncodedImageBuffer::Create( const uint8_t* data, size_t size) { - return rtc::make_ref_counted(data, size); + return make_ref_counted(data, size); +} +// static +scoped_refptr EncodedImageBuffer::Create( + rtc::Buffer buffer) { + return make_ref_counted(std::move(buffer)); } const uint8_t* EncodedImageBuffer::data() const { - return buffer_; + return buffer_.data(); } uint8_t* EncodedImageBuffer::data() { - return buffer_; + return buffer_.data(); } size_t EncodedImageBuffer::size() const { - return size_; + return buffer_.size(); } void EncodedImageBuffer::Realloc(size_t size) { - // Calling realloc with size == 0 is equivalent to free, and returns nullptr. - // Which is confusing on systems where malloc(0) doesn't return a nullptr. - // More specifically, it breaks expectations of - // VCMSessionInfo::UpdateDataPointers. - RTC_DCHECK(size > 0); - buffer_ = static_cast(realloc(buffer_, size)); - size_ = size; + buffer_.SetSize(size); } EncodedImage::EncodedImage() = default; diff --git a/api/video/encoded_image.h b/api/video/encoded_image.h index a9147e13b7..ffe6dbe34c 100644 --- a/api/video/encoded_image.h +++ b/api/video/encoded_image.h @@ -28,6 +28,7 @@ #include "api/video/video_frame_type.h" #include "api/video/video_rotation.h" #include "api/video/video_timing.h" +#include "rtc_base/buffer.h" #include "rtc_base/checks.h" #include "rtc_base/system/rtc_export.h" @@ -51,10 +52,11 @@ class EncodedImageBufferInterface : public RefCountInterface { // Basic implementation of EncodedImageBufferInterface. class RTC_EXPORT EncodedImageBuffer : public EncodedImageBufferInterface { public: - static rtc::scoped_refptr Create() { return Create(0); } - static rtc::scoped_refptr Create(size_t size); - static rtc::scoped_refptr Create(const uint8_t* data, - size_t size); + static scoped_refptr Create() { return Create(0); } + static scoped_refptr Create(size_t size); + static scoped_refptr Create(const uint8_t* data, + size_t size); + static scoped_refptr Create(rtc::Buffer buffer); const uint8_t* data() const override; uint8_t* data() override; @@ -64,10 +66,9 @@ class RTC_EXPORT EncodedImageBuffer : public EncodedImageBufferInterface { protected: explicit EncodedImageBuffer(size_t size); EncodedImageBuffer(const uint8_t* data, size_t size); - ~EncodedImageBuffer(); + explicit EncodedImageBuffer(rtc::Buffer buffer); - size_t size_; - uint8_t* buffer_; + rtc::Buffer buffer_; }; // TODO(bug.webrtc.org/9378): This is a legacy api class, which is slowly being diff --git a/sdk/objc/unittests/RTCEncodedImage_xctest.mm b/sdk/objc/unittests/RTCEncodedImage_xctest.mm index 84804fee87..389e765e83 100644 --- a/sdk/objc/unittests/RTCEncodedImage_xctest.mm +++ b/sdk/objc/unittests/RTCEncodedImage_xctest.mm @@ -18,7 +18,7 @@ @implementation RTCEncodedImageTests - (void)testInitializedWithNativeEncodedImage { - const auto encoded_data = webrtc::EncodedImageBuffer::Create(); + const auto encoded_data = webrtc::EncodedImageBuffer::Create(1); webrtc::EncodedImage encoded_image; encoded_image.SetEncodedData(encoded_data); @@ -41,7 +41,7 @@ - (void)testRetainsNativeEncodedImage { RTC_OBJC_TYPE(RTCEncodedImage) * encodedImage; { - const auto encoded_data = webrtc::EncodedImageBuffer::Create(); + const auto encoded_data = webrtc::EncodedImageBuffer::Create(1); webrtc::EncodedImage encoded_image; encoded_image.SetEncodedData(encoded_data); encodedImage =