18 #ifndef MLTCONTROLLER_H
19 #define MLTCONTROLLER_H
24 #include <QScopedPointer>
25 #include <QTemporaryFile>
28 #include "transportcontrol.h"
33 #define MLT_LC_CATEGORY LC_ALL
34 #define MLT_LC_NAME "LC_ALL"
38 const int kMaxImageDurationSecs = 3600 * 4;
39 extern const QString XmlMimeType;
41 class TransportControl :
public TransportControllable
45 void play(
double speed = 1.0)
override;
46 void pause()
override;
48 void seek(
int position)
override;
49 void rewind(
bool forceChangeDirection)
override;
50 void fastForward(
bool forceChangeDirection)
override;
51 void previous(
int currentPosition)
override;
52 void next(
int currentPosition)
override;
53 void setIn(
int)
override;
54 void setOut(
int)
override;
61 virtual int reconfigure(
bool isMulti) = 0;
64 static Controller &singleton(QObject *parent =
nullptr);
65 virtual ~Controller();
66 static void destroy();
68 virtual QObject *videoWidget() = 0;
69 virtual int setProducer(Mlt::Producer *,
bool isMulti =
false);
70 virtual int open(
const QString &url,
const QString &urlToSave);
71 bool openXML(
const QString &filename);
73 virtual int displayWidth()
const = 0;
74 virtual int displayHeight()
const = 0;
77 virtual void play(
double speed = 1.0);
78 bool isPaused()
const;
81 bool enableJack(
bool enable =
true);
82 void setVolume(
double volume,
bool muteOnPause =
true);
83 double volume()
const;
84 void onWindowResize();
85 virtual void seek(
int position);
86 virtual void refreshConsumer(
bool scrubAudio =
false);
87 bool saveXML(
const QString &filename, Service *service =
nullptr,
bool withRelativePaths =
true,
88 QTemporaryFile *tempFile =
nullptr,
bool proxy =
false, QString projectNote = QString());
89 QString XML(Service *service =
nullptr,
bool withProfile =
false,
bool withMetadata =
false);
90 int consumerChanged();
91 void setProfile(
const QString &profile_name);
92 void setAudioChannels(
int audioChannels);
93 QString resource()
const;
94 bool isSeekable(Mlt::Producer *p =
nullptr)
const;
95 bool isLiveProducer(Mlt::Producer *p =
nullptr)
const;
97 bool isSeekableClip();
98 bool isPlaylist()
const;
99 bool isMultitrack()
const;
100 bool isImageProducer(Service *service)
const;
101 bool isFileProducer(Service *service)
const;
102 void rewind(
bool forceChangeDirection);
103 void fastForward(
bool forceChangeDirection);
104 void previous(
int currentPosition);
105 void next(
int currentPosition);
108 void restart(
const QString &xml =
"");
110 QImage image(Frame *frame,
int width,
int height);
111 QImage image(Mlt::Producer &producer,
int frameNumber,
int width,
int height);
112 void updateAvformatCaching(
int trackCount);
113 bool isAudioFilter(
const QString &name);
114 int realTime()
const;
115 void setImageDurationFromDefault(Service *service)
const;
116 void setDurationFromDefault(Producer *service)
const;
117 void lockCreationTime(Producer *producer)
const;
118 Producer *setupNewProducer(Producer *newProducer)
const;
119 QUuid uuid(Mlt::Properties &properties)
const;
120 void setUuid(Mlt::Properties &properties, QUuid uid)
const;
121 QUuid ensureHasUuid(Mlt::Properties &properties)
const;
122 static void copyFilters(Mlt::Producer &fromProducer, Mlt::Producer &toProducer,
123 bool fromClipboard =
false,
bool includeDisabled =
true);
124 void copyFilters(Mlt::Producer *producer =
nullptr);
125 void pasteFilters(Mlt::Producer *producer =
nullptr, Mlt::Producer *fromProducer =
nullptr);
126 static void adjustFilters(Mlt::Producer &producer,
int startIndex = 0);
127 static void adjustFilter(Mlt::Filter *filter,
int in,
int out,
int inDelta,
int outDelta,
129 static void adjustClipFilters(Mlt::Producer &producer,
int in,
int out,
int inDelta,
int outDelta,
131 bool hasFiltersOnClipboard()
const
133 return m_filtersClipboard->is_valid() && m_filtersClipboard->filter_count() > 0;
135 QString filtersClipboardXML()
137 return XML(m_filtersClipboard.get());
140 int audioChannels()
const
142 return m_audioChannels;
144 Mlt::Repository *repository()
const
148 Mlt::Profile &profile()
152 Mlt::Profile &previewProfile()
154 return m_previewProfile;
156 Mlt::Producer *producer()
const
158 return m_producer.data();
160 Mlt::Consumer *consumer()
const
162 return m_consumer.data();
164 const QString &URL()
const
168 const TransportControllable *transportControl()
const
170 return &m_transportControl;
172 Mlt::Producer *savedProducer()
const
174 return m_savedProducer.data();
176 void setSavedProducer(Mlt::Producer *producer);
177 static Mlt::Filter *getFilter(
const QString &name, Mlt::Service *service);
178 QString projectFolder()
const
180 return m_projectFolder;
182 void setProjectFolder(
const QString &folderName);
183 QChar decimalPoint();
184 static void resetLocale();
185 static int filterIn(Mlt::Playlist &playlist,
int clipIndex);
186 static int filterOut(Mlt::Playlist &playlist,
int clipIndex);
187 void setPreviewScale(
int scale);
188 void updatePreviewProfile();
189 static void purgeMemoryPool();
190 static bool fullRange(Mlt::Producer &producer);
191 static bool isMltXml(
const QString &s)
193 return s.contains(
"<mlt ");
195 static bool isTrackProducer(Mlt::Producer &producer);
196 static int checkFile(
const QString &path);
197 bool blockRefresh(
bool block);
204 singleton().blockRefresh(
true);
208 singleton().blockRefresh(
false);
213 Mlt::Repository *m_repo;
214 QScopedPointer<Mlt::Producer> m_producer;
215 QScopedPointer<Mlt::FilteredConsumer> m_consumer;
218 Mlt::Profile m_profile;
219 Mlt::Profile m_previewProfile;
220 int m_audioChannels{2};
221 QScopedPointer<Mlt::Filter> m_jackFilter;
223 double m_volume{1.0};
224 TransportControl m_transportControl;
225 QScopedPointer<Mlt::Producer> m_savedProducer;
226 QScopedPointer<Mlt::Producer> m_filtersClipboard;
227 unsigned m_skipJackEvents{0};
228 QString m_projectFolder;
229 QMutex m_saveXmlMutex;
232 static void on_jack_started(mlt_properties owner,
void *
object, mlt_event_data data);
233 void onJackStarted(
int position);
234 static void on_jack_stopped(mlt_properties owner,
void *
object, mlt_event_data data);
235 void onJackStopped(
int position);
237 void initFiltersClipboard();
242 #define MLT Mlt::Controller::singleton()