[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdenlive/next] src: Fix crash on quick undo/redo: issue #3240
From:       Vincent PINON <vincent.pinon () laposte ! net>
Date:       2014-04-30 20:27:56
Message-ID: E1Wfb6i-0003AX-IG () scm ! kde ! org
[Download RAW message or body]

Git commit 3278809380b2ab32357ae210665bc89bca2f1010 by Vincent PINON, on behalf of \
Jean-Baptiste Mardelle. Committed on 30/03/2014 at 00:49.
Pushed by vpinon into branch 'next'.

Fix crash on quick undo/redo: issue #3240

Conflicts:
	src/projectlist.cpp

M  +15   -5    src/customtrackview.cpp
M  +2    -1    src/customtrackview.h
M  +3    -2    src/mainwindow.cpp
M  +4    -1    src/projectlist.cpp
M  +34   -13   src/renderer.cpp
M  +1    -0    src/renderer.h

http://commits.kde.org/kdenlive/3278809380b2ab32357ae210665bc89bca2f1010

diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp
index 8786d49..6774090 100644
--- a/src/customtrackview.cpp
+++ b/src/customtrackview.cpp
@@ -4572,6 +4572,11 @@ void CustomTrackView::doGroupClips(QList <ItemInfo> clipInfos, \
QList <ItemInfo>  setDocumentModified();
 }
 
+void CustomTrackView::slotInfoProcessingFinished()
+{
+    m_producerNotReady.wakeAll();
+}
+
 void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo info, \
EffectsList effects, bool overwrite, bool push, bool refresh)  {
     DocClipBase *baseclip = m_document->clipManager()->getClipById(clipId);
@@ -4582,14 +4587,19 @@ void CustomTrackView::addClip(QDomElement xml, const QString \
&clipId, ItemInfo i  
     if (baseclip->getProducer() == NULL) {
         // If the clip has no producer, we must wait until it is created...
-        m_mutex.lock();
+        
         emit displayMessage(i18n("Waiting for clip..."), InformationMessage);
-        emit forceClipProcessing(clipId);
-        qApp->processEvents();
+	m_document->renderer()->forceProcessing(clipId);
+	m_mutex.lock();
         for (int i = 0; i < 10; ++i) {
+	    baseclip = m_document->clipManager()->getClipById(clipId);
+	    if (baseclip == NULL) {
+		emit displayMessage(i18n("Cannot insert clip..."), ErrorMessage);
+		m_mutex.unlock();
+		return;
+	    }
             if (baseclip->getProducer() == NULL) {
-                qApp->processEvents();
-                m_producerNotReady.wait(&m_mutex, 200);
+                m_producerNotReady.wait(&m_mutex);
             } else break;
         }
         if (baseclip->getProducer() == NULL) {
diff --git a/src/customtrackview.h b/src/customtrackview.h
index e7d404f..e5156eb 100644
--- a/src/customtrackview.h
+++ b/src/customtrackview.h
@@ -302,6 +302,8 @@ public slots:
     static void adjustEffectParameters(EffectsParameterList &parameters, \
QDomNodeList params, MltVideoProfile profile, const QString &prefix = QString());  \
/** @brief Move playhead to mouse curser position if defined key is pressed */  void \
slotAlignPlayheadToMousePos(); +    
+    void slotInfoProcessingFinished();
 
 protected:
     virtual void drawBackground(QPainter * painter, const QRectF & rect);
@@ -521,7 +523,6 @@ signals:
     void playMonitor();
     /** @brief Monitor document changes (for example the presence of audio data in \
timeline for export widget.*/  void documentModified();
-    void forceClipProcessing(const QString &);
     void showTrackEffects(int, TrackInfo);
     /** @brief Update the track effect button that shows if a track has effects or \
not.*/  void updateTrackEffectState(int);
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 913f4a8..6a968bd 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -949,7 +949,7 @@ void MainWindow::slotConnectMonitors()
     connect(m_projectMonitor->render, \
SIGNAL(replyGetImage(QString,QString,int,int)), m_projectList, \
                SLOT(slotReplyGetImage(QString,QString,int,int)));
     connect(m_projectMonitor->render, SIGNAL(replyGetImage(QString,QImage)), \
m_projectList, SLOT(slotReplyGetImage(QString,QImage)));  
-    connect(m_projectMonitor->render, \
SIGNAL(replyGetFileProperties(QString,Mlt::Producer*,stringMap,stringMap,bool)), \
m_projectList, SLOT(slotReplyGetFileProperties(QString,Mlt::Producer*,stringMap,stringMap,bool)));
 +    connect(m_projectMonitor->render, \
SIGNAL(replyGetFileProperties(QString,Mlt::Producer*,stringMap,stringMap,bool)), \
m_projectList, SLOT(slotReplyGetFileProperties(QString,Mlt::Producer*,stringMap,stringMap,bool)), \
Qt::DirectConnection);  
     connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(QString,bool)), \
m_projectList, SLOT(slotRemoveInvalidClip(QString,bool)));  
@@ -2722,6 +2722,7 @@ void MainWindow::connectDocument(TrackView *trackView, \
                KdenliveDoc *doc)   //cha
             disconnect(m_projectList, SIGNAL(loadingIsOver()), \
                m_activeTimeline->projectView(), SLOT(slotUpdateAllThumbs()));
             disconnect(m_projectList, SIGNAL(refreshClip(QString)), \
m_activeTimeline->projectView(), SLOT(slotRefreshThumbs(QString)));  \
disconnect(m_projectList, SIGNAL(addMarkers(QString,QList<CommentedTime>)), \
m_activeTimeline->projectView(), \
SLOT(slotAddClipMarker(QString,QList<CommentedTime>))); +	    \
disconnect(m_projectMonitor->render, SIGNAL(infoProcessingFinished()), \
m_activeTimeline->projectView(), SLOT(slotInfoProcessingFinished()));  \
m_effectStack->clear();  }
         //m_activeDocument->setRenderer(NULL);
@@ -2742,7 +2743,7 @@ void MainWindow::connectDocument(TrackView *trackView, \
                KdenliveDoc *doc)   //cha
     connect(trackView, SIGNAL(configTrack(int)), this, SLOT(slotConfigTrack(int)));
     connect(trackView, SIGNAL(updateTracksInfo()), this, \
                SLOT(slotUpdateTrackInfo()));
     connect(trackView, SIGNAL(mousePosition(int)), this, \
                SLOT(slotUpdateMousePosition(int)));
-    connect(trackView->projectView(), SIGNAL(forceClipProcessing(QString)), \
m_projectList, SLOT(slotForceProcessing(QString))); +    \
connect(m_projectMonitor->render, SIGNAL(infoProcessingFinished()), \
trackView->projectView(), SLOT(slotInfoProcessingFinished()), Qt::DirectConnection);  \
                
     connect(trackView->projectView(), \
SIGNAL(importKeyframes(GraphicsRectItem,QString,int)), this, \
SLOT(slotProcessImportKeyframes(GraphicsRectItem,QString,int)));  
diff --git a/src/projectlist.cpp b/src/projectlist.cpp
index 8cca3fa..a199c48 100644
--- a/src/projectlist.cpp
+++ b/src/projectlist.cpp
@@ -1664,7 +1664,7 @@ QString ProjectList::getExtensions()
     mimeTypes << "audio/x-flac" << "audio/x-matroska" << "audio/mp4" << "audio/mpeg" \
<< "audio/x-mp3" << "audio/ogg" << "audio/x-wav" << "audio/x-aiff" << "audio/aiff" << \
"application/ogg" << "application/mxf" << "application/x-shockwave-flash" << \
"audio/ac3";  
     // Image mimes
-    mimeTypes << "image/gif" << "image/jpeg" << "image/png" << "image/x-tga" << \
"image/x-bmp" << "image/svg+xml" << "image/tiff" << "image/x-xcf" << \
"image/x-xcf-gimp" << "image/x-vnd.adobe.photoshop" << "image/x-pcx" << \
"image/x-exr"; +    mimeTypes << "image/gif" << "image/jpeg" << "image/png" << \
"image/x-tga" << "image/x-bmp" << "image/svg+xml" << "image/tiff" << "image/x-xcf" << \
"image/x-xcf-gimp" << "image/x-vnd.adobe.photoshop" << "image/x-pcx" << "image/x-exr" \
<< "image/x-portable-pixmap";  
     QString allExtensions;
     foreach(const QString & mimeType, mimeTypes) {
@@ -2280,6 +2280,9 @@ void ProjectList::slotReplyGetFileProperties(const QString \
&clipId, Mlt::Produce  if (item && producer) {
         monitorItemEditing(false);
         DocClipBase *clip = item->referencedClip();
+        if (clip->getProducer() == NULL && replace) {
+	    replace = false;
+	}
         if (producer->is_valid()) {
             if (clip->isPlaceHolder()) {
                 clip->setValid();
diff --git a/src/renderer.cpp b/src/renderer.cpp
index 69e40de..c85cdd4 100644
--- a/src/renderer.cpp
+++ b/src/renderer.cpp
@@ -661,20 +661,42 @@ void Render::getFileProperties(const QDomElement &xml, const \
QString &clipId, in  
 void Render::forceProcessing(const QString &id)
 {
-    if (m_processingClipId.contains(id)) return;
-    QMutexLocker lock(&m_infoMutex);
-    for (int i = 0; i < m_requestList.count(); ++i) {
-        requestClipInfo info = m_requestList.at(i);
-        if (info.clipId == id) {
-            if (i == 0) {
-                break;
-            } else {
-                m_requestList.removeAt(i);
-                m_requestList.prepend(info);
-                break;
-            }
+    // Make sure we load the clip producer now so that we can use it in timeline
+    QList <requestClipInfo> requestListCopy;
+    if (m_processingClipId.contains(id)) {
+	m_infoMutex.lock();
+	requestListCopy = m_requestList;
+	m_requestList.clear();
+	m_infoMutex.unlock();
+	m_infoThread.waitForFinished();
+	emit infoProcessingFinished();
+    } else {
+	m_infoMutex.lock();
+	for (int i = 0; i < m_requestList.count(); ++i) {
+	    requestClipInfo info = m_requestList.at(i);
+	    if (info.clipId == id) {
+		m_requestList.removeAt(i);
+		requestListCopy = m_requestList;
+		m_requestList.clear();
+		m_requestList.append(info);
+		break;
+	    }
         }
+        m_infoMutex.unlock();
+	if (!m_infoThread.isRunning()) {
+	    m_infoThread = QtConcurrent::run(this, &Render::processFileProperties);
+	}
+	m_infoThread.waitForFinished();
+	emit infoProcessingFinished();
+    }
+    
+    m_infoMutex.lock();
+    m_requestList.append(requestListCopy);
+    m_infoMutex.unlock();
+    if (!m_infoThread.isRunning()) {
+        m_infoThread = QtConcurrent::run(this, &Render::processFileProperties);
     }
+    
 }
 
 int Render::processingItems()
@@ -781,7 +803,6 @@ void Render::processFileProperties()
                 continue;
             }
         }
-
         if (info.xml.hasAttribute("force_aspect_ratio")) {
             double aspect = info.xml.attribute("force_aspect_ratio").toDouble();
             if (aspect > 0) producer->set("force_aspect_ratio", aspect);
diff --git a/src/renderer.h b/src/renderer.h
index cf36dae..e8c0d46 100644
--- a/src/renderer.h
+++ b/src/renderer.h
@@ -483,6 +483,7 @@ signals:
     /** @brief Activate current monitor. */
     void activateMonitor(Kdenlive::MonitorId);
     void mltFrameReceived(Mlt::Frame *);
+    void infoProcessingFinished();
 
 public slots:
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic