From 2b79c32eab90d81a1b2f8a5f94c0ad352856d27d Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 18 May 2021 11:22:11 -0400 Subject: [PATCH] Refactor profile helper in Kotlin --- .../androidtv/util/profile/BaseProfile.kt | 22 ++--- .../util/profile/ExoPlayerProfile.kt | 28 +++--- .../util/profile/ExternalPlayerProfile.kt | 24 ++--- .../androidtv/util/profile/LibVlcProfile.kt | 30 +++---- .../androidtv/util/profile/ProfileHelper.java | 88 ------------------- .../androidtv/util/profile/ProfileHelper.kt | 81 +++++++++++++++++ 6 files changed, 133 insertions(+), 140 deletions(-) delete mode 100644 app/src/main/java/org/jellyfin/androidtv/util/profile/ProfileHelper.java create mode 100644 app/src/main/java/org/jellyfin/androidtv/util/profile/ProfileHelper.kt diff --git a/app/src/main/java/org/jellyfin/androidtv/util/profile/BaseProfile.kt b/app/src/main/java/org/jellyfin/androidtv/util/profile/BaseProfile.kt index 212f749d4d..7c9ad83e34 100644 --- a/app/src/main/java/org/jellyfin/androidtv/util/profile/BaseProfile.kt +++ b/app/src/main/java/org/jellyfin/androidtv/util/profile/BaseProfile.kt @@ -2,7 +2,7 @@ package org.jellyfin.androidtv.util.profile import org.jellyfin.androidtv.constant.CodecTypes import org.jellyfin.androidtv.constant.ContainerTypes -import org.jellyfin.androidtv.util.profile.ProfileHelper.getSubtitleProfile +import org.jellyfin.androidtv.util.profile.ProfileHelper.subtitleProfile import org.jellyfin.apiclient.model.dlna.DeviceProfile import org.jellyfin.apiclient.model.dlna.DlnaProfileType import org.jellyfin.apiclient.model.dlna.EncodingContext @@ -35,16 +35,16 @@ open class BaseProfile : DeviceProfile() { ) subtitleProfiles = arrayOf( - getSubtitleProfile("srt", SubtitleDeliveryMethod.External), - getSubtitleProfile("subrip", SubtitleDeliveryMethod.External), - getSubtitleProfile("ass", SubtitleDeliveryMethod.Encode), - getSubtitleProfile("ssa", SubtitleDeliveryMethod.Encode), - getSubtitleProfile("pgs", SubtitleDeliveryMethod.Encode), - getSubtitleProfile("pbssub", SubtitleDeliveryMethod.Encode), - getSubtitleProfile("dvdsub", SubtitleDeliveryMethod.External), - getSubtitleProfile("vtt", SubtitleDeliveryMethod.External), - getSubtitleProfile("sub", SubtitleDeliveryMethod.External), - getSubtitleProfile("idx", SubtitleDeliveryMethod.External) + subtitleProfile("srt", SubtitleDeliveryMethod.External), + subtitleProfile("subrip", SubtitleDeliveryMethod.External), + subtitleProfile("ass", SubtitleDeliveryMethod.Encode), + subtitleProfile("ssa", SubtitleDeliveryMethod.Encode), + subtitleProfile("pgs", SubtitleDeliveryMethod.Encode), + subtitleProfile("pbssub", SubtitleDeliveryMethod.Encode), + subtitleProfile("dvdsub", SubtitleDeliveryMethod.External), + subtitleProfile("vtt", SubtitleDeliveryMethod.External), + subtitleProfile("sub", SubtitleDeliveryMethod.External), + subtitleProfile("idx", SubtitleDeliveryMethod.External) ) } } diff --git a/app/src/main/java/org/jellyfin/androidtv/util/profile/ExoPlayerProfile.kt b/app/src/main/java/org/jellyfin/androidtv/util/profile/ExoPlayerProfile.kt index 6b0c0f03dd..44fb0a0970 100644 --- a/app/src/main/java/org/jellyfin/androidtv/util/profile/ExoPlayerProfile.kt +++ b/app/src/main/java/org/jellyfin/androidtv/util/profile/ExoPlayerProfile.kt @@ -4,8 +4,8 @@ import org.jellyfin.androidtv.constant.CodecTypes import org.jellyfin.androidtv.constant.ContainerTypes import org.jellyfin.androidtv.util.DeviceUtils import org.jellyfin.androidtv.util.Utils -import org.jellyfin.androidtv.util.profile.ProfileHelper.getHevcProfile -import org.jellyfin.androidtv.util.profile.ProfileHelper.getSubtitleProfile +import org.jellyfin.androidtv.util.profile.ProfileHelper.deviceHevcCodecProfile +import org.jellyfin.androidtv.util.profile.ProfileHelper.subtitleProfile import org.jellyfin.apiclient.model.dlna.CodecProfile import org.jellyfin.apiclient.model.dlna.CodecType import org.jellyfin.apiclient.model.dlna.DirectPlayProfile @@ -158,7 +158,7 @@ class ExoPlayerProfile( ) }, // HEVC profile - getHevcProfile(), + deviceHevcCodecProfile, // Audio channel profile CodecProfile().apply { type = CodecType.VideoAudio @@ -173,17 +173,17 @@ class ExoPlayerProfile( ) subtitleProfiles = arrayOf( - getSubtitleProfile("srt", SubtitleDeliveryMethod.External), - getSubtitleProfile("srt", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("subrip", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("ass", SubtitleDeliveryMethod.Encode), - getSubtitleProfile("ssa", SubtitleDeliveryMethod.Encode), - getSubtitleProfile("pgs", SubtitleDeliveryMethod.Encode), - getSubtitleProfile("pbssub", SubtitleDeliveryMethod.Encode), - getSubtitleProfile("dvdsub", SubtitleDeliveryMethod.Encode), - getSubtitleProfile("vtt", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("sub", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("idx", SubtitleDeliveryMethod.Embed) + subtitleProfile("srt", SubtitleDeliveryMethod.External), + subtitleProfile("srt", SubtitleDeliveryMethod.Embed), + subtitleProfile("subrip", SubtitleDeliveryMethod.Embed), + subtitleProfile("ass", SubtitleDeliveryMethod.Encode), + subtitleProfile("ssa", SubtitleDeliveryMethod.Encode), + subtitleProfile("pgs", SubtitleDeliveryMethod.Encode), + subtitleProfile("pbssub", SubtitleDeliveryMethod.Encode), + subtitleProfile("dvdsub", SubtitleDeliveryMethod.Encode), + subtitleProfile("vtt", SubtitleDeliveryMethod.Embed), + subtitleProfile("sub", SubtitleDeliveryMethod.Embed), + subtitleProfile("idx", SubtitleDeliveryMethod.Embed) ) } } diff --git a/app/src/main/java/org/jellyfin/androidtv/util/profile/ExternalPlayerProfile.kt b/app/src/main/java/org/jellyfin/androidtv/util/profile/ExternalPlayerProfile.kt index 273a90e2d4..22b69716eb 100644 --- a/app/src/main/java/org/jellyfin/androidtv/util/profile/ExternalPlayerProfile.kt +++ b/app/src/main/java/org/jellyfin/androidtv/util/profile/ExternalPlayerProfile.kt @@ -2,7 +2,7 @@ package org.jellyfin.androidtv.util.profile import org.jellyfin.androidtv.constant.CodecTypes import org.jellyfin.androidtv.constant.ContainerTypes -import org.jellyfin.androidtv.util.profile.ProfileHelper.getSubtitleProfile +import org.jellyfin.androidtv.util.profile.ProfileHelper.subtitleProfile import org.jellyfin.apiclient.model.dlna.DeviceProfile import org.jellyfin.apiclient.model.dlna.DirectPlayProfile import org.jellyfin.apiclient.model.dlna.DlnaProfileType @@ -67,17 +67,17 @@ class ExternalPlayerProfile : DeviceProfile() { ) subtitleProfiles = arrayOf( - getSubtitleProfile("srt", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("subrip", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("ass", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("ssa", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("pgs", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("pbssub", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("dvdsub", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("vtt", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("sub", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("idx", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("smi", SubtitleDeliveryMethod.Embed) + subtitleProfile("srt", SubtitleDeliveryMethod.Embed), + subtitleProfile("subrip", SubtitleDeliveryMethod.Embed), + subtitleProfile("ass", SubtitleDeliveryMethod.Embed), + subtitleProfile("ssa", SubtitleDeliveryMethod.Embed), + subtitleProfile("pgs", SubtitleDeliveryMethod.Embed), + subtitleProfile("pbssub", SubtitleDeliveryMethod.Embed), + subtitleProfile("dvdsub", SubtitleDeliveryMethod.Embed), + subtitleProfile("vtt", SubtitleDeliveryMethod.Embed), + subtitleProfile("sub", SubtitleDeliveryMethod.Embed), + subtitleProfile("idx", SubtitleDeliveryMethod.Embed), + subtitleProfile("smi", SubtitleDeliveryMethod.Embed) ) } } diff --git a/app/src/main/java/org/jellyfin/androidtv/util/profile/LibVlcProfile.kt b/app/src/main/java/org/jellyfin/androidtv/util/profile/LibVlcProfile.kt index 4d1e46075e..a4053d0d90 100644 --- a/app/src/main/java/org/jellyfin/androidtv/util/profile/LibVlcProfile.kt +++ b/app/src/main/java/org/jellyfin/androidtv/util/profile/LibVlcProfile.kt @@ -4,8 +4,8 @@ import org.jellyfin.androidtv.constant.CodecTypes import org.jellyfin.androidtv.constant.ContainerTypes import org.jellyfin.androidtv.util.DeviceUtils import org.jellyfin.androidtv.util.Utils -import org.jellyfin.androidtv.util.profile.ProfileHelper.getHevcProfile -import org.jellyfin.androidtv.util.profile.ProfileHelper.getSubtitleProfile +import org.jellyfin.androidtv.util.profile.ProfileHelper.deviceHevcCodecProfile +import org.jellyfin.androidtv.util.profile.ProfileHelper.subtitleProfile import org.jellyfin.apiclient.model.dlna.CodecProfile import org.jellyfin.apiclient.model.dlna.CodecType import org.jellyfin.apiclient.model.dlna.DirectPlayProfile @@ -92,7 +92,7 @@ class LibVlcProfile( codecProfiles = arrayOf( // HEVC profile - getHevcProfile(), + deviceHevcCodecProfile, // H264 profile CodecProfile().apply { type = CodecType.Video @@ -129,18 +129,18 @@ class LibVlcProfile( ) subtitleProfiles = arrayOf( - getSubtitleProfile("srt", SubtitleDeliveryMethod.External), - getSubtitleProfile("srt", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("subrip", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("ass", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("ssa", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("pgs", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("pbssub", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("dvdsub", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("vtt", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("sub", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("smi", SubtitleDeliveryMethod.Embed), - getSubtitleProfile("idx", SubtitleDeliveryMethod.Embed) + subtitleProfile("srt", SubtitleDeliveryMethod.External), + subtitleProfile("srt", SubtitleDeliveryMethod.Embed), + subtitleProfile("subrip", SubtitleDeliveryMethod.Embed), + subtitleProfile("ass", SubtitleDeliveryMethod.Embed), + subtitleProfile("ssa", SubtitleDeliveryMethod.Embed), + subtitleProfile("pgs", SubtitleDeliveryMethod.Embed), + subtitleProfile("pbssub", SubtitleDeliveryMethod.Embed), + subtitleProfile("dvdsub", SubtitleDeliveryMethod.Embed), + subtitleProfile("vtt", SubtitleDeliveryMethod.Embed), + subtitleProfile("sub", SubtitleDeliveryMethod.Embed), + subtitleProfile("smi", SubtitleDeliveryMethod.Embed), + subtitleProfile("idx", SubtitleDeliveryMethod.Embed) ) } } diff --git a/app/src/main/java/org/jellyfin/androidtv/util/profile/ProfileHelper.java b/app/src/main/java/org/jellyfin/androidtv/util/profile/ProfileHelper.java deleted file mode 100644 index ce9897b3e3..0000000000 --- a/app/src/main/java/org/jellyfin/androidtv/util/profile/ProfileHelper.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.jellyfin.androidtv.util.profile; - -import androidx.annotation.NonNull; - -import org.jellyfin.androidtv.constant.CodecTypes; -import org.jellyfin.androidtv.constant.ContainerTypes; -import org.jellyfin.androidtv.preference.UserPreferences; -import org.jellyfin.androidtv.util.DeviceUtils; -import org.jellyfin.androidtv.util.Utils; -import org.jellyfin.apiclient.model.dlna.CodecProfile; -import org.jellyfin.apiclient.model.dlna.CodecType; -import org.jellyfin.apiclient.model.dlna.DeviceProfile; -import org.jellyfin.apiclient.model.dlna.DirectPlayProfile; -import org.jellyfin.apiclient.model.dlna.DlnaProfileType; -import org.jellyfin.apiclient.model.dlna.ProfileCondition; -import org.jellyfin.apiclient.model.dlna.ProfileConditionType; -import org.jellyfin.apiclient.model.dlna.ProfileConditionValue; -import org.jellyfin.apiclient.model.dlna.SubtitleDeliveryMethod; -import org.jellyfin.apiclient.model.dlna.SubtitleProfile; -import org.jellyfin.apiclient.model.dlna.TranscodingProfile; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import timber.log.Timber; - -import static org.koin.java.KoinJavaComponent.get; - -public class ProfileHelper { - private static MediaCodecCapabilitiesTest MediaTest = new MediaCodecCapabilitiesTest(); - - protected static @NonNull CodecProfile getHevcProfile() { - CodecProfile hevcProfile = new CodecProfile(); - hevcProfile.setType(CodecType.Video); - hevcProfile.setCodec(CodecTypes.HEVC); - if (!MediaTest.supportsHevc()) { - //The following condition is a method to exclude all HEVC - Timber.i("*** Does NOT support HEVC"); - hevcProfile.setConditions(new ProfileCondition[] - { - new ProfileCondition(ProfileConditionType.Equals, ProfileConditionValue.VideoProfile, "none"), - }); - - } else if (!MediaTest.supportsHevcMain10()) { - Timber.i("*** Does NOT support HEVC 10 bit"); - hevcProfile.setConditions(new ProfileCondition[] - { - new ProfileCondition(ProfileConditionType.NotEquals, ProfileConditionValue.VideoProfile, "Main 10"), - }); - - } else { - // supports all HEVC - Timber.i("*** Supports HEVC 10 bit"); - hevcProfile.setConditions(new ProfileCondition[] - { - new ProfileCondition(ProfileConditionType.NotEquals, ProfileConditionValue.VideoProfile, "none"), - }); - - } - - return hevcProfile; - } - - public static void addAc3Streaming(@NonNull DeviceProfile profile, boolean primary) { - TranscodingProfile mkvProfile = getTranscodingProfile(profile, ContainerTypes.MKV); - if (mkvProfile != null && !Utils.downMixAudio()) - { - Timber.i("*** Adding AC3 as supported transcoded audio"); - mkvProfile.setAudioCodec(primary ? CodecTypes.AC3 + ",".concat(mkvProfile.getAudioCodec()) : mkvProfile.getAudioCodec().concat("," + CodecTypes.AC3)); - } - } - - private static TranscodingProfile getTranscodingProfile(DeviceProfile deviceProfile, String container) { - for (TranscodingProfile profile : deviceProfile.getTranscodingProfiles()) { - if (container.equals(profile.getContainer())) return profile; - } - - return null; - } - - protected static @NonNull SubtitleProfile getSubtitleProfile(@NonNull String format, @NonNull SubtitleDeliveryMethod method) { - SubtitleProfile subs = new SubtitleProfile(); - subs.setFormat(format); - subs.setMethod(method); - return subs; - } -} diff --git a/app/src/main/java/org/jellyfin/androidtv/util/profile/ProfileHelper.kt b/app/src/main/java/org/jellyfin/androidtv/util/profile/ProfileHelper.kt new file mode 100644 index 0000000000..012d9779e6 --- /dev/null +++ b/app/src/main/java/org/jellyfin/androidtv/util/profile/ProfileHelper.kt @@ -0,0 +1,81 @@ +package org.jellyfin.androidtv.util.profile + +import org.jellyfin.androidtv.constant.CodecTypes +import org.jellyfin.androidtv.constant.ContainerTypes +import org.jellyfin.androidtv.util.Utils +import org.jellyfin.apiclient.model.dlna.CodecProfile +import org.jellyfin.apiclient.model.dlna.CodecType +import org.jellyfin.apiclient.model.dlna.DeviceProfile +import org.jellyfin.apiclient.model.dlna.ProfileCondition +import org.jellyfin.apiclient.model.dlna.ProfileConditionType +import org.jellyfin.apiclient.model.dlna.ProfileConditionValue +import org.jellyfin.apiclient.model.dlna.SubtitleDeliveryMethod +import org.jellyfin.apiclient.model.dlna.SubtitleProfile +import org.jellyfin.apiclient.model.dlna.TranscodingProfile +import timber.log.Timber + +object ProfileHelper { + private val MediaTest = MediaCodecCapabilitiesTest() + + val deviceHevcCodecProfile = CodecProfile().apply { + type = CodecType.Video + codec = CodecTypes.HEVC + + conditions = if (!MediaTest.supportsHevc()) { + // The following condition is a method to exclude all HEVC + Timber.i("*** Does NOT support HEVC") + arrayOf( + ProfileCondition( + ProfileConditionType.Equals, + ProfileConditionValue.VideoProfile, + "none" + ) + ) + } else if (!MediaTest.supportsHevcMain10()) { + Timber.i("*** Does NOT support HEVC 10 bit") + arrayOf( + ProfileCondition( + ProfileConditionType.NotEquals, + ProfileConditionValue.VideoProfile, + "Main 10" + ) + ) + } else { + // supports all HEVC + Timber.i("*** Supports HEVC 10 bit") + arrayOf( + ProfileCondition( + ProfileConditionType.NotEquals, + ProfileConditionValue.VideoProfile, + "none" + ) + ) + } + } + + @JvmStatic + fun addAc3Streaming(profile: DeviceProfile, primary: Boolean) { + if (Utils.downMixAudio()) return + + val mkvProfile = findTranscodingProfile(profile, ContainerTypes.MKV) + if (mkvProfile != null) { + Timber.i("*** Adding AC3 as supported transcoded audio") + mkvProfile.audioCodec = if (primary) { + "${CodecTypes.AC3},${mkvProfile.audioCodec}" + } else { + "${mkvProfile.audioCodec},${CodecTypes.AC3}" + } + } + } + + private fun findTranscodingProfile(deviceProfile: DeviceProfile, container: String) = ( + deviceProfile.transcodingProfiles.find { it.container == container } + ) + + internal fun subtitleProfile(format: String, method: SubtitleDeliveryMethod) = ( + SubtitleProfile().apply { + this.format = format + this.method = method + } + ) +}