m_mltConsumer(NULL),
m_mltProducer(NULL),
m_mltProfile(NULL),
+ m_showFrameEvent(NULL),
+ m_pauseEvent(NULL),
m_externalConsumer(false),
m_isZoneMode(false),
m_isLoopMode(false),
m_mltProducer = m_blackClip->cut(0, 1);
m_mltConsumer->connect(*m_mltProducer);
m_mltProducer->set_speed(0.0);
+ m_refreshTimer.setSingleShot(true);
+ m_refreshTimer.setInterval(50);
+ connect(&m_refreshTimer, SIGNAL(timeout()), this, SLOT(refresh()));
}
Render::~Render()
//delete m_osdTimer;
m_requestList.clear();
m_infoThread.waitForFinished();
+ if (m_showFrameEvent) delete m_showFrameEvent;
+ if (m_pauseEvent) delete m_pauseEvent;
if (m_mltConsumer) delete m_mltConsumer;
if (m_mltProducer) delete m_mltProducer;
/*if (m_mltProducer) {
delete[] tmp;
if (m_mltConsumer->is_valid()) {
m_externalConsumer = true;
- m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
+ m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
m_mltConsumer->set("terminate_on_pause", 0);
m_mltConsumer->set("deinterlace_method", "onefield");
m_mltConsumer->set("real_time", KdenliveSettings::mltthreads());
m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_audio");
m_mltConsumer->set("preview_off", 1);
m_mltConsumer->set("preview_format", mlt_image_rgb24a);
- m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_gl_frame_show);
+ m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_gl_frame_show);
} else {
m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_preview");
- // FIXME: the event object returned by the listen gets leaked...
- m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
- m_mltConsumer->listen("consumer-sdl-paused", this, (mlt_listener) consumer_paused);
+ m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
+ m_pauseEvent = m_mltConsumer->listen("consumer-sdl-paused", this, (mlt_listener) consumer_paused);
m_mltConsumer->set("window_id", m_winid);
}
m_mltConsumer->set("resize", 1);
return clip;
}
+bool Render::hasProfile(const QString &profileName) const
+{
+ return m_activeProfile == profileName;
+}
+
int Render::resetProfile(const QString &profileName, bool dropSceneList)
{
- QString scene;
- if (!dropSceneList) scene = sceneList();
+ m_refreshTimer.stop();
if (m_mltConsumer) {
if (m_externalConsumer == KdenliveSettings::external_display()) {
if (KdenliveSettings::external_display() && m_activeProfile == profileName) return 1;
if (m_isSplitView) slotSplitView(false);
if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
m_mltConsumer->purge();
+ if (m_showFrameEvent) delete m_showFrameEvent;
+ m_showFrameEvent = NULL;
+ if (m_pauseEvent) delete m_pauseEvent;
+ m_pauseEvent = NULL;
delete m_mltConsumer;
m_mltConsumer = NULL;
}
+ QString scene;
+ if (!dropSceneList) scene = sceneList();
int pos = 0;
double current_fps = m_mltProfile->fps();
double current_dar = m_mltProfile->dar();
if (info.xml.hasAttribute("templatetext"))
producer->set("templatetext", info.xml.attribute("templatetext").toUtf8().constData());
+
+ int imageWidth = (int)((double) info.imageHeight * m_mltProfile->width() / m_mltProfile->height() + 0.5);
+ int fullWidth = (int)((double) info.imageHeight * m_mltProfile->dar() + 0.5);
+ int frameNumber = info.xml.attribute("thumbnail", "-1").toInt();
if ((!info.replaceProducer && info.xml.hasAttribute("file_hash")) || proxyProducer) {
// Clip already has all properties
- emit replyGetFileProperties(info.clipId, producer, stringMap(), stringMap(), info.replaceProducer, true);
+ if (proxyProducer) {
+ // Recreate clip thumb
+ if (frameNumber > 0) producer->seek(frameNumber);
+ Mlt::Frame *frame = producer->get_frame();
+ if (frame && frame->is_valid()) {
+ QImage img = KThumb::getFrame(frame, imageWidth, fullWidth, info.imageHeight);
+ delete frame;
+ emit replyGetImage(info.clipId, img);
+ }
+ }
+ emit replyGetFileProperties(info.clipId, producer, stringMap(), stringMap(), info.replaceProducer);
m_processingClipId.clear();
continue;
}
- int imageWidth = (int)((double) info.imageHeight * m_mltProfile->width() / m_mltProfile->height() + 0.5);
- int fullWidth = (int)((double) info.imageHeight * m_mltProfile->dar() + 0.5);
stringMap filePropertyMap;
stringMap metadataPropertyMap;
-
- int frameNumber = info.xml.attribute("thumbnail", "-1").toInt();
if (frameNumber > 0) producer->seek(frameNumber);
duration = duration > 0 ? duration : producer->get_playtime();
int Render::setProducer(Mlt::Producer *producer, int position)
{
+ m_refreshTimer.stop();
QMutexLocker locker(&m_mutex);
QString currentId;
int consumerPosition = 0;
int Render::setSceneList(QString playlist, int position)
{
+ m_refreshTimer.stop();
QMutexLocker locker(&m_mutex);
if (m_winid == -1) return -1;
int error = 0;
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."));
+ if (m_showFrameEvent) delete m_showFrameEvent;
+ m_showFrameEvent = NULL;
+ if (m_pauseEvent) delete m_pauseEvent;
+ m_pauseEvent = NULL;
delete m_mltConsumer;
m_mltConsumer = NULL;
return -1;
if (m_mltConsumer->is_stopped()) {
m_mltConsumer->start();
}
- m_mltConsumer->set("refresh", "1");
m_mltProducer->set_speed(1.0);
+ m_mltConsumer->set("refresh", "1");
} else if (!play) {
m_mltProducer->set_speed(0.0);
m_mltConsumer->set("refresh", 0);
void Render::doRefresh()
{
- // Use a Timer so that we don't refresh too much
- QMutexLocker locker(&m_mutex);
+ m_refreshTimer.start();
+ /*QMutexLocker locker(&m_mutex);
if (m_mltConsumer) {
- if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
+ if (m_mltConsumer->is_stopped()) {
+ kDebug()<<"pppppppppppppppp\n\nSTARTING CONSUMER: "<<m_name<<m_mltConsumer->start();
+ }
+ //m_mltProducer->set_speed(1);
m_mltConsumer->set("refresh", 1);
- }
+ //m_mltProducer->set_speed(0);
+ }*/
}
void Render::refresh()
}
}
-double Render::playSpeed()
+double Render::playSpeed() const
{
if (m_mltProducer) return m_mltProducer->get_speed();
return 0.0;