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);
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;
96 bool isSeekableClip();
97 bool isPlaylist()
const;
98 bool isMultitrack()
const;
99 bool isImageProducer(Service* service)
const;
100 bool isFileProducer(Service* service)
const;
101 void rewind(
bool forceChangeDirection);
102 void fastForward(
bool forceChangeDirection);
103 void previous(
int currentPosition);
104 void next(
int currentPosition);
107 void restart(
const QString& xml =
"");
109 QImage image(Frame *frame,
int width,
int height);
110 QImage image(Mlt::Producer& producer,
int frameNumber,
int width,
int height);
111 void updateAvformatCaching(
int trackCount);
112 bool isAudioFilter(
const QString& name);
113 int realTime()
const;
114 void setImageDurationFromDefault(Service* service)
const;
115 void setDurationFromDefault(Producer* service)
const;
116 void lockCreationTime(Producer* producer)
const;
117 Producer* setupNewProducer(Producer* newProducer)
const;
118 QUuid uuid(Mlt::Properties &properties)
const;
119 void setUuid(Mlt::Properties &properties, QUuid uid)
const;
120 QUuid ensureHasUuid(Mlt::Properties& properties)
const;
121 static void copyFilters(Mlt::Producer& fromProducer, Mlt::Producer& toProducer,
bool fromClipboard =
false,
bool includeDisabled =
true);
122 void copyFilters(Mlt::Producer* producer =
nullptr);
123 void pasteFilters(Mlt::Producer* producer =
nullptr, Mlt::Producer* fromProducer =
nullptr);
124 static void adjustFilters(Mlt::Producer& producer,
int startIndex = 0);
125 static void adjustFilter(Mlt::Filter* filter,
int in,
int out,
int inDelta,
int outDelta);
126 static void adjustClipFilters(Mlt::Producer& producer,
int in,
int out,
int inDelta,
int outDelta);
127 bool hasFiltersOnClipboard()
const {
128 return m_filtersClipboard->is_valid() && m_filtersClipboard->filter_count() > 0;
130 QString filtersClipboardXML() {
131 return XML(m_filtersClipboard.get());
134 int audioChannels()
const {
135 return m_audioChannels;
137 Mlt::Repository* repository()
const {
140 Mlt::Profile& profile() {
143 Mlt::Profile& previewProfile() {
144 return m_previewProfile;
146 Mlt::Producer* producer()
const {
147 return m_producer.data();
149 Mlt::Consumer* consumer()
const {
150 return m_consumer.data();
152 const QString& URL()
const {
155 const TransportControllable* transportControl()
const {
156 return &m_transportControl;
158 Mlt::Producer* savedProducer()
const {
159 return m_savedProducer.data();
161 void setSavedProducer(Mlt::Producer* producer);
162 static Mlt::Filter* getFilter(
const QString& name, Mlt::Service* service);
163 QString projectFolder()
const {
return m_projectFolder; }
164 void setProjectFolder(
const QString& folderName);
165 QChar decimalPoint();
166 static void resetLocale();
167 static int filterIn(Mlt::Playlist&playlist,
int clipIndex);
168 static int filterOut(Mlt::Playlist&playlist,
int clipIndex);
169 void setPreviewScale(
int scale);
170 void updatePreviewProfile();
171 static void purgeMemoryPool();
172 static bool fullRange(Mlt::Producer& producer);
173 static bool isMltXml(
const QString& s) {
174 return s.contains(
"<mlt ");
176 bool blockRefresh(
bool block);
183 singleton().blockRefresh(
true);
187 singleton().blockRefresh(
false);
192 Mlt::Repository* m_repo;
193 QScopedPointer<Mlt::Producer> m_producer;
194 QScopedPointer<Mlt::FilteredConsumer> m_consumer;
197 Mlt::Profile m_profile;
198 Mlt::Profile m_previewProfile;
199 int m_audioChannels{2};
200 QScopedPointer<Mlt::Filter> m_jackFilter;
202 double m_volume{1.0};
203 TransportControl m_transportControl;
204 QScopedPointer<Mlt::Producer> m_savedProducer;
205 QScopedPointer<Mlt::Producer> m_filtersClipboard;
206 unsigned m_skipJackEvents{0};
207 QString m_projectFolder;
208 QMutex m_saveXmlMutex;
211 static void on_jack_started(mlt_properties owner,
void*
object, mlt_event_data data);
212 void onJackStarted(
int position);
213 static void on_jack_stopped(mlt_properties owner,
void*
object, mlt_event_data data);
214 void onJackStopped(
int position);
216 void initFiltersClipboard();
221 #define MLT Mlt::Controller::singleton()