From d6656d4779e5008822574fa11b62190e684d0025 Mon Sep 17 00:00:00 2001
From: silas <s.developer@4-dc.de>
Date: Fri, 16 Jul 2021 13:53:52 +0200
Subject: [PATCH] Fixed some memory leaks

---
 AVQt/CMakeLists.txt            |  3 ++
 AVQt/filter/DecoderVAAPI.cpp   |  4 +--
 AVQt/input/Demuxer.cpp         |  4 ++-
 AVQt/output/OpenGLRenderer.cpp | 54 ++++++++++++++++++----------------
 Player/CMakeLists.txt          |  3 +-
 5 files changed, 37 insertions(+), 31 deletions(-)

diff --git a/AVQt/CMakeLists.txt b/AVQt/CMakeLists.txt
index 279a505..1f4c491 100644
--- a/AVQt/CMakeLists.txt
+++ b/AVQt/CMakeLists.txt
@@ -12,6 +12,9 @@ set(CMAKE_INCLUDE_CURRENT_DIR on)
 #find_package(Qt6 COMPONENTS Core Gui Concurrent Widgets OpenGL OpenGLWidgets)
 find_package(Qt5 COMPONENTS Core Gui Concurrent Widgets OpenGL)
 
+#add_compile_options(-fsanitize=address)
+#add_link_options(-fsanitize=address)
+
 #if (${CMAKE_BUILD_TYPE} EQUAL "Release")
 #    -O3)
 #endif ()
diff --git a/AVQt/filter/DecoderVAAPI.cpp b/AVQt/filter/DecoderVAAPI.cpp
index 919839e..6aa87df 100644
--- a/AVQt/filter/DecoderVAAPI.cpp
+++ b/AVQt/filter/DecoderVAAPI.cpp
@@ -262,7 +262,6 @@ namespace AVQt {
                         } else if (ret < 0) {
                             qFatal("%d: Error sending packet to VAAPI decoder: %s", ret, av_make_error_string(strBuf, strBufSize, ret));
                         }
-                        av_packet_unref(packet);
                         av_packet_free(&packet);
                         lock.relock();
                     }
@@ -300,8 +299,7 @@ namespace AVQt {
                                d->m_timebase.num,
                                d->m_timebase.den);
                         QTime time = QTime::currentTime();
-                        cb->onFrame(this, cbFrame, static_cast<int64_t>(av_q2d(av_inv_q(d->m_framerate)) * 1000.0),
-                                    av_buffer_ref(d->m_pDeviceCtx));
+                        cb->onFrame(this, cbFrame, static_cast<int64_t>(av_q2d(av_inv_q(d->m_framerate)) * 1000.0), d->m_pDeviceCtx);
                         qDebug() << "Video CB time:" << time.msecsTo(QTime::currentTime());
                         av_frame_free(&cbFrame);
 //                        }));
diff --git a/AVQt/input/Demuxer.cpp b/AVQt/input/Demuxer.cpp
index fe24e6f..7b76a15 100644
--- a/AVQt/input/Demuxer.cpp
+++ b/AVQt/input/Demuxer.cpp
@@ -294,7 +294,7 @@ namespace AVQt {
                 for (const auto &cb: cbList) {
                     AVPacket *cbPacket = av_packet_clone(packet);
                     cb->onPacket(this, cbPacket, type);
-                    av_packet_unref(cbPacket);
+                    av_packet_free(&cbPacket);
                 }
                 if (elapsedTimer.hasExpired(500)) {
                     QByteArray aP, vP, sP, aR, vR, sR;
@@ -316,10 +316,12 @@ namespace AVQt {
                     qDebug();
                     elapsedTimer.restart();
                 }
+                av_packet_unref(packet);
             } else {
                 msleep(8);
             }
         }
+        av_packet_free(&packet);
     }
 
     Demuxer::Demuxer(Demuxer &&other) noexcept: d_ptr(other.d_ptr) {
diff --git a/AVQt/output/OpenGLRenderer.cpp b/AVQt/output/OpenGLRenderer.cpp
index 10566ae..479cbfd 100644
--- a/AVQt/output/OpenGLRenderer.cpp
+++ b/AVQt/output/OpenGLRenderer.cpp
@@ -210,7 +210,6 @@ namespace AVQt {
         Q_D(AVQt::OpenGLRenderer);
         Q_UNUSED(source)
         Q_UNUSED(duration)
-        Q_UNUSED(pDeviceCtx)
 
         QMutexLocker onFrameLock{&d->m_onFrameMutex};
 
@@ -219,6 +218,7 @@ namespace AVQt {
         if (d->m_firstFrame.compare_exchange_strong(shouldBe, false)) {
             d->m_pVAContext = static_cast<AVVAAPIDeviceContext *>(reinterpret_cast<AVHWDeviceContext *>(pDeviceCtx->data)->hwctx);
             d->m_VADisplay = d->m_pVAContext->display;
+            av_buffer_unref(&pDeviceCtx);
         }
 
         QPair<AVFrame *, int64_t> newFrame;
@@ -270,17 +270,17 @@ namespace AVQt {
                 EGL_NONE
         };
         d->m_EGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+//        if (d->m_EGLDisplay == EGL_NO_DISPLAY) {
+//            qDebug("Could not get default EGL display, connecting to X-Server");
+//            Display *display = XOpenDisplay(nullptr);
+//            if (!display) {
+//                qFatal("Could not get X11 display");
+//            }
+//            d->m_EGLDisplay = eglGetDisplay(static_cast<EGLNativeDisplayType>(display));
         if (d->m_EGLDisplay == EGL_NO_DISPLAY) {
-            qDebug("Could not get default EGL display, connecting to X-Server");
-            Display *display = XOpenDisplay(nullptr);
-            if (!display) {
-                qFatal("Could not get X11 display");
-            }
-            d->m_EGLDisplay = eglGetDisplay(static_cast<EGLNativeDisplayType>(display));
-            if (d->m_EGLDisplay == EGL_NO_DISPLAY) {
-                qFatal("Could not get EGL display: %s", eglErrorString(eglGetError()).c_str());
-            }
+            qFatal("Could not get EGL display: %s", eglErrorString(eglGetError()).c_str());
         }
+//        }
         if (!eglInitialize(d->m_EGLDisplay, nullptr, nullptr)) {
             qFatal("eglInitialize");
         }
@@ -293,18 +293,18 @@ namespace AVQt {
         if (!eglChooseConfig(d->m_EGLDisplay, visual_attr, &cfg, 1, &cfg_count) || (cfg_count < 1)) {
             qFatal("eglChooseConfig: %s", eglErrorString(eglGetError()).c_str());
         }
-        EGLint ctx_attr[] = {
-                EGL_CONTEXT_OPENGL_PROFILE_MASK,
-                EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
-                EGL_CONTEXT_MAJOR_VERSION, 3,
-                EGL_CONTEXT_MINOR_VERSION, 3,
-                EGL_CONTEXT_OPENGL_DEBUG, EGL_TRUE,
-                EGL_NONE
-        };
-        d->m_EGLContext = eglCreateContext(d->m_EGLDisplay, cfg, EGL_NO_CONTEXT, ctx_attr);
-        if (d->m_EGLContext == EGL_NO_CONTEXT) {
-            qFatal("eglCreateContext");
-        }
+//        EGLint ctx_attr[] = {
+//                EGL_CONTEXT_OPENGL_PROFILE_MASK,
+//                EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
+//                EGL_CONTEXT_MAJOR_VERSION, 3,
+//                EGL_CONTEXT_MINOR_VERSION, 3,
+//                EGL_CONTEXT_OPENGL_DEBUG, EGL_TRUE,
+//                EGL_NONE
+//        };
+//        d->m_EGLContext = eglCreateContext(d->m_EGLDisplay, cfg, EGL_NO_CONTEXT, ctx_attr);
+//        if (d->m_EGLContext == EGL_NO_CONTEXT) {
+//            qFatal("eglCreateContext");
+//        }
 
         qDebug("EGL Version: %s", eglQueryString(d->m_EGLDisplay, EGL_VERSION));
 
@@ -635,7 +635,7 @@ namespace AVQt {
 
 #define LAYER i
 #define PLANE 0
-                            const EGLint *img_attr = new EGLint[]{
+                            const EGLint img_attr[]{
                                     EGL_LINUX_DRM_FOURCC_EXT, static_cast<EGLint>(prime.layers[LAYER].drm_format),
                                     EGL_WIDTH, static_cast<EGLint>(prime.width / (i + 1)),
                                     EGL_HEIGHT, static_cast<EGLint>(prime.height / (i + 1)),
@@ -644,6 +644,7 @@ namespace AVQt {
                                     EGL_DMA_BUF_PLANE0_PITCH_EXT, static_cast<EGLint>(prime.layers[LAYER].pitch[PLANE]),
                                     EGL_NONE
                             };
+
 //                            const EGLint *img_attr = new EGLint[]{
 //                                    EGL_WIDTH, vaImage.width,
 //                                    EGL_HEIGHT, vaImage.height,
@@ -848,9 +849,10 @@ namespace AVQt {
 
         QString overlay(position.toString("hh:mm:ss.zzz") + "/" + d->m_duration.toString("hh:mm:ss.zzz"));
         QFontMetrics fm(roboto);
-        p.fillRect(fm.boundingRect(overlay).translated(static_cast<int>(20), static_cast<int>(20)).adjusted(-5, -5, 5, 5),
-                   QColor(0xFF, 0xFF, 0xFF, 0x48));
-        p.drawText(fm.boundingRect(overlay).translated(static_cast<int>(20), static_cast<int>(20)), overlay);
+        QRect overlayRect = fm.boundingRect(overlay);
+        overlayRect.moveTopLeft({20, 20});
+        p.fillRect(overlayRect.adjusted(-5, 0, 5, 0), QColor(0xFF, 0xFF, 0xFF, 0x48));
+        p.drawText(overlayRect, overlay);
         p.end();
         qDebug() << "Paused:" << (d->m_paused.load() ? "true" : "false");
         if (!d->m_paused.load()) {
diff --git a/Player/CMakeLists.txt b/Player/CMakeLists.txt
index b5d6e05..e3fa22b 100644
--- a/Player/CMakeLists.txt
+++ b/Player/CMakeLists.txt
@@ -8,7 +8,8 @@ set(CMAKE_CXX_STANDARD 20)
 find_package(Qt5 COMPONENTS Core Gui Widgets OpenGL Concurrent)
 find_package(OpenAL)
 
-#add_compile_options(-O4)
+#add_compile_options(-fsanitize=address)
+#add_link_options(-fsanitize=address)
 
 add_executable(Player main.cpp)
 
-- 
GitLab