From 18e0d5bf09dc616c172876ad4f78615b2fdf4339 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Thu, 22 Dec 2011 01:08:20 +0100 Subject: [PATCH] Fix small memleak in video capture --- src/mltdevicecapture.cpp | 13 +++++++++---- src/mltdevicecapture.h | 8 ++------ src/recmonitor.cpp | 6 +++++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/mltdevicecapture.cpp b/src/mltdevicecapture.cpp index d58b3e05..8414b074 100644 --- a/src/mltdevicecapture.cpp +++ b/src/mltdevicecapture.cpp @@ -88,6 +88,7 @@ MltDeviceCapture::MltDeviceCapture(QString profile, VideoPreviewContainer *surfa m_mltConsumer(NULL), m_mltProducer(NULL), m_mltProfile(NULL), + m_showFrameEvent(NULL), m_droppedFrames(0), m_livePreview(KdenliveSettings::recording_preview()), m_captureDisplayWidget(surface), @@ -133,11 +134,11 @@ void MltDeviceCapture::buildConsumer(const QString &profileName) m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_audio"); m_mltConsumer->set("preview_off", 1); m_mltConsumer->set("preview_format", mlt_image_rgb24); - m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_gl_frame_show); + m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_gl_frame_show); } else { m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_preview"); m_mltConsumer->set("window_id", m_winid); - m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) rec_consumer_frame_preview); + m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) rec_consumer_frame_preview); } //m_mltConsumer->set("resize", 1); //m_mltConsumer->set("terminate_on_pause", 1); @@ -167,6 +168,9 @@ void MltDeviceCapture::stop() disconnect(this, SIGNAL(imageReady(QImage)), this, SIGNAL(frameUpdated(QImage))); m_captureDisplayWidget->stop(); + if (m_showFrameEvent) delete m_showFrameEvent; + m_showFrameEvent = NULL; + if (m_mltConsumer) { m_mltConsumer->set("refresh", 0); m_mltConsumer->stop(); @@ -417,8 +421,7 @@ bool MltDeviceCapture::slotStartCapture(const QString ¶ms, const QString &pa return false; } - // FIXME: the event object returned by the listen gets leaked... - if (m_livePreview < 2) m_mltConsumer->listen("consumer-frame-render", this, (mlt_listener) rec_consumer_frame_show); + if (m_livePreview < 2) m_showFrameEvent = m_mltConsumer->listen("consumer-frame-render", this, (mlt_listener) rec_consumer_frame_show); tmp = qstrdup(playlist.toUtf8().constData()); if (xmlPlaylist) { // create an xml producer @@ -437,6 +440,8 @@ bool MltDeviceCapture::slotStartCapture(const QString ¶ms, const QString &pa m_mltConsumer->connect(*m_mltProducer); if (m_mltConsumer->start() == -1) { + if (m_showFrameEvent) delete m_showFrameEvent; + m_showFrameEvent = NULL; delete m_mltConsumer; m_mltConsumer = NULL; return 0; diff --git a/src/mltdevicecapture.h b/src/mltdevicecapture.h index e25de57d..77d285c4 100644 --- a/src/mltdevicecapture.h +++ b/src/mltdevicecapture.h @@ -34,15 +34,10 @@ namespace Mlt { class Consumer; -class Playlist; -class Tractor; -class Transition; class Frame; -class Field; +class Event; class Producer; -class Filter; class Profile; -class Service; }; class MltDeviceCapture: public AbstractRender @@ -105,6 +100,7 @@ private: Mlt::Consumer * m_mltConsumer; Mlt::Producer * m_mltProducer; Mlt::Profile *m_mltProfile; + Mlt::Event *m_showFrameEvent; QString m_activeProfile; int m_droppedFrames; /** @brief When true, images will be displayed on monitor while capturing. */ diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index 298080af..42e1f3a8 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -578,6 +578,7 @@ void RecMonitor::slotRecord() QString playlist; QString v4lparameters; MltVideoProfile profile; + bool showPreview; QString capturename = KdenliveSettings::dvgrabfilename(); if (capturename.isEmpty()) capturename = "capture"; @@ -622,8 +623,11 @@ void RecMonitor::slotRecord() v4lparameters = QString(v4lparameters.section("acodec", 0, 0) + "an=1 " + endParam).simplified(); } } + + showPreview = m_previewSettings->currentItem(); + if (!rec_video->isChecked()) showPreview = 2; - if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, m_previewSettings->currentItem())) { + if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, showPreview)) { m_videoBox->setHidden(false); m_isCapturing = true; m_recAction->setEnabled(false); -- 2.39.2