]> git.sesse.net Git - kdenlive/blob - src/renderer.h
Add Mac OS X compatibility through new MLT sdl_audio consumer and a QTGLWidget!
[kdenlive] / src / renderer.h
1 /***************************************************************************
2                          krender.h  -  description
3                             -------------------
4    begin                : Fri Nov 22 2002
5    copyright            : (C) 2002 by Jason Wood
6    email                : jasonwood@blueyonder.co.uk
7 ***************************************************************************/
8
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17
18 #ifndef RENDERER_H
19 #define RENDERER_H
20
21 #include "gentime.h"
22 #include "definitions.h"
23
24 #include <kurl.h>
25
26 #include <qdom.h>
27 #include <qstring.h>
28 #include <qmap.h>
29 #include <QList>
30 #include <QEvent>
31
32 #ifdef Q_WS_MAC
33 #include "videoglwidget.h"
34 #endif
35
36
37 /**Render encapsulates the client side of the interface to a renderer.
38 From Kdenlive's point of view, you treat the Render object as the
39 renderer, and simply use it as if it was local. Calls are asyncrhonous -
40 you send a call out, and then receive the return value through the
41 relevant signal that get's emitted once the call completes.
42   *@author Jason Wood
43   */
44
45 class Render;
46
47 class QTimer;
48 class QPixmap;
49
50 namespace Mlt
51 {
52 class Consumer;
53 class Playlist;
54 class Tractor;
55 class Frame;
56 class Producer;
57 class Filter;
58 class Profile;
59 class Service;
60 };
61
62
63 class MltErrorEvent : public QEvent
64 {
65 public:
66     MltErrorEvent(QString message) : QEvent(QEvent::User), m_message(message) {}
67     QString message() const {
68         return m_message;
69     }
70
71 private:
72     QString m_message;
73 };
74
75
76 class Render: public QObject
77 {
78 Q_OBJECT public:
79
80     enum FailStates { OK = 0,
81                       APP_NOEXIST
82                     };
83
84     Render(const QString & rendererName, int winid, int extid, QWidget *parent = 0);
85     ~Render();
86
87     /** Seeks the renderer clip to the given time. */
88     void seek(GenTime time);
89     void seekToFrame(int pos);
90     void seekToFrameDiff(int diff);
91     int m_isBlocked;
92
93     //static QPixmap getVideoThumbnail(char *profile, QString file, int frame, int width, int height);
94     QPixmap getImageThumbnail(KUrl url, int width, int height);
95
96     /** Return thumbnail for color clip */
97     //void getImage(int id, QString color, QPoint size);
98
99     // static QPixmap frameThumbnail(Mlt::Frame *frame, int width, int height, bool border = false);
100
101     /** Return thumbnail for image clip */
102     //void getImage(KUrl url, QPoint size);
103
104     /** Requests a particular frame from the given file.
105      *
106      * The pixmap will be returned by emitting the replyGetImage() signal.
107      * */
108     //void getImage(KUrl url, int frame, QPoint size);
109
110
111     /** Wraps the VEML command of the same name. Sets the current scene list to
112     be list. */
113     int setSceneList(QDomDocument list, int position = 0);
114     int setSceneList(QString playlist, int position = 0);
115     int setProducer(Mlt::Producer *producer, int position);
116     const QString sceneList();
117     bool saveSceneList(QString path, QDomElement kdenliveData = QDomElement());
118
119     /** Wraps the VEML command of the same name. Tells the renderer to
120     play the current scene at the speed specified, relative to normal
121     playback. e.g. 1.0 is normal speed, 0.0 is paused, -1.0 means play
122     backwards. Does not specify start/stop times for playback.*/
123     void play(double speed);
124     void switchPlay();
125     void pause();
126     /** stop playing */
127     void stop(const GenTime & startTime);
128     void setVolume(double volume);
129
130     QPixmap extractFrame(int frame_position, int width = -1, int height = -1);
131     /** Wraps the VEML command of the same name. Tells the renderer to
132     play the current scene at the speed specified, relative to normal
133     playback. e.g. 1.0 is normal speed, 0.0 is paused, -1.0 means play
134     backwards. Specifes the start/stop times for playback.*/
135     void play(const GenTime & startTime);
136     void playZone(const GenTime & startTime, const GenTime & stopTime);
137     void loopZone(const GenTime & startTime, const GenTime & stopTime);
138
139     void saveZone(KUrl url, QString desc, QPoint zone);
140
141     /** Returns the name of the renderer. */
142     const QString & rendererName() const;
143
144     /** Returns the speed at which the renderer is currently playing, 0.0 if the renderer is
145     not playing anything. */
146     double playSpeed();
147     /** Returns the current seek position of the renderer. */
148     GenTime seekPosition() const;
149     int seekFramePosition() const;
150
151     void emitFrameNumber(double position);
152     void emitConsumerStopped();
153
154     /** Gives the aspect ratio of the consumer */
155     double consumerRatio() const;
156
157     void doRefresh();
158
159     /** Save current producer frame as image */
160     void exportCurrentFrame(KUrl url, bool notify);
161
162     /** Turn on or off on screen display */
163     void refreshDisplay();
164     int resetProfile();
165     double fps() const;
166     int renderWidth() const;
167     int renderHeight() const;
168     /** get display aspect ratio */
169     double dar() const;
170
171     /** Playlist manipulation */
172     int mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod);
173     void mltUpdateClip(ItemInfo info, QDomElement element, Mlt::Producer *prod);
174     void mltCutClip(int track, GenTime position);
175     void mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int> trackTransitionStartList, int track, const GenTime duration, const GenTime timeOffset);
176     int mltGetSpaceLength(const GenTime pos, int track, bool fromBlankStart);
177     int mltTrackDuration(int track);
178     bool mltResizeClipEnd(ItemInfo info, GenTime clipDuration);
179     bool mltResizeClipStart(ItemInfo info, GenTime diff);
180     bool mltResizeClipCrop(ItemInfo info, GenTime diff);
181     bool mltMoveClip(int startTrack, int endTrack, GenTime pos, GenTime moveStart, Mlt::Producer *prod);
182     bool mltMoveClip(int startTrack, int endTrack, int pos, int moveStart, Mlt::Producer *prod);
183     bool mltRemoveClip(int track, GenTime position);
184     bool mltRemoveEffect(int track, GenTime position, QString index, bool updateIndex, bool doRefresh = true);
185     bool mltAddEffect(int track, GenTime position, EffectsParameterList params, bool doRefresh = true);
186     bool mltEditEffect(int track, GenTime position, EffectsParameterList params);
187     void mltMoveEffect(int track, GenTime position, int oldPos, int newPos);
188     void mltChangeTrackState(int track, bool mute, bool blind);
189     bool mltMoveTransition(QString type, int startTrack,  int newTrack, int newTransitionTrack, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut);
190     bool mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool refresh = true);
191     void mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool refresh = true);
192     void mltUpdateTransition(QString oldTag, QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml);
193     void mltUpdateTransitionParams(QString type, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml);
194     void mltAddClipTransparency(ItemInfo info, int transitiontrack, int id);
195     void mltMoveTransparency(int startTime, int endTime, int startTrack, int endTrack, int id);
196     void mltDeleteTransparency(int pos, int track, int id);
197     void mltResizeTransparency(int oldStart, int newStart, int newEnd, int track, int id);
198     void mltInsertTrack(int ix, bool videoTrack);
199     void mltDeleteTrack(int ix);
200     void mltUpdateClipProducer(int track, int pos, Mlt::Producer *prod);
201
202     /** Change speed of a clip in playlist. To do this, we create a new "framebuffer" producer.
203     This new producer must have its "resource" param set to: video.mpg?0.6 where video.mpg is the path
204     to the clip and 0.6 is the speed in percents. The newly created producer will have it's
205     "id" parameter set to: "slowmotion:parentid:speed", where parentid is the id of the original clip
206     in the ClipManager list and speed is the current speed */
207     int mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int strobe, Mlt::Producer *prod);
208
209     const QList <Mlt::Producer *> producersList();
210     void updatePreviewSettings();
211     void setDropFrames(bool show);
212 #ifdef Q_WS_MAC
213     void showFrame(Mlt::Frame&);
214 #endif
215
216 private:   // Private attributes & methods
217     /** The name of this renderer - useful to identify the renderes by what they do - e.g. background rendering, workspace monitor, etc... */
218     QString m_name;
219     Mlt::Consumer * m_mltConsumer;
220     Mlt::Producer * m_mltProducer;
221     Mlt::Profile *m_mltProfile;
222     double m_framePosition;
223     double m_fps;
224
225     /** true if we are playing a zone (ie the in and out properties have been temporarily changed) */
226     bool m_isZoneMode;
227     bool m_isLoopMode;
228     GenTime m_loopStart;
229     int m_originalOut;
230
231     /** true when monitor is in split view (several tracks at the same time) */
232     bool m_isSplitView;
233
234     Mlt::Producer *m_blackClip;
235     QString m_activeProfile;
236
237     QTimer *m_osdTimer;
238
239     /** A human-readable description of this renderer. */
240     int m_winid;
241
242 #ifdef Q_WS_MAC
243     VideoGLWidget *m_glWidget;
244 #endif
245
246     /** Sets the description of this renderer to desc. */
247     void closeMlt();
248     void mltCheckLength(Mlt::Tractor *tractor);
249     void mltPasteEffects(Mlt::Producer *source, Mlt::Producer *dest);
250     QMap<QString, QString> mltGetTransitionParamsFromXml(QDomElement xml);
251     QMap<QString, Mlt::Producer *> m_slowmotionProducers;
252     void buildConsumer();
253     void resetZoneMode();
254     void fillSlowMotionProducers();
255
256 private slots:  // Private slots
257     /** refresh monitor display */
258     void refresh();
259     void slotOsdTimeout();
260     int connectPlaylist();
261     //void initSceneList();
262
263 signals:   // Signals
264     /** emitted when the renderer recieves a reply to a getFileProperties request. */
265     void replyGetFileProperties(const QString &clipId, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool);
266
267     /** emitted when the renderer recieves a reply to a getImage request. */
268     void replyGetImage(const QString &, const QPixmap &);
269
270     /** Emitted when the renderer stops, either playing or rendering. */
271     void stopped();
272     /** Emitted when the renderer starts playing. */
273     void playing(double);
274     /** Emitted when the renderer is rendering. */
275     void rendering(const GenTime &);
276     /** Emitted when rendering has finished */
277     void renderFinished();
278     /** Emitted when the current seek position has been changed by the renderer. */
279 //    void positionChanged(const GenTime &);
280     /** Emitted when an error occurs within this renderer. */
281     void error(const QString &, const QString &);
282     void durationChanged(int);
283     void rendererPosition(int);
284     void rendererStopped(int);
285     void removeInvalidClip(const QString &, bool replaceProducer);
286     void refreshDocumentProducers();
287     void blockMonitors();
288     /** Used on OS X - emitted when a frame's image is to be shown. */
289     void showImageSignal(QImage);
290
291 public slots:  // Public slots
292     /** Start Consumer */
293     void start();
294     /** Stop Consumer */
295     void stop();
296     int getLength();
297     /** If the file is readable by mlt, return true, otherwise false */
298     bool isValid(KUrl url);
299
300     /** Wraps the VEML command of the same name. Requests the file properties
301     for the specified url from the renderer. Upon return, the result will be emitted
302     via replyGetFileProperties(). */
303     void getFileProperties(const QDomElement xml, const QString &clipId, bool replaceProducer = true);
304
305     void exportFileToFirewire(QString srcFileName, int port, GenTime startTime, GenTime endTime);
306     static char *decodedString(QString str);
307     void mltSavePlaylist();
308     void slotSplitView(bool doit);
309 };
310
311 #endif