diff --git a/.gitignore b/.gitignore index ddbd649..7a03e10 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ Podfile.lock Release-iphoneos.xcarchive Release-iphonesimulator.xcarchive Release* +Package.resolved diff --git a/WebRTCiOSSDK/api/AntMediaClient.swift b/WebRTCiOSSDK/api/AntMediaClient.swift index d477544..6754a58 100644 --- a/WebRTCiOSSDK/api/AntMediaClient.swift +++ b/WebRTCiOSSDK/api/AntMediaClient.swift @@ -116,11 +116,15 @@ open class AntMediaClient: NSObject, AntMediaClientProtocol { private var cameraSourceFPS: Int = 30; + /** + Degradation preference when publishing streams. By default its values is maintainResolution because when resolution changes HLS playback does not play in safari + */ + private var degradationPreference: RTCDegradationPreference = RTCDegradationPreference.maintainResolution; + var pingTimer: Timer? var disableTrackId:String? - var reconnectIfRequiresScheduled: Bool = false; struct HandshakeMessage:Codable { @@ -533,6 +537,7 @@ open class AntMediaClient: NSObject, AntMediaClientProtocol { self.webRTCClientMap[id] = WebRTCClient.init(remoteVideoView: remoteView, localVideoView: localView, delegate: self, mode: mode != .unspecified ? mode : self.mode , cameraPosition: self.cameraPosition, targetWidth: self.targetWidth, targetHeight: self.targetHeight, videoEnabled: self.videoEnable, enableDataChannel: self.enableDataChannel, useExternalCameraSource: self.useExternalCameraSource, externalAudio: self.externalAudioEnabled, externalVideoCapture: self.externalVideoCapture, cameraSourceFPS: self.cameraSourceFPS, streamId:id); self.webRTCClientMap[id]?.setToken(token) + self.webRTCClientMap[id]?.setDegradationPreference(degradationPreference: self.degradationPreference); AntMediaClient.rtcAudioSession.add(self); } @@ -1180,6 +1185,19 @@ open class AntMediaClient: NSObject, AntMediaClientProtocol { } } + public func setDegradationPreference(_ degradationPreference: RTCDegradationPreference) + { + self.degradationPreference = degradationPreference; + let rtc = self.webRTCClientMap[self.getPublisherStreamId()] + + guard let params = rtc?.videoSender?.parameters else { + return + } + + params.degradationPreference = (degradationPreference.rawValue) as NSNumber + rtc?.videoSender?.parameters = params + } + public func disconnect() { for (streamId, webrtcClient) in self.webRTCClientMap { webrtcClient.disconnect() diff --git a/WebRTCiOSSDK/api/AntMediaClientProtocol.swift b/WebRTCiOSSDK/api/AntMediaClientProtocol.swift index 0617909..1b3e6c7 100644 --- a/WebRTCiOSSDK/api/AntMediaClientProtocol.swift +++ b/WebRTCiOSSDK/api/AntMediaClientProtocol.swift @@ -345,6 +345,11 @@ public protocol AntMediaClientProtocol { */ func join(streamId:String) + /** + Set the degradation prefernece in publishing streams. It can be called before the stream starts or while it's streaming. + */ + func setDegradationPreference(_ degradationPreference: RTCDegradationPreference); + /** Disconnects websocket connection */ diff --git a/WebRTCiOSSDK/api/webrtc/WebRTCClient.swift b/WebRTCiOSSDK/api/webrtc/WebRTCClient.swift index a7abe3b..689783a 100644 --- a/WebRTCiOSSDK/api/webrtc/WebRTCClient.swift +++ b/WebRTCiOSSDK/api/webrtc/WebRTCClient.swift @@ -60,6 +60,8 @@ class WebRTCClient: NSObject { State of the connection */ var iceConnectionState:RTCIceConnectionState = .new; + + private var degradationPreference:RTCDegradationPreference = .maintainResolution; public init(remoteVideoView: RTCVideoRenderer?, localVideoView: RTCVideoRenderer?, delegate: WebRTCClientDelegate, externalAudio:Bool) { super.init() @@ -405,10 +407,9 @@ class WebRTCClient: NSObject { let videoTrack = WebRTCClient.factory.videoTrack(with: videoSource, trackId: "video0") return videoTrack } - - } + private func addLocalMediaStream() -> Bool { @@ -418,6 +419,15 @@ class WebRTCClient: NSObject { self.localVideoTrack = createVideoTrack(); self.videoSender = self.peerConnection?.add(self.localVideoTrack, streamIds: [LOCAL_MEDIA_STREAM_ID]) + + if let params = videoSender?.parameters + { + params.degradationPreference = (self.degradationPreference.rawValue) as NSNumber + videoSender?.parameters = params + } + else { + AntMediaClient.printf("DegradationPreference cannot be set"); + } } let audioSource = WebRTCClient.factory.audioSource(with: Config.createTestConstraints()) @@ -432,6 +442,10 @@ class WebRTCClient: NSObject { return true } + public func setDegradationPreference(degradationPreference:RTCDegradationPreference) { + self.degradationPreference = degradationPreference + } + public func switchCamera() { let cameraVideoCapturer = self.videoCapturer as? RTCCameraVideoCapturer;