]> git.sesse.net Git - kdenlive/blobdiff - src/kthumb.cpp
Various changes for getting an OpenGL context (almost) everywhere it is needed.
[kdenlive] / src / kthumb.cpp
index 686b7a1a4dd3c199e8331a6148949e1b2eea7eb5..5a81f5481ad789e159b7fdb8ce449faf0ece0773 100644 (file)
@@ -40,6 +40,7 @@
 #include <QtConcurrentRun>
 #include <QVarLengthArray>
 #include <QPainter>
+#include <QGLWidget>
 
 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";
@@ -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);
@@ -372,6 +377,10 @@ void KThumb::queryIntraThumbs(const QList <int> &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);