From: Jean-Baptiste Mardelle Date: Sun, 19 Oct 2008 17:49:24 +0000 (+0000) Subject: Create audio thumbs one after another, should solve: X-Git-Url: https://git.sesse.net/?p=kdenlive;a=commitdiff_plain;h=e6a39bd6cb5144054f1015ec66d433e8e97cc6b9 Create audio thumbs one after another, should solve: http://www.kdenlive.org:80/mantis/view.php?id=208 svn path=/branches/KDE4/; revision=2499 --- diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index 27891f66..2ecef0cb 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -26,7 +26,7 @@ #include "docclipbase.h" #include "kdenlivedoc.h" -ClipManager::ClipManager(KdenliveDoc *doc): m_doc(doc), m_audioThumbsEnabled(false) { +ClipManager::ClipManager(KdenliveDoc *doc): m_doc(doc), m_audioThumbsEnabled(false), m_audioThumbsQueue(QList ()), m_generatingAudioId(QString()) { m_clipIdCounter = 1; } @@ -38,9 +38,55 @@ void ClipManager::checkAudioThumbs() { if (m_audioThumbsEnabled == KdenliveSettings::audiothumbnails()) return; m_audioThumbsEnabled = KdenliveSettings::audiothumbnails(); for (int i = 0; i < m_clipList.count(); i++) { - if (m_audioThumbsEnabled) m_clipList.at(i)->slotRequestAudioThumbs(); + if (m_audioThumbsEnabled) m_audioThumbsQueue.append(m_clipList.at(i)->getId()); else m_clipList.at(i)->slotClearAudioCache(); } + if (m_audioThumbsEnabled) { + if (m_generatingAudioId.isEmpty()) startAudioThumbsGeneration(); + } + else { + m_audioThumbsQueue.clear(); + m_generatingAudioId = QString(); + } +} + +void ClipManager::askForAudioThumb(const QString &id) { + DocClipBase *clip = getClipById(id); + if (clip && KdenliveSettings::audiothumbnails()) { + m_audioThumbsQueue.append(id); + if (m_generatingAudioId.isEmpty()) startAudioThumbsGeneration(); + } +} + +void ClipManager::startAudioThumbsGeneration() { + if (!KdenliveSettings::audiothumbnails()) { + m_audioThumbsQueue.clear(); + m_generatingAudioId = QString(); + return; + } + if (!m_audioThumbsQueue.isEmpty()) { + m_generatingAudioId = m_audioThumbsQueue.takeFirst(); + DocClipBase *clip = getClipById(m_generatingAudioId); + if (!clip || !clip->slotGetAudioThumbs()) + endAudioThumbsGeneration(m_generatingAudioId); + } else { + m_generatingAudioId = QString(); + } +} + +void ClipManager::endAudioThumbsGeneration(const QString &requestedId) { + if (!KdenliveSettings::audiothumbnails()) { + m_audioThumbsQueue.clear(); + m_generatingAudioId = QString(); + return; + } + if (!m_audioThumbsQueue.isEmpty()) { + if (m_generatingAudioId == requestedId) { + startAudioThumbsGeneration(); + } + } else { + m_generatingAudioId = QString(); + } } void ClipManager::setThumbsProgress(const QString &message, int progress) { @@ -53,7 +99,7 @@ QList ClipManager::documentClipList() { void ClipManager::addClip(DocClipBase *clip) { m_clipList.append(clip); - QString id = clip->getId(); + const QString id = clip->getId(); if (id.toInt() >= m_clipIdCounter) m_clipIdCounter = id.toInt() + 1; } diff --git a/src/clipmanager.h b/src/clipmanager.h index 575f0e83..3fd66c62 100644 --- a/src/clipmanager.h +++ b/src/clipmanager.h @@ -60,14 +60,19 @@ Q_OBJECT public: QList documentClipList(); int getFreeClipId(); int lastClipId() const; + void startAudioThumbsGeneration(); + void endAudioThumbsGeneration(const QString &requestedId); + void askForAudioThumb(const QString &id); private: // Private attributes /** the list of clips in the document */ QList m_clipList; + QList m_audioThumbsQueue; /** the document undo stack*/ KdenliveDoc *m_doc; int m_clipIdCounter; bool m_audioThumbsEnabled; + QString m_generatingAudioId; }; diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index d2247be3..9b607b98 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -23,7 +23,7 @@ #include "clipmanager.h" DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id): - m_id(id), m_description(QString()), m_refcount(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL), m_clipProducer(NULL), m_properties(QMap ()) { + m_id(id), m_description(QString()), m_refcount(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL), m_clipProducer(NULL), m_properties(QMap ()), audioFrameChache(QMap > ()) { int type = xml.attribute("type").toInt(); m_clipType = (CLIPTYPE) type; m_name = xml.attribute("name"); @@ -45,7 +45,7 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin //if (!url.isEmpty() && QFile::exists(url.path())) { - m_thumbProd = new KThumb(clipManager, url); + m_thumbProd = new KThumb(clipManager, url, m_id); if (m_clipType == AV || m_clipType == AUDIO) slotCreateAudioTimer(); } //kDebug() << "type is video" << (m_clipType == AV) << " " << m_clipType; @@ -74,8 +74,8 @@ void DocClipBase::slotCreateAudioTimer() { connect(m_audioTimer, SIGNAL(timeout()), this, SLOT(slotGetAudioThumbs())); } -void DocClipBase::slotRequestAudioThumbs() { - emit getAudioThumbs(); +void DocClipBase::askForAudioThumbs() { + if (m_thumbProd) m_thumbProd->askForAudioThumbs(getId()); } void DocClipBase::slotClearAudioCache() { @@ -85,6 +85,10 @@ void DocClipBase::slotClearAudioCache() { m_audioThumbCreated = false; } +/*void DocClipBase::getClipMainThumb() { + if (m_thumbProd) m_thumbProd->getMainThumb(m_properties.value("thumbnail").toInt()); +}*/ + KThumb *DocClipBase::thumbProducer() { return m_thumbProd; } @@ -485,17 +489,17 @@ QMap DocClipBase::properties() const { return m_properties; } -void DocClipBase::slotGetAudioThumbs() { - if (m_thumbProd == NULL) return; +bool DocClipBase::slotGetAudioThumbs() { + if (m_thumbProd == NULL) return false; if (m_audioThumbCreated) { - if (m_audioTimer != NULL) - m_audioTimer->stop(); - } else { - if (m_audioTimer != NULL) - m_audioTimer->start(2000); - double lengthInFrames = duration().frames(/*framesPerSecond()*/25); - m_thumbProd->getAudioThumbs(2, 0, lengthInFrames /*must be number of frames*/, 20); + if (m_audioTimer != NULL) m_audioTimer->stop(); + return false; } + if (m_audioTimer != NULL) + m_audioTimer->start(1500); + double lengthInFrames = duration().frames(KdenliveSettings::project_fps()); + m_thumbProd->getAudioThumbs(2, 0, lengthInFrames /*must be number of frames*/, 20); + return true; } diff --git a/src/docclipbase.h b/src/docclipbase.h index 37ac0cf6..893b325f 100644 --- a/src/docclipbase.h +++ b/src/docclipbase.h @@ -80,6 +80,7 @@ Q_OBJECT public: //KThumb *thumbCreator; bool audioThumbCreated() const; + /*void getClipMainThumb();*/ /** returns the duration of this clip */ const GenTime & duration() const; @@ -184,10 +185,9 @@ Q_OBJECT public: /** format is frame -> channel ->bytes */ QMap > audioFrameChache; - /** Clip is ready to get thumbs */ - void slotRequestAudioThumbs(); /** Free cache data */ void slotClearAudioCache(); + void askForAudioThumbs(); private: // Private attributes /** The name of this clip */ @@ -222,7 +222,7 @@ private: // Private attributes public slots: void updateAudioThumbnail(QMap > data); - void slotGetAudioThumbs(); + bool slotGetAudioThumbs(); QList < CommentedTime > commentedSnapMarkers() const; void setSnapMarkers(QList < CommentedTime > markers); GenTime findNextSnapMarker(const GenTime & currTime); diff --git a/src/kthumb.cpp b/src/kthumb.cpp index 10f8aced..573d3790 100644 --- a/src/kthumb.cpp +++ b/src/kthumb.cpp @@ -39,7 +39,6 @@ #include "renderer.h" #include "kthumb.h" #include "kdenlivesettings.h" -#include "events.h" void MyThread::init(QObject *parent, KUrl url, QString target, double frame, double frameLength, int frequency, int channels, int arrayWidth) { @@ -87,7 +86,8 @@ void MyThread::run() { if (stop_me) break; val = (int)((z - m_frame) / (m_frame + m_frameLength) * 100.0); if (last_val != val & val > 1) { - QApplication::postEvent(m_parent, new ProgressEvent(val, (QEvent::Type)10005)); + emit audioThumbProgress(val); + //QApplication::postEvent(m_parent, new ProgressEvent(val, (QEvent::Type)10005)); last_val = val; } @@ -121,102 +121,19 @@ void MyThread::run() { if (stop_me) { f.remove(); } - QApplication::postEvent(m_parent, new ProgressEvent(-1, (QEvent::Type)10005)); - -} - -void ThumbThread::init(QObject *parent, Mlt::Producer *prod, int width, int height) { - stop_me = false; - m_parent = parent; - m_isWorking = false; - m_prod = prod; - m_width = width; - m_height = height; - m_frame1 = -1; - m_frame2 = -1; -} - -bool ThumbThread::isWorking() { - return m_isWorking; -} - -void ThumbThread::setThumbFrames(Mlt::Producer *prod, int frame1, int frame2) { - if (!m_prod) m_prod = prod; - m_frame1 = frame1; - m_frame2 = frame2; -} - -void ThumbThread::run() { - if (m_frame1 != -1 && m_prod) { - //mutex.lock(); - m_prod->seek(m_frame1); - Mlt::Frame *avframe = m_prod->get_frame(); - //mutex.unlock(); - if (!avframe) { - kDebug() << "///// BROKEN FRAME"; - } else { - mlt_image_format format = mlt_image_yuv422; - int frame_width = m_width; - int frame_height = m_height; - avframe->set("normalised_height", m_height); - avframe->set("normalised_width", m_width); - uint8_t *data = avframe->get_image(format, frame_width, frame_height, 0); - uint8_t *new_image = (uint8_t *)mlt_pool_alloc(frame_width * (frame_height + 1) * 4); - mlt_convert_yuv422_to_rgb24a((uint8_t *)data, new_image, frame_width * frame_height); - - QImage image((uchar *)new_image, frame_width, frame_height, QImage::Format_ARGB32); - - if (!image.isNull()) { - emit gotStartThumb(image.rgbSwapped()); - //QApplication::postEvent(m_parent, new ThumbEvent(m_frame1, image.rgbSwapped(), (QEvent::Type)10006)); - //pix = QPixmap::fromImage(image.rgbSwapped()); - } /*else - pix.fill(Qt::red);*/ - mlt_pool_release(new_image); - delete avframe; - } - //pix.fill(Qt::red); - - } - if (m_frame2 != -1 && m_prod) { - //mutex.lock(); - m_prod->seek(m_frame2); - Mlt::Frame *avframe = m_prod->get_frame(); - //mutex.unlock(); - if (!avframe) { - kDebug() << "///// BROKEN FRAME"; - } else { - mlt_image_format format = mlt_image_yuv422; - int frame_width = 0; - int frame_height = 0; - avframe->set("normalised_height", m_height); - avframe->set("normalised_width", m_width); - uint8_t *data = avframe->get_image(format, frame_width, frame_height, 0); - uint8_t *new_image = (uint8_t *)mlt_pool_alloc(frame_width * (frame_height + 1) * 4); - mlt_convert_yuv422_to_rgb24a((uint8_t *)data, new_image, frame_width * frame_height); - - QImage image((uchar *)new_image, frame_width, frame_height, QImage::Format_ARGB32); + emit audioThumbOver(); + //QApplication::postEvent(m_parent, new ProgressEvent(-1, (QEvent::Type)10005)); - if (!image.isNull()) { - emit gotEndThumb(image.rgbSwapped()); - //QApplication::postEvent(m_parent, new ThumbEvent(m_frame2, image.rgbSwapped(), (QEvent::Type)10006)); - //pix = QPixmap::fromImage(image.rgbSwapped()); - } /*else - pix.fill(Qt::red);*/ - mlt_pool_release(new_image); - delete avframe; - } - //pix.fill(Qt::red); - //QApplication::postEvent(m_parent, new ThumbEvent(m_frame2, pix, (QEvent::Type)10006)); - } } - -KThumb::KThumb(ClipManager *clipManager, KUrl url, QObject * parent, const char *name): QObject(parent), m_clipManager(clipManager), m_url(url), m_producer(NULL), m_dar(1) { +KThumb::KThumb(ClipManager *clipManager, KUrl url, const QString &id, QObject * parent, const char *name): QObject(parent), m_clipManager(clipManager), m_url(url), m_id(id), m_producer(NULL), m_dar(1), m_mainFrame(-1) { QCryptographicHash context(QCryptographicHash::Sha1); context.addData((KFileItem(m_url, "text/plain", S_IFREG).timeString() + m_url.fileName()).toAscii().data()); m_thumbFile = KGlobal::dirs()->saveLocation("tmp" , "kdenlive") + context.result().toHex() + ".thumb"; - kDebug() << "thumbfile=" << m_thumbFile; + //kDebug() << "thumbfile=" << m_thumbFile; + connect(&audioThumbProducer, SIGNAL(audioThumbProgress(const int)), this, SLOT(slotAudioThumbProgress(const int))); + connect(&audioThumbProducer, SIGNAL(audioThumbOver()), this, SLOT(slotAudioThumbOver())); + } KThumb::~KThumb() { @@ -246,22 +163,78 @@ QPixmap KThumb::getImage(KUrl url, int width, int height) { void KThumb::extractImage(int frame, int frame2) { if (m_url.isEmpty() || !KdenliveSettings::videothumbnails() || m_producer == NULL) return; - int twidth = (int)(KdenliveSettings::trackheight() * m_dar); + const int twidth = (int)(KdenliveSettings::trackheight() * m_dar); + const int theight = KdenliveSettings::trackheight(); + mlt_image_format format = mlt_image_yuv422; if (m_producer->is_blank()) { - QPixmap pix(twidth, KdenliveSettings::trackheight()); + QPixmap pix(twidth, theight); pix.fill(Qt::black); emit thumbReady(frame, pix); return; } + Mlt::Frame *mltFrame; if (frame != -1) { //videoThumbProducer.getThumb(frame); - QPixmap pix = getFrame(m_producer, frame, twidth, KdenliveSettings::trackheight()); - emit thumbReady(frame, pix); - } + m_producer->seek(frame); + mltFrame = m_producer->get_frame(); + if (!mltFrame) { + kDebug() << "///// BROKEN FRAME"; + QPixmap p(twidth, theight); + p.fill(Qt::red); + emit thumbReady(frame, p); + return; + } else { + if (frame2 != -1) m_producer->seek(frame2); + int frame_width = 0; + int frame_height = 0; + mltFrame->set("normalised_height", theight); + mltFrame->set("normalised_width", twidth); + QPixmap pix(twidth, theight); + uint8_t *data = mltFrame->get_image(format, frame_width, frame_height, 0); + uint8_t *new_image = (uint8_t *)mlt_pool_alloc(frame_width * (frame_height + 1) * 4); + mlt_convert_yuv422_to_rgb24a((uint8_t *)data, new_image, frame_width * frame_height); + + QImage image((uchar *)new_image, frame_width, frame_height, QImage::Format_ARGB32); + + if (!image.isNull()) { + pix = QPixmap::fromImage(image.rgbSwapped()); + } else + pix.fill(Qt::red); + + mlt_pool_release(new_image); + delete mltFrame; + emit thumbReady(frame, pix); + } + } else if (frame2 != -1) m_producer->seek(frame2); if (frame2 != -1) { - //videoThumbProducer.getThumb(frame2); - QPixmap pix = getFrame(m_producer, frame2, twidth , KdenliveSettings::trackheight()); - emit thumbReady(frame2, pix); + mltFrame = m_producer->get_frame(); + if (!mltFrame) { + kDebug() << "///// BROKEN FRAME"; + QPixmap p(twidth, theight); + p.fill(Qt::red); + emit thumbReady(frame, p); + return; + } else { + int frame_width = 0; + int frame_height = 0; + mltFrame->set("normalised_height", theight); + mltFrame->set("normalised_width", twidth); + QPixmap pix(twidth, theight); + uint8_t *data = mltFrame->get_image(format, frame_width, frame_height, 0); + uint8_t *new_image = (uint8_t *)mlt_pool_alloc(frame_width * (frame_height + 1) * 4); + mlt_convert_yuv422_to_rgb24a((uint8_t *)data, new_image, frame_width * frame_height); + + QImage image((uchar *)new_image, frame_width, frame_height, QImage::Format_ARGB32); + + if (!image.isNull()) { + pix = QPixmap::fromImage(image.rgbSwapped()); + } else + pix.fill(Qt::red); + + mlt_pool_release(new_image); + delete mltFrame; + emit thumbReady(frame2, pix); + } } } @@ -430,7 +403,6 @@ void KThumb::stopAudioThumbs() { if (audioThumbProducer.isRunning()) audioThumbProducer.stop_me = true; } - void KThumb::removeAudioThumb() { if (m_thumbFile.isEmpty()) return; stopAudioThumbs(); @@ -439,8 +411,11 @@ void KThumb::removeAudioThumb() { } void KThumb::getAudioThumbs(int channel, double frame, double frameLength, int arrayWidth) { - - if ((audioThumbProducer.isRunning() && audioThumbProducer.isWorking()) || channel == 0) { + if (channel == 0) { + slotAudioThumbOver(); + return; + } + if ((audioThumbProducer.isRunning() && audioThumbProducer.isWorking())) { return; } @@ -456,6 +431,7 @@ void KThumb::getAudioThumbs(int channel, double frame, double frameLength, int a if (channelarray.size() != arrayWidth*(frame + frameLength)*m_channels) { kDebug() << "--- BROKEN THUMB FOR: " << m_url.fileName() << " ---------------------- " << endl; f.remove(); + slotAudioThumbOver(); return; } kDebug() << "reading audio thumbs from file"; @@ -468,6 +444,7 @@ void KThumb::getAudioThumbs(int channel, double frame, double frameLength, int a } } emit audioThumbReady(storeIn); + slotAudioThumbOver(); } else { if (audioThumbProducer.isRunning()) return; audioThumbProducer.init(this, m_url, m_thumbFile, frame, frameLength, m_frequency, m_channels, arrayWidth); @@ -476,13 +453,18 @@ void KThumb::getAudioThumbs(int channel, double frame, double frameLength, int a } } -void KThumb::customEvent(QEvent * event) { - if (event->type() == 10005) { - ProgressEvent* p = static_cast (event); - m_clipManager->setThumbsProgress(i18n("Creating thumbnail for %1", m_url.fileName()), p->value()); - } +void KThumb::slotAudioThumbProgress(const int progress) { + m_clipManager->setThumbsProgress(i18n("Creating thumbnail for %1", m_url.fileName()), progress); +} + +void KThumb::slotAudioThumbOver() { + m_clipManager->setThumbsProgress(i18n("Creating thumbnail for %1", m_url.fileName()), -1); + m_clipManager->endAudioThumbsGeneration(m_id); } +void KThumb::askForAudioThumbs(const QString &id) { + m_clipManager->askForAudioThumb(id); +} #include "kthumb.moc" diff --git a/src/kthumb.h b/src/kthumb.h index ae56c9f6..b7374d35 100644 --- a/src/kthumb.h +++ b/src/kthumb.h @@ -51,7 +51,7 @@ class ClipManager; class MyThread : public QThread { - + Q_OBJECT public: virtual void run(); void init(QObject *parent, KUrl url, QString target, double frame, double frameLength, int frequency, int channels, int arrayWidth); @@ -68,41 +68,20 @@ private: int m_arrayWidth; bool m_isWorking; QObject *m_parent; -}; - - -class ThumbThread : public QThread { - Q_OBJECT -public: - virtual void run(); - void init(QObject *parent, Mlt::Producer *prod, int width, int height); - void setThumbFrames(Mlt::Producer *prod, int frame1, int frame2); - bool isWorking(); - bool stop_me; - -private: - int m_width; - int m_height; - int m_frame1; - int m_frame2; - Mlt::Producer *m_prod; - bool m_isWorking; - QObject *m_parent; - //QMutex mutex; signals: - void gotStartThumb(QImage); - void gotEndThumb(QImage); - + void audioThumbProgress(const int); + void audioThumbOver(); }; class KThumb: public QObject { Q_OBJECT public: - KThumb(ClipManager *clipManager, KUrl url, QObject * parent = 0, const char *name = 0); + KThumb(ClipManager *clipManager, KUrl url, const QString &id, QObject * parent = 0, const char *name = 0); ~KThumb(); void setProducer(Mlt::Producer *producer); + void askForAudioThumbs(const QString &id); public slots: void extractImage(int frame, int frame2); @@ -118,8 +97,9 @@ public slots: static QPixmap getImage(KUrl url, int frame, int width, int height); static QPixmap getFrame(Mlt::Producer *producer, int framepos, int width, int height); -protected: - virtual void customEvent(QEvent * event); +private slots: + void slotAudioThumbProgress(const int progress); + void slotAudioThumbOver(); private: MyThread audioThumbProducer; @@ -128,9 +108,12 @@ private: double m_dar; Mlt::Producer *m_producer; ClipManager *m_clipManager; + QString m_id; + int m_mainFrame; signals: - void thumbReady(int frame, QPixmap pm); + void thumbReady(int, QPixmap); + void mainThumbReady(const QString &, QPixmap); void audioThumbReady(QMap >); }; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3c8a7f32..2c09c869 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1296,7 +1296,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha m_commandStack->setActiveStack(doc->commandStack()); KdenliveSettings::setProject_display_ratio(doc->dar()); m_projectList->updateAllClips(); - doc->clipManager()->checkAudioThumbs(); + //doc->clipManager()->checkAudioThumbs(); //m_overView->setScene(trackView->projectScene()); //m_overView->scale(m_overView->width() / trackView->duration(), m_overView->height() / (50 * trackView->tracksNumber())); diff --git a/src/projectitem.cpp b/src/projectitem.cpp index c9dc7e1d..99a692ca 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -58,6 +58,7 @@ ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip) m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); setText(1, name); setText(2, m_clip->description()); + if ((m_clip->clipType() == AV || m_clip->clipType() == AUDIO) && KdenliveSettings::audiothumbnails()) m_clip->askForAudioThumbs(); //setFlags(Qt::NoItemFlags); //kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId; } @@ -73,6 +74,7 @@ ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip) m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); setText(1, name); setText(2, m_clip->description()); + if ((m_clip->clipType() == AV || m_clip->clipType() == AUDIO) && KdenliveSettings::audiothumbnails()) m_clip->askForAudioThumbs(); //setFlags(Qt::NoItemFlags); //kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId; } @@ -224,10 +226,10 @@ void ProjectItem::setProperties(const QMap < QString, QString > &attributes, con m_clip->setClipType(m_clipType); } slotSetToolTip(); - if ((m_clipType == AV || m_clipType == AUDIO) && KdenliveSettings::audiothumbnails()) m_clip->slotRequestAudioThumbs(); - m_clip->setProperties(attributes); + if ((m_clipType == AV || m_clipType == AUDIO) && KdenliveSettings::audiothumbnails()) m_clip->askForAudioThumbs(); + if (m_clip->description().isEmpty()) { if (metadata.contains("description")) { m_clip->setProperty("description", metadata["description"]);