X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkthumb.cpp;h=5a81f5481ad789e159b7fdb8ce449faf0ece0773;hb=a3eee7be24126f5a3458d488f44cd61c66135e17;hp=ed979d390e4bab5622807489e7fc3ca20505d1d1;hpb=466ea658cfea6deb980dbc88cba17474c182422c;p=kdenlive diff --git a/src/kthumb.cpp b/src/kthumb.cpp index ed979d39..5a81f548 100644 --- a/src/kthumb.cpp +++ b/src/kthumb.cpp @@ -40,6 +40,7 @@ #include #include #include +#include KThumb::KThumb(ClipManager *clipManager, const KUrl &url, const QString &id, const QString &hash, QObject * parent) : QObject(parent), @@ -93,7 +94,7 @@ void KThumb::updateThumbUrl(const QString &hash) m_thumbFile = m_clipManager->projectFolder() + "/thumbs/" + hash + ".thumb"; } -void KThumb::updateClipUrl(KUrl url, const QString &hash) +void KThumb::updateClipUrl(const KUrl &url, const QString &hash) { m_url = url; m_thumbFile = m_clipManager->projectFolder() + "/thumbs/" + hash + ".thumb"; @@ -106,7 +107,7 @@ QPixmap KThumb::getImage(const KUrl& url, int width, int height) return getImage(url, 0, width, height); } -void KThumb::extractImage(QList frames) +void KThumb::extractImage(const QList &frames) { if (!KdenliveSettings::videothumbnails() || m_producer == NULL) return; m_clipManager->slotRequestThumbs(m_id, frames); @@ -196,7 +197,7 @@ QImage KThumb::getFrame(Mlt::Producer *producer, int framepos, int frameWidth, i frame->set("rescale.interp", "nearest"); frame->set("deinterlace_method", "onefield"); frame->set("top_field_first", -1 ); - QImage p = getFrame(frame, frameWidth, displayWidth, height); + const QImage p = getFrame(frame, frameWidth, displayWidth, height); delete frame; return p; } @@ -218,6 +219,10 @@ QImage KThumb::getFrame(Mlt::Frame *frame, int frameWidth, int displayWidth, int if (ow % 2 == 1) ow++; QImage image(ow, oh, QImage::Format_ARGB32_Premultiplied); const uchar* imagedata = frame->get_image(format, ow, oh); + if (imagedata == NULL) { + p.fill(QColor(Qt::red).rgb()); + return p; + } memcpy(image.bits(), imagedata, ow * oh * 4);//.byteCount()); //const uchar* imagedata = frame->get_image(format, ow, oh); @@ -246,7 +251,7 @@ QImage KThumb::getFrame(Mlt::Frame *frame, int frameWidth, int displayWidth, int } //static -uint KThumb::imageVariance(QImage image ) +uint KThumb::imageVariance(const QImage &image ) { uint delta = 0; uint avg = 0; @@ -255,7 +260,7 @@ uint KThumb::imageVariance(QImage image ) QVarLengthArray pivot(STEPS); const uchar *bits=image.bits(); // First pass: get pivots and taking average - for( uint i=0; i= 0x040700 avg+=pivot.at(i); @@ -266,7 +271,7 @@ uint KThumb::imageVariance(QImage image ) if (STEPS) avg=avg/STEPS; // Second Step: calculate delta (average?) - for (uint i=0; i= 0x040700 int curdelta=abs(int(avg - pivot.at(i))); @@ -359,7 +364,7 @@ void KThumb::slotCreateAudioThumbs() } #if KDE_IS_VERSION(4,5,0) -void KThumb::queryIntraThumbs(QList missingFrames) +void KThumb::queryIntraThumbs(const QList &missingFrames) { foreach (int i, missingFrames) { if (!m_intraFramesQueue.contains(i)) m_intraFramesQueue.append(i); @@ -372,6 +377,10 @@ void KThumb::queryIntraThumbs(QList missingFrames) void KThumb::slotGetIntraThumbs() { + // We are in a new thread, so we need a new OpenGL context for the remainder of the function. + QGLWidget ctx(0, m_clipManager->getMainContext()); + ctx.makeCurrent(); + const int theight = KdenliveSettings::trackheight(); const int frameWidth = (int)(theight * m_ratio + 0.5); const int displayWidth = (int)(theight * m_dar + 0.5);