18 #ifndef MLTCONTROLLER_H
19 #define MLTCONTROLLER_H
24 #include <QScopedPointer>
27 #include "transportcontrol.h"
32 #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
33 # define MLT_LC_CATEGORY LC_NUMERIC
34 # define MLT_LC_NAME "LC_NUMERIC"
36 # define MLT_LC_CATEGORY LC_ALL
37 # define MLT_LC_NAME "LC_ALL"
40 #define MLT_VERSION_PREVIEW_SCALE ((6<<16)+(19<<8))
41 #define MLT_VERSION_SET_STRING ((6<<16)+(19<<8))
45 const int kMaxImageDurationSecs = 3600 * 4;
46 extern const QString XmlMimeType;
48 class TransportControl :
public TransportControllable
52 void play(
double speed = 1.0)
override;
53 void pause()
override;
55 void seek(
int position)
override;
56 void rewind(
bool forceChangeDirection)
override;
57 void fastForward(
bool forceChangeDirection)
override;
58 void previous(
int currentPosition)
override;
59 void next(
int currentPosition)
override;
60 void setIn(
int)
override;
61 void setOut(
int)
override;
68 virtual int reconfigure(
bool isMulti) = 0;
71 static Controller& singleton(QObject *parent =
nullptr);
72 virtual ~Controller();
73 static void destroy();
75 virtual QObject* videoWidget() = 0;
76 virtual int setProducer(Mlt::Producer*,
bool isMulti =
false);
77 virtual int open(
const QString& url,
const QString& urlToSave);
78 bool openXML(
const QString& filename);
80 virtual int displayWidth()
const = 0;
81 virtual int displayHeight()
const = 0;
84 virtual void play(
double speed = 1.0);
85 bool isPaused()
const;
88 bool enableJack(
bool enable =
true);
89 void setVolume(
double volume,
bool muteOnPause =
true);
90 double volume()
const;
91 void onWindowResize();
92 virtual void seek(
int position);
93 virtual void refreshConsumer(
bool scrubAudio =
false);
94 bool saveXML(
const QString& filename, Service* service =
nullptr,
bool withRelativePaths =
true,
bool verify =
true,
bool proxy =
false);
95 QString XML(Service* service =
nullptr,
bool withProfile =
false,
bool withMetadata =
false);
96 int consumerChanged();
97 void setProfile(
const QString& profile_name);
98 void setAudioChannels(
int audioChannels);
99 QString resource()
const;
100 bool isSeekable(Mlt::Producer* p =
nullptr)
const;
102 bool isSeekableClip();
103 bool isPlaylist()
const;
104 bool isMultitrack()
const;
105 bool isImageProducer(Service* service)
const;
106 bool isFileProducer(Service* service)
const;
107 void rewind(
bool forceChangeDirection);
108 void fastForward(
bool forceChangeDirection);
109 void previous(
int currentPosition);
110 void next(
int currentPosition);
113 void restart(
const QString& xml =
"");
115 QImage image(Frame *frame,
int width,
int height);
116 QImage image(Mlt::Producer& producer,
int frameNumber,
int width,
int height);
117 void updateAvformatCaching(
int trackCount);
118 bool isAudioFilter(
const QString& name);
119 int realTime()
const;
120 void setImageDurationFromDefault(Service* service)
const;
121 void setDurationFromDefault(Producer* service)
const;
122 void lockCreationTime(Producer* producer)
const;
123 QUuid uuid(Mlt::Properties &properties)
const;
124 void setUuid(Mlt::Properties &properties, QUuid uid)
const;
125 QUuid ensureHasUuid(Mlt::Properties& properties)
const;
126 static void copyFilters(Mlt::Producer& fromProducer, Mlt::Producer& toProducer,
bool fromClipboard =
false);
127 void copyFilters(Mlt::Producer* producer =
nullptr);
128 void pasteFilters(Mlt::Producer* producer =
nullptr);
129 static void adjustFilters(Mlt::Producer& producer,
int startIndex = 0);
130 bool hasFiltersOnClipboard()
const {
131 return m_filtersClipboard->is_valid() && m_filtersClipboard->filter_count() > 0;
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);
175 Mlt::Repository* m_repo;
176 QScopedPointer<Mlt::Producer> m_producer;
177 QScopedPointer<Mlt::FilteredConsumer> m_consumer;
180 Mlt::Profile m_profile;
181 Mlt::Profile m_previewProfile;
182 int m_audioChannels{2};
183 QScopedPointer<Mlt::Filter> m_jackFilter;
185 double m_volume{1.0};
186 TransportControl m_transportControl;
187 QScopedPointer<Mlt::Producer> m_savedProducer;
188 QScopedPointer<Mlt::Producer> m_filtersClipboard;
189 unsigned m_skipJackEvents{0};
190 QString m_projectFolder;
191 QMutex m_saveXmlMutex;
193 static void on_jack_started(mlt_properties owner,
void*
object,
const mlt_position *position);
194 void onJackStarted(
int position);
195 static void on_jack_stopped(mlt_properties owner,
void*
object,
const mlt_position *position);
196 void onJackStopped(
int position);
202 #define MLT Mlt::Controller::singleton()
204 #endif // MLTCONTROLLER_H