From: Jean-Baptiste Mardelle Date: Fri, 7 Sep 2012 17:30:56 +0000 (+0200) Subject: * Fix stabilized clips not loading: X-Git-Url: https://git.sesse.net/?p=kdenlive;a=commitdiff_plain;h=cbf0c0c6e3ecf82381e9a7fd41154f600c2456f4 * Fix stabilized clips not loading: http://www.kdenlive.org/mantis/view.php?id=2711 --- diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index ef12ad54..97de5adb 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -6209,7 +6209,7 @@ void CustomTrackView::setAudioAlignReference() if (clip->clipType() == AV || clip->clipType() == AUDIO) { m_audioAlignmentReference = clip; - AudioEnvelope *envelope = new AudioEnvelope(clip->getProducer(clip->track())); + AudioEnvelope *envelope = new AudioEnvelope(clip->baseClip()->fileURL().path(), clip->getProducer(clip->track())); m_audioCorrelator = new AudioCorrelation(envelope); @@ -6254,9 +6254,7 @@ void CustomTrackView::alignAudio() } if (clip->clipType() == AV || clip->clipType() == AUDIO) { - AudioEnvelope *envelope = new AudioEnvelope(clip->getProducer(clip->track()), - clip->info().cropStart.frames(m_document->fps()), - clip->info().cropDuration.frames(m_document->fps())); + AudioEnvelope *envelope = new AudioEnvelope(clip->baseClip()->fileURL().path(), clip->getProducer(clip->track()), clip->info().cropStart.frames(m_document->fps()), clip->info().cropDuration.frames(m_document->fps())); // FFT only for larger vectors. We could use it all time, but for small vectors // the (anyway not noticeable) overhead is smaller with a nested for loop correlation. diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 4694e175..1095381a 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -692,6 +692,10 @@ Mlt::Producer *DocClipBase::cloneProducer(Mlt::Producer *source) { Mlt::Producer *result = NULL; QString url = QString::fromUtf8(source->get("resource")); + if (url == "" || url == "" || url == "") { + // Xml producer sometimes loses the correct url + url = m_properties.value("resource"); + } if (m_clipType == SLIDESHOW || KIO::NetAccess::exists(KUrl(url), KIO::NetAccess::SourceSide, 0)) { result = new Mlt::Producer(*(source->profile()), url.toUtf8().constData()); } diff --git a/src/lib/audio/audioEnvelope.cpp b/src/lib/audio/audioEnvelope.cpp index d4769593..7755970b 100644 --- a/src/lib/audio/audioEnvelope.cpp +++ b/src/lib/audio/audioEnvelope.cpp @@ -11,12 +11,13 @@ #include "audioEnvelope.h" #include "audioStreamInfo.h" +#include #include #include #include #include -AudioEnvelope::AudioEnvelope(Mlt::Producer *producer, int offset, int length) : +AudioEnvelope::AudioEnvelope(const QString &url, Mlt::Producer *producer, int offset, int length) : m_envelope(NULL), m_offset(offset), m_length(length), @@ -28,7 +29,13 @@ AudioEnvelope::AudioEnvelope(Mlt::Producer *producer, int offset, int length) : m_envelopeIsNormalized(false) { // make a copy of the producer to avoid audio playback issues - m_producer = new Mlt::Producer(*(producer->profile()), producer->get("resource")); + QString path = QString::fromUtf8(producer->get("resource")); + if (path == "" || path == "" || path == "") + path = url; + m_producer = new Mlt::Producer(*(producer->profile()), path.toUtf8().constData()); + if (!m_producer || !m_producer->is_valid()) { + qDebug()<<"// Cannot create envelope for producer: "<= 0); diff --git a/src/lib/audio/audioEnvelope.h b/src/lib/audio/audioEnvelope.h index 1add9095..0ba1473a 100644 --- a/src/lib/audio/audioEnvelope.h +++ b/src/lib/audio/audioEnvelope.h @@ -26,7 +26,7 @@ class QImage; class AudioEnvelope { public: - explicit AudioEnvelope(Mlt::Producer *producer, int offset = 0, int length = 0); + explicit AudioEnvelope(const QString &url, Mlt::Producer *producer, int offset = 0, int length = 0); ~AudioEnvelope(); /// Returns the envelope, calculates it if necessary. diff --git a/src/projectlist.cpp b/src/projectlist.cpp index a3bae049..c5d1e01b 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -2967,7 +2967,7 @@ void ProjectList::slotProcessJobs() if (job->jobType == MLTJOB) { MeltJob *jb = static_cast (job); - jb->setProducer(currentClip->getProducer()); + jb->setProducer(currentClip->getProducer(), currentClip->fileURL()); } job->startJob(); if (job->jobStatus == JOBDONE) { diff --git a/src/projecttree/meltjob.cpp b/src/projecttree/meltjob.cpp index 32105b1e..5c9c0d51 100644 --- a/src/projecttree/meltjob.cpp +++ b/src/projecttree/meltjob.cpp @@ -23,6 +23,7 @@ #include "kdenlivedoc.h" #include +#include #include #include @@ -49,9 +50,12 @@ MeltJob::MeltJob(CLIPTYPE cType, const QString &id, QStringList parameters) : Ab if (consum.contains(':')) m_dest = consum.section(':', 1); } -void MeltJob::setProducer(Mlt::Producer *producer) +void MeltJob::setProducer(Mlt::Producer *producer, KUrl url) { m_producer = producer; + m_url = QString::fromUtf8(m_producer->get("resource")); + if (m_url == "" || m_url == "" || m_url == "") + m_url == url.path(); } void MeltJob::startJob() @@ -92,8 +96,7 @@ void MeltJob::startJob() Mlt::Producer *prod; if (out == -1) { - QString url = QString::fromUtf8(m_producer->get("resource")); - prod = new Mlt::Producer(*m_profile, url.toUtf8().constData()); + prod = new Mlt::Producer(*m_profile, m_url.toUtf8().constData()); } else prod = m_producer->cut(in, out); diff --git a/src/projecttree/meltjob.h b/src/projecttree/meltjob.h index 040e9ef4..8b9e1049 100644 --- a/src/projecttree/meltjob.h +++ b/src/projecttree/meltjob.h @@ -26,6 +26,8 @@ #include "abstractclipjob.h" +class KUrl; + namespace Mlt{ class Profile; class Producer; @@ -46,7 +48,7 @@ public: stringMap cancelProperties(); bool addClipToProject; const QString statusMessage(); - void setProducer(Mlt::Producer *producer); + void setProducer(Mlt::Producer *producer, KUrl url); void emitFrameNumber(); private: @@ -56,6 +58,7 @@ private: Mlt::Event *m_showFrameEvent; QStringList m_params; QString m_dest; + QString m_url; int m_length; }; diff --git a/testingArea/audioOffset.cpp b/testingArea/audioOffset.cpp index 13945f6b..fd2e9c3b 100644 --- a/testingArea/audioOffset.cpp +++ b/testingArea/audioOffset.cpp @@ -127,12 +127,12 @@ int main(int argc, char *argv[]) // Build the audio envelopes for the correlation - AudioEnvelope *envelopeMain = new AudioEnvelope(&prodMain); + AudioEnvelope *envelopeMain = new AudioEnvelope(fileMain.c_str(), &prodMain); envelopeMain->loadEnvelope(); envelopeMain->loadStdDev(); envelopeMain->dumpInfo(); - AudioEnvelope *envelopeSub = new AudioEnvelope(&prodSub); + AudioEnvelope *envelopeSub = new AudioEnvelope(fileSub.c_str(), &prodSub); envelopeSub->loadEnvelope(); envelopeSub->loadStdDev(); envelopeSub->dumpInfo();