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()));
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) {
{
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;
}
}
-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;
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();
#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)
{
} else emit audioThumbOver();
}
+
KThumb::KThumb(ClipManager *clipManager, KUrl url, const QString &id, const QString &hash, QObject * parent, const char */*name*/) :
QObject(parent),
m_audioThumbProducer(),
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)
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);
+ }
}
}
#include <QThread>
#include <QMutex>
#include <QDomElement>
+#include <QFuture>
#include <KUrl>
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> >);
};