From 06044e8fb526b37434e2dd97b4026db43cd5517c Mon Sep 17 00:00:00 2001 From: Sulabh Bista Date: Thu, 3 Nov 2022 13:17:47 -0600 Subject: [PATCH] Adds "use fmp4" experimental option (#623) --- .../BaseItemDto+VideoPlayerViewModel.swift | 3 ++- Shared/Objects/DeviceProfileBuilder.swift | 8 +++++--- Shared/SwiftfinStore/SwiftfinStoreDefaults.swift | 1 + .../Views/SettingsView/ExperimentalSettingsView.swift | 4 ++++ .../Views/SettingsView/ExperimentalSettingsView.swift | 5 +++++ 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift index e096c68f..53d35ebb 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift @@ -21,6 +21,7 @@ extension BaseItemDto { let tempOverkillBitrate = 360_000_000 builder.setMaxBitrate(bitrate: tempOverkillBitrate) let profile = builder.buildProfile() + let segmentContainer = Defaults[.Experimental.usefmp4Hls] ? "mp4" : "ts" let getPostedPlaybackInfoRequest = GetPostedPlaybackInfoRequest( userId: SessionManager.main.currentLogin.user.id, @@ -95,7 +96,7 @@ extension BaseItemDto { tag: currentMediaSource.eTag, deviceProfileId: nil, playSessionId: response.playSessionId, - segmentContainer: "ts", + segmentContainer: segmentContainer, segmentLength: nil, minSegments: 2, deviceId: UIDevice.vendorUUIDString, diff --git a/Shared/Objects/DeviceProfileBuilder.swift b/Shared/Objects/DeviceProfileBuilder.swift index 8946ea14..f8902c33 100644 --- a/Shared/Objects/DeviceProfileBuilder.swift +++ b/Shared/Objects/DeviceProfileBuilder.swift @@ -8,6 +8,7 @@ // lol can someone buy me a coffee this took forever :| +import Defaults import Foundation import JellyfinAPI @@ -43,6 +44,7 @@ class DeviceProfileBuilder { } public func buildProfile() -> ClientCapabilitiesDeviceProfile { + let segmentContainer = Defaults[.Experimental.usefmp4Hls] ? "mp4" : "ts" let maxStreamingBitrate = bitrate let maxStaticBitrate = bitrate let musicStreamingTranscodingBitrate = bitrate @@ -99,7 +101,7 @@ class DeviceProfileBuilder { if supportsFeature(minimumSupported: .A8X) { if supportsFeature(minimumSupported: .A9) { transcodingProfiles = [TranscodingProfile( - container: "ts", + container: segmentContainer, type: .video, videoCodec: "h264,hevc,mpeg4", audioCodec: "aac,mp3,wav,eac3,ac3,flac,opus", @@ -111,7 +113,7 @@ class DeviceProfileBuilder { )] } else { transcodingProfiles = [TranscodingProfile( - container: "ts", + container: segmentContainer, type: .video, videoCodec: "h264,mpeg4", audioCodec: "aac,mp3,wav,eac3,ac3,opus", @@ -127,7 +129,7 @@ class DeviceProfileBuilder { // Device supports FLAC? if supportsFeature(minimumSupported: .A10X) { transcodingProfiles = [TranscodingProfile( - container: "ts", + container: segmentContainer, type: .video, videoCodec: "hevc,h264,mpeg4", audioCodec: "aac,mp3,wav,ac3,eac3,flac,opus", diff --git a/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift b/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift index 7f188742..92343474 100644 --- a/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift +++ b/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift @@ -116,6 +116,7 @@ extension Defaults.Keys { ) static let forceDirectPlay = Key("forceDirectPlay", default: false, suite: .generalSuite) static let nativePlayer = Key("nativePlayer", default: false, suite: .generalSuite) + static let usefmp4Hls = Key("usefmp4Hls", default: false, suite: .generalSuite) static let liveTVAlphaEnabled = Key("liveTVAlphaEnabled", default: false, suite: .generalSuite) static let liveTVForceDirectPlay = Key("liveTVForceDirectPlay", default: false, suite: .generalSuite) static let liveTVNativePlayer = Key("liveTVNativePlayer", default: false, suite: .generalSuite) diff --git a/Swiftfin tvOS/Views/SettingsView/ExperimentalSettingsView.swift b/Swiftfin tvOS/Views/SettingsView/ExperimentalSettingsView.swift index f50c9ac5..f0bf2e5b 100644 --- a/Swiftfin tvOS/Views/SettingsView/ExperimentalSettingsView.swift +++ b/Swiftfin tvOS/Views/SettingsView/ExperimentalSettingsView.swift @@ -17,6 +17,8 @@ struct ExperimentalSettingsView: View { var syncSubtitleStateWithAdjacent @Default(.Experimental.nativePlayer) var nativePlayer + @Default(.Experimental.usefmp4Hls) + var usefmp4Hls @Default(.Experimental.liveTVAlphaEnabled) var liveTVAlphaEnabled @@ -35,6 +37,8 @@ struct ExperimentalSettingsView: View { Toggle("Native Player", isOn: $nativePlayer) + Toggle("Use fmp4 with HLS", isOn: $usefmp4Hls) + } header: { L10n.experimental.text } diff --git a/Swiftfin/Views/SettingsView/ExperimentalSettingsView.swift b/Swiftfin/Views/SettingsView/ExperimentalSettingsView.swift index c22fa51e..f0bf2e5b 100644 --- a/Swiftfin/Views/SettingsView/ExperimentalSettingsView.swift +++ b/Swiftfin/Views/SettingsView/ExperimentalSettingsView.swift @@ -17,6 +17,9 @@ struct ExperimentalSettingsView: View { var syncSubtitleStateWithAdjacent @Default(.Experimental.nativePlayer) var nativePlayer + @Default(.Experimental.usefmp4Hls) + var usefmp4Hls + @Default(.Experimental.liveTVAlphaEnabled) var liveTVAlphaEnabled @Default(.Experimental.liveTVForceDirectPlay) @@ -34,6 +37,8 @@ struct ExperimentalSettingsView: View { Toggle("Native Player", isOn: $nativePlayer) + Toggle("Use fmp4 with HLS", isOn: $usefmp4Hls) + } header: { L10n.experimental.text }