Basic track selection

This commit is contained in:
Damontecres 2025-11-06 11:56:56 -05:00
parent f3688b8417
commit 5f2cf5849c
No known key found for this signature in database

View file

@ -31,6 +31,9 @@ import androidx.media3.common.util.ListenerSet
import androidx.media3.common.util.Size import androidx.media3.common.util.Size
import androidx.media3.common.util.UnstableApi import androidx.media3.common.util.UnstableApi
import androidx.media3.common.util.Util import androidx.media3.common.util.Util
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
import androidx.media3.exoplayer.trackselection.TrackSelector
import androidx.media3.exoplayer.upstream.DefaultBandwidthMeter
import com.github.damontecres.wholphin.util.mpv.MPVLib.MpvEvent.MPV_EVENT_END_FILE import com.github.damontecres.wholphin.util.mpv.MPVLib.MpvEvent.MPV_EVENT_END_FILE
import com.github.damontecres.wholphin.util.mpv.MPVLib.MpvEvent.MPV_EVENT_FILE_LOADED import com.github.damontecres.wholphin.util.mpv.MPVLib.MpvEvent.MPV_EVENT_FILE_LOADED
import timber.log.Timber import timber.log.Timber
@ -48,7 +51,8 @@ class MpvPlayer(
private val context: Context, private val context: Context,
enableHardwareDecoding: Boolean, enableHardwareDecoding: Boolean,
) : BasePlayer(), ) : BasePlayer(),
MPVLib.EventObserver { MPVLib.EventObserver,
TrackSelector.InvalidationListener {
companion object { companion object {
private const val DEBUG = false private const val DEBUG = false
} }
@ -66,6 +70,7 @@ class MpvPlayer(
listener.onEvents(this@MpvPlayer, Player.Events(eventFlags)) listener.onEvents(this@MpvPlayer, Player.Events(eventFlags))
} }
private val availableCommands: Player.Commands private val availableCommands: Player.Commands
private val trackSelector = DefaultTrackSelector(context)
private var mediaItem: MediaItem? = null private var mediaItem: MediaItem? = null
private var startPositionMs: Long = 0L private var startPositionMs: Long = 0L
@ -124,6 +129,7 @@ class MpvPlayer(
// COMMAND_GET_TEXT, // COMMAND_GET_TEXT,
COMMAND_RELEASE, COMMAND_RELEASE,
).build() ).build()
trackSelector.init(this, DefaultBandwidthMeter.getSingletonInstance(context))
} }
override fun getApplicationLooper(): Looper = looper override fun getApplicationLooper(): Looper = looper
@ -282,13 +288,44 @@ class MpvPlayer(
override fun getTrackSelectionParameters(): TrackSelectionParameters { override fun getTrackSelectionParameters(): TrackSelectionParameters {
if (DEBUG) Timber.v("getTrackSelectionParameters") if (DEBUG) Timber.v("getTrackSelectionParameters")
// TODO
return TrackSelectionParameters.Builder().build() return TrackSelectionParameters
.Builder()
.build()
} }
override fun setTrackSelectionParameters(parameters: TrackSelectionParameters) { override fun setTrackSelectionParameters(parameters: TrackSelectionParameters) {
if (DEBUG) Timber.v("setTrackSelectionParameters") if (DEBUG) Timber.v("setTrackSelectionParameters")
// TODO val tracks = getTracks()
if (C.TRACK_TYPE_TEXT in parameters.disabledTrackTypes) {
// Subtitles disabled
Timber.v("TrackSelection: disabling subtitles")
MPVLib.setPropertyString("sid", "no")
}
if (C.TRACK_TYPE_AUDIO in parameters.disabledTrackTypes) {
// Audio disabled
Timber.v("TrackSelection: disabling audio")
MPVLib.setPropertyString("aid", "no")
}
Timber.v("TrackSelection: Got ${parameters.overrides.size} overrides")
parameters.overrides.forEach { (trackGroup, trackSelectionOverride) ->
tracks.groups.firstOrNull { it.mediaTrackGroup == trackGroup }?.let {
val id = it.mediaTrackGroup.getFormat(0).id
val splits = id?.split(":")
val trackId = splits?.getOrNull(1)
val propertyName =
when (it.mediaTrackGroup.type) {
C.TRACK_TYPE_AUDIO -> "aid"
C.TRACK_TYPE_VIDEO -> "vid"
C.TRACK_TYPE_TEXT -> "sid"
else -> null
}
Timber.v("TrackSelection: activating %s %s '%s'", propertyName, trackId, id)
if (trackId != null && propertyName != null) {
MPVLib.setPropertyString(propertyName, trackId)
}
}
}
} }
override fun getMediaMetadata(): MediaMetadata { override fun getMediaMetadata(): MediaMetadata {
@ -425,9 +462,7 @@ class MpvPlayer(
} }
} }
override fun getSurfaceSize(): Size { override fun getSurfaceSize(): Size = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
override fun getCurrentCues(): CueGroup = CueGroup.EMPTY_TIME_ZERO override fun getCurrentCues(): CueGroup = CueGroup.EMPTY_TIME_ZERO
@ -437,62 +472,40 @@ class MpvPlayer(
return DeviceInfo.Builder(DeviceInfo.PLAYBACK_TYPE_REMOTE).build() return DeviceInfo.Builder(DeviceInfo.PLAYBACK_TYPE_REMOTE).build()
} }
override fun getDeviceVolume(): Int { override fun getDeviceVolume(): Int = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
override fun isDeviceMuted(): Boolean { override fun isDeviceMuted(): Boolean = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
@Deprecated("Deprecated in Java") @Deprecated("Deprecated in Java")
override fun setDeviceVolume(volume: Int) { override fun setDeviceVolume(volume: Int): Unit = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
override fun setDeviceVolume( override fun setDeviceVolume(
volume: Int, volume: Int,
flags: Int, flags: Int,
) { ): Unit = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
@Deprecated("Deprecated in Java") @Deprecated("Deprecated in Java")
override fun increaseDeviceVolume() { override fun increaseDeviceVolume(): Unit = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
override fun increaseDeviceVolume(flags: Int) { override fun increaseDeviceVolume(flags: Int): Unit = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
@Deprecated("Deprecated in Java") @Deprecated("Deprecated in Java")
override fun decreaseDeviceVolume() { override fun decreaseDeviceVolume(): Unit = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
override fun decreaseDeviceVolume(flags: Int) { override fun decreaseDeviceVolume(flags: Int): Unit = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
@Deprecated("Deprecated in Java") @Deprecated("Deprecated in Java")
override fun setDeviceMuted(muted: Boolean) { override fun setDeviceMuted(muted: Boolean): Unit = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
override fun setDeviceMuted( override fun setDeviceMuted(
muted: Boolean, muted: Boolean,
flags: Int, flags: Int,
) { ): Unit = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
override fun setAudioAttributes( override fun setAudioAttributes(
audioAttributes: AudioAttributes, audioAttributes: AudioAttributes,
handleAudioFocus: Boolean, handleAudioFocus: Boolean,
) { ): Unit = throw UnsupportedOperationException()
TODO("Not yet implemented")
}
override fun seekTo( override fun seekTo(
mediaItemIndex: Int, mediaItemIndex: Int,
@ -627,7 +640,7 @@ class MpvPlayer(
val builder = val builder =
Format Format
.Builder() .Builder()
.setId(id) .setId("$idx:$id")
.setCodecs(codec) .setCodecs(codec)
.setSampleMimeType(mimeType) .setSampleMimeType(mimeType)
.setLanguage(lang) .setLanguage(lang)
@ -651,4 +664,8 @@ class MpvPlayer(
} }
return Tracks(groups) return Tracks(groups)
} }
override fun onTrackSelectionsInvalidated() {
TODO("Not yet implemented")
}
} }