diff --git a/app/src/main/java/org/jellyfin/mobile/player/deviceprofile/DeviceProfileBuilder.kt b/app/src/main/java/org/jellyfin/mobile/player/deviceprofile/DeviceProfileBuilder.kt index 48a008c8..6ba6ddd2 100644 --- a/app/src/main/java/org/jellyfin/mobile/player/deviceprofile/DeviceProfileBuilder.kt +++ b/app/src/main/java/org/jellyfin/mobile/player/deviceprofile/DeviceProfileBuilder.kt @@ -4,11 +4,15 @@ import android.media.MediaCodecList import org.jellyfin.mobile.app.AppPreferences import org.jellyfin.mobile.utils.Constants import org.jellyfin.sdk.model.api.CodecProfile +import org.jellyfin.sdk.model.api.CodecType import org.jellyfin.sdk.model.api.ContainerProfile import org.jellyfin.sdk.model.api.DeviceProfile import org.jellyfin.sdk.model.api.DirectPlayProfile import org.jellyfin.sdk.model.api.DlnaProfileType import org.jellyfin.sdk.model.api.MediaStreamProtocol +import org.jellyfin.sdk.model.api.ProfileCondition +import org.jellyfin.sdk.model.api.ProfileConditionType +import org.jellyfin.sdk.model.api.ProfileConditionValue import org.jellyfin.sdk.model.api.SubtitleDeliveryMethod import org.jellyfin.sdk.model.api.SubtitleProfile import org.jellyfin.sdk.model.api.TranscodingProfile @@ -18,6 +22,7 @@ class DeviceProfileBuilder( ) { private val supportedVideoCodecs: Array> private val supportedAudioCodecs: Array> + private val videoCodecsProfiles: Map> private val transcodingProfiles: List @@ -66,6 +71,7 @@ class DeviceProfileBuilder( audioCodecs.containsKey(codec) || codec in FORCED_AUDIO_CODECS }.toTypedArray() } + videoCodecsProfiles = videoCodecs.entries.associate { (k, v) -> k to v.profiles } transcodingProfiles = listOf( TranscodingProfile( @@ -109,11 +115,14 @@ class DeviceProfileBuilder( directPlayProfiles.add( DirectPlayProfile( type = DlnaProfileType.VIDEO, - container = SUPPORTED_CONTAINER_FORMATS[i], + container = container, videoCodec = supportedVideoCodecs[i].joinToString(","), audioCodec = supportedAudioCodecs[i].joinToString(","), ), ) + for (videoCodec in supportedVideoCodecs[i]) { + generateCodecProfile(container, videoCodec)?.let(codecProfiles::add) + } } if (supportedAudioCodecs[i].isNotEmpty()) { containerProfiles.add( @@ -149,6 +158,31 @@ class DeviceProfileBuilder( ) } + private fun generateCodecProfile( + container: String, + videoCodec: String, + ): CodecProfile? { + val profilesSet = videoCodecsProfiles[videoCodec] + if (profilesSet?.isNotEmpty() != true) { + return null + } + + return CodecProfile( + type = CodecType.VIDEO, + container = container, + codec = videoCodec, + applyConditions = listOf(), + conditions = listOf( + ProfileCondition( + condition = ProfileConditionType.EQUALS_ANY, + property = ProfileConditionValue.VIDEO_PROFILE, + value = profilesSet.joinToString("|"), + isRequired = false, + ), + ), + ) + } + private fun getSubtitleProfiles(embedded: Array, external: Array): List = ArrayList().apply { for (format in embedded) { add(SubtitleProfile(format = format, method = SubtitleDeliveryMethod.EMBED))