From c890fe36d3b12b505b43e288725961cd374e7f60 Mon Sep 17 00:00:00 2001
From: silas <s.developer@4-dc.de>
Date: Tue, 27 Jul 2021 12:14:30 +0200
Subject: [PATCH] Added some cleanup code to AVQt::OpenGLRenderer::deinit()

---
 AVQt/output/OpenGLRenderer.cpp         | 36 +++++++++++++++++---------
 AVQt/output/private/OpenGLRenderer_p.h |  4 +--
 2 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/AVQt/output/OpenGLRenderer.cpp b/AVQt/output/OpenGLRenderer.cpp
index 7b540e4..d385ff3 100644
--- a/AVQt/output/OpenGLRenderer.cpp
+++ b/AVQt/output/OpenGLRenderer.cpp
@@ -111,7 +111,15 @@ namespace AVQt {
     }
 
     int OpenGLRenderer::deinit(IFrameSource *source) {
-        Q_UNUSED(source)
+        Q_D(AVQt::OpenGLRenderer);
+        stop(source);
+
+        if (d->m_pQSVDerivedDeviceContext) {
+            av_buffer_unref(&d->m_pQSVDerivedFramesContext);
+            av_buffer_unref(&d->m_pQSVDerivedDeviceContext);
+        }
+
+        delete d->m_clock;
 
         return 0;
     }
@@ -142,7 +150,13 @@ namespace AVQt {
         if (d->m_running.compare_exchange_strong(shouldBeCurrent, false)) {
             hide();
 
-            d->m_clock->stop();
+            if (d->m_currentFrame) {
+                av_frame_free(&d->m_currentFrame);
+            }
+
+            if (d->m_clock) {
+                d->m_clock->stop();
+            }
 
             {
                 QMutexLocker lock(&d->m_renderQueueMutex);
@@ -162,18 +176,15 @@ namespace AVQt {
             d->m_vbo.destroy();
             d->m_vao.destroy();
 
-//                d->m_yTexture->destroy();
             delete d->m_yTexture;
-
-
-//                d->m_uTexture->destroy();
             delete d->m_uTexture;
-
-
-
-//                d->m_yTexture->destroy();
             delete d->m_vTexture;
 
+            if (d->m_EGLImages[0]) {
+                for (auto &EGLImage : d->m_EGLImages) {
+                    eglDestroyImage(d->m_EGLDisplay, EGLImage);
+                }
+            }
 
             stopped();
             return 0;
@@ -907,8 +918,9 @@ namespace AVQt {
         return d->m_clock;
     }
 
-    GLint OpenGLRendererPrivate::project(GLdouble objx, GLdouble objy, GLdouble objz, const GLdouble model[16], const GLdouble proj[16],
-                                         const GLint viewport[4], GLdouble *winx, GLdouble *winy, GLdouble *winz) {
+    [[maybe_unused]] GLint
+    OpenGLRendererPrivate::project(GLdouble objx, GLdouble objy, GLdouble objz, const GLdouble model[16], const GLdouble proj[16],
+                                   const GLint viewport[4], GLdouble *winx, GLdouble *winy, GLdouble *winz) {
         GLdouble in[4], out[4];
 
         in[0] = objx;
diff --git a/AVQt/output/private/OpenGLRenderer_p.h b/AVQt/output/private/OpenGLRenderer_p.h
index 3b4dec3..dfb8f86 100644
--- a/AVQt/output/private/OpenGLRenderer_p.h
+++ b/AVQt/output/private/OpenGLRenderer_p.h
@@ -45,7 +45,7 @@ namespace AVQt {
     private:
         explicit OpenGLRendererPrivate(OpenGLRenderer *q) : q_ptr(q) {};
 
-        static GLint
+        [[maybe_unused]] static GLint
         project(GLdouble objx, GLdouble objy, GLdouble objz, const GLdouble model[16], const GLdouble[16], const GLint viewport[4],
                 GLdouble *winx, GLdouble *winy, GLdouble *winz);
 
@@ -87,8 +87,6 @@ namespace AVQt {
         VADisplay m_VADisplay{nullptr};
         AVVAAPIDeviceContext *m_pVAContext{nullptr};
         EGLDisplay m_EGLDisplay{nullptr};
-        EGLSurface m_EGLSurface{nullptr};
-        EGLContext m_EGLContext{nullptr};
         EGLImage m_EGLImages[2]{};
         GLuint m_textures[2]{};
 
-- 
GitLab