18#ifndef MLTCONTROLLER_H
19#define MLTCONTROLLER_H
21#include "transportcontrol.h"
26#include <QScopedPointer>
28#include <QTemporaryFile>
31#define MLT_LC_CATEGORY LC_ALL
32#define MLT_LC_NAME "LC_ALL"
34#define kAudioIndexProperty "astream"
35#define kVideoIndexProperty "vstream"
39const int kMaxImageDurationSecs = 3600 * 4;
40extern const QString XmlMimeType;
42class TransportControl :
public TransportControllable
46 void play(
double speed = 1.0)
override;
47 void pause(
int position = -1)
override;
49 void seek(
int position)
override;
50 void rewind(
bool forceChangeDirection)
override;
51 void fastForward(
bool forceChangeDirection)
override;
52 void previous(
int currentPosition)
override;
53 void next(
int currentPosition)
override;
54 void setIn(
int)
override;
55 void setOut(
int)
override;
62 virtual int reconfigure(
bool isMulti) = 0;
66 FILTER_INDEX_ALL = -1,
67 FILTER_INDEX_ENABLED = -2,
70 static Controller &singleton(QObject *parent =
nullptr);
71 virtual ~Controller();
72 static void destroy();
74 virtual QObject *videoWidget() = 0;
75 virtual int setProducer(Mlt::Producer *,
bool isMulti =
false);
76 virtual int open(
const QString &url,
const QString &urlToSave,
bool skipConvert =
false);
77 bool openXML(
const QString &filename);
79 virtual int displayWidth()
const = 0;
80 virtual int displayHeight()
const = 0;
83 virtual void play(
double speed = 1.0);
84 bool isPaused()
const;
85 virtual void pause(
int position = -1);
87 bool enableJack(
bool enable =
true);
88 void setVolume(
double volume,
bool muteOnPause =
true);
89 double volume()
const;
90 void onWindowResize();
91 virtual void seek(
int position);
92 virtual void refreshConsumer(
bool scrubAudio =
false);
93 bool saveXML(
const QString &filename,
94 Service *service =
nullptr,
95 bool withRelativePaths =
true,
96 QTemporaryFile *tempFile =
nullptr,
98 QString projectNote = QString());
99 QString XML(Service *service =
nullptr,
bool withProfile =
false,
bool withMetadata =
true);
100 int consumerChanged();
101 void setProfile(
const QString &profile_name);
102 void setAudioChannels(
int audioChannels);
103 QString resource()
const;
104 bool isSeekable(Mlt::Producer *p =
nullptr)
const;
105 int maxFrameCount()
const;
106 bool isLiveProducer(Mlt::Producer *p =
nullptr)
const;
108 bool isClosedClip(Producer *producer =
nullptr)
const;
109 bool isSeekableClip();
110 bool isPlaylist()
const;
111 bool isMultitrack()
const;
112 bool isImageProducer(Service *service)
const;
113 bool isFileProducer(Service *service)
const;
114 void rewind(
bool forceChangeDirection);
115 void fastForward(
bool forceChangeDirection);
116 void previous(
int currentPosition);
117 void next(
int currentPosition);
120 void fixLengthProperties(Service &service);
121 void restart(
const QString &xml =
"");
123 QImage image(Frame *frame,
int width,
int height);
124 QImage image(Mlt::Producer &producer,
int frameNumber,
int width,
int height);
125 void updateAvformatCaching(
int trackCount);
126 bool isAudioFilter(
const QString &name);
127 int realTime()
const;
128 void setImageDurationFromDefault(Service *service)
const;
129 void setDurationFromDefault(Producer *service)
const;
130 void lockCreationTime(Producer *producer)
const;
131 Producer *setupNewProducer(Producer *newProducer)
const;
132 QUuid uuid(Mlt::Properties &properties)
const;
133 void setUuid(Mlt::Properties &properties, QUuid uid)
const;
134 QUuid ensureHasUuid(Mlt::Properties &properties)
const;
135 static void copyFilters(Mlt::Producer &fromProducer,
136 Mlt::Producer &toProducer,
137 bool fromClipboard =
false,
138 int filterIndex = FILTER_INDEX_ENABLED);
139 void copyFilters(Mlt::Producer *producer =
nullptr,
int filterIndex = FILTER_INDEX_ENABLED);
140 void pasteFilters(Mlt::Producer *producer =
nullptr, Mlt::Producer *fromProducer =
nullptr);
141 static void adjustFilters(Mlt::Producer &producer,
int startIndex = 0);
142 static void adjustFilter(
143 Mlt::Filter *filter,
int in,
int out,
int inDelta,
int outDelta,
int keyframeDelta);
144 static void adjustClipFilters(
145 Mlt::Producer &producer,
int in,
int out,
int inDelta,
int outDelta,
int keyframeDelta);
146 bool hasFiltersOnClipboard()
const
148 return m_filtersClipboard->is_valid() && m_filtersClipboard->filter_count() > 0;
150 QString filtersClipboardXML() {
return XML(m_filtersClipboard.get()); }
152 int audioChannels()
const {
return m_audioChannels; }
153 Mlt::Repository *repository()
const {
return m_repo; }
154 Mlt::Profile &profile() {
return m_profile; }
155 Mlt::Profile &previewProfile() {
return m_previewProfile; }
156 Mlt::Producer *producer()
const {
return m_producer.data(); }
157 Mlt::Consumer *consumer()
const {
return m_consumer.data(); }
158 const QString &URL()
const {
return m_url; }
159 const TransportControllable *transportControl()
const {
return &m_transportControl; }
160 Mlt::Producer *savedProducer()
const {
return m_savedProducer.data(); }
161 void setSavedProducer(Mlt::Producer *producer);
162 static Mlt::Filter *getFilter(
const QString &name, Mlt::Service *service);
163 static Mlt::Link *getLink(
const QString &name, Mlt::Service *service);
164 QString projectFolder()
const {
return m_projectFolder; }
165 void setProjectFolder(
const QString &folderName);
166 QChar decimalPoint();
167 static void resetLocale();
168 static int filterIn(Mlt::Playlist &playlist,
int clipIndex);
169 static int filterOut(Mlt::Playlist &playlist,
int clipIndex);
170 void setPreviewScale(
int scale);
171 void updatePreviewProfile();
172 static void purgeMemoryPool();
173 static bool fullRange(Mlt::Producer &producer);
174 static bool isMltXml(
const QString &s) {
return s.contains(
"<mlt "); }
175 static bool isTrackProducer(Mlt::Producer &producer);
176 static int checkFile(
const QString &path);
177 bool blockRefresh(
bool block);
182 RefreshBlocker() { singleton().blockRefresh(
true); }
183 ~RefreshBlocker() { singleton().blockRefresh(
false); }
187 Mlt::Repository *m_repo;
188 QScopedPointer<Mlt::Producer> m_producer;
189 QScopedPointer<Mlt::FilteredConsumer> m_consumer;
192 Mlt::Profile m_profile;
193 Mlt::Profile m_previewProfile;
194 int m_audioChannels{2};
195 QScopedPointer<Mlt::Filter> m_jackFilter;
197 double m_volume{1.0};
198 TransportControl m_transportControl;
199 QScopedPointer<Mlt::Producer> m_savedProducer;
200 QScopedPointer<Mlt::Producer> m_filtersClipboard;
201 unsigned m_skipJackEvents{0};
202 QString m_projectFolder;
203 QMutex m_saveXmlMutex;
206 static void on_jack_started(mlt_properties owner,
void *
object, mlt_event_data data);
207 void onJackStarted(
int position);
208 static void on_jack_stopped(mlt_properties owner,
void *
object, mlt_event_data data);
209 void onJackStopped(
int position);
211 void initFiltersClipboard();
216#define MLT Mlt::Controller::singleton()