X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprojectlist.cpp;h=d36e6ef7182e87a40fb0ab4923edf4510a7b92b2;hb=55ab81618b3e7e332109350167dcc3d094658336;hp=c1a03f0647285a4edfd5749b251b00259cd29d34;hpb=8afac50420387c43c7fc46d091d4183c59e06ca4;p=kdenlive diff --git a/src/projectlist.cpp b/src/projectlist.cpp index c1a03f06..d36e6ef7 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -44,6 +44,7 @@ #include "ui_templateclip_ui.h" #include "ui_cutjobdialog_ui.h" +#include "ui_scenecutdialog_ui.h" #include #include @@ -309,7 +310,7 @@ ProjectList::ProjectList(QWidget *parent) : connect(this, SIGNAL(processNextThumbnail()), this, SLOT(slotProcessNextThumbnail())); connect(m_listView, SIGNAL(projectModified()), this, SIGNAL(projectModified())); connect(m_listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected())); - connect(m_listView, SIGNAL(focusMonitor()), this, SIGNAL(raiseClipMonitor())); + connect(m_listView, SIGNAL(focusMonitor(bool)), this, SIGNAL(raiseClipMonitor(bool))); connect(m_listView, SIGNAL(pauseMonitor()), this, SIGNAL(pauseMonitor())); connect(m_listView, SIGNAL(requestMenu(const QPoint &, QTreeWidgetItem *)), this, SLOT(slotContextMenu(const QPoint &, QTreeWidgetItem *))); connect(m_listView, SIGNAL(addClip()), this, SIGNAL(pauseMonitor())); @@ -425,8 +426,8 @@ void ProjectList::setupGeneratorMenu(const QHash& menus) transcodeMenu->setEnabled(false); m_transcodeAction = transcodeMenu; } - if (menus.contains("stabilizeMenu") && menus.value("stabilizeMenu") ){ - QMenu* stabilizeMenu=menus.value("stabilizeMenu"); + if (menus.contains("clipActionsMenu") && menus.value("clipActionsMenu") ){ + QMenu* stabilizeMenu=menus.value("clipActionsMenu"); m_menu->addMenu(stabilizeMenu); if (stabilizeMenu->isEmpty()) stabilizeMenu->setEnabled(false); @@ -586,7 +587,7 @@ void ProjectList::editClipSelection(QList list) kDebug() << "Result: " << p.key() << " = " << p.value(); }*/ if (clipList.isEmpty()) { - emit displayMessage(i18n("No available clip selected"), -2); + emit displayMessage(i18n("No available clip selected"), -2, ErrorMessage); } else emit showClipProperties(clipList, commonproperties); } @@ -738,7 +739,7 @@ void ProjectList::slotModifiedClip(const QString &id) } else { pixmap = KIcon("view-refresh").pixmap(m_listView->iconSize()); } - item->setData(0, Qt::DecorationRole, pixmap); + item->setPixmap(pixmap); } } @@ -762,7 +763,7 @@ void ProjectList::slotMissingClip(const QString &id) QPainter p(&pixmap); p.drawPixmap(3, 3, icon.pixmap(width - 6, height - 6)); p.end(); - item->setData(0, Qt::DecorationRole, pixmap); + item->setPixmap(pixmap); if (item->referencedClip()) { item->referencedClip()->setPlaceHolder(true); Mlt::Producer *newProd = m_render->invalidProducer(id); @@ -777,7 +778,7 @@ void ProjectList::slotMissingClip(const QString &id) } } update(); - emit displayMessage(i18n("Check missing clips"), -2); + emit displayMessage(i18n("Check missing clips"), -2, ErrorMessage); emit updateRenderStatus(); } @@ -903,7 +904,7 @@ void ProjectList::adjustProxyActions(ProjectItem *clip) const void ProjectList::adjustStabilizeActions(ProjectItem *clip) const { - if (clip == NULL || clip->type() != PROJECTCLIPTYPE || clip->clipType() == COLOR || clip->clipType() == TEXT || clip->clipType() == PLAYLIST || clip->clipType() == SLIDESHOW) { + if (clip == NULL || clip->type() != PROJECTCLIPTYPE || clip->clipType() == COLOR || clip->clipType() == TEXT || clip->clipType() == SLIDESHOW) { m_stabilizeAction->setEnabled(false); return; } @@ -947,7 +948,7 @@ void ProjectList::slotUpdateClipProperties(const QString &id, QMap setEnabled(false); const QString parent = clip->getProperty("groupid"); QString groupName = clip->getProperty("groupname"); + QSize pixelSize((int)(m_listView->iconSize().height() * m_render->dar()), m_listView->iconSize().height()); ProjectItem *item = NULL; monitorItemEditing(false); if (!parent.isEmpty()) { @@ -1306,19 +1308,16 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) } if (parentitem) - item = new ProjectItem(parentitem, clip); + item = new ProjectItem(parentitem, clip, pixelSize); } if (item == NULL) { - item = new ProjectItem(m_listView, clip); + item = new ProjectItem(m_listView, clip, pixelSize); } if (item->data(0, DurationRole).isNull()) item->setData(0, DurationRole, i18n("Loading")); connect(clip, SIGNAL(createProxy(const QString &)), this, SLOT(slotCreateProxy(const QString &))); connect(clip, SIGNAL(abortProxy(const QString &, const QString &)), this, SLOT(slotAbortProxy(const QString, const QString))); + if (getProperties) { - int height = m_listView->iconSize().height(); - int width = (int)(height * m_render->dar()); - QPixmap pix = KIcon("video-x-generic").pixmap(QSize(width, height)); - item->setData(0, Qt::DecorationRole, pix); //item->setFlags(Qt::ItemIsSelectable); m_listView->processLayout(); QDomElement e = clip->toXML().cloneNode().toElement(); @@ -1359,7 +1358,7 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) QList cuts = clip->cutZones(); if (!cuts.isEmpty()) { for (int i = 0; i < cuts.count(); i++) { - SubProjectItem *sub = new SubProjectItem(item, cuts.at(i).zone.x(), cuts.at(i).zone.y(), cuts.at(i).description); + SubProjectItem *sub = new SubProjectItem(m_render->dar(), item, cuts.at(i).zone.x(), cuts.at(i).zone.y(), cuts.at(i).description); if (!clip->getClipHash().isEmpty()) { QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + '#' + QString::number(cuts.at(i).zone.x()) + ".png"; if (QFile::exists(cachedPixmap)) { @@ -1467,8 +1466,9 @@ void ProjectList::getCachedThumbnail(ProjectItem *item) requestClipThumbnail(item->clipId()); } else { - processThumbOverlays(item, pix); - item->setData(0, Qt::DecorationRole, pix); + QPixmap result = roundedPixmap(pix); + processThumbOverlays(item, result); + item->setPixmap(result); } } else { @@ -1476,6 +1476,34 @@ void ProjectList::getCachedThumbnail(ProjectItem *item) } } +QPixmap ProjectList::roundedPixmap(QImage img) +{ + QPixmap pix(img.width(), img.height()); + pix.fill(Qt::transparent); + QPainter p(&pix); + p.setRenderHint(QPainter::Antialiasing, true); + QPainterPath path; + path.addRoundedRect(0.5, 0.5, pix.width() - 1, pix.height() - 1, 2, 2); + p.setClipPath(path); + p.drawImage(0, 0, img); + p.end(); + return pix; +} + +QPixmap ProjectList::roundedPixmap(QPixmap source) +{ + QPixmap pix(source.width(), source.height()); + pix.fill(Qt::transparent); + QPainter p(&pix); + p.setRenderHint(QPainter::Antialiasing, true); + QPainterPath path; + path.addRoundedRect(0.5, 0.5, pix.width() - 1, pix.height() - 1, 2, 2); + p.setClipPath(path); + p.drawPixmap(0, 0, source); + p.end(); + return pix; +} + void ProjectList::getCachedThumbnail(SubProjectItem *item) { if (!item) return; @@ -1563,22 +1591,22 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, QStr } else if (clip->isPlaceHolder()) { item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled); - if (item->data(0, Qt::DecorationRole).isNull()) { - item->setData(0, Qt::DecorationRole, missingPixmap); + if (!item->hasPixmap()) { + item->setPixmap(missingPixmap); } else { QPixmap pixmap = qVariantValue(item->data(0, Qt::DecorationRole)); QPainter p(&pixmap); p.drawPixmap(3, 3, KIcon("dialog-close").pixmap(pixmap.width() - 6, pixmap.height() - 6)); p.end(); - item->setData(0, Qt::DecorationRole, pixmap); + item->setPixmap(pixmap); } } } else { if (displayRatioChanged) { requestClipThumbnail(clip->getId()); } - else if (item->data(0, Qt::DecorationRole).isNull()) { + else if (!item->hasPixmap()) { getCachedThumbnail(item); } if (item->data(0, DurationRole).toString().isEmpty()) { @@ -1593,7 +1621,7 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, QStr QPainter p(&pixmap); p.drawPixmap(3, 3, KIcon("dialog-close").pixmap(pixmap.width() - 6, pixmap.height() - 6)); p.end(); - item->setData(0, Qt::DecorationRole, pixmap); + item->setPixmap(pixmap); } else if (clip->getProperty("_replaceproxy") == "1") { clip->setProperty("_replaceproxy", QString()); @@ -1816,7 +1844,7 @@ void ProjectList::slotRemoveInvalidProxy(const QString &id, bool durationError) item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled); if (durationError) { kDebug() << "Proxy duration is wrong, try changing transcoding parameters."; - emit displayMessage(i18n("Proxy clip unusable (duration is different from original)."), -2); + emit displayMessage(i18n("Proxy clip unusable (duration is different from original)."), -2, ErrorMessage); } slotUpdateJobStatus(item, PROXYJOB, JOBCRASHED, i18n("Failed to create proxy for %1. check parameters", item->text(0)), "project_settings"); QString path = item->referencedClip()->getProperty("proxy"); @@ -2000,6 +2028,26 @@ void ProjectList::setDocument(KdenliveDoc *doc) 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, QStringList)), this, SLOT(updateAllClips(bool, bool, QStringList))); + connect(m_doc->clipManager(), SIGNAL(thumbReady(const QString &, int, QImage)), this, SLOT(slotSetThumbnail(const QString &, int, QImage))); +} + +void ProjectList::slotSetThumbnail(const QString &id, int framePos, QImage img) +{ + QString fullid = id + '#' + QString::number(framePos); + ProjectItem *pItem = NULL; + QTreeWidgetItem *item = getAnyItemById(fullid); + if (item && item->parent()) pItem = static_cast (item->parent()); + if (!item && framePos == 0) pItem = getItemById(id); + if (!item && !pItem) return; + if (item) { + if (item->type() == PROJECTCLIPTYPE) static_cast(item)->setPixmap(QPixmap::fromImage(img)); + else item->setData(0, Qt::DecorationRole, QPixmap::fromImage(img)); + } + else if (pItem) pItem->setPixmap(QPixmap::fromImage(img)); + if (pItem) { + QString hash = pItem->getClipHash(); + if (!hash.isEmpty()) m_doc->cacheImage(hash + '#' + QString::number(framePos), img); + } } QList ProjectList::documentClipList() const @@ -2105,26 +2153,22 @@ void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update) slotProcessNextThumbnail(); return; } - QPixmap pix; QImage img; int height = m_listView->iconSize().height(); int swidth = (int)(height * m_render->frameRenderWidth() / m_render->renderHeight()+ 0.5); int dwidth = (int)(height * m_render->dar() + 0.5); - if (clip->clipType() == AUDIO) - pix = KIcon("audio-x-generic").pixmap(QSize(dwidth, height)); - else if (clip->clipType() == IMAGE) { + if (clip->clipType() == IMAGE) { img = KThumb::getFrame(item->referencedClip()->getProducer(), 0, swidth, dwidth, height); } - else { + else if (clip->clipType() != AUDIO) { img = item->referencedClip()->extractImage(frame, dwidth, height); } - if (!pix.isNull() || !img.isNull()) { + if (!img.isNull()) { monitorItemEditing(false); - if (!img.isNull()) { - pix = QPixmap::fromImage(img); - processThumbOverlays(item, pix); - } - it->setData(0, Qt::DecorationRole, pix); + QPixmap pix = roundedPixmap(img); + processThumbOverlays(item, pix); + if (isSubItem) it->setData(0, Qt::DecorationRole, pix); + else item->setPixmap(pix); monitorItemEditing(true); QString hash = item->getClipHash(); @@ -2193,7 +2237,7 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce } } - if (!replace && m_allClipsProcessed && item->data(0, Qt::DecorationRole).isNull()) { + if (!replace && m_allClipsProcessed && !item->hasPixmap()) { getCachedThumbnail(item); } if (!toReload.isEmpty()) @@ -2316,10 +2360,10 @@ void ProjectList::slotReplyGetImage(const QString &clipId, const QImage &img) { ProjectItem *item = getItemById(clipId); if (item && !img.isNull()) { - QPixmap pix = QPixmap::fromImage(img); + QPixmap pix = roundedPixmap(img); processThumbOverlays(item, pix); monitorItemEditing(false); - item->setData(0, Qt::DecorationRole, pix); + item->setPixmap(pix); monitorItemEditing(true); QString hash = item->getClipHash(); if (!hash.isEmpty()) m_doc->cacheImage(hash, img); @@ -2567,17 +2611,14 @@ void ProjectList::addClipCut(const QString &id, int in, int out, const QString d DocClipBase *base = clip->referencedClip(); base->addCutZone(in, out); monitorItemEditing(false); - SubProjectItem *sub = new SubProjectItem(clip, in, out, desc); + SubProjectItem *sub = new SubProjectItem(m_render->dar(), clip, in, out, desc); if (newItem && desc.isEmpty() && !m_listView->isColumnHidden(1)) { if (!clip->isExpanded()) clip->setExpanded(true); m_listView->scrollToItem(sub); m_listView->editItem(sub, 1); } - QImage img = clip->referencedClip()->extractImage(in, (int)(sub->sizeHint(0).height() * m_render->dar()), sub->sizeHint(0).height() - 2); - sub->setData(0, Qt::DecorationRole, QPixmap::fromImage(img)); - QString hash = clip->getClipHash(); - if (!hash.isEmpty()) m_doc->cacheImage(hash + '#' + QString::number(in), img); + m_doc->clipManager()->requestThumbs(QString('#' + id), QList () << in); monitorItemEditing(true); } emit projectModified(); @@ -2684,7 +2725,7 @@ void ProjectList::slotAddOrUpdateSequence(const QString frameName) m_doc->slotCreateSlideshowClipFile(properties, groupInfo.at(0), groupInfo.at(1)); } - } else emit displayMessage(i18n("Sequence not found"), -2); + } else emit displayMessage(i18n("Sequence not found"), -2, ErrorMessage); } QMap ProjectList::getProxies() @@ -2905,12 +2946,12 @@ void ProjectList::slotCheckJobProcess() int count = 0; m_jobMutex.lock(); for (int i = 0; i < m_jobList.count(); i++) { - if (m_jobList.at(i)->jobStatus == JOBWORKING || m_jobList.at(i)->jobStatus == JOBWAITING) + if (m_jobList.at(i)->status() == JOBWORKING || m_jobList.at(i)->status() == JOBWAITING) count ++; else { // remove finished jobs AbstractClipJob *job = m_jobList.takeAt(i); - delete job; + job->deleteLater(); i--; } } @@ -2940,14 +2981,14 @@ void ProjectList::slotProcessJobs() int count = 0; m_jobMutex.lock(); for (int i = 0; i < m_jobList.count(); i++) { - if (m_jobList.at(i)->jobStatus == JOBWAITING) { + if (m_jobList.at(i)->status() == JOBWAITING) { if (job == NULL) { - m_jobList.at(i)->jobStatus = JOBWORKING; + m_jobList.at(i)->setStatus(JOBWORKING); job = m_jobList.at(i); } count++; } - else if (m_jobList.at(i)->jobStatus == JOBWORKING) + else if (m_jobList.at(i)->status() == JOBWORKING) count ++; } // Set jobs count @@ -2981,22 +3022,25 @@ void ProjectList::slotProcessJobs() } connect(job, SIGNAL(jobProgress(QString, int, int)), this, SIGNAL(processLog(QString, int, int))); connect(job, SIGNAL(cancelRunningJob(const QString, stringMap)), this, SIGNAL(cancelRunningJob(const QString, stringMap))); - connect(job, SIGNAL(gotFilterJobResults(QString,int, int, QString,stringMap)), this, SIGNAL(gotFilterJobResults(QString,int, int, QString,stringMap))); if (job->jobType == MLTJOB) { MeltJob *jb = static_cast (job); jb->setProducer(currentClip->getProducer(), currentClip->fileURL()); + if (jb->isProjectFilter()) + connect(job, SIGNAL(gotFilterJobResults(QString,int, int, stringMap,stringMap)), this, SLOT(slotGotFilterJobResults(QString,int, int,stringMap,stringMap))); + else + connect(job, SIGNAL(gotFilterJobResults(QString,int, int, stringMap,stringMap)), this, SIGNAL(gotFilterJobResults(QString,int, int,stringMap,stringMap))); } job->startJob(); - if (job->jobStatus == JOBDONE) { + if (job->status() == JOBDONE) { emit updateJobStatus(job->clipId(), job->jobType, JOBDONE); //TODO: replace with more generic clip replacement framework if (job->jobType == PROXYJOB) emit gotProxy(job->clipId()); if (job->addClipToProject()) { emit addClip(destination, QString(), QString()); } - } else if (job->jobStatus == JOBCRASHED || job->jobStatus == JOBABORTED) { - emit updateJobStatus(job->clipId(), job->jobType, job->jobStatus, job->errorMessage(), QString(), job->logDetails()); + } else if (job->status() == JOBCRASHED || job->status() == JOBABORTED) { + emit updateJobStatus(job->clipId(), job->jobType, job->status(), job->errorMessage(), QString(), job->logDetails()); } } // Thread finished, cleanup & update count @@ -3300,7 +3344,7 @@ bool ProjectList::hasPendingJob(ProjectItem *item, JOBTYPE type) for (int i = 0; i < m_jobList.count(); i++) { if (m_abortAllJobs) break; job = m_jobList.at(i); - if (job->clipId() == item->clipId() && job->jobType == type && (job->jobStatus == JOBWAITING || job->jobStatus == JOBWORKING)) return true; + if (job->clipId() == item->clipId() && job->jobType == type && (job->status() == JOBWAITING || job->status() == JOBWORKING)) return true; } return false; @@ -3392,7 +3436,7 @@ QStringList ProjectList::getPendingJobs(const QString &id) QStringList result; QMutexLocker lock(&m_jobMutex); for (int i = 0; i < m_jobList.count(); i++) { - if (m_jobList.at(i)->clipId() == id && (m_jobList.at(i)->jobStatus == JOBWAITING || m_jobList.at(i)->jobStatus == JOBWORKING)) { + if (m_jobList.at(i)->clipId() == id && (m_jobList.at(i)->status() == JOBWAITING || m_jobList.at(i)->status() == JOBWORKING)) { // discard this job result << m_jobList.at(i)->description; } @@ -3410,19 +3454,19 @@ void ProjectList::discardJobs(const QString &id, JOBTYPE type) { } } -void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QString&filterName, const QString&filterParams, const QString&finalFilterName, const QString&consumer, const QString&consumerParams, const QString&properties) +void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QString&filterName, const QString&filterParams, const QString&consumer, const QString&consumerParams, const QMap &extraParams) { ProjectItem *item = getItemById(id); if (!item) return; QStringList jobParams; jobParams << QString::number(info.cropStart.frames(m_fps)) << QString::number((info.cropStart + info.cropDuration).frames(m_fps)); - jobParams << QString() << filterName << filterParams << consumer << consumerParams << properties << QString::number(info.startPos.frames(m_fps)) << QString::number(info.track) << finalFilterName; - MeltJob *job = new MeltJob(item->clipType(), id, jobParams); + jobParams << QString() << filterName << filterParams << consumer << consumerParams << QString::number(info.startPos.frames(m_fps)) << QString::number(info.track); + MeltJob *job = new MeltJob(item->clipType(), id, jobParams, extraParams); if (job->isExclusive() && hasPendingJob(item, job->jobType)) { delete job; return; } - job->description = i18n("Filter %1", finalFilterName); + job->description = i18n("Filter %1", extraParams.value("finalfilter")); m_jobList.append(job); setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage()); slotCheckJobProcess(); @@ -3434,7 +3478,7 @@ void ProjectList::startClipFilterJob(const QString &filterName, const QString &c QString destination; ProjectItem *item = getItemById(ids.at(0)); if (!item) { - emit displayMessage(i18n("Cannot find clip to process filter %1", filterName), -2); + emit displayMessage(i18n("Cannot find clip to process filter %1", filterName), -2, ErrorMessage); return; } if (ids.count() == 1) { @@ -3443,14 +3487,67 @@ void ProjectList::startClipFilterJob(const QString &filterName, const QString &c else { destination = item->clipUrl().directory(); } - QPointer d = new ClipStabilize(destination, ids.count(), filterName); - if (d->exec() == QDialog::Accepted) { - processClipJob(ids, d->destination(), d->autoAddClip(), d->params(), d->desc()); + if (filterName == "motion_est") { + // Show config dialog + QPointer d = new QDialog(this); + Ui::SceneCutDialog_UI ui; + ui.setupUi(d); + // Set up categories + for (int i = 0; i < 5; ++i) { + ui.marker_type->insertItem(i, i18n("Category %1", i)); + ui.marker_type->setItemData(i, CommentedTime::markerColor(i), Qt::DecorationRole); + } + ui.marker_type->setCurrentIndex(KdenliveSettings::default_marker_type()); + if (d->exec() != QDialog::Accepted) { + delete d; + return; + } + // Autosplit filter + QStringList jobParams; + // Producer params + jobParams << QString(); + // Filter params, use a smaller region of the image to speed up operation + // In fact, it's faster to rescale whole image than using part of it (bounding=\"25%x25%:15%x15\") + jobParams << filterName << "shot_change_list=0 denoise=0"; + // Consumer + jobParams << "null" << "all=1 terminate_on_pause=1 real_time=-1 rescale=nearest deinterlace_method=onefield top_field_first=-1"; + QMap extraParams; + extraParams.insert("key", "shot_change_list"); + extraParams.insert("projecttreefilter", "1"); + QString keyword("%count"); + extraParams.insert("resultmessage", i18n("Found %1 scenes.", keyword)); + extraParams.insert("resize_profile", "160"); + if (ui.store_data->isChecked()) { + // We want to save result as clip metadata + extraParams.insert("storedata", "1"); + } + if (ui.zone_only->isChecked()) { + // We want to analyze only clip zone + extraParams.insert("zoneonly", "1"); + } + if (ui.add_markers->isChecked()) { + // We want to create markers + extraParams.insert("addmarkers", QString::number(ui.marker_type->currentIndex())); + } + if (ui.cut_scenes->isChecked()) { + // We want to cut scenes + extraParams.insert("cutscenes", "1"); + } + delete d; + processClipJob(ids, QString(), false, jobParams, i18n("Auto split"), extraParams); + } + else { + QPointer d = new ClipStabilize(destination, ids.count(), filterName); + if (d->exec() == QDialog::Accepted) { + QMap extraParams; + extraParams.insert("producer_profile", "1"); + processClipJob(ids, d->destination(), d->autoAddClip(), d->params(), d->desc(), extraParams); + } + delete d; } - delete d; } -void ProjectList::processClipJob(QStringList ids, const QString&destination, bool autoAdd, QStringList jobParams, const QString &description) +void ProjectList::processClipJob(QStringList ids, const QString&destination, bool autoAdd, QStringList jobParams, const QString &description, QMap extraParams) { QStringList preParams; // in and out @@ -3468,6 +3565,13 @@ void ProjectList::processClipJob(QStringList ids, const QString&destination, boo ProjectItem *item = getItemById(id); if (!item) continue; QStringList jobArgs; + if (extraParams.contains("zoneonly")) { + // Analyse clip zone only, remove in / out and replace with zone + preParams.takeFirst(); + preParams.takeFirst(); + QPoint zone = item->referencedClip()->zone(); + jobArgs << QString::number(zone.x()) << QString::number(zone.y()); + } jobArgs << preParams; if (ids.count() == 1) { jobArgs << consumer + ':' + destination; @@ -3477,12 +3581,13 @@ void ProjectList::processClipJob(QStringList ids, const QString&destination, boo } jobArgs << jobParams; - MeltJob *job = new MeltJob(item->clipType(), id, jobArgs); + MeltJob *job = new MeltJob(item->clipType(), id, jobArgs, extraParams); if (autoAdd) { job->setAddClipToProject(true); kDebug()<<"// ADDING TRUE"; } else kDebug()<<"// ADDING FALSE!!!"; + if (job->isExclusive() && hasPendingJob(item, job->jobType)) { delete job; return; @@ -3543,4 +3648,74 @@ void ProjectList::slotClosePopup() m_errorLog.clear(); } +void ProjectList::slotGotFilterJobResults(QString id, int , int , stringMap results, stringMap filterInfo) +{ + // Currently, only the first value of results is used + //kDebug()<<"// FILTER RES:\n"<setText(i18n("Auto Split Clip")); + foreach (QString pos, value) { + if (!pos.contains("=")) continue; + int newPos = pos.section("=", 0, 0).toInt(); + // Don't use scenes shorter than 1 second + if (newPos - cutPos < 24) continue; + (void) new AddClipCutCommand(this, id, cutPos + offset, newPos + offset, QString(), true, false, command); + cutPos = newPos; + } + if (command->childCount() == 0) + delete command; + else m_commandStack->push(command); + } + if (markersType >= 0) { + // Add markers from returned data + dataProcessed = true; + int cutPos = 0; + QUndoCommand *command = new QUndoCommand(); + command->setText(i18n("Add Markers")); + QList markersList; + int index = 1; + foreach (QString pos, value) { + if (!pos.contains("=")) continue; + int newPos = pos.section("=", 0, 0).toInt(); + // Don't use scenes shorter than 1 second + if (newPos - cutPos < 24) continue; + CommentedTime m(GenTime(newPos + offset, m_fps), QString::number(index), markersType); + markersList << m; + index++; + cutPos = newPos; + } + emit addMarkers(id, markersList); + } + if (!dataProcessed || filterInfo.contains("storedata")) { + // Store returned data as clip extra data + clip->referencedClip()->setAnalysisData(filterInfo.contains("displaydataname") ? filterInfo.value("displaydataname") : key, results.value(key), filterInfo.value("offset").toInt()); + emit updateAnalysisData(clip->referencedClip()); + } +} + + #include "projectlist.moc"