#include <QPixmap>
#include <QFile>
-#include <QThread>
-#include <QMutex>
#include <QDomElement>
+#include <QFuture>
#include <KUrl>
+#include <kdeversion.h>
#include <mlt++/Mlt.h>
/**KRender encapsulates the client side of the interface to a renderer.
From Kdenlive's point of view, you treat the KRender object as the
renderer, and simply use it as if it was local. Calls are asyncrhonous -
-you send a call out, and then recieve the return value through the
+you send a call out, and then receive the return value through the
relevant signal that get's emitted once the call completes.
*@author Jason Wood
*/
-namespace Mlt {
-class Miracle;
-class Consumer;
+namespace Mlt
+{
class Producer;
class Frame;
-class Profile;
-};
+}
class ClipManager;
+typedef QMap <int, QMap <int, QByteArray> > audioByteArray;
-
-class MyThread : public QThread {
-
-public:
- virtual void run();
- void init(QObject *parent, KUrl url, QString target, double frame, double frameLength, int frequency, int channels, int arrayWidth);
- bool isWorking();
- bool stop_me;
-
-private:
- QFile f;
- KUrl m_url;
- double m_frame;
- double m_frameLength;
- int m_frequency;
- int m_channels;
- int m_arrayWidth;
- bool m_isWorking;
- QObject *m_parent;
-};
-
-
-class ThumbThread : public QThread {
- Q_OBJECT
+class KThumb: public QObject
+{
+ Q_OBJECT
public:
- virtual void run();
- void init(QObject *parent, Mlt::Producer *prod, int width, int height);
- void setThumbFrames(Mlt::Producer *prod, int frame1, int frame2);
- bool isWorking();
- bool stop_me;
-
-private:
- int m_width;
- int m_height;
- int m_frame1;
- int m_frame2;
- Mlt::Producer *m_prod;
- bool m_isWorking;
- QObject *m_parent;
- //QMutex mutex;
-signals:
- void gotStartThumb(QImage);
- void gotEndThumb(QImage);
-
-};
-
-class KThumb: public QObject {
-Q_OBJECT public:
-
-
- KThumb(ClipManager *clipManager, KUrl url, QObject * parent = 0, const char *name = 0);
+ explicit KThumb(ClipManager *clipManager, const KUrl &url, const QString &id, const QString &hash, QObject * parent = 0);
~KThumb();
void setProducer(Mlt::Producer *producer);
+ bool hasProducer() const;
+ void clearProducer();
+ void updateThumbUrl(const QString &hash);
+ void extractImage(const QList<int> &frames);
+ QImage extractImage(int frame, int width, int height);
+#if KDE_IS_VERSION(4,5,0)
+ /** @brief Request thumbnails for the frame range. */
+ void queryIntraThumbs(const QList <int> &missingFrames);
+ /** @brief Query cached thumbnail. */
+ QImage findCachedThumb(const QString &path);
+#endif
+ void getThumb(int frame);
+ void getGenericThumb(int frame, int height, int type);
public slots:
- void extractImage(int frame, int frame2);
- QPixmap extractImage(int frame, int width, int height);
- void updateClipUrl(KUrl url);
- static QPixmap getImage(KUrl url, int width, int height);
+ void updateClipUrl(const KUrl &url, const QString &hash);
+ void slotCreateAudioThumbs();
+
+public:
+ static QPixmap getImage(const KUrl &url, int width, int height);
// static QPixmap getImage(QDomElement xml, int frame, int width, int height);
/* void getImage(KUrl url, int frame, int width, int height);
void getThumbs(KUrl url, int startframe, int endframe, int width, int height);*/
- void stopAudioThumbs();
- void removeAudioThumb();
- void getAudioThumbs(int channel, double frame, double frameLength, int arrayWidth);
- static QPixmap getImage(KUrl url, int frame, int width, int height);
- static QPixmap getFrame(Mlt::Producer *producer, int framepos, int width, int height);
-
-protected:
- virtual void customEvent(QEvent * event);
+ static QPixmap getImage(const KUrl& url, int frame, 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
+ * */
+ static uint imageVariance(const QImage &image);
+
+private slots:
+#if KDE_IS_VERSION(4,5,0)
+ /** @brief Fetch all requested frames. */
+ void slotGetIntraThumbs();
+#endif
private:
- MyThread audioThumbProducer;
KUrl m_url;
QString m_thumbFile;
double m_dar;
+ double m_ratio;
Mlt::Producer *m_producer;
ClipManager *m_clipManager;
+ QString m_id;
+ /** @brief Controls the intra frames thumbnails process (cached thumbnails). */
+ QFuture<void> m_intra;
+ /** @brief List of frame numbers from which we want to extract thumbnails. */
+ QList <int> m_intraFramesQueue;
+ QMutex m_mutex;
+ QImage getProducerFrame(int framepos, int frameWidth, int displayWidth, int height);
signals:
- void thumbReady(int frame, QPixmap pm);
- void audioThumbReady(QMap <int, QMap <int, QByteArray> >);
+ void thumbReady(int, const QImage&);
+ void mainThumbReady(const QString &, const QPixmap&);
+ void audioThumbReady(const audioByteArray&);
+ /** @brief We have finished caching all requested thumbs. */
+ void thumbsCached();
};
#endif