]> git.sesse.net Git - kdenlive/commitdiff
Fetch timeline thumbnails in a different thread to improve workflow
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 26 Oct 2009 19:01:17 +0000 (19:01 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 26 Oct 2009 19:01:17 +0000 (19:01 +0000)
svn path=/trunk/kdenlive/; revision=4063

src/clipitem.cpp
src/clipitem.h
src/kthumb.cpp
src/kthumb.h

index 955878b4f3e9e76d5722e1039a5cd0b0d9c77125..92f9b565907c8a566b6c2225814b77624cd5e268 100644 (file)
@@ -92,7 +92,7 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, i
         connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(extractImage(int, int)));
         //connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(getVideoThumbs(int, int)));
 
-        connect(clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
+        connect(clip->thumbProducer(), SIGNAL(thumbReady(int, QImage)), this, SLOT(slotThumbReady(int, QImage)));
         connect(clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
         if (generateThumbs) QTimer::singleShot(200, this, SLOT(slotFetchThumbs()));
 
@@ -108,7 +108,7 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, i
         m_baseColor = QColor(141, 166, 215);
         if (m_clipType == TEXT) {
             connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(extractImage(int, int)));
-            connect(clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
+            connect(clip->thumbProducer(), SIGNAL(thumbReady(int, QImage)), this, SLOT(slotThumbReady(int, QImage)));
         }
         //m_startPix = KThumb::getImage(KUrl(clip->getProperty("resource")), (int)(KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio()), KdenliveSettings::trackheight());
     } else if (m_clipType == AUDIO) {
@@ -122,7 +122,7 @@ ClipItem::~ClipItem()
 {
     blockSignals(true);
     if (m_clipType == VIDEO || m_clipType == AV || m_clipType == SLIDESHOW || m_clipType == PLAYLIST) {
-        disconnect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
+        disconnect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QImage)), this, SLOT(slotThumbReady(int, QImage)));
         disconnect(m_clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
     }
     delete m_timeLine;
@@ -543,10 +543,11 @@ void ClipItem::slotSetEndThumb(QImage img)
     }
 }
 
-void ClipItem::slotThumbReady(int frame, QPixmap pix)
+void ClipItem::slotThumbReady(int frame, QImage img)
 {
     if (scene() == NULL) return;
     QRectF r = boundingRect();
+    QPixmap pix = QPixmap::fromImage(img);
     double width = pix.width() / projectScene()->scale().x();
     if (m_startThumbRequested && frame == m_speedIndependantInfo.cropStart.frames(m_fps)) {
         m_startPix = pix;
index 70b1aee6cdd90fd3896f1f835b11fe1ace2cf184..7be82c5a7ab9bdd9a368e55a22866e8e8b4ca55c 100644 (file)
@@ -168,7 +168,7 @@ private slots:
     void animate(qreal value);
     void slotSetStartThumb(QImage img);
     void slotSetEndThumb(QImage img);
-    void slotThumbReady(int frame, QPixmap pix);
+    void slotThumbReady(int frame, QImage img);
 
 public slots:
     void slotFetchThumbs();
index 8d15736749f784f9d763652812faa4e89c48723f..d9a38f3124e08b48b6ec19ec3d9252116210ecb5 100644 (file)
@@ -37,6 +37,7 @@
 #include <qxml.h>
 #include <QImage>
 #include <QApplication>
+#include <QtConcurrentRun>
 
 void MyThread::init(KUrl url, QString target, double frame, double frameLength, int frequency, int channels, int arrayWidth)
 {
@@ -115,6 +116,7 @@ void MyThread::run()
     } else emit audioThumbOver();
 }
 
+
 KThumb::KThumb(ClipManager *clipManager, KUrl url, const QString &id, const QString &hash, QObject * parent, const char */*name*/) :
         QObject(parent),
         m_audioThumbProducer(),
@@ -128,16 +130,17 @@ KThumb::KThumb(ClipManager *clipManager, KUrl url, const QString &id, const QStr
     m_thumbFile = clipManager->projectFolder() + "/thumbs/" + hash + ".thumb";
     connect(&m_audioThumbProducer, SIGNAL(audioThumbProgress(const int)), this, SLOT(slotAudioThumbProgress(const int)));
     connect(&m_audioThumbProducer, SIGNAL(audioThumbOver()), this, SLOT(slotAudioThumbOver()));
-
 }
 
 KThumb::~KThumb()
 {
+    m_requestedThumbs.clear();
     if (m_audioThumbProducer.isRunning()) {
         m_audioThumbProducer.stop_me = true;
         m_audioThumbProducer.wait();
         slotAudioThumbOver();
     }
+    m_future.waitForFinished();
 }
 
 void KThumb::setProducer(Mlt::Producer *producer)
@@ -183,19 +186,23 @@ QPixmap KThumb::getImage(KUrl url, int width, int height)
 
 void KThumb::extractImage(int frame, int frame2)
 {
-    // kDebug() << "//extract thumb: " << frame << ", " << frame2;
     if (!KdenliveSettings::videothumbnails() || m_producer == NULL) return;
+    if (frame != -1 && !m_requestedThumbs.contains(frame)) m_requestedThumbs.append(frame);
+    if (frame2 != -1 && !m_requestedThumbs.contains(frame2)) m_requestedThumbs.append(frame2);
+    if (!m_future.isRunning()) m_future = QtConcurrent::run(this, &KThumb::doGetThumbs);
+}
 
+void KThumb::doGetThumbs()
+{
     const int twidth = (int)(KdenliveSettings::trackheight() * m_dar);
     const int theight = KdenliveSettings::trackheight();
 
-    if (frame != -1) {
-        QPixmap pix = QPixmap::fromImage(getFrame(m_producer, frame, twidth, theight));
-        emit thumbReady(frame, pix);
-    }
-    if (frame2 != -1) {
-        QPixmap pix = QPixmap::fromImage(getFrame(m_producer, frame2, twidth, theight));
-        emit thumbReady(frame2, pix);
+    while (!m_requestedThumbs.isEmpty()) {
+        int frame = m_requestedThumbs.takeFirst();
+        if (frame != -1) {
+            QImage img = getFrame(m_producer, frame, twidth, theight);
+            emit thumbReady(frame, img);
+        }
     }
 }
 
index eb3f61a1373965ee187b836b3aaae8d56ea10e7d..e2a9594de277e51a45c1c9fff9f3f2b522318968 100644 (file)
@@ -23,6 +23,7 @@
 #include <QThread>
 #include <QMutex>
 #include <QDomElement>
+#include <QFuture>
 
 #include <KUrl>
 
@@ -114,9 +115,12 @@ private:
     Mlt::Producer *m_producer;
     ClipManager *m_clipManager;
     QString m_id;
+    QList <int> m_requestedThumbs;
+    QFuture<void> m_future;
+    void doGetThumbs();
 
 signals:
-    void thumbReady(int, QPixmap);
+    void thumbReady(int, QImage);
     void mainThumbReady(const QString &, QPixmap);
     void audioThumbReady(QMap <int, QMap <int, QByteArray> >);
 };