Render::Render(const QString & rendererName, int winid, QString profile, QWidget *parent) :
QObject(parent),
m_isBlocked(0),
- sendFrameForAnalysis(false),
analyseAudio(KdenliveSettings::monitor_audio()),
+ sendFrameForAnalysis(false),
m_name(rendererName),
m_mltConsumer(NULL),
m_mltProducer(NULL),
refresh();
}
+void Render::seek(int time)
+{
+ if (!m_mltProducer)
+ return;
+ m_isBlocked = false;
+ m_mltProducer->seek(time);
+ refresh();
+}
+
//static
/*QPixmap Render::frameThumbnail(Mlt::Frame *frame, int width, int height, bool border) {
QPixmap pix(width, height);
return m_mltProfile->dar();
}
+double Render::sar() const
+{
+ return m_mltProfile->sar();
+}
void Render::slotSplitView(bool doit)
{
}
}
-void Render::getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer)
+void Render::getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer, bool selectClip)
{
- KUrl url = KUrl(xml.attribute("resource", QString()));
+ QString path;
+ if (xml.hasAttribute("proxy")) path = xml.attribute("proxy");
+ else path = xml.attribute("resource");
+ KUrl url = KUrl(path);
Mlt::Producer *producer = NULL;
CLIPTYPE type = (CLIPTYPE)xml.attribute("type").toInt();
-
//kDebug() << "PROFILE WIDT: "<< xml.attribute("mlt_service") << ": "<< m_mltProfile->width() << "\n...................\n\n";
/*if (xml.attribute("type").toInt() == TEXT && !QFile::exists(url.path())) {
emit replyGetFileProperties(clipId, producer, QMap < QString, QString >(), QMap < QString, QString >(), replaceProducer);
if (xml.hasAttribute("templatetext"))
producer->set("templatetext", xml.attribute("templatetext").toUtf8().constData());
- if (!replaceProducer && xml.hasAttribute("file_hash")) {
+ if ((!replaceProducer && xml.hasAttribute("file_hash")) || xml.hasAttribute("proxy")) {
// Clip already has all properties
- emit replyGetFileProperties(clipId, producer, QMap < QString, QString >(), QMap < QString, QString >(), replaceProducer);
+ emit replyGetFileProperties(clipId, producer, QMap < QString, QString >(), QMap < QString, QString >(), replaceProducer, selectClip);
return;
}
metadataPropertyMap[ name.section('.', 0, -2)] = value;
}
producer->seek(0);
- emit replyGetFileProperties(clipId, producer, filePropertyMap, metadataPropertyMap, replaceProducer);
+ emit replyGetFileProperties(clipId, producer, filePropertyMap, metadataPropertyMap, replaceProducer, selectClip);
// FIXME: should delete this to avoid a leak...
//delete producer;
}
//kDebug() << "////// RENDER, SET SCENE LIST: " << playlist;
+ // Remove previous profile info
+ QDomDocument doc;
+ doc.setContent(playlist);
+ QDomElement profile = doc.documentElement().firstChildElement("profile");
+ doc.documentElement().removeChild(profile);
+ playlist = doc.toString();
+
if (m_mltConsumer) {
if (!m_mltConsumer->is_stopped()) {
m_mltConsumer->stop();
m_mltProducer->set_speed(0);
//if (KdenliveSettings::osdtimecode() && m_osdInfo) m_mltProducer->detach(*m_osdInfo);
-
Mlt::Service service(m_mltProducer->parent().get_service());
mlt_service_lock(service.get_service());
}
blockSignals(true);
-
// TODO: Better way to do this
if (KdenliveSettings::projectloading_avformatnovalidate())
playlist.replace(">avformat</property>", ">avformat-novalidate</property>");
playlist.replace(">avformat-novalidate</property>", ">avformat</property>");
m_mltProducer = new Mlt::Producer(*m_mltProfile, "xml-string", playlist.toUtf8().constData());
-
if (!m_mltProducer || !m_mltProducer->is_valid()) {
kDebug() << " WARNING - - - - -INVALID PLAYLIST: " << playlist.toUtf8().constData();
m_mltProducer = m_blackClip->cut(0, 50);
mlt_service_unlock(service.get_service());
return false;
}
- Mlt::Producer *clip2 = prod->cut(info.cropStart.frames(m_fps), (info.cropDuration + info.cropStart).frames(m_fps));
+
+ Mlt::Producer *clip2 = prod->cut(info.cropStart.frames(m_fps), (info.cropDuration + info.cropStart).frames(m_fps) - 1);
trackPlaylist.insert_at(info.startPos.frames(m_fps), clip2, 1);
delete clip2;
m_isBlocked = true;
previousStart += moveFrame;
+ if (previousStart < 0) {
+ // this is possible for images and color clips
+ previousOut -= previousStart;
+ previousStart = 0;
+ }
+
int length = previousOut + 1;
if (length > clip->get_length()) {
clip->parent().set("length", length + 1);
mlt_type = mlt_properties_get(properties, "mlt_type");
resource = mlt_properties_get(properties, "mlt_service");
}
-
field->plant_transition(tr, a_track, b_track);
// re-add upper transitions
- for (int i = 0; i < trList.count(); i++) {
- // kDebug()<< "REPLANT ON TK: "<<trList.at(i)->get_a_track()<<", "<<trList.at(i)->get_b_track();
+ for (int i = trList.count() - 1; i >= 0; i--) {
+ //kDebug()<< "REPLANT ON TK: "<<trList.at(i)->get_a_track()<<", "<<trList.at(i)->get_b_track();
field->plant_transition(*trList.at(i), trList.at(i)->get_a_track(), trList.at(i)->get_b_track());
}
}
{
if (oldTag == tag && !force) mltUpdateTransitionParams(tag, a_track, b_track, in, out, xml);
else {
+ kDebug()<<"// DELETING TRANS: "<<a_track<<"-"<<b_track;
mltDeleteTransition(oldTag, a_track, b_track, in, out, xml, false);
mltAddTransition(tag, a_track, b_track, in, out, xml, false);
}
//kDebug() << " ------ ADDING TRANS PARAM: " << key << ": " << it.value();
}
// attach transition
+ m_isBlocked++;
+ mlt_service_lock(service.get_service());
mltPlantTransition(field, *transition, a_track, b_track);
// field->plant_transition(*transition, a_track, b_track);
+ mlt_service_unlock(service.get_service());
+ m_isBlocked--;
if (do_refresh) refresh();
return true;
}