X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprojectlist.cpp;h=ca4ba8c1755424a61a0af2a33198247815e053bf;hb=5bc0935dd65ffecbaf4c09dd4ce6199f3b02547c;hp=cb78f0684ae6e337bb05334db4af4e71e058c819;hpb=ed5a2c50b2402499f775bee428e079cac7bde423;p=kdenlive diff --git a/src/projectlist.cpp b/src/projectlist.cpp index cb78f068..ca4ba8c1 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -219,22 +219,24 @@ QStringList InvalidDialog::getIds() const ProjectList::ProjectList(QWidget *parent) : - QWidget(parent), - m_render(NULL), - m_fps(-1), - m_commandStack(NULL), - m_openAction(NULL), - m_reloadAction(NULL), - m_extractAudioAction(NULL), - m_transcodeAction(NULL), - m_clipsActionsMenu(NULL), - m_doc(NULL), - m_refreshed(false), - m_allClipsProcessed(false), - m_thumbnailQueue(), - m_abortAllJobs(false), - m_closing(false), - m_invalidClipDialog(NULL) + QWidget(parent) + , m_render(NULL) + , m_fps(-1) + , m_menu(NULL) + , m_commandStack(NULL) + , m_openAction(NULL) + , m_reloadAction(NULL) + , m_extractAudioAction(NULL) + , m_transcodeAction(NULL) + , m_clipsActionsMenu(NULL) + , m_doc(NULL) + , m_refreshed(false) + , m_allClipsProcessed(false) + , m_thumbnailQueue() + , m_proxyAction(NULL) + , m_abortAllJobs(false) + , m_closing(false) + , m_invalidClipDialog(NULL) { qRegisterMetaType ("stringMap"); QVBoxLayout *layout = new QVBoxLayout; @@ -353,7 +355,7 @@ ProjectList::~ProjectList() m_jobThreads.clearFutures(); if (!m_jobList.isEmpty()) qDeleteAll(m_jobList); m_jobList.clear(); - delete m_menu; + if (m_menu) delete m_menu; m_listView->blockSignals(true); m_listView->clear(); delete m_listViewDelegate; @@ -404,6 +406,10 @@ void ProjectList::setupMenu(QMenu *addMenu, QAction *defaultAction) void ProjectList::setupGeneratorMenu(const QHash& menus) { + if (!m_menu) { + kDebug()<<"Warning, menu was not created, something is wrong"; + return; + } if (!menus.contains("addMenu") && ! menus.value("addMenu") ) return; QMenu *menu = m_addButton->menu(); @@ -434,8 +440,8 @@ void ProjectList::setupGeneratorMenu(const QHash& menus) m_clipsActionsMenu = stabilizeMenu; } - m_menu->addAction(m_reloadAction); - m_menu->addAction(m_proxyAction); + if (m_reloadAction) m_menu->addAction(m_reloadAction); + if (m_proxyAction) m_menu->addAction(m_proxyAction); if (menus.contains("inTimelineMenu") && menus.value("inTimelineMenu")){ QMenu* inTimelineMenu=menus.value("inTimelineMenu"); m_menu->addMenu(inTimelineMenu); @@ -892,6 +898,7 @@ void ProjectList::slotClipSelected() void ProjectList::adjustProxyActions(ProjectItem *clip) const { + if (!m_proxyAction) return; if (clip == NULL || clip->type() != PROJECTCLIPTYPE || clip->clipType() == COLOR || clip->clipType() == TEXT || clip->clipType() == SLIDESHOW || clip->clipType() == AUDIO) { m_proxyAction->setEnabled(false); return; @@ -951,7 +958,7 @@ void ProjectList::slotUpdateClipProperties(const QString &id, QMap type() == PROJECTFOLDERTYPE) { if (column == 0) { FolderProjectItem *folder = static_cast (item); + if (item->text(0) == folder->groupName()) return; editFolder(item->text(0), folder->groupName(), folder->clipId()); folder->setGroupName(item->text(0)); m_doc->clipManager()->addFolder(folder->clipId(), item->text(0)); @@ -1070,6 +1078,10 @@ void ProjectList::slotCheckScrolling() void ProjectList::slotContextMenu(const QPoint &pos, QTreeWidgetItem *item) { + if (!m_menu) { + kDebug()<<"Warning, menu was not created, something is wrong"; + return; + } bool enable = item ? true : false; m_editButton->defaultAction()->setEnabled(enable); m_deleteButton->defaultAction()->setEnabled(enable); @@ -1183,10 +1195,10 @@ void ProjectList::updateButtons() const else m_editButton->defaultAction()->setEnabled(false); } m_openAction->setEnabled(false); - m_reloadAction->setEnabled(false); + if (m_reloadAction) m_reloadAction->setEnabled(false); m_transcodeAction->setEnabled(false); m_clipsActionsMenu->setEnabled(false); - m_proxyAction->setEnabled(false); + if (m_proxyAction) m_proxyAction->setEnabled(false); } void ProjectList::selectItemById(const QString &clipId) @@ -2197,38 +2209,83 @@ void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update) void ProjectList::extractMetadata(DocClipBase *clip) { - QMap props = clip->properties(); - if (props.contains("exiftool")) { - // metadata was already extracted + CLIPTYPE t = clip->clipType(); + if (t != AV && t != VIDEO) { + // Currently, we only use exiftool on video files return; } - QString codecid = props.value("videocodecid").simplified(); - if (codecid == "h264") { - QProcess p; - QStringList args; - args << "-g" << "-args" << clip->fileURL().encodedPathAndQuery(); - p.start("exiftool", args); - p.waitForFinished(); - QString res = p.readAllStandardOutput(); - QStringList list = res.split("\n"); + QMap props = clip->properties(); + if (KdenliveSettings::use_exiftool() && !props.contains("exiftool")) { QMap meta; - foreach(QString tagline, list) { - if (!tagline.startsWith("-H264")) continue; - QString tag = tagline.section(':', 1); - if (tag.startsWith("ImageWidth") || tag.startsWith("ImageHeight")) continue; - meta.insert(tag.section('=', 0, 0), tag.section('=', 1)); + QString url = clip->fileURL().path(); + //Check for Canon THM file + url = url.section('.', 0, -2) + ".THM"; + if (QFile::exists(url)) { + // Read the exif metadata embeded in the THM file + QProcess p; + QStringList args; + args << "-g" << "-args" << url; + p.start("exiftool", args); + p.waitForFinished(); + QString res = p.readAllStandardOutput(); + QStringList list = res.split("\n"); + foreach(QString tagline, list) { + if (tagline.startsWith("-File") || tagline.startsWith("-ExifTool")) continue; + QString tag = tagline.section(':', 1).simplified(); + if (tag.startsWith("ImageWidth") || tag.startsWith("ImageHeight")) continue; + if (!tag.section('=', 0, 0).isEmpty() && !tag.section('=', 1).simplified().isEmpty()) + meta.insert(tag.section('=', 0, 0), tag.section('=', 1).simplified()); + } + } else { + QString codecid = props.value("videocodecid").simplified(); + if (codecid == "h264") { + QProcess p; + QStringList args; + args << "-g" << "-args" << clip->fileURL().encodedPathAndQuery(); + p.start("exiftool", args); + p.waitForFinished(); + QString res = p.readAllStandardOutput(); + QStringList list = res.split("\n"); + foreach(QString tagline, list) { + if (!tagline.startsWith("-H264")) continue; + QString tag = tagline.section(':', 1); + if (tag.startsWith("ImageWidth") || tag.startsWith("ImageHeight")) continue; + meta.insert(tag.section('=', 0, 0), tag.section('=', 1)); + } + } } clip->setProperty("exiftool", "1"); if (!meta.isEmpty()) { - clip->setMetadata(meta); + clip->setMetadata(meta, "ExifTool"); //checkCamcorderFilters(clip, meta); } } + if (KdenliveSettings::use_magicLantern() && !props.contains("magiclantern")) { + QMap meta; + QString url = clip->fileURL().path(); + url = url.section('.', 0, -2) + ".LOG"; + if (QFile::exists(url)) { + QFile file(url); + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + while (!file.atEnd()) { + QString line = file.readLine().simplified(); + if (line.startsWith('#') || line.isEmpty() || !line.contains(':')) continue; + if (line.startsWith("CSV data")) break; + meta.insert(line.section(':', 0, 0).simplified(), line.section(':', 1).simplified()); + } + } + } + + if (!meta.isEmpty()) + clip->setMetadata(meta, "Magic Lantern"); + clip->setProperty("magiclantern", "1"); + } } void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const stringMap &properties, const stringMap &metadata, bool replace) { + QMutexLocker lock(&m_processMutex); QString toReload; ProjectItem *item = getItemById(clipId); if (item && producer) { @@ -2243,7 +2300,7 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce } item->setProperties(properties, metadata); clip->setProducer(producer, replace); - if (KdenliveSettings::use_exiftool()) extractMetadata(clip); + extractMetadata(clip); m_render->processingDone(clipId); // Proxy stuff @@ -2667,7 +2724,7 @@ void ProjectList::addClipCut(const QString &id, int in, int out, const QString d m_listView->scrollToItem(sub); m_listView->editItem(sub, 1); } - m_doc->clipManager()->requestThumbs(QString('#' + id), QList () << in); + m_doc->clipManager()->slotRequestThumbs(QString('#' + id), QList () << in); monitorItemEditing(true); } emit projectModified();