]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.h
Rewrote thread handling, should improve ui responsiveness
[kdenlive] / src / renderer.h
index b3abe536984bcc3bdae2a381789d0f2327075d11..afbf50eb78164ea860f0bdc7fec0e201efc02ad1 100644 (file)
@@ -41,7 +41,8 @@
 #include <qmap.h>
 #include <QList>
 #include <QEvent>
-
+#include <QMutex>
+#include <QFuture>
 
 class QTimer;
 class QPixmap;
@@ -60,6 +61,13 @@ class Profile;
 class Service;
 };
 
+struct requestClipInfo {
+    QDomElement xml;
+    QString clipId;
+    int imageHeight;
+    bool replaceProducer;
+};
+
 class MltErrorEvent : public QEvent
 {
 public:
@@ -84,7 +92,7 @@ Q_OBJECT public:
      *  @param rendererName A unique identifier for this renderer
      *  @param winid The parent widget identifier (required for SDL display). Set to 0 for OpenGL rendering
      *  @param profile The MLT profile used for the renderer (default one will be used if empty). */
-    Render(const QString & rendererName, int winid, QString profile = QString(), QWidget *parent = 0);
+    Render(const QString &rendererName, int winid, QString profile = QString(), QWidget *parent = 0);
 
     /** @brief Destroy the MLT Renderer. */
     virtual ~Render();
@@ -122,12 +130,12 @@ Q_OBJECT public:
      * The speed is relative to normal playback, e.g. 1.0 is normal speed, 0.0
      * is paused, -1.0 means play backwards. It does not specify start/stop */
     void play(double speed);
-    void switchPlay();
+    void switchPlay(bool play);
     void pause();
 
     /** @brief Stops playing.
      * @param startTime time to seek to */
-    void stop(const GenTime & startTime);
+    void stop(const GenTime &startTime);
     int volume() const;
 
     QImage extractFrame(int frame_position, QString path = QString(), int width = -1, int height = -1);
@@ -166,7 +174,11 @@ Q_OBJECT public:
 
     /** @brief Turns on or off on screen display. */
     void refreshDisplay();
-    int resetProfile(const QString profileName);
+    /** @brief Change the Mlt PROFILE
+     * @param profileName The MLT profile name
+     * @param dropSceneList If true, the current playlist will be deleted
+     * . */
+    int resetProfile(const QString& profileName, bool dropSceneList = false);
     double fps() const;
 
     /** @brief Returns the width of a frame for this profile. */
@@ -188,8 +200,8 @@ Q_OBJECT public:
     int mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod, bool overwrite = false, bool push = false);
     bool mltUpdateClip(ItemInfo info, QDomElement element, Mlt::Producer *prod);
     void mltCutClip(int track, GenTime position);
-    void mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int> trackTransitionStartList, int track, const GenTime duration, const GenTime timeOffset);
-    int mltGetSpaceLength(const GenTime pos, int track, bool fromBlankStart);
+    void mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int> trackTransitionStartList, int track, const GenTime &duration, const GenTime &timeOffset);
+    int mltGetSpaceLength(const GenTime &pos, int track, bool fromBlankStart);
 
     /** @brief Returns the duration/length of @param track as reported by the track producer. */
     int mltTrackDuration(int track);
@@ -202,8 +214,8 @@ Q_OBJECT public:
     bool mltRemoveClip(int track, GenTime position);
 
     /** @brief Deletes an effect from a clip in MLT's playlist. */
-    bool mltRemoveEffect(int track, GenTime position, QString index, bool updateIndex, bool doRefresh = true);
-    bool mltRemoveTrackEffect(int track, QString index, bool updateIndex);
+    bool mltRemoveEffect(int track, GenTime position, int index, bool updateIndex, bool doRefresh = true);
+    bool mltRemoveTrackEffect(int track, int index, bool updateIndex);
 
     /** @brief Adds an effect to a clip in MLT's playlist. */
     bool mltAddEffect(int track, GenTime position, EffectsParameterList params, bool doRefresh = true);
@@ -266,6 +278,10 @@ Q_OBJECT public:
 
     /** @brief Returns a pointer to the main producer. */
     Mlt::Producer *getProducer();
+    /** @brief Returns the number of clips to process (When requesting clip info). */
+    int processingItems() const;
+    /** @brief Force processing of clip with selected id. */
+    void forceProcessing(const QString &id);
 
 private:
 
@@ -297,10 +313,16 @@ private:
     QString m_activeProfile;
 
     QTimer *m_osdTimer;
+    QMutex m_mutex;
+    QMutex m_infoMutex;
 
     /** @brief A human-readable description of this renderer. */
     int m_winid;
 
+    QLocale m_locale;
+    QFuture <void> m_infoThread;
+    QList <requestClipInfo> m_requestList;
+
     void closeMlt();
     void mltCheckLength(Mlt::Tractor *tractor);
     void mltPasteEffects(Mlt::Producer *source, Mlt::Producer *dest);
@@ -309,7 +331,7 @@ private:
 
     /** @brief Build the MLT Consumer object with initial settings.
      *  @param profileName The MLT profile to use for the consumer */
-    void buildConsumer(const QString profileName);
+    void buildConsumer(const QString& profileName);
     void resetZoneMode();
     void fillSlowMotionProducers();
     /** @brief Get the track number of the lowest audible (non muted) audio track
@@ -330,10 +352,11 @@ private slots:
 signals:
 
     /** @brief The renderer received a reply to a getFileProperties request. */
-    void replyGetFileProperties(const QString &clipId, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool, bool);
+    void replyGetFileProperties(const QString &clipId, Mlt::Producer*, const stringMap &, const stringMap &, bool replaceProducer, bool refreshThumbnail = false);
 
     /** @brief The renderer received a reply to a getImage request. */
-    void replyGetImage(const QString &, const QPixmap &);
+    void replyGetImage(const QString &, const QString &, int, int);
+    void replyGetImage(const QString &, const QImage &);
 
     /** @brief The renderer stopped, either playing or rendering. */
     void stopped();
@@ -356,13 +379,16 @@ signals:
      *  @param durationError Should be set to true if the proxy failed because it has not same length as original clip
      */
     void removeInvalidProxy(const QString &id, bool durationError);
-    void refreshDocumentProducers(bool displayRatioChanged);
+    void refreshDocumentProducers(bool displayRatioChanged, bool fpsChanged);
+    
+    /** @brief If we will delete the producer, make sure to pause the monitor */
+    void blockClipMonitor(const QString &);
 
     /** @brief A frame's image has to be shown.
      *
      * Used in Mac OS X. */
     void showImageSignal(QImage);
-    void showAudioSignal(const QByteArray);
+    void showAudioSignal(const QByteArray &);
 
 public slots:
 
@@ -384,7 +410,9 @@ public slots:
         @param selectClip If true, clip item will be selected in project view
      * Upon return, the result will be emitted via replyGetFileProperties().
      * Wraps the VEML command of the same name. */
-    void getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer = true, bool selectClip = false);
+    void getFileProperties(const QDomElement &xml, const QString &clipId, int imageHeight, bool replaceProducer = true);
+
+    void getFileProperties2();
 
     void exportFileToFirewire(QString srcFileName, int port, GenTime startTime, GenTime endTime);
     void mltSavePlaylist();