m_mltConsumer->set("refresh", 1);
m_paused = false;
}
- else if (m_mltProducer->get_speed() == 0) {
+ else if (m_winid != 0 && m_mltProducer->get_speed() == 0) {
// workaround specific bug in MLT's SDL consumer
m_mltConsumer->stop();
m_mltConsumer->start();
snprintf(property, sizeof(property), "meta.media.%d.codec.long_name", vindex);
if (producer->get(property)) {
filePropertyMap["videocodec"] = producer->get(property);
- } else {
- snprintf(property, sizeof(property), "meta.media.%d.codec.name", vindex);
- if (producer->get(property))
- filePropertyMap["videocodec"] = producer->get(property);
+ }
+ snprintf(property, sizeof(property), "meta.media.%d.codec.name", vindex);
+ if (producer->get(property)) {
+ filePropertyMap["videocodecid"] = producer->get(property);
}
QString query;
query = QString("meta.media.%1.codec.pix_fmt").arg(vindex);
for (int i = 0; i < count; i ++) {
QString name = metadata.get_name(i);
QString value = QString::fromUtf8(metadata.get(i));
- if (name.endsWith("markup") && !value.isEmpty())
+ if (name.endsWith(".markup") && !value.isEmpty())
metadataPropertyMap[ name.section('.', 0, -2)] = value;
}
producer->seek(0);
}
#endif
+void Render::loadUrl(const QString &url)
+{
+ Mlt::Producer *producer = new Mlt::Producer(*m_mltProfile, url.toUtf8().constData());
+ setProducer(producer, 0);
+}
+
int Render::setProducer(Mlt::Producer *producer, int position)
{
m_refreshTimer.stop();
m_refreshTimer.stop();
QMutexLocker locker(&m_mutex);
if (m_mltProducer == NULL) return;
- if (m_mltConsumer && !m_mltConsumer->is_stopped()) {
- m_mltConsumer->stop();
+ if (m_mltConsumer) {
+ m_mltConsumer->set("refresh", 0);
+ if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
m_mltConsumer->purge();
}
m_mltConsumer->set("refresh", 1);
} else if (!play) {
m_paused = true;
- m_mltProducer->set_speed(0.0);
+ if (m_winid == 0) {
+ // OpenGL consumer
+ m_mltProducer->set_speed(0.0);
+ }
+ else {
+ // SDL consumer, hack to allow pausing near the end of the playlist
+ m_mltConsumer->set("refresh", 0);
+ m_mltConsumer->stop();
+ m_mltProducer->set_speed(0.0);
+ m_mltProducer->seek(m_mltConsumer->position());
+ m_mltConsumer->start();
+ }
}
}
void Render::emitFrameNumber()
{
int currentPos = m_mltConsumer->position();
- if (currentPos == requestedSeekPosition) requestedSeekPosition = SEEK_INACTIVE;
+ if (currentPos == requestedSeekPosition) {
+ requestedSeekPosition = SEEK_INACTIVE;
+ m_paused = true;
+ }
emit rendererPosition(currentPos);
if (requestedSeekPosition != SEEK_INACTIVE) {
m_mltConsumer->purge();
m_mltProducer->seek(requestedSeekPosition);
- if (m_mltProducer->get_speed() == 0 && m_paused) {
- m_paused = false;
+ if (m_mltProducer->get_speed() == 0 && !m_paused) {
m_mltConsumer->set("refresh", 1);
}
requestedSeekPosition = SEEK_INACTIVE;
bool Render::mltRemoveClip(int track, GenTime position)
{
m_refreshTimer.stop();
+
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) {
kWarning() << "// TRACTOR PROBLEM";
return false;
}
- //service.lock();
+ service.lock();
Mlt::Tractor tractor(service);
Mlt::Producer trackProducer(tractor.track(track));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
if (trackPlaylist.is_blank(clipIndex)) {
kDebug() << "// WARNING, TRYING TO REMOVE A BLANK: " << position.frames(m_fps);
- //service.unlock();
+ service.unlock();
return false;
}
Mlt::Producer *clip = trackPlaylist.replace_with_blank(clipIndex);
if (trackPlaylist.is_blank(i)) blk = "(blank)";
kDebug()<<"CLIP "<<i<<": ("<<blankStart<<'x'<<blankStart + blankDuration<<")"<<blk;
}*/
- //service.unlock();
+ service.unlock();
if (track != 0 && trackPlaylist.count() <= clipIndex) mltCheckLength(&tractor);
return true;
}
}
}
+//static
+bool Render::checkX11Grab()
+{
+ if (KdenliveSettings::rendererpath().isEmpty() || KdenliveSettings::ffmpegpath().isEmpty()) return false;
+ QProcess p;
+ QStringList args;
+ args << "avformat:f-list";
+ p.start(KdenliveSettings::rendererpath(), args);
+ if (!p.waitForStarted()) return false;
+ if (!p.waitForFinished()) return false;
+ QByteArray result = p.readAllStandardError();
+ return result.contains("x11grab");
+}
+
#include "renderer.moc"