#include <QTimer>
#include <QDir>
+#include <QString>
#include <QApplication>
-#include <stdlib.h>
+#include <cstdlib>
+#include <cstdarg>
if (level > MLT_LOG_ERROR) return;
QString error;
QApplication::postEvent(qApp->activeWindow() , new MltErrorEvent(error.vsprintf(fmt, vl).simplified()));
+ va_end(vl);
}
#ifdef Q_WS_MAC
self->showFrame(frame);
#endif
+
+ self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
if (frame.get_double("_speed") == 0.0) {
self->emitConsumerStopped();
- } else {
- self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
+ } else if (frame.get_double("_speed") < 0.0 && mlt_frame_get_position(frame_ptr) <= 0) {
+ self->pause();
+ self->emitConsumerStopped();
}
}
+
Render::Render(const QString & rendererName, int winid, int /* extid */, QString profile, QWidget *parent) :
QObject(parent),
m_isBlocked(0),
m_blackClip = new Mlt::Producer(*m_mltProfile , "colour", "black");
m_blackClip->set("id", "black");
+ m_blackClip->set("mlt_type", "producer");
}
int Render::resetProfile(const QString profileName)
{
- if (!m_mltConsumer) return 0;
- if (m_activeProfile == profileName) {
- kDebug() << "reset to same profile, nothing to do";
- return 1;
+ if (m_mltConsumer) {
+ QString videoDriver = KdenliveSettings::videodrivername();
+ QString currentDriver = m_mltConsumer->get("video_driver");
+ if (getenv("SDL_VIDEO_YUV_HWACCEL") != NULL && currentDriver == "x11") currentDriver = "x11_noaccel";
+ if (m_activeProfile == profileName && currentDriver == videoDriver) {
+ kDebug() << "reset to same profile, nothing to do";
+ return 1;
+ }
+
+ if (m_isSplitView) slotSplitView(false);
+ if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
+ m_mltConsumer->purge();
+ delete m_mltConsumer;
+ m_mltConsumer = NULL;
}
- kDebug() << "// RESETTING PROFILE FROM: " << m_activeProfile << " TO: " << profileName; //KdenliveSettings::current_profile();
- if (m_isSplitView) slotSplitView(false);
- if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
- m_mltConsumer->purge();
- delete m_mltConsumer;
- m_mltConsumer = NULL;
QString scene = sceneList();
int pos = 0;
double current_fps = m_mltProfile->fps();
double aspect = xml.attribute("force_aspect_ratio").toDouble();
if (aspect > 0) producer->set("force_aspect_ratio", aspect);
}
+
+ if (xml.hasAttribute("force_fps")) {
+ double fps = xml.attribute("force_fps").toDouble();
+ if (fps > 0) producer->set("force_fps", fps);
+ }
+
+ if (xml.hasAttribute("force_progressive")) {
+ bool ok;
+ int progressive = xml.attribute("force_progressive").toInt(&ok);
+ if (ok) producer->set("force_progressive", progressive);
+ }
if (xml.hasAttribute("threads")) {
int threads = xml.attribute("threads").toInt();
if (threads != 1) producer->set("threads", threads);
if (name.endsWith("markup") && !value.isEmpty())
metadataPropertyMap[ name.section('.', 0, -2)] = value;
}
-
+ producer->seek(0);
emit replyGetFileProperties(clipId, producer, filePropertyMap, metadataPropertyMap, replaceProducer);
kDebug() << "REquested fuile info for: " << url.path();
delete frame;
m_fps = m_mltProducer->get_fps();
int error = connectPlaylist();
+
if (position != -1) {
m_mltProducer->seek(position);
emit rendererPosition(position);
{
if (m_winid == -1) return -1;
m_isBlocked = true;
- int error;
+ int error = 0;
kDebug() << "////// RENDER, SET SCENE LIST: " << playlist;
- if (m_mltConsumer == NULL) {
+ if (m_mltConsumer) {
+ if (!m_mltConsumer->is_stopped()) {
+ m_mltConsumer->stop();
+ }
+ m_mltConsumer->set("refresh", 0);
+ } else {
kWarning() << "/////// ERROR, TRYING TO USE NULL MLT CONSUMER";
- m_isBlocked = false;
- return -1;
+ error = -1;
}
- if (!m_mltConsumer->is_stopped()) {
- m_mltConsumer->stop();
- }
- m_mltConsumer->set("refresh", 0);
-
if (m_mltProducer) {
m_mltProducer->set_speed(0);
//if (KdenliveSettings::osdtimecode() && m_osdInfo) m_mltProducer->detach(*m_osdInfo);
if (!m_mltProducer || !m_mltProducer->is_valid()) {
kDebug() << " WARNING - - - - -INVALID PLAYLIST: " << tmp;
m_mltProducer = m_blackClip->cut(0, 50);
+ error = -1;
}
delete[] tmp;
}
kDebug() << "// NEW SCENE LIST DURATION SET TO: " << m_mltProducer->get_playtime();
- error = connectPlaylist();
+ if (error == 0) error = connectPlaylist();
+ else connectPlaylist();
fillSlowMotionProducers();
m_isBlocked = false;
if (m_mltConsumer->start() == -1) {
// ARGH CONSUMER BROKEN!!!!
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."));
- emit blockMonitors();
- delete m_mltProducer;
- m_mltProducer = NULL;
+ delete m_mltConsumer;
+ m_mltConsumer = NULL;
return -1;
}
emit durationChanged(m_mltProducer->get_playtime());
if (m_mltConsumer && 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."));
- emit blockMonitors();
- delete m_mltProducer;
- m_mltProducer = NULL;
+ //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."));
+ kdWarning() << "/ / / / CANNOT START MONITOR";
} else {
kDebug() << "----- MONITOR: " << m_name << " REFRESH";
m_isBlocked = false;
m_isBlocked = true;
m_mltConsumer->set("refresh", 0);
m_mltProducer->set_speed(0.0);
+ /*
+ The 2 lines below create a flicker loop
emit rendererPosition(m_framePosition);
- m_mltProducer->seek(m_framePosition);
+ m_mltProducer->seek(m_framePosition);*/
m_mltConsumer->purge();
}
m_isBlocked = true;
m_mltConsumer->set("refresh", 0);
m_mltProducer->set_speed(0.0);
- emit rendererPosition(m_framePosition);
+ //emit rendererPosition(m_framePosition);
m_mltProducer->seek(m_framePosition);
m_mltConsumer->purge();
//kDebug()<<" ********* RENDER PAUSE: "<<m_mltProducer->get_speed();
m_mltConsumer->set("play.real_time", dropFrames);
#endif
if (m_mltConsumer->start() == -1) {
- emit blockMonitors();
- delete m_mltProducer;
- m_mltProducer = NULL;
+ kdWarning() << "ERROR, Cannot start monitor";
}
}
if (blackclip == NULL || blackTrackPlaylist.count() != 1) {
blackTrackPlaylist.clear();
- m_blackClip->set("length", duration);
- m_blackClip->set("out", duration - 1);
- blackclip = m_blackClip->cut(0, duration - 1);
+ m_blackClip->set("length", duration + 1);
+ m_blackClip->set("out", duration);
+ blackclip = m_blackClip->cut(0, duration);
blackTrackPlaylist.insert_at(0, blackclip, 1);
} else {
if (duration > blackclip->parent().get_length()) {
- blackclip->parent().set("length", duration);
- blackclip->parent().set("out", duration - 1);
- blackclip->set("length", duration);
+ blackclip->parent().set("length", duration + 1);
+ blackclip->parent().set("out", duration);
+ blackclip->set("length", duration + 1);
}
- blackTrackPlaylist.resize_clip(0, 0, duration - 1);
+ blackTrackPlaylist.resize_clip(0, 0, duration);
}
delete blackclip;
// copy producer props
double ar = original->parent().get_double("force_aspect_ratio");
if (ar != 0.0) slowprod->set("force_aspect_ratio", ar);
+ double fps = original->parent().get_double("force_fps");
+ if (fps != 0.0) slowprod->set("force_fps", fps);
int threads = original->parent().get_int("threads");
if (threads != 0) slowprod->set("threads", threads);
+ if (original->parent().get("force_progressive"))
+ slowprod->set("force_progressive", original->parent().get_int("force_progressive"));
int ix = original->parent().get_int("video_index");
if (ix != 0) slowprod->set("video_index", ix);
m_slowmotionProducers.insert(url, slowprod);
// copy producer props
double ar = original->parent().get_double("force_aspect_ratio");
if (ar != 0.0) slowprod->set("force_aspect_ratio", ar);
+ double fps = original->parent().get_double("force_fps");
+ if (fps != 0.0) slowprod->set("force_fps", fps);
+ if (original->parent().get("force_progressive"))
+ slowprod->set("force_progressive", original->parent().get_int("force_progressive"));
int threads = original->parent().get_int("threads");
if (threads != 0) slowprod->set("threads", threads);
int ix = original->parent().get_int("video_index");