Add property to RTCEncodedImage to own underlying EncodedImage.

Bug: None
Change-Id: Ic07b880c3a29789e2e74cb311267c05eb776a38a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/134104
Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Anders Carlsson <andersc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27753}
diff --git a/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm b/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
index dda8aac..53a5c5c 100644
--- a/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
+++ b/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
@@ -10,10 +10,41 @@
 
 #import "RTCEncodedImage+Private.h"
 
+#import <objc/runtime.h>
+
 #include "rtc_base/numerics/safe_conversions.h"
 
+// A simple wrapper around rtc::CopyOnWriteBuffer to make it usable with
+// associated objects.
+@interface RTCWrappedCOWBuffer : NSObject
+@property(nonatomic) rtc::CopyOnWriteBuffer buffer;
+- (instancetype)initWithCOWBuffer:(rtc::CopyOnWriteBuffer)buffer;
+@end
+@implementation RTCWrappedCOWBuffer
+@synthesize buffer = _buffer;
+- (instancetype)initWithCOWBuffer:(rtc::CopyOnWriteBuffer)buffer {
+  self = [super init];
+  if (self) {
+    _buffer = buffer;
+  }
+  return self;
+}
+@end
+
 @implementation RTCEncodedImage (Private)
 
+- (rtc::CopyOnWriteBuffer)encodedData {
+  RTCWrappedCOWBuffer *wrappedBuffer = objc_getAssociatedObject(self, @selector(encodedData));
+  return wrappedBuffer.buffer;
+}
+
+- (void)setEncodedData:(rtc::CopyOnWriteBuffer)buffer {
+  return objc_setAssociatedObject(self,
+                                  @selector(encodedData),
+                                  [[RTCWrappedCOWBuffer alloc] initWithCOWBuffer:buffer],
+                                  OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
 - (instancetype)initWithNativeEncodedImage:(const webrtc::EncodedImage &)encodedImage {
   if (self = [super init]) {
     // Wrap the buffer in NSData without copying, do not take ownership.