]> git.sesse.net Git - kdenlive/blobdiff - src/kthumb.h
Fix some more threading crashes, almost there :)
[kdenlive] / src / kthumb.h
index 598cda56e92e0752da4450894d68404123fee1e2..f90051d7b43a8ea81ac91397fa7c325f41c38b70 100644 (file)
@@ -24,6 +24,7 @@
 #include <QFuture>
 
 #include <KUrl>
+#include <kdeversion.h>
 
 #include <mlt++/Mlt.h>
 
@@ -48,6 +49,8 @@ class Profile;
 
 class ClipManager;
 
+typedef QMap <int, QMap <int, QByteArray> > audioByteArray;
+
 class KThumb: public QObject
 {
 Q_OBJECT public:
@@ -60,10 +63,16 @@ Q_OBJECT public:
     bool hasProducer() const;
     void clearProducer();
     void updateThumbUrl(const QString &hash);
-
-public slots:
     void extractImage(int frame, int frame2);
     QPixmap extractImage(int frame, int width, int height);
+#if KDE_IS_VERSION(4,5,0)
+    /** @brief Request thumbnails for the frame range. */
+    void queryIntraThumbs(QList <int> missingFrames);
+    /** @brief Query cached thumbnail. */
+    QImage findCachedThumb(const QString path);
+#endif
+
+public slots:
     void updateClipUrl(KUrl url, const QString &hash);
     static QPixmap getImage(KUrl url, int width, int height);
 //    static QPixmap getImage(QDomElement xml, int frame, int width, int height);
@@ -73,7 +82,8 @@ public slots:
     void removeAudioThumb();
     void getAudioThumbs(int channel, double frame, double frameLength, int arrayWidth);
     static QPixmap getImage(KUrl url, int frame, int width, int height);
-    static QImage getFrame(Mlt::Producer *producer, int framepos, int width, int height);
+    static QImage getFrame(Mlt::Producer *producer, int framepos, int frameWidth, int displayWidth, int height);
+    static QImage getFrame(Mlt::Frame *frame, int frameWidth, int displayWidth, int height);
     /** @brief Calculates image variance, useful to know if a thumbnail is interesting. 
      *  @return an integer between 0 and 100. 0 means no variance, eg. black image while bigger values mean contrasted image
      * */
@@ -82,17 +92,25 @@ public slots:
 private slots:
     void slotAudioThumbOver();
     void slotCreateAudioThumbs();
+#if KDE_IS_VERSION(4,5,0)
+    /** @brief Fetch all requested frames. */ 
+    void slotGetIntraThumbs();
+#endif
 
 private:
     QFuture<void> m_audioThumbProducer;
     KUrl m_url;
     QString m_thumbFile;
     double m_dar;
+    double m_ratio;
     Mlt::Producer *m_producer;
     ClipManager *m_clipManager;
     QString m_id;
     QList <int> m_requestedThumbs;
+    /** @brief Controls the thumbnails process. */
     QFuture<void> m_future;
+    /** @brief Controls the intra frames thumbnails process (cached thumbnails). */
+    QFuture<void> m_intra;
     QFile m_audioThumbFile;
     bool m_stopAudioThumbs;
     double m_frame;
@@ -100,12 +118,19 @@ private:
     int m_frequency;
     int m_channels;
     int m_arrayWidth;
+    /** @brief List of frame numbers from which we want to extract thumbnails. */
+    QList <int> m_intraFramesQueue;
+    QMutex m_mutex;
+    QMutex m_listMutex;
     void doGetThumbs();
+    QImage getProducerFrame(int framepos, int frameWidth, int displayWidth, int height);
 
 signals:
     void thumbReady(int, QImage);
     void mainThumbReady(const QString &, QPixmap);
-    void audioThumbReady(QMap <int, QMap <int, QByteArray> >);
+    void audioThumbReady(const audioByteArray&);
+    /** @brief We have finished caching all requested thumbs. */
+    void thumbsCached();
 };
 
 #endif