X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderer.cpp;h=90f733b9ebfe8008a3187a8dc351cde4295ad589;hb=d5be88ada9452009aba022561ae1a57702b0e419;hp=203cef2b2cdfdbf2fa0764eb91619957c108046c;hpb=91430842a9fcc6ad00a18da81928d24ae821ae0a;p=kdenlive diff --git a/src/renderer.cpp b/src/renderer.cpp index 203cef2b..90f733b9 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), @@ -199,10 +199,12 @@ void Render::buildConsumer(const QString profileName) 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; @@ -353,6 +355,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); @@ -452,6 +463,10 @@ double Render::dar() const return m_mltProfile->dar(); } +double Render::sar() const +{ + return m_mltProfile->sar(); +} void Render::slotSplitView(bool doit) { @@ -518,12 +533,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")) 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); @@ -617,9 +634,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; } @@ -795,7 +812,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; } @@ -889,6 +906,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(); @@ -903,7 +927,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()); @@ -944,7 +967,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"); @@ -952,7 +974,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); @@ -1764,7 +1785,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; @@ -1919,10 +1941,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); } @@ -2306,7 +2327,7 @@ bool Render::mltAddTrackEffect(int track, EffectsParameterList params) 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); } @@ -2988,6 +3009,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); @@ -3318,12 +3345,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()); } } @@ -3332,6 +3358,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; }