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 be84bc906..5d789023b 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 4e8842004..c9c5d8201 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,19 +96,16 @@ class MainRender { fun release() { running.set(false) cameraRender.release() - for (baseFilterRender in filterRenders) baseFilterRender.release() + for (baseFilterRender in filterRenders) baseFilterRender.releaseFilter() filterRenders.clear() screenRender.release() } private fun setFilter(position: Int, baseFilterRender: BaseFilterRender) { - val id = filterRenders[position].previousTexId - val renderHandler = filterRenders[position].renderHandler - filterRenders[position].release() + filterRenders[position].releaseFilter() filterRenders[position] = baseFilterRender - filterRenders[position].previousTexId = id - filterRenders[position].initGl(width, height, context, previewWidth, previewHeight) - filterRenders[position].renderHandler = renderHandler + baseFilterRender.initGl(width, height, context, previewWidth, previewHeight) + baseFilterRender.initFBOLink() } private fun addFilter(baseFilterRender: BaseFilterRender) { @@ -124,19 +121,16 @@ class MainRender { } private fun clearFilters() { - for (baseFilterRender in filterRenders) { - baseFilterRender.release() - } + for (baseFilterRender in filterRenders) baseFilterRender.releaseFilter() filterRenders.clear() } private fun removeFilter(position: Int) { - filterRenders.removeAt(position).release() + filterRenders.removeAt(position).releaseFilter() } private fun removeFilter(baseFilterRender: BaseFilterRender) { - baseFilterRender.release() - filterRenders.remove(baseFilterRender) + if (filterRenders.remove(baseFilterRender)) baseFilterRender.releaseFilter() } private fun reOrderFilters(filters: List) { @@ -150,7 +144,7 @@ class MainRender { fun setFilterAction(filterAction: FilterAction, position: Int, baseFilterRender: BaseFilterRender) { when (filterAction) { - FilterAction.SET -> if (filterRenders.size > 0) { + FilterAction.SET -> if (filterRenders.isNotEmpty()) { setFilter(position, baseFilterRender) } else { addFilter(baseFilterRender) 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 93a13e0aa..63f488676 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 @@ -67,6 +67,11 @@ public void initFBOLink() { protected abstract void initGlFilter(@NonNull Context context); + public void releaseFilter() { + release(); + releaseFBO(renderHandler.getFboId(), renderHandler.getRboId(), renderHandler.getTexId()); + } + public void draw() { GlUtil.checkGlError("drawFilter start"); GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, renderHandler.getFboId()[0]);