#include <QDebug>
+#define SEEK_INACTIVE (-1)
static void kdenlive_callback(void* /*ptr*/, int level, const char* fmt, va_list vl)
{
Render::Render(Kdenlive::MONITORID rendererName, int winid, QString profile, QWidget *parent) :
AbstractRender(rendererName, parent),
+ requestedSeekPosition(SEEK_INACTIVE),
m_name(rendererName),
m_mltConsumer(NULL),
m_mltProducer(NULL),
Mlt::Producer *Render::invalidProducer(const QString &id)
{
Mlt::Producer *clip;
- QString txt = "+" + i18n("Missing clip") + ".txt";
+ QString txt = '+' + i18n("Missing clip") + ".txt";
char *tmp = qstrdup(txt.toUtf8().constData());
clip = new Mlt::Producer(*m_mltProfile, tmp);
delete[] tmp;
void Render::seek(GenTime time)
{
- if (!m_mltProducer)
- return;
-
- m_mltProducer->seek((int)(time.frames(m_fps)));
- if (m_mltProducer->get_speed() == 0) {
- refresh();
- }
+ int pos = time.frames(m_fps);
+ seek(pos);
}
void Render::seek(int time)
{
if (!m_mltProducer)
return;
-
- m_mltProducer->seek(time);
- if (m_mltProducer->get_speed() == 0) {
- refresh();
+ if (requestedSeekPosition == SEEK_INACTIVE) {
+ m_mltProducer->seek(time);
+ if (m_mltProducer->get_speed() == 0) {
+ refresh();
+ }
}
+ requestedSeekPosition = time;
}
//static
int Render::setProducer(Mlt::Producer *producer, int position)
{
m_refreshTimer.stop();
+ requestedSeekPosition = SEEK_INACTIVE;
QMutexLocker locker(&m_mutex);
QString currentId;
int consumerPosition = 0;
int Render::setSceneList(QString playlist, int position)
{
+ requestedSeekPosition = SEEK_INACTIVE;
m_refreshTimer.stop();
QMutexLocker locker(&m_mutex);
if (m_winid == -1) return -1;
void Render::stop()
{
+ requestedSeekPosition = SEEK_INACTIVE;
m_refreshTimer.stop();
QMutexLocker locker(&m_mutex);
if (m_mltProducer == NULL) return;
void Render::stop(const GenTime & startTime)
{
+ requestedSeekPosition = SEEK_INACTIVE;
m_refreshTimer.stop();
QMutexLocker locker(&m_mutex);
if (m_mltProducer) {
void Render::pause()
{
+ requestedSeekPosition = SEEK_INACTIVE;
if (!m_mltProducer || !m_mltConsumer)
return;
if (m_mltProducer->get_speed() == 0.0) return;
void Render::switchPlay(bool play)
{
QMutexLocker locker(&m_mutex);
+ requestedSeekPosition = SEEK_INACTIVE;
if (!m_mltProducer || !m_mltConsumer)
return;
if (m_isZoneMode) resetZoneMode();
void Render::play(double speed)
{
+ requestedSeekPosition = SEEK_INACTIVE;
if (!m_mltProducer)
return;
// if (speed == 0.0) m_mltProducer->set("out", m_mltProducer->get_length() - 1);
void Render::play(const GenTime & startTime)
{
+ requestedSeekPosition = SEEK_INACTIVE;
if (!m_mltProducer || !m_mltConsumer)
return;
m_mltProducer->seek((int)(startTime.frames(m_fps)));
void Render::loopZone(const GenTime & startTime, const GenTime & stopTime)
{
+ requestedSeekPosition = SEEK_INACTIVE;
if (!m_mltProducer || !m_mltConsumer)
return;
//m_mltProducer->set("eof", "loop");
void Render::playZone(const GenTime & startTime, const GenTime & stopTime)
{
+ requestedSeekPosition = SEEK_INACTIVE;
if (!m_mltProducer || !m_mltConsumer)
return;
if (!m_isZoneMode) m_originalOut = m_mltProducer->get_playtime() - 1;
void Render::resetZoneMode()
{
- if (!m_isZoneMode && !m_isLoopMode) return;
+ if (!m_mltProducer || (!m_isZoneMode && !m_isLoopMode)) return;
m_mltProducer->set("out", m_originalOut);
//m_mltProducer->set("eof", "pause");
m_isZoneMode = false;
void Render::seekToFrame(int pos)
{
- if (!m_mltProducer)
- return;
resetZoneMode();
- m_mltProducer->seek(pos);
- if (m_mltProducer->get_speed() == 0) {
- refresh();
- }
+ seek(pos);
}
void Render::seekToFrameDiff(int diff)
{
- if (!m_mltProducer)
- return;
resetZoneMode();
- m_mltProducer->seek(m_mltProducer->position() + diff);
- refresh();
+ if (requestedSeekPosition == SEEK_INACTIVE)
+ seek(m_mltProducer->position() + diff);
+ else seek(requestedSeekPosition + diff);
}
void Render::doRefresh()
void Render::emitFrameNumber()
{
- if (m_mltConsumer) emit rendererPosition((int) m_mltConsumer->position());
+ int currentPos = m_mltConsumer->position();
+ if (currentPos == requestedSeekPosition) requestedSeekPosition = SEEK_INACTIVE;
+ emit rendererPosition(currentPos);
+ if (requestedSeekPosition != SEEK_INACTIVE) {
+ m_mltProducer->seek(requestedSeekPosition);
+ if (m_mltProducer->get_speed() == 0) {
+ refresh();
+ }
+ }
}
void Render::emitConsumerStopped()
}
-void Render::mltCutClip(int track, GenTime position)
+bool Render::mltCutClip(int track, GenTime position)
{
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) {
kWarning() << "// TRACTOR PROBLEM";
- return;
+ return false;
}
Mlt::Tractor tractor(service);
int clipIndex = trackPlaylist.get_clip_index_at(cutPos);
if (trackPlaylist.is_blank(clipIndex)) {
kDebug() << "// WARNING, TRYING TO CUT A BLANK";
- return;
+ return false;
}
service.lock();
int clipStart = trackPlaylist.clip_start(clipIndex);
// duplicate effects
Mlt::Producer *original = trackPlaylist.get_clip_at(clipStart);
Mlt::Producer *clip = trackPlaylist.get_clip_at(cutPos);
-
+
if (original == NULL || clip == NULL) {
kDebug() << "// ERROR GRABBING CLIP AFTER SPLIT";
+ return false;
}
+
Mlt::Service clipService(original->get_service());
Mlt::Service dupService(clip->get_service());
+
+
delete original;
delete clip;
int ct = 0;
ct++;
filter = clipService.filter(ct);
}
-
+ return true;
/* // Display playlist info
kDebug()<<"//////////// AFTER";
for (int i = 0; i < trackPlaylist.count(); i++) {
return true;
}
+
+
#include "renderer.moc"