Revert "Support more formats in RTCVideoFrame"

This reverts commit bd2220a9c496ef2e8567b68d4be9435a110bdc34.

Reason for revert: Broke external clients

Original change's description:
> Support more formats in RTCVideoFrame
> 
> Implement Obj-C version of webrtc::VideoFrameBuffer and use that in
> RTCVideoFrame.
> 
> Bug: webrtc:7785
> Change-Id: I49f42bcf451dd6769b3a79a65fe7b400dce22677
> Reviewed-on: https://chromium-review.googlesource.com/536773
> Commit-Queue: Anders Carlsson <andersc@webrtc.org>
> Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#18691}

TBR=magjed@webrtc.org,andersc@webrtc.org

Change-Id: Id765dd9543ed0613a6b2de108b268c3501025fcd
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: webrtc:7785
Reviewed-on: https://chromium-review.googlesource.com/542837
Reviewed-by: Anders Carlsson <andersc@webrtc.org>
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#18697}
diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn
index d82788c..78e1002 100644
--- a/webrtc/sdk/BUILD.gn
+++ b/webrtc/sdk/BUILD.gn
@@ -105,11 +105,8 @@
       sources = [
         "objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.h",
         "objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.mm",
-        "objc/Framework/Classes/Video/RTCCVPixelBuffer.mm",
         "objc/Framework/Classes/Video/RTCDefaultShader.h",
         "objc/Framework/Classes/Video/RTCDefaultShader.mm",
-        "objc/Framework/Classes/Video/RTCI420Buffer+Private.h",
-        "objc/Framework/Classes/Video/RTCI420Buffer.mm",
         "objc/Framework/Classes/Video/RTCI420TextureCache.h",
         "objc/Framework/Classes/Video/RTCI420TextureCache.mm",
         "objc/Framework/Classes/Video/RTCOpenGLDefines.h",
@@ -119,11 +116,8 @@
         "objc/Framework/Classes/Video/avfoundationformatmapper.mm",
         "objc/Framework/Classes/Video/avfoundationvideocapturer.h",
         "objc/Framework/Classes/Video/avfoundationvideocapturer.mm",
-        "objc/Framework/Classes/Video/objc_frame_buffer.h",
-        "objc/Framework/Classes/Video/objc_frame_buffer.mm",
         "objc/Framework/Classes/Video/objcvideotracksource.h",
         "objc/Framework/Classes/Video/objcvideotracksource.mm",
-        "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
       ]
       libs = []
       if (is_ios) {
@@ -148,6 +142,8 @@
 
       deps = [
         ":objc_common",
+        ":objc_corevideoframebuffer",
+        ":objc_videotoolbox",
         "../api:libjingle_peerconnection_api",
         "../base:rtc_base",
         "../common_video",
@@ -274,6 +270,7 @@
         "objc/Framework/Classes/PeerConnection/RTCSessionDescription.mm",
         "objc/Framework/Classes/PeerConnection/RTCTracing.mm",
         "objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m",
+        "objc/Framework/Classes/PeerConnection/RTCVideoFrame+Private.h",
         "objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm",
         "objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter+Private.h",
         "objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.h",
@@ -310,7 +307,6 @@
         "objc/Framework/Headers/WebRTC/RTCTracing.h",
         "objc/Framework/Headers/WebRTC/RTCVideoCapturer.h",
         "objc/Framework/Headers/WebRTC/RTCVideoFrame.h",
-        "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
         "objc/Framework/Headers/WebRTC/RTCVideoRenderer.h",
         "objc/Framework/Headers/WebRTC/RTCVideoSource.h",
         "objc/Framework/Headers/WebRTC/RTCVideoTrack.h",
@@ -339,11 +335,10 @@
 
       deps = [
         ":objc_common",
+        ":objc_corevideoframebuffer",
         ":objc_video",
-        ":objc_videotoolbox",
         "../api:video_frame_api",
         "../base:rtc_base",
-        "../common_video",
         "../media:rtc_media_base",
         "../pc:libjingle_peerconnection",
       ]
@@ -459,7 +454,6 @@
           "objc/Framework/Headers/WebRTC/RTCTracing.h",
           "objc/Framework/Headers/WebRTC/RTCVideoCapturer.h",
           "objc/Framework/Headers/WebRTC/RTCVideoFrame.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
           "objc/Framework/Headers/WebRTC/RTCVideoRenderer.h",
           "objc/Framework/Headers/WebRTC/RTCVideoSource.h",
           "objc/Framework/Headers/WebRTC/RTCVideoTrack.h",
@@ -551,14 +545,13 @@
         "objc/Framework/Classes/VideoToolbox/nalu_rewriter.h",
         "objc/Framework/Classes/VideoToolbox/videocodecfactory.h",
         "objc/Framework/Classes/VideoToolbox/videocodecfactory.mm",
-        "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
       ]
 
       configs += [ "..:common_objc" ]
 
       deps = [
         ":objc_common",
-        ":objc_video",
+        ":objc_corevideoframebuffer",
         "../base:rtc_base_approved",
         "../common_video",
         "../media:rtc_media",
diff --git a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLI420Renderer.mm b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLI420Renderer.mm
index 027db05..7ca1d4e 100644
--- a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLI420Renderer.mm
+++ b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLI420Renderer.mm
@@ -9,7 +9,6 @@
  */
 
 #import "RTCMTLI420Renderer.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
 
 #import <Metal/Metal.h>
 #import <MetalKit/MetalKit.h>
@@ -97,8 +96,6 @@
     return NO;
   }
 
-  id<RTCI420Buffer> buffer = [frame.buffer toI420];
-
   // Luma (y) texture.
   if (!_descriptor || (_width != frame.width && _height != frame.height)) {
     _width = frame.width;
@@ -114,8 +111,8 @@
   // Chroma (u,v) textures
   [_yTexture replaceRegion:MTLRegionMake2D(0, 0, _width, _height)
                mipmapLevel:0
-                 withBytes:buffer.dataY
-               bytesPerRow:buffer.strideY];
+                 withBytes:frame.dataY
+               bytesPerRow:frame.strideY];
 
   if (!_chromaDescriptor ||
       (_chromaWidth != frame.width / 2 && _chromaHeight != frame.height / 2)) {
@@ -133,12 +130,12 @@
 
   [_uTexture replaceRegion:MTLRegionMake2D(0, 0, _chromaWidth, _chromaHeight)
                mipmapLevel:0
-                 withBytes:buffer.dataU
-               bytesPerRow:buffer.strideU];
+                 withBytes:frame.dataU
+               bytesPerRow:frame.strideU];
   [_vTexture replaceRegion:MTLRegionMake2D(0, 0, _chromaWidth, _chromaHeight)
                mipmapLevel:0
-                 withBytes:buffer.dataV
-               bytesPerRow:buffer.strideV];
+                 withBytes:frame.dataV
+               bytesPerRow:frame.strideV];
 
   return (_uTexture != nil) && (_yTexture != nil) && (_vTexture != nil);
 }
diff --git a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm
index 70ecf54..b5b9a0f 100644
--- a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm
+++ b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm
@@ -15,7 +15,6 @@
 
 #import "WebRTC/RTCLogging.h"
 #import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
 
 #import "RTCMTLRenderer+Private.h"
 
@@ -86,7 +85,7 @@
 
 - (BOOL)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame {
   [super setupTexturesForFrame:frame];
-  CVPixelBufferRef pixelBuffer = ((RTCCVPixelBuffer *)frame.buffer).pixelBuffer;
+  CVPixelBufferRef pixelBuffer = frame.nativeHandle;
 
   id<MTLTexture> lumaTexture = nil;
   id<MTLTexture> chromaTexture = nil;
diff --git a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m
index e36cb3a..96778c4 100644
--- a/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m
+++ b/webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m
@@ -15,7 +15,6 @@
 
 #import "WebRTC/RTCLogging.h"
 #import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
 
 #import "RTCMTLI420Renderer.h"
 #import "RTCMTLNV12Renderer.h"
@@ -109,7 +108,7 @@
   }
 
   id<RTCMTLRenderer> renderer = nil;
-  if ([self.videoFrame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
+  if (self.videoFrame.nativeHandle) {
     if (!self.rendererNV12) {
       self.rendererNV12 = [RTCMTLVideoView createNV12Renderer];
       if (![self.rendererNV12 addRenderingDestination:self.metalView]) {
diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
index a2290c2..cbeddfe 100644
--- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
+++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
@@ -12,7 +12,6 @@
 
 #import "WebRTC/RTCCameraVideoCapturer.h"
 #import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
 
 #if TARGET_OS_IPHONE
 #import "WebRTC/UIDevice+RTCDevice.h"
@@ -192,12 +191,11 @@
     return;
   }
 
-  RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer];
   int64_t timeStampNs = CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer)) *
                         kNanosecondsPerSecond;
-  RTCVideoFrame *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer
-                                                           rotation:_rotation
-                                                        timeStampNs:timeStampNs];
+  RTCVideoFrame *videoFrame = [[RTCVideoFrame alloc] initWithPixelBuffer:pixelBuffer
+                                                                rotation:_rotation
+                                                             timeStampNs:timeStampNs];
   [self.delegate capturer:self didCaptureVideoFrame:videoFrame];
 }
 
diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m
index 178a958..933207d 100644
--- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m
+++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m
@@ -11,7 +11,6 @@
 #import "RTCFileVideoCapturer.h"
 
 #import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
 
 @implementation RTCFileVideoCapturer {
   AVAssetReader *_reader;
@@ -134,11 +133,10 @@
       return;
     }
 
-    RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer];
     NSTimeInterval timeStampSeconds = CACurrentMediaTime();
     int64_t timeStampNs = lroundf(timeStampSeconds * NSEC_PER_SEC);
     RTCVideoFrame *videoFrame =
-        [[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer rotation:0 timeStampNs:timeStampNs];
+        [[RTCVideoFrame alloc] initWithPixelBuffer:pixelBuffer rotation:0 timeStampNs:timeStampNs];
     CFRelease(sampleBuffer);
 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame+Private.h b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame+Private.h
new file mode 100644
index 0000000..3b36f5b
--- /dev/null
+++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame+Private.h
@@ -0,0 +1,29 @@
+/*
+ *  Copyright 2015 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 "WebRTC/RTCVideoFrame.h"
+
+#include "webrtc/api/video/video_frame_buffer.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface RTCVideoFrame ()
+
+@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::VideoFrameBuffer> videoBuffer;
+
+- (instancetype)initWithVideoBuffer:
+                    (rtc::scoped_refptr<webrtc::VideoFrameBuffer>)videoBuffer
+                           rotation:(RTCVideoRotation)rotation
+                        timeStampNs:(int64_t)timeStampNs
+    NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm
index ef93fef..20e8f92 100644
--- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm
+++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm
@@ -8,22 +8,22 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h"
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h"
+#import "RTCVideoFrame+Private.h"
+
+#include "webrtc/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.h"
 
 @implementation RTCVideoFrame {
+  rtc::scoped_refptr<webrtc::VideoFrameBuffer> _videoBuffer;
   RTCVideoRotation _rotation;
   int64_t _timeStampNs;
 }
 
-@synthesize buffer = _buffer;
-
 - (int)width {
-  return _buffer.width;
+  return _videoBuffer->width();
 }
 
 - (int)height {
-  return _buffer.height;
+  return _videoBuffer->height();
 }
 
 - (RTCVideoRotation)rotation {
@@ -31,51 +31,27 @@
 }
 
 - (const uint8_t *)dataY {
-  if ([_buffer conformsToProtocol:@protocol(RTCI420Buffer)]) {
-    return ((id<RTCI420Buffer>)_buffer).dataY;
-  } else {
-    return nullptr;
-  }
+  return _videoBuffer->GetI420()->DataY();
 }
 
 - (const uint8_t *)dataU {
-  if ([_buffer conformsToProtocol:@protocol(RTCI420Buffer)]) {
-    return ((id<RTCI420Buffer>)_buffer).dataU;
-  } else {
-    return nullptr;
-  }
+  return _videoBuffer->GetI420()->DataU();
 }
 
 - (const uint8_t *)dataV {
-  if ([_buffer conformsToProtocol:@protocol(RTCI420Buffer)]) {
-    return ((id<RTCI420Buffer>)_buffer).dataV;
-  } else {
-    return nullptr;
-  }
+  return _videoBuffer->GetI420()->DataV();
 }
 
 - (int)strideY {
-  if ([_buffer conformsToProtocol:@protocol(RTCI420Buffer)]) {
-    return ((id<RTCI420Buffer>)_buffer).strideY;
-  } else {
-    return 0;
-  }
+  return _videoBuffer->GetI420()->StrideY();
 }
 
 - (int)strideU {
-  if ([_buffer conformsToProtocol:@protocol(RTCI420Buffer)]) {
-    return ((id<RTCI420Buffer>)_buffer).strideU;
-  } else {
-    return 0;
-  }
+  return _videoBuffer->GetI420()->StrideU();
 }
 
 - (int)strideV {
-  if ([_buffer conformsToProtocol:@protocol(RTCI420Buffer)]) {
-    return ((id<RTCI420Buffer>)_buffer).strideV;
-  } else {
-    return 0;
-  }
+  return _videoBuffer->GetI420()->StrideV();
 }
 
 - (int64_t)timeStampNs {
@@ -83,25 +59,26 @@
 }
 
 - (CVPixelBufferRef)nativeHandle {
-  if ([_buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
-    return ((RTCCVPixelBuffer *)_buffer).pixelBuffer;
-  } else {
-    return nullptr;
-  }
+  return (_videoBuffer->type() == webrtc::VideoFrameBuffer::Type::kNative) ?
+      static_cast<webrtc::CoreVideoFrameBuffer *>(_videoBuffer.get())->pixel_buffer() :
+      nil;
 }
 
 - (RTCVideoFrame *)newI420VideoFrame {
-  return [[RTCVideoFrame alloc] initWithBuffer:[_buffer toI420]
-                                      rotation:_rotation
-                                   timeStampNs:_timeStampNs];
+  return [[RTCVideoFrame alloc]
+      initWithVideoBuffer:_videoBuffer->ToI420()
+                 rotation:_rotation
+              timeStampNs:_timeStampNs];
 }
 
 - (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
                            rotation:(RTCVideoRotation)rotation
                         timeStampNs:(int64_t)timeStampNs {
-  return [self initWithBuffer:[[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer]
-                     rotation:rotation
-                  timeStampNs:timeStampNs];
+  rtc::scoped_refptr<webrtc::VideoFrameBuffer> videoBuffer(
+      new rtc::RefCountedObject<webrtc::CoreVideoFrameBuffer>(pixelBuffer));
+  return [self initWithVideoBuffer:videoBuffer
+                          rotation:rotation
+                       timeStampNs:timeStampNs];
 }
 
 - (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
@@ -113,26 +90,33 @@
                               cropY:(int)cropY
                            rotation:(RTCVideoRotation)rotation
                         timeStampNs:(int64_t)timeStampNs {
-  RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer
-                                                                      adaptedWidth:scaledWidth
-                                                                     adaptedHeight:scaledHeight
-                                                                         cropWidth:cropWidth
-                                                                        cropHeight:cropHeight
-                                                                             cropX:cropX
-                                                                             cropY:cropY];
-  return [self initWithBuffer:rtcPixelBuffer rotation:rotation timeStampNs:timeStampNs];
+  rtc::scoped_refptr<webrtc::VideoFrameBuffer> videoBuffer(
+      new rtc::RefCountedObject<webrtc::CoreVideoFrameBuffer>(
+          pixelBuffer,
+          scaledWidth, scaledHeight,
+          cropWidth, cropHeight,
+          cropX, cropY));
+  return [self initWithVideoBuffer:videoBuffer
+                          rotation:rotation
+                       timeStampNs:timeStampNs];
 }
 
-- (instancetype)initWithBuffer:(id<RTCVideoFrameBuffer>)buffer
-                      rotation:(RTCVideoRotation)rotation
-                   timeStampNs:(int64_t)timeStampNs {
+#pragma mark - Private
+
+- (instancetype)initWithVideoBuffer:
+                    (rtc::scoped_refptr<webrtc::VideoFrameBuffer>)videoBuffer
+                           rotation:(RTCVideoRotation)rotation
+                        timeStampNs:(int64_t)timeStampNs {
   if (self = [super init]) {
-    _buffer = buffer;
+    _videoBuffer = videoBuffer;
     _rotation = rotation;
     _timeStampNs = timeStampNs;
   }
-
   return self;
 }
 
+- (rtc::scoped_refptr<webrtc::VideoFrameBuffer>)videoBuffer {
+  return _videoBuffer;
+}
+
 @end
diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.mm
index 736803b..1d5107b 100644
--- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.mm
+++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.mm
@@ -8,11 +8,9 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#import "RTCI420Buffer+Private.h"
 #import "RTCVideoRendererAdapter+Private.h"
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-#import "objc_frame_buffer.h"
+
+#import "RTCVideoFrame+Private.h"
 
 #include <memory>
 
@@ -27,20 +25,12 @@
   }
 
   void OnFrame(const webrtc::VideoFrame& nativeVideoFrame) override {
-    rtc::scoped_refptr<VideoFrameBuffer> video_frame_buffer = nativeVideoFrame.video_frame_buffer();
-    id<RTCVideoFrameBuffer> rtc_frame_buffer;
-    if (video_frame_buffer->type() == VideoFrameBuffer::Type::kNative) {
-      rtc::scoped_refptr<ObjCFrameBuffer> objc_frame_buffer(
-          static_cast<ObjCFrameBuffer*>(video_frame_buffer.get()));
-      rtc_frame_buffer = (id<RTCVideoFrameBuffer>)objc_frame_buffer->wrapped_frame_buffer();
-    } else {
-      rtc_frame_buffer = [[RTCI420Buffer alloc] initWithFrameBuffer:video_frame_buffer->ToI420()];
-    }
     RTCVideoFrame* videoFrame = [[RTCVideoFrame alloc]
-        initWithBuffer:rtc_frame_buffer
-              rotation:static_cast<RTCVideoRotation>(nativeVideoFrame.rotation())
-           timeStampNs:nativeVideoFrame.timestamp_us() * rtc::kNumNanosecsPerMicrosec];
-
+        initWithVideoBuffer:nativeVideoFrame.video_frame_buffer()
+                   rotation:static_cast<RTCVideoRotation>(
+                                nativeVideoFrame.rotation())
+                timeStampNs:nativeVideoFrame.timestamp_us() *
+                            rtc::kNumNanosecsPerMicrosec];
     CGSize current_size = (videoFrame.rotation % 180 == 0)
                               ? CGSizeMake(videoFrame.width, videoFrame.height)
                               : CGSizeMake(videoFrame.height, videoFrame.width);
diff --git a/webrtc/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m b/webrtc/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m
index 89b7dfc..851c4b4 100644
--- a/webrtc/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m
+++ b/webrtc/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m
@@ -17,7 +17,6 @@
 #import "RTCNV12TextureCache.h"
 #import "WebRTC/RTCLogging.h"
 #import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
 
 // RTCDisplayLinkTimer wraps a CADisplayLink and is set to fire every two screen
 // refreshes, which should be 30fps. We wrap the display link in order to avoid
@@ -221,7 +220,7 @@
   }
   [self ensureGLContext];
   glClear(GL_COLOR_BUFFER_BIT);
-  if ([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
+  if (frame.nativeHandle) {
     if (!_nv12TextureCache) {
       _nv12TextureCache = [[RTCNV12TextureCache alloc] initWithContext:_glContext];
     }
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm b/webrtc/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm
deleted file mode 100644
index a45c212..0000000
--- a/webrtc/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright 2017 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 "WebRTC/RTCVideoFrameBuffer.h"
-
-#include "webrtc/base/checks.h"
-#include "webrtc/base/logging.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-
-@implementation RTCCVPixelBuffer {
-  int _width;
-  int _height;
-  int _bufferWidth;
-  int _bufferHeight;
-  int _cropWidth;
-  int _cropHeight;
-  int _cropX;
-  int _cropY;
-}
-
-@synthesize pixelBuffer = _pixelBuffer;
-
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer {
-  return [self initWithPixelBuffer:pixelBuffer
-                      adaptedWidth:CVPixelBufferGetWidth(pixelBuffer)
-                     adaptedHeight:CVPixelBufferGetHeight(pixelBuffer)
-                         cropWidth:CVPixelBufferGetWidth(pixelBuffer)
-                        cropHeight:CVPixelBufferGetHeight(pixelBuffer)
-                             cropX:0
-                             cropY:0];
-}
-
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
-                       adaptedWidth:(int)adaptedWidth
-                      adaptedHeight:(int)adaptedHeight
-                          cropWidth:(int)cropWidth
-                         cropHeight:(int)cropHeight
-                              cropX:(int)cropX
-                              cropY:(int)cropY {
-  if (self = [super init]) {
-    _width = adaptedWidth;
-    _height = adaptedHeight;
-    _pixelBuffer = pixelBuffer;
-    _bufferWidth = CVPixelBufferGetWidth(_pixelBuffer);
-    _bufferHeight = CVPixelBufferGetHeight(_pixelBuffer);
-    _cropWidth = cropWidth;
-    _cropHeight = cropHeight;
-    // Can only crop at even pixels.
-    _cropX = cropX & ~1;
-    _cropY = cropY & ~1;
-    CVBufferRetain(_pixelBuffer);
-  }
-
-  return self;
-}
-
-- (void)dealloc {
-  CVBufferRelease(_pixelBuffer);
-}
-
-- (int)width {
-  return _width;
-}
-
-- (int)height {
-  return _height;
-}
-
-- (BOOL)requiresCropping {
-  return _cropWidth != _bufferWidth || _cropHeight != _bufferHeight;
-}
-
-- (BOOL)requiresScalingToWidth:(int)width height:(int)height {
-  return _cropWidth != width || _cropHeight != height;
-}
-
-- (int)bufferSizeForCroppingAndScalingToWidth:(int)width height:(int)height {
-  int srcChromaWidth = (_cropWidth + 1) / 2;
-  int srcChromaHeight = (_cropHeight + 1) / 2;
-  int dstChromaWidth = (width + 1) / 2;
-  int dstChromaHeight = (height + 1) / 2;
-
-  return srcChromaWidth * srcChromaHeight * 2 + dstChromaWidth * dstChromaHeight * 2;
-}
-
-- (BOOL)cropAndScaleTo:(CVPixelBufferRef)outputPixelBuffer withTempBuffer:(uint8_t*)tmpBuffer {
-  // Prepare output pointers.
-  RTC_DCHECK_EQ(CVPixelBufferGetPixelFormatType(outputPixelBuffer),
-                kCVPixelFormatType_420YpCbCr8BiPlanarFullRange);
-  CVReturn cvRet = CVPixelBufferLockBaseAddress(outputPixelBuffer, 0);
-  if (cvRet != kCVReturnSuccess) {
-    LOG(LS_ERROR) << "Failed to lock base address: " << cvRet;
-    return NO;
-  }
-  const int dstWidth = CVPixelBufferGetWidth(outputPixelBuffer);
-  const int dstHeight = CVPixelBufferGetHeight(outputPixelBuffer);
-  uint8_t* dstY =
-      reinterpret_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(outputPixelBuffer, 0));
-  const int dstYStride = CVPixelBufferGetBytesPerRowOfPlane(outputPixelBuffer, 0);
-  uint8_t* dstUV =
-      reinterpret_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(outputPixelBuffer, 1));
-  const int dstUVStride = CVPixelBufferGetBytesPerRowOfPlane(outputPixelBuffer, 1);
-
-  // Prepare source pointers.
-  const OSType srcPixelFormat = CVPixelBufferGetPixelFormatType(_pixelBuffer);
-  RTC_DCHECK(srcPixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ||
-             srcPixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
-  CVPixelBufferLockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
-  const uint8_t* srcY =
-      static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 0));
-  const int srcYStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 0);
-  const uint8_t* srcUV =
-      static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 1));
-  const int srcUVStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 1);
-
-  // Crop just by modifying pointers.
-  srcY += srcYStride * _cropY + _cropX;
-  srcUV += srcUVStride * (_cropY / 2) + _cropX;
-
-  webrtc::NV12Scale(tmpBuffer,
-                    srcY,
-                    srcYStride,
-                    srcUV,
-                    srcUVStride,
-                    _cropWidth,
-                    _cropHeight,
-                    dstY,
-                    dstYStride,
-                    dstUV,
-                    dstUVStride,
-                    dstWidth,
-                    dstHeight);
-
-  CVPixelBufferUnlockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
-  CVPixelBufferUnlockBaseAddress(outputPixelBuffer, 0);
-
-  return YES;
-}
-
-- (id<RTCI420Buffer>)toI420 {
-  const OSType pixelFormat = CVPixelBufferGetPixelFormatType(_pixelBuffer);
-  RTC_DCHECK(pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ||
-             pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
-
-  CVPixelBufferLockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
-  const uint8_t* srcY =
-      static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 0));
-  const int srcYStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 0);
-  const uint8_t* srcUV =
-      static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 1));
-  const int srcUVStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 1);
-
-  // Crop just by modifying pointers.
-  srcY += srcYStride * _cropY + _cropX;
-  srcUV += srcUVStride * (_cropY / 2) + _cropX;
-
-  // TODO(magjed): Use a frame buffer pool.
-  webrtc::NV12ToI420Scaler nv12ToI420Scaler;
-  RTCMutableI420Buffer* i420Buffer =
-      [[RTCMutableI420Buffer alloc] initWithWidth:[self width] height:[self height]];
-  nv12ToI420Scaler.NV12ToI420Scale(srcY,
-                                   srcYStride,
-                                   srcUV,
-                                   srcUVStride,
-                                   _cropWidth,
-                                   _cropHeight,
-                                   i420Buffer.mutableDataY,
-                                   i420Buffer.strideY,
-                                   i420Buffer.mutableDataU,
-                                   i420Buffer.strideU,
-                                   i420Buffer.mutableDataV,
-                                   i420Buffer.strideV,
-                                   i420Buffer.width,
-                                   i420Buffer.height);
-
-  CVPixelBufferUnlockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
-
-  return i420Buffer;
-}
-
-@end
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/RTCI420Buffer+Private.h b/webrtc/sdk/objc/Framework/Classes/Video/RTCI420Buffer+Private.h
deleted file mode 100644
index 7883c41..0000000
--- a/webrtc/sdk/objc/Framework/Classes/Video/RTCI420Buffer+Private.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 2017 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 "WebRTC/RTCVideoFrameBuffer.h"
-
-#include "webrtc/api/video/i420_buffer.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCI420Buffer ()
-
-/** Initialize an RTCI420Buffer with its backing I420BufferInterface. */
-- (instancetype)initWithFrameBuffer:(rtc::scoped_refptr<webrtc::I420BufferInterface>)i420Buffer;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/RTCI420Buffer.mm b/webrtc/sdk/objc/Framework/Classes/Video/RTCI420Buffer.mm
deleted file mode 100644
index 042fcc0..0000000
--- a/webrtc/sdk/objc/Framework/Classes/Video/RTCI420Buffer.mm
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright 2017 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 "WebRTC/RTCVideoFrameBuffer.h"
-
-#include "webrtc/api/video/i420_buffer.h"
-
-@implementation RTCI420Buffer {
- @protected
-  rtc::scoped_refptr<webrtc::I420BufferInterface> _i420Buffer;
-}
-
-- (instancetype)initWithWidth:(int)width height:(int)height {
-  if (self = [super init]) {
-    _i420Buffer = webrtc::I420Buffer::Create(width, height);
-  }
-
-  return self;
-}
-
-- (instancetype)initWithWidth:(int)width
-                       height:(int)height
-                      strideY:(int)strideY
-                      strideU:(int)strideU
-                      strideV:(int)strideV {
-  if (self = [super init]) {
-    _i420Buffer = webrtc::I420Buffer::Create(width, height, strideY, strideU, strideV);
-  }
-
-  return self;
-}
-
-- (instancetype)initWithFrameBuffer:(rtc::scoped_refptr<webrtc::I420BufferInterface>)i420Buffer {
-  if (self = [super init]) {
-    _i420Buffer = i420Buffer;
-  }
-
-  return self;
-}
-
-- (int)width {
-  return _i420Buffer->width();
-}
-
-- (int)height {
-  return _i420Buffer->height();
-}
-
-- (int)strideY {
-  return _i420Buffer->StrideY();
-}
-
-- (int)strideU {
-  return _i420Buffer->StrideU();
-}
-
-- (int)strideV {
-  return _i420Buffer->StrideV();
-}
-
-- (int)chromaWidth {
-  return _i420Buffer->ChromaWidth();
-}
-
-- (int)chromaHeight {
-  return _i420Buffer->ChromaHeight();
-}
-
-- (const uint8_t *)dataY {
-  return _i420Buffer->DataY();
-}
-
-- (const uint8_t *)dataU {
-  return _i420Buffer->DataU();
-}
-
-- (const uint8_t *)dataV {
-  return _i420Buffer->DataV();
-}
-
-- (id<RTCI420Buffer>)toI420 {
-  return self;
-}
-
-@end
-
-@implementation RTCMutableI420Buffer
-
-- (uint8_t *)mutableDataY {
-  return static_cast<webrtc::I420Buffer *>(_i420Buffer.get())->MutableDataY();
-}
-
-- (uint8_t *)mutableDataU {
-  return static_cast<webrtc::I420Buffer *>(_i420Buffer.get())->MutableDataU();
-}
-
-- (uint8_t *)mutableDataV {
-  return static_cast<webrtc::I420Buffer *>(_i420Buffer.get())->MutableDataV();
-}
-
-@end
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/RTCI420TextureCache.mm b/webrtc/sdk/objc/Framework/Classes/Video/RTCI420TextureCache.mm
index b603130..eeae867 100644
--- a/webrtc/sdk/objc/Framework/Classes/Video/RTCI420TextureCache.mm
+++ b/webrtc/sdk/objc/Framework/Classes/Video/RTCI420TextureCache.mm
@@ -9,7 +9,6 @@
  */
 
 #import "RTCI420TextureCache.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
 
 #if TARGET_OS_IPHONE
 #import <OpenGLES/ES3/gl.h>
@@ -124,32 +123,31 @@
 - (void)uploadFrameToTextures:(RTCVideoFrame *)frame {
   _currentTextureSet = (_currentTextureSet + 1) % kNumTextureSets;
 
-  id<RTCI420Buffer> buffer = [frame.buffer toI420];
-
-  const int chromaWidth = buffer.chromaWidth;
-  const int chromaHeight = buffer.chromaHeight;
-  if (buffer.strideY != frame.width || buffer.strideU != chromaWidth ||
-      buffer.strideV != chromaWidth) {
-    _planeBuffer.resize(buffer.width * buffer.height);
+  const int chromaWidth = (frame.width + 1) / 2;
+  const int chromaHeight = (frame.height + 1) / 2;
+  if (frame.strideY != frame.width ||
+      frame.strideU != chromaWidth ||
+      frame.strideV != chromaWidth) {
+    _planeBuffer.resize(frame.width * frame.height);
   }
 
-  [self uploadPlane:buffer.dataY
+  [self uploadPlane:frame.dataY
             texture:self.yTexture
-              width:buffer.width
-             height:buffer.height
-             stride:buffer.strideY];
+              width:frame.width
+             height:frame.height
+             stride:frame.strideY];
 
-  [self uploadPlane:buffer.dataU
+  [self uploadPlane:frame.dataU
             texture:self.uTexture
               width:chromaWidth
              height:chromaHeight
-             stride:buffer.strideU];
+             stride:frame.strideU];
 
-  [self uploadPlane:buffer.dataV
+  [self uploadPlane:frame.dataV
             texture:self.vTexture
               width:chromaWidth
              height:chromaHeight
-             stride:buffer.strideV];
+             stride:frame.strideV];
 }
 
 @end
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.m b/webrtc/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.m
index 20a6082..e259cee 100644
--- a/webrtc/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.m
+++ b/webrtc/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.m
@@ -11,7 +11,6 @@
 #import "RTCNV12TextureCache.h"
 
 #import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
 
 @implementation RTCNV12TextureCache {
   CVOpenGLESTextureCacheRef _textureCache;
@@ -74,10 +73,8 @@
 }
 
 - (BOOL)uploadFrameToTextures:(RTCVideoFrame *)frame {
-  NSAssert([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]],
-           @"frame must be CVPixelBuffer backed");
-  RTCCVPixelBuffer *rtcPixelBuffer = (RTCCVPixelBuffer *)frame.buffer;
-  CVPixelBufferRef pixelBuffer = rtcPixelBuffer.pixelBuffer;
+  CVPixelBufferRef pixelBuffer = frame.nativeHandle;
+  NSParameterAssert(pixelBuffer);
   return [self loadTexture:&_yTextureRef
                pixelBuffer:pixelBuffer
                 planeIndex:0
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm b/webrtc/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm
index c2e2056..a060b51 100644
--- a/webrtc/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm
+++ b/webrtc/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm
@@ -15,7 +15,6 @@
 #import "RTCAVFoundationVideoCapturerInternal.h"
 #import "RTCDispatcher+Private.h"
 #import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
 
 #include "avfoundationformatmapper.h"
 
@@ -24,7 +23,7 @@
 #include "webrtc/base/checks.h"
 #include "webrtc/base/logging.h"
 #include "webrtc/base/thread.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
+#include "webrtc/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.h"
 
 namespace webrtc {
 
@@ -151,15 +150,12 @@
     return;
   }
 
-  RTCCVPixelBuffer* rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:image_buffer
-                                                                      adaptedWidth:adapted_width
-                                                                     adaptedHeight:adapted_height
-                                                                         cropWidth:crop_width
-                                                                        cropHeight:crop_height
-                                                                             cropX:crop_x
-                                                                             cropY:crop_y];
   rtc::scoped_refptr<VideoFrameBuffer> buffer =
-      new rtc::RefCountedObject<ObjCFrameBuffer>(rtcPixelBuffer);
+      new rtc::RefCountedObject<CoreVideoFrameBuffer>(
+          image_buffer,
+          adapted_width, adapted_height,
+          crop_width, crop_height,
+          crop_x, crop_y);
 
   // Applying rotation is only supported for legacy reasons and performance is
   // not critical here.
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h b/webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h
deleted file mode 100644
index 71099e4..0000000
--- a/webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#ifndef WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJC_FRAME_BUFFER_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJC_FRAME_BUFFER_H_
-
-#import <CoreVideo/CoreVideo.h>
-
-#include "webrtc/common_video/include/video_frame_buffer.h"
-
-@protocol RTCVideoFrameBuffer;
-
-namespace webrtc {
-
-class ObjCFrameBuffer : public VideoFrameBuffer {
- public:
-  explicit ObjCFrameBuffer(id<RTCVideoFrameBuffer>);
-  ~ObjCFrameBuffer() override;
-
-  Type type() const override;
-
-  int width() const override;
-  int height() const override;
-
-  rtc::scoped_refptr<I420BufferInterface> ToI420() override;
-
-  id<RTCVideoFrameBuffer> wrapped_frame_buffer() const;
-
- private:
-  id<RTCVideoFrameBuffer> frame_buffer_;
-  int width_;
-  int height_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJC_FRAME_BUFFER_H_
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.mm b/webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.mm
deleted file mode 100644
index 74e9c13..0000000
--- a/webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.mm
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
-
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-namespace webrtc {
-
-namespace {
-
-/** ObjCFrameBuffer that conforms to I420BufferInterface by wrapping RTCI420Buffer */
-class ObjCI420FrameBuffer : public I420BufferInterface {
- public:
-  explicit ObjCI420FrameBuffer(id<RTCI420Buffer> frame_buffer)
-      : frame_buffer_(frame_buffer), width_(frame_buffer.width), height_(frame_buffer.height) {}
-  ~ObjCI420FrameBuffer() override{};
-
-  int width() const override { return width_; }
-
-  int height() const override { return height_; }
-
-  const uint8_t* DataY() const override { return frame_buffer_.dataY; }
-
-  const uint8_t* DataU() const override { return frame_buffer_.dataU; }
-
-  const uint8_t* DataV() const override { return frame_buffer_.dataV; }
-
-  int StrideY() const override { return frame_buffer_.strideY; }
-
-  int StrideU() const override { return frame_buffer_.strideU; }
-
-  int StrideV() const override { return frame_buffer_.strideV; }
-
- private:
-  id<RTCI420Buffer> frame_buffer_;
-  int width_;
-  int height_;
-};
-
-}  // namespace
-
-ObjCFrameBuffer::ObjCFrameBuffer(id<RTCVideoFrameBuffer> frame_buffer)
-    : frame_buffer_(frame_buffer), width_(frame_buffer.width), height_(frame_buffer.height) {}
-
-ObjCFrameBuffer::~ObjCFrameBuffer() {}
-
-VideoFrameBuffer::Type ObjCFrameBuffer::type() const {
-  return Type::kNative;
-}
-
-int ObjCFrameBuffer::width() const {
-  return width_;
-}
-
-int ObjCFrameBuffer::height() const {
-  return height_;
-}
-
-rtc::scoped_refptr<I420BufferInterface> ObjCFrameBuffer::ToI420() {
-  rtc::scoped_refptr<I420BufferInterface> buffer =
-      new rtc::RefCountedObject<ObjCI420FrameBuffer>([frame_buffer_ toI420]);
-
-  return buffer;
-}
-
-id<RTCVideoFrameBuffer> ObjCFrameBuffer::wrapped_frame_buffer() const {
-  return frame_buffer_;
-}
-
-}  // namespace webrtc
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm b/webrtc/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm
index 4200cbc..387bb1b 100644
--- a/webrtc/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm
+++ b/webrtc/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm
@@ -10,11 +10,10 @@
 
 #include "webrtc/sdk/objc/Framework/Classes/Video/objcvideotracksource.h"
 
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
+#import "RTCVideoFrame+Private.h"
 
 #include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
+#include "webrtc/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.h"
 
 namespace webrtc {
 
@@ -44,24 +43,18 @@
   rtc::scoped_refptr<VideoFrameBuffer> buffer;
   if (adapted_width == frame.width && adapted_height == frame.height) {
     // No adaption - optimized path.
-    buffer = new rtc::RefCountedObject<ObjCFrameBuffer>(frame.buffer);
-  } else if ([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
+    buffer = frame.videoBuffer;
+  } else if (frame.nativeHandle) {
     // Adapted CVPixelBuffer frame.
-    RTCCVPixelBuffer *rtcPixelBuffer = (RTCCVPixelBuffer *)frame.buffer;
-    buffer = new rtc::RefCountedObject<ObjCFrameBuffer>([[RTCCVPixelBuffer alloc]
-        initWithPixelBuffer:rtcPixelBuffer.pixelBuffer
-               adaptedWidth:adapted_width
-              adaptedHeight:adapted_height
-                  cropWidth:crop_width
-                 cropHeight:crop_height
-                      cropX:crop_x
-                      cropY:crop_y]);
+    buffer = new rtc::RefCountedObject<CoreVideoFrameBuffer>(
+        static_cast<CVPixelBufferRef>(frame.nativeHandle), adapted_width, adapted_height,
+        crop_width, crop_height, crop_x, crop_y);
   } else {
     // Adapted I420 frame.
     // TODO(magjed): Optimize this I420 path.
     rtc::scoped_refptr<I420Buffer> i420_buffer = I420Buffer::Create(adapted_width, adapted_height);
-    buffer = new rtc::RefCountedObject<ObjCFrameBuffer>(frame.buffer);
-    i420_buffer->CropAndScaleFrom(*buffer->ToI420(), crop_x, crop_y, crop_width, crop_height);
+    i420_buffer->CropAndScaleFrom(
+        *frame.videoBuffer->ToI420(), crop_x, crop_y, crop_width, crop_height);
     buffer = i420_buffer;
   }
 
diff --git a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/decoder.mm b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/decoder.mm
index c039442..1698477 100644
--- a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/decoder.mm
+++ b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/decoder.mm
@@ -18,11 +18,9 @@
 #include "webrtc/base/checks.h"
 #include "webrtc/base/logging.h"
 #include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
+#include "webrtc/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.h"
 #include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h"
 
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
 #if defined(WEBRTC_IOS)
 #import "Common/RTCUIApplicationStatusObserver.h"
 #endif
@@ -66,8 +64,8 @@
     return;
   }
   // TODO(tkchin): Handle CVO properly.
-  rtc::scoped_refptr<VideoFrameBuffer> buffer = new rtc::RefCountedObject<ObjCFrameBuffer>(
-      [[RTCCVPixelBuffer alloc] initWithPixelBuffer:image_buffer]);
+  rtc::scoped_refptr<VideoFrameBuffer> buffer =
+      new rtc::RefCountedObject<CoreVideoFrameBuffer>(image_buffer);
   VideoFrame decoded_frame(buffer, decode_params->timestamp,
                            CMTimeGetSeconds(timestamp) * kMsPerSec,
                            kVideoRotation_0);
diff --git a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/encoder.mm b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/encoder.mm
index 2bd485f..1d37eba 100644
--- a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/encoder.mm
+++ b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/encoder.mm
@@ -19,12 +19,11 @@
 #import "Common/RTCUIApplicationStatusObserver.h"
 #import "WebRTC/UIDevice+RTCDevice.h"
 #endif
-#import "WebRTC/RTCVideoFrameBuffer.h"
 #include "libyuv/convert_from.h"
 #include "webrtc/base/checks.h"
 #include "webrtc/base/logging.h"
 #include "webrtc/common_video/h264/profile_level_id.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
+#include "webrtc/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.h"
 #include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h"
 #include "webrtc/system_wrappers/include/clock.h"
 
@@ -412,49 +411,29 @@
   }
 #endif
 
-  CVPixelBufferRef pixel_buffer = nullptr;
+  CVPixelBufferRef pixel_buffer;
   if (frame.video_frame_buffer()->type() == VideoFrameBuffer::Type::kNative) {
-    // Native frame.
-    rtc::scoped_refptr<ObjCFrameBuffer> objc_frame_buffer(
-        static_cast<ObjCFrameBuffer*>(frame.video_frame_buffer().get()));
-    id<RTCVideoFrameBuffer> wrapped_frame_buffer =
-        (id<RTCVideoFrameBuffer>)objc_frame_buffer->wrapped_frame_buffer();
-
-    if ([wrapped_frame_buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
-      RTCCVPixelBuffer* rtc_pixel_buffer = (RTCCVPixelBuffer*)wrapped_frame_buffer;
-      if (![rtc_pixel_buffer requiresCropping]) {
-        // This pixel buffer might have a higher resolution than what the
-        // compression session is configured to. The compression session can
-        // handle that and will output encoded frames in the configured
-        // resolution regardless of the input pixel buffer resolution.
-        pixel_buffer = rtc_pixel_buffer.pixelBuffer;
-        CVBufferRetain(pixel_buffer);
-      } else {
-        // Cropping required, we need to crop and scale to a new pixel buffer.
-        pixel_buffer = internal::CreatePixelBuffer(pixel_buffer_pool);
-        if (!pixel_buffer) {
-          return WEBRTC_VIDEO_CODEC_ERROR;
-        }
-        int dst_width = CVPixelBufferGetWidth(pixel_buffer);
-        int dst_height = CVPixelBufferGetHeight(pixel_buffer);
-        if ([rtc_pixel_buffer requiresScalingToWidth:dst_width height:dst_height]) {
-          int size =
-              [rtc_pixel_buffer bufferSizeForCroppingAndScalingToWidth:dst_width height:dst_height];
-          nv12_scale_buffer_.resize(size);
-        } else {
-          nv12_scale_buffer_.clear();
-        }
-        nv12_scale_buffer_.shrink_to_fit();
-        if (![rtc_pixel_buffer cropAndScaleTo:pixel_buffer
-                               withTempBuffer:nv12_scale_buffer_.data()]) {
-          return WEBRTC_VIDEO_CODEC_ERROR;
-        }
+    rtc::scoped_refptr<CoreVideoFrameBuffer> core_video_frame_buffer(
+        static_cast<CoreVideoFrameBuffer*>(frame.video_frame_buffer().get()));
+    if (!core_video_frame_buffer->RequiresCropping()) {
+      pixel_buffer = core_video_frame_buffer->pixel_buffer();
+      // This pixel buffer might have a higher resolution than what the
+      // compression session is configured to. The compression session can
+      // handle that and will output encoded frames in the configured
+      // resolution regardless of the input pixel buffer resolution.
+      CVBufferRetain(pixel_buffer);
+    } else {
+      // Cropping required, we need to crop and scale to a new pixel buffer.
+      pixel_buffer = internal::CreatePixelBuffer(pixel_buffer_pool);
+      if (!pixel_buffer) {
+        return WEBRTC_VIDEO_CODEC_ERROR;
+      }
+      if (!core_video_frame_buffer->CropAndScaleTo(&nv12_scale_buffer_,
+                                                   pixel_buffer)) {
+        return WEBRTC_VIDEO_CODEC_ERROR;
       }
     }
-  }
-
-  if (!pixel_buffer) {
-    // We did not have a native frame, or the ObjCVideoFrame wrapped a non-native frame
+  } else {
     pixel_buffer = internal::CreatePixelBuffer(pixel_buffer_pool);
     if (!pixel_buffer) {
       return WEBRTC_VIDEO_CODEC_ERROR;
diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h
index 78eee5f..ddf8a6b 100644
--- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h
+++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h
@@ -22,8 +22,6 @@
   RTCVideoRotation_270 = 270,
 };
 
-@protocol RTCVideoFrameBuffer;
-
 // RTCVideoFrame is an ObjectiveC version of webrtc::VideoFrame.
 RTC_EXPORT
 @interface RTCVideoFrame : NSObject
@@ -38,35 +36,27 @@
  *  is null. It is always possible to get such a frame by calling
  *  newI420VideoFrame.
  */
-@property(nonatomic, readonly, nullable)
-    const uint8_t *dataY DEPRECATED_MSG_ATTRIBUTE("use [buffer toI420]");
-@property(nonatomic, readonly, nullable)
-    const uint8_t *dataU DEPRECATED_MSG_ATTRIBUTE("use [buffer toI420]");
-@property(nonatomic, readonly, nullable)
-    const uint8_t *dataV DEPRECATED_MSG_ATTRIBUTE("use [buffer toI420]");
-@property(nonatomic, readonly) int strideY DEPRECATED_MSG_ATTRIBUTE("use [buffer toI420]");
-@property(nonatomic, readonly) int strideU DEPRECATED_MSG_ATTRIBUTE("use [buffer toI420]");
-@property(nonatomic, readonly) int strideV DEPRECATED_MSG_ATTRIBUTE("use [buffer toI420]");
+@property(nonatomic, readonly, nullable) const uint8_t *dataY;
+@property(nonatomic, readonly, nullable) const uint8_t *dataU;
+@property(nonatomic, readonly, nullable) const uint8_t *dataV;
+@property(nonatomic, readonly) int strideY;
+@property(nonatomic, readonly) int strideU;
+@property(nonatomic, readonly) int strideV;
 
 /** Timestamp in nanoseconds. */
 @property(nonatomic, readonly) int64_t timeStampNs;
 
 /** The native handle should be a pixel buffer on iOS. */
-@property(nonatomic, readonly)
-    CVPixelBufferRef nativeHandle DEPRECATED_MSG_ATTRIBUTE("use buffer instead");
-
-@property(nonatomic, readonly) id<RTCVideoFrameBuffer> buffer;
+@property(nonatomic, readonly) CVPixelBufferRef nativeHandle;
 
 - (instancetype)init NS_UNAVAILABLE;
 - (instancetype)new NS_UNAVAILABLE;
 
 /** Initialize an RTCVideoFrame from a pixel buffer, rotation, and timestamp.
- *  Deprecated - initialize with a RTCCVPixelBuffer instead
  */
 - (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
                            rotation:(RTCVideoRotation)rotation
-                        timeStampNs:(int64_t)timeStampNs
-    DEPRECATED_MSG_ATTRIBUTE("use initWithBuffer instead");
+                        timeStampNs:(int64_t)timeStampNs;
 
 /** Initialize an RTCVideoFrame from a pixel buffer combined with cropping and
  *  scaling. Cropping will be applied first on the pixel buffer, followed by
@@ -80,14 +70,7 @@
                               cropX:(int)cropX
                               cropY:(int)cropY
                            rotation:(RTCVideoRotation)rotation
-                        timeStampNs:(int64_t)timeStampNs
-    DEPRECATED_MSG_ATTRIBUTE("use initWithBuffer instead");
-
-/** Initialize an RTCVideoFrame from a frame buffer, rotation, and timestamp.
- */
-- (instancetype)initWithBuffer:(id<RTCVideoFrameBuffer>)frameBuffer
-                      rotation:(RTCVideoRotation)rotation
-                   timeStampNs:(int64_t)timeStampNs;
+                        timeStampNs:(int64_t)timeStampNs;
 
 /** Return a frame that is guaranteed to be I420, i.e. it is possible to access
  *  the YUV data on it.
diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h
deleted file mode 100644
index 59986b8..0000000
--- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  Copyright 2017 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 <AVFoundation/AVFoundation.h>
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@protocol RTCI420Buffer;
-
-// RTCVideoFrameBuffer is an ObjectiveC version of webrtc::VideoFrameBuffer.
-RTC_EXPORT
-@protocol RTCVideoFrameBuffer <NSObject>
-
-@property(nonatomic, readonly) int width;
-@property(nonatomic, readonly) int height;
-
-- (id<RTCI420Buffer>)toI420;
-
-@end
-
-/** Protocol for RTCVideoFrameBuffers containing YUV planar data. */
-@protocol RTCYUVPlanarBuffer <RTCVideoFrameBuffer>
-
-@property(nonatomic, readonly) int chromaWidth;
-@property(nonatomic, readonly) int chromaHeight;
-@property(nonatomic, readonly) const uint8_t *dataY;
-@property(nonatomic, readonly) const uint8_t *dataU;
-@property(nonatomic, readonly) const uint8_t *dataV;
-@property(nonatomic, readonly) int strideY;
-@property(nonatomic, readonly) int strideU;
-@property(nonatomic, readonly) int strideV;
-
-- (instancetype)initWithWidth:(int)width height:(int)height;
-- (instancetype)initWithWidth:(int)width
-                       height:(int)height
-                      strideY:(int)strideY
-                      strideU:(int)strideU
-                      strideV:(int)strideV;
-
-@end
-
-/** Extension of the YUV planar data buffer with mutable data access */
-@protocol RTCMutableYUVPlanarBuffer <RTCYUVPlanarBuffer>
-
-@property(nonatomic, readonly) uint8_t *mutableDataY;
-@property(nonatomic, readonly) uint8_t *mutableDataU;
-@property(nonatomic, readonly) uint8_t *mutableDataV;
-
-@end
-
-/** Protocol for RTCYUVPlanarBuffers containing I420 data */
-@protocol RTCI420Buffer <RTCYUVPlanarBuffer>
-@end
-
-/** Extension of the I420 buffer with mutable data access */
-@protocol RTCMutableI420Buffer <RTCI420Buffer, RTCMutableYUVPlanarBuffer>
-@end
-
-/** RTCVideoFrameBuffer containing a CVPixelBufferRef */
-@interface RTCCVPixelBuffer : NSObject <RTCVideoFrameBuffer>
-
-@property(nonatomic, readonly) CVPixelBufferRef pixelBuffer;
-
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer;
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
-                       adaptedWidth:(int)adaptedWidth
-                      adaptedHeight:(int)adaptedHeight
-                          cropWidth:(int)cropWidth
-                         cropHeight:(int)cropHeight
-                              cropX:(int)cropX
-                              cropY:(int)cropY;
-
-- (BOOL)requiresCropping;
-- (BOOL)requiresScalingToWidth:(int)width height:(int)height;
-- (int)bufferSizeForCroppingAndScalingToWidth:(int)width height:(int)height;
-/** The minimum size of the |tmpBuffer| must be the number of bytes returned from the
- * bufferSizeForCroppingAndScalingToWidth:height: method.
- */
-- (BOOL)cropAndScaleTo:(CVPixelBufferRef)outputPixelBuffer withTempBuffer:(uint8_t *)tmpBuffer;
-
-@end
-
-/** RTCI420Buffer implements the RTCI420Buffer protocol */
-@interface RTCI420Buffer : NSObject <RTCI420Buffer>
-@end
-
-/** Mutable version of RTCI420Buffer */
-@interface RTCMutableI420Buffer : RTCI420Buffer <RTCMutableI420Buffer>
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/webrtc/sdk/objc/Framework/UnitTests/RTCMTLVideoViewTests.mm b/webrtc/sdk/objc/Framework/UnitTests/RTCMTLVideoViewTests.mm
index 3743326..99004ea 100644
--- a/webrtc/sdk/objc/Framework/UnitTests/RTCMTLVideoViewTests.mm
+++ b/webrtc/sdk/objc/Framework/UnitTests/RTCMTLVideoViewTests.mm
@@ -15,7 +15,6 @@
 
 #include <Metal/RTCMTLNV12Renderer.h>
 #include <WebRTC/RTCMTLVideoView.h>
-#include <WebRTC/RTCVideoFrameBuffer.h>
 
 // Extension of RTCMTLVideoView for testing purposes.
 @interface RTCMTLVideoView (Testing)
@@ -60,14 +59,12 @@
   self.frameMock = nil;
 }
 
-- (id)frameMockWithCVPixelBuffer:(BOOL)hasCVPixelBuffer {
+- (id)frameMockWithNativeHandle:(BOOL)hasNativeHandle {
   id frameMock = OCMClassMock([RTCVideoFrame class]);
-  if (hasCVPixelBuffer) {
-    OCMStub([frameMock buffer])
-        .andReturn(
-            [[RTCCVPixelBuffer alloc] initWithPixelBuffer:(CVPixelBufferRef)[OCMArg anyPointer]]);
+  if (hasNativeHandle) {
+    OCMStub([frameMock nativeHandle]).andReturn((CVPixelBufferRef)[OCMArg anyPointer]);
   } else {
-    OCMStub([frameMock buffer]).andReturn([[RTCI420Buffer alloc] initWithWidth:200 height:200]);
+    OCMStub([frameMock nativeHandle]).andReturn((CVPixelBufferRef) nullptr);
   }
   return frameMock;
 }
@@ -102,7 +99,7 @@
   RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] init];
   self.frameMock = OCMClassMock([RTCVideoFrame class]);
 
-  [[self.frameMock reject] buffer];
+  [[self.frameMock reject] nativeHandle];
   [[self.classMock reject] createNV12Renderer];
   [[self.classMock reject] createI420Renderer];
 
@@ -119,7 +116,7 @@
   // given
   OCMStub([self.classMock isMetalAvailable]).andReturn(YES);
   self.rendererI420Mock = [self rendererMockWithSuccessfulSetup:YES];
-  self.frameMock = [self frameMockWithCVPixelBuffer:NO];
+  self.frameMock = [self frameMockWithNativeHandle:NO];
 
   OCMExpect([self.rendererI420Mock drawFrame:self.frameMock]);
   OCMExpect([self.classMock createI420Renderer]).andReturn(self.rendererI420Mock);
@@ -140,7 +137,7 @@
   // given
   OCMStub([self.classMock isMetalAvailable]).andReturn(YES);
   self.rendererNV12Mock = [self rendererMockWithSuccessfulSetup:YES];
-  self.frameMock = [self frameMockWithCVPixelBuffer:YES];
+  self.frameMock = [self frameMockWithNativeHandle:YES];
 
   OCMExpect([self.rendererNV12Mock drawFrame:self.frameMock]);
   OCMExpect([self.classMock createNV12Renderer]).andReturn(self.rendererNV12Mock);