Pass-by-reference instead of value to initWithNativeEncodedImage
Previously, the use of pass-by-value caused an issue in
ObjCVideoDecoder::Decode, where the EncodedImage was being copied upon
calling initWithNativeEncodedImage, which then created an NSData using
the copy's pointer; then the copy was destroyed, invalidating that
pointer.
Bug: webrtc:9378
Change-Id: Iac28b890c9902108ffc5ec54a607a99034159153
Reviewed-on: https://webrtc-review.googlesource.com/c/121922
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Rasmus Brandt <brandtr@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26598}
diff --git a/sdk/objc/api/peerconnection/RTCEncodedImage+Private.h b/sdk/objc/api/peerconnection/RTCEncodedImage+Private.h
index c77a7ad..e96ce7b 100644
--- a/sdk/objc/api/peerconnection/RTCEncodedImage+Private.h
+++ b/sdk/objc/api/peerconnection/RTCEncodedImage+Private.h
@@ -17,7 +17,7 @@
/* Interfaces for converting to/from internal C++ formats. */
@interface RTCEncodedImage (Private)
-- (instancetype)initWithNativeEncodedImage:(webrtc::EncodedImage)encodedImage;
+- (instancetype)initWithNativeEncodedImage:(const webrtc::EncodedImage &)encodedImage;
- (webrtc::EncodedImage)nativeEncodedImage;
@end
diff --git a/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm b/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
index 59962c8..669fea2 100644
--- a/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
+++ b/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
@@ -14,10 +14,10 @@
@implementation RTCEncodedImage (Private)
-- (instancetype)initWithNativeEncodedImage:(webrtc::EncodedImage)encodedImage {
+- (instancetype)initWithNativeEncodedImage:(const webrtc::EncodedImage &)encodedImage {
if (self = [super init]) {
// Wrap the buffer in NSData without copying, do not take ownership.
- self.buffer = [NSData dataWithBytesNoCopy:encodedImage.data()
+ self.buffer = [NSData dataWithBytesNoCopy:encodedImage.mutable_data()
length:encodedImage.size()
freeWhenDone:NO];
self.encodedWidth = rtc::dchecked_cast<int32_t>(encodedImage._encodedWidth);