| Index: webrtc/api/objc/RTCVideoFrame.mm
|
| diff --git a/webrtc/api/objc/RTCVideoFrame.mm b/webrtc/api/objc/RTCVideoFrame.mm
|
| index db2d07ba31a82a1e8371529cc5ff22592a42034e..9205e30973d32cdd8cd17b5e2addbb162e703662 100644
|
| --- a/webrtc/api/objc/RTCVideoFrame.mm
|
| +++ b/webrtc/api/objc/RTCVideoFrame.mm
|
| @@ -16,6 +16,7 @@
|
|
|
| @implementation RTCVideoFrame {
|
| rtc::scoped_ptr<cricket::VideoFrame> _videoFrame;
|
| + rtc::scoped_refptr<webrtc::VideoFrameBuffer> _i420Buffer;
|
| }
|
|
|
| - (size_t)width {
|
| @@ -39,30 +40,65 @@
|
| }
|
|
|
| - (const uint8_t *)yPlane {
|
| - const cricket::VideoFrame *const_frame = _videoFrame.get();
|
| - return const_frame->GetYPlane();
|
| + if (!self.i420Buffer) {
|
| + return nullptr;
|
| + }
|
| + return self.i420Buffer->data(webrtc::kYPlane);
|
| }
|
|
|
| - (const uint8_t *)uPlane {
|
| - const cricket::VideoFrame *const_frame = _videoFrame.get();
|
| - return const_frame->GetUPlane();
|
| + if (!self.i420Buffer) {
|
| + return nullptr;
|
| + }
|
| + return self.i420Buffer->data(webrtc::kUPlane);
|
| }
|
|
|
| - (const uint8_t *)vPlane {
|
| - const cricket::VideoFrame *const_frame = _videoFrame.get();
|
| - return const_frame->GetVPlane();
|
| + if (!self.i420Buffer) {
|
| + return nullptr;
|
| + }
|
| + return self.i420Buffer->data(webrtc::kVPlane);
|
| }
|
|
|
| - (int32_t)yPitch {
|
| - return _videoFrame->GetYPitch();
|
| + if (!self.i420Buffer) {
|
| + return 0;
|
| + }
|
| + return self.i420Buffer->stride(webrtc::kYPlane);
|
| }
|
|
|
| - (int32_t)uPitch {
|
| - return _videoFrame->GetUPitch();
|
| + if (!self.i420Buffer) {
|
| + return 0;
|
| + }
|
| + return self.i420Buffer->stride(webrtc::kUPlane);
|
| }
|
|
|
| - (int32_t)vPitch {
|
| - return _videoFrame->GetVPitch();
|
| + if (!self.i420Buffer) {
|
| + return 0;
|
| + }
|
| + return self.i420Buffer->stride(webrtc::kVPlane);
|
| +}
|
| +
|
| +- (int64_t)timeStamp {
|
| + return _videoFrame->GetTimeStamp();
|
| +}
|
| +
|
| +- (CVPixelBufferRef)nativeHandle {
|
| + return static_cast<CVPixelBufferRef>(_videoFrame->GetNativeHandle());
|
| +}
|
| +
|
| +- (void)convertBufferIfNeeded {
|
| + if (!_i420Buffer) {
|
| + if (_videoFrame->GetNativeHandle()) {
|
| + // Convert to I420.
|
| + _i420Buffer = _videoFrame->GetVideoFrameBuffer()->NativeToI420Buffer();
|
| + } else {
|
| + // Should already be I420.
|
| + _i420Buffer = _videoFrame->GetVideoFrameBuffer();
|
| + }
|
| + }
|
| }
|
|
|
| #pragma mark - Private
|
| @@ -76,4 +112,9 @@
|
| return self;
|
| }
|
|
|
| +- (rtc::scoped_refptr<webrtc::VideoFrameBuffer>)i420Buffer {
|
| + [self convertBufferIfNeeded];
|
| + return _i420Buffer;
|
| +}
|
| +
|
| @end
|
|
|