Reland "Update RTCEncodedImage to not use deprecated mutable_data call."

This reverts commit 966bcc4bd5cc7aee5963e784ddf0caf668b2d6e6.

Reason for revert: Fixing upstream issues.

Original change's description:
> Revert "Update RTCEncodedImage to not use deprecated mutable_data call."
> 
> This reverts commit 677e62785dd39cbc730edcbb7ef99909dd292b11.
> 
> Reason for revert:
> The RTC_DCHECK_EQ(self.buffer.bytes, self.encodedData->data()) line is triggering for every call
> 
> Original change's description:
> > Update RTCEncodedImage to not use deprecated mutable_data call.
> > 
> > Bug: webrtc:9378
> > Change-Id: If1e6284e2d11009097c87d15b98a2768a1d71521
> > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168524
> > Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
> > Reviewed-by: Niels Moller <nisse@webrtc.org>
> > Cr-Commit-Position: refs/heads/master@{#30518}
> 
> TBR=nisse@webrtc.org,kthelgason@webrtc.org
> 
> # Not skipping CQ checks because original CL landed > 1 day ago.
> 
> Bug: webrtc:9378
> Change-Id: I91b6df1148224785c209a7306ec186a952f5e289
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168620
> Reviewed-by: Zeke Chin <tkchin@webrtc.org>
> Commit-Queue: Zeke Chin <tkchin@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#30527}

TBR=nisse@webrtc.org,kthelgason@webrtc.org,tkchin@webrtc.org

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: webrtc:9378
Change-Id: I1c0e61d8a390a5999f8dbbbda6f094d71f9b0678
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168740
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30588}
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 13793fb..43ed6ae 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -1063,6 +1063,7 @@
             "objc/unittests/ObjCVideoTrackSource_xctest.mm",
             "objc/unittests/RTCCVPixelBuffer_xctest.mm",
             "objc/unittests/RTCCallbackLogger_xctest.m",
+            "objc/unittests/RTCEncodedImage_xctest.mm",
             "objc/unittests/RTCFileVideoCapturer_xctest.mm",
             "objc/unittests/RTCH264ProfileLevelId_xctest.m",
             "objc/unittests/RTCNV12TextureCache_xctest.m",
@@ -1084,6 +1085,7 @@
           deps = [
             ":audio_device",
             ":audio_session_objc",
+            ":base_native_additions_objc",
             ":base_objc",
             ":callback_logger_objc",
             ":framework_objc",
diff --git a/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm b/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
index f1df13e..0b2b64d 100644
--- a/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
+++ b/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm
@@ -13,6 +13,29 @@
 #import <objc/runtime.h>
 
 #include "rtc_base/numerics/safe_conversions.h"
+#include "rtc_base/ref_counted_object.h"
+
+namespace {
+// An implementation of EncodedImageBufferInterface that doesn't perform any copies.
+class ObjCEncodedImageBuffer : public webrtc::EncodedImageBufferInterface {
+ public:
+  static rtc::scoped_refptr<ObjCEncodedImageBuffer> Create(NSData *data) {
+    return new rtc::RefCountedObject<ObjCEncodedImageBuffer>(data);
+  }
+  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:
+  explicit ObjCEncodedImageBuffer(NSData *data) : data_(data) {}
+  ~ObjCEncodedImageBuffer() {}
+
+  NSData *data_;
+};
+}
 
 // A simple wrapper around webrtc::EncodedImageBufferInterface to make it usable with associated
 // objects.
@@ -51,9 +74,12 @@
 
 - (instancetype)initWithNativeEncodedImage:(const webrtc::EncodedImage &)encodedImage {
   if (self = [super init]) {
+    // A reference to the encodedData must be stored so that it's kept alive as 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:encodedImage.mutable_data()
-                                       length:encodedImage.size()
+    self.buffer = [NSData dataWithBytesNoCopy:self.encodedData->data()
+                                       length:self.encodedData->size()
                                  freeWhenDone:NO];
     self.encodedWidth = rtc::dchecked_cast<int32_t>(encodedImage._encodedWidth);
     self.encodedHeight = rtc::dchecked_cast<int32_t>(encodedImage._encodedHeight);
@@ -77,8 +103,13 @@
 
 - (webrtc::EncodedImage)nativeEncodedImage {
   // Return the pointer without copying.
-  webrtc::EncodedImage encodedImage(
-      (uint8_t *)self.buffer.bytes, (size_t)self.buffer.length, (size_t)self.buffer.length);
+  webrtc::EncodedImage encodedImage;
+  if (self.encodedData) {
+    encodedImage.SetEncodedData(self.encodedData);
+  } else if (self.buffer) {
+    encodedImage.SetEncodedData(ObjCEncodedImageBuffer::Create(self.buffer));
+  }
+  encodedImage.set_size(self.buffer.length);
   encodedImage._encodedWidth = rtc::dchecked_cast<uint32_t>(self.encodedWidth);
   encodedImage._encodedHeight = rtc::dchecked_cast<uint32_t>(self.encodedHeight);
   encodedImage.SetTimestamp(self.timeStamp);
diff --git a/sdk/objc/unittests/RTCEncodedImage_xctest.mm b/sdk/objc/unittests/RTCEncodedImage_xctest.mm
new file mode 100644
index 0000000..577ecda
--- /dev/null
+++ b/sdk/objc/unittests/RTCEncodedImage_xctest.mm
@@ -0,0 +1,54 @@
+/*
+ *  Copyright 2020 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#import "api/peerconnection/RTCEncodedImage+Private.h"
+
+#import <XCTest/XCTest.h>
+
+@interface RTCEncodedImageTests : XCTestCase
+@end
+
+@implementation RTCEncodedImageTests
+
+- (void)testInitializedWithNativeEncodedImage {
+  const auto encoded_data = webrtc::EncodedImageBuffer::Create();
+  webrtc::EncodedImage encoded_image;
+  encoded_image.SetEncodedData(encoded_data);
+
+  RTCEncodedImage *encodedImage =
+      [[RTCEncodedImage alloc] initWithNativeEncodedImage:encoded_image];
+
+  XCTAssertEqual([encodedImage nativeEncodedImage].GetEncodedData(), encoded_data);
+}
+
+- (void)testInitWithNSData {
+  NSData *bufferData = [NSData data];
+  RTCEncodedImage *encodedImage = [[RTCEncodedImage alloc] init];
+  encodedImage.buffer = bufferData;
+
+  webrtc::EncodedImage result_encoded_image = [encodedImage nativeEncodedImage];
+  XCTAssertTrue(result_encoded_image.GetEncodedData() != nullptr);
+  XCTAssertEqual(result_encoded_image.GetEncodedData()->data(), bufferData.bytes);
+}
+
+- (void)testRetainsNativeEncodedImage {
+  RTCEncodedImage *encodedImage;
+  {
+    const auto encoded_data = webrtc::EncodedImageBuffer::Create();
+    webrtc::EncodedImage encoded_image;
+    encoded_image.SetEncodedData(encoded_data);
+    encodedImage = [[RTCEncodedImage alloc] initWithNativeEncodedImage:encoded_image];
+  }
+  webrtc::EncodedImage result_encoded_image = [encodedImage nativeEncodedImage];
+  XCTAssertTrue(result_encoded_image.GetEncodedData() != nullptr);
+  XCTAssertTrue(result_encoded_image.GetEncodedData()->data() != nullptr);
+}
+
+@end
diff --git a/sdk/objc/unittests/objc_video_decoder_factory_tests.mm b/sdk/objc/unittests/objc_video_decoder_factory_tests.mm
index 2246eaa..bd31a6e 100644
--- a/sdk/objc/unittests/objc_video_decoder_factory_tests.mm
+++ b/sdk/objc/unittests/objc_video_decoder_factory_tests.mm
@@ -70,6 +70,7 @@
   std::unique_ptr<webrtc::VideoDecoder> decoder = GetObjCDecoder(CreateOKDecoderFactory());
 
   webrtc::EncodedImage encoded_image;
+  encoded_image.SetEncodedData(webrtc::EncodedImageBuffer::Create());
 
   EXPECT_EQ(decoder->Decode(encoded_image, false, 0), WEBRTC_VIDEO_CODEC_OK);
 }
@@ -78,6 +79,7 @@
   std::unique_ptr<webrtc::VideoDecoder> decoder = GetObjCDecoder(CreateErrorDecoderFactory());
 
   webrtc::EncodedImage encoded_image;
+  encoded_image.SetEncodedData(webrtc::EncodedImageBuffer::Create());
 
   EXPECT_EQ(decoder->Decode(encoded_image, false, 0), WEBRTC_VIDEO_CODEC_ERROR);
 }