tmp = qstrdup(decklink.toUtf8().constData());
m_mltConsumer = new Mlt::Consumer(*m_mltProfile, tmp);
delete[] tmp;
- if (m_mltConsumer) {
+ if (m_mltConsumer->is_valid()) {
m_externalConsumer = true;
m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
m_mltConsumer->set("terminate_on_pause", 0);
+ m_mltConsumer->set("buffer", 12);
+ m_mltConsumer->set("deinterlace_method", "onefield");
mlt_log_set_callback(kdenlive_callback);
}
if (m_mltConsumer && m_mltConsumer->is_valid()) return;
}
}
-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 (!replaceProducer && xml.hasAttribute("file_hash")) {
// 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;
}
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;
}
int position = trackPlaylist.clip_start(clipIndex);
int blankDuration = trackPlaylist.clip_length(clipIndex);
- diff = -diff;
- if (blankDuration - diff == 0) {
+ if (blankDuration + diff == 0) {
trackPlaylist.remove(clipIndex);
- } else trackPlaylist.remove_region(position, diff);
+ } else trackPlaylist.remove_region(position, -diff);
}
trackPlaylist.consolidate_blanks(0);
}
Mlt::Producer trackProducer(tractor.track(track));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
Mlt::Service trackService(trackProducer.get_service()); //trackPlaylist
- return mltAddEffect(trackService, params, 15000, true);
+ return mltAddEffect(trackService, params, trackProducer.get_playtime() - 1, true);
}
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;
}