diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java index be84bc906d..5d789023bc 100644 --- a/encoder/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java @@ -86,4 +86,13 @@ protected void initFBO(int width, int height, int[] fboId, int[] rboId, int[] te } GlUtil.checkGlError("initFBO_E"); } + + protected void releaseFBO(int[] fboId, int[] rboId, int[] texId) { + GLES20.glDeleteFramebuffers(1, fboId, 0); + GLES20.glDeleteRenderbuffers(1, rboId, 0); + GLES20.glDeleteTextures(1, texId, 0); + fboId[0] = 0; + rboId[0] = 0; + texId[0] = 0; + } } diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/MainRender.kt b/encoder/src/main/java/com/pedro/encoder/input/gl/render/MainRender.kt index 0d2ef1ec41..07e9ea8779 100644 --- a/encoder/src/main/java/com/pedro/encoder/input/gl/render/MainRender.kt +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/MainRender.kt @@ -96,14 +96,21 @@ class MainRender { fun release() { running.set(false) cameraRender.release() - for (baseFilterRender in filterRenders) baseFilterRender.release() + for (baseFilterRender in filterRenders) releaseFilter(baseFilterRender) filterRenders.clear() screenRender.release() } + private fun releaseFilter(baseFilterRender: BaseFilterRender) { + baseFilterRender.release() + baseFilterRender.releaseFBOLink() + } + private fun setFilter(position: Int, baseFilterRender: BaseFilterRender) { val id = filterRenders[position].previousTexId val renderHandler = filterRenders[position].renderHandler + //the fbo is reused by the new filter, so the old one must not release it + filterRenders[position].renderHandler = RenderHandler() filterRenders[position].release() filterRenders[position] = baseFilterRender filterRenders[position].previousTexId = id @@ -125,18 +132,17 @@ class MainRender { private fun clearFilters() { for (baseFilterRender in filterRenders) { - baseFilterRender.release() + releaseFilter(baseFilterRender) } filterRenders.clear() } private fun removeFilter(position: Int) { - filterRenders.removeAt(position).release() + releaseFilter(filterRenders.removeAt(position)) } private fun removeFilter(baseFilterRender: BaseFilterRender) { - baseFilterRender.release() - filterRenders.remove(baseFilterRender) + if (filterRenders.remove(baseFilterRender)) releaseFilter(baseFilterRender) } private fun reOrderFilters(filters: List) { diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java index a3dc56c52e..666c35cafe 100644 --- a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java @@ -63,6 +63,10 @@ public void initFBOLink() { renderHandler.getTexId()); } + public void releaseFBOLink() { + releaseFBO(renderHandler.getFboId(), renderHandler.getRboId(), renderHandler.getTexId()); + } + protected abstract void initGlFilter(Context context); public void draw() {