diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt index bc606582878121d7f1a0ba898a282ae2607a0481..2c38fd0d30e36dbadabdf945f3c8602ad0471190 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt @@ -171,7 +171,6 @@ import kotlinx.coroutines.withContext import userpackage.Protocol import java.time.OffsetDateTime import kotlin.math.abs -import kotlin.math.max import kotlin.math.roundToLong @UnstableApi @@ -1901,13 +1900,45 @@ class VideoDetailView : ConstraintLayout { return super.onInterceptTouchEvent(ev); } - //Actions private fun showVideoSettings() { Logger.i(TAG, "showVideoSettings") _overlay_quality_selector?.selectOption("video", _lastVideoSource); _overlay_quality_selector?.selectOption("audio", _lastAudioSource); _overlay_quality_selector?.selectOption("subtitles", _lastSubtitleSource); + + if (_lastVideoSource is IDashManifestSource || _lastVideoSource is IHLSManifestSource) { + + val videoTracks = + _player.exoPlayer?.player?.currentTracks?.groups?.firstOrNull { it.mediaTrackGroup.type == C.TRACK_TYPE_VIDEO } + + var selectedQuality: Format? = null + + if (videoTracks != null) { + for (i in 0 until videoTracks.mediaTrackGroup.length) { + if (videoTracks.mediaTrackGroup.getFormat(i).height == _player.targetTrackVideoHeight) { + selectedQuality = videoTracks.mediaTrackGroup.getFormat(i) + } + } + } + + var videoMenuGroup: SlideUpMenuGroup? = null + for (view in _overlay_quality_selector!!.groupItems) { + if (view is SlideUpMenuGroup && view.groupTag == "video") { + videoMenuGroup = view + } + } + + if (selectedQuality != null) { + videoMenuGroup?.getItem("auto")?.setSubText("") + _overlay_quality_selector?.selectOption("video", selectedQuality) + } else { + videoMenuGroup?.getItem("auto") + ?.setSubText("${_player.exoPlayer?.player?.videoFormat?.width}x${_player.exoPlayer?.player?.videoFormat?.height}") + _overlay_quality_selector?.selectOption("video", "auto") + } + } + val currentPlaybackRate = (if (_isCasting) StateCasting.instance.activeDevice?.speed else _player.getPlaybackRate()) ?: 1.0 _overlay_quality_selector?.groupItems?.firstOrNull { it is SlideUpMenuButtonList && it.id == "playback_rate" }?.let { (it as SlideUpMenuButtonList).setSelected(currentPlaybackRate.toString()) @@ -2081,17 +2112,15 @@ class VideoDetailView : ConstraintLayout { call = { handleSelectSubtitleTrack(it) }) }.toList().toTypedArray()) else null, - if(liveStreamVideoFormats?.isEmpty() == false) - SlideUpMenuGroup(this.context, context.getString(R.string.stream_video), "video", - *liveStreamVideoFormats - .map { - SlideUpMenuItem(this.context, - R.drawable.ic_movie, - it.label ?: it.containerMimeType ?: it.bitrate.toString(), - "${it.width}x${it.height}", - tag = it, - call = { _player.selectVideoTrack(it.height) }); - }.toList().toTypedArray()) + if (liveStreamVideoFormats?.isEmpty() == false) SlideUpMenuGroup( + this.context, context.getString(R.string.stream_video), "video", (listOf( + SlideUpMenuItem(this.context, R.drawable.ic_movie, "Auto", tag = "auto", call = { _player.selectVideoTrack(-1) }) + ) + (liveStreamVideoFormats.map { + SlideUpMenuItem(this.context, R.drawable.ic_movie, it.label + ?: it.containerMimeType + ?: it.bitrate.toString(), "${it.width}x${it.height}", tag = it, call = { _player.selectVideoTrack(it.height) }); + })) + ) else null, if(liveStreamAudioFormats?.isEmpty() == false) SlideUpMenuGroup(this.context, context.getString(R.string.stream_audio), "audio", diff --git a/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuGroup.kt b/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuGroup.kt index 9f19018d77c5ec3835ab702352e7509a3165a99a..606c8746978c3998489ed837d258994226e68ae4 100644 --- a/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuGroup.kt +++ b/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuGroup.kt @@ -61,6 +61,15 @@ class SlideUpMenuGroup : LinearLayout { return didSelect; } + fun getItem(tag: Any?): SlideUpMenuItem? { + for(item in items) { + if(item.itemTag == tag){ + return item + } + } + return null + } + private fun addItems(items: List<SlideUpMenuItem>) { for (item in items) { item.setParentClickListener { parentClickListener?.invoke() } diff --git a/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuItem.kt b/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuItem.kt index 8e5da9903e67a204e01638491e12e36424246557..29699ecd2cf4bb4d8d37f30001928ad91c3dfc92 100644 --- a/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuItem.kt +++ b/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuItem.kt @@ -82,6 +82,10 @@ class SlideUpMenuItem : ConstraintLayout { return isSelected; } + fun setSubText(subText: String) { + _subtext.text = subText + } + fun setParentClickListener(listener: (()->Unit)?) { _parentClickListener = listener; } diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt index 9ca559ca16887bc0984e7e7d3f0362452b3f19b8..739da3c32c467e0dc27bf5d4eaab2617a91a682e 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt +++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt @@ -110,8 +110,10 @@ abstract class FutoVideoPlayerBase : RelativeLayout { private var _didCallSourceChange = false; private var _lastState: Int = -1; - private var _targetTrackVideoHeight = -1; - private var _targetTrackAudioBitrate = -1; + + var targetTrackVideoHeight = -1 + private set + private var _targetTrackAudioBitrate = -1 private var _toResume = false; @@ -278,7 +280,7 @@ abstract class FutoVideoPlayerBase : RelativeLayout { //TODO: Temporary solution, Implement custom track selector without using constraints fun selectVideoTrack(height: Int) { - _targetTrackVideoHeight = height; + targetTrackVideoHeight = height; updateTrackSelector(); } fun selectAudioTrack(bitrate: Int) { @@ -288,10 +290,10 @@ abstract class FutoVideoPlayerBase : RelativeLayout { @OptIn(UnstableApi::class) private fun updateTrackSelector() { var builder = DefaultTrackSelector.Parameters.Builder(context); - if(_targetTrackVideoHeight > 0) { + if(targetTrackVideoHeight > 0) { builder = builder - .setMinVideoSize(0, _targetTrackVideoHeight - 10) - .setMaxVideoSize(9999, _targetTrackVideoHeight + 10); + .setMinVideoSize(0, targetTrackVideoHeight - 10) + .setMaxVideoSize(9999, targetTrackVideoHeight + 10); } if(_targetTrackAudioBitrate > 0) {