Skip to content

Commit ab99907

Browse files
committed
chore: use new compose-gl api
1 parent d67f6f6 commit ab99907

File tree

3 files changed

+42
-26
lines changed

3 files changed

+42
-26
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ kotlinx-serialization = "1.7.3"
66
kotlinx-datetime = "0.6.1"
77

88
compose = "1.7.0-rc01"
9-
compose-gl = "0.6.1"
9+
compose-gl = "0.7.0"
1010
jni-utils = "0.1.5"
1111
skiko = "0.8.15-egl"
1212
jna = "5.15.0"

src/main/kotlin/dev/silenium/multimedia/compose/player/VideoPlayer.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package dev.silenium.multimedia.compose.player
33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.State
55
import dev.silenium.compose.gl.surface.GLDrawScope
6+
import dev.silenium.compose.gl.surface.GLSurface
67
import dev.silenium.compose.gl.surface.GLSurfaceState
78
import dev.silenium.multimedia.compose.util.deferredFlowStateOf
89
import dev.silenium.multimedia.compose.util.mapState
@@ -13,6 +14,7 @@ import kotlin.time.Duration
1314
import kotlin.time.Duration.Companion.seconds
1415

1516
class VideoPlayer(hwdec: Boolean = false) : AutoCloseable {
17+
internal var surface: GLSurface? = null
1618
private var initialized = false
1719

1820
@PublishedApi

src/main/kotlin/dev/silenium/multimedia/compose/player/VideoSurface.kt

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package dev.silenium.multimedia.compose.player
22

33
import androidx.compose.foundation.layout.BoxWithConstraints
4-
import androidx.compose.foundation.layout.fillMaxSize
54
import androidx.compose.foundation.layout.padding
65
import androidx.compose.foundation.layout.width
76
import androidx.compose.material.MaterialTheme
@@ -10,48 +9,55 @@ import androidx.compose.runtime.*
109
import androidx.compose.ui.Modifier
1110
import androidx.compose.ui.graphics.Color
1211
import androidx.compose.ui.unit.dp
13-
import dev.silenium.compose.gl.surface.FBOSizeOverride
14-
import dev.silenium.compose.gl.surface.GLSurfaceView
15-
import dev.silenium.compose.gl.surface.rememberGLSurfaceState
12+
import dev.silenium.compose.gl.surface.*
1613
import dev.silenium.multimedia.core.annotation.InternalMultimediaApi
1714

1815
@Composable
19-
fun VideoSurface(
16+
private fun createGLSurface(
2017
player: VideoPlayer,
21-
showStats: Boolean = false,
22-
modifier: Modifier = Modifier,
18+
surfaceState: GLSurfaceState = rememberGLSurfaceState(),
2319
onInitialized: () -> Unit = {},
24-
) {
25-
val surfaceState = rememberGLSurfaceState()
20+
): GLSurface {
21+
var initialized by remember { mutableStateOf(false) }
2622

2723
@OptIn(InternalMultimediaApi::class)
28-
val dwidth by player.property<Long>("width")
24+
val dwidth by player.property<Long>("dwidth")
2925

3026
@OptIn(InternalMultimediaApi::class)
31-
val dheight by player.property<Long>("height")
27+
val dheight by player.property<Long>("dheight")
3228
val fboSizeOverride = remember(dwidth, dheight) {
3329
dwidth?.let { w ->
3430
dheight?.let { h ->
3531
FBOSizeOverride(w.toInt(), h.toInt())
3632
}
3733
}
3834
}
35+
return rememberGLSurface(
36+
surfaceState,
37+
presentMode = GLSurface.PresentMode.MAILBOX,
38+
swapChainSize = 3,
39+
fboSizeOverride = fboSizeOverride,
40+
draw = {
41+
player.onRender(this, surfaceState)
42+
if (!initialized) {
43+
initialized = true
44+
onInitialized()
45+
}
46+
}
47+
)
48+
}
3949

50+
@Composable
51+
fun VideoSurface(
52+
player: VideoPlayer,
53+
showStats: Boolean = false,
54+
modifier: Modifier = Modifier,
55+
) {
56+
val surfaceState = rememberGLSurfaceState()
4057
BoxWithConstraints(modifier = modifier) {
41-
var initialized by remember { mutableStateOf(false) }
4258
GLSurfaceView(
43-
surfaceState,
44-
modifier = Modifier.fillMaxSize(),
45-
presentMode = GLSurfaceView.PresentMode.MAILBOX,
46-
swapChainSize = 3,
47-
draw = {
48-
player.onRender(this, surfaceState)
49-
if (!initialized) {
50-
initialized = true
51-
onInitialized()
52-
}
53-
},
54-
fboSizeOverride = fboSizeOverride,
59+
surface = player.surface ?: createGLSurface(player, surfaceState),
60+
modifier = Modifier.matchParentSize(),
5561
)
5662
if (showStats) {
5763
Surface(
@@ -66,8 +72,16 @@ fun VideoSurface(
6672
}
6773

6874
@Composable
69-
fun rememberVideoPlayer(): VideoPlayer {
75+
fun rememberVideoPlayer(
76+
surfaceState: GLSurfaceState = rememberGLSurfaceState(),
77+
onInitialized: () -> Unit = {},
78+
): VideoPlayer {
7079
val player = remember { VideoPlayer() }
80+
val surface = createGLSurface(player, surfaceState, onInitialized)
81+
82+
LaunchedEffect(player, surface) {
83+
player.surface = surface
84+
}
7185
DisposableEffect(player) {
7286
onDispose {
7387
player.close()

0 commit comments

Comments
 (0)