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;
}