X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkthumb.cpp;h=c8971af46b0fb7a2739656843cc3d8bace8e338d;hb=4e1438fe486d77af1afb75825f3aa1f766715e6f;hp=8d15736749f784f9d763652812faa4e89c48723f;hpb=20355351f224646a58f0fc0baecaa647d0f765b3;p=kdenlive diff --git a/src/kthumb.cpp b/src/kthumb.cpp index 8d157367..c8971af4 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,20 +130,23 @@ 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) { + m_requestedThumbs.clear(); + m_future.waitForFinished(); m_producer = producer; // FIXME: the profile() call leaks an object, but trying to free // it leads to a double-free in Profile::~Profile() @@ -183,19 +188,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); +} - const int twidth = (int)(KdenliveSettings::trackheight() * m_dar); +void KThumb::doGetThumbs() +{ const int theight = KdenliveSettings::trackheight(); + const int twidth = FRAME_SIZE;//(int)(theight * m_dar + 0.5); - 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); + } } } @@ -395,7 +404,7 @@ void KThumb::getAudioThumbs(int channel, double frame, double frameLength, int a if (m_audioThumbProducer.isRunning()) return; m_audioThumbProducer.init(m_url, m_thumbFile, frame, frameLength, m_frequency, m_channels, arrayWidth); m_audioThumbProducer.start(QThread::LowestPriority); - kDebug() << "STARTING GENERATE THMB FOR: " << m_url << " ................................"; + // kDebug() << "STARTING GENERATE THMB FOR: " <