[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 ¶meters, \
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