Compare commits

...
2 Commits
Author SHA1 Message Date
zoriya 77a8b2337d fix(vlc): prevent crashes with pip & cast 2026-07-30 13:44:27 +02:00
zoriya cebe97f168 chore(example): fix auto-rotate setting flip bug 2026-07-30 01:17:44 +02:00
4 changed files with 27 additions and 5 deletions
@@ -279,7 +279,7 @@ class OmniPlayer(
override var playbackRate by mainThreadProperty( override var playbackRate by mainThreadProperty(
get = { player.playbackParameters.speed.toDouble() }, get = { player.playbackParameters.speed.toDouble() },
set = { value -> player.setPlaybackSpeed(value.toFloat().coerceAtLeast(0f)) } set = { value -> player.setPlaybackSpeed(value.toFloat().coerceAtLeast(0.01f)) }
) )
override var muted by mainThreadProperty( override var muted by mainThreadProperty(
@@ -219,6 +219,11 @@ class OmniView(val context: ThemedReactContext) :
return return
} }
if (boundPlayer?.isCasting == true) {
clearPictureInPictureParams()
return
}
val autoEnterEnabled = val autoEnterEnabled =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
autoPip == true && autoPip == true &&
@@ -242,9 +247,18 @@ class OmniView(val context: ThemedReactContext) :
) )
} }
private fun clampedAspectRatio(width: Int, height: Int): Rational {
val minRatio = 0.42
val maxRatio = 2.38
val ratio = width.toDouble() / height.toDouble()
if (ratio in minRatio..maxRatio) return Rational(width, height)
val clamped = ratio.coerceIn(minRatio, maxRatio)
return Rational((clamped * 1000).toInt(), 1000)
}
private fun buildPipParams(autoEnterEnabled: Boolean): PictureInPictureParams { private fun buildPipParams(autoEnterEnabled: Boolean): PictureInPictureParams {
val aspectRatio = if (surfaceView.width > 0 && surfaceView.height > 0) { val aspectRatio = if (surfaceView.width > 0 && surfaceView.height > 0) {
Rational(surfaceView.width, surfaceView.height) clampedAspectRatio(surfaceView.width, surfaceView.height)
} else { } else {
Rational(16, 9) Rational(16, 9)
} }
@@ -97,9 +97,11 @@ class VlcPlayer(ctx: Context) :
private var mediaItems: List<MediaItem> = emptyList() private var mediaItems: List<MediaItem> = emptyList()
private var currentMediaItemIndex: Int = INDEX_UNSET private var currentMediaItemIndex: Int = INDEX_UNSET
private var currentTrackSelectionParameters = TrackSelectionParameters.Builder().build() private var currentTrackSelectionParameters = TrackSelectionParameters.Builder().build()
@Volatile
private var playerError: PlaybackException? = null private var playerError: PlaybackException? = null
private var playlistMetadata: MediaMetadata = MediaMetadata.EMPTY private var playlistMetadata: MediaMetadata = MediaMetadata.EMPTY
private var userInitiatedTransition: Boolean = false private var userInitiatedTransition: Boolean = false
@Volatile
private var cachedBufferedPosition: Long = 0L private var cachedBufferedPosition: Long = 0L
private var boundSurfaceView: SurfaceView? = null private var boundSurfaceView: SurfaceView? = null
@@ -467,7 +469,11 @@ class VlcPlayer(ctx: Context) :
override fun getShuffleModeEnabled(): Boolean = false override fun getShuffleModeEnabled(): Boolean = false
override fun isLoading() = player.playerState == IMedia.State.Opening override fun isLoading(): Boolean {
val state = playbackState
if (state == STATE_IDLE || state == STATE_ENDED) return false
return player.playerState == IMedia.State.Opening
}
override fun seekTo( override fun seekTo(
mediaItemIndex: Int, mediaItemIndex: Int,
@@ -493,11 +499,11 @@ class VlcPlayer(ctx: Context) :
override fun getSeekForwardIncrement(): Long = 15_000L override fun getSeekForwardIncrement(): Long = 15_000L
override fun setPlaybackParameters(playbackParameters: PlaybackParameters) { override fun setPlaybackParameters(playbackParameters: PlaybackParameters) {
player.rate = playbackParameters.speed.coerceAtLeast(0f) player.rate = playbackParameters.speed.coerceAtLeast(0.01f)
} }
override fun getPlaybackParameters(): PlaybackParameters = override fun getPlaybackParameters(): PlaybackParameters =
PlaybackParameters(player.rate.coerceAtLeast(0f)) PlaybackParameters(player.rate.takeIf { it > 0f } ?: 1f)
override fun stop() { override fun stop() {
player.stop() player.stop()
@@ -505,6 +511,7 @@ class VlcPlayer(ctx: Context) :
override fun release() { override fun release() {
player.setEventListener(null) player.setEventListener(null)
listeners.release()
abandonAudioFocus() abandonAudioFocus()
player.stop() player.stop()
clearVideoSurface() clearVideoSurface()
@@ -14,6 +14,7 @@
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:screenOrientation="nosensor"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:launchMode="singleTask" android:launchMode="singleTask"
android:resizeableActivity="true" android:resizeableActivity="true"