blob: 07992a0202c75cc8f0c67239ea5187e957eff464 [file] [log] [blame]
Jon Hjelle81028792016-01-11 13:16:13 -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
Yura Yaroshevich415920b2018-02-22 13:55:22 +030011#import "RTCAudioTrack+Private.h"
tkchin9eeb6242016-04-27 01:54:20 -070012#import "RTCMediaStreamTrack+Private.h"
Yura Yaroshevich415920b2018-02-22 13:55:22 +030013#import "RTCVideoTrack+Private.h"
Jon Hjelle81028792016-01-11 13:16:13 -080014
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020015#import "helpers/NSString+StdString.h"
Jon Hjelle81028792016-01-11 13:16:13 -080016
skvladf3569c82016-04-29 15:30:16 -070017NSString * const kRTCMediaStreamTrackKindAudio =
18 @(webrtc::MediaStreamTrackInterface::kAudioKind);
19NSString * const kRTCMediaStreamTrackKindVideo =
20 @(webrtc::MediaStreamTrackInterface::kVideoKind);
21
Jon Hjelle81028792016-01-11 13:16:13 -080022@implementation RTCMediaStreamTrack {
Yura Yaroshevich01cee072018-07-11 15:35:40 +030023 RTCPeerConnectionFactory *_factory;
Jon Hjelle81028792016-01-11 13:16:13 -080024 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> _nativeTrack;
Jon Hjelleca91e382016-01-21 15:36:47 -080025 RTCMediaStreamTrackType _type;
Jon Hjelle81028792016-01-11 13:16:13 -080026}
27
28- (NSString *)kind {
29 return [NSString stringForStdString:_nativeTrack->kind()];
30}
31
32- (NSString *)trackId {
33 return [NSString stringForStdString:_nativeTrack->id()];
34}
35
36- (BOOL)isEnabled {
37 return _nativeTrack->enabled();
38}
39
40- (void)setIsEnabled:(BOOL)isEnabled {
41 _nativeTrack->set_enabled(isEnabled);
42}
43
44- (RTCMediaStreamTrackState)readyState {
45 return [[self class] trackStateForNativeState:_nativeTrack->state()];
46}
47
48- (NSString *)description {
49 NSString *readyState = [[self class] stringForState:self.readyState];
50 return [NSString stringWithFormat:@"RTCMediaStreamTrack:\n%@\n%@\n%@\n%@",
51 self.kind,
52 self.trackId,
53 self.isEnabled ? @"enabled" : @"disabled",
54 readyState];
55}
56
skvlad79b4b872016-04-08 17:28:55 -070057- (BOOL)isEqual:(id)object {
58 if (self == object) {
59 return YES;
60 }
61 if (![object isMemberOfClass:[self class]]) {
62 return NO;
63 }
64 return [self isEqualToTrack:(RTCMediaStreamTrack *)object];
65}
66
67- (NSUInteger)hash {
68 return (NSUInteger)_nativeTrack.get();
69}
70
Jon Hjelle81028792016-01-11 13:16:13 -080071#pragma mark - Private
72
73- (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack {
74 return _nativeTrack;
75}
76
Yura Yaroshevich01cee072018-07-11 15:35:40 +030077@synthesize factory = _factory;
78
79- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
80 nativeTrack:(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
81 type:(RTCMediaStreamTrackType)type {
Jon Hjelle81028792016-01-11 13:16:13 -080082 NSParameterAssert(nativeTrack);
Yura Yaroshevich01cee072018-07-11 15:35:40 +030083 NSParameterAssert(factory);
Jon Hjelle81028792016-01-11 13:16:13 -080084 if (self = [super init]) {
Yura Yaroshevich01cee072018-07-11 15:35:40 +030085 _factory = factory;
Jon Hjelle81028792016-01-11 13:16:13 -080086 _nativeTrack = nativeTrack;
Jon Hjelleca91e382016-01-21 15:36:47 -080087 _type = type;
Jon Hjelle81028792016-01-11 13:16:13 -080088 }
89 return self;
90}
91
Yura Yaroshevich01cee072018-07-11 15:35:40 +030092- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
93 nativeTrack:(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack {
skvlad79b4b872016-04-08 17:28:55 -070094 NSParameterAssert(nativeTrack);
95 if (nativeTrack->kind() ==
96 std::string(webrtc::MediaStreamTrackInterface::kAudioKind)) {
Yura Yaroshevich01cee072018-07-11 15:35:40 +030097 return [self initWithFactory:factory nativeTrack:nativeTrack type:RTCMediaStreamTrackTypeAudio];
skvlad79b4b872016-04-08 17:28:55 -070098 }
99 if (nativeTrack->kind() ==
100 std::string(webrtc::MediaStreamTrackInterface::kVideoKind)) {
Yura Yaroshevich01cee072018-07-11 15:35:40 +0300101 return [self initWithFactory:factory nativeTrack:nativeTrack type:RTCMediaStreamTrackTypeVideo];
skvlad79b4b872016-04-08 17:28:55 -0700102 }
103 return nil;
104}
105
106- (BOOL)isEqualToTrack:(RTCMediaStreamTrack *)track {
107 if (!track) {
108 return NO;
109 }
110 return _nativeTrack == track.nativeTrack;
111}
112
Jon Hjelle81028792016-01-11 13:16:13 -0800113+ (webrtc::MediaStreamTrackInterface::TrackState)nativeTrackStateForState:
114 (RTCMediaStreamTrackState)state {
115 switch (state) {
Jon Hjelle81028792016-01-11 13:16:13 -0800116 case RTCMediaStreamTrackStateLive:
117 return webrtc::MediaStreamTrackInterface::kLive;
118 case RTCMediaStreamTrackStateEnded:
119 return webrtc::MediaStreamTrackInterface::kEnded;
Jon Hjelle81028792016-01-11 13:16:13 -0800120 }
121}
122
123+ (RTCMediaStreamTrackState)trackStateForNativeState:
124 (webrtc::MediaStreamTrackInterface::TrackState)nativeState {
125 switch (nativeState) {
Jon Hjelle81028792016-01-11 13:16:13 -0800126 case webrtc::MediaStreamTrackInterface::kLive:
127 return RTCMediaStreamTrackStateLive;
128 case webrtc::MediaStreamTrackInterface::kEnded:
129 return RTCMediaStreamTrackStateEnded;
Jon Hjelle81028792016-01-11 13:16:13 -0800130 }
131}
132
133+ (NSString *)stringForState:(RTCMediaStreamTrackState)state {
134 switch (state) {
Jon Hjelle81028792016-01-11 13:16:13 -0800135 case RTCMediaStreamTrackStateLive:
136 return @"Live";
137 case RTCMediaStreamTrackStateEnded:
138 return @"Ended";
Jon Hjelle81028792016-01-11 13:16:13 -0800139 }
140}
141
Yura Yaroshevich415920b2018-02-22 13:55:22 +0300142+ (RTCMediaStreamTrack *)mediaTrackForNativeTrack:
Yura Yaroshevich01cee072018-07-11 15:35:40 +0300143 (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
144 factory:(RTCPeerConnectionFactory *)factory {
Yura Yaroshevich415920b2018-02-22 13:55:22 +0300145 NSParameterAssert(nativeTrack);
Yura Yaroshevich01cee072018-07-11 15:35:40 +0300146 NSParameterAssert(factory);
Yura Yaroshevich415920b2018-02-22 13:55:22 +0300147 if (nativeTrack->kind() == webrtc::MediaStreamTrackInterface::kAudioKind) {
Yura Yaroshevich01cee072018-07-11 15:35:40 +0300148 return [[RTCAudioTrack alloc] initWithFactory:factory
149 nativeTrack:nativeTrack
150 type:RTCMediaStreamTrackTypeAudio];
Yura Yaroshevich415920b2018-02-22 13:55:22 +0300151 } else if (nativeTrack->kind() == webrtc::MediaStreamTrackInterface::kVideoKind) {
Yura Yaroshevich01cee072018-07-11 15:35:40 +0300152 return [[RTCVideoTrack alloc] initWithFactory:factory
153 nativeTrack:nativeTrack
154 type:RTCMediaStreamTrackTypeVideo];
Yura Yaroshevich415920b2018-02-22 13:55:22 +0300155 } else {
Yura Yaroshevich01cee072018-07-11 15:35:40 +0300156 return [[RTCMediaStreamTrack alloc] initWithFactory:factory nativeTrack:nativeTrack];
Yura Yaroshevich415920b2018-02-22 13:55:22 +0300157 }
158}
159
Jon Hjelle81028792016-01-11 13:16:13 -0800160@end