blob: 19dd2452cd04f54af1bc6bc4db77873b5c43b8b2 [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
Anders Carlsson7e042812017-10-05 16:55:38 +020011#import "RTCVideoFrame+Private.h"
12
anderscf9f448b2017-08-17 02:31:55 -070013#import "WebRTC/RTCVideoFrame.h"
14#import "WebRTC/RTCVideoFrameBuffer.h"
magjedc3c46242017-02-21 05:28:48 -080015
Anders Carlsson7e042812017-10-05 16:55:38 +020016#include "api/video/video_frame.h"
17#include "rtc_base/timeutils.h"
18
19id<RTCVideoFrameBuffer> nativeToRtcFrameBuffer(
20 const rtc::scoped_refptr<webrtc::VideoFrameBuffer> &buffer) {
21 return buffer->type() == webrtc::VideoFrameBuffer::Type::kNative ?
22 static_cast<webrtc::ObjCFrameBuffer *>(buffer.get())->wrapped_frame_buffer() :
23 [[RTCI420Buffer alloc] initWithFrameBuffer:buffer->ToI420()];
24}
25
Jon Hjelle78234952016-01-11 09:47:07 -080026@implementation RTCVideoFrame {
magjed7ee51252017-02-21 04:19:46 -080027 RTCVideoRotation _rotation;
magjedfb372f02016-08-10 07:58:29 -070028 int64_t _timeStampNs;
Jon Hjelle78234952016-01-11 09:47:07 -080029}
30
Anders Carlssone5960ce2017-06-22 15:26:30 +020031@synthesize buffer = _buffer;
kthelgasonfb143122017-07-25 07:55:58 -070032@synthesize timeStamp;
Anders Carlssone5960ce2017-06-22 15:26:30 +020033
magjed7ee51252017-02-21 04:19:46 -080034- (int)width {
Anders Carlssone5960ce2017-06-22 15:26:30 +020035 return _buffer.width;
Jon Hjelle78234952016-01-11 09:47:07 -080036}
37
magjed7ee51252017-02-21 04:19:46 -080038- (int)height {
Anders Carlssone5960ce2017-06-22 15:26:30 +020039 return _buffer.height;
magjedfb372f02016-08-10 07:58:29 -070040}
41
magjed7ee51252017-02-21 04:19:46 -080042- (RTCVideoRotation)rotation {
43 return _rotation;
Jon Hjelle78234952016-01-11 09:47:07 -080044}
45
magjedfb372f02016-08-10 07:58:29 -070046- (int64_t)timeStampNs {
47 return _timeStampNs;
tkchin7d06a8c2016-04-04 14:10:43 -070048}
49
magjed7ee51252017-02-21 04:19:46 -080050- (RTCVideoFrame *)newI420VideoFrame {
Anders Carlssone5960ce2017-06-22 15:26:30 +020051 return [[RTCVideoFrame alloc] initWithBuffer:[_buffer toI420]
52 rotation:_rotation
53 timeStampNs:_timeStampNs];
Jon Hjelle78234952016-01-11 09:47:07 -080054}
55
magjedc3c46242017-02-21 05:28:48 -080056- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
57 rotation:(RTCVideoRotation)rotation
58 timeStampNs:(int64_t)timeStampNs {
Anders Carlssone5960ce2017-06-22 15:26:30 +020059 return [self initWithBuffer:[[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer]
60 rotation:rotation
61 timeStampNs:timeStampNs];
magjedc3c46242017-02-21 05:28:48 -080062}
63
64- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
65 scaledWidth:(int)scaledWidth
66 scaledHeight:(int)scaledHeight
67 cropWidth:(int)cropWidth
68 cropHeight:(int)cropHeight
69 cropX:(int)cropX
70 cropY:(int)cropY
71 rotation:(RTCVideoRotation)rotation
72 timeStampNs:(int64_t)timeStampNs {
Anders Carlssone5960ce2017-06-22 15:26:30 +020073 RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer
74 adaptedWidth:scaledWidth
75 adaptedHeight:scaledHeight
76 cropWidth:cropWidth
77 cropHeight:cropHeight
78 cropX:cropX
79 cropY:cropY];
80 return [self initWithBuffer:rtcPixelBuffer rotation:rotation timeStampNs:timeStampNs];
magjedc3c46242017-02-21 05:28:48 -080081}
82
Anders Carlssone5960ce2017-06-22 15:26:30 +020083- (instancetype)initWithBuffer:(id<RTCVideoFrameBuffer>)buffer
84 rotation:(RTCVideoRotation)rotation
85 timeStampNs:(int64_t)timeStampNs {
Jon Hjelle78234952016-01-11 09:47:07 -080086 if (self = [super init]) {
Anders Carlssone5960ce2017-06-22 15:26:30 +020087 _buffer = buffer;
magjedfb372f02016-08-10 07:58:29 -070088 _rotation = rotation;
89 _timeStampNs = timeStampNs;
Jon Hjelle78234952016-01-11 09:47:07 -080090 }
Anders Carlsson0789dab2017-06-21 08:41:26 +000091
Anders Carlssone5960ce2017-06-22 15:26:30 +020092 return self;
Anders Carlsson1cfeb432017-06-22 13:06:39 +000093}
94
Anders Carlsson7e042812017-10-05 16:55:38 +020095- (instancetype)initWithNativeVideoFrame:(const webrtc::VideoFrame &)frame {
96 if (self = [self initWithBuffer:nativeToRtcFrameBuffer(frame.video_frame_buffer())
97 rotation:RTCVideoRotation(frame.rotation())
98 timeStampNs:frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec]) {
99 self.timeStamp = frame.timestamp();
100 }
101
102 return self;
103}
104
105- (webrtc::VideoFrame)nativeVideoFrame {
106 rtc::scoped_refptr<webrtc::VideoFrameBuffer> frameBuffer =
107 new rtc::RefCountedObject<webrtc::ObjCFrameBuffer>(self.buffer);
108 webrtc::VideoFrame videoFrame(frameBuffer,
109 (webrtc::VideoRotation)self.rotation,
110 self.timeStampNs / rtc::kNumNanosecsPerMicrosec);
111 videoFrame.set_timestamp(self.timeStamp);
112 return videoFrame;
113}
114
Jon Hjelle78234952016-01-11 09:47:07 -0800115@end