#include <KMessageBox>
#include <KLocale>
-
-#include <mlt++/Mlt.h>
-
-
#include "renderer.h"
+#include "kdenlivesettings.h"
+
+static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr)
+{
+ // detect if the producer has finished playing. Is there a better way to do it ?
+ //if (self->isBlocked) return;
+ if (mlt_properties_get_double( MLT_FRAME_PROPERTIES( frame_ptr ), "_speed" ) == 0.0) {
+ self->emitConsumerStopped();
+ }
+ else
+ {
+ self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
+ }
+}
-Render::Render(const QString & rendererName, QWidget *parent):QObject(parent), m_name(rendererName), m_mltConsumer(NULL), m_mltProducer(NULL), m_mltTextProducer(NULL), m_sceneList(QDomDocument()), m_winid(-1), m_framePosition(0), m_generateScenelist(false), isBlocked(true)
+Render::Render(const QString & rendererName, int winid, int extid, QWidget *parent):QObject(parent), m_name(rendererName), m_mltConsumer(NULL), m_mltProducer(NULL), m_mltTextProducer(NULL), m_sceneList(QDomDocument()), m_winid(-1), m_framePosition(0), m_generateScenelist(false), m_isBlocked(true)
{
+ kDebug()<<"////////// USING PROFILE: "<<qstrdup(KdenliveSettings::current_profile().toUtf8());
+ m_mltProfile = new Mlt::Profile((char*) qstrdup(KdenliveSettings::current_profile().toUtf8()));
refreshTimer = new QTimer( this );
connect( refreshTimer, SIGNAL(timeout()), this, SLOT( refresh()) );
connect( osdTimer, SIGNAL(timeout()), this, SLOT(slotOsdTimeout()) );
m_osdProfile = KStandardDirs::locate("data", "kdenlive/profiles/metadata.properties");
+ //if (rendererName == "clip")
+ {
+ //Mlt::Consumer *consumer = new Mlt::Consumer( profile , "sdl_preview");
+ m_mltConsumer = new Mlt::Consumer( *m_mltProfile , "sdl_preview");//consumer;
+ m_mltConsumer->set("resize", 1);
+ m_mltConsumer->set("window_id", winid);
+ m_mltConsumer->set("terminate_on_pause", 1);
+ m_externalwinid = extid;
+ m_winid = winid;
+ m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
+ Mlt::Producer *producer = new Mlt::Producer( *m_mltProfile , "westley-xml", "<westley><playlist><producer mlt_service=\"colour\" colour=\"blue\" /></playlist></westley>");
+ m_mltProducer = producer;
+ m_mltConsumer->connect(*m_mltProducer);
+ m_mltProducer->set_speed(0.0);
+ //m_mltConsumer->start();
+ //refresh();
+ //initSceneList();
+ }
/*m_osdInfo = new Mlt::Filter("data_show");
char *tmp = decodedString(m_osdProfile);
m_osdInfo->set("resource", tmp);
//delete m_osdInfo;
}
-
-
-static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr)
-{
- // detect if the producer has finished playing. Is there a better way to do it ?
- //if (self->isBlocked) return;
- if (mlt_properties_get_double( MLT_FRAME_PROPERTIES( frame_ptr ), "_speed" ) == 0.0) {
- self->emitConsumerStopped();
- }
- else {
- self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
- }
-}
-
-/** Wraps the VEML command of the same name; requests that the renderer
-should create a video window. If show is true, then the window should be
-displayed, otherwise it should be hidden. Render will emit the signal
-replyCreateVideoXWindow() once the renderer has replied. */
-
-void Render::createVideoXWindow(WId winid, WId externalMonitor)
-{
- if (m_mltConsumer) {
- delete m_mltConsumer;
- }
-
- m_mltConsumer = new Mlt::Consumer("sdl_preview");
- if (!m_mltConsumer || !m_mltConsumer->is_valid()) {
- KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install.\n Exiting now..."));
- kError()<<"Sorry, cannot create MLT consumer, check your MLT install you miss SDL libraries support in MLT";
- exit(1);
- }
-
- //only as is saw, if we want to lock something with the sdl lock
- /*if (!KdenliveSettings::videoprofile().isEmpty())
- m_mltConsumer->set("profile", KdenliveSettings::videoprofile().ascii());*/
-
- m_mltConsumer->set("profile", "hdv_1080_50i"); //KdenliveSettings::videoprofile().ascii());
- /*m_mltConsumer->set("app_locked", 1);
- m_mltConsumer->set("app_lock", (void *) &my_lock, 0);
- m_mltConsumer->set("app_unlock", (void *) &my_unlock, 0);*/
- m_externalwinid = (int) externalMonitor;
- m_winid = (int) winid;
-
- m_mltConsumer->set("window_id", m_winid);
- m_mltConsumer->set("resize", 1);
-
- m_mltConsumer->set("terminate_on_pause", 1);
- /*QString aDevice = KdenliveSettings::audiodevice();
- if (!KdenliveSettings::videodriver().isEmpty()) m_mltConsumer->set("video_driver", KdenliveSettings::videodriver().ascii());
- if (!KdenliveSettings::audiodriver().isEmpty()) m_mltConsumer->set("audio_driver", KdenliveSettings::audiodriver().ascii());
- m_mltConsumer->set("audio_device", aDevice.section(";", 1).ascii());*/
- m_mltConsumer->set("progressive", 1);
- m_mltConsumer->set("audio_buffer", 1024);
- m_mltConsumer->set("frequency", 48000);
-
- m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
- //m_mltConsumer->start();
- initSceneList();
-
- //QTimer::singleShot(500, this, SLOT(initSceneList()));
- //initSceneList();
-// m_mltConsumer->listen("consumer-stopped", this, (mlt_listener) consumer_stopped);
-// m_mltConsumer->set("buffer", 25);
-}
int Render::resetRendererProfile(char * profile)
if (!m_mltConsumer) return 0;
if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
m_mltConsumer->set("refresh", 0);
- m_mltConsumer->set("profile", profile);
+ //m_mltConsumer->set("profile", profile);
kDebug()<<" + + RESET CONSUMER WITH PROFILE: "<<profile;
- m_fps = 25;
- m_mltConsumer->set("fps", m_fps);
mlt_properties properties = MLT_CONSUMER_PROPERTIES( m_mltConsumer->get_consumer() );
- int result = mlt_consumer_profile( properties, profile );
+// apply_profile_properties( m_profile, m_mltConsumer->get_consumer(), properties );
refresh();
- return result;
-}
-
-void Render::restartConsumer()
-{
- if (m_winid != -1) createVideoXWindow( m_winid, m_externalwinid);
+ return 1;
}
/** Wraps the VEML command of the same name; Seeks the renderer clip to the given time. */
char *t = new char[fn.length() + 1];
strcpy(t, (const char *)fn);*/
- return qstrdup( str.toLatin1().data() );
+ return qstrdup( str.toUtf8().data() ); //toLatin1
}
//static
QPixmap pix(width, height);
mlt_image_format format = mlt_image_rgb24a;
- /*if (border) {
- width = width -2;
- height = height -2;
- }*/
uint8_t *thumb = frame->get_image(format, width, height);
QImage image(thumb, width, height, QImage::Format_ARGB32);
QPainter painter(&pix);
painter.drawRect(0, 0, width - 1, height - 1);
}
- /*if (!border) pix = pix.fromImage(image);
- //bitBlt(&pix, 0, 0, &image, 0, 0, width, height);
- else {
- pix.fill(black);
- bitBlt(&pix, 1, 1, &image, 0, 0, width, height);
- }*/
}
else pix.fill(Qt::black);
return pix;
return pix;
}
Mlt::Producer *mlt_producer = m_mltProducer->cut(frame_position, frame_position + 1);
- Mlt::Filter m_convert("avcolour_space");
+ Mlt::Filter m_convert(*m_mltProfile, "avcolour_space");
m_convert.set("forced", mlt_image_rgb24a);
mlt_producer->attach(m_convert);
Mlt::Frame *frame = mlt_producer->get_frame();
}
//static
-QPixmap Render::getVideoThumbnail(QString file, int frame_position, int width, int height)
+QPixmap Render::getVideoThumbnail(char *profile, QString file, int frame_position, int width, int height)
{
QPixmap pix(width, height);
char *tmp = decodedString(file);
- Mlt::Producer m_producer(tmp);
+ Mlt::Profile *prof = new Mlt::Profile(profile);
+ Mlt::Producer m_producer(*prof, tmp);
delete[] tmp;
if (m_producer.is_blank()) {
pix.fill(Qt::black);
return pix;
}
- Mlt::Filter m_convert("avcolour_space");
+ Mlt::Filter m_convert(*prof, "avcolour_space");
m_convert.set("forced", mlt_image_rgb24a);
m_producer.attach(m_convert);
m_producer.seek(frame_position);
pix = frameThumbnail(frame, width, height, true);
delete frame;
}
+ if (prof) delete prof;
return pix;
}
-
+/*
void Render::getImage(KUrl url, int frame_position, QPoint size)
{
char *tmp = decodedString(url.path());
delete frame;
emit replyGetImage(url, frame_position, pix, size.x(), size.y());
}
-}
+}*/
/* Create thumbnail for color */
-void Render::getImage(int id, QString color, QPoint size)
+/*void Render::getImage(int id, QString color, QPoint size)
{
QPixmap pixmap(size.x() - 2, size.y() - 2);
color = color.replace(0, 2, "#");
//copyBlt(&result, 1, 1, &pixmap, 0, 0, size.x() - 2, size.y() - 2);
emit replyGetImage(id, result, size.x(), size.y());
-}
+}*/
/* Create thumbnail for image */
-void Render::getImage(KUrl url, QPoint size)
+/*void Render::getImage(KUrl url, QPoint size)
{
QImage im;
QPixmap pixmap;
result.fill(Qt::black);
//copyBlt(&result, 1, 1, &pixmap, 0, 0, size.x() - 2, size.y() - 2);
emit replyGetImage(url, 1, result, size.x(), size.y());
-}
+}*/
double Render::consumerRatio() const
bool Render::isValid(KUrl url)
{
char *tmp = decodedString(url.path());
- Mlt::Producer producer(tmp);
+ Mlt::Producer producer(*m_mltProfile, tmp);
delete[] tmp;
if (producer.is_blank())
return false;
return true;
}
-
-void Render::getFileProperties(const KUrl &url, uint framenb)
+void Render::getFileProperties(const QDomElement &xml, int clipId)
{
int height = 40;
int width = height * 16/9.0; //KdenliveSettings::displayratio();
- char *tmp = decodedString(url.path());
- Mlt::Producer producer(tmp);
+ QDomDocument doc;
+ QDomElement westley = doc.createElement("westley");
+ doc.appendChild(westley);
+ westley.appendChild(doc.importNode(xml, true));
+ kDebug()<<"////////////\n"<<doc.toString()<<"////////////////\n";
+ char *tmp = decodedString(doc.toString());
+
+ Mlt::Producer producer(*m_mltProfile, "westley-xml", tmp);
delete[] tmp;
+
if (producer.is_blank()) {
return;
}
- producer.seek( framenb );
+ int frameNumber = xml.attribute( "frame_thumbnail", 0).toInt();
+ if ( frameNumber != 0 ) producer.seek( frameNumber );
mlt_properties properties = MLT_PRODUCER_PROPERTIES( producer.get_producer() );
QMap < QString, QString > filePropertyMap;
QMap < QString, QString > metadataPropertyMap;
+ KUrl url = xml.attribute("resource", QString::null);
filePropertyMap["filename"] = url.path();
filePropertyMap["duration"] = QString::number(producer.get_playtime());
-
- Mlt::Filter m_convert("avcolour_space");
+ kDebug()<<"/////// PRODUCER: "<<url.path()<<" IS: "<<producer.get_playtime();
+ Mlt::Filter m_convert(*m_mltProfile, "avcolour_space");
m_convert.set("forced", mlt_image_rgb24a);
producer.attach(m_convert);
-
Mlt::Frame * frame = producer.get_frame();
if (frame->is_valid()) {
// Generate thumbnail for this frame
QPixmap pixmap = frameThumbnail(frame, width, height, true);
- emit replyGetImage(url, 0, pixmap, width, height);
+ emit replyGetImage(clipId, 0, pixmap, width, height);
} else if (frame->get_int("test_audio") == 0) {
QPixmap pixmap(KStandardDirs::locate("appdata", "graphics/music.png"));
- emit replyGetImage(url, 0, pixmap, width, height);
+ emit replyGetImage(clipId, 0, pixmap, width, height);
filePropertyMap["type"] = "audio";
}
}
- emit replyGetFileProperties(filePropertyMap, metadataPropertyMap);
+ emit replyGetFileProperties(clipId, filePropertyMap, metadataPropertyMap);
kDebug()<<"REquested fuile info for: "<<url.path();
delete frame;
}
kWarning()<<"////// RENDER, SET SCENE LIST";
- Mlt::Playlist track;
- char *tmp = decodedString(list.toString());
-
- Mlt::Producer clip("westley-xml", tmp);
- delete[] tmp;
+/*
if (!clip.is_valid()) {
kWarning()<<" ++++ WARNING, UNABLE TO CREATE MLT PRODUCER";
m_generateScenelist = false;
return;
- }
-
- track.append(clip);
+ }*/
if (m_mltConsumer) {
m_mltConsumer->set("refresh", 0);
emit stopped();
}
- m_mltProducer = new Mlt::Producer(clip); //track.current();
- m_mltProducer->optimise();
+ char *tmp = decodedString(list.toString());
+ //Mlt::Producer clip(profile, "westley-xml", tmp);
+
+ m_mltProducer = new Mlt::Producer(*m_mltProfile, "westley-xml", tmp);
+ delete[] tmp;
+ //m_mltProducer->optimise();
if (position != 0) m_mltProducer->seek(position);
/*if (KdenliveSettings::osdtimecode()) {
}*/
m_fps = m_mltProducer->get_fps();
- if (!m_mltConsumer) {
- restartConsumer();
- }
- emit playListDuration( (int) m_mltProducer->get_playtime());
- m_connectTimer->start( 500 );
+
+ emit playListDuration(m_mltProducer->get_playtime());
+ //m_connectTimer->start( 500 );
+ connectPlaylist();
m_generateScenelist = false;
}
}
void Render::connectPlaylist() {
- kDebug()<<"************** CONNECTING PLAYLIST";
+
m_connectTimer->stop();
+ m_mltConsumer->connect(*m_mltProducer);
+ m_mltProducer->set_speed(0.0);
+ m_mltConsumer->start();
+ //refresh();
+/*
if (m_mltConsumer->start() == -1) {
KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it."));
m_mltConsumer = NULL;
}
else {
- m_mltConsumer->connect(*m_mltProducer);
- m_mltProducer->set_speed(0.0);
refresh();
- }
+ }*/
}
void Render::refreshDisplay() {
void Render::start()
{
- if (!m_mltConsumer || m_winid == -1) {
- restartConsumer();
+ kDebug()<<"----- STARTING MONITOR: "<<m_name;
+ if (m_winid == -1) {
+ kDebug()<<"----- BROKEN MONITOR: "<<m_name<<", RESTART";
return;
}
if (m_mltConsumer->is_stopped()) {
+ kDebug()<<"----- MONITOR: "<<m_name<<" WAS STOPPED";
if (m_mltConsumer->start() == -1) {
KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it."));
m_mltConsumer = NULL;
return;
}
else {
+ kDebug()<<"----- MONITOR: "<<m_name<<" REFRESH";
refresh();
}
}
- isBlocked = false;
+ m_isBlocked = false;
}
void Render::clear()
void Render::stop()
{
- kDebug()<<"///////////// RENDER STOP-------";
if (m_mltConsumer && !m_mltConsumer->is_stopped()) {
+ kDebug()<<"///////////// RENDER STOPPED: "<<m_name;
m_mltConsumer->set("refresh", 0);
- // m_mltConsumer->stop();
+ m_mltConsumer->stop();
}
kDebug()<<"///////////// RENDER STOP2-------";
- isBlocked = true;
+ m_isBlocked = true;
if (m_mltProducer) {
m_mltProducer->set_speed(0.0);
refreshTimer->start( 200 );
}
+void Render::doRefresh()
+{
+ // Use a Timer so that we don't refresh too much
+ refresh();
+}
+
void Render::refresh()
{
- if (!m_mltProducer)
+ if (!m_mltProducer || m_isBlocked)
return;
refreshTimer->stop();
if (m_mltConsumer) {
int width = 1940; //KdenliveSettings::displaywidth();
QPixmap pix(width, height);
-
- Mlt::Filter m_convert("avcolour_space");
+ Mlt::Filter m_convert(*m_mltProfile, "avcolour_space");
m_convert.set("forced", mlt_image_rgb24a);
m_mltProducer->attach(m_convert);
Mlt::Frame * frame = m_mltProducer->get_frame();
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
duration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime() - 1;
m_mltProducer->set("out", duration);
- emit durationChanged();
+ emit playListDuration(duration);
return;
}
while (trackNb > 1) {
blackTrackPlaylist.remove_region( 0, blackDuration );
int i = 0;
int dur = duration;
-
+ QDomDocument doc;
+ QDomElement black = doc.createElement("producer");
+ black.setAttribute("mlt_service", "colour");
+ black.setAttribute("colour", "black");
+ black.setAttribute("in", "0");
+ black.setAttribute("out", "13999");
while (dur > 14000) { // <producer mlt_service=\"colour\" colour=\"black\" in=\"0\" out=\"13999\" />
- mltInsertClip(0, GenTime(i * 14000, m_fps), QString("<westley><producer mlt_service=\"colour\" colour=\"black\" in=\"0\" out=\"13999\" /></westley>"));
+ mltInsertClip(0, GenTime(i * 14000, m_fps), black);
dur = dur - 14000;
i++;
}
-
- mltInsertClip(0, GenTime(), QString("<westley><producer mlt_service=\"colour\" colour=\"black\" in=\"0\" out=\"" + QString::number(dur) + "\" /></westley>"));
+ black.setAttribute("out", QString::number(dur));
+ mltInsertClip(0, GenTime(), black);
m_mltProducer->set("out", duration);
- emit durationChanged();
+ emit playListDuration(duration);
}
}
-void Render::mltInsertClip(int track, GenTime position, QString resource)
+void Render::mltInsertClip(int track, GenTime position, QDomElement element)
{
if (!m_mltProducer) {
kDebug()<<"PLAYLIST NOT INITIALISED //////";
kDebug()<<"PLAYLIST BROKEN, CANNOT INSERT CLIP //////";
return;
}
+ m_isBlocked = true;
Mlt::Service service(parentProd.get_service());
Mlt::Tractor tractor(service);
+ QDomDocument doc;
+ doc.appendChild(doc.importNode(element, true));
+ QString resource = doc.toString();
+ kDebug()<<"/////// ADDING CLIP TMLNE: "<<resource<<" ON TRACK: "<<track;
Mlt::Producer trackProducer(tractor.track(track));
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
char *tmp = decodedString(resource);
- Mlt::Producer clip("westley-xml", tmp);
+ Mlt::Producer clip(*m_mltProfile, "westley-xml", tmp);
//clip.set_in_and_out(in.frames(m_fps), out.frames(m_fps));
delete[] tmp;
tractor.multitrack()->refresh();
tractor.refresh();
if (track != 0) mltCheckLength();
- double duration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime();
- kDebug()<<"// + +INSERTING CLIP: "<<resource<<" AT: "<<position.frames(m_fps)<<" on track: "<<track<<", DURATION: "<<duration;
-
-
+ m_isBlocked = false;
}
void Render::mltCutClip(int track, GenTime position)
{
+ m_isBlocked = true;
Mlt::Service service(m_mltProducer->parent().get_service());
- if (service.type() == playlist_type) kDebug()<<"// PLAYLIST TYPE";
- if (service.type() == tractor_type) kDebug()<<"// TRACOT TYPE";
- if (service.type() == multitrack_type) kDebug()<<"// MULTITRACK TYPE";
- if (service.type() == producer_type) kDebug()<<"// PROD TYPE";
-
Mlt::Tractor tractor(service);
Mlt::Producer trackProducer(tractor.track(track));
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
trackPlaylist.split_at(position.frames(m_fps));
trackPlaylist.consolidate_blanks(0);
kDebug()<<"/ / / /CUTTING CLIP AT: "<<position.frames(m_fps);
+ m_isBlocked = false;
}
void Render::mltRemoveClip(int track, GenTime position)
{
+ m_isBlocked = true;
Mlt::Service service(m_mltProducer->parent().get_service());
- if (service.type() == playlist_type) kDebug()<<"// PLAYLIST TYPE";
- if (service.type() == tractor_type) kDebug()<<"// TRACOT TYPE";
- if (service.type() == multitrack_type) kDebug()<<"// MULTITRACK TYPE";
- if (service.type() == producer_type) kDebug()<<"// PROD TYPE";
-
Mlt::Tractor tractor(service);
Mlt::Producer trackProducer(tractor.track(track));
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
trackPlaylist.consolidate_blanks(0);
if (track != 0) mltCheckLength();
//emit durationChanged();
+ m_isBlocked = false;
}
-void Render::mltRemoveEffect(int track, GenTime position, QString id, QString tag, int index)
+void Render::mltRemoveEffect(int track, GenTime position, QString tag, int index)
{
+
Mlt::Service service(m_mltProducer->parent().get_service());
Mlt::Tractor tractor(service);
kDebug()<<" / / / CANNOT FIND CLIP TO REMOVE EFFECT";
return;
}
+ m_isBlocked = true;
Mlt::Service clipService(clip->get_service());
if (tag.startsWith("ladspa")) tag = "ladspa";
int ct = 0;
Mlt::Filter *filter = clipService.filter( ct );
while (filter) {
- if (filter->get("mlt_service") == tag && filter->get("kdenlive_id") == id) {
+ if (filter->get("mlt_service") == tag) {// && filter->get("kdenlive_id") == id) {
clipService.detach(*filter);
kDebug()<<" / / / DLEETED EFFECT: "<<ct;
}
}
else {
Mlt::Filter *filter = clipService.filter( index );
- if (filter && filter->get("mlt_service") == tag && filter->get("kdenlive_id") == id) clipService.detach(*filter);
+ if (filter && filter->get("mlt_service") == tag /*&& filter->get("kdenlive_id") == id*/) clipService.detach(*filter);
else {
- kDebug()<<"WARINIG, FILTER "<<id<<" NOT FOUND!!!!!";
+ kDebug()<<"WARINIG, FILTER "<<tag<<" NOT FOUND!!!!!";
}
}
+ m_isBlocked = false;
refresh();
}
-void Render::mltAddEffect(int track, GenTime position, QString id, QString tag, QMap <QString, QString> args)
+void Render::mltAddEffect(int track, GenTime position, QString tag, QMap <QString, QString> args)
{
Mlt::Service service(m_mltProducer->parent().get_service());
-
Mlt::Tractor tractor(service);
Mlt::Producer trackProducer(tractor.track(track));
Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
return;
}
Mlt::Service clipService(clip->get_service());
-
+ m_isBlocked = true;
// create filter
- kDebug()<<" / / INSERTING EFFECT: "<<id;
+ //kDebug()<<" / / INSERTING EFFECT: "<<id;
if (tag.startsWith("ladspa")) tag = "ladspa";
char *filterId = decodedString(tag);
- Mlt::Filter *filter = new Mlt::Filter(filterId);
+ Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterId);
filter->set("kdenlive_id", filterId);
QMap<QString, QString>::Iterator it;
if (currentKeyFrameNumber != keyFrameNumber) {
// attach filter to the clip
clipService.attach(*filter);
- filter = new Mlt::Filter(filterId);
+ filter = new Mlt::Filter(*m_mltProfile, filterId);
filter->set("kdenlive_id", filterId);
keyFrameNumber = currentKeyFrameNumber;
}
// attach filter to the clip
clipService.attach(*filter);
delete[] filterId;
+ m_isBlocked = false;
refresh();
}
QMap<QString, QString>::Iterator it = args.begin();
if (it.key().startsWith("#") || tag.startsWith("ladspa") || tag == "sox" || tag == "autotrack_rectangle") {
// This is a keyframe effect, to edit it, we remove it and re-add it.
- mltRemoveEffect(track, position, id, tag, -1);
- mltAddEffect(track, position, id, tag, args);
+ mltRemoveEffect(track, position, tag, -1);
+ mltAddEffect(track, position, tag, args);
return;
}
-
+ m_isBlocked = true;
// create filter
Mlt::Service service(m_mltProducer->parent().get_service());
}
if (!filter) {
kDebug()<<"WARINIG, FILTER "<<id<<" NOT FOUND!!!!!";
+ m_isBlocked = false;
return;
}
delete[] name;
delete[] value;
}
+ m_isBlocked = false;
refresh();
}
void Render::mltResizeClipEnd(int track, GenTime pos, GenTime in, GenTime out)
{
+ m_isBlocked = true;
Mlt::Service service(m_mltProducer->parent().get_service());
Mlt::Tractor tractor(service);
tractor.multitrack()->refresh();
tractor.refresh();
if (track != 0) mltCheckLength();
-
+ m_isBlocked = false;
}
void Render::mltChangeTrackState(int track, bool mute, bool blind)
void Render::mltResizeClipStart(int track, GenTime pos, GenTime moveEnd, GenTime moveStart, GenTime in, GenTime out)
{
+ m_isBlocked = true;
Mlt::Service service(m_mltProducer->parent().get_service());
- if (service.type() == playlist_type) kDebug()<<"// PLAYLIST TYPE";
- if (service.type() == tractor_type) kDebug()<<"// TRACOT TYPE";
- if (service.type() == multitrack_type) kDebug()<<"// MULTITRACK TYPE";
- if (service.type() == producer_type) kDebug()<<"// PROD TYPE";
-
int moveFrame = (moveEnd - moveStart).frames(m_fps);
Mlt::Tractor tractor(service);
else trackPlaylist.resize_clip(blankIndex, 0, blankLength + moveFrame -1);
}
trackPlaylist.consolidate_blanks(0);
-
+ m_isBlocked = false;
kDebug()<<"-----------------\n"<<"CLIP 0: "<<trackPlaylist.clip_start(0)<<", LENGT: "<<trackPlaylist.clip_length(0);
kDebug()<<"CLIP 1: "<<trackPlaylist.clip_start(1)<<", LENGT: "<<trackPlaylist.clip_length(1);
kDebug()<<"CLIP 2: "<<trackPlaylist.clip_start(2)<<", LENGT: "<<trackPlaylist.clip_length(2);
void Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd)
{
- m_mltConsumer->set("refresh", 0);
+ m_isBlocked = true;
+ //m_mltConsumer->set("refresh", 0);
Mlt::Service service(m_mltProducer->parent().get_service());
Mlt::Tractor tractor(service);
Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
trackPlaylist.consolidate_blanks(0);
- mlt_events_block( MLT_PRODUCER_PROPERTIES(clipProducer.get_producer()), NULL );
+ mlt_events_block( MLT_PRODUCER_PROPERTIES(trackProducer.get_producer()), NULL );
if (endTrack == startTrack) {
if (!trackPlaylist.is_blank_at(moveEnd)) {
}
mltCheckLength();
- mlt_events_unblock( MLT_PRODUCER_PROPERTIES(clipProducer.get_producer()), NULL );
+ mlt_events_unblock( MLT_PRODUCER_PROPERTIES(trackProducer.get_producer()), NULL );
+ m_isBlocked = false;
+ m_mltConsumer->set("refresh", 1);
}
void Render::mltMoveTransition(QString type, int startTrack, int trackOffset, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut)
{
+ m_isBlocked = true;
m_mltConsumer->set("refresh", 0);
mlt_service serv = m_mltProducer->parent().get_service();
mlt_type = mlt_properties_get( properties, "mlt_type" );
resource = mlt_properties_get( properties, "mlt_service" );
}
+ m_isBlocked = false;
}
void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args)
{
+ m_isBlocked = true;
Mlt::Service service(m_mltProducer->parent().get_service());
Mlt::Tractor tractor(service);
Mlt::Field *field = tractor.field();
-
char *transId = decodedString(tag);
- Mlt::Transition *transition = new Mlt::Transition(transId);
+ Mlt::Transition *transition = new Mlt::Transition(*m_mltProfile, transId);
transition->set_in_and_out((int) in.frames(m_fps), (int) out.frames(m_fps));
QMap<QString, QString>::Iterator it;
QString key;
// attach filter to the clip
field->plant_transition(*transition, a_track, b_track);
delete[] transId;
+ m_isBlocked = false;
refresh();
}
void Render::mltSavePlaylist()
{
kWarning()<<"// UPDATING PLAYLIST TO DISK++++++++++++++++";
- Mlt::Consumer *fileConsumer = new Mlt::Consumer("westley");
+ Mlt::Consumer *fileConsumer = new Mlt::Consumer(*m_mltProfile, "westley");
fileConsumer->set("resource", "/home/one/playlist.xml");
Mlt::Service service(m_mltProducer->get_service());