blob: 4b2b75415f43ecff32e4a056c4524dbecee45935 [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
tkchin9eeb6242016-04-27 01:54:20 -070011#import "RTCVideoFrame+Private.h"
Jon Hjelle78234952016-01-11 09:47:07 -080012
kwibergbfefb032016-05-01 14:53:46 -070013#include <memory>
Jon Hjelle78234952016-01-11 09:47:07 -080014
magjedfb372f02016-08-10 07:58:29 -070015#include "webrtc/common_video/rotation.h"
16
Jon Hjelle78234952016-01-11 09:47:07 -080017@implementation RTCVideoFrame {
magjedfb372f02016-08-10 07:58:29 -070018 rtc::scoped_refptr<webrtc::VideoFrameBuffer> _videoBuffer;
19 webrtc::VideoRotation _rotation;
20 int64_t _timeStampNs;
tkchin7d06a8c2016-04-04 14:10:43 -070021 rtc::scoped_refptr<webrtc::VideoFrameBuffer> _i420Buffer;
Jon Hjelle78234952016-01-11 09:47:07 -080022}
23
24- (size_t)width {
magjedfb372f02016-08-10 07:58:29 -070025 return _videoBuffer->width();
Jon Hjelle78234952016-01-11 09:47:07 -080026}
27
28- (size_t)height {
magjedfb372f02016-08-10 07:58:29 -070029 return _videoBuffer->height();
30}
31
32- (int)rotation {
33 return static_cast<int>(_rotation);
Jon Hjelle78234952016-01-11 09:47:07 -080034}
35
nisse71a0c2f2016-04-04 00:57:29 -070036// TODO(nisse): chromaWidth and chromaHeight are used only in
37// RTCOpenGLVideoRenderer.mm. Update, and then delete these
38// properties.
Jon Hjelle78234952016-01-11 09:47:07 -080039- (size_t)chromaWidth {
nisse71a0c2f2016-04-04 00:57:29 -070040 return (self.width + 1) / 2;
Jon Hjelle78234952016-01-11 09:47:07 -080041}
42
43- (size_t)chromaHeight {
nisse71a0c2f2016-04-04 00:57:29 -070044 return (self.height + 1) / 2;
Jon Hjelle78234952016-01-11 09:47:07 -080045}
46
47- (const uint8_t *)yPlane {
tkchin7d06a8c2016-04-04 14:10:43 -070048 if (!self.i420Buffer) {
49 return nullptr;
50 }
nisseca6d5d12016-06-17 05:03:04 -070051 return self.i420Buffer->DataY();
Jon Hjelle78234952016-01-11 09:47:07 -080052}
53
54- (const uint8_t *)uPlane {
tkchin7d06a8c2016-04-04 14:10:43 -070055 if (!self.i420Buffer) {
56 return nullptr;
57 }
nisseca6d5d12016-06-17 05:03:04 -070058 return self.i420Buffer->DataU();
Jon Hjelle78234952016-01-11 09:47:07 -080059}
60
61- (const uint8_t *)vPlane {
tkchin7d06a8c2016-04-04 14:10:43 -070062 if (!self.i420Buffer) {
63 return nullptr;
64 }
nisseca6d5d12016-06-17 05:03:04 -070065 return self.i420Buffer->DataV();
Jon Hjelle78234952016-01-11 09:47:07 -080066}
67
68- (int32_t)yPitch {
tkchin7d06a8c2016-04-04 14:10:43 -070069 if (!self.i420Buffer) {
70 return 0;
71 }
nisseca6d5d12016-06-17 05:03:04 -070072 return self.i420Buffer->StrideY();
Jon Hjelle78234952016-01-11 09:47:07 -080073}
74
75- (int32_t)uPitch {
tkchin7d06a8c2016-04-04 14:10:43 -070076 if (!self.i420Buffer) {
77 return 0;
78 }
nisseca6d5d12016-06-17 05:03:04 -070079 return self.i420Buffer->StrideU();
Jon Hjelle78234952016-01-11 09:47:07 -080080}
81
82- (int32_t)vPitch {
tkchin7d06a8c2016-04-04 14:10:43 -070083 if (!self.i420Buffer) {
84 return 0;
85 }
nisseca6d5d12016-06-17 05:03:04 -070086 return self.i420Buffer->StrideV();
tkchin7d06a8c2016-04-04 14:10:43 -070087}
88
magjedfb372f02016-08-10 07:58:29 -070089- (int64_t)timeStampNs {
90 return _timeStampNs;
tkchin7d06a8c2016-04-04 14:10:43 -070091}
92
93- (CVPixelBufferRef)nativeHandle {
magjedfb372f02016-08-10 07:58:29 -070094 return static_cast<CVPixelBufferRef>(_videoBuffer->native_handle());
tkchin7d06a8c2016-04-04 14:10:43 -070095}
96
97- (void)convertBufferIfNeeded {
98 if (!_i420Buffer) {
magjedfb372f02016-08-10 07:58:29 -070099 _i420Buffer = _videoBuffer->native_handle()
100 ? _videoBuffer->NativeToI420Buffer()
101 : _videoBuffer;
tkchin7d06a8c2016-04-04 14:10:43 -0700102 }
Jon Hjelle78234952016-01-11 09:47:07 -0800103}
104
105#pragma mark - Private
106
magjedfb372f02016-08-10 07:58:29 -0700107- (instancetype)initWithVideoBuffer:
108 (rtc::scoped_refptr<webrtc::VideoFrameBuffer>)videoBuffer
109 rotation:(webrtc::VideoRotation)rotation
110 timeStampNs:(int64_t)timeStampNs {
Jon Hjelle78234952016-01-11 09:47:07 -0800111 if (self = [super init]) {
magjedfb372f02016-08-10 07:58:29 -0700112 _videoBuffer = videoBuffer;
113 _rotation = rotation;
114 _timeStampNs = timeStampNs;
Jon Hjelle78234952016-01-11 09:47:07 -0800115 }
116 return self;
117}
118
tkchin7d06a8c2016-04-04 14:10:43 -0700119- (rtc::scoped_refptr<webrtc::VideoFrameBuffer>)i420Buffer {
120 [self convertBufferIfNeeded];
121 return _i420Buffer;
122}
123
Jon Hjelle78234952016-01-11 09:47:07 -0800124@end