From: Jean-Baptiste Mardelle Date: Fri, 6 Jan 2012 19:31:04 +0000 (+0100) Subject: * Fix missing proxy not re-created on project opening X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=062405cf9a745a21b0705df2552fdde4a34126cf;p=kdenlive * Fix missing proxy not re-created on project opening * improve proxy crash feedback * Small change in proxy icon (use yellow color to make it more visible) --- diff --git a/src/documentchecker.cpp b/src/documentchecker.cpp index a89ddc13..40576738 100644 --- a/src/documentchecker.cpp +++ b/src/documentchecker.cpp @@ -325,6 +325,8 @@ bool DocumentChecker::hasErrorInClips() QString clipType; QString realPath = e.attribute("resource"); QString id = e.attribute("id"); + // Tell Kdenlive to recreate proxy + e.setAttribute("_replaceproxy", "1"); // Replace proxy url with real clip in MLT producers QDomNodeList properties; QDomElement mltProd; diff --git a/src/projectitem.cpp b/src/projectitem.cpp index 3e78ae06..6c084236 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -283,7 +283,7 @@ void ProjectItem::setConditionalJobStatus(CLIPJOBSTATUS status, JOBTYPE requeste bool ProjectItem::hasProxy() const { if (m_clip == NULL) return false; - if (m_clip->getProperty("proxy").isEmpty() || m_clip->getProperty("proxy") == "-" || data(0, JobProgressRole).toInt() == JOBCRASHED) return false; + if (m_clip->getProperty("proxy").size() < 2 || data(0, JobProgressRole).toInt() == JOBCRASHED) return false; return true; } diff --git a/src/projectlist.cpp b/src/projectlist.cpp index db356c2c..95c06db0 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -792,6 +792,7 @@ void ProjectList::setRenderer(Render *projectRender) { m_render = projectRender; m_listView->setIconSize(QSize((ProjectItem::itemDefaultHeight() - 2) * m_render->dar(), ProjectItem::itemDefaultHeight() - 2)); + connect(m_render, SIGNAL(requestProxy(QString)), this, SLOT(slotCreateProxy(QString))); } void ProjectList::slotClipSelected() @@ -1500,7 +1501,7 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, QStr } else { item = static_cast (*it); clip = item->referencedClip(); - if (item->referencedClip()->getProducer() == NULL) { + if (clip->getProducer() == NULL) { bool replace = false; if (brokenClips.contains(item->clipId())) { // if this is a proxy clip, disable proxy @@ -1516,7 +1517,8 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, QStr xml.removeAttribute("file_hash"); xml.removeAttribute("proxy_out"); } - if (!replace) replace = xml.attribute("replace") == "1"; + if (!replace) replace = xml.attribute("_replaceproxy") == "1"; + xml.removeAttribute("_replaceproxy"); if (replace) { resetThumbsProducer(clip); } @@ -1543,7 +1545,7 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, QStr getCachedThumbnail(item); } if (item->data(0, DurationRole).toString().isEmpty()) { - item->changeDuration(item->referencedClip()->getProducer()->get_playtime()); + item->changeDuration(clip->getProducer()->get_playtime()); } if (clip->isPlaceHolder()) { QPixmap pixmap = qVariantValue(item->data(0, Qt::DecorationRole)); @@ -1556,6 +1558,10 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, QStr p.end(); item->setData(0, Qt::DecorationRole, pixmap); } + else if (clip->getProperty("_replaceproxy") == "1") { + clip->setProperty("_replaceproxy", QString()); + slotCreateProxy(clip->getId()); + } } item->setData(0, UsageRole, QString::number(item->numReferences())); } @@ -2590,13 +2596,7 @@ void ProjectList::slotCreateProxy(const QString id) slotUpdateJobStatus(item, PROXYJOB, JOBCRASHED, i18n("Failed to create proxy, empty path.")); return; } - - ProxyJob *job = new ProxyJob(item->clipType(), id, QStringList() << path << item->clipUrl().path() << item->referencedClip()->producerProperty("_exif_orientation") << m_doc->getDocumentProperty("proxyparams").simplified() << QString::number(m_render->frameRenderWidth()) << QString::number(m_render->renderHeight())); - if (job->isExclusive() && hasPendingJob(item, job->jobType)) { - delete job; - return; - } - + if (QFileInfo(path).size() > 0) { // Proxy already created setJobStatus(item, PROXYJOB, JOBDONE); @@ -2604,6 +2604,12 @@ void ProjectList::slotCreateProxy(const QString id) return; } + ProxyJob *job = new ProxyJob(item->clipType(), id, QStringList() << path << item->clipUrl().path() << item->referencedClip()->producerProperty("_exif_orientation") << m_doc->getDocumentProperty("proxyparams").simplified() << QString::number(m_render->frameRenderWidth()) << QString::number(m_render->renderHeight())); + if (job->isExclusive() && hasPendingJob(item, job->jobType)) { + delete job; + return; + } + m_jobList.append(job); setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage()); slotCheckJobProcess(); @@ -2853,7 +2859,7 @@ void ProjectList::slotProcessJobs() emit addClip(destination, QString(), QString()); } } else if (job->jobStatus == JOBCRASHED || job->jobStatus == JOBABORTED) { - emit updateJobStatus(job->clipId(), job->jobType, job->jobStatus, job->errorMessage()); + emit updateJobStatus(job->clipId(), job->jobType, job->jobStatus, job->errorMessage(), QString(), job->logDetails()); } } // Thread finished, cleanup & update count @@ -2897,7 +2903,6 @@ void ProjectList::updateProxyConfig() // remove proxy QMap newProps; newProps.insert("proxy", QString()); - newProps.insert("replace", "1"); // insert required duration for proxy newProps.insert("proxy_out", item->referencedClip()->producerProperty("out")); new EditClipCommand(this, item->clipId(), item->referencedClip()->currentProperties(newProps), newProps, true, command); @@ -2922,7 +2927,6 @@ void ProjectList::updateProxyConfig() // remove proxy QMap newProps; newProps.insert("proxy", QString()); - newProps.insert("replace", "1"); new EditClipCommand(this, item->clipId(), item->referencedClip()->properties(), newProps, true, command); } } @@ -3098,17 +3102,13 @@ void ProjectList::processThumbOverlays(ProjectItem *item, QPixmap &pix) { if (item->hasProxy()) { QPainter p(&pix); - QColor c = QPalette().base().color(); - c.setAlpha(200); - QBrush br(c); - p.setBrush(br); - p.setPen(Qt::NoPen); - QRect r(1, 1, 15, 15); - p.drawRoundedRect(r, 2, 2); - p.setPen(QPalette().text().color()); + QColor c(220, 220, 10, 200); + QRect r(0, 0, 12, 12); + p.fillRect(r, c); QFont font = p.font(); font.setBold(true); p.setFont(font); + p.setPen(Qt::black); p.drawText(r, Qt::AlignCenter, i18nc("The first letter of Proxy, used as abbreviation", "P")); } } diff --git a/src/projecttree/abstractclipjob.cpp b/src/projecttree/abstractclipjob.cpp index 825c0724..cc3be060 100644 --- a/src/projecttree/abstractclipjob.cpp +++ b/src/projecttree/abstractclipjob.cpp @@ -57,6 +57,11 @@ const QString AbstractClipJob::errorMessage() const return m_errorMessage; } +const QString AbstractClipJob::logDetails() const +{ + return m_logDetails; +} + void AbstractClipJob::startJob() { } diff --git a/src/projecttree/abstractclipjob.h b/src/projecttree/abstractclipjob.h index fdd049c8..29dc5762 100644 --- a/src/projecttree/abstractclipjob.h +++ b/src/projecttree/abstractclipjob.h @@ -43,6 +43,7 @@ public: bool replaceClip; const QString clipId() const; const QString errorMessage() const; + const QString logDetails() const; void setStatus(CLIPJOBSTATUS status); virtual const QString destination() const; virtual void startJob(); @@ -54,6 +55,7 @@ public: protected: QString m_errorMessage; + QString m_logDetails; QProcess *m_jobProcess; signals: diff --git a/src/projecttree/cutclipjob.cpp b/src/projecttree/cutclipjob.cpp index c72543ad..24e6cee0 100644 --- a/src/projecttree/cutclipjob.cpp +++ b/src/projecttree/cutclipjob.cpp @@ -105,7 +105,7 @@ void CutClipJob::processLogInfo() { if (!m_jobProcess || m_jobDuration == 0 || jobStatus == JOBABORTED) return; QString log = m_jobProcess->readAll(); - if (!log.isEmpty()) m_errorMessage.append(log + '\n'); + if (!log.isEmpty()) m_logDetails.append(log + '\n'); int progress; // Parse FFmpeg output if (log.contains("frame=")) { diff --git a/src/projecttree/proxyclipjob.cpp b/src/projecttree/proxyclipjob.cpp index 3bd2e53c..88a6ac9a 100644 --- a/src/projecttree/proxyclipjob.cpp +++ b/src/projecttree/proxyclipjob.cpp @@ -160,7 +160,7 @@ void ProxyJob::startJob() if (QFileInfo(m_dest).size() == 0) { // File was not created processLogInfo(); - m_errorMessage.append(i18n("Failed to create file.")); + m_errorMessage.append(i18n("Failed to create proxy clip.")); setStatus(JOBCRASHED); } else setStatus(JOBDONE); @@ -180,7 +180,7 @@ void ProxyJob::processLogInfo() { if (!m_jobProcess || jobStatus == JOBABORTED) return; QString log = m_jobProcess->readAll(); - if (!log.isEmpty()) m_errorMessage.append(log + '\n'); + if (!log.isEmpty()) m_logDetails.append(log + '\n'); else return; int progress; if (m_isFfmpegJob) { diff --git a/src/renderer.cpp b/src/renderer.cpp index 16914aa3..aaea3fe7 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -644,7 +644,14 @@ void Render::processFileProperties() bool proxyProducer; if (info.xml.hasAttribute("proxy") && info.xml.attribute("proxy") != "-") { path = info.xml.attribute("proxy"); - proxyProducer = true; + // Check for missing proxies + if (QFileInfo(path).size() <= 0) { + // proxy is missing, re-create it + emit requestProxy(info.clipId); + proxyProducer = false; + path = info.xml.attribute("resource"); + } + else proxyProducer = true; } else { path = info.xml.attribute("resource"); diff --git a/src/renderer.h b/src/renderer.h index 809fc4fb..800f1ea5 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -408,6 +408,9 @@ signals: */ void removeInvalidProxy(const QString &id, bool durationError); void refreshDocumentProducers(bool displayRatioChanged, bool fpsChanged); + /** @brief A proxy clip is missing, ask for creation. */ + void requestProxy(QString); + /** @brief A frame's image has to be shown. *