Chris Fillmore
06/06/2023, 11:49 AMCameraStream.videoSink
gets gc’ed, and so never receives any frames to send on to the webrtc stream. But it’s only sometimes, not all the time.Chris Fillmore
06/06/2023, 11:50 AMinterface Camera {
fun addListener(listener: VideoSink)
}
class CameraImpl : Camera {
private val listenersLock = Any()
private val listeners = mutableListOf<WeakReference<VideoSink>>()
override fun addListener(listener: VideoSink) {
synchronized(listenersLock) {
listeners.add(WeakReference(listener))
}
}
// Other methods for dealing with camera
}
interface Stream {
fun onFrame(frame: VideoFrame)
}
class CameraStream(
private val camera: Camera,
private val stream: Stream,
) {
private val videoSink = VideoSink { frame ->
stream.onFrame(frame)
}
init {
camera.addListener(videoSink)
}
}
Chris Fillmore
06/06/2023, 11:53 AMChris Fillmore
06/06/2023, 11:54 AMvideoSink
gets gc’ed. The instance of CameraStream
is long-lived, so I would expect it to retain CameraStream.videoSink
. But I may misunderstand the Kotlin garbage collector.Chris Fillmore
06/06/2023, 11:55 AMlazynoda
06/06/2023, 12:02 PMCameraStream
reference is kept?lazynoda
06/06/2023, 12:03 PMChris Fillmore
06/06/2023, 3:16 PMCameraStream
is instantiated and passed as a delegate to another class, and the reference to that class is definitely keptChris Fillmore
06/06/2023, 3:16 PM