blob: 95f4ac82bfe3fd2350461f49842bcc2c0ca92cec [file] [log] [blame]
Jon Hjelle78234952016-01-11 09:47:07 -08001/*
2 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#import "RTCVideoFrame.h"
12
13#include "webrtc/base/scoped_ptr.h"
14
15#import "webrtc/api/objc/RTCVideoFrame+Private.h"
16
17@implementation RTCVideoFrame {
18 rtc::scoped_ptr<cricket::VideoFrame> _videoFrame;
tkchin7d06a8c2016-04-04 14:10:43 -070019 rtc::scoped_refptr<webrtc::VideoFrameBuffer> _i420Buffer;
Jon Hjelle78234952016-01-11 09:47:07 -080020}
21
22- (size_t)width {
nisse71a0c2f2016-04-04 00:57:29 -070023 return _videoFrame->width();
Jon Hjelle78234952016-01-11 09:47:07 -080024}
25
26- (size_t)height {
nisse71a0c2f2016-04-04 00:57:29 -070027 return _videoFrame->height();
Jon Hjelle78234952016-01-11 09:47:07 -080028}
29
nisse71a0c2f2016-04-04 00:57:29 -070030// TODO(nisse): chromaWidth and chromaHeight are used only in
31// RTCOpenGLVideoRenderer.mm. Update, and then delete these
32// properties.
Jon Hjelle78234952016-01-11 09:47:07 -080033- (size_t)chromaWidth {
nisse71a0c2f2016-04-04 00:57:29 -070034 return (self.width + 1) / 2;
Jon Hjelle78234952016-01-11 09:47:07 -080035}
36
37- (size_t)chromaHeight {
nisse71a0c2f2016-04-04 00:57:29 -070038 return (self.height + 1) / 2;
Jon Hjelle78234952016-01-11 09:47:07 -080039}
40
41- (const uint8_t *)yPlane {
tkchin7d06a8c2016-04-04 14:10:43 -070042 if (!self.i420Buffer) {
43 return nullptr;
44 }
45 return self.i420Buffer->data(webrtc::kYPlane);
Jon Hjelle78234952016-01-11 09:47:07 -080046}
47
48- (const uint8_t *)uPlane {
tkchin7d06a8c2016-04-04 14:10:43 -070049 if (!self.i420Buffer) {
50 return nullptr;
51 }
52 return self.i420Buffer->data(webrtc::kUPlane);
Jon Hjelle78234952016-01-11 09:47:07 -080053}
54
55- (const uint8_t *)vPlane {
tkchin7d06a8c2016-04-04 14:10:43 -070056 if (!self.i420Buffer) {
57 return nullptr;
58 }
59 return self.i420Buffer->data(webrtc::kVPlane);
Jon Hjelle78234952016-01-11 09:47:07 -080060}
61
62- (int32_t)yPitch {
tkchin7d06a8c2016-04-04 14:10:43 -070063 if (!self.i420Buffer) {
64 return 0;
65 }
66 return self.i420Buffer->stride(webrtc::kYPlane);
Jon Hjelle78234952016-01-11 09:47:07 -080067}
68
69- (int32_t)uPitch {
tkchin7d06a8c2016-04-04 14:10:43 -070070 if (!self.i420Buffer) {
71 return 0;
72 }
73 return self.i420Buffer->stride(webrtc::kUPlane);
Jon Hjelle78234952016-01-11 09:47:07 -080074}
75
76- (int32_t)vPitch {
tkchin7d06a8c2016-04-04 14:10:43 -070077 if (!self.i420Buffer) {
78 return 0;
79 }
80 return self.i420Buffer->stride(webrtc::kVPlane);
81}
82
83- (int64_t)timeStamp {
84 return _videoFrame->GetTimeStamp();
85}
86
87- (CVPixelBufferRef)nativeHandle {
88 return static_cast<CVPixelBufferRef>(_videoFrame->GetNativeHandle());
89}
90
91- (void)convertBufferIfNeeded {
92 if (!_i420Buffer) {
93 if (_videoFrame->GetNativeHandle()) {
94 // Convert to I420.
95 _i420Buffer = _videoFrame->GetVideoFrameBuffer()->NativeToI420Buffer();
96 } else {
97 // Should already be I420.
98 _i420Buffer = _videoFrame->GetVideoFrameBuffer();
99 }
100 }
Jon Hjelle78234952016-01-11 09:47:07 -0800101}
102
103#pragma mark - Private
104
105- (instancetype)initWithNativeFrame:(const cricket::VideoFrame *)nativeFrame {
106 if (self = [super init]) {
107 // Keep a shallow copy of the video frame. The underlying frame buffer is
108 // not copied.
109 _videoFrame.reset(nativeFrame->Copy());
110 }
111 return self;
112}
113
tkchin7d06a8c2016-04-04 14:10:43 -0700114- (rtc::scoped_refptr<webrtc::VideoFrameBuffer>)i420Buffer {
115 [self convertBufferIfNeeded];
116 return _i420Buffer;
117}
118
Jon Hjelle78234952016-01-11 09:47:07 -0800119@end