Fix EGL crash when ending call.

This commit is contained in:
Cody Henthorne
2021-11-10 13:01:48 -05:00
parent 8a05626791
commit f0ab919ca5
14 changed files with 105 additions and 114 deletions

View File

@@ -31,7 +31,7 @@ public class BroadcastVideoSink implements VideoSink {
private RequestedSize currentlyRequestedMaxSize;
public BroadcastVideoSink() {
this(new EglBaseWrapper(null), false, true, 0);
this(new EglBaseWrapper(), false, true, 0);
}
/**

View File

@@ -15,16 +15,21 @@ private val TAG = Log.tag(EglBaseWrapper::class.java)
/**
* Wrapper which allows caller to perform synchronized actions on an EglBase object.
*/
class EglBaseWrapper(val eglBase: EglBase?) {
* Must use [acquireEglBase] to get a valid instance to an [EglBaseWrapper] for use in calling.
* The instance returned may be shared across calls. Call [releaseEglBase] when it is no longer
* required. When the wrapper has no others are using it, it will be properly released (a la reference counting).
*/
class EglBaseWrapper private constructor(val eglBase: EglBase?) {
private val lock: Lock = ReentrantLock()
fun require(): EglBase = requireNotNull(eglBase)
@Volatile
private var isReleased: Boolean = false
constructor() : this(null)
fun require(): EglBase = requireNotNull(eglBase)
fun performWithValidEglBase(consumer: Consumer<EglBase>) {
if (isReleased) {
Log.d(TAG, "Tried to use a released EglBase", Exception())
@@ -53,7 +58,7 @@ class EglBaseWrapper(val eglBase: EglBase?) {
}
}
fun releaseEglBase() {
private fun releaseEglBase() {
if (isReleased || eglBase == null) {
return
}
@@ -67,4 +72,48 @@ class EglBaseWrapper(val eglBase: EglBase?) {
eglBase.release()
}
}
companion object {
const val OUTGOING_PLACEHOLDER: String = "OUTGOING_PLACEHOLDER"
private var eglBaseWrapper: EglBaseWrapper? = null
private val holders: MutableSet<Any> = mutableSetOf()
@JvmStatic
fun acquireEglBase(holder: Any): EglBaseWrapper {
val eglBase: EglBaseWrapper = eglBaseWrapper ?: EglBaseWrapper(EglBase.create())
eglBaseWrapper = eglBase
holders += holder
Log.d(TAG, "Acquire EGL $eglBaseWrapper with holder: $holder")
return eglBase
}
@JvmStatic
fun releaseEglBase(holder: Any) {
Log.d(TAG, "Release EGL with holder: $holder")
holders.remove(holder)
if (holders.isEmpty()) {
Log.d(TAG, "Holders empty, release EGL Base")
eglBaseWrapper?.releaseEglBase()
eglBaseWrapper = null
}
}
@JvmStatic
fun replaceHolder(currentHolder: Any, newHolder: Any) {
if (currentHolder == newHolder) {
return
}
Log.d(TAG, "Replace holder $currentHolder with $newHolder")
holders += newHolder
holders.remove(currentHolder)
}
@JvmStatic
fun forceRelease() {
eglBaseWrapper?.releaseEglBase()
eglBaseWrapper = null
holders.clear()
}
}
}