]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.h
Improve handling of missing clips:
[kdenlive] / src / renderer.h
index 7e00c8ac92eb8acb1904284b1f35906e937d32e8..402def2ba6e7df69407c90c3309f8b6ce5b50ad7 100644 (file)
  *                                                                         *
  ***************************************************************************/
 
-#ifndef KRENDER_H
-#define KRENDER_H
+#ifndef RENDERER_H
+#define RENDERER_H
 
 #include <qdom.h>
 #include <qstring.h>
 #include <qmap.h>
 #include <QList>
-#include <QWidget>
 
 #include <kurl.h>
 
 #include "gentime.h"
-/*#include "docclipref.h"
-#include "effectdesc.h"
-#include "effectparamdescfactory.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 QPixmap;
 
-namespace Mlt {
-    class Consumer;
-    class Playlist;
-    class Tractor;
-    class Frame;
-    class Producer;
-    class Filter;
+class QTimer;
+class QPixmap;
 
-    class Multitrack;
+namespace Mlt
+{
+class Consumer;
+class Playlist;
+class Tractor;
+class Frame;
+class Producer;
+class Filter;
+class Profile;
+class Multitrack;
 };
 
 
 
-class Render:public QObject {
-  Q_OBJECT public:
+class Render: public QObject
+{
+Q_OBJECT public:
 
     enum FailStates { OK = 0,
-       APP_NOEXIST
-    };
+                      APP_NOEXIST
+                    };
 
-     Render(const QString & rendererName, QWidget *parent = 0);
+    Render(const QString & rendererName, int winid, int extid, QWidget *parent = 0);
     ~Render();
 
-       /** Wraps the VEML command of the same name; requests that the renderer
-       should create a video window. If show is true, then the window should be
-       displayed, otherwise it should be hidden. Render will emit the signal
-       replyCreateVideoXWindow() once the renderer has replied. */
-    void createVideoXWindow(WId winid, WId externalMonitor);
-       /** Seeks the renderer clip to the given time. */
+    /** Seeks the renderer clip to the given time. */
     void seek(GenTime time);
     void seekToFrame(int pos);
-    
-    static QPixmap getVideoThumbnail(QString file, int frame, int width, int height);
+    bool m_isBlocked;
+
+    //static QPixmap getVideoThumbnail(char *profile, QString file, int frame, int width, int height);
     QPixmap getImageThumbnail(KUrl url, int width, int height);
 
-       /** Return thumbnail for color clip */
-    void getImage(int id, QString color, QPoint size);
+    /** Return thumbnail for color clip */
+    //void getImage(int id, QString color, QPoint size);
+
+    // static QPixmap frameThumbnail(Mlt::Frame *frame, int width, int height, bool border = false);
 
-    static QPixmap frameThumbnail(Mlt::Frame *frame, int width, int height, bool border = false);
-    
     /** Return thumbnail for image clip */
-    void getImage(KUrl url, QPoint size);
+    //void getImage(KUrl url, QPoint size);
 
-       /** Requests a particular frame from the given file. 
-        * 
-        * The pixmap will be returned by emitting the replyGetImage() signal.
-        * */
-    void getImage(KUrl url, int frame, QPoint size);
+    /** Requests a particular frame from the given file.
+     *
+     * The pixmap will be returned by emitting the replyGetImage() signal.
+     * */
+    //void getImage(KUrl url, int frame, QPoint size);
 
-       /** Wraps the VEML command of the same name. Sets the current scene list to
-       be list. */
-    void setSceneList(QDomDocument list, int position = 0);
 
-       /** Wraps the VEML command of the same name. Tells the renderer to
-       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. Does not specify start/stop times for playback.*/
+    /** 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);
+    void 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
+    playback. e.g. 1.0 is normal speed, 0.0 is paused, -1.0 means play
+    backwards. Does not specify start/stop times for playback.*/
     void play(double speed);
     void switchPlay();
-       /** stop playing */
+    void pause();
+    /** stop playing */
     void stop(const GenTime & startTime);
     void setVolume(double volume);
 
-    QPixmap extractFrame(int frame_position, int width, int height);
-       /** Wraps the VEML command of the same name. Tells the renderer to
-       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);
-       /** Wraps the VEML command of the same name - render the currently
-       specified sceneList - set with setSceneList() - to the document
-       name specified. */
-    void render(const KUrl & url);
-
-       /** Returns the description of this renderer */
-    QString description();
-
-       /** Returns the name of the renderer. */
+    QPixmap extractFrame(int frame_position, int width = -1, int height = -1);
+    /** Wraps the VEML command of the same name. Tells the renderer to
+    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(const GenTime & startTime);
+    void playZone(const GenTime & startTime, const GenTime & stopTime);
+    void loopZone(const GenTime & startTime, const GenTime & stopTime);
+
+    void saveZone(KUrl url, QString desc, QPoint zone);
+
+    /** Returns the name of the renderer. */
     const QString & rendererName() const;
 
-       /** Returns the speed at which the renderer is currently playing, 0.0 if the renderer is
-       not playing anything. */
+    /** Returns the speed at which the renderer is currently playing, 0.0 if the renderer is
+    not playing anything. */
     double playSpeed();
-       /** Returns the current seek position of the renderer. */
-    const GenTime & seekPosition() const;
+    /** Returns the current seek position of the renderer. */
+    GenTime seekPosition() const;
 
     void emitFrameNumber(double position);
     void emitConsumerStopped();
@@ -137,126 +134,149 @@ class Render:public QObject {
     /** Gives the aspect ratio of the consumer */
     double consumerRatio() const;
 
-    /** Gives the aspect ratio of the consumer */
     void askForRefresh();
-    
+    void doRefresh();
+
     /** Save current producer frame as image */
     void exportCurrentFrame(KUrl url, bool notify);
 
     /** Turn on or off on screen display */
     void refreshDisplay();
-    /** returns the current scenelist */
-    QDomDocument sceneList() const;
-    int resetRendererProfile(char * profile);
-    bool isBlocked;
-    const double fps() const;
+    int resetProfile();
+    double fps() const;
+    int renderWidth() const;
+    int renderHeight() const;
+    /** get display aspect ratio */
+    double dar() const;
 
     /** Playlist manipulation */
-    void mltInsertClip(int track, GenTime position, QString resource);
+    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);
-    void mltMoveClip(int startTrack, int endTrack, GenTime pos, GenTime moveStart);
-    void mltMoveClip(int startTrack, int endTrack, int pos, int moveStart);
-    void mltRemoveClip(int track, GenTime position);
-    void mltRemoveEffect(int track, GenTime position, QString id, QString tag, int index);
-    void mltAddEffect(int track, GenTime position, QString id, QString tag, QMap <QString, QString> args);
-    void mltEditEffect(int track, GenTime position, int index, QString id, QString tag, 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 trackOffset, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut);
-    void mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args);
-
-  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;
-     double m_framePosition;
-     double m_fps;
-     uint m_monitorId;
-     bool m_generateScenelist;
-
-       /** Holds the path to on screen display profile */
-     QString m_osdProfile;
-     
-     QTimer *refreshTimer;
-     QTimer *osdTimer;
-     QTimer *m_connectTimer;
-     KUrl m_exportedFile;
-     int exportDuration, firstExportFrame, lastExportFrame;
-
-       /** Holds the scenelist to be sent, if pending. */
-    QDomDocument m_sceneList;
-
-       /** A human-readable description of this renderer. */
-    QString m_description;
+    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();
+
+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::Profile *m_mltProfile;
+    double m_framePosition;
+    double m_fps;
+
+    /** 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;
+
+    Mlt::Producer *m_blackClip;
+    QString m_activeProfile;
+
+    QTimer *m_refreshTimer;
+    QTimer *m_osdTimer;
+
+    /** A human-readable description of this renderer. */
     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);
+    /** Sets the description of this renderer to desc. */
     void closeMlt();
     void mltCheckLength();
-
-    private slots:             // Private slots
-       /** refresh monitor display */
-        void refresh();
-       void slotOsdTimeout();
-       void restartConsumer();
-       void connectPlaylist();
-       void initSceneList();
-
-     signals:                  // Signals
-       /** This signal is emitted once a reply to createVideoXWidow() has been recieved. */
-    void replyCreateVideoXWindow(WId);
-       /** emitted when the renderer recieves a reply to a getFileProperties request. */
-    void replyGetFileProperties(const QMap < QString, QString > &, const QMap < QString, QString > &);
-
-       /** emitted when the renderer recieves a reply to a getImage request. */
-    void replyGetImage(const KUrl &, int, const QPixmap &, int, int);
-    void replyGetImage(int, const QPixmap &, int, int);
-
-       /** Emitted when the renderer stops, either playing or rendering. */
+    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();
+    //void initSceneList();
+
+signals:   // Signals
+    /** emitted when the renderer recieves a reply to a getFileProperties request. */
+    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(const QString &, const QPixmap &);
+
+    /** Emitted when the renderer stops, either playing or rendering. */
     void stopped();
-       /** Emitted when the renderer starts playing. */
+    /** Emitted when the renderer starts playing. */
     void playing(double);
-       /** Emitted when the renderer is rendering. */
+    /** Emitted when the renderer is rendering. */
     void rendering(const GenTime &);
-       /** Emitted when rendering has finished */
+    /** Emitted when rendering has finished */
     void renderFinished();
-       /** Emitted when the current seek position has been changed by the renderer. */
+    /** Emitted when the current seek position has been changed by the renderer. */
 //    void positionChanged(const GenTime &);
-       /** Emitted when an error occurs within this renderer. */
+    /** Emitted when an error occurs within this renderer. */
     void error(const QString &, const QString &);
-    void durationChanged();
-    void playListDuration(int);
+    void durationChanged(int);
     void rendererPosition(int);
     void rendererStopped(int);
+    void removeInvalidClip(const QString &, bool replaceProducer);
+    void refreshDocumentProducers();
 
-    
-    public slots:              // Public slots
-       /** Start Consumer */
+public slots:  // Public slots
+    /** Start Consumer */
     void start();
-       /** Stop Consumer */
+    /** Stop Consumer */
     void stop();
     void clear();
     int getLength();
-       /** If the file is readable by mlt, return true, otherwise false */
+    /** If the file is readable by mlt, return true, otherwise false */
     bool isValid(KUrl url);
 
-       /** Wraps the VEML command of the same name. Requests the file properties
+    /** 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 KUrl &url, uint framenb = 0);
-    
+    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