From d4828ad52cd3613bfb386d48b02646335d1a2a0f Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 26 Oct 2009 19:01:17 +0000 Subject: [PATCH] Fetch timeline thumbnails in a different thread to improve workflow svn path=/trunk/kdenlive/; revision=4063 --- src/clipitem.cpp | 9 +++++---- src/clipitem.h | 2 +- src/kthumb.cpp | 25 ++++++++++++++++--------- src/kthumb.h | 6 +++++- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/clipitem.cpp b/src/clipitem.cpp index 955878b4..92f9b565 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -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; diff --git a/src/clipitem.h b/src/clipitem.h index 70b1aee6..7be82c5a 100644 --- a/src/clipitem.h +++ b/src/clipitem.h @@ -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(); diff --git a/src/kthumb.cpp b/src/kthumb.cpp index 8d157367..d9a38f31 100644 --- a/src/kthumb.cpp +++ b/src/kthumb.cpp @@ -37,6 +37,7 @@ #include #include #include +#include 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); + } } } diff --git a/src/kthumb.h b/src/kthumb.h index eb3f61a1..e2a9594d 100644 --- a/src/kthumb.h +++ b/src/kthumb.h @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -114,9 +115,12 @@ private: Mlt::Producer *m_producer; ClipManager *m_clipManager; QString m_id; + QList m_requestedThumbs; + QFuture m_future; + void doGetThumbs(); signals: - void thumbReady(int, QPixmap); + void thumbReady(int, QImage); void mainThumbReady(const QString &, QPixmap); void audioThumbReady(QMap >); }; -- 2.39.2