Skip to content

Commit 8e8b485

Browse files
committed
Video plugin: don't open webcam unless a feed is using it.
1 parent 12c8556 commit 8e8b485

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

src/jsMain/kotlin/baaahs/plugin/webcam/DefaultVideoProvider.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ actual val DefaultVideoProvider: VideoProvider
1616
get() = BrowserWebCamVideoProvider
1717

1818
object BrowserWebCamVideoProvider : VideoProvider {
19+
private var isOpen = false
1920
private var isPlaying = false
2021

2122
private val videoElement = (document.createElement("video") as HTMLVideoElement).apply {
@@ -29,10 +30,6 @@ object BrowserWebCamVideoProvider : VideoProvider {
2930

3031
private val logger = Logger<BrowserWebCamVideoProvider>()
3132

32-
init {
33-
startCamera()
34-
}
35-
3633
private fun startCamera() {
3734
logger.info { "Initializing." }
3835
if (!window.isSecureContext) {
@@ -60,11 +57,20 @@ object BrowserWebCamVideoProvider : VideoProvider {
6057
}
6158

6259
override fun isReady(): Boolean = isPlaying
60+
.also { ensureOpen() }
6361

6462
override fun getTextureResource(): TextureResource {
63+
ensureOpen()
6564
return TextureResource(videoElement.unsafeCast<TexImageSource>())
6665
}
6766

67+
private fun ensureOpen() {
68+
if (!isOpen) {
69+
isOpen = true
70+
startCamera()
71+
}
72+
}
73+
6874
private val Window.isSecureContext: Boolean
6975
get() = asDynamic().isSecureContext as Boolean
7076
}

src/jvmMain/kotlin/baaahs/plugin/webcam/DefaultVideoProvider.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,28 @@ import com.danielgergely.kgl.TextureResource
66
import com.github.eduramiba.webcamcapture.drivers.NativeDriver
77
import com.github.sarxos.webcam.Webcam
88
import org.lwjgl.opengl.GL11
9+
import java.awt.image.BufferedImage
910

1011
actual val DefaultVideoProvider: VideoProvider
1112
get() = WebcamCaptureVideoProvider
1213

1314

1415
object WebcamCaptureVideoProvider : VideoProvider {
1516
private var textureResource: TextureResource? = null
17+
private var isOpen = false
1618

1719
private val webcam: Webcam = run {
1820
Webcam.setDriver(NativeDriver())
1921
Webcam.getDefault()
2022
}
23+
private val noImage = BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB)
2124

22-
init {
23-
webcam.open()
24-
}
25-
26-
override fun isReady(): Boolean = true
25+
override fun isReady(): Boolean = isOpen.also { ensureOpen() }
2726

2827
override fun getTextureResource(): TextureResource {
29-
val image = webcam.image
28+
ensureOpen()
29+
30+
val image: BufferedImage = webcam.image ?: noImage
3031
if (textureResource == null || textureResource!!.width != image.width || textureResource!!.height != image.height) {
3132
val vals = ByteBuffer(image.width * image.height * 3)
3233
textureResource = TextureResource(
@@ -55,4 +56,9 @@ object WebcamCaptureVideoProvider : VideoProvider {
5556
return textureResource!!
5657
}
5758

59+
private fun ensureOpen() {
60+
if (!isOpen) {
61+
isOpen = webcam.open(true)
62+
}
63+
}
5864
}

0 commit comments

Comments
 (0)