diff --git a/app/src/main/assets/mpv.conf b/app/src/main/assets/mpv.conf index 5c633ce9..87a2ff6e 100755 --- a/app/src/main/assets/mpv.conf +++ b/app/src/main/assets/mpv.conf @@ -1,14 +1,11 @@ -#vo=mediacodec_embed -# hwdec: try to use hardware decoding -hwdec=mediacodec-copy -hwdec-codecs="h264,hevc,mpeg4,mpeg2video,vp8,vp9,av1" -gpu-dumb-mode=auto -# tls: allow self signed certificate -tls-verify=no -tls-ca-file="" -# demuxer: limit cache to 32 MiB, the default is too high for mobile devices -demuxer-max-bytes=32MiB -demuxer-max-back-bytes=32MiB -# sub: scale subtitles with video -sub-scale-with-window=no -sub-use-margins=no +### hwdec: try to use hardware decoding +# hwdec=mediacodec-copy +# hwdec-codecs="h264,hevc,mpeg4,mpeg2video,vp8,vp9,av1" + +### tls: allow self signed certificate +# tls-verify=no +# tls-ca-file="" + +### sub: scale subtitles with video +# sub-scale-with-window=no +# sub-use-margins=no diff --git a/app/src/main/assets/subfont.ttf b/app/src/main/assets/subfont.ttf new file mode 100644 index 00000000..56d013f8 Binary files /dev/null and b/app/src/main/assets/subfont.ttf differ diff --git a/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt b/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt index ddbdfd8b..0c2b9abf 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt @@ -40,7 +40,8 @@ import java.util.concurrent.CopyOnWriteArraySet class MPVPlayer( context: Context, requestAudioFocus: Boolean, - preferredLanguages: Map + preferredLanguages: Map, + disableHardwareDecoding: Boolean ) : BasePlayer(), MPVLib.EventObserver, AudioManager.OnAudioFocusChangeListener { private val audioManager: AudioManager by lazy { context.getSystemService()!! } @@ -50,13 +51,11 @@ class MPVPlayer( init { require(context is Application) - @Suppress("DEPRECATION") val mpvDir = File(context.getExternalFilesDir(null) ?: context.filesDir, "mpv") if (!mpvDir.exists()) { mpvDir.mkdirs() } - // https://github.com/mpv-android/mpv-android/commit/12d4d78 - arrayOf("mpv.conf", "subfont.ttf"/*, "cacert.pem"*/).forEach { fileName -> + arrayOf("mpv.conf", "subfont.ttf").forEach { fileName -> val file = File(mpvDir, fileName) Log.i("mpv", "File ${file.absolutePath}") if (!file.exists()) { @@ -64,24 +63,43 @@ class MPVPlayer( } } MPVLib.create(context) - MPVLib.setOptionString("config", "yes") + + // General MPVLib.setOptionString("config-dir", mpvDir.path) - // vo: set display fps as reported by android MPVLib.setOptionString("vo", "gpu") MPVLib.setOptionString("gpu-context", "android") MPVLib.setOptionString("ao", "audiotrack,opensles") - MPVLib.init() + // Hardware video decoding + if (disableHardwareDecoding) { + MPVLib.setOptionString("hwdec", "no") + } else { + MPVLib.setOptionString("hwdec", "mediacodec-copy") + } + MPVLib.setOptionString("hwdec-codecs", "h264,hevc,mpeg4,mpeg2video,vp8,vp9,av1") - // hardcoded options + // TLS + MPVLib.setOptionString("tls-verify", "no") + + // Cache MPVLib.setOptionString("cache", "yes") MPVLib.setOptionString("cache-pause-initial", "yes") + MPVLib.setOptionString("demuxer-max-bytes", "32MiB") + MPVLib.setOptionString("demuxer-max-back-bytes", "32MiB") + + // Subs + MPVLib.setOptionString("sub-scale-with-window", "no") + MPVLib.setOptionString("sub-use-margins", "no") + + // Other options MPVLib.setOptionString("force-window", "no") MPVLib.setOptionString("keep-open", "always") MPVLib.setOptionString("save-position-on-quit", "no") MPVLib.setOptionString("sub-font-provider", "none") MPVLib.setOptionString("ytdl", "no") + MPVLib.init() + for (preferredLanguage in preferredLanguages) { when (preferredLanguage.key) { TrackType.AUDIO -> { @@ -1281,7 +1299,6 @@ class MPVPlayer( COMMAND_PREPARE_STOP, COMMAND_SET_SPEED_AND_PITCH, COMMAND_GET_CURRENT_MEDIA_ITEM, - //COMMAND_GET_MEDIA_ITEMS, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_SET_VIDEO_SURFACE, @@ -1455,8 +1472,6 @@ class MPVPlayer( return Triple(tracks, trackGroupArray, trackSelectionArray) } - const val PLAYER_NAME = "MPV Player" - /** * Merges multiple [subtitleSources] into a single [videoSource] */ diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt index f7f5686e..eb68e3d6 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt @@ -59,7 +59,7 @@ constructor( if (useMpv) { val preferredLanguages = mapOf(TrackType.AUDIO to preferredAudioLanguage, TrackType.SUBTITLE to preferredSubtitleLanguage) - player = MPVPlayer(application, false, preferredLanguages) + player = MPVPlayer(application, false, preferredLanguages, sp.getBoolean("mpv_disable_hwdec", false)) } else { val renderersFactory = DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON) @@ -101,7 +101,7 @@ constructor( when (player) { is MPVPlayer -> { - player.setMediaItem(mediaItems[0]) + player.setMediaItems(mediaItems) player.prepare() player.play() } diff --git a/app/src/main/res/xml/fragment_settings.xml b/app/src/main/res/xml/fragment_settings.xml index da9402bf..49bbeb47 100644 --- a/app/src/main/res/xml/fragment_settings.xml +++ b/app/src/main/res/xml/fragment_settings.xml @@ -45,6 +45,7 @@ app:title="MPV Player" app:summary="Use the experimental MPV Player to play videos. MPV has support for more video, audio and subtitle codecs."/>