From 674229de00f3b42f64251808087651b0ccd1d6c9 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sat, 12 Nov 2011 20:29:32 +0100 Subject: [PATCH] Improve proxy handling (missing or broken proxies) --- src/clipmanager.cpp | 17 +++++++++++++---- src/clipmanager.h | 2 +- src/docclipbase.cpp | 7 +++++++ src/docclipbase.h | 1 + src/projectlist.cpp | 34 ++++++++++++++++++++++++++++------ src/projectlist.h | 4 ++-- 6 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index ef169205..d7359127 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -325,15 +325,24 @@ void ClipManager::resetProducersList(const QList prods, bool d } } QString id; + Mlt::Producer *prod; + QStringList brokenClips; for (int i = 0; i < prods.count(); i++) { - id = prods.at(i)->get("id"); + prod = prods.at(i); + id = prod->get("id"); if (id.contains('_')) id = id.section('_', 0, 0); DocClipBase *clip = getClipById(id); - if (clip) { - clip->setProducer(prods.at(i), false, true); + QString markup = prod->get("markup"); + if (prod->is_blank() || !prod->is_valid() || !markup.isEmpty()) { + // The clip is broken (missing proxy or source clip) + kDebug()<<"// WARNING, CLIP "<setProducer(prod, false, true); } } - emit checkAllClips(displayRatioChanged, fpsChanged); + emit checkAllClips(displayRatioChanged, fpsChanged, brokenClips); } void ClipManager::slotAddClipList(const KUrl::List urls, const QString &group, const QString &groupId) diff --git a/src/clipmanager.h b/src/clipmanager.h index a3787c0f..9ac2cfd2 100644 --- a/src/clipmanager.h +++ b/src/clipmanager.h @@ -161,7 +161,7 @@ signals: void modifiedClip(const QString &); void missingClip(const QString &); void availableClip(const QString &); - void checkAllClips(bool displayRatioChanged, bool fpsChanged); + void checkAllClips(bool displayRatioChanged, bool fpsChanged, QStringList brokenClips); }; #endif diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index c1facc9a..9e581942 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -413,6 +413,12 @@ void DocClipBase::clearThumbProducer() if (m_thumbProd) m_thumbProd->clearProducer(); } +void DocClipBase::reloadThumbProducer() +{ + if (m_thumbProd && !m_thumbProd->hasProducer()) + m_thumbProd->setProducer(getProducer()); +} + void DocClipBase::deleteProducers() { if (m_thumbProd) m_thumbProd->clearProducer(); @@ -699,6 +705,7 @@ Mlt::Producer *DocClipBase::getProducer(int track) Mlt::Producer *DocClipBase::cloneProducer(Mlt::Producer *source) { Mlt::Producer *result = NULL; + QString invalidClip = source->get("markup"); QString url = QString::fromUtf8(source->get("resource")); if (KIO::NetAccess::exists(KUrl(url), KIO::NetAccess::SourceSide, 0)) { result = new Mlt::Producer(*(source->profile()), url.toUtf8().constData()); diff --git a/src/docclipbase.h b/src/docclipbase.h index 31a9a982..f84f8d84 100644 --- a/src/docclipbase.h +++ b/src/docclipbase.h @@ -206,6 +206,7 @@ Q_OBJECT public: void setPlaceHolder(bool place); QPixmap extractImage(int frame, int width, int height); void clearThumbProducer(); + void reloadThumbProducer(); void cleanupProducers(); bool isClean() const; diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 76730ffc..f8d7dd85 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -1227,7 +1227,7 @@ void ProjectList::getCachedThumbnail(SubProjectItem *item) else requestClipThumbnail(parentItem->clipId() + '#' + QString::number(pos)); } -void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged) +void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, QStringList brokenClips) { if (!m_allClipsProcessed) m_listView->setEnabled(false); m_listView->setSortingEnabled(false); @@ -1270,6 +1270,13 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged) item = static_cast (*it); clip = item->referencedClip(); if (item->referencedClip()->getProducer() == NULL) { + bool replace = false; + if (brokenClips.contains(item->clipId())) { + // if this is a proxy clip, disable proxy + item->setProxyStatus(NOPROXY); + clip->setProperty("proxy", "-"); + replace = true; + } if (clip->isPlaceHolder() == false && !item->isProxyRunning()) { QDomElement xml = clip->toXML(); if (fpsChanged) { @@ -1277,7 +1284,7 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged) xml.removeAttribute("file_hash"); xml.removeAttribute("proxy_out"); } - bool replace = xml.attribute("replace") == "1"; + if (!replace) replace = xml.attribute("replace") == "1"; if (replace) resetThumbsProducer(clip); m_render->getFileProperties(xml, clip->getId(), m_listView->iconSize().height(), replace); } @@ -1469,6 +1476,7 @@ void ProjectList::slotRemoveInvalidProxy(const QString &id, bool durationError) { ProjectItem *item = getItemById(id); if (item) { + kDebug()<<"// Proxy for clip "<setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled); if (durationError) { kDebug() << "Proxy duration is wrong, try changing transcoding parameters."; @@ -1482,6 +1490,14 @@ void ProjectList::slotRemoveInvalidProxy(const QString &id, bool durationError) if (proxyFolder.isParentOf(KUrl(path))) { QFile::remove(path); } + if (item->referencedClip()->getProducer() == NULL) { + // Clip has no valid producer, request it + slotProxyCurrentItem(false, item); + } + else { + // refresh thumbs producer + item->referencedClip()->reloadThumbProducer(); + } } m_processingClips.removeAll(id); m_thumbnailQueue.removeAll(id); @@ -1633,7 +1649,7 @@ void ProjectList::setDocument(KdenliveDoc *doc) connect(m_doc->clipManager(), SIGNAL(modifiedClip(const QString &)), this, SLOT(slotModifiedClip(const QString &))); connect(m_doc->clipManager(), SIGNAL(missingClip(const QString &)), this, SLOT(slotMissingClip(const QString &))); connect(m_doc->clipManager(), SIGNAL(availableClip(const QString &)), this, SLOT(slotAvailableClip(const QString &))); - connect(m_doc->clipManager(), SIGNAL(checkAllClips(bool, bool)), this, SLOT(updateAllClips(bool, bool))); + connect(m_doc->clipManager(), SIGNAL(checkAllClips(bool, bool, QStringList)), this, SLOT(updateAllClips(bool, bool, QStringList))); } QList ProjectList::documentClipList() const @@ -2618,9 +2634,11 @@ void ProjectList::updateProxyConfig() else delete command; } -void ProjectList::slotProxyCurrentItem(bool doProxy) +void ProjectList::slotProxyCurrentItem(bool doProxy, ProjectItem *itemToProxy) { - QList list = m_listView->selectedItems(); + QList list; + if (itemToProxy == NULL) list = m_listView->selectedItems(); + else list << itemToProxy; QTreeWidgetItem *listItem; QUndoCommand *command = new QUndoCommand(); if (doProxy) command->setText(i18np("Add proxy clip", "Add proxy clips", list.count())); @@ -2649,7 +2667,7 @@ void ProjectList::slotProxyCurrentItem(bool doProxy) ProjectItem *item = static_cast (listItem); CLIPTYPE t = item->clipType(); if ((t == VIDEO || t == AV || t == UNKNOWN || t == IMAGE || t == PLAYLIST) && item->referencedClip()) { - if ((doProxy && item->hasProxy()) || (!doProxy && !item->hasProxy())) continue; + if ((doProxy && item->hasProxy()) || (!doProxy && !item->hasProxy() && item->referencedClip()->getProducer() != NULL)) continue; DocClipBase *clip = item->referencedClip(); if (!clip || !clip->isClean() || m_render->isProcessing(item->clipId())) { kDebug()<<"//// TRYING TO PROXY: "<clipId()<<", but it is busy"; @@ -2667,6 +2685,10 @@ void ProjectList::slotProxyCurrentItem(bool doProxy) // We need to insert empty proxy so that undo will work oldProps.insert("proxy", QString()); } + else if (item->referencedClip()->getProducer() == NULL) { + // Force clip reload + newProps.insert("resource", item->referencedClip()->getProperty("resource")); + } new EditClipCommand(this, item->clipId(), oldProps, newProps, true, command); } } diff --git a/src/projectlist.h b/src/projectlist.h index 6f1815e4..02c32199 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -241,7 +241,7 @@ public: public slots: void setDocument(KdenliveDoc *doc); - void updateAllClips(bool displayRatioChanged, bool fpsChanged); + void updateAllClips(bool displayRatioChanged, bool fpsChanged, QStringList brokenClips); void slotReplyGetImage(const QString &clipId, const QImage &img); void slotReplyGetImage(const QString &clipId, const QString &name, int width, int height); void slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const stringMap &properties, const stringMap &metadata, bool replace); @@ -380,7 +380,7 @@ private slots: void slotGotProxy(const QString &proxyPath); void slotGotProxy(ProjectItem *item); /** @brief Enable / disable proxy for current clip. */ - void slotProxyCurrentItem(bool doProxy); + void slotProxyCurrentItem(bool doProxy, ProjectItem *itemToProxy = NULL); /** @brief Put clip in the proxy waiting list. */ void slotCreateProxy(const QString id); /** @brief Stop creation of this clip's proxy. */ -- 2.39.5