]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.h
Use real MLT position in monitors instead of cached one, preventing race condition...
[kdenlive] / src / renderer.h
index 324a20d28bfb17e19ee7c7671fcf0fd39d3aea00..b0990d8852b9137ebb2a7e566d05ed21d0caef8e 100644 (file)
  *                                                                         *
  ***************************************************************************/
 
-#ifndef KRENDER_H
-#define KRENDER_H
+#ifndef RENDERER_H
+#define RENDERER_H
+
+#include "gentime.h"
+#include "definitions.h"
+
+#include <kurl.h>
 
 #include <qdom.h>
 #include <qstring.h>
 #include <qmap.h>
 #include <QList>
-#include <QWidget>
+#include <QEvent>
 
-#include <kurl.h>
-
-#include "gentime.h"
-#include "definitions.h"
 
 /**Render encapsulates the client side of the interface to a renderer.
 From Kdenlive's point of view, you treat the Render 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
   */
 
 class Render;
-//class EffectParamDesc;
+
+class QTimer;
 class QPixmap;
 
-namespace Mlt {
+namespace Mlt
+{
 class Consumer;
 class Playlist;
 class Tractor;
@@ -49,12 +52,25 @@ class Frame;
 class Producer;
 class Filter;
 class Profile;
-class Multitrack;
+class Service;
 };
 
 
+class MltErrorEvent : public QEvent
+{
+public:
+    MltErrorEvent(QString message) : QEvent(QEvent::User), m_message(message) {}
+    QString message() const {
+        return m_message;
+    }
+
+private:
+    QString m_message;
+};
+
 
-class Render: public QObject {
+class Render: public QObject
+{
 Q_OBJECT public:
 
     enum FailStates { OK = 0,
@@ -67,7 +83,8 @@ Q_OBJECT public:
     /** Seeks the renderer clip to the given time. */
     void seek(GenTime time);
     void seekToFrame(int pos);
-    bool m_isBlocked;
+    void seekToFrameDiff(int diff);
+    int m_isBlocked;
 
     //static QPixmap getVideoThumbnail(char *profile, QString file, int frame, int width, int height);
     QPixmap getImageThumbnail(KUrl url, int width, int height);
@@ -89,10 +106,11 @@ Q_OBJECT public:
 
     /** Wraps the VEML command of the same name. Sets the current scene list to
     be list. */
-    void setSceneList(QDomDocument list, int position = 0);
-    void setSceneList(QString playlist, int position = 0);
-    QString sceneList();
-    void saveSceneList(QString path, QDomElement kdenliveData = QDomElement());
+    int setSceneList(QDomDocument list, int position = 0);
+    int setSceneList(QString playlist, int position = 0);
+    int setProducer(Mlt::Producer *producer, int position);
+    const QString sceneList();
+    bool saveSceneList(QString path, QDomElement kdenliveData = QDomElement());
 
     /** Wraps the VEML command of the same name. Tells the renderer to
     play the current scene at the speed specified, relative to normal
@@ -100,6 +118,7 @@ Q_OBJECT public:
     backwards. Does not specify start/stop times for playback.*/
     void play(double speed);
     void switchPlay();
+    void pause();
     /** stop playing */
     void stop(const GenTime & startTime);
     void setVolume(double volume);
@@ -109,12 +128,11 @@ Q_OBJECT public:
     play the current scene at the speed specified, relative to normal
     playback. e.g. 1.0 is normal speed, 0.0 is paused, -1.0 means play
     backwards. Specifes the start/stop times for playback.*/
-    void play(double speed, const GenTime & startTime);
-    void play(double speed, const GenTime & startTime,
-              const GenTime & stopTime);
+    void play(const GenTime & startTime);
+    void playZone(const GenTime & startTime, const GenTime & stopTime);
+    void loopZone(const GenTime & startTime, const GenTime & stopTime);
 
-    /** Returns the description of this renderer */
-    QString description();
+    void saveZone(KUrl url, QString desc, QPoint zone);
 
     /** Returns the name of the renderer. */
     const QString & rendererName() const;
@@ -124,6 +142,7 @@ Q_OBJECT public:
     double playSpeed();
     /** Returns the current seek position of the renderer. */
     GenTime seekPosition() const;
+    int seekFramePosition() const;
 
     void emitFrameNumber(double position);
     void emitConsumerStopped();
@@ -139,85 +158,105 @@ Q_OBJECT public:
 
     /** Turn on or off on screen display */
     void refreshDisplay();
-    int resetProfile(QString profile);
-    const double fps() const;
-    const int renderWidth() const;
-    const int renderHeight() const;
+    int resetProfile();
+    double fps() const;
+    int renderWidth() const;
+    int renderHeight() const;
     /** get display aspect ratio */
-    const double dar() const;
+    double dar() const;
 
     /** Playlist manipulation */
-    void mltInsertClip(ItemInfo info, QDomElement element);
-    void mltUpdateClip(ItemInfo info, QDomElement element);
+    void mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod);
+    void mltUpdateClip(ItemInfo info, QDomElement element, Mlt::Producer *prod);
     void mltCutClip(int track, GenTime position);
-    void mltResizeClipEnd(int track, GenTime pos, GenTime in, GenTime out);
-    void mltResizeClipStart(int track, GenTime pos, GenTime moveEnd, GenTime moveStart, GenTime in, GenTime out);
-    bool mltMoveClip(int startTrack, int endTrack, GenTime pos, GenTime moveStart);
-    bool mltMoveClip(int startTrack, int endTrack, int pos, int moveStart);
-    void mltRemoveClip(int track, GenTime position);
-    bool mltRemoveEffect(int track, GenTime position, QString index, bool doRefresh = true);
-    bool mltAddEffect(int track, GenTime position, QMap <QString, QString> args, bool doRefresh = true);
-    bool mltEditEffect(int track, GenTime position, QMap <QString, QString> args);
+    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);
+    int mltTrackDuration(int track);
+    bool mltResizeClipEnd(ItemInfo info, GenTime clipDuration);
+    bool mltResizeClipStart(ItemInfo info, GenTime diff);
+    bool mltResizeClipCrop(ItemInfo info, GenTime diff);
+    bool mltMoveClip(int startTrack, int endTrack, GenTime pos, GenTime moveStart, Mlt::Producer *prod);
+    bool mltMoveClip(int startTrack, int endTrack, int pos, int moveStart, Mlt::Producer *prod);
+    bool mltRemoveClip(int track, GenTime position);
+    bool mltRemoveEffect(int track, GenTime position, QString index, bool updateIndex, bool doRefresh = true);
+    bool mltAddEffect(int track, GenTime position, EffectsParameterList params, bool doRefresh = true);
+    bool mltEditEffect(int track, GenTime position, EffectsParameterList params);
     void mltMoveEffect(int track, GenTime position, int oldPos, int newPos);
     void mltChangeTrackState(int track, bool mute, bool blind);
-    void mltMoveTransition(QString type, int startTrack,  int newTrack, int newTransitionTrack, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut);
-    void mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool refresh = true);
+    bool mltMoveTransition(QString type, int startTrack,  int newTrack, int newTransitionTrack, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut);
+    bool mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool refresh = true);
     void mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool refresh = true);
     void mltUpdateTransition(QString oldTag, QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml);
     void mltUpdateTransitionParams(QString type, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml);
-
+    void mltAddClipTransparency(ItemInfo info, int transitiontrack, int id);
+    void mltMoveTransparency(int startTime, int endTime, int startTrack, int endTrack, int id);
+    void mltDeleteTransparency(int pos, int track, int id);
+    void mltResizeTransparency(int oldStart, int newStart, int newEnd, int track, int id);
+    void mltInsertTrack(int ix, bool videoTrack);
+    void mltDeleteTrack(int ix);
+    void mltUpdateClipProducer(int track, int pos, Mlt::Producer *prod);
+
+    /** Change speed of a clip in playlist. To do this, we create a new "framebuffer" producer.
+    This new producer must have its "resource" param set to: video.mpg?0.6 where video.mpg is the path
+    to the clip and 0.6 is the speed in percents. The newly created producer will have it's
+    "id" parameter set to: "slowmotion:parentid:speed", where parentid is the id of the original clip
+    in the ClipManager list and speed is the current speed */
+    int mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, Mlt::Producer *prod);
+
+    QList <Mlt::Producer *> producersList();
+    void updatePreviewSettings();
+    void setDropFrames(bool show);
 
 private:   // Private attributes & methods
     /** The name of this renderer - useful to identify the renderes by what they do - e.g. background rendering, workspace monitor, etc... */
     QString m_name;
     Mlt::Consumer * m_mltConsumer;
     Mlt::Producer * m_mltProducer;
-    Mlt::Producer *m_mltTextProducer;
-    Mlt::Filter *m_osdInfo;
     Mlt::Profile *m_mltProfile;
     double m_framePosition;
     double m_fps;
-    uint m_monitorId;
-    bool m_generateScenelist;
 
-    QList <Mlt::Producer *> m_producersList;
-    Mlt::Producer *getProducerById(const QString &id);
-    void parsePlaylistForClips();
-    /** Holds the path to on screen display profile */
-    QString m_osdProfile;
+    /** true if we are playing a zone (ie the in and out properties have been temporarily changed) */
+    bool m_isZoneMode;
+    bool m_isLoopMode;
+    GenTime m_loopStart;
+    int m_originalOut;
+
+    /** true when monitor is in split view (several tracks at the same time) */
+    bool m_isSplitView;
 
-    QTimer *refreshTimer;
-    QTimer *osdTimer;
-    KUrl m_exportedFile;
-    int exportDuration, firstExportFrame, lastExportFrame;
+    Mlt::Producer *m_blackClip;
+    QString m_activeProfile;
+
+    QTimer *m_refreshTimer;
+    QTimer *m_osdTimer;
 
     /** A human-readable description of this renderer. */
-    QString m_description;
     int m_winid;
-    int m_externalwinid;
-    /** The actually seek command, private so people can't avoid the buffering of multiple seek commands. */
-    void sendSeekCommand(GenTime time);
 
     /** Sets the description of this renderer to desc. */
-    void setDescription(const QString & description);
     void closeMlt();
-    void mltCheckLength(bool reload = true);
+    void mltCheckLength();
+    void mltPasteEffects(Mlt::Producer *source, Mlt::Producer *dest);
     QMap<QString, QString> mltGetTransitionParamsFromXml(QDomElement xml);
+    QMap<QString, Mlt::Producer *> m_slowmotionProducers;
+    void buildConsumer();
+    void resetZoneMode();
+    void fillSlowMotionProducers();
 
 private slots:  // Private slots
     /** refresh monitor display */
     void refresh();
     void slotOsdTimeout();
-    void connectPlaylist();
+    int connectPlaylist();
     //void initSceneList();
 
 signals:   // Signals
     /** emitted when the renderer recieves a reply to a getFileProperties request. */
-    void replyGetFileProperties(int clipId, const QMap < QString, QString > &, const QMap < QString, QString > &);
+    void replyGetFileProperties(const QString &clipId, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool);
 
     /** emitted when the renderer recieves a reply to a getImage request. */
-    void replyGetImage(int , int, const QPixmap &, int, int);
-    void replyGetImage(int, const QPixmap &, int, int);
+    void replyGetImage(const QString &, const QPixmap &);
 
     /** Emitted when the renderer stops, either playing or rendering. */
     void stopped();
@@ -234,7 +273,9 @@ signals:   // Signals
     void durationChanged(int);
     void rendererPosition(int);
     void rendererStopped(int);
-
+    void removeInvalidClip(const QString &, bool replaceProducer);
+    void refreshDocumentProducers();
+    void blockMonitors();
 
 public slots:  // Public slots
     /** Start Consumer */
@@ -249,11 +290,12 @@ public slots:  // Public slots
     /** Wraps the VEML command of the same name. Requests the file properties
     for the specified url from the renderer. Upon return, the result will be emitted
     via replyGetFileProperties(). */
-    void getFileProperties(const QDomElement &xml, int clipId);
+    void getFileProperties(const QDomElement &xml, const QString &clipId, bool replaceProducer = true);
 
     void exportFileToFirewire(QString srcFileName, int port, GenTime startTime, GenTime endTime);
     static char *decodedString(QString str);
     void mltSavePlaylist();
+    void slotSplitView(bool doit);
 };
 
 #endif