Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WebRTCConfiguration に degradationPreference を追加する #189

Merged
merged 6 commits into from
Feb 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .swiftformat
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
--wrapparameters after-first
--header strip

--disable redundantInit,sortedSwitchCases,strongOutlets,unusedArguments,wrapSwitchCases
--disable redundantInit,sortedSwitchCases,strongOutlets,unusedArguments,wrapSwitchCases,preferForLoop
2 changes: 2 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
- @miosakuma
- [ADD] VideoCodec に H265 を追加する
- @enm10k
- [ADD] WebRTCConfiguration に degradationPreference を追加する
- @enm10k
- [UPDATE] 解像度に qHD (960x540) を追加する
- @enm10k
- [UPDATE] CocoaPods を v1.14.2 に更新する
Expand Down
2 changes: 1 addition & 1 deletion Podfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ target 'Sora' do
use_frameworks!
pod 'WebRTC', '121.6167.4.0'
pod 'SwiftLint', '0.51.0'
pod 'SwiftFormat/CLI', '0.51.6'
pod 'SwiftFormat/CLI', '0.53.2'
end
36 changes: 36 additions & 0 deletions Sora/PeerChannel.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,34 @@
import Foundation
import WebRTC

/// :nodoc:
extension RTCDegradationPreference: CustomStringConvertible {
public var description: String {
switch self {
case .balanced: "balanced"
case .disabled: "disabled"
case .maintainFramerate: "maintain-framerate"
case .maintainResolution: "maintain-resolution"
default: "-"
}
}
}

/// :nodoc:
extension RTCRtpParameters {
override open var description: String {
let degradationPreference = if let unwrapped = self.degradationPreference {
String(describing: RTCDegradationPreference(rawValue: unwrapped.intValue))
} else {
"-"
}

// RTCRtpParameters は他にもプロパティーを持つが、ここでは SDK で利用している値のみ出力する
// encodings もここに追加したい
return "\(transactionId) \(String(describing: degradationPreference))"
}
}

final class PeerChannelInternalHandlers {
/// 接続解除時に呼ばれるクロージャー
var onDisconnect: ((Error?, DisconnectReason) -> Void)?
Expand Down Expand Up @@ -382,6 +410,14 @@ class PeerChannel: NSObject, RTCPeerConnectionDelegate {
if let videoTrack = nativeStream.videoTracks.first {
videoTransceiver.sender.track = videoTrack
}

if let degradationPreference = configuration.webRTCConfiguration.degradationPreference {
let parameters = videoTransceiver.sender.parameters
parameters.degradationPreference = NSNumber(value: degradationPreference.nativeValue.rawValue)
videoTransceiver.sender.parameters = parameters
}

Logger.debug(type: .peerChannel, message: "sender.parameters => \(String(describing: videoTransceiver.sender.parameters))")
}
} else {
// mid なしの場合はエラーにする
Expand Down
35 changes: 35 additions & 0 deletions Sora/WebRTCConfigration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,38 @@ public enum SDPSemantics {
}
}

/**
(リソースの逼迫により) 送信する映像の品質が維持できない場合の挙動です。
*/
public enum DegradationPreference {
/// 何もしない
case disabled

/// バランスを取る
case balanced

/// フレームレートの維持を優先する
case maintainFramerate

/// 解像度の維持を優先する
case maintainResolution

// MARK: - ネイティブ

var nativeValue: RTCDegradationPreference {
switch self {
case .balanced:
return RTCDegradationPreference.balanced
case .disabled:
return RTCDegradationPreference.disabled
case .maintainFramerate:
return RTCDegradationPreference.maintainFramerate
case .maintainResolution:
return RTCDegradationPreference.maintainResolution
}
}
}

/**
WebRTC に関する設定です。
*/
Expand All @@ -58,6 +90,9 @@ public struct WebRTCConfiguration {
/// SDP でのマルチストリームの記述方式
public var sdpSemantics: SDPSemantics = .unifiedPlan

/// (リソースの逼迫により) 送信する映像の品質が維持できない場合の挙動
public var degradationPreference: DegradationPreference?

// MARK: - インスタンスの生成

/**
Expand Down