Discourage use of non-const EncodedImageBufferInterface::data
Update webrtc to work when such non-const accessor is absent,
Remove override of it in WebRTC classes, add a default implementation
so that downstream code can stop overriding it too.
Bug: webrtc:42234570
Change-Id: Iced9fca652f0385742cc4ee9310db78cf55aca71
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/404020
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45377}
diff --git a/api/video/encoded_image.h b/api/video/encoded_image.h
index 095c4ff..0510682 100644
--- a/api/video/encoded_image.h
+++ b/api/video/encoded_image.h
@@ -43,9 +43,13 @@
using value_type = uint8_t;
virtual const uint8_t* data() const = 0;
- // TODO(bugs.webrtc.org/9378): Make interface essentially read-only, delete
- // this non-const data method.
- virtual uint8_t* data() = 0;
+ // TODO: bugs.webrtc.org/42234570 - Make interface essentially read-only,
+ // delete this non-const data method when an implementation in chromium is
+ // updated not to override it.
+ virtual uint8_t* data() {
+ return const_cast<uint8_t*>(
+ static_cast<const EncodedImageBufferInterface*>(this)->data());
+ }
virtual size_t size() const = 0;
const uint8_t* begin() const { return data(); }
diff --git a/api/video/rtp_video_frame_assembler_unittests.cc b/api/video/rtp_video_frame_assembler_unittests.cc
index 1ac5fe5..5db9d06 100644
--- a/api/video/rtp_video_frame_assembler_unittests.cc
+++ b/api/video/rtp_video_frame_assembler_unittests.cc
@@ -139,8 +139,8 @@
return MakeArrayView(frame->references, frame->num_references);
}
-ArrayView<uint8_t> Payload(const std::unique_ptr<EncodedFrame>& frame) {
- return ArrayView<uint8_t>(*frame->GetEncodedData());
+ArrayView<const uint8_t> Payload(const std::unique_ptr<EncodedFrame>& frame) {
+ return *frame->GetEncodedData();
}
TEST(RtpVideoFrameAssembler, Vp8Packetization) {
diff --git a/api/video/rtp_video_frame_h265_assembler_unittests.cc b/api/video/rtp_video_frame_h265_assembler_unittests.cc
index 5fb8be4..510e41f 100644
--- a/api/video/rtp_video_frame_h265_assembler_unittests.cc
+++ b/api/video/rtp_video_frame_h265_assembler_unittests.cc
@@ -107,8 +107,8 @@
return MakeArrayView(frame->references, frame->num_references);
}
-ArrayView<uint8_t> Payload(const std::unique_ptr<EncodedFrame>& frame) {
- return ArrayView<uint8_t>(*frame->GetEncodedData());
+ArrayView<const uint8_t> Payload(const std::unique_ptr<EncodedFrame>& frame) {
+ return *frame->GetEncodedData();
}
TEST(RtpVideoFrameH265Assembler, H265Packetization) {
diff --git a/sdk/android/src/jni/encoded_image.cc b/sdk/android/src/jni/encoded_image.cc
index e38b445..7e21c04 100644
--- a/sdk/android/src/jni/encoded_image.cc
+++ b/sdk/android/src/jni/encoded_image.cc
@@ -39,19 +39,17 @@
const uint8_t* payload,
size_t size)
: j_encoded_image_(ScopedJavaRefCounted::Retain(env, j_encoded_image)),
- data_(const_cast<uint8_t*>(payload)),
+ data_(payload),
size_(size) {}
const uint8_t* data() const override { return data_; }
- uint8_t* data() override { return data_; }
size_t size() const override { return size_; }
private:
// The Java object owning the buffer.
const ScopedJavaRefCounted j_encoded_image_;
- // TODO(bugs.webrtc.org/9378): Make const, and delete above const_cast.
- uint8_t* const data_;
+ const uint8_t* const data_;
size_t const size_;
};
} // namespace
diff --git a/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm b/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
index 6ff8dd8..def99ea 100644
--- a/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
+++ b/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
@@ -25,10 +25,6 @@
const uint8_t *data() const override {
return static_cast<const uint8_t *>(data_.bytes);
}
- // TODO(bugs.webrtc.org/9378): delete this non-const data method.
- uint8_t *data() override {
- return const_cast<uint8_t *>(static_cast<const uint8_t *>(data_.bytes));
- }
size_t size() const override { return data_.length; }
protected:
@@ -85,9 +81,15 @@
// long self.buffer references its underlying data.
self.encodedData = encodedImage.GetEncodedData();
// Wrap the buffer in NSData without copying, do not take ownership.
- self.buffer = [NSData dataWithBytesNoCopy:self.encodedData->data()
- length:encodedImage.size()
- freeWhenDone:NO];
+ // `NSData` provides interface that allows to write into the buffer,
+ // `EncodedImageBufferInterface` gives read-only access to the buffer.
+ // As of now write part of ths NSData interface are not used when accessing
+ // `buffer`, however it might be safer to refactor RTCEncodedImage not
+ // to expose buffer as NSData, and then remove this unsafe const_cast.
+ self.buffer = [NSData
+ dataWithBytesNoCopy:const_cast<uint8_t *>(self.encodedData->data())
+ length:encodedImage.size()
+ freeWhenDone:NO];
self.encodedWidth =
webrtc::dchecked_cast<int32_t>(encodedImage._encodedWidth);
self.encodedHeight =
diff --git a/video/frame_encode_metadata_writer.cc b/video/frame_encode_metadata_writer.cc
index 556cc2e..b53f53e 100644
--- a/video/frame_encode_metadata_writer.cc
+++ b/video/frame_encode_metadata_writer.cc
@@ -51,7 +51,6 @@
: buffer_(std::move(buffer)) {}
const uint8_t* data() const override { return buffer_.data(); }
- uint8_t* data() override { return buffer_.data(); }
size_t size() const override { return buffer_.size(); }
private: