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