X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderer.cpp;h=55ad1a0f57524ac109e15f45ecd5c44463568bc1;hb=3577376c5e5b6cc533af0edc9d4f03d0b3770f9e;hp=d99a2e801e404ddc9f61148aae921246da0d2be9;hpb=263a2f9c364be3e18daf1e4c0341e1889a0f7c80;p=kdenlive diff --git a/src/renderer.cpp b/src/renderer.cpp index d99a2e80..55ad1a0f 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -96,8 +96,8 @@ static void consumer_gl_frame_show(mlt_consumer, Render * self, mlt_frame frame_ 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), @@ -205,6 +205,7 @@ void Render::buildConsumer(const QString profileName) m_mltConsumer->set("terminate_on_pause", 0); m_mltConsumer->set("buffer", 12); m_mltConsumer->set("deinterlace_method", "onefield"); + m_mltConsumer->set("real_time", KdenliveSettings::mltthreads()); mlt_log_set_callback(kdenlive_callback); } if (m_mltConsumer && m_mltConsumer->is_valid()) return; @@ -262,6 +263,7 @@ void Render::buildConsumer(const QString profileName) m_mltConsumer->set("progressive", 1); m_mltConsumer->set("audio_buffer", 1024); m_mltConsumer->set("frequency", 48000); + m_mltConsumer->set("real_time", KdenliveSettings::mltthreads()); } Mlt::Producer *Render::invalidProducer(const QString &id) @@ -355,6 +357,15 @@ void Render::seek(GenTime time) 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); @@ -454,6 +465,10 @@ double Render::dar() const return m_mltProfile->dar(); } +double Render::sar() const +{ + return m_mltProfile->sar(); +} void Render::slotSplitView(bool doit) { @@ -520,12 +535,14 @@ 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") && xml.attribute("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); @@ -552,7 +569,11 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int if (producer == NULL || producer->is_blank() || !producer->is_valid()) { kDebug() << " / / / / / / / / ERROR / / / / // CANNOT LOAD PRODUCER: "; - emit removeInvalidClip(clipId, replaceProducer); + if (xml.hasAttribute("proxy") && xml.attribute("proxy") != "-") { + // Proxy file is corrupted + emit removeInvalidProxy(clipId); + } + else emit removeInvalidClip(clipId, replaceProducer); delete producer; return; } @@ -608,8 +629,12 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int } // setup length here as otherwise default length (currently 15000 frames in MLT) will be taken even if outpoint is larger - if (type == COLOR || type == TEXT || type == IMAGE || type == SLIDESHOW) - producer->set("length", xml.attribute("out").toInt() - xml.attribute("in").toInt() + 1); + if (type == COLOR || type == TEXT || type == IMAGE || type == SLIDESHOW) { + int length; + if (xml.hasAttribute("length")) length = xml.attribute("length").toInt(); + else length = xml.attribute("out").toInt() - xml.attribute("in").toInt(); + producer->set("length", length); + } if (xml.hasAttribute("out")) producer->set_in_and_out(xml.attribute("in").toInt(), xml.attribute("out").toInt()); @@ -619,9 +644,9 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int 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; } @@ -797,7 +822,7 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int 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; } @@ -891,6 +916,13 @@ int Render::setSceneList(QString playlist, int position) //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(); @@ -905,7 +937,6 @@ int Render::setSceneList(QString playlist, int position) 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()); @@ -946,7 +977,6 @@ int Render::setSceneList(QString playlist, int position) } blockSignals(true); - // TODO: Better way to do this if (KdenliveSettings::projectloading_avformatnovalidate()) playlist.replace(">avformat", ">avformat-novalidate"); @@ -954,7 +984,6 @@ int Render::setSceneList(QString playlist, int position) playlist.replace(">avformat-novalidate", ">avformat"); 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); @@ -1353,8 +1382,8 @@ void Render::refresh() void Render::setDropFrames(bool show) { if (m_mltConsumer) { - int dropFrames = 1; - if (show == false) dropFrames = 0; + int dropFrames = KdenliveSettings::mltthreads(); + if (show == false) dropFrames = -dropFrames; m_mltConsumer->stop(); if (m_winid == 0) m_mltConsumer->set("real_time", dropFrames); @@ -1766,7 +1795,8 @@ bool Render::mltUpdateClip(ItemInfo info, QDomElement element, Mlt::Producer *pr 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; @@ -1921,10 +1951,9 @@ void Render::mltInsertSpace(QMap trackClipStartList, QMap } 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); } @@ -2990,6 +3019,12 @@ bool Render::mltResizeClipStart(ItemInfo info, GenTime diff) 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); @@ -3320,12 +3355,11 @@ void Render::mltPlantTransition(Mlt::Field *field, Mlt::Transition &tr, int a_tr 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: "<get_a_track()<<", "<get_b_track(); + for (int i = trList.count() - 1; i >= 0; i--) { + //kDebug()<< "REPLANT ON TK: "<get_a_track()<<", "<get_b_track(); field->plant_transition(*trList.at(i), trList.at(i)->get_a_track(), trList.at(i)->get_b_track()); } } @@ -3334,6 +3368,7 @@ void Render::mltUpdateTransition(QString oldTag, QString tag, int a_track, int b { if (oldTag == tag && !force) mltUpdateTransitionParams(tag, a_track, b_track, in, out, xml); else { + kDebug()<<"// DELETING TRANS: "<plant_transition(*transition, a_track, b_track); + mlt_service_unlock(service.get_service()); + m_isBlocked--; if (do_refresh) refresh(); return true; }