iOS render: Handle frame rotation in OpenGL

This CL handles frame rotation by updating the OpenGL vertex data in
RTCOpenGLVideoRenderer, instead of calling the expensive
libyuv::I420Rotate that will rotate the actual memory. Also, we can
handle rotated native frames instead of falling back to
NativeToI420Buffer.

Review-Url: https://codereview.webrtc.org/2176623002
Cr-Commit-Position: refs/heads/master@{#13715}
diff --git a/webrtc/sdk/objc/Framework/Classes/RTCVideoFrame.mm b/webrtc/sdk/objc/Framework/Classes/RTCVideoFrame.mm
index 5b2d258..4b2b754 100644
--- a/webrtc/sdk/objc/Framework/Classes/RTCVideoFrame.mm
+++ b/webrtc/sdk/objc/Framework/Classes/RTCVideoFrame.mm
@@ -12,17 +12,25 @@
 
 #include <memory>
 
+#include "webrtc/common_video/rotation.h"
+
 @implementation RTCVideoFrame {
-  std::unique_ptr<cricket::VideoFrame> _videoFrame;
+  rtc::scoped_refptr<webrtc::VideoFrameBuffer> _videoBuffer;
+  webrtc::VideoRotation _rotation;
+  int64_t _timeStampNs;
   rtc::scoped_refptr<webrtc::VideoFrameBuffer> _i420Buffer;
 }
 
 - (size_t)width {
-  return _videoFrame->width();
+  return _videoBuffer->width();
 }
 
 - (size_t)height {
-  return _videoFrame->height();
+  return _videoBuffer->height();
+}
+
+- (int)rotation {
+  return static_cast<int>(_rotation);
 }
 
 // TODO(nisse): chromaWidth and chromaHeight are used only in
@@ -78,34 +86,32 @@
   return self.i420Buffer->StrideV();
 }
 
-- (int64_t)timeStamp {
-  return _videoFrame->GetTimeStamp();
+- (int64_t)timeStampNs {
+  return _timeStampNs;
 }
 
 - (CVPixelBufferRef)nativeHandle {
-  return static_cast<CVPixelBufferRef>(
-      _videoFrame->video_frame_buffer()->native_handle());
+  return static_cast<CVPixelBufferRef>(_videoBuffer->native_handle());
 }
 
 - (void)convertBufferIfNeeded {
   if (!_i420Buffer) {
-    if (_videoFrame->video_frame_buffer()->native_handle()) {
-      // Convert to I420.
-      _i420Buffer = _videoFrame->video_frame_buffer()->NativeToI420Buffer();
-    } else {
-      // Should already be I420.
-      _i420Buffer = _videoFrame->video_frame_buffer();
-    }
+    _i420Buffer = _videoBuffer->native_handle()
+                      ? _videoBuffer->NativeToI420Buffer()
+                      : _videoBuffer;
   }
 }
 
 #pragma mark - Private
 
-- (instancetype)initWithNativeFrame:(const cricket::VideoFrame *)nativeFrame {
+- (instancetype)initWithVideoBuffer:
+                    (rtc::scoped_refptr<webrtc::VideoFrameBuffer>)videoBuffer
+                           rotation:(webrtc::VideoRotation)rotation
+                        timeStampNs:(int64_t)timeStampNs {
   if (self = [super init]) {
-    // Keep a shallow copy of the video frame. The underlying frame buffer is
-    // not copied.
-    _videoFrame.reset(nativeFrame->Copy());
+    _videoBuffer = videoBuffer;
+    _rotation = rotation;
+    _timeStampNs = timeStampNs;
   }
   return self;
 }