From 91a4300da4c426b6594b65225e369bcee492aebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Krafft?= Date: Mon, 3 Dec 2018 17:17:53 +0100 Subject: [PATCH] Added forgotten assets and fixed version 1.16.x for android --- android/build.gradle | 2 +- ios/Headers/RTCAudioSession.h | 248 ++++++++++++++ ios/Headers/RTCAudioSessionConfiguration.h | 48 +++ ios/Headers/RTCAudioSource.h | 32 ++ ios/Headers/RTCAudioTrack.h | 28 ++ ios/Headers/RTCCallbackLogger.h | 35 ++ ios/Headers/RTCCameraPreviewView.h | 30 ++ ios/Headers/RTCCameraVideoCapturer.h | 55 +++ ios/Headers/RTCConfiguration.h | 173 ++++++++++ ios/Headers/RTCDataChannel.h | 134 ++++++++ ios/Headers/RTCDataChannelConfiguration.h | 52 +++ ios/Headers/RTCDispatcher.h | 45 +++ ios/Headers/RTCDtmfSender.h | 70 ++++ ios/Headers/RTCEAGLVideoView.h | 45 +++ ios/Headers/RTCFieldTrials.h | 44 +++ ios/Headers/RTCFileLogger.h | 77 +++++ ios/Headers/RTCFileVideoCapturer.h | 50 +++ ios/Headers/RTCIceCandidate.h | 50 +++ ios/Headers/RTCIceServer.h | 114 +++++++ ios/Headers/RTCIntervalRange.h | 28 ++ ios/Headers/RTCLegacyStatsReport.h | 37 ++ ios/Headers/RTCLogging.h | 69 ++++ ios/Headers/RTCMacros.h | 28 ++ ios/Headers/RTCMediaConstraints.h | 55 +++ ios/Headers/RTCMediaSource.h | 34 ++ ios/Headers/RTCMediaStream.h | 49 +++ ios/Headers/RTCMediaStreamTrack.h | 50 +++ ios/Headers/RTCMetrics.h | 24 ++ ios/Headers/RTCMetricsSampleInfo.h | 48 +++ ios/Headers/RTCPeerConnection.h | 323 ++++++++++++++++++ ios/Headers/RTCPeerConnectionFactory.h | 86 +++++ ios/Headers/RTCPeerConnectionFactoryOptions.h | 40 +++ ios/Headers/RTCRtpCodecParameters.h | 70 ++++ ios/Headers/RTCRtpEncodingParameters.h | 35 ++ ios/Headers/RTCRtpParameters.h | 32 ++ ios/Headers/RTCRtpReceiver.h | 82 +++++ ios/Headers/RTCRtpSender.h | 50 +++ ios/Headers/RTCRtpTransceiver.h | 128 +++++++ ios/Headers/RTCSSLAdapter.h | 20 ++ ios/Headers/RTCSessionDescription.h | 48 +++ ios/Headers/RTCTracing.h | 21 ++ ios/Headers/RTCVideoCapturer.h | 31 ++ ios/Headers/RTCVideoCodec.h | 185 ++++++++++ ios/Headers/RTCVideoCodecFactory.h | 54 +++ ios/Headers/RTCVideoCodecH264.h | 50 +++ ios/Headers/RTCVideoDecoderVP8.h | 25 ++ ios/Headers/RTCVideoDecoderVP9.h | 25 ++ ios/Headers/RTCVideoEncoderVP8.h | 25 ++ ios/Headers/RTCVideoEncoderVP9.h | 25 ++ ios/Headers/RTCVideoFrame.h | 85 +++++ ios/Headers/RTCVideoFrameBuffer.h | 111 ++++++ ios/Headers/RTCVideoRenderer.h | 33 ++ ios/Headers/RTCVideoSource.h | 37 ++ ios/Headers/RTCVideoTrack.h | 37 ++ ios/Headers/RTCVideoViewShading.h | 41 +++ ios/Headers/UIDevice+RTCDevice.h | 68 ++++ ios/Headers/WebRTC.h | 65 ++++ ios/Info.plist | Bin 0 -> 775 bytes .../GTMOAuth2ViewTouch.nib | Bin 0 -> 3648 bytes .../GoogleSignIn.bundle/Info.plist | 24 ++ .../GoogleSignIn.bundle/Roboto-Bold.ttf | Bin 0 -> 127744 bytes .../ar.lproj/GoogleSignIn.strings | 44 +++ .../ca.lproj/GoogleSignIn.strings | 44 +++ .../cs.lproj/GoogleSignIn.strings | 44 +++ .../da.lproj/GoogleSignIn.strings | 44 +++ .../de.lproj/GoogleSignIn.strings | 44 +++ .../el.lproj/GoogleSignIn.strings | 44 +++ .../en.lproj/GoogleSignIn.strings | 44 +++ .../en_GB.lproj/GoogleSignIn.strings | 44 +++ .../es.lproj/GoogleSignIn.strings | 44 +++ .../es_MX.lproj/GoogleSignIn.strings | 44 +++ .../fi.lproj/GoogleSignIn.strings | 44 +++ .../fr.lproj/GoogleSignIn.strings | 44 +++ .../fr_CA.lproj/GoogleSignIn.strings | 44 +++ .../GoogleSignIn.bundle/google.png | Bin 0 -> 572 bytes .../GoogleSignIn.bundle/google@2x.png | Bin 0 -> 987 bytes .../GoogleSignIn.bundle/google@3x.png | Bin 0 -> 1622 bytes .../he.lproj/GoogleSignIn.strings | 44 +++ .../hi.lproj/GoogleSignIn.strings | 44 +++ .../hr.lproj/GoogleSignIn.strings | 44 +++ .../hu.lproj/GoogleSignIn.strings | 44 +++ .../id.lproj/GoogleSignIn.strings | 44 +++ .../it.lproj/GoogleSignIn.strings | 44 +++ .../ja.lproj/GoogleSignIn.strings | 44 +++ .../ko.lproj/GoogleSignIn.strings | 44 +++ .../ms.lproj/GoogleSignIn.strings | 44 +++ .../nb.lproj/GoogleSignIn.strings | 44 +++ .../nl.lproj/GoogleSignIn.strings | 44 +++ .../pl.lproj/GoogleSignIn.strings | 44 +++ .../pt.lproj/GoogleSignIn.strings | 44 +++ .../pt_BR.lproj/GoogleSignIn.strings | 44 +++ .../pt_PT.lproj/GoogleSignIn.strings | 44 +++ .../ro.lproj/GoogleSignIn.strings | 44 +++ .../ru.lproj/GoogleSignIn.strings | 44 +++ .../sk.lproj/GoogleSignIn.strings | 44 +++ .../sv.lproj/GoogleSignIn.strings | 44 +++ .../th.lproj/GoogleSignIn.strings | 44 +++ .../tr.lproj/GoogleSignIn.strings | 44 +++ .../uk.lproj/GoogleSignIn.strings | 44 +++ .../vi.lproj/GoogleSignIn.strings | 44 +++ .../zh_CN.lproj/GoogleSignIn.strings | 44 +++ .../zh_TW.lproj/GoogleSignIn.strings | 44 +++ .../JitsiMeet.swiftmodule/i386.swiftdoc | Bin 0 -> 4284 bytes .../JitsiMeet.swiftmodule/i386.swiftmodule | Bin 0 -> 58688 bytes .../JitsiMeet.swiftmodule/x86_64.swiftdoc | Bin 0 -> 4288 bytes .../JitsiMeet.swiftmodule/x86_64.swiftmodule | Bin 0 -> 58692 bytes .../images/btn_google_signin_dark_normal.png | Bin 0 -> 8001 bytes ios/Modules/module.modulemap | 6 + package.json | 2 +- 109 files changed, 5288 insertions(+), 2 deletions(-) create mode 100644 ios/Headers/RTCAudioSession.h create mode 100644 ios/Headers/RTCAudioSessionConfiguration.h create mode 100644 ios/Headers/RTCAudioSource.h create mode 100644 ios/Headers/RTCAudioTrack.h create mode 100644 ios/Headers/RTCCallbackLogger.h create mode 100644 ios/Headers/RTCCameraPreviewView.h create mode 100644 ios/Headers/RTCCameraVideoCapturer.h create mode 100644 ios/Headers/RTCConfiguration.h create mode 100644 ios/Headers/RTCDataChannel.h create mode 100644 ios/Headers/RTCDataChannelConfiguration.h create mode 100644 ios/Headers/RTCDispatcher.h create mode 100644 ios/Headers/RTCDtmfSender.h create mode 100644 ios/Headers/RTCEAGLVideoView.h create mode 100644 ios/Headers/RTCFieldTrials.h create mode 100644 ios/Headers/RTCFileLogger.h create mode 100644 ios/Headers/RTCFileVideoCapturer.h create mode 100644 ios/Headers/RTCIceCandidate.h create mode 100644 ios/Headers/RTCIceServer.h create mode 100644 ios/Headers/RTCIntervalRange.h create mode 100644 ios/Headers/RTCLegacyStatsReport.h create mode 100644 ios/Headers/RTCLogging.h create mode 100644 ios/Headers/RTCMacros.h create mode 100644 ios/Headers/RTCMediaConstraints.h create mode 100644 ios/Headers/RTCMediaSource.h create mode 100644 ios/Headers/RTCMediaStream.h create mode 100644 ios/Headers/RTCMediaStreamTrack.h create mode 100644 ios/Headers/RTCMetrics.h create mode 100644 ios/Headers/RTCMetricsSampleInfo.h create mode 100644 ios/Headers/RTCPeerConnection.h create mode 100644 ios/Headers/RTCPeerConnectionFactory.h create mode 100644 ios/Headers/RTCPeerConnectionFactoryOptions.h create mode 100644 ios/Headers/RTCRtpCodecParameters.h create mode 100644 ios/Headers/RTCRtpEncodingParameters.h create mode 100644 ios/Headers/RTCRtpParameters.h create mode 100644 ios/Headers/RTCRtpReceiver.h create mode 100644 ios/Headers/RTCRtpSender.h create mode 100644 ios/Headers/RTCRtpTransceiver.h create mode 100644 ios/Headers/RTCSSLAdapter.h create mode 100644 ios/Headers/RTCSessionDescription.h create mode 100644 ios/Headers/RTCTracing.h create mode 100644 ios/Headers/RTCVideoCapturer.h create mode 100644 ios/Headers/RTCVideoCodec.h create mode 100644 ios/Headers/RTCVideoCodecFactory.h create mode 100644 ios/Headers/RTCVideoCodecH264.h create mode 100644 ios/Headers/RTCVideoDecoderVP8.h create mode 100644 ios/Headers/RTCVideoDecoderVP9.h create mode 100644 ios/Headers/RTCVideoEncoderVP8.h create mode 100644 ios/Headers/RTCVideoEncoderVP9.h create mode 100644 ios/Headers/RTCVideoFrame.h create mode 100644 ios/Headers/RTCVideoFrameBuffer.h create mode 100644 ios/Headers/RTCVideoRenderer.h create mode 100644 ios/Headers/RTCVideoSource.h create mode 100644 ios/Headers/RTCVideoTrack.h create mode 100644 ios/Headers/RTCVideoViewShading.h create mode 100644 ios/Headers/UIDevice+RTCDevice.h create mode 100644 ios/Headers/WebRTC.h create mode 100644 ios/Info.plist create mode 100644 ios/JitsiMeet.framework/GTMOAuth2ViewTouch.nib create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/Info.plist create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/Roboto-Bold.ttf create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/google.png create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/google@2x.png create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/google@3x.png create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings create mode 100755 ios/JitsiMeet.framework/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings create mode 100644 ios/JitsiMeet.framework/Modules/JitsiMeet.swiftmodule/i386.swiftdoc create mode 100644 ios/JitsiMeet.framework/Modules/JitsiMeet.swiftmodule/i386.swiftmodule create mode 100644 ios/JitsiMeet.framework/Modules/JitsiMeet.swiftmodule/x86_64.swiftdoc create mode 100644 ios/JitsiMeet.framework/Modules/JitsiMeet.swiftmodule/x86_64.swiftmodule create mode 100644 ios/JitsiMeet.framework/assets/images/btn_google_signin_dark_normal.png create mode 100644 ios/Modules/module.modulemap diff --git a/android/build.gradle b/android/build.gradle index fe74de2c..eaba25bc 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -45,7 +45,7 @@ repositories { } dependencies { - implementation ('org.jitsi.react:jitsi-meet-sdk:+') { + implementation ('org.jitsi.react:jitsi-meet-sdk:1.16+') { transitive = true } } diff --git a/ios/Headers/RTCAudioSession.h b/ios/Headers/RTCAudioSession.h new file mode 100644 index 00000000..354634ec --- /dev/null +++ b/ios/Headers/RTCAudioSession.h @@ -0,0 +1,248 @@ +/* + * Copyright 2016 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +extern NSString * const kRTCAudioSessionErrorDomain; +/** Method that requires lock was called without lock. */ +extern NSInteger const kRTCAudioSessionErrorLockRequired; +/** Unknown configuration error occurred. */ +extern NSInteger const kRTCAudioSessionErrorConfiguration; + +@class RTCAudioSession; +@class RTCAudioSessionConfiguration; + +// Surfaces AVAudioSession events. WebRTC will listen directly for notifications +// from AVAudioSession and handle them before calling these delegate methods, +// at which point applications can perform additional processing if required. +RTC_EXPORT +@protocol RTCAudioSessionDelegate + +@optional +/** Called on a system notification thread when AVAudioSession starts an + * interruption event. + */ +- (void)audioSessionDidBeginInterruption:(RTCAudioSession *)session; + +/** Called on a system notification thread when AVAudioSession ends an + * interruption event. + */ +- (void)audioSessionDidEndInterruption:(RTCAudioSession *)session + shouldResumeSession:(BOOL)shouldResumeSession; + +/** Called on a system notification thread when AVAudioSession changes the + * route. + */ +- (void)audioSessionDidChangeRoute:(RTCAudioSession *)session + reason:(AVAudioSessionRouteChangeReason)reason + previousRoute:(AVAudioSessionRouteDescription *)previousRoute; + +/** Called on a system notification thread when AVAudioSession media server + * terminates. + */ +- (void)audioSessionMediaServerTerminated:(RTCAudioSession *)session; + +/** Called on a system notification thread when AVAudioSession media server + * restarts. + */ +- (void)audioSessionMediaServerReset:(RTCAudioSession *)session; + +// TODO(tkchin): Maybe handle SilenceSecondaryAudioHintNotification. + +- (void)audioSession:(RTCAudioSession *)session + didChangeCanPlayOrRecord:(BOOL)canPlayOrRecord; + +/** Called on a WebRTC thread when the audio device is notified to begin + * playback or recording. + */ +- (void)audioSessionDidStartPlayOrRecord:(RTCAudioSession *)session; + +/** Called on a WebRTC thread when the audio device is notified to stop + * playback or recording. + */ +- (void)audioSessionDidStopPlayOrRecord:(RTCAudioSession *)session; + +/** Called when the AVAudioSession output volume value changes. */ +- (void)audioSession:(RTCAudioSession *)audioSession + didChangeOutputVolume:(float)outputVolume; + +/** Called when the audio device detects a playout glitch. The argument is the + * number of glitches detected so far in the current audio playout session. + */ +- (void)audioSession:(RTCAudioSession *)audioSession + didDetectPlayoutGlitch:(int64_t)totalNumberOfGlitches; + +@end + +/** This is a protocol used to inform RTCAudioSession when the audio session + * activation state has changed outside of RTCAudioSession. The current known use + * case of this is when CallKit activates the audio session for the application + */ +RTC_EXPORT +@protocol RTCAudioSessionActivationDelegate + +/** Called when the audio session is activated outside of the app by iOS. */ +- (void)audioSessionDidActivate:(AVAudioSession *)session; + +/** Called when the audio session is deactivated outside of the app by iOS. */ +- (void)audioSessionDidDeactivate:(AVAudioSession *)session; + +@end + +/** Proxy class for AVAudioSession that adds a locking mechanism similar to + * AVCaptureDevice. This is used to that interleaving configurations between + * WebRTC and the application layer are avoided. + * + * RTCAudioSession also coordinates activation so that the audio session is + * activated only once. See |setActive:error:|. + */ +RTC_EXPORT +@interface RTCAudioSession : NSObject + +/** Convenience property to access the AVAudioSession singleton. Callers should + * not call setters on AVAudioSession directly, but other method invocations + * are fine. + */ +@property(nonatomic, readonly) AVAudioSession *session; + +/** Our best guess at whether the session is active based on results of calls to + * AVAudioSession. + */ +@property(nonatomic, readonly) BOOL isActive; +/** Whether RTCAudioSession is currently locked for configuration. */ +@property(nonatomic, readonly) BOOL isLocked; + +/** If YES, WebRTC will not initialize the audio unit automatically when an + * audio track is ready for playout or recording. Instead, applications should + * call setIsAudioEnabled. If NO, WebRTC will initialize the audio unit + * as soon as an audio track is ready for playout or recording. + */ +@property(nonatomic, assign) BOOL useManualAudio; + +/** This property is only effective if useManualAudio is YES. + * Represents permission for WebRTC to initialize the VoIP audio unit. + * When set to NO, if the VoIP audio unit used by WebRTC is active, it will be + * stopped and uninitialized. This will stop incoming and outgoing audio. + * When set to YES, WebRTC will initialize and start the audio unit when it is + * needed (e.g. due to establishing an audio connection). + * This property was introduced to work around an issue where if an AVPlayer is + * playing audio while the VoIP audio unit is initialized, its audio would be + * either cut off completely or played at a reduced volume. By preventing + * the audio unit from being initialized until after the audio has completed, + * we are able to prevent the abrupt cutoff. + */ +@property(nonatomic, assign) BOOL isAudioEnabled; + +// Proxy properties. +@property(readonly) NSString *category; +@property(readonly) AVAudioSessionCategoryOptions categoryOptions; +@property(readonly) NSString *mode; +@property(readonly) BOOL secondaryAudioShouldBeSilencedHint; +@property(readonly) AVAudioSessionRouteDescription *currentRoute; +@property(readonly) NSInteger maximumInputNumberOfChannels; +@property(readonly) NSInteger maximumOutputNumberOfChannels; +@property(readonly) float inputGain; +@property(readonly) BOOL inputGainSettable; +@property(readonly) BOOL inputAvailable; +@property(readonly, nullable) + NSArray * inputDataSources; +@property(readonly, nullable) + AVAudioSessionDataSourceDescription *inputDataSource; +@property(readonly, nullable) + NSArray * outputDataSources; +@property(readonly, nullable) + AVAudioSessionDataSourceDescription *outputDataSource; +@property(readonly) double sampleRate; +@property(readonly) double preferredSampleRate; +@property(readonly) NSInteger inputNumberOfChannels; +@property(readonly) NSInteger outputNumberOfChannels; +@property(readonly) float outputVolume; +@property(readonly) NSTimeInterval inputLatency; +@property(readonly) NSTimeInterval outputLatency; +@property(readonly) NSTimeInterval IOBufferDuration; +@property(readonly) NSTimeInterval preferredIOBufferDuration; + +/** Default constructor. */ ++ (instancetype)sharedInstance; +- (instancetype)init NS_UNAVAILABLE; + +/** Adds a delegate, which is held weakly. */ +- (void)addDelegate:(id)delegate; +/** Removes an added delegate. */ +- (void)removeDelegate:(id)delegate; + +/** Request exclusive access to the audio session for configuration. This call + * will block if the lock is held by another object. + */ +- (void)lockForConfiguration; +/** Relinquishes exclusive access to the audio session. */ +- (void)unlockForConfiguration; + +/** If |active|, activates the audio session if it isn't already active. + * Successful calls must be balanced with a setActive:NO when activation is no + * longer required. If not |active|, deactivates the audio session if one is + * active and this is the last balanced call. When deactivating, the + * AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation option is passed to + * AVAudioSession. + */ +- (BOOL)setActive:(BOOL)active + error:(NSError **)outError; + +// The following methods are proxies for the associated methods on +// AVAudioSession. |lockForConfiguration| must be called before using them +// otherwise they will fail with kRTCAudioSessionErrorLockRequired. + +- (BOOL)setCategory:(NSString *)category + withOptions:(AVAudioSessionCategoryOptions)options + error:(NSError **)outError; +- (BOOL)setMode:(NSString *)mode error:(NSError **)outError; +- (BOOL)setInputGain:(float)gain error:(NSError **)outError; +- (BOOL)setPreferredSampleRate:(double)sampleRate error:(NSError **)outError; +- (BOOL)setPreferredIOBufferDuration:(NSTimeInterval)duration + error:(NSError **)outError; +- (BOOL)setPreferredInputNumberOfChannels:(NSInteger)count + error:(NSError **)outError; +- (BOOL)setPreferredOutputNumberOfChannels:(NSInteger)count + error:(NSError **)outError; +- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride + error:(NSError **)outError; +- (BOOL)setPreferredInput:(AVAudioSessionPortDescription *)inPort + error:(NSError **)outError; +- (BOOL)setInputDataSource:(AVAudioSessionDataSourceDescription *)dataSource + error:(NSError **)outError; +- (BOOL)setOutputDataSource:(AVAudioSessionDataSourceDescription *)dataSource + error:(NSError **)outError; +@end + +@interface RTCAudioSession (Configuration) + +/** Applies the configuration to the current session. Attempts to set all + * properties even if previous ones fail. Only the last error will be + * returned. + * |lockForConfiguration| must be called first. + */ +- (BOOL)setConfiguration:(RTCAudioSessionConfiguration *)configuration + error:(NSError **)outError; + +/** Convenience method that calls both setConfiguration and setActive. + * |lockForConfiguration| must be called first. + */ +- (BOOL)setConfiguration:(RTCAudioSessionConfiguration *)configuration + active:(BOOL)active + error:(NSError **)outError; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCAudioSessionConfiguration.h b/ios/Headers/RTCAudioSessionConfiguration.h new file mode 100644 index 00000000..6a02751d --- /dev/null +++ b/ios/Headers/RTCAudioSessionConfiguration.h @@ -0,0 +1,48 @@ +/* + * Copyright 2016 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +#import "WebRTC/RTCMacros.h" + +NS_ASSUME_NONNULL_BEGIN + +extern const int kRTCAudioSessionPreferredNumberOfChannels; +extern const double kRTCAudioSessionHighPerformanceSampleRate; +extern const double kRTCAudioSessionLowComplexitySampleRate; +extern const double kRTCAudioSessionHighPerformanceIOBufferDuration; +extern const double kRTCAudioSessionLowComplexityIOBufferDuration; + +// Struct to hold configuration values. +RTC_EXPORT +@interface RTCAudioSessionConfiguration : NSObject + +@property(nonatomic, strong) NSString *category; +@property(nonatomic, assign) AVAudioSessionCategoryOptions categoryOptions; +@property(nonatomic, strong) NSString *mode; +@property(nonatomic, assign) double sampleRate; +@property(nonatomic, assign) NSTimeInterval ioBufferDuration; +@property(nonatomic, assign) NSInteger inputNumberOfChannels; +@property(nonatomic, assign) NSInteger outputNumberOfChannels; + +/** Initializes configuration to defaults. */ +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +/** Returns the current configuration of the audio session. */ ++ (instancetype)currentConfiguration; +/** Returns the configuration that WebRTC needs. */ ++ (instancetype)webRTCConfiguration; +/** Provide a way to override the default configuration. */ ++ (void)setWebRTCConfiguration:(RTCAudioSessionConfiguration *)configuration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCAudioSource.h b/ios/Headers/RTCAudioSource.h new file mode 100644 index 00000000..3db31573 --- /dev/null +++ b/ios/Headers/RTCAudioSource.h @@ -0,0 +1,32 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCAudioSource : RTCMediaSource + +- (instancetype)init NS_UNAVAILABLE; + +// Sets the volume for the RTCMediaSource. |volume| is a gain value in the range +// [0, 10]. +// Temporary fix to be able to modify volume of remote audio tracks. +// TODO(kthelgason): Property stays here temporarily until a proper volume-api +// is available on the surface exposed by webrtc. +@property(nonatomic, assign) double volume; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCAudioTrack.h b/ios/Headers/RTCAudioTrack.h new file mode 100644 index 00000000..b83eede5 --- /dev/null +++ b/ios/Headers/RTCAudioTrack.h @@ -0,0 +1,28 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@class RTCAudioSource; + +RTC_EXPORT +@interface RTCAudioTrack : RTCMediaStreamTrack + +- (instancetype)init NS_UNAVAILABLE; + +/** The audio source for this audio track. */ +@property(nonatomic, readonly) RTCAudioSource *source; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCCallbackLogger.h b/ios/Headers/RTCCallbackLogger.h new file mode 100644 index 00000000..cdfe17f6 --- /dev/null +++ b/ios/Headers/RTCCallbackLogger.h @@ -0,0 +1,35 @@ +/* + * Copyright 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +// This class intercepts WebRTC logs and forwards them to a registered block. +// This class is not threadsafe. +RTC_EXPORT +@interface RTCCallbackLogger : NSObject + +// The severity level to capture. The default is kRTCLoggingSeverityInfo. +@property(nonatomic, assign) RTCLoggingSeverity severity; + +// The callback will be called on the same thread that does the logging, so +// if the logging callback can be slow it may be a good idea to implement +// dispatching to some other queue. +- (void)start:(nullable void (^)(NSString*))callback; + +- (void)stop; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCCameraPreviewView.h b/ios/Headers/RTCCameraPreviewView.h new file mode 100644 index 00000000..d62bb01e --- /dev/null +++ b/ios/Headers/RTCCameraPreviewView.h @@ -0,0 +1,30 @@ +/* + * Copyright 2015 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +#import + +@class AVCaptureSession; + +/** RTCCameraPreviewView is a view that renders local video from an + * AVCaptureSession. + */ +RTC_EXPORT +@interface RTCCameraPreviewView : UIView + +/** The capture session being rendered in the view. Capture session + * is assigned to AVCaptureVideoPreviewLayer async in the same + * queue that the AVCaptureSession is started/stopped. + */ +@property(nonatomic, strong) AVCaptureSession *captureSession; + +@end diff --git a/ios/Headers/RTCCameraVideoCapturer.h b/ios/Headers/RTCCameraVideoCapturer.h new file mode 100644 index 00000000..5c7406fc --- /dev/null +++ b/ios/Headers/RTCCameraVideoCapturer.h @@ -0,0 +1,55 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +// Camera capture that implements RTCVideoCapturer. Delivers frames to a RTCVideoCapturerDelegate +// (usually RTCVideoSource). +@interface RTCCameraVideoCapturer : RTCVideoCapturer + +// Capture session that is used for capturing. Valid from initialization to dealloc. +@property(readonly, nonatomic) AVCaptureSession *captureSession; + +// Returns list of available capture devices that support video capture. ++ (NSArray *)captureDevices; +// Returns list of formats that are supported by this class for this device. ++ (NSArray *)supportedFormatsForDevice:(AVCaptureDevice *)device; + +// Returns the most efficient supported output pixel format for this capturer. +- (FourCharCode)preferredOutputPixelFormat; + +// Starts the capture session asynchronously and notifies callback on completion. +// The device will capture video in the format given in the `format` parameter. If the pixel format +// in `format` is supported by the WebRTC pipeline, the same pixel format will be used for the +// output. Otherwise, the format returned by `preferredOutputPixelFormat` will be used. +- (void)startCaptureWithDevice:(AVCaptureDevice *)device + format:(AVCaptureDeviceFormat *)format + fps:(NSInteger)fps + completionHandler:(nullable void (^)(NSError *))completionHandler; +// Stops the capture session asynchronously and notifies callback on completion. +- (void)stopCaptureWithCompletionHandler:(nullable void (^)(void))completionHandler; + +// Starts the capture session asynchronously. +- (void)startCaptureWithDevice:(AVCaptureDevice *)device + format:(AVCaptureDeviceFormat *)format + fps:(NSInteger)fps; +// Stops the capture session asynchronously. +- (void)stopCapture; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCConfiguration.h b/ios/Headers/RTCConfiguration.h new file mode 100644 index 00000000..97cc5a49 --- /dev/null +++ b/ios/Headers/RTCConfiguration.h @@ -0,0 +1,173 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +@class RTCIceServer; +@class RTCIntervalRange; + +/** + * Represents the ice transport policy. This exposes the same states in C++, + * which include one more state than what exists in the W3C spec. + */ +typedef NS_ENUM(NSInteger, RTCIceTransportPolicy) { + RTCIceTransportPolicyNone, + RTCIceTransportPolicyRelay, + RTCIceTransportPolicyNoHost, + RTCIceTransportPolicyAll +}; + +/** Represents the bundle policy. */ +typedef NS_ENUM(NSInteger, RTCBundlePolicy) { + RTCBundlePolicyBalanced, + RTCBundlePolicyMaxCompat, + RTCBundlePolicyMaxBundle +}; + +/** Represents the rtcp mux policy. */ +typedef NS_ENUM(NSInteger, RTCRtcpMuxPolicy) { + RTCRtcpMuxPolicyNegotiate, + RTCRtcpMuxPolicyRequire +}; + +/** Represents the tcp candidate policy. */ +typedef NS_ENUM(NSInteger, RTCTcpCandidatePolicy) { + RTCTcpCandidatePolicyEnabled, + RTCTcpCandidatePolicyDisabled +}; + +/** Represents the candidate network policy. */ +typedef NS_ENUM(NSInteger, RTCCandidateNetworkPolicy) { + RTCCandidateNetworkPolicyAll, + RTCCandidateNetworkPolicyLowCost +}; + +/** Represents the continual gathering policy. */ +typedef NS_ENUM(NSInteger, RTCContinualGatheringPolicy) { + RTCContinualGatheringPolicyGatherOnce, + RTCContinualGatheringPolicyGatherContinually +}; + +/** Represents the encryption key type. */ +typedef NS_ENUM(NSInteger, RTCEncryptionKeyType) { + RTCEncryptionKeyTypeRSA, + RTCEncryptionKeyTypeECDSA, +}; + +/** Represents the chosen SDP semantics for the RTCPeerConnection. */ +typedef NS_ENUM(NSInteger, RTCSdpSemantics) { + RTCSdpSemanticsDefault, + RTCSdpSemanticsPlanB, + RTCSdpSemanticsUnifiedPlan, +}; + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCConfiguration : NSObject + +/** An array of Ice Servers available to be used by ICE. */ +@property(nonatomic, copy) NSArray *iceServers; + +/** Which candidates the ICE agent is allowed to use. The W3C calls it + * |iceTransportPolicy|, while in C++ it is called |type|. */ +@property(nonatomic, assign) RTCIceTransportPolicy iceTransportPolicy; + +/** The media-bundling policy to use when gathering ICE candidates. */ +@property(nonatomic, assign) RTCBundlePolicy bundlePolicy; + +/** The rtcp-mux policy to use when gathering ICE candidates. */ +@property(nonatomic, assign) RTCRtcpMuxPolicy rtcpMuxPolicy; +@property(nonatomic, assign) RTCTcpCandidatePolicy tcpCandidatePolicy; +@property(nonatomic, assign) RTCCandidateNetworkPolicy candidateNetworkPolicy; +@property(nonatomic, assign) + RTCContinualGatheringPolicy continualGatheringPolicy; + +/** By default, the PeerConnection will use a limited number of IPv6 network + * interfaces, in order to avoid too many ICE candidate pairs being created + * and delaying ICE completion. + * + * Can be set to INT_MAX to effectively disable the limit. + */ +@property(nonatomic, assign) int maxIPv6Networks; + +/** Exclude link-local network interfaces + * from considertaion for gathering ICE candidates. + * Defaults to NO. + */ +@property(nonatomic, assign) BOOL disableLinkLocalNetworks; + +@property(nonatomic, assign) int audioJitterBufferMaxPackets; +@property(nonatomic, assign) BOOL audioJitterBufferFastAccelerate; +@property(nonatomic, assign) int iceConnectionReceivingTimeout; +@property(nonatomic, assign) int iceBackupCandidatePairPingInterval; + +/** Key type used to generate SSL identity. Default is ECDSA. */ +@property(nonatomic, assign) RTCEncryptionKeyType keyType; + +/** ICE candidate pool size as defined in JSEP. Default is 0. */ +@property(nonatomic, assign) int iceCandidatePoolSize; + +/** Prune turn ports on the same network to the same turn server. + * Default is NO. + */ +@property(nonatomic, assign) BOOL shouldPruneTurnPorts; + +/** If set to YES, this means the ICE transport should presume TURN-to-TURN + * candidate pairs will succeed, even before a binding response is received. + */ +@property(nonatomic, assign) BOOL shouldPresumeWritableWhenFullyRelayed; + +/** If set to non-nil, controls the minimal interval between consecutive ICE + * check packets. + */ +@property(nonatomic, copy, nullable) NSNumber *iceCheckMinInterval; + +/** ICE Periodic Regathering + * If set, WebRTC will periodically create and propose candidates without + * starting a new ICE generation. The regathering happens continuously with + * interval specified in milliseconds by the uniform distribution [a, b]. + */ +@property(nonatomic, strong, nullable) RTCIntervalRange *iceRegatherIntervalRange; + +/** Configure the SDP semantics used by this PeerConnection. Note that the + * WebRTC 1.0 specification requires UnifiedPlan semantics. The + * RTCRtpTransceiver API is only available with UnifiedPlan semantics. + * + * PlanB will cause RTCPeerConnection to create offers and answers with at + * most one audio and one video m= section with multiple RTCRtpSenders and + * RTCRtpReceivers specified as multiple a=ssrc lines within the section. This + * will also cause RTCPeerConnection to ignore all but the first m= section of + * the same media type. + * + * UnifiedPlan will cause RTCPeerConnection to create offers and answers with + * multiple m= sections where each m= section maps to one RTCRtpSender and one + * RTCRtpReceiver (an RTCRtpTransceiver), either both audio or both video. This + * will also cause RTCPeerConnection to ignore all but the first a=ssrc lines + * that form a Plan B stream. + * + * For users who only send at most one audio and one video track, this + * choice does not matter and should be left as Default. + * + * For users who wish to send multiple audio/video streams and need to stay + * interoperable with legacy WebRTC implementations, specify PlanB. + * + * For users who wish to send multiple audio/video streams and/or wish to + * use the new RTCRtpTransceiver API, specify UnifiedPlan. + */ +@property(nonatomic, assign) RTCSdpSemantics sdpSemantics; + +- (instancetype)init; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCDataChannel.h b/ios/Headers/RTCDataChannel.h new file mode 100644 index 00000000..893bd0a3 --- /dev/null +++ b/ios/Headers/RTCDataChannel.h @@ -0,0 +1,134 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCDataBuffer : NSObject + +/** NSData representation of the underlying buffer. */ +@property(nonatomic, readonly) NSData *data; + +/** Indicates whether |data| contains UTF-8 or binary data. */ +@property(nonatomic, readonly) BOOL isBinary; + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Initialize an RTCDataBuffer from NSData. |isBinary| indicates whether |data| + * contains UTF-8 or binary data. + */ +- (instancetype)initWithData:(NSData *)data isBinary:(BOOL)isBinary; + +@end + + +@class RTCDataChannel; +RTC_EXPORT +@protocol RTCDataChannelDelegate + +/** The data channel state changed. */ +- (void)dataChannelDidChangeState:(RTCDataChannel *)dataChannel; + +/** The data channel successfully received a data buffer. */ +- (void)dataChannel:(RTCDataChannel *)dataChannel + didReceiveMessageWithBuffer:(RTCDataBuffer *)buffer; + +@optional +/** The data channel's |bufferedAmount| changed. */ +- (void)dataChannel:(RTCDataChannel *)dataChannel + didChangeBufferedAmount:(uint64_t)amount; + +@end + + +/** Represents the state of the data channel. */ +typedef NS_ENUM(NSInteger, RTCDataChannelState) { + RTCDataChannelStateConnecting, + RTCDataChannelStateOpen, + RTCDataChannelStateClosing, + RTCDataChannelStateClosed, +}; + +RTC_EXPORT +@interface RTCDataChannel : NSObject + +/** + * A label that can be used to distinguish this data channel from other data + * channel objects. + */ +@property(nonatomic, readonly) NSString *label; + +/** Whether the data channel can send messages in unreliable mode. */ +@property(nonatomic, readonly) BOOL isReliable DEPRECATED_ATTRIBUTE; + +/** Returns whether this data channel is ordered or not. */ +@property(nonatomic, readonly) BOOL isOrdered; + +/** Deprecated. Use maxPacketLifeTime. */ +@property(nonatomic, readonly) NSUInteger maxRetransmitTime + DEPRECATED_ATTRIBUTE; + +/** + * The length of the time window (in milliseconds) during which transmissions + * and retransmissions may occur in unreliable mode. + */ +@property(nonatomic, readonly) uint16_t maxPacketLifeTime; + +/** + * The maximum number of retransmissions that are attempted in unreliable mode. + */ +@property(nonatomic, readonly) uint16_t maxRetransmits; + +/** + * The name of the sub-protocol used with this data channel, if any. Otherwise + * this returns an empty string. + */ +@property(nonatomic, readonly) NSString *protocol; + +/** + * Returns whether this data channel was negotiated by the application or not. + */ +@property(nonatomic, readonly) BOOL isNegotiated; + +/** Deprecated. Use channelId. */ +@property(nonatomic, readonly) NSInteger streamId DEPRECATED_ATTRIBUTE; + +/** The identifier for this data channel. */ +@property(nonatomic, readonly) int channelId; + +/** The state of the data channel. */ +@property(nonatomic, readonly) RTCDataChannelState readyState; + +/** + * The number of bytes of application data that have been queued using + * |sendData:| but that have not yet been transmitted to the network. + */ +@property(nonatomic, readonly) uint64_t bufferedAmount; + +/** The delegate for this data channel. */ +@property(nonatomic, weak) id delegate; + +- (instancetype)init NS_UNAVAILABLE; + +/** Closes the data channel. */ +- (void)close; + +/** Attempt to send |data| on this data channel's underlying data transport. */ +- (BOOL)sendData:(RTCDataBuffer *)data; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCDataChannelConfiguration.h b/ios/Headers/RTCDataChannelConfiguration.h new file mode 100644 index 00000000..65f59318 --- /dev/null +++ b/ios/Headers/RTCDataChannelConfiguration.h @@ -0,0 +1,52 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCDataChannelConfiguration : NSObject + +/** Set to YES if ordered delivery is required. */ +@property(nonatomic, assign) BOOL isOrdered; + +/** Deprecated. Use maxPacketLifeTime. */ +@property(nonatomic, assign) NSInteger maxRetransmitTimeMs DEPRECATED_ATTRIBUTE; + +/** + * Max period in milliseconds in which retransmissions will be sent. After this + * time, no more retransmissions will be sent. -1 if unset. + */ +@property(nonatomic, assign) int maxPacketLifeTime; + +/** The max number of retransmissions. -1 if unset. */ +@property(nonatomic, assign) int maxRetransmits; + +/** Set to YES if the channel has been externally negotiated and we do not send + * an in-band signalling in the form of an "open" message. + */ +@property(nonatomic, assign) BOOL isNegotiated; + +/** Deprecated. Use channelId. */ +@property(nonatomic, assign) int streamId DEPRECATED_ATTRIBUTE; + +/** The id of the data channel. */ +@property(nonatomic, assign) int channelId; + +/** Set by the application and opaque to the WebRTC implementation. */ +@property(nonatomic) NSString *protocol; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCDispatcher.h b/ios/Headers/RTCDispatcher.h new file mode 100644 index 00000000..3dddead6 --- /dev/null +++ b/ios/Headers/RTCDispatcher.h @@ -0,0 +1,45 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +typedef NS_ENUM(NSInteger, RTCDispatcherQueueType) { + // Main dispatcher queue. + RTCDispatcherTypeMain, + // Used for starting/stopping AVCaptureSession, and assigning + // capture session to AVCaptureVideoPreviewLayer. + RTCDispatcherTypeCaptureSession, + // Used for operations on AVAudioSession. + RTCDispatcherTypeAudioSession, +}; + +/** Dispatcher that asynchronously dispatches blocks to a specific + * shared dispatch queue. + */ +RTC_EXPORT +@interface RTCDispatcher : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** Dispatch the block asynchronously on the queue for dispatchType. + * @param dispatchType The queue type to dispatch on. + * @param block The block to dispatch asynchronously. + */ ++ (void)dispatchAsyncOnType:(RTCDispatcherQueueType)dispatchType + block:(dispatch_block_t)block; + +/** Returns YES if run on queue for the dispatchType otherwise NO. + * Useful for asserting that a method is run on a correct queue. + */ ++ (BOOL)isOnQueueForType:(RTCDispatcherQueueType)dispatchType; + +@end diff --git a/ios/Headers/RTCDtmfSender.h b/ios/Headers/RTCDtmfSender.h new file mode 100644 index 00000000..c69af026 --- /dev/null +++ b/ios/Headers/RTCDtmfSender.h @@ -0,0 +1,70 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@protocol RTCDtmfSender + +/** + * Returns true if this RTCDtmfSender is capable of sending DTMF. Otherwise + * returns false. To be able to send DTMF, the associated RTCRtpSender must be + * able to send packets, and a "telephone-event" codec must be negotiated. + */ +@property(nonatomic, readonly) BOOL canInsertDtmf; + +/** + * Queues a task that sends the DTMF tones. The tones parameter is treated + * as a series of characters. The characters 0 through 9, A through D, #, and * + * generate the associated DTMF tones. The characters a to d are equivalent + * to A to D. The character ',' indicates a delay of 2 seconds before + * processing the next character in the tones parameter. + * + * Unrecognized characters are ignored. + * + * @param duration The parameter indicates the duration to use for each + * character passed in the tones parameter. The duration cannot be more + * than 6000 or less than 70 ms. + * + * @param interToneGap The parameter indicates the gap between tones. + * This parameter must be at least 50 ms but should be as short as + * possible. + * + * If InsertDtmf is called on the same object while an existing task for this + * object to generate DTMF is still running, the previous task is canceled. + * Returns true on success and false on failure. + */ +- (BOOL)insertDtmf:(nonnull NSString *)tones + duration:(NSTimeInterval)duration + interToneGap:(NSTimeInterval)interToneGap; + +/** The tones remaining to be played out */ +- (nonnull NSString *)remainingTones; + +/** + * The current tone duration value. This value will be the value last set via the + * insertDtmf method, or the default value of 100 ms if insertDtmf was never called. + */ +- (NSTimeInterval)duration; + +/** + * The current value of the between-tone gap. This value will be the value last set + * via the insertDtmf() method, or the default value of 50 ms if insertDtmf() was never + * called. + */ +- (NSTimeInterval)interToneGap; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCEAGLVideoView.h b/ios/Headers/RTCEAGLVideoView.h new file mode 100644 index 00000000..60c624e0 --- /dev/null +++ b/ios/Headers/RTCEAGLVideoView.h @@ -0,0 +1,45 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@class RTCEAGLVideoView; +RTC_EXPORT +@protocol RTCEAGLVideoViewDelegate + +- (void)videoView:(RTCEAGLVideoView *)videoView didChangeVideoSize:(CGSize)size; + +@end + +/** + * RTCEAGLVideoView is an RTCVideoRenderer which renders video frames in its + * bounds using OpenGLES 2.0 or OpenGLES 3.0. + */ +RTC_EXPORT +@interface RTCEAGLVideoView : UIView + +@property(nonatomic, weak) id delegate; + +- (instancetype)initWithFrame:(CGRect)frame + shader:(id)shader NS_DESIGNATED_INITIALIZER; + +- (instancetype)initWithCoder:(NSCoder *)aDecoder + shader:(id)shader NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCFieldTrials.h b/ios/Headers/RTCFieldTrials.h new file mode 100644 index 00000000..e4b464d6 --- /dev/null +++ b/ios/Headers/RTCFieldTrials.h @@ -0,0 +1,44 @@ +/* + * Copyright 2016 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +/** The only valid value for the following if set is kRTCFieldTrialEnabledValue. */ +RTC_EXTERN NSString * const kRTCFieldTrialAudioSendSideBweKey; +RTC_EXTERN NSString * const kRTCFieldTrialAudioSendSideBweForVideoKey; +RTC_EXTERN NSString * const kRTCFieldTrialSendSideBweWithOverheadKey; +RTC_EXTERN NSString * const kRTCFieldTrialFlexFec03AdvertisedKey; +RTC_EXTERN NSString * const kRTCFieldTrialFlexFec03Key; +RTC_EXTERN NSString * const kRTCFieldTrialImprovedBitrateEstimateKey; +RTC_EXTERN NSString * const kRTCFieldTrialH264HighProfileKey; +RTC_EXTERN NSString * const kRTCFieldTrialMinimizeResamplingOnMobileKey; + +/** The valid value for field trials above. */ +RTC_EXTERN NSString * const kRTCFieldTrialEnabledValue; + +/** Use a string returned by RTCFieldTrialMedianSlopeFilterValue as the value. */ +RTC_EXTERN NSString * const kRTCFieldTrialMedianSlopeFilterKey; +RTC_EXTERN NSString *RTCFieldTrialMedianSlopeFilterValue( + size_t windowSize, double thresholdGain); + +/** Use a string returned by RTCFieldTrialTrendlineFilterValue as the value. */ +RTC_EXTERN NSString * const kRTCFieldTrialTrendlineFilterKey; +/** Returns a valid value for kRTCFieldTrialTrendlineFilterKey. */ +RTC_EXTERN NSString *RTCFieldTrialTrendlineFilterValue( + size_t windowSize, double smoothingCoeff, double thresholdGain); + +/** Initialize field trials using a dictionary mapping field trial keys to their values. See above + * for valid keys and values. + * Must be called before any other call into WebRTC. See: + * webrtc/system_wrappers/include/field_trial_default.h + */ +RTC_EXTERN void RTCInitFieldTrialDictionary(NSDictionary *fieldTrials); diff --git a/ios/Headers/RTCFileLogger.h b/ios/Headers/RTCFileLogger.h new file mode 100644 index 00000000..1e8a591b --- /dev/null +++ b/ios/Headers/RTCFileLogger.h @@ -0,0 +1,77 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +typedef NS_ENUM(NSUInteger, RTCFileLoggerSeverity) { + RTCFileLoggerSeverityVerbose, + RTCFileLoggerSeverityInfo, + RTCFileLoggerSeverityWarning, + RTCFileLoggerSeverityError +}; + +typedef NS_ENUM(NSUInteger, RTCFileLoggerRotationType) { + RTCFileLoggerTypeCall, + RTCFileLoggerTypeApp, +}; + +NS_ASSUME_NONNULL_BEGIN + +// This class intercepts WebRTC logs and saves them to a file. The file size +// will not exceed the given maximum bytesize. When the maximum bytesize is +// reached, logs are rotated according to the rotationType specified. +// For kRTCFileLoggerTypeCall, logs from the beginning and the end +// are preserved while the middle section is overwritten instead. +// For kRTCFileLoggerTypeApp, the oldest log is overwritten. +// This class is not threadsafe. +RTC_EXPORT +@interface RTCFileLogger : NSObject + +// The severity level to capture. The default is kRTCFileLoggerSeverityInfo. +@property(nonatomic, assign) RTCFileLoggerSeverity severity; + +// The rotation type for this file logger. The default is +// kRTCFileLoggerTypeCall. +@property(nonatomic, readonly) RTCFileLoggerRotationType rotationType; + +// Disables buffering disk writes. Should be set before |start|. Buffering +// is enabled by default for performance. +@property(nonatomic, assign) BOOL shouldDisableBuffering; + +// Default constructor provides default settings for dir path, file size and +// rotation type. +- (instancetype)init; + +// Create file logger with default rotation type. +- (instancetype)initWithDirPath:(NSString *)dirPath + maxFileSize:(NSUInteger)maxFileSize; + +- (instancetype)initWithDirPath:(NSString *)dirPath + maxFileSize:(NSUInteger)maxFileSize + rotationType:(RTCFileLoggerRotationType)rotationType + NS_DESIGNATED_INITIALIZER; + +// Starts writing WebRTC logs to disk if not already started. Overwrites any +// existing file(s). +- (void)start; + +// Stops writing WebRTC logs to disk. This method is also called on dealloc. +- (void)stop; + +// Returns the current contents of the logs, or nil if start has been called +// without a stop. +- (nullable NSData *)logData; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/ios/Headers/RTCFileVideoCapturer.h b/ios/Headers/RTCFileVideoCapturer.h new file mode 100644 index 00000000..7b898e49 --- /dev/null +++ b/ios/Headers/RTCFileVideoCapturer.h @@ -0,0 +1,50 @@ +/* + * Copyright 2017 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Error passing block. + */ +typedef void (^RTCFileVideoCapturerErrorBlock)(NSError *error); + +/** + * Captures buffers from bundled video file. + * + * See @c RTCVideoCapturer for more info on capturers. + */ +RTC_EXPORT + +NS_CLASS_AVAILABLE_IOS(10) +@interface RTCFileVideoCapturer : RTCVideoCapturer + +/** + * Starts asynchronous capture of frames from video file. + * + * Capturing is not started if error occurs. Underlying error will be + * relayed in the errorBlock if one is provided. + * Successfully captured video frames will be passed to the delegate. + * + * @param nameOfFile The name of the bundled video file to be read. + * @errorBlock block to be executed upon error. + */ +- (void)startCapturingFromFileNamed:(NSString *)nameOfFile + onError:(__nullable RTCFileVideoCapturerErrorBlock)errorBlock; + +/** + * Immediately stops capture. + */ +- (void)stopCapture; +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCIceCandidate.h b/ios/Headers/RTCIceCandidate.h new file mode 100644 index 00000000..3b7f3e26 --- /dev/null +++ b/ios/Headers/RTCIceCandidate.h @@ -0,0 +1,50 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCIceCandidate : NSObject + +/** + * If present, the identifier of the "media stream identification" for the media + * component this candidate is associated with. + */ +@property(nonatomic, readonly, nullable) NSString *sdpMid; + +/** + * The index (starting at zero) of the media description this candidate is + * associated with in the SDP. + */ +@property(nonatomic, readonly) int sdpMLineIndex; + +/** The SDP string for this candidate. */ +@property(nonatomic, readonly) NSString *sdp; + +/** The URL of the ICE server which this candidate is gathered from. */ +@property(nonatomic, readonly, nullable) NSString *serverUrl; + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Initialize an RTCIceCandidate from SDP. + */ +- (instancetype)initWithSdp:(NSString *)sdp + sdpMLineIndex:(int)sdpMLineIndex + sdpMid:(nullable NSString *)sdpMid + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCIceServer.h b/ios/Headers/RTCIceServer.h new file mode 100644 index 00000000..727da8ac --- /dev/null +++ b/ios/Headers/RTCIceServer.h @@ -0,0 +1,114 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +typedef NS_ENUM(NSUInteger, RTCTlsCertPolicy) { + RTCTlsCertPolicySecure, + RTCTlsCertPolicyInsecureNoCheck +}; + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCIceServer : NSObject + +/** URI(s) for this server represented as NSStrings. */ +@property(nonatomic, readonly) NSArray *urlStrings; + +/** Username to use if this RTCIceServer object is a TURN server. */ +@property(nonatomic, readonly, nullable) NSString *username; + +/** Credential to use if this RTCIceServer object is a TURN server. */ +@property(nonatomic, readonly, nullable) NSString *credential; + +/** + * TLS certificate policy to use if this RTCIceServer object is a TURN server. + */ +@property(nonatomic, readonly) RTCTlsCertPolicy tlsCertPolicy; + +/** + If the URIs in |urls| only contain IP addresses, this field can be used + to indicate the hostname, which may be necessary for TLS (using the SNI + extension). If |urls| itself contains the hostname, this isn't necessary. + */ +@property(nonatomic, readonly, nullable) NSString *hostname; + +/** List of protocols to be used in the TLS ALPN extension. */ +@property(nonatomic, readonly) NSArray *tlsAlpnProtocols; + +/** + List elliptic curves to be used in the TLS elliptic curves extension. + Only curve names supported by OpenSSL should be used (eg. "P-256","X25519"). + */ +@property(nonatomic, readonly) NSArray *tlsEllipticCurves; + +- (nonnull instancetype)init NS_UNAVAILABLE; + +/** Convenience initializer for a server with no authentication (e.g. STUN). */ +- (instancetype)initWithURLStrings:(NSArray *)urlStrings; + +/** + * Initialize an RTCIceServer with its associated URLs, optional username, + * optional credential, and credentialType. + */ +- (instancetype)initWithURLStrings:(NSArray *)urlStrings + username:(nullable NSString *)username + credential:(nullable NSString *)credential; + +/** + * Initialize an RTCIceServer with its associated URLs, optional username, + * optional credential, and TLS cert policy. + */ +- (instancetype)initWithURLStrings:(NSArray *)urlStrings + username:(nullable NSString *)username + credential:(nullable NSString *)credential + tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy; + +/** + * Initialize an RTCIceServer with its associated URLs, optional username, + * optional credential, TLS cert policy and hostname. + */ +- (instancetype)initWithURLStrings:(NSArray *)urlStrings + username:(nullable NSString *)username + credential:(nullable NSString *)credential + tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy + hostname:(nullable NSString *)hostname; + +/** + * Initialize an RTCIceServer with its associated URLs, optional username, + * optional credential, TLS cert policy, hostname and ALPN protocols. + */ +- (instancetype)initWithURLStrings:(NSArray *)urlStrings + username:(nullable NSString *)username + credential:(nullable NSString *)credential + tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy + hostname:(nullable NSString *)hostname + tlsAlpnProtocols:(NSArray *)tlsAlpnProtocols; + +/** + * Initialize an RTCIceServer with its associated URLs, optional username, + * optional credential, TLS cert policy, hostname, ALPN protocols and + * elliptic curves. + */ +- (instancetype)initWithURLStrings:(NSArray *)urlStrings + username:(nullable NSString *)username + credential:(nullable NSString *)credential + tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy + hostname:(nullable NSString *)hostname + tlsAlpnProtocols:(nullable NSArray *)tlsAlpnProtocols + tlsEllipticCurves:(nullable NSArray *)tlsEllipticCurves + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCIntervalRange.h b/ios/Headers/RTCIntervalRange.h new file mode 100644 index 00000000..9384b153 --- /dev/null +++ b/ios/Headers/RTCIntervalRange.h @@ -0,0 +1,28 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface RTCIntervalRange : NSObject + +@property(nonatomic, readonly) NSInteger min; +@property(nonatomic, readonly) NSInteger max; + +- (instancetype)init; +- (instancetype)initWithMin:(NSInteger)min + max:(NSInteger)max + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/ios/Headers/RTCLegacyStatsReport.h b/ios/Headers/RTCLegacyStatsReport.h new file mode 100644 index 00000000..14d996c1 --- /dev/null +++ b/ios/Headers/RTCLegacyStatsReport.h @@ -0,0 +1,37 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** This does not currently conform to the spec. */ +RTC_EXPORT +@interface RTCLegacyStatsReport : NSObject + +/** Time since 1970-01-01T00:00:00Z in milliseconds. */ +@property(nonatomic, readonly) CFTimeInterval timestamp; + +/** The type of stats held by this object. */ +@property(nonatomic, readonly) NSString *type; + +/** The identifier for this object. */ +@property(nonatomic, readonly) NSString *reportId; + +/** A dictionary holding the actual stats. */ +@property(nonatomic, readonly) NSDictionary *values; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCLogging.h b/ios/Headers/RTCLogging.h new file mode 100644 index 00000000..a65dcad8 --- /dev/null +++ b/ios/Headers/RTCLogging.h @@ -0,0 +1,69 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +// Subset of rtc::LoggingSeverity. +typedef NS_ENUM(NSInteger, RTCLoggingSeverity) { + RTCLoggingSeverityVerbose, + RTCLoggingSeverityInfo, + RTCLoggingSeverityWarning, + RTCLoggingSeverityError, +}; + +// Wrapper for C++ RTC_LOG(sev) macros. +// Logs the log string to the webrtc logstream for the given severity. +RTC_EXTERN void RTCLogEx(RTCLoggingSeverity severity, NSString* log_string); + +// Wrapper for rtc::LogMessage::LogToDebug. +// Sets the minimum severity to be logged to console. +RTC_EXTERN void RTCSetMinDebugLogLevel(RTCLoggingSeverity severity); + +// Returns the filename with the path prefix removed. +RTC_EXTERN NSString* RTCFileName(const char* filePath); + +// Some convenience macros. + +#define RTCLogString(format, ...) \ + [NSString stringWithFormat:@"(%@:%d %s): " format, \ + RTCFileName(__FILE__), \ + __LINE__, \ + __FUNCTION__, \ + ##__VA_ARGS__] + +#define RTCLogFormat(severity, format, ...) \ + do { \ + NSString* log_string = RTCLogString(format, ##__VA_ARGS__); \ + RTCLogEx(severity, log_string); \ + } while (false) + +#define RTCLogVerbose(format, ...) \ + RTCLogFormat(RTCLoggingSeverityVerbose, format, ##__VA_ARGS__) \ + +#define RTCLogInfo(format, ...) \ + RTCLogFormat(RTCLoggingSeverityInfo, format, ##__VA_ARGS__) \ + +#define RTCLogWarning(format, ...) \ + RTCLogFormat(RTCLoggingSeverityWarning, format, ##__VA_ARGS__) \ + +#define RTCLogError(format, ...) \ + RTCLogFormat(RTCLoggingSeverityError, format, ##__VA_ARGS__) \ + +#if !defined(NDEBUG) +#define RTCLogDebug(format, ...) RTCLogInfo(format, ##__VA_ARGS__) +#else +#define RTCLogDebug(format, ...) \ + do { \ + } while (false) +#endif + +#define RTCLog(format, ...) RTCLogInfo(format, ##__VA_ARGS__) diff --git a/ios/Headers/RTCMacros.h b/ios/Headers/RTCMacros.h new file mode 100644 index 00000000..08cb9382 --- /dev/null +++ b/ios/Headers/RTCMacros.h @@ -0,0 +1,28 @@ +/* + * Copyright 2016 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef SDK_OBJC_FRAMEWORK_HEADERS_WEBRTC_RTCMACROS_H_ +#define SDK_OBJC_FRAMEWORK_HEADERS_WEBRTC_RTCMACROS_H_ + +#define RTC_EXPORT __attribute__((visibility("default"))) + +#if defined(__cplusplus) +#define RTC_EXTERN extern "C" RTC_EXPORT +#else +#define RTC_EXTERN extern RTC_EXPORT +#endif + +#ifdef __OBJC__ +#define RTC_FWD_DECL_OBJC_CLASS(classname) @class classname +#else +#define RTC_FWD_DECL_OBJC_CLASS(classname) typedef struct objc_object classname +#endif + +#endif // SDK_OBJC_FRAMEWORK_HEADERS_WEBRTC_RTCMACROS_H_ diff --git a/ios/Headers/RTCMediaConstraints.h b/ios/Headers/RTCMediaConstraints.h new file mode 100644 index 00000000..f93e5b5a --- /dev/null +++ b/ios/Headers/RTCMediaConstraints.h @@ -0,0 +1,55 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** Constraint keys for media sources. */ +RTC_EXTERN NSString * const kRTCMediaConstraintsMinAspectRatio; +RTC_EXTERN NSString * const kRTCMediaConstraintsMaxAspectRatio; +RTC_EXTERN NSString * const kRTCMediaConstraintsMaxWidth; +RTC_EXTERN NSString * const kRTCMediaConstraintsMinWidth; +RTC_EXTERN NSString * const kRTCMediaConstraintsMaxHeight; +RTC_EXTERN NSString * const kRTCMediaConstraintsMinHeight; +RTC_EXTERN NSString * const kRTCMediaConstraintsMaxFrameRate; +RTC_EXTERN NSString * const kRTCMediaConstraintsMinFrameRate; +/** The value for this key should be a base64 encoded string containing + * the data from the serialized configuration proto. + */ +RTC_EXTERN NSString * const kRTCMediaConstraintsAudioNetworkAdaptorConfig; + +/** Constraint keys for generating offers and answers. */ +RTC_EXTERN NSString * const kRTCMediaConstraintsIceRestart; +RTC_EXTERN NSString * const kRTCMediaConstraintsOfferToReceiveAudio; +RTC_EXTERN NSString * const kRTCMediaConstraintsOfferToReceiveVideo; +RTC_EXTERN NSString * const kRTCMediaConstraintsVoiceActivityDetection; + +/** Constraint values for Boolean parameters. */ +RTC_EXTERN NSString * const kRTCMediaConstraintsValueTrue; +RTC_EXTERN NSString * const kRTCMediaConstraintsValueFalse; + +RTC_EXPORT +@interface RTCMediaConstraints : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** Initialize with mandatory and/or optional constraints. */ +- (instancetype)initWithMandatoryConstraints: + (nullable NSDictionary *)mandatory + optionalConstraints: + (nullable NSDictionary *)optional + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCMediaSource.h b/ios/Headers/RTCMediaSource.h new file mode 100644 index 00000000..6cfcb7d2 --- /dev/null +++ b/ios/Headers/RTCMediaSource.h @@ -0,0 +1,34 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +typedef NS_ENUM(NSInteger, RTCSourceState) { + RTCSourceStateInitializing, + RTCSourceStateLive, + RTCSourceStateEnded, + RTCSourceStateMuted, +}; + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCMediaSource : NSObject + +/** The current state of the RTCMediaSource. */ +@property(nonatomic, readonly) RTCSourceState state; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCMediaStream.h b/ios/Headers/RTCMediaStream.h new file mode 100644 index 00000000..b97960d4 --- /dev/null +++ b/ios/Headers/RTCMediaStream.h @@ -0,0 +1,49 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class RTCAudioTrack; +@class RTCPeerConnectionFactory; +@class RTCVideoTrack; + +RTC_EXPORT +@interface RTCMediaStream : NSObject + +/** The audio tracks in this stream. */ +@property(nonatomic, strong, readonly) NSArray *audioTracks; + +/** The video tracks in this stream. */ +@property(nonatomic, strong, readonly) NSArray *videoTracks; + +/** An identifier for this media stream. */ +@property(nonatomic, readonly) NSString *streamId; + +- (instancetype)init NS_UNAVAILABLE; + +/** Adds the given audio track to this media stream. */ +- (void)addAudioTrack:(RTCAudioTrack *)audioTrack; + +/** Adds the given video track to this media stream. */ +- (void)addVideoTrack:(RTCVideoTrack *)videoTrack; + +/** Removes the given audio track to this media stream. */ +- (void)removeAudioTrack:(RTCAudioTrack *)audioTrack; + +/** Removes the given video track to this media stream. */ +- (void)removeVideoTrack:(RTCVideoTrack *)videoTrack; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCMediaStreamTrack.h b/ios/Headers/RTCMediaStreamTrack.h new file mode 100644 index 00000000..c42f0cfb --- /dev/null +++ b/ios/Headers/RTCMediaStreamTrack.h @@ -0,0 +1,50 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +/** + * Represents the state of the track. This exposes the same states in C++. + */ +typedef NS_ENUM(NSInteger, RTCMediaStreamTrackState) { + RTCMediaStreamTrackStateLive, + RTCMediaStreamTrackStateEnded +}; + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXTERN NSString * const kRTCMediaStreamTrackKindAudio; +RTC_EXTERN NSString * const kRTCMediaStreamTrackKindVideo; + +RTC_EXPORT +@interface RTCMediaStreamTrack : NSObject + +/** + * The kind of track. For example, "audio" if this track represents an audio + * track and "video" if this track represents a video track. + */ +@property(nonatomic, readonly) NSString *kind; + +/** An identifier string. */ +@property(nonatomic, readonly) NSString *trackId; + +/** The enabled state of the track. */ +@property(nonatomic, assign) BOOL isEnabled; + +/** The state of the track. */ +@property(nonatomic, readonly) RTCMediaStreamTrackState readyState; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCMetrics.h b/ios/Headers/RTCMetrics.h new file mode 100644 index 00000000..d22287e5 --- /dev/null +++ b/ios/Headers/RTCMetrics.h @@ -0,0 +1,24 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import + +/** + * Enables gathering of metrics (which can be fetched with + * RTCGetAndResetMetrics). Must be called before any other call into WebRTC. + */ +RTC_EXTERN void RTCEnableMetrics(void); + +/** Gets and clears native histograms. */ +RTC_EXTERN NSArray *RTCGetAndResetMetrics(void); + diff --git a/ios/Headers/RTCMetricsSampleInfo.h b/ios/Headers/RTCMetricsSampleInfo.h new file mode 100644 index 00000000..f01bea9b --- /dev/null +++ b/ios/Headers/RTCMetricsSampleInfo.h @@ -0,0 +1,48 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCMetricsSampleInfo : NSObject + +/** + * Example of RTCMetricsSampleInfo: + * name: "WebRTC.Video.InputFramesPerSecond" + * min: 1 + * max: 100 + * bucketCount: 50 + * samples: [29]:2 [30]:1 + */ + +/** The name of the histogram. */ +@property(nonatomic, readonly) NSString *name; + +/** The minimum bucket value. */ +@property(nonatomic, readonly) int min; + +/** The maximum bucket value. */ +@property(nonatomic, readonly) int max; + +/** The number of buckets. */ +@property(nonatomic, readonly) int bucketCount; + +/** A dictionary holding the samples . */ +@property(nonatomic, readonly) NSDictionary *samples; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCPeerConnection.h b/ios/Headers/RTCPeerConnection.h new file mode 100644 index 00000000..d9ddffbe --- /dev/null +++ b/ios/Headers/RTCPeerConnection.h @@ -0,0 +1,323 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +@class RTCConfiguration; +@class RTCDataChannel; +@class RTCDataChannelConfiguration; +@class RTCIceCandidate; +@class RTCMediaConstraints; +@class RTCMediaStream; +@class RTCMediaStreamTrack; +@class RTCPeerConnectionFactory; +@class RTCRtpReceiver; +@class RTCRtpSender; +@class RTCRtpTransceiver; +@class RTCRtpTransceiverInit; +@class RTCSessionDescription; +@class RTCLegacyStatsReport; + +typedef NS_ENUM(NSInteger, RTCRtpMediaType); + +NS_ASSUME_NONNULL_BEGIN + +extern NSString * const kRTCPeerConnectionErrorDomain; +extern int const kRTCSessionDescriptionErrorCode; + +/** Represents the signaling state of the peer connection. */ +typedef NS_ENUM(NSInteger, RTCSignalingState) { + RTCSignalingStateStable, + RTCSignalingStateHaveLocalOffer, + RTCSignalingStateHaveLocalPrAnswer, + RTCSignalingStateHaveRemoteOffer, + RTCSignalingStateHaveRemotePrAnswer, + // Not an actual state, represents the total number of states. + RTCSignalingStateClosed, +}; + +/** Represents the ice connection state of the peer connection. */ +typedef NS_ENUM(NSInteger, RTCIceConnectionState) { + RTCIceConnectionStateNew, + RTCIceConnectionStateChecking, + RTCIceConnectionStateConnected, + RTCIceConnectionStateCompleted, + RTCIceConnectionStateFailed, + RTCIceConnectionStateDisconnected, + RTCIceConnectionStateClosed, + RTCIceConnectionStateCount, +}; + +/** Represents the ice gathering state of the peer connection. */ +typedef NS_ENUM(NSInteger, RTCIceGatheringState) { + RTCIceGatheringStateNew, + RTCIceGatheringStateGathering, + RTCIceGatheringStateComplete, +}; + +/** Represents the stats output level. */ +typedef NS_ENUM(NSInteger, RTCStatsOutputLevel) { + RTCStatsOutputLevelStandard, + RTCStatsOutputLevelDebug, +}; + +@class RTCPeerConnection; + +RTC_EXPORT +@protocol RTCPeerConnectionDelegate + +/** Called when the SignalingState changed. */ +- (void)peerConnection:(RTCPeerConnection *)peerConnection + didChangeSignalingState:(RTCSignalingState)stateChanged; + +/** Called when media is received on a new stream from remote peer. */ +- (void)peerConnection:(RTCPeerConnection *)peerConnection + didAddStream:(RTCMediaStream *)stream; + +/** Called when a remote peer closes a stream. + * This is not called when RTCSdpSemanticsUnifiedPlan is specified. + */ +- (void)peerConnection:(RTCPeerConnection *)peerConnection + didRemoveStream:(RTCMediaStream *)stream; + +/** Called when negotiation is needed, for example ICE has restarted. */ +- (void)peerConnectionShouldNegotiate:(RTCPeerConnection *)peerConnection; + +/** Called any time the IceConnectionState changes. */ +- (void)peerConnection:(RTCPeerConnection *)peerConnection + didChangeIceConnectionState:(RTCIceConnectionState)newState; + +/** Called any time the IceGatheringState changes. */ +- (void)peerConnection:(RTCPeerConnection *)peerConnection + didChangeIceGatheringState:(RTCIceGatheringState)newState; + +/** New ice candidate has been found. */ +- (void)peerConnection:(RTCPeerConnection *)peerConnection + didGenerateIceCandidate:(RTCIceCandidate *)candidate; + +/** Called when a group of local Ice candidates have been removed. */ +- (void)peerConnection:(RTCPeerConnection *)peerConnection + didRemoveIceCandidates:(NSArray *)candidates; + +/** New data channel has been opened. */ +- (void)peerConnection:(RTCPeerConnection *)peerConnection + didOpenDataChannel:(RTCDataChannel *)dataChannel; + +/** Called when signaling indicates a transceiver will be receiving media from + * the remote endpoint. + * This is only called with RTCSdpSemanticsUnifiedPlan specified. + */ +@optional +- (void)peerConnection:(RTCPeerConnection *)peerConnection + didStartReceivingOnTransceiver:(RTCRtpTransceiver *)transceiver; + +/** Called when a receiver and its track are created. */ +@optional +- (void)peerConnection:(RTCPeerConnection *)peerConnection + didAddReceiver:(RTCRtpReceiver *)rtpReceiver + streams:(NSArray *)mediaStreams; + +@end + +RTC_EXPORT +@interface RTCPeerConnection : NSObject + +/** The object that will be notifed about events such as state changes and + * streams being added or removed. + */ +@property(nonatomic, weak, nullable) id delegate; +/** This property is not available with RTCSdpSemanticsUnifiedPlan. Please use + * |senders| instead. + */ +@property(nonatomic, readonly) NSArray *localStreams; +@property(nonatomic, readonly, nullable) + RTCSessionDescription *localDescription; +@property(nonatomic, readonly, nullable) + RTCSessionDescription *remoteDescription; +@property(nonatomic, readonly) RTCSignalingState signalingState; +@property(nonatomic, readonly) RTCIceConnectionState iceConnectionState; +@property(nonatomic, readonly) RTCIceGatheringState iceGatheringState; +@property(nonatomic, readonly, copy) RTCConfiguration *configuration; + +/** Gets all RTCRtpSenders associated with this peer connection. + * Note: reading this property returns different instances of RTCRtpSender. + * Use isEqual: instead of == to compare RTCRtpSender instances. + */ +@property(nonatomic, readonly) NSArray *senders; + +/** Gets all RTCRtpReceivers associated with this peer connection. + * Note: reading this property returns different instances of RTCRtpReceiver. + * Use isEqual: instead of == to compare RTCRtpReceiver instances. + */ +@property(nonatomic, readonly) NSArray *receivers; + +/** Gets all RTCRtpTransceivers associated with this peer connection. + * Note: reading this property returns different instances of + * RTCRtpTransceiver. Use isEqual: instead of == to compare RTCRtpTransceiver + * instances. + * This is only available with RTCSdpSemanticsUnifiedPlan specified. + */ +@property(nonatomic, readonly) NSArray *transceivers; + +- (instancetype)init NS_UNAVAILABLE; + +/** Sets the PeerConnection's global configuration to |configuration|. + * Any changes to STUN/TURN servers or ICE candidate policy will affect the + * next gathering phase, and cause the next call to createOffer to generate + * new ICE credentials. Note that the BUNDLE and RTCP-multiplexing policies + * cannot be changed with this method. + */ +- (BOOL)setConfiguration:(RTCConfiguration *)configuration; + +/** Terminate all media and close the transport. */ +- (void)close; + +/** Provide a remote candidate to the ICE Agent. */ +- (void)addIceCandidate:(RTCIceCandidate *)candidate; + +/** Remove a group of remote candidates from the ICE Agent. */ +- (void)removeIceCandidates:(NSArray *)candidates; + +/** Add a new media stream to be sent on this peer connection. + * This method is not supported with RTCSdpSemanticsUnifiedPlan. Please use + * addTrack instead. + */ +- (void)addStream:(RTCMediaStream *)stream; + +/** Remove the given media stream from this peer connection. + * This method is not supported with RTCSdpSemanticsUnifiedPlan. Please use + * removeTrack instead. + */ +- (void)removeStream:(RTCMediaStream *)stream; + +/** Add a new media stream track to be sent on this peer connection, and return + * the newly created RTCRtpSender. The RTCRtpSender will be associated with + * the streams specified in the |streamIds| list. + * + * Errors: If an error occurs, returns nil. An error can occur if: + * - A sender already exists for the track. + * - The peer connection is closed. + */ +- (RTCRtpSender *)addTrack:(RTCMediaStreamTrack *)track streamIds:(NSArray *)streamIds; + +/** With PlanB semantics, removes an RTCRtpSender from this peer connection. + * + * With UnifiedPlan semantics, sets sender's track to null and removes the + * send component from the associated RTCRtpTransceiver's direction. + * + * Returns YES on success. + */ +- (BOOL)removeTrack:(RTCRtpSender *)sender; + +/** addTransceiver creates a new RTCRtpTransceiver and adds it to the set of + * transceivers. Adding a transceiver will cause future calls to CreateOffer + * to add a media description for the corresponding transceiver. + * + * The initial value of |mid| in the returned transceiver is nil. Setting a + * new session description may change it to a non-nil value. + * + * https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-addtransceiver + * + * Optionally, an RtpTransceiverInit structure can be specified to configure + * the transceiver from construction. If not specified, the transceiver will + * default to having a direction of kSendRecv and not be part of any streams. + * + * These methods are only available when Unified Plan is enabled (see + * RTCConfiguration). + */ + +/** Adds a transceiver with a sender set to transmit the given track. The kind + * of the transceiver (and sender/receiver) will be derived from the kind of + * the track. + */ +- (RTCRtpTransceiver *)addTransceiverWithTrack:(RTCMediaStreamTrack *)track; +- (RTCRtpTransceiver *)addTransceiverWithTrack:(RTCMediaStreamTrack *)track + init:(RTCRtpTransceiverInit *)init; + +/** Adds a transceiver with the given kind. Can either be RTCRtpMediaTypeAudio + * or RTCRtpMediaTypeVideo. + */ +- (RTCRtpTransceiver *)addTransceiverOfType:(RTCRtpMediaType)mediaType; +- (RTCRtpTransceiver *)addTransceiverOfType:(RTCRtpMediaType)mediaType + init:(RTCRtpTransceiverInit *)init; + +/** Generate an SDP offer. */ +- (void)offerForConstraints:(RTCMediaConstraints *)constraints + completionHandler:(nullable void (^) + (RTCSessionDescription * _Nullable sdp, + NSError * _Nullable error))completionHandler; + +/** Generate an SDP answer. */ +- (void)answerForConstraints:(RTCMediaConstraints *)constraints + completionHandler:(nullable void (^) + (RTCSessionDescription * _Nullable sdp, + NSError * _Nullable error))completionHandler; + +/** Apply the supplied RTCSessionDescription as the local description. */ +- (void)setLocalDescription:(RTCSessionDescription *)sdp + completionHandler: + (nullable void (^)(NSError * _Nullable error))completionHandler; + +/** Apply the supplied RTCSessionDescription as the remote description. */ +- (void)setRemoteDescription:(RTCSessionDescription *)sdp + completionHandler: + (nullable void (^)(NSError * _Nullable error))completionHandler; + +/** Limits the bandwidth allocated for all RTP streams sent by this + * PeerConnection. Nil parameters will be unchanged. Setting + * |currentBitrateBps| will force the available bitrate estimate to the given + * value. Returns YES if the parameters were successfully updated. + */ +- (BOOL)setBweMinBitrateBps:(nullable NSNumber *)minBitrateBps + currentBitrateBps:(nullable NSNumber *)currentBitrateBps + maxBitrateBps:(nullable NSNumber *)maxBitrateBps; + +/** Start or stop recording an Rtc EventLog. */ +- (BOOL)startRtcEventLogWithFilePath:(NSString *)filePath + maxSizeInBytes:(int64_t)maxSizeInBytes; +- (void)stopRtcEventLog; + +@end + +@interface RTCPeerConnection (Media) + +/** Create an RTCRtpSender with the specified kind and media stream ID. + * See RTCMediaStreamTrack.h for available kinds. + * This method is not supported with RTCSdpSemanticsUnifiedPlan. Please use + * addTransceiver instead. + */ +- (RTCRtpSender *)senderWithKind:(NSString *)kind streamId:(NSString *)streamId; + +@end + +@interface RTCPeerConnection (DataChannel) + +/** Create a new data channel with the given label and configuration. */ +- (nullable RTCDataChannel *)dataChannelForLabel:(NSString *)label + configuration:(RTCDataChannelConfiguration *)configuration; + +@end + +@interface RTCPeerConnection (Stats) + +/** Gather stats for the given RTCMediaStreamTrack. If |mediaStreamTrack| is nil + * statistics are gathered for all tracks. + */ +- (void)statsForTrack: + (nullable RTCMediaStreamTrack *)mediaStreamTrack + statsOutputLevel:(RTCStatsOutputLevel)statsOutputLevel + completionHandler: + (nullable void (^)(NSArray *stats))completionHandler; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCPeerConnectionFactory.h b/ios/Headers/RTCPeerConnectionFactory.h new file mode 100644 index 00000000..d00f6f2a --- /dev/null +++ b/ios/Headers/RTCPeerConnectionFactory.h @@ -0,0 +1,86 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class RTCAudioSource; +@class RTCAudioTrack; +@class RTCConfiguration; +@class RTCMediaConstraints; +@class RTCMediaStream; +@class RTCPeerConnection; +@class RTCVideoSource; +@class RTCVideoTrack; +@class RTCPeerConnectionFactoryOptions; +@protocol RTCPeerConnectionDelegate; +@protocol RTCVideoDecoderFactory; +@protocol RTCVideoEncoderFactory; + +RTC_EXPORT +@interface RTCPeerConnectionFactory : NSObject + +/* Initialize object with default H264 video encoder/decoder factories */ +- (instancetype)init; + +/* Initialize object with injectable video encoder/decoder factories */ +- (instancetype)initWithEncoderFactory:(nullable id)encoderFactory + decoderFactory:(nullable id)decoderFactory; + +/** Initialize an RTCAudioSource with constraints. */ +- (RTCAudioSource *)audioSourceWithConstraints:(nullable RTCMediaConstraints *)constraints; + +/** Initialize an RTCAudioTrack with an id. Convenience ctor to use an audio source with no + * constraints. + */ +- (RTCAudioTrack *)audioTrackWithTrackId:(NSString *)trackId; + +/** Initialize an RTCAudioTrack with a source and an id. */ +- (RTCAudioTrack *)audioTrackWithSource:(RTCAudioSource *)source + trackId:(NSString *)trackId; + +/** Initialize a generic RTCVideoSource. The RTCVideoSource should be passed to a RTCVideoCapturer + * implementation, e.g. RTCCameraVideoCapturer, in order to produce frames. + */ +- (RTCVideoSource *)videoSource; + +/** Initialize an RTCVideoTrack with a source and an id. */ +- (RTCVideoTrack *)videoTrackWithSource:(RTCVideoSource *)source + trackId:(NSString *)trackId; + +/** Initialize an RTCMediaStream with an id. */ +- (RTCMediaStream *)mediaStreamWithStreamId:(NSString *)streamId; + +/** Initialize an RTCPeerConnection with a configuration, constraints, and + * delegate. + */ +- (RTCPeerConnection *)peerConnectionWithConfiguration: + (RTCConfiguration *)configuration + constraints: + (RTCMediaConstraints *)constraints + delegate: + (nullable id)delegate; + +/** Set the options to be used for subsequently created RTCPeerConnections */ +- (void)setOptions:(nonnull RTCPeerConnectionFactoryOptions *)options; + +/** Start an AecDump recording. This API call will likely change in the future. */ +- (BOOL)startAecDumpWithFilePath:(NSString *)filePath + maxSizeInBytes:(int64_t)maxSizeInBytes; + +/* Stop an active AecDump recording */ +- (void)stopAecDump; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCPeerConnectionFactoryOptions.h b/ios/Headers/RTCPeerConnectionFactoryOptions.h new file mode 100644 index 00000000..33faa1e6 --- /dev/null +++ b/ios/Headers/RTCPeerConnectionFactoryOptions.h @@ -0,0 +1,40 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCPeerConnectionFactoryOptions : NSObject + +@property(nonatomic, assign) BOOL disableEncryption; + +@property(nonatomic, assign) BOOL disableNetworkMonitor; + +@property(nonatomic, assign) BOOL ignoreLoopbackNetworkAdapter; + +@property(nonatomic, assign) BOOL ignoreVPNNetworkAdapter; + +@property(nonatomic, assign) BOOL ignoreCellularNetworkAdapter; + +@property(nonatomic, assign) BOOL ignoreWiFiNetworkAdapter; + +@property(nonatomic, assign) BOOL ignoreEthernetNetworkAdapter; + +@property(nonatomic, assign) BOOL enableAes128Sha1_32CryptoCipher; + +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCRtpCodecParameters.h b/ios/Headers/RTCRtpCodecParameters.h new file mode 100644 index 00000000..c7ca2f59 --- /dev/null +++ b/ios/Headers/RTCRtpCodecParameters.h @@ -0,0 +1,70 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXTERN const NSString * const kRTCRtxCodecName; +RTC_EXTERN const NSString * const kRTCRedCodecName; +RTC_EXTERN const NSString * const kRTCUlpfecCodecName; +RTC_EXTERN const NSString * const kRTCFlexfecCodecName; +RTC_EXTERN const NSString * const kRTCOpusCodecName; +RTC_EXTERN const NSString * const kRTCIsacCodecName; +RTC_EXTERN const NSString * const kRTCL16CodecName; +RTC_EXTERN const NSString * const kRTCG722CodecName; +RTC_EXTERN const NSString * const kRTCIlbcCodecName; +RTC_EXTERN const NSString * const kRTCPcmuCodecName; +RTC_EXTERN const NSString * const kRTCPcmaCodecName; +RTC_EXTERN const NSString * const kRTCDtmfCodecName; +RTC_EXTERN const NSString * const kRTCComfortNoiseCodecName; +RTC_EXTERN const NSString * const kRTCVp8CodecName; +RTC_EXTERN const NSString * const kRTCVp9CodecName; +RTC_EXTERN const NSString * const kRTCH264CodecName; + +/** Defined in http://w3c.github.io/webrtc-pc/#idl-def-RTCRtpCodecParameters */ +RTC_EXPORT +@interface RTCRtpCodecParameters : NSObject + +/** The RTP payload type. */ +@property(nonatomic, assign) int payloadType; + +/** + * The codec MIME subtype. Valid types are listed in: + * http://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-2 + * + * Several supported types are represented by the constants above. + */ +@property(nonatomic, readonly, nonnull) NSString *name; + +/** + * The media type of this codec. Equivalent to MIME top-level type. + * + * Valid values are kRTCMediaStreamTrackKindAudio and + * kRTCMediaStreamTrackKindVideo. + */ +@property(nonatomic, readonly, nonnull) NSString *kind; + +/** The codec clock rate expressed in Hertz. */ +@property(nonatomic, readonly, nullable) NSNumber *clockRate; + +/** + * The number of channels (mono=1, stereo=2). + * Set to null for video codecs. + **/ +@property(nonatomic, readonly, nullable) NSNumber *numChannels; + +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCRtpEncodingParameters.h b/ios/Headers/RTCRtpEncodingParameters.h new file mode 100644 index 00000000..a956f0d4 --- /dev/null +++ b/ios/Headers/RTCRtpEncodingParameters.h @@ -0,0 +1,35 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCRtpEncodingParameters : NSObject + +/** Controls whether the encoding is currently transmitted. */ +@property(nonatomic, assign) BOOL isActive; + +/** The maximum bitrate to use for the encoding, or nil if there is no + * limit. + */ +@property(nonatomic, copy, nullable) NSNumber *maxBitrateBps; + +/** The SSRC being used by this encoding. */ +@property(nonatomic, readonly, nullable) NSNumber *ssrc; + +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCRtpParameters.h b/ios/Headers/RTCRtpParameters.h new file mode 100644 index 00000000..bdebf848 --- /dev/null +++ b/ios/Headers/RTCRtpParameters.h @@ -0,0 +1,32 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCRtpParameters : NSObject + +/** The currently active encodings in the order of preference. */ +@property(nonatomic, copy) NSArray *encodings; + +/** The negotiated set of send codecs in order of preference. */ +@property(nonatomic, copy) NSArray *codecs; + +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCRtpReceiver.h b/ios/Headers/RTCRtpReceiver.h new file mode 100644 index 00000000..6156db9f --- /dev/null +++ b/ios/Headers/RTCRtpReceiver.h @@ -0,0 +1,82 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** Represents the media type of the RtpReceiver. */ +typedef NS_ENUM(NSInteger, RTCRtpMediaType) { + RTCRtpMediaTypeAudio, + RTCRtpMediaTypeVideo, + RTCRtpMediaTypeData, +}; + +@class RTCRtpReceiver; + +RTC_EXPORT +@protocol RTCRtpReceiverDelegate + +/** Called when the first RTP packet is received. + * + * Note: Currently if there are multiple RtpReceivers of the same media type, + * they will all call OnFirstPacketReceived at once. + * + * For example, if we create three audio receivers, A/B/C, they will listen to + * the same signal from the underneath network layer. Whenever the first audio packet + * is received, the underneath signal will be fired. All the receivers A/B/C will be + * notified and the callback of the receiver's delegate will be called. + * + * The process is the same for video receivers. + */ +- (void)rtpReceiver:(RTCRtpReceiver *)rtpReceiver + didReceiveFirstPacketForMediaType:(RTCRtpMediaType)mediaType; + +@end + +RTC_EXPORT +@protocol RTCRtpReceiver + +/** A unique identifier for this receiver. */ +@property(nonatomic, readonly) NSString *receiverId; + +/** The currently active RTCRtpParameters, as defined in + * https://www.w3.org/TR/webrtc/#idl-def-RTCRtpParameters. + * + * The WebRTC specification only defines RTCRtpParameters in terms of senders, + * but this API also applies them to receivers, similar to ORTC: + * http://ortc.org/wp-content/uploads/2016/03/ortc.html#rtcrtpparameters*. + */ +@property(nonatomic, readonly) RTCRtpParameters *parameters; + +/** The RTCMediaStreamTrack associated with the receiver. + * Note: reading this property returns a new instance of + * RTCMediaStreamTrack. Use isEqual: instead of == to compare + * RTCMediaStreamTrack instances. + */ +@property(nonatomic, readonly, nullable) RTCMediaStreamTrack *track; + +/** The delegate for this RtpReceiver. */ +@property(nonatomic, weak) id delegate; + +@end + +RTC_EXPORT +@interface RTCRtpReceiver : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCRtpSender.h b/ios/Headers/RTCRtpSender.h new file mode 100644 index 00000000..f6e91250 --- /dev/null +++ b/ios/Headers/RTCRtpSender.h @@ -0,0 +1,50 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@protocol RTCRtpSender + +/** A unique identifier for this sender. */ +@property(nonatomic, readonly) NSString *senderId; + +/** The currently active RTCRtpParameters, as defined in + * https://www.w3.org/TR/webrtc/#idl-def-RTCRtpParameters. + */ +@property(nonatomic, copy) RTCRtpParameters *parameters; + +/** The RTCMediaStreamTrack associated with the sender. + * Note: reading this property returns a new instance of + * RTCMediaStreamTrack. Use isEqual: instead of == to compare + * RTCMediaStreamTrack instances. + */ +@property(nonatomic, copy, nullable) RTCMediaStreamTrack *track; + +/** The RTCDtmfSender accociated with the RTP sender. */ +@property(nonatomic, readonly, nullable) id dtmfSender; + +@end + +RTC_EXPORT +@interface RTCRtpSender : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCRtpTransceiver.h b/ios/Headers/RTCRtpTransceiver.h new file mode 100644 index 00000000..db0fd1c6 --- /dev/null +++ b/ios/Headers/RTCRtpTransceiver.h @@ -0,0 +1,128 @@ +/* + * Copyright 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiverdirection */ +typedef NS_ENUM(NSInteger, RTCRtpTransceiverDirection) { + RTCRtpTransceiverDirectionSendRecv, + RTCRtpTransceiverDirectionSendOnly, + RTCRtpTransceiverDirectionRecvOnly, + RTCRtpTransceiverDirectionInactive, +}; + +/** Structure for initializing an RTCRtpTransceiver in a call to + * RTCPeerConnection.addTransceiver. + * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiverinit + */ +@interface RTCRtpTransceiverInit : NSObject + +/** Direction of the RTCRtpTransceiver. See RTCRtpTransceiver.direction. */ +@property(nonatomic) RTCRtpTransceiverDirection direction; + +/** The added RTCRtpTransceiver will be added to these streams. */ +@property(nonatomic) NSArray *streamIds; + +/** TODO(bugs.webrtc.org/7600): Not implemented. */ +@property(nonatomic) NSArray *sendEncodings; + +@end + +@class RTCRtpTransceiver; + +/** The RTCRtpTransceiver maps to the RTCRtpTransceiver defined by the WebRTC + * specification. A transceiver represents a combination of an RTCRtpSender + * and an RTCRtpReceiver that share a common mid. As defined in JSEP, an + * RTCRtpTransceiver is said to be associated with a media description if its + * mid property is non-nil; otherwise, it is said to be disassociated. + * JSEP: https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-24 + * + * Note that RTCRtpTransceivers are only supported when using + * RTCPeerConnection with Unified Plan SDP. + * + * WebRTC specification for RTCRtpTransceiver, the JavaScript analog: + * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver + */ +RTC_EXPORT +@protocol RTCRtpTransceiver + +/** Media type of the transceiver. The sender and receiver will also have this + * type. + */ +@property(nonatomic, readonly) RTCRtpMediaType mediaType; + +/** The mid attribute is the mid negotiated and present in the local and + * remote descriptions. Before negotiation is complete, the mid value may be + * nil. After rollbacks, the value may change from a non-nil value to nil. + * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-mid + */ +@property(nonatomic, readonly) NSString *mid; + +/** The sender attribute exposes the RTCRtpSender corresponding to the RTP + * media that may be sent with the transceiver's mid. The sender is always + * present, regardless of the direction of media. + * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-sender + */ +@property(nonatomic, readonly) RTCRtpSender *sender; + +/** The receiver attribute exposes the RTCRtpReceiver corresponding to the RTP + * media that may be received with the transceiver's mid. The receiver is + * always present, regardless of the direction of media. + * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-receiver + */ +@property(nonatomic, readonly) RTCRtpReceiver *receiver; + +/** The isStopped attribute indicates that the sender of this transceiver will + * no longer send, and that the receiver will no longer receive. It is true if + * either stop has been called or if setting the local or remote description + * has caused the RTCRtpTransceiver to be stopped. + * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-stopped + */ +@property(nonatomic, readonly) BOOL isStopped; + +/** The direction attribute indicates the preferred direction of this + * transceiver, which will be used in calls to createOffer and createAnswer. + * An update of directionality does not take effect immediately. Instead, + * future calls to createOffer and createAnswer mark the corresponding media + * descriptions as sendrecv, sendonly, recvonly, or inactive. + * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-direction + */ +@property(nonatomic) RTCRtpTransceiverDirection direction; + +/** The currentDirection attribute indicates the current direction negotiated + * for this transceiver. If this transceiver has never been represented in an + * offer/answer exchange, or if the transceiver is stopped, the value is not + * present and this method returns NO. + * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-currentdirection + */ +- (BOOL)currentDirection:(RTCRtpTransceiverDirection *)currentDirectionOut; + +/** The stop method irreversibly stops the RTCRtpTransceiver. The sender of + * this transceiver will no longer send, the receiver will no longer receive. + * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-stop + */ +- (void)stop; + +@end + +RTC_EXPORT +@interface RTCRtpTransceiver : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCSSLAdapter.h b/ios/Headers/RTCSSLAdapter.h new file mode 100644 index 00000000..a0da827c --- /dev/null +++ b/ios/Headers/RTCSSLAdapter.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +/** + * Initialize and clean up the SSL library. Failure is fatal. These call the + * corresponding functions in webrtc/rtc_base/ssladapter.h. + */ +RTC_EXTERN BOOL RTCInitializeSSL(void); +RTC_EXTERN BOOL RTCCleanupSSL(void); diff --git a/ios/Headers/RTCSessionDescription.h b/ios/Headers/RTCSessionDescription.h new file mode 100644 index 00000000..41439804 --- /dev/null +++ b/ios/Headers/RTCSessionDescription.h @@ -0,0 +1,48 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +/** + * Represents the session description type. This exposes the same types that are + * in C++, which doesn't include the rollback type that is in the W3C spec. + */ +typedef NS_ENUM(NSInteger, RTCSdpType) { + RTCSdpTypeOffer, + RTCSdpTypePrAnswer, + RTCSdpTypeAnswer, +}; + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT +@interface RTCSessionDescription : NSObject + +/** The type of session description. */ +@property(nonatomic, readonly) RTCSdpType type; + +/** The SDP string representation of this session description. */ +@property(nonatomic, readonly) NSString *sdp; + +- (instancetype)init NS_UNAVAILABLE; + +/** Initialize a session description with a type and SDP string. */ +- (instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp + NS_DESIGNATED_INITIALIZER; + ++ (NSString *)stringForType:(RTCSdpType)type; + ++ (RTCSdpType)typeForString:(NSString *)string; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCTracing.h b/ios/Headers/RTCTracing.h new file mode 100644 index 00000000..5e7e48f2 --- /dev/null +++ b/ios/Headers/RTCTracing.h @@ -0,0 +1,21 @@ +/* + * Copyright 2016 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +RTC_EXTERN void RTCSetupInternalTracer(void); +/** Starts capture to specified file. Must be a valid writable path. + * Returns YES if capture starts. + */ +RTC_EXTERN BOOL RTCStartInternalCapture(NSString *filePath); +RTC_EXTERN void RTCStopInternalCapture(void); +RTC_EXTERN void RTCShutdownInternalTracer(void); diff --git a/ios/Headers/RTCVideoCapturer.h b/ios/Headers/RTCVideoCapturer.h new file mode 100644 index 00000000..f0a2eaa1 --- /dev/null +++ b/ios/Headers/RTCVideoCapturer.h @@ -0,0 +1,31 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class RTCVideoCapturer; + +RTC_EXPORT +@protocol RTCVideoCapturerDelegate +- (void)capturer:(RTCVideoCapturer *)capturer didCaptureVideoFrame:(RTCVideoFrame *)frame; +@end + +RTC_EXPORT +@interface RTCVideoCapturer : NSObject + +@property(nonatomic, weak) id delegate; + +- (instancetype)initWithDelegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCVideoCodec.h b/ios/Headers/RTCVideoCodec.h new file mode 100644 index 00000000..e9dd234c --- /dev/null +++ b/ios/Headers/RTCVideoCodec.h @@ -0,0 +1,185 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT extern NSString *const kRTCVideoCodecVp8Name; +RTC_EXPORT extern NSString *const kRTCVideoCodecVp9Name; +RTC_EXPORT extern NSString *const kRTCVideoCodecH264Name; +RTC_EXPORT extern NSString *const kRTCLevel31ConstrainedHigh; +RTC_EXPORT extern NSString *const kRTCLevel31ConstrainedBaseline; + +/** Represents an encoded frame's type. */ +typedef NS_ENUM(NSUInteger, RTCFrameType) { + RTCFrameTypeEmptyFrame = 0, + RTCFrameTypeAudioFrameSpeech = 1, + RTCFrameTypeAudioFrameCN = 2, + RTCFrameTypeVideoFrameKey = 3, + RTCFrameTypeVideoFrameDelta = 4, +}; + +typedef NS_ENUM(NSUInteger, RTCVideoContentType) { + RTCVideoContentTypeUnspecified, + RTCVideoContentTypeScreenshare, +}; + +/** Represents an encoded frame. Corresponds to webrtc::EncodedImage. */ +RTC_EXPORT +@interface RTCEncodedImage : NSObject + +@property(nonatomic, strong) NSData *buffer; +@property(nonatomic, assign) int32_t encodedWidth; +@property(nonatomic, assign) int32_t encodedHeight; +@property(nonatomic, assign) uint32_t timeStamp; +@property(nonatomic, assign) int64_t captureTimeMs; +@property(nonatomic, assign) int64_t ntpTimeMs; +@property(nonatomic, assign) uint8_t flags; +@property(nonatomic, assign) int64_t encodeStartMs; +@property(nonatomic, assign) int64_t encodeFinishMs; +@property(nonatomic, assign) RTCFrameType frameType; +@property(nonatomic, assign) RTCVideoRotation rotation; +@property(nonatomic, assign) BOOL completeFrame; +@property(nonatomic, strong) NSNumber *qp; +@property(nonatomic, assign) RTCVideoContentType contentType; + +@end + +/** Information for header. Corresponds to webrtc::RTPFragmentationHeader. */ +RTC_EXPORT +@interface RTCRtpFragmentationHeader : NSObject + +@property(nonatomic, strong) NSArray *fragmentationOffset; +@property(nonatomic, strong) NSArray *fragmentationLength; +@property(nonatomic, strong) NSArray *fragmentationTimeDiff; +@property(nonatomic, strong) NSArray *fragmentationPlType; + +@end + +/** Implement this protocol to pass codec specific info from the encoder. + * Corresponds to webrtc::CodecSpecificInfo. + */ +RTC_EXPORT +@protocol RTCCodecSpecificInfo + +@end + +/** Callback block for encoder. */ +typedef BOOL (^RTCVideoEncoderCallback)(RTCEncodedImage *frame, + id info, + RTCRtpFragmentationHeader *header); + +/** Callback block for decoder. */ +typedef void (^RTCVideoDecoderCallback)(RTCVideoFrame *frame); + +typedef NS_ENUM(NSUInteger, RTCVideoCodecMode) { + RTCVideoCodecModeRealtimeVideo, + RTCVideoCodecModeScreensharing, +}; + +/** Holds information to identify a codec. Corresponds to cricket::VideoCodec. */ +RTC_EXPORT +@interface RTCVideoCodecInfo : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithName:(NSString *)name; + +- (instancetype)initWithName:(NSString *)name + parameters:(nullable NSDictionary *)parameters + NS_DESIGNATED_INITIALIZER; + +- (BOOL)isEqualToCodecInfo:(RTCVideoCodecInfo *)info; + +@property(nonatomic, readonly) NSString *name; +@property(nonatomic, readonly) NSDictionary *parameters; + +@end + +/** Settings for encoder. Corresponds to webrtc::VideoCodec. */ +RTC_EXPORT +@interface RTCVideoEncoderSettings : NSObject + +@property(nonatomic, strong) NSString *name; + +@property(nonatomic, assign) unsigned short width; +@property(nonatomic, assign) unsigned short height; + +@property(nonatomic, assign) unsigned int startBitrate; // kilobits/sec. +@property(nonatomic, assign) unsigned int maxBitrate; +@property(nonatomic, assign) unsigned int minBitrate; +@property(nonatomic, assign) unsigned int targetBitrate; + +@property(nonatomic, assign) uint32_t maxFramerate; + +@property(nonatomic, assign) unsigned int qpMax; +@property(nonatomic, assign) RTCVideoCodecMode mode; + +@end + +/** QP thresholds for encoder. Corresponds to webrtc::VideoEncoder::QpThresholds. */ +RTC_EXPORT +@interface RTCVideoEncoderQpThresholds : NSObject + +- (instancetype)initWithThresholdsLow:(NSInteger)low high:(NSInteger)high; + +@property(nonatomic, readonly) NSInteger low; +@property(nonatomic, readonly) NSInteger high; + +@end + +/** Protocol for encoder implementations. */ +RTC_EXPORT +@protocol RTCVideoEncoder + +- (void)setCallback:(RTCVideoEncoderCallback)callback; +- (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings + numberOfCores:(int)numberOfCores; +- (NSInteger)releaseEncoder; +- (NSInteger)encode:(RTCVideoFrame *)frame + codecSpecificInfo:(nullable id)info + frameTypes:(NSArray *)frameTypes; +- (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate; +- (NSString *)implementationName; + +/** Returns QP scaling settings for encoder. The quality scaler adjusts the resolution in order to + * keep the QP from the encoded images within the given range. Returning nil from this function + * disables quality scaling. */ +- (RTCVideoEncoderQpThresholds *)scalingSettings; + +@end + +/** Protocol for decoder implementations. */ +RTC_EXPORT +@protocol RTCVideoDecoder + +- (void)setCallback:(RTCVideoDecoderCallback)callback; +- (NSInteger)startDecodeWithSettings:(RTCVideoEncoderSettings *)settings + numberOfCores:(int)numberOfCores + DEPRECATED_MSG_ATTRIBUTE("use startDecodeWithNumberOfCores: instead"); +- (NSInteger)releaseDecoder; +- (NSInteger)decode:(RTCEncodedImage *)encodedImage + missingFrames:(BOOL)missingFrames + fragmentationHeader:(RTCRtpFragmentationHeader *)fragmentationHeader + codecSpecificInfo:(nullable id)info + renderTimeMs:(int64_t)renderTimeMs; +- (NSString *)implementationName; + +// TODO(andersc): Make non-optional when `startDecodeWithSettings:numberOfCores:` is removed. +@optional +- (NSInteger)startDecodeWithNumberOfCores:(int)numberOfCores; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCVideoCodecFactory.h b/ios/Headers/RTCVideoCodecFactory.h new file mode 100644 index 00000000..0ef2c8a6 --- /dev/null +++ b/ios/Headers/RTCVideoCodecFactory.h @@ -0,0 +1,54 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** RTCVideoEncoderFactory is an Objective-C version of webrtc::VideoEncoderFactory. */ +RTC_EXPORT +@protocol RTCVideoEncoderFactory + +- (nullable id)createEncoder:(RTCVideoCodecInfo *)info; +- (NSArray *)supportedCodecs; // TODO(andersc): "supportedFormats" instead? + +@end + +/** RTCVideoDecoderFactory is an Objective-C version of webrtc::VideoDecoderFactory. */ +RTC_EXPORT +@protocol RTCVideoDecoderFactory + +- (nullable id)createDecoder:(RTCVideoCodecInfo *)info; +- (NSArray *)supportedCodecs; // TODO(andersc): "supportedFormats" instead? + +@end + +#pragma mark - Default factories + +/** These codec factories include support for all codecs bundled with WebRTC. If using custom + * codecs, create custom implementations of RTCVideoEncoderFactory and RTCVideoDecoderFactory. + */ +RTC_EXPORT +@interface RTCDefaultVideoEncoderFactory : NSObject + +@property(nonatomic, retain) RTCVideoCodecInfo *preferredCodec; + ++ (NSArray *)supportedCodecs; + +@end + +RTC_EXPORT +@interface RTCDefaultVideoDecoderFactory : NSObject +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCVideoCodecH264.h b/ios/Headers/RTCVideoCodecH264.h new file mode 100644 index 00000000..1c307ebe --- /dev/null +++ b/ios/Headers/RTCVideoCodecH264.h @@ -0,0 +1,50 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import + +/** Class for H264 specific config. */ +typedef NS_ENUM(NSUInteger, RTCH264PacketizationMode) { + RTCH264PacketizationModeNonInterleaved = 0, // Mode 1 - STAP-A, FU-A is allowed + RTCH264PacketizationModeSingleNalUnit // Mode 0 - only single NALU allowed +}; + +RTC_EXPORT +@interface RTCCodecSpecificInfoH264 : NSObject + +@property(nonatomic, assign) RTCH264PacketizationMode packetizationMode; + +@end + +/** Encoder. */ +RTC_EXPORT +@interface RTCVideoEncoderH264 : NSObject + +- (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo; + +@end + +/** Decoder. */ +RTC_EXPORT +@interface RTCVideoDecoderH264 : NSObject +@end + +/** Encoder factory. */ +RTC_EXPORT +@interface RTCVideoEncoderFactoryH264 : NSObject +@end + +/** Decoder factory. */ +RTC_EXPORT +@interface RTCVideoDecoderFactoryH264 : NSObject +@end diff --git a/ios/Headers/RTCVideoDecoderVP8.h b/ios/Headers/RTCVideoDecoderVP8.h new file mode 100644 index 00000000..962b6312 --- /dev/null +++ b/ios/Headers/RTCVideoDecoderVP8.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import + +RTC_EXPORT +@interface RTCVideoDecoderVP8 : NSObject + +/* This returns a VP8 decoder that can be returned from a RTCVideoDecoderFactory injected into + * RTCPeerConnectionFactory. Even though it implements the RTCVideoDecoder protocol, it can not be + * used independently from the RTCPeerConnectionFactory. + */ ++ (id)vp8Decoder; + +@end diff --git a/ios/Headers/RTCVideoDecoderVP9.h b/ios/Headers/RTCVideoDecoderVP9.h new file mode 100644 index 00000000..faf66ef0 --- /dev/null +++ b/ios/Headers/RTCVideoDecoderVP9.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import + +RTC_EXPORT +@interface RTCVideoDecoderVP9 : NSObject + +/* This returns a VP9 decoder that can be returned from a RTCVideoDecoderFactory injected into + * RTCPeerConnectionFactory. Even though it implements the RTCVideoDecoder protocol, it can not be + * used independently from the RTCPeerConnectionFactory. + */ ++ (id)vp9Decoder; + +@end diff --git a/ios/Headers/RTCVideoEncoderVP8.h b/ios/Headers/RTCVideoEncoderVP8.h new file mode 100644 index 00000000..e63b24dd --- /dev/null +++ b/ios/Headers/RTCVideoEncoderVP8.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import + +RTC_EXPORT +@interface RTCVideoEncoderVP8 : NSObject + +/* This returns a VP8 encoder that can be returned from a RTCVideoEncoderFactory injected into + * RTCPeerConnectionFactory. Even though it implements the RTCVideoEncoder protocol, it can not be + * used independently from the RTCPeerConnectionFactory. + */ ++ (id)vp8Encoder; + +@end diff --git a/ios/Headers/RTCVideoEncoderVP9.h b/ios/Headers/RTCVideoEncoderVP9.h new file mode 100644 index 00000000..cef8c82e --- /dev/null +++ b/ios/Headers/RTCVideoEncoderVP9.h @@ -0,0 +1,25 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import + +RTC_EXPORT +@interface RTCVideoEncoderVP9 : NSObject + +/* This returns a VP9 encoder that can be returned from a RTCVideoEncoderFactory injected into + * RTCPeerConnectionFactory. Even though it implements the RTCVideoEncoder protocol, it can not be + * used independently from the RTCPeerConnectionFactory. + */ ++ (id)vp9Encoder; + +@end diff --git a/ios/Headers/RTCVideoFrame.h b/ios/Headers/RTCVideoFrame.h new file mode 100644 index 00000000..dcc4c6e7 --- /dev/null +++ b/ios/Headers/RTCVideoFrame.h @@ -0,0 +1,85 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, RTCVideoRotation) { + RTCVideoRotation_0 = 0, + RTCVideoRotation_90 = 90, + RTCVideoRotation_180 = 180, + RTCVideoRotation_270 = 270, +}; + +@protocol RTCVideoFrameBuffer; + +// RTCVideoFrame is an ObjectiveC version of webrtc::VideoFrame. +RTC_EXPORT +@interface RTCVideoFrame : NSObject + +/** Width without rotation applied. */ +@property(nonatomic, readonly) int width; + +/** Height without rotation applied. */ +@property(nonatomic, readonly) int height; +@property(nonatomic, readonly) RTCVideoRotation rotation; + +/** Timestamp in nanoseconds. */ +@property(nonatomic, readonly) int64_t timeStampNs; + +/** Timestamp 90 kHz. */ +@property(nonatomic, assign) int32_t timeStamp; + +@property(nonatomic, readonly) id buffer; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)new NS_UNAVAILABLE; + +/** Initialize an RTCVideoFrame from a pixel buffer, rotation, and timestamp. + * Deprecated - initialize with a RTCCVPixelBuffer instead + */ +- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer + rotation:(RTCVideoRotation)rotation + timeStampNs:(int64_t)timeStampNs + DEPRECATED_MSG_ATTRIBUTE("use initWithBuffer instead"); + +/** Initialize an RTCVideoFrame from a pixel buffer combined with cropping and + * scaling. Cropping will be applied first on the pixel buffer, followed by + * scaling to the final resolution of scaledWidth x scaledHeight. + */ +- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer + scaledWidth:(int)scaledWidth + scaledHeight:(int)scaledHeight + cropWidth:(int)cropWidth + cropHeight:(int)cropHeight + cropX:(int)cropX + cropY:(int)cropY + rotation:(RTCVideoRotation)rotation + timeStampNs:(int64_t)timeStampNs + DEPRECATED_MSG_ATTRIBUTE("use initWithBuffer instead"); + +/** Initialize an RTCVideoFrame from a frame buffer, rotation, and timestamp. + */ +- (instancetype)initWithBuffer:(id)frameBuffer + rotation:(RTCVideoRotation)rotation + timeStampNs:(int64_t)timeStampNs; + +/** Return a frame that is guaranteed to be I420, i.e. it is possible to access + * the YUV data on it. + */ +- (RTCVideoFrame *)newI420VideoFrame; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCVideoFrameBuffer.h b/ios/Headers/RTCVideoFrameBuffer.h new file mode 100644 index 00000000..f17d952f --- /dev/null +++ b/ios/Headers/RTCVideoFrameBuffer.h @@ -0,0 +1,111 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RTCI420Buffer; + +// RTCVideoFrameBuffer is an ObjectiveC version of webrtc::VideoFrameBuffer. +RTC_EXPORT +@protocol RTCVideoFrameBuffer + +@property(nonatomic, readonly) int width; +@property(nonatomic, readonly) int height; + +- (id)toI420; + +@end + +/** Protocol for RTCVideoFrameBuffers containing YUV planar data. */ +@protocol RTCYUVPlanarBuffer + +@property(nonatomic, readonly) int chromaWidth; +@property(nonatomic, readonly) int chromaHeight; +@property(nonatomic, readonly) const uint8_t *dataY; +@property(nonatomic, readonly) const uint8_t *dataU; +@property(nonatomic, readonly) const uint8_t *dataV; +@property(nonatomic, readonly) int strideY; +@property(nonatomic, readonly) int strideU; +@property(nonatomic, readonly) int strideV; + +- (instancetype)initWithWidth:(int)width height:(int)height; +- (instancetype)initWithWidth:(int)width + height:(int)height + strideY:(int)strideY + strideU:(int)strideU + strideV:(int)strideV; + +@end + +/** Extension of the YUV planar data buffer with mutable data access */ +@protocol RTCMutableYUVPlanarBuffer + +@property(nonatomic, readonly) uint8_t *mutableDataY; +@property(nonatomic, readonly) uint8_t *mutableDataU; +@property(nonatomic, readonly) uint8_t *mutableDataV; + +@end + +/** Protocol for RTCYUVPlanarBuffers containing I420 data */ +@protocol RTCI420Buffer +@end + +/** Extension of the I420 buffer with mutable data access */ +@protocol RTCMutableI420Buffer +@end + +/** RTCVideoFrameBuffer containing a CVPixelBufferRef */ +RTC_EXPORT +@interface RTCCVPixelBuffer : NSObject + +@property(nonatomic, readonly) CVPixelBufferRef pixelBuffer; +@property(nonatomic, readonly) int cropX; +@property(nonatomic, readonly) int cropY; +@property(nonatomic, readonly) int cropWidth; +@property(nonatomic, readonly) int cropHeight; + ++ (NSSet *)supportedPixelFormats; + +- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer; +- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer + adaptedWidth:(int)adaptedWidth + adaptedHeight:(int)adaptedHeight + cropWidth:(int)cropWidth + cropHeight:(int)cropHeight + cropX:(int)cropX + cropY:(int)cropY; + +- (BOOL)requiresCropping; +- (BOOL)requiresScalingToWidth:(int)width height:(int)height; +- (int)bufferSizeForCroppingAndScalingToWidth:(int)width height:(int)height; + +/** The minimum size of the |tmpBuffer| must be the number of bytes returned from the + * bufferSizeForCroppingAndScalingToWidth:height: method. + * If that size is 0, the |tmpBuffer| may be nil. + */ +- (BOOL)cropAndScaleTo:(CVPixelBufferRef)outputPixelBuffer + withTempBuffer:(nullable uint8_t *)tmpBuffer; + +@end + +/** RTCI420Buffer implements the RTCI420Buffer protocol */ +RTC_EXPORT +@interface RTCI420Buffer : NSObject +@end + +/** Mutable version of RTCI420Buffer */ +RTC_EXPORT +@interface RTCMutableI420Buffer : RTCI420Buffer +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCVideoRenderer.h b/ios/Headers/RTCVideoRenderer.h new file mode 100644 index 00000000..5e2e8209 --- /dev/null +++ b/ios/Headers/RTCVideoRenderer.h @@ -0,0 +1,33 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#if TARGET_OS_IPHONE +#import +#endif + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class RTCVideoFrame; + +RTC_EXPORT +@protocol RTCVideoRenderer + +/** The size of the frame. */ +- (void)setSize:(CGSize)size; + +/** The frame to be displayed. */ +- (void)renderFrame:(nullable RTCVideoFrame *)frame; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCVideoSource.h b/ios/Headers/RTCVideoSource.h new file mode 100644 index 00000000..a9ebc06c --- /dev/null +++ b/ios/Headers/RTCVideoSource.h @@ -0,0 +1,37 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +RTC_EXPORT + +@interface RTCVideoSource : RTCMediaSource + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Calling this function will cause frames to be scaled down to the + * requested resolution. Also, frames will be cropped to match the + * requested aspect ratio, and frames will be dropped to match the + * requested fps. The requested aspect ratio is orientation agnostic and + * will be adjusted to maintain the input orientation, so it doesn't + * matter if e.g. 1280x720 or 720x1280 is requested. + */ +- (void)adaptOutputFormatToWidth:(int)width height:(int)height fps:(int)fps; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCVideoTrack.h b/ios/Headers/RTCVideoTrack.h new file mode 100644 index 00000000..899d7c34 --- /dev/null +++ b/ios/Headers/RTCVideoTrack.h @@ -0,0 +1,37 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol RTCVideoRenderer; +@class RTCPeerConnectionFactory; +@class RTCVideoSource; + +RTC_EXPORT +@interface RTCVideoTrack : RTCMediaStreamTrack + +/** The video source for this video track. */ +@property(nonatomic, readonly) RTCVideoSource *source; + +- (instancetype)init NS_UNAVAILABLE; + +/** Register a renderer that will render all frames received on this track. */ +- (void)addRenderer:(id)renderer; + +/** Deregister a renderer. */ +- (void)removeRenderer:(id)renderer; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/RTCVideoViewShading.h b/ios/Headers/RTCVideoViewShading.h new file mode 100644 index 00000000..6f3ece94 --- /dev/null +++ b/ios/Headers/RTCVideoViewShading.h @@ -0,0 +1,41 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * RTCVideoViewShading provides a way for apps to customize the OpenGL(ES) shaders used in + * rendering for the RTCEAGLVideoView/RTCNSGLVideoView. + */ +RTC_EXPORT +@protocol RTCVideoViewShading + +/** Callback for I420 frames. Each plane is given as a texture. */ +- (void)applyShadingForFrameWithWidth:(int)width + height:(int)height + rotation:(RTCVideoRotation)rotation + yPlane:(GLuint)yPlane + uPlane:(GLuint)uPlane + vPlane:(GLuint)vPlane; + +/** Callback for NV12 frames. Each plane is given as a texture. */ +- (void)applyShadingForFrameWithWidth:(int)width + height:(int)height + rotation:(RTCVideoRotation)rotation + yPlane:(GLuint)yPlane + uvPlane:(GLuint)uvPlane; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Headers/UIDevice+RTCDevice.h b/ios/Headers/UIDevice+RTCDevice.h new file mode 100644 index 00000000..79d2db8c --- /dev/null +++ b/ios/Headers/UIDevice+RTCDevice.h @@ -0,0 +1,68 @@ +/* + * Copyright 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +typedef NS_ENUM(NSInteger, RTCDeviceType) { + RTCDeviceTypeUnknown, + RTCDeviceTypeIPhone1G, + RTCDeviceTypeIPhone3G, + RTCDeviceTypeIPhone3GS, + RTCDeviceTypeIPhone4, + RTCDeviceTypeIPhone4Verizon, + RTCDeviceTypeIPhone4S, + RTCDeviceTypeIPhone5GSM, + RTCDeviceTypeIPhone5GSM_CDMA, + RTCDeviceTypeIPhone5CGSM, + RTCDeviceTypeIPhone5CGSM_CDMA, + RTCDeviceTypeIPhone5SGSM, + RTCDeviceTypeIPhone5SGSM_CDMA, + RTCDeviceTypeIPhone6Plus, + RTCDeviceTypeIPhone6, + RTCDeviceTypeIPhone6S, + RTCDeviceTypeIPhone6SPlus, + RTCDeviceTypeIPhone7, + RTCDeviceTypeIPhone7Plus, + RTCDeviceTypeIPhone8, + RTCDeviceTypeIPhone8Plus, + RTCDeviceTypeIPhoneX, + RTCDeviceTypeIPodTouch1G, + RTCDeviceTypeIPodTouch2G, + RTCDeviceTypeIPodTouch3G, + RTCDeviceTypeIPodTouch4G, + RTCDeviceTypeIPodTouch5G, + RTCDeviceTypeIPad, + RTCDeviceTypeIPad2Wifi, + RTCDeviceTypeIPad2GSM, + RTCDeviceTypeIPad2CDMA, + RTCDeviceTypeIPad2Wifi2, + RTCDeviceTypeIPadMiniWifi, + RTCDeviceTypeIPadMiniGSM, + RTCDeviceTypeIPadMiniGSM_CDMA, + RTCDeviceTypeIPad3Wifi, + RTCDeviceTypeIPad3GSM_CDMA, + RTCDeviceTypeIPad3GSM, + RTCDeviceTypeIPad4Wifi, + RTCDeviceTypeIPad4GSM, + RTCDeviceTypeIPad4GSM_CDMA, + RTCDeviceTypeIPadAirWifi, + RTCDeviceTypeIPadAirCellular, + RTCDeviceTypeIPadMini2GWifi, + RTCDeviceTypeIPadMini2GCellular, + RTCDeviceTypeSimulatori386, + RTCDeviceTypeSimulatorx86_64, +}; + +@interface UIDevice (RTCDevice) + ++ (RTCDeviceType)deviceType; ++ (BOOL)isIOS11OrLater; + +@end diff --git a/ios/Headers/WebRTC.h b/ios/Headers/WebRTC.h new file mode 100644 index 00000000..7289c690 --- /dev/null +++ b/ios/Headers/WebRTC.h @@ -0,0 +1,65 @@ +/* + * Copyright 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import diff --git a/ios/Info.plist b/ios/Info.plist new file mode 100644 index 0000000000000000000000000000000000000000..09304a859363f0c5da195c157b491f595d7d6de0 GIT binary patch literal 775 zcmZWlO>fgc5Z&GKQJ|1bLmOHslu|wm#zuw6C#1%W6t!ur*i8b8YHgg2vvmC-+bKi> zAx_-jH&BT)SMD761>8W0KfnnI2`<=VyqyG1oD0F2kDC50XwHVbzE^U=FQosRrKC zRG&E}^9V0<5(GPnu5uFgUEhuu8n}=tsl?nR7S%^y)Sb_|+Q9Y0bcq&5Qr5rV(DNdg z_A<%9zzZ3(>hxWOnPGGt@kf8}oX+s|C)6Bmn?bVp&kZ|ZnE^`N@WUASs-G*M)MR`^1 zFmK>G)D0v_SlyQHR!VY%I+`SiO{ugl$+FtcCiF_JwGkt4F148&v+A05FB%-n8F;#&(UL2Yc&9}4 z`%#Qf0+XNw6tD@JfPiPstT- literal 0 HcmV?d00001 diff --git a/ios/JitsiMeet.framework/GTMOAuth2ViewTouch.nib b/ios/JitsiMeet.framework/GTMOAuth2ViewTouch.nib new file mode 100644 index 0000000000000000000000000000000000000000..2b2756f1e7db1022472da846bf8b5fdeee24c305 GIT binary patch literal 3648 zcmai1{c{^f8Q!>-d)WdlZE2fAA<$Aj+88^rla`NIvK_|)Th3TkJi{-{Sz5`Lp6fj6DMxck~Afu1`-HO3k}9lW`G%HnBfm7GXV+%zcK^-#MW?k4+d&A~iRX)W_Tm{7f6=)UPuWMvLwNuFdkC4!mF7#l zHlMF9mE2{XKgIb<$$f#l=lSA=Lh&N6UCI|;S#+=Q>h+TQI_3{X;W#3 zRlTj6d#p-x6J~0JWtcuTb&N$FVQ(=K9Ar96s1C!F5!Fht3C+>jpk}9ZH9Km?STPdp z*VAk{5**fI%$}TPM%Xb^DHg+si08cLO5KIwbRvO3j#!#$X-*c7Adc3CC9%sC(@)EO zcyLsO@gu5c$?&k3nKokfInQ59)f{YQsR=fs+0tW-h)pNhag1bjHe@!qbFo;BK9{hB zg#lAHt+hxn5IdH}!eA06gzE@Q1*5T(AbMH_t8!vR(7;lImO3*IX241~J(U5!HdyIT zJC2E%!BIS|*TXDFf|4k?97&!)GG+Ue^c=Gc7}89m9@YS|!>pR;{2;TVmX<)0)Vpm<>D9=ebaL{BS>l6m~*tl2tw;D6(%IN~WAF z@`S~bZy1(FJod)oaho}%P%ioPm62Jx^QPshqc7Cj>loKx;mP=Z>aK>+#AAef*L z)1oR!mjx;`3bDaDQYqs@X^*CLM@#8!!c0e}>u!KA&g>4F&*I3e5GL4z z2O?c_k>EIsmFWFAV=MF!@H~A2n5Ulw{y^fg#G1q#^wa3C(!;=6`Y3RNiu3yxX@9GO zkX+v-iHj0%0tvaQl)86|e_hu|TR~a;+TPx-r*{LMzf9U*^{rEJzOPep@~_hmOZ>b< z9R28d5?D}*2~!kgL8%4%hfv_oII}?+L{+7CW5z6f2Dl+T$`St>eG0Et`nVht4sOT^ z-=@Q8zetCGMX?UQXZ)vjzE*D&!keuhleU-Je=Zli*_>KXPKCk^tv8dqZS=XmtIC{= zUdCSO-rs4MR#Mfa?yIyP`_D=OH|Voy7nEg7sIOnOyrUwB5)~YY5Z38#i64{bm-sn} z-N4J_kt*#(qhaq8Xcv@9_kpcjUMA!U?Ze0#eIM`)4a!+_W2mg@P5KeMU8f%cR_Os? z!T+GndH@yzK9E#OLG&RWKWY8EVGk$QE<1&_~d{AVwCa zpcHRNP$#Yy>-2*X?~&Lh@j;3AN&Jk&0f}FbxJzOeu%P5`ujbb1LA1B$;GiGF_#JF< zkQ?&LF4E~=m61R3vvx#&j*7DQq3^V>OmV9r-)(Z{%?56I*=dSRe%c$~#}lgk+#IZ4|w1-$%( zv@Nw?^u0iP@&2lBd$S=wCg8V4hG@$!xPO-JL34%P1>7o0kMJseKl&R9_oFSfHU8RN z(3bQ3E@`a!x3@NZBRc@vxWv#o!%cke&;dLTX0Ce=cyV6CXwL EZ=2ddX8-^I literal 0 HcmV?d00001 diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/Info.plist b/ios/JitsiMeet.framework/GoogleSignIn.bundle/Info.plist new file mode 100755 index 00000000..290d5343 --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIconFile + + CFBundleIdentifier + com.google.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/Roboto-Bold.ttf b/ios/JitsiMeet.framework/GoogleSignIn.bundle/Roboto-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..68822caf2421c331497581f9b80e49401189b996 GIT binary patch literal 127744 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%0AmbY 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 JPDHLkV1h!Z?2`Zh literal 0 HcmV?d00001 diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/google@3x.png b/ios/JitsiMeet.framework/GoogleSignIn.bundle/google@3x.png new file mode 100755 index 0000000000000000000000000000000000000000..d978ed26a231ef362d6897ebf208f3f1f4f1c7da GIT binary patch literal 1622 zcmV-c2C4apP)0n7a+ByQ8!ahvZ4Bun~Qz)$OQXm;|AK-T;yJkwe z5lB|-2hb?eu^!N_zrfEgVCIW(%}c{J?Gjx7CO(zGCwvl-oT+PonEn~#mX1?^fxYJw z%=Xzqv$hLRB7d5d9l|!{41P_5HFX(Ksy6wBJ0M#7YdYKUcVVkK4M-1e<+#o-o6eMa z0gxV>{DQWAqP|6~-v6`N+#Se>@Q4w8xC{T=*3SmgYoji>YtO&On*L609Vtygd%^KQ z>GZe7G!)2)_8%I{^3RXnyORiyS7dL!X1pP8plsB>XEl}Q{nS+6MXdGq5mki)Wp2L< zfwC2GX{yK@$D!IZF6l1n&N?X3p0W@qn{lDW^8DvG&?d^dh)B^MBIHoF_&^wT4A~7R zn~|7FdF#r%RCAbE);zVHsG2&sJs5AcK-rEOSLUl6Adz+RdWxFk`{EW22%xOL`H%YMPC8pf4E9&##ZKi2xLSif>}$VUjc%x?9wU|49}|s zG9oj<8h(TST`*|)3y5#Us9f{N`v}O0jLw*J^C;_517t*on#b2bSkztKlx_E-tovR- zdS$5HzX=FdmiLVG23^+Wcp$wpG-G}s;t!ZIq1KdjZFzJ-|5-qKnQxEoqKCCKIxdA7 zD+L6r?4l$K_2-H{;>6iDq57PS+RVdt0m>u{^c>k>_M*r!K*XP(`BV`v)Z5E;6Jz~T z5XueUb>9Y*Nf>a2Y%s^o^#=kGO3ZcE2v08TCklKn4%E)%ajsTo9<~=yCSXtMYb$DK zl?i1jZuk?3apB{RedACyWj)1(b4PKIm=vFT8BiuzN+NTm*H>}mX&}ahgrJ-?EAoHg zP+zUsK}?%9kpm>8c->b3btG)GF1b)`GZvi;#JDi}Vfi-KFIc>v80nwE15eK5Zq&^8CW3aW-p^Bmb^9>>&h!Gc7=pWWY^*Dc(3ANFBYgWCk(}B{-Tv~SkAB|Ev zN)<@6Thk~4+8CEj6!;7GHTj(NF$2i?TJg9q zQoYmn1WKgu%)`2>K9@uFI-kXwUE6jItT8e2;g|RnA$6J`dq-<8pp9|ag5oPYjQ@dQ z9_RNM_)Ol^;cD)r_wF4t-kZE9CVKtwr;CL3)=>Ol*x&4>(Fs7C;}R1O07Pdi zc;QT8zT?Z-vsDzm6DSrgG4WbaJg%oZKOA_E6r&$ly7?#N<%i7_c|fsniHmNyAs0>I znXCv0!yms-*h*`8?Y(WjA=n!z9xh2?ZIot9xM9y+^V*2p!hL`e;Ua}wIhsMFlY>3U zofIe;F4A}_P<_sqGrz{%wS0I0lEo!ud`2|++`o5xC})f6aXrVIH&80L=yJf)3EfOy z*I8&T-*rHsMtpzCNaJkCGx`+JJl>Bq_B20Ul-pn21`0ZNyD04`wR UaJO?$Q2+n{07*qoM6N<$f*zI^s{jB1 literal 0 HcmV?d00001 diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..efd53fef --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "היכנס"; + +/* Long form sign-in button text */ +"Sign in with Google" = "היכנס באמצעות Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "כניסה באמצעות Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "התקן את Google app בחינם והיכנס אל אפליקציות באמצעות חשבון Google. לא תצטרך עוד לזכור סיסמאות."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "בטל"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "התקן"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "אישור"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "ביטול"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "הגדרות"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "לא ניתן להיכנס לחשבון"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "מנהל המערכת דורש ממך להגדיר קוד סיסמה במכשיר זה כדי לגשת לחשבון זה. יש להגדיר קוד סיסמה ולנסות שוב."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "המכשיר אינו פועל בהתאם למדיניות האבטחה שנקבעה על-ידי מנהל המערכת."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "האם להתחבר באמצעות האפליקציית Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "על מנת להגן על נתוני הארגון שלך, יש להתחבר באמצעות אפליקציית Device Policy לפני הכניסה לחשבון."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "התחברות"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..3b7cd1ff --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "साइन इन करें"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google के साथ साइन इन करें"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Google के साथ साइन इन करें"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "मुफ़्त Google ऐप्लिकेशन पाएं और अपने Google खाते से ऐप्लिकेशन में साइन इन करें. पासवर्ड याद रखने की ज़रूरत नहीं."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "अभी नहीं"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "पाएं"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ठीक"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "अभी नहीं"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "सेटिंग"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "खाते में साइन इन नहीं किया जा सका"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "आपके एडमिन के लिए ज़रूरी है कि आप यह खाता एक्सेस करने के लिए इस डिवाइस पर एक पासकोड सेट करें. कृपया पासकोड सेट करें और दोबारा कोशिश करें."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "डिवाइस आपके एडमिन के ज़रिए सेट की गई सुरक्षा नीति का अनुपालन नहीं करता है."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "क्या Device Policy ऐप्लिकेशन से कनेक्ट करना चाहते हैं?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "अपने संगठन डेटा की सुरक्षा के लिए, आपको लॉग-इन करने से पहले Device Policy ऐप्लिकेशन से कनेक्ट करना होगा."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "कनेक्ट करें"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..32b6cc3d --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Prijava"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Prijavite se putem Googlea"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Prijavite se putem Googlea"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Preuzmite besplatnu aplikaciju Google i prijavljujte se na aplikacije svojim Google računom. Ne morate pamtiti zaporke."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Odustani"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Nabavi"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "U redu"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Odbaci"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Postavke"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Prijava na račun nije moguća"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Vaš administrator zahtijeva da postavite šifru zaporke na ovom uređaju da biste pristupili računu. Postavite šifru zaporke i pokušajte ponovo."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Uređaj nije usklađen sa sigurnosnim pravilima koja je postavio vaš administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Želite li se povezati s aplikacijom Pravila za uređaje?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Da biste zaštitili podatke svoje organizacije, morate se povezati s aplikacijom Pravila za uređaje prije prijave."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Poveži"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..9359cf51 --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Bejelentkezés"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Bejelentkezés Google-fiókkal"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Bejelentkezés Google-fiókkal"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Telepítse az ingyenes Google alkalmazást, és jelentkezzen be az egyes termékekbe Google-fiókjával. Nem kell különböző jelszavakat megjegyeznie."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Mégse"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Telepítés"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Mégse"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Beállítások"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nem sikerült bejelentkezni a fiókba"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Adminisztrátora biztonsági kód beállítását kéri ezen az eszközön a fiókhoz való hozzáféréshez. Kérjük, állítson be biztonsági kódot, majd próbálja újra."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Az eszköz nem felel meg a rendszergazda által beállított biztonsági házirendnek."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Csatlakozik a Device Policy alkalmazáshoz?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "A szervezet adatainak védelme érdekében a bejelentkezés előtt csatlakoznia kell a Device Policy alkalmazáshoz."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Csatlakozás"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..9b66ca3c --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Masuk"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Masuk dengan Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Masuk dengan Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Dapatkan Google app gratis dan masuk ke aplikasi dengan Akun Google. Tidak perlu mengingat sandi."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Batal"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Ambil"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Oke"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Batal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Setelan"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Tidak dapat login ke akun"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administrator mengharuskan Anda menyetel kode sandi di perangkat ini untuk mengakses akun ini. Setel kode sandi dan coba lagi."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Perangkat ini tidak sesuai dengan kebijakan keamanan yang disetel oleh administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Sambungkan dengan Aplikasi Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Untuk melindungi data organisasi, Anda harus tersambung dengan aplikasi Device Policy sebelum login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Sambungkan"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..9c3e576a --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Accedi"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Accedi con Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Accedi con Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Scarica gratis l'app Google app e accedi alle app con il tuo account Google: liberati dai vincoli delle password."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Annulla"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Scarica"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annulla"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Impostazioni"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Impossibile accedere all'account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "L'amministratore richiede l'impostazione di un passcode sul dispositivo per accedere a questo account. Imposta un passcode e riprova."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Il dispositivo non è conforme alle norme di sicurezza stabilite dall'amministratore."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vuoi collegarti all'app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Per proteggere i dati della tua organizzazione, devi collegarti all'app Device Policy prima di accedere."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Collega"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..6dab02ca --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "ログイン"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Googleでログイン"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Googleでログイン"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "無料のGoogleアプリをインストールして、Googleアカウントでアプリにログインしよう。パスワードを覚えておく必要はありません。"; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "キャンセル"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "インストール"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "キャンセル"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "設定"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "アカウントにログインできません"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "このアカウントにアクセスするには、この端末でパスコードを設定する必要があります。パスコードを設定してから、もう一度お試しください。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "この端末は、管理者が設定したセキュリティ ポリシーに準拠していません。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Device Policy アプリと接続しますか?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "組織のデータを保護するために、ログインする前に Device Policy アプリと接続する必要があります。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "接続"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..b596605d --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "로그인"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google 계정으로 로그인"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Google 계정으로 로그인"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "무료 Google 앱을 다운로드하여 Google 계정으로 앱에 로그인하세요. 비밀번호를 기억할 필요가 없습니다."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "취소"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "설치"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "확인"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "취소"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "설정"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "계정에 로그인할 수 없음"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "관리자의 설정에 따라 이 계정에 액세스하려면 사용 중인 기기에 비밀번호를 설정해야 합니다. 비밀번호를 설정한 후 다시 시도해 주세요."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "관리자가 설정한 보안 정책을 준수하지 않는 기기입니다."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Device Policy 앱과 연결하시겠습니까?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "조직의 데이터를 보호하려면 로그인하기 전에 Device Policy 앱과 연결해야 합니다."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "연결"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..700aaf2c --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Log masuk"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Log masuk dengan Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Log masuk dengan Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Dapatkan apl Google percuma dan log masuk ke apl menggunakan Akaun Google anda. Tidak perlu mengingati kata laluan."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Batal"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Dapatkan"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Batal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Tetapan"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Tidak dapat log masuk ke akaun"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Pentadbir menghendaki anda menetapkan kod laluan pada peranti ini untuk mengakses akaun ini. Sila tetapkan kod laluan, kemudian cuba lagi."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Peranti tidak mematuhi dasar keselamatan yang ditetapkan oleh pentadbir anda."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Berhubung dengan Apl Dasar Peranti?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Untuk melindungi data organisasi anda, anda mesti berhubung dengan apl Dasar Peranti sebelum log masuk."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Hubungkan"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..994b40ff --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Logg på"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Logg på med Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Logg på med Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Skaff deg den gratis Google-appen, og logg på apper med Google-kontoen din. Du trenger ikke å huske passord."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Avbryt"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Hent"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Avbryt"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Innstillinger"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Kan ikke logge på kontoen"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratoren din krever at du angir en adgangskode på denne enheten for å få tilgang til kontoen. Angi en adgangskode, og prøv på nytt."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Enheten overholder ikke retningslinjene for sikkerhet som ble angitt av administratoren din."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vil du koble til med Device Policy-appen?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "For å beskytte dataene til organisasjonen din må du koble til med Device Policy-appen før du logger på."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Koble til"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..fb539e08 --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Inloggen"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Inloggen met Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Inloggen met Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Installeer de gratis Google-app en log in bij apps met uw Google-account. U hoeft geen wachtwoorden te onthouden."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Annuleren"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Installeren"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annuleren"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Instellingen"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Kan niet inloggen op account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Uw beheerder vereist dat u een toegangscode instelt op dit apparaat om toegang te krijgen tot dit account. Stel een toegangscode in en probeer het opnieuw."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Het apparaat voldoet niet aan het beveiligingsbeleid dat is ingesteld door uw beheerder."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Verbinden met Device Policy-app?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Ter bescherming van de gegevens van uw organisatie moet u verbinding maken met de Device Policy-app voordat u inlogt."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Verbinden"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..6ed4b576 --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Zaloguj się"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Zaloguj się przez Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Zaloguj się przez Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Pobierz darmową aplikację Google i zaloguj się do aplikacji, używając konta Google. Nie musisz pamiętać haseł."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Anuluj"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Pobierz"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Anuluj"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Ustawienia"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nie można zalogować się na konto"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administrator wymaga ustawienia kodu dostępu do konta na tym urządzeniu. Ustaw kod dostępu i spróbuj ponownie."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Urządzenie nie jest zgodne z zasadami bezpieczeństwa ustanowionymi przez Twojego administratora."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Połączyć z aplikacją Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Aby chronić dane organizacji, przed zalogowaniem musisz się połączyć z aplikacją Device Policy."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Połącz"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..3207312c --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Fazer login"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Fazer login com o Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Fazer login com o Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Faça o download do Google app gratuitamente e faça login em aplicativos com sua Conta do Google. Não há necessidade de lembrar senhas."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Cancelar"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Instalar"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configurações"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não foi possível fazer login na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Seu administrador exige que você defina uma senha neste dispositivo para acessar esta conta. Defina uma senha e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Conectar-se ao app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua organização, você precisa se conectar ao app Device Policy antes de fazer login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..3207312c --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Fazer login"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Fazer login com o Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Fazer login com o Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Faça o download do Google app gratuitamente e faça login em aplicativos com sua Conta do Google. Não há necessidade de lembrar senhas."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Cancelar"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Instalar"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configurações"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não foi possível fazer login na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Seu administrador exige que você defina uma senha neste dispositivo para acessar esta conta. Defina uma senha e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Conectar-se ao app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua organização, você precisa se conectar ao app Device Policy antes de fazer login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..91d7a258 --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Iniciar sessão"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Iniciar sessão com o Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Iniciar sessão com o Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Obtenha a aplicação Google gratuita e inicie sessão nas aplicações com a sua Conta Google. Não precisa de memorizar palavras-passe."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Cancelar"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Obter"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Definições"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não é possível iniciar sessão na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "O administrador requer a definição de um código secreto neste dispositivo para aceder a esta conta. Defina um código secreto e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo seu administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Pretende ligar-se à aplicação Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua entidade, tem de se ligar à aplicação Device Policy antes de iniciar sessão."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Ligar"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..34b4239e --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Conectați-vă"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Conectați-vă cu Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Conectați-vă cu Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Instalați aplicația Google gratuită și conectați-vă la aplicații folosind Contul Google. Nu mai trebuie să rețineți parolele."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Anulați"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Instalați"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Anulați"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Setări"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nu vă puteți conecta la cont"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratorul impune să setați o parolă pe acest dispozitiv ca să accesați contul. Setați o parolă și încercați din nou."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Dispozitivul nu respectă politica de securitate stabilită de administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vă conectați cu aplicația Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Pentru a vă proteja datele organizației, trebuie să vă conectați cu aplicația Device Policy înainte de a vă conecta."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectați"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..6d6c98ab --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Войти"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Войти в аккаунт Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Надоело вводить пароль?"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Установите бесплатное приложение Google и входите в другие мобильные программы, используя учетные данные своего аккаунта."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Отмена"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Установить"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ОК"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Отмена"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Настройки"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Не удалось войти в аккаунт"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "В соответствии с требованиями администратора для входа в аккаунт необходимо установить на устройстве код доступа. Сделайте это и повторите попытку."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Устройство не соответствует правилам безопасности, которые установлены администратором."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Подключить приложение Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "В целях защиты корпоративных данных перед входом в аккаунт необходимо подключить приложение Device Policy."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Подключить"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..eaf2f7f2 --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Prihlásiť sa"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Prihlásiť sa pomocou účtu Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Prihlásenie pomocou účtu Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Nainštalujte si zdarma aplikáciu Google a prihlasujte sa do aplikácií pomocou účtu Google. Nebudete si už musieť pamätať rôzne heslá."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Zrušiť"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Inštalovať"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Zrušiť"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Nastavenia"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nedá sa prihlásiť do účtu"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Správca vyžaduje, aby ste v tomto zariadení nastavili vstupný kód na prístup do príslušného účtu. Nastavte vstupný kód a skúste to znova."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Zariadenie nespĺňa pravidlá zabezpečenia nastavené vaším správcom."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Prepojiť s aplikáciou Pravidlá pre zariadenie?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Na to, aby bolo možné chrániť dáta vašej organizácie, je nutné pred prihlásením aktivovať prepojenie s aplikáciou Pravidlá pre zariadenie."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Prepojiť"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..3192e071 --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Logga in"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Logga in med Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Logga in med Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Hämta Google-appen utan kostnad och logga in i appar med ditt Google-konto. Du behöver inte komma ihåg en massa lösenord."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Avbryt"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Hämta"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Ok"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Avbryt"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Inställningar"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Det gick inte att logga in på kontot"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratören kräver att du anger ett lösenord på den här enheten för att få åtkomst till kontot. Ange ett lösenord och försök igen."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Säkerhetspolicyn som administratören har angett efterlevs inte på enheten."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vill du ansluta med appen Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Du måste ansluta med appen Device Policy innan du loggar in för att skydda organisationens data."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Anslut"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..353394ca --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "ลงชื่อเข้าใช้"; + +/* Long form sign-in button text */ +"Sign in with Google" = "ลงชื่อเข้าใช้ด้วย Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "ลงชื่อเข้าใช้ด้วย Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "ติดตั้งแอป Google ฟรีและลงชื่อเข้าใช้แอปต่างๆ ด้วยบัญชี Google คุณไม่ต้องจำรหัสผ่านอีกแล้ว"; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "ยกเลิก"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "ติดตั้ง"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ตกลง"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "ยกเลิก"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "การตั้งค่า"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "ลงชื่อเข้าใช้บัญชีไม่ได้"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "ผู้ดูแลระบบกำหนดให้คุณตั้งรหัสผ่านในอุปกรณ์นี้เพื่อเข้าถึงบัญชีนี้ โปรดตั้งรหัสผ่าน แล้วลองอีกครั้ง"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "อุปกรณ์ไม่ตรงตามนโยบายความปลอดภัยที่กำหนดโดยผู้ดูแลระบบของคุณ"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "เชื่อมต่อแอป Device Policy ไหม"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "เพื่อปกป้องข้อมูลขององค์กร คุณต้องเชื่อมต่อแอป Device Policy ก่อนลงชื่อเข้าสู่ระบบ"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "เชื่อมต่อ"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..414b7b9e --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Oturum aç"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google ile oturum aç"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Google ile oturum aç"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Ücretsiz Google uygulamasını edinin ve uygulamalarda Google Hesabınızla oturum açın. Şifrelerinizi hatırlamanız gerekmez."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "İptal"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Yükle"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Tamam"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "İptal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Ayarlar"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Hesapta oturum açılamıyor"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Yöneticiniz, bu hesaba erişmek için bu cihazda bir şifre kodu ayarlamanızı gerektiriyor. Lütfen şifre kodu ayarlayın ve tekrar deneyin."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Bu cihaz, yöneticinizin ayarladığı güvenlik politikasıyla uyumlu değil."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Cihaz Politika Uygulamasına bağlanılsın mı?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Kuruluşunuzun verilerini korumak için, giriş yapmadan önce Cihaz Politikası uygulamasına bağlanmalısınız."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Bağlan"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..faaa0bc6 --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Увійти"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Увійти в обліковий запис Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Входьте в обліковий запис Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Установіть безкоштовний додаток Google і входьте в обліковий запис Google у додатках. Не потрібно запам’ятовувати паролі."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Скасувати"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Установити"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Скасувати"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Налаштування"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Не вдається ввійти в обліковий запис"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Щоб увійти в обліковий запис, потрібно налаштувати код доступу на пристрої. Зробіть це й повторіть спробу."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Пристрій не відповідає правилу безпеки, яке налаштував адміністратор."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "З’єднатися з додатком Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Щоб захистити дані організації, потрібно з’єднатися з додатком Device Policy, перш ніж увійти."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "З’єднатися"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..94f858ce --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "Đăng nhập"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Đăng nhập bằng Google"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "Đăng nhập bằng Google"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "Tải ứng dụng Google miễn phí và đăng nhập vào các ứng dụng bằng Tài khoản Google của bạn. Không cần phải nhớ mật khẩu."; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "Hủy"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "Tải"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Hủy"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Cài đặt"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Không thể đăng nhập vào tài khoản"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Quản trị viên của bạn yêu cầu bạn phải đặt mật mã trên thiết bị này để truy cập vào tài khoản này. Hãy đặt mật mã và thử lại."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Thiết bị này không tuân thủ chính sách bảo mật do quản trị viên của bạn thiết lập."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Kết nối với ứng dụng Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Để bảo vệ dữ liệu của tổ chức của mình, bạn phải kết nối với ứng dụng Device Policy trước khi đăng nhập."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Kết nối"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..0c087f61 --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "登录"; + +/* Long form sign-in button text */ +"Sign in with Google" = "使用 Google 帐号登录"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "使用 Google 帐号登录"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "安装免费的“Google”应用后,您可以使用自己的 Google 帐号登录众多应用(无需记住众多密码)。"; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "取消"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "安装"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "确定"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "取消"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "设置"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "无法登录帐号"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "您的管理员要求您必须先在此设备上设置密码,然后才能访问此帐号。请设置密码并重试。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "该设备不符合管理员设置的安全政策。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "要关联 Device Policy 应用吗?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "要保护您组织的数据,您必须在登录前关联 Device Policy 应用。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "关联"; diff --git a/ios/JitsiMeet.framework/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings b/ios/JitsiMeet.framework/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings new file mode 100755 index 00000000..748468f1 --- /dev/null +++ b/ios/JitsiMeet.framework/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings @@ -0,0 +1,44 @@ +/* Sign-in button text */ +"Sign in" = "登入"; + +/* Long form sign-in button text */ +"Sign in with Google" = "登入 Google 帳戶"; + +/* The title of the promotional prompt to install the Google app. */ +"PromoTitle" = "登入 Google 帳戶"; + +/* The body message of the promotional prompt to install the Google app. */ +"PromoMessage" = "只要安裝免費的 Google app,即可使用 Google 帳戶登入應用程式,而不必費心記住密碼。"; + +/* The cancel button on the promotional prompt to install the Google app. */ +"PromoActionCancel" = "取消"; + +/* The install button on the promotional prompt to install the Google app. */ +"PromoActionInstall" = "安裝"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "確定"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "取消"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "設定"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "無法登入帳戶"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "管理員要求您必須為這個裝置設定通行碼,才能存取這個帳戶。請設定通行碼,然後再試一次。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "這部裝置不符合您的管理員所設定的安全性政策規定。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "要連結 Device Policy 應用程式嗎?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "為了保護貴機構的資料,您必須在登入前連結 Device Policy 應用程式。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "連結"; diff --git a/ios/JitsiMeet.framework/Modules/JitsiMeet.swiftmodule/i386.swiftdoc b/ios/JitsiMeet.framework/Modules/JitsiMeet.swiftmodule/i386.swiftdoc new file mode 100644 index 0000000000000000000000000000000000000000..be68a99adda979ae7eb6475eac97cf9a74107cf7 GIT binary patch literal 4284 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 literal 0 HcmV?d00001 diff --git a/ios/JitsiMeet.framework/Modules/JitsiMeet.swiftmodule/x86_64.swiftdoc b/ios/JitsiMeet.framework/Modules/JitsiMeet.swiftmodule/x86_64.swiftdoc new file mode 100644 index 0000000000000000000000000000000000000000..591b46e1f64bcaf7c8bcb43680155562065dea19 GIT binary patch literal 4288 zcmb_fU1%It6rN3OquW|)pA>w!4b*PBo6Ss`rm+T_?6yhMAG&n= zH#7I%bM86kJNG*$vol|G#-7x)ZcWoVV}q&TFK@@sFX-{BEPnoW{IiSk z&XKRKpK2yAcl2CqCNDO7Pj)1)G!y5W*|nE4-PbdT4>Ae-4(XZXm5%Nk9mzAz-piQ; z)`p&6)^p-`Y6iQSBWqT#{2_5Alf*nU-8-JR*i4>kZX6nnb)RYCqZdb9$|TPmPhM}P zhV*7P4!hBjx_3Nz0<+DO_Rdq9*71a{r5+SiyL zahwWg`MN0jY>K;{kT&a2_oWTSi$!kvVv6@{O84VC;nAjwX_tBoUDwlwk?!wf*4&BB zX`@@a3%y4N2POvkdrVT_Bcx~OX}!l2)mp{$rHc)C-hD>XeqN?&eJj?i+I401xtD`! zEv9vyp512P>m^ueZ5`e_yi53=*vq*;EGJ*H5|-D!Yj4)9RCWtL=gOmvgyl54xou8X zc;P(=?oh8D^UIt$w1EkmO>)1^xy?dBX4(a{!IHLDtHOCEi)tdjeRrB|=S8zt@u5Sq zP;-iT+^6rNS@Aflm!Yg7Ypfvc*<;f_tDCl3u3<4eB;5gPmSc=z^!E0$rCSy!b-O}! zi?edW!)=U1nR;TH^@_ZC81Dj+_qM*+in}qG6S+fz*RxW(1z{74***iID~eLh2lj2*Bf~`aBy77=1UX)=vk=GMsh0NQxKxCPI6{e>ShB#*!Xq` z4}ctj3{ zY@y48yQ7fteADL&3+6f85=DWqN0B*vgYIRiKCuWt=<8Uu3+#}FU?kz>XV)$o6MPU*@c$SI`x=Tdnn_qWt zBM6URw2e%^SC;jML&zYX$Lf3tiHGMSxE^~|&b8UE%nbPQZtd0ICB*6&ZOzn;O|3>@ z$5G*Dx8yQ4-ZmxBk#gN1CvnK1NysuG|D%?{>y1z1b>kU!dkBeSZI z5L!Wpr|M3KW|486!5rbRNp(t;sC}WEixO5o(@#vh{L#$K0lfWX1EELe7M6n~yLDNsn;nL^qu^A%q*<&9ESITs$RE5kD z1R>B7B%LDopoOIrRizACsKr%aK|dt|nY0XE5iM@V2$^On9xAYQhPqVS@Ce>^k*{6K zY^85ssPFN4tukW;)W)>?1J_QI!5)ov|8y9AxY>CGXg}R|qc1C6KIWQESy;8n7?v^6TZ3W}ihq5dZO literal 0 HcmV?d00001 diff --git a/ios/JitsiMeet.framework/Modules/JitsiMeet.swiftmodule/x86_64.swiftmodule b/ios/JitsiMeet.framework/Modules/JitsiMeet.swiftmodule/x86_64.swiftmodule new file mode 100644 index 0000000000000000000000000000000000000000..8e46d6509a7733c0fa668941f51bd0bf959fb9b3 GIT binary patch literal 58692 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 AO8@`> literal 0 HcmV?d00001 diff --git a/ios/JitsiMeet.framework/assets/images/btn_google_signin_dark_normal.png b/ios/JitsiMeet.framework/assets/images/btn_google_signin_dark_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..f27bb2433042aea5fc34e19fcf90944430ec331b GIT binary patch literal 8001 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 literal 0 HcmV?d00001 diff --git a/ios/Modules/module.modulemap b/ios/Modules/module.modulemap new file mode 100644 index 00000000..cd485a4e --- /dev/null +++ b/ios/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module WebRTC { + umbrella header "WebRTC.h" + + export * + module * { export * } +} diff --git a/package.json b/package.json index ef7e10fe..2d0826d7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "react-native-jitsi-meet", "description": "Jitsi Meet SDK wrapper for React Native.", - "version": "1.0.6", + "version": "1.0.7", "author": { "name": "Sébastien Krafft", "email": "skrafft@gmail.com"