Skip to content

Commit

Permalink
Refactor profile helper in Kotlin
Browse files Browse the repository at this point in the history
  • Loading branch information
thornbill committed May 21, 2021
1 parent afdd322 commit 2b79c32
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 140 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -158,7 +158,7 @@ class ExoPlayerProfile(
)
},
// HEVC profile
getHevcProfile(),
deviceHevcCodecProfile,
// Audio channel profile
CodecProfile().apply {
type = CodecType.VideoAudio
Expand All @@ -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)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -92,7 +92,7 @@ class LibVlcProfile(

codecProfiles = arrayOf(
// HEVC profile
getHevcProfile(),
deviceHevcCodecProfile,
// H264 profile
CodecProfile().apply {
type = CodecType.Video
Expand Down Expand Up @@ -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)
)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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
}
)
}

0 comments on commit 2b79c32

Please sign in to comment.