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"
36 #if LIBMLT_VERSION_INT >= ((7<<16)+(19<<8))
37 #define kAudioIndexProperty "astream"
38 #define kVideoIndexProperty "vstream"
40 #define kAudioIndexProperty "audio_index"
41 #define kVideoIndexProperty "video_index"
46 const int kMaxImageDurationSecs = 3600 * 4;
47 extern const QString XmlMimeType;
49 class TransportControl :
public TransportControllable
53 void play(
double speed = 1.0)
override;
54 void pause(
int position = -1)
override;
56 void seek(
int position)
override;
57 void rewind(
bool forceChangeDirection)
override;
58 void fastForward(
bool forceChangeDirection)
override;
59 void previous(
int currentPosition)
override;
60 void next(
int currentPosition)
override;
61 void setIn(
int)
override;
62 void setOut(
int)
override;
69 virtual int reconfigure(
bool isMulti) = 0;
72 static Controller &singleton(QObject *parent =
nullptr);
73 virtual ~Controller();
74 static void destroy();
76 virtual QObject *videoWidget() = 0;
77 virtual int setProducer(Mlt::Producer *,
bool isMulti =
false);
78 virtual int open(
const QString &url,
const QString &urlToSave,
bool skipConvert =
false);
79 bool openXML(
const QString &filename);
81 virtual int displayWidth()
const = 0;
82 virtual int displayHeight()
const = 0;
85 virtual void play(
double speed = 1.0);
86 bool isPaused()
const;
87 virtual void pause(
int position = -1);
89 bool enableJack(
bool enable =
true);
90 void setVolume(
double volume,
bool muteOnPause =
true);
91 double volume()
const;
92 void onWindowResize();
93 virtual void seek(
int position);
94 virtual void refreshConsumer(
bool scrubAudio =
false);
95 bool saveXML(
const QString &filename, Service *service =
nullptr,
bool withRelativePaths =
true,
96 QTemporaryFile *tempFile =
nullptr,
bool proxy =
false, QString projectNote = QString());
97 QString XML(Service *service =
nullptr,
bool withProfile =
false,
bool withMetadata =
true);
98 int consumerChanged();
99 void setProfile(
const QString &profile_name);
100 void setAudioChannels(
int audioChannels);
101 QString resource()
const;
102 bool isSeekable(Mlt::Producer *p =
nullptr)
const;
103 bool isLiveProducer(Mlt::Producer *p =
nullptr)
const;
105 bool isClosedClip(Producer *producer =
nullptr)
const;
106 bool isSeekableClip();
107 bool isPlaylist()
const;
108 bool isMultitrack()
const;
109 bool isImageProducer(Service *service)
const;
110 bool isFileProducer(Service *service)
const;
111 void rewind(
bool forceChangeDirection);
112 void fastForward(
bool forceChangeDirection);
113 void previous(
int currentPosition);
114 void next(
int currentPosition);
117 void fixLengthProperties(Service &service);
118 void restart(
const QString &xml =
"");
120 QImage image(Frame *frame,
int width,
int height);
121 QImage image(Mlt::Producer &producer,
int frameNumber,
int width,
int height);
122 void updateAvformatCaching(
int trackCount);
123 bool isAudioFilter(
const QString &name);
124 int realTime()
const;
125 void setImageDurationFromDefault(Service *service)
const;
126 void setDurationFromDefault(Producer *service)
const;
127 void lockCreationTime(Producer *producer)
const;
128 Producer *setupNewProducer(Producer *newProducer)
const;
129 QUuid uuid(Mlt::Properties &properties)
const;
130 void setUuid(Mlt::Properties &properties, QUuid uid)
const;
131 QUuid ensureHasUuid(Mlt::Properties &properties)
const;
132 static void copyFilters(Mlt::Producer &fromProducer, Mlt::Producer &toProducer,
133 bool fromClipboard =
false,
bool includeDisabled =
true);
134 void copyFilters(Mlt::Producer *producer =
nullptr);
135 void pasteFilters(Mlt::Producer *producer =
nullptr, Mlt::Producer *fromProducer =
nullptr);
136 static void adjustFilters(Mlt::Producer &producer,
int startIndex = 0);
137 static void adjustFilter(Mlt::Filter *filter,
int in,
int out,
int inDelta,
int outDelta,
139 static void adjustClipFilters(Mlt::Producer &producer,
int in,
int out,
int inDelta,
int outDelta,
141 bool hasFiltersOnClipboard()
const
143 return m_filtersClipboard->is_valid() && m_filtersClipboard->filter_count() > 0;
145 QString filtersClipboardXML()
147 return XML(m_filtersClipboard.get());
150 int audioChannels()
const
152 return m_audioChannels;
154 Mlt::Repository *repository()
const
158 Mlt::Profile &profile()
162 Mlt::Profile &previewProfile()
164 return m_previewProfile;
166 Mlt::Producer *producer()
const
168 return m_producer.data();
170 Mlt::Consumer *consumer()
const
172 return m_consumer.data();
174 const QString &URL()
const
178 const TransportControllable *transportControl()
const
180 return &m_transportControl;
182 Mlt::Producer *savedProducer()
const
184 return m_savedProducer.data();
186 void setSavedProducer(Mlt::Producer *producer);
187 static Mlt::Filter *getFilter(
const QString &name, Mlt::Service *service);
188 QString projectFolder()
const
190 return m_projectFolder;
192 void setProjectFolder(
const QString &folderName);
193 QChar decimalPoint();
194 static void resetLocale();
195 static int filterIn(Mlt::Playlist &playlist,
int clipIndex);
196 static int filterOut(Mlt::Playlist &playlist,
int clipIndex);
197 void setPreviewScale(
int scale);
198 void updatePreviewProfile();
199 static void purgeMemoryPool();
200 static bool fullRange(Mlt::Producer &producer);
201 static bool isMltXml(
const QString &s)
203 return s.contains(
"<mlt ");
205 static bool isTrackProducer(Mlt::Producer &producer);
206 static int checkFile(
const QString &path);
207 bool blockRefresh(
bool block);
214 singleton().blockRefresh(
true);
218 singleton().blockRefresh(
false);
223 Mlt::Repository *m_repo;
224 QScopedPointer<Mlt::Producer> m_producer;
225 QScopedPointer<Mlt::FilteredConsumer> m_consumer;
228 Mlt::Profile m_profile;
229 Mlt::Profile m_previewProfile;
230 int m_audioChannels{2};
231 QScopedPointer<Mlt::Filter> m_jackFilter;
233 double m_volume{1.0};
234 TransportControl m_transportControl;
235 QScopedPointer<Mlt::Producer> m_savedProducer;
236 QScopedPointer<Mlt::Producer> m_filtersClipboard;
237 unsigned m_skipJackEvents{0};
238 QString m_projectFolder;
239 QMutex m_saveXmlMutex;
242 static void on_jack_started(mlt_properties owner,
void *
object, mlt_event_data data);
243 void onJackStarted(
int position);
244 static void on_jack_stopped(mlt_properties owner,
void *
object, mlt_event_data data);
245 void onJackStopped(
int position);
247 void initFiltersClipboard();
252 #define MLT Mlt::Controller::singleton()