From 711b219a001d0c4fdd61367903696fa1c6ff1a3d Mon Sep 17 00:00:00 2001 From: ZackaryWelch Date: Tue, 3 Oct 2017 15:24:26 -0400 Subject: Added experimental video thumbnails in lumina-fm and fileinfo --- src-qt5/desktop-utils/lumina-fm/Browser.cpp | 62 ++++++++++++++++++++++----- src-qt5/desktop-utils/lumina-fm/Browser.h | 10 ++++- src-qt5/desktop-utils/lumina-fm/lumina-fm.pro | 1 + 3 files changed, 60 insertions(+), 13 deletions(-) (limited to 'src-qt5/desktop-utils/lumina-fm') diff --git a/src-qt5/desktop-utils/lumina-fm/Browser.cpp b/src-qt5/desktop-utils/lumina-fm/Browser.cpp index f2bdc178..e57b6aed 100644 --- a/src-qt5/desktop-utils/lumina-fm/Browser.cpp +++ b/src-qt5/desktop-utils/lumina-fm/Browser.cpp @@ -16,10 +16,13 @@ Browser::Browser(QObject *parent) : QObject(parent){ watcher = new QFileSystemWatcher(this); connect(watcher, SIGNAL(fileChanged(const QString&)), this, SLOT(fileChanged(QString)) ); - connect(watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(dirChanged(QString)) ); + connect(watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(dirChanged(QString)) ); showHidden = false; showThumbs = false; imageFormats = LUtils::imageExtensions(false); //lowercase suffixes + videoFormats = LUtils::videoExtensions(); //lowercase suffixes + //connect(surface, SIGNAL(frameReceived(QImage)), this, SLOT(captureFrame(QImage))); + //connect(player, &QMediaPlayer::mediaStatusChanged, this, [&]{ stopVideo(player, player->mediaStatus()); }); connect(this, SIGNAL(threadDone(QString, QImage)), this, SLOT(futureFinished(QString, QImage))); //will always be between different threads } @@ -60,12 +63,11 @@ void Browser::loadItem(QString info, Browser *obj){ file.close(); pix.loadFromData(bytes); if(pix.width() > 256 || pix.height() > 256 ){ - pix = pix.scaled(256,256, Qt::KeepAspectRatio, Qt::SmoothTransformation); + pix = pix.scaled(256,256, Qt::KeepAspectRatio); } } } - - //qDebug() << " - done with item:" << info; + qDebug() << " - done with item:" << info; obj->emit threadDone(info, pix); } @@ -92,22 +94,60 @@ void Browser::dirChanged(QString dir){ else if(dir.startsWith(currentDir)){ QtConcurrent::run(this, &Browser::loadItem, dir, this ); } } +/*void Browser::stopVideo(QMediaPlayer *player, QMediaPlayer::MediaStatus status) { + qDebug() << status; + if(status == QMediaPlayer::BufferedMedia) { + qDebug() << "stoppingVideo" << player << player->currentMedia().canonicalUrl(); + player->setPosition(player->duration() / 2); + player->pause(); + } +} + +void Browser::captureFrame(QImage pix) { + qDebug() << "grabbing frame"; + videoFrame = pix.scaledToHeight(64); + emit frameChanged(); +}*/ + void Browser::futureFinished(QString name, QImage icon){ //Note: this will be called once for every item that loads QIcon ico; - //LFileInfo info(name); LFileInfo *info = new LFileInfo(name); if(!icon.isNull() && showThumbs){ - //qDebug() << " -- Data:"; QPixmap pix = QPixmap::fromImage(icon); ico.addPixmap(pix); - //}else if(info->isDir()){ - //qDebug() << " -- Folder:"; - //ico = loadIcon("folder"); } if(ico.isNull()){ - //qDebug() << " -- MimeType:" << info.fileName() << info.mimetype(); - ico = loadIcon(info->iconfile()); + if(videoFormats.contains(name.section(".",-1).toLower())) { + qDebug() << "Loading Video for" << name; + qDebug() << "VIDEO" << info; + //qDebug() << obj << this << QThread::currentThread(); + QMediaPlayer *player = new QMediaPlayer(0, QMediaPlayer::VideoSurface); + qDebug() << " - created player"; + LVideoSurface *surface = new LVideoSurface(); + qDebug() << " - Create objects"; + //connect(surface, SIGNAL(frameReceived(QImage)), this, SLOT(captureFrame(QImage))); + //connect(player, &QMediaPlayer::mediaStatusChanged, this, [&]{ stopVideo(player, player->mediaStatus()); }); + player->setVideoOutput(surface); + player->setVolume(0); + player->setMedia(QUrl("file://"+info->absoluteFilePath())); + player->play(); + qDebug() << "Wait for buffer"; + while(player->mediaStatus()!=QMediaPlayer::BufferedMedia){ + QCoreApplication::processEvents(); + } + player->pause(); + player->setPosition(player->duration()/2); + while(!surface->frameReady()) { + QCoreApplication::processEvents(); + } + qDebug() << "Load Frame"; + ico.addPixmap(QPixmap::fromImage(surface->currentFrame())); + delete player; + delete surface; + }else { + ico = loadIcon(info->iconfile()); + } } this->emit itemDataAvailable( ico, info); //qDebug() << " -- done:" << name; diff --git a/src-qt5/desktop-utils/lumina-fm/Browser.h b/src-qt5/desktop-utils/lumina-fm/Browser.h index 94f6ba3f..7ccb5199 100644 --- a/src-qt5/desktop-utils/lumina-fm/Browser.h +++ b/src-qt5/desktop-utils/lumina-fm/Browser.h @@ -15,6 +15,8 @@ #include //#include +#include +#include #include /*class FileItem{ public: @@ -43,8 +45,9 @@ public: private: QString currentDir; QFileSystemWatcher *watcher; + //QImage videoFrame; bool showHidden, showThumbs; - QStringList imageFormats, oldFiles; + QStringList imageFormats, videoFormats, oldFiles; QHash mimeIcons; //cache for quickly re-using QIcons void loadItem(QString info, Browser *obj); //this is the main loader class - multiple instances each run in a separate thread @@ -53,7 +56,8 @@ private: private slots: void fileChanged(QString); //tied into the watcher - for file change notifications void dirChanged(QString); // tied into the watcher - for new/removed files in the current dir - + //void captureFrame(QImage); + //void stopVideo(QMediaPlayer*, QMediaPlayer::MediaStatus); void futureFinished(QString, QImage); public slots: @@ -70,6 +74,8 @@ signals: //Internal signal for the alternate threads void threadDone(QString, QImage); + + //void frameChanged(); }; #endif diff --git a/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro b/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro index 6c340e14..6cb4a537 100644 --- a/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro +++ b/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro @@ -15,6 +15,7 @@ include(../../core/libLumina/LuminaXDG.pri) include(../../core/libLumina/LuminaSingleApplication.pri) include(../../core/libLumina/LuminaThemes.pri) include(../../core/libLumina/ExternalProcess.pri) +include(../../core/libLumina/LVideoSurface.pri) SOURCES += main.cpp \ MainUI.cpp \ -- cgit From 2f6d29bf06e77b45daa742a5c6c65a5ed0624dab Mon Sep 17 00:00:00 2001 From: q5sys Date: Tue, 3 Oct 2017 15:25:46 -0400 Subject: Revert "rework video thumbnail code" This reverts commit a3092fb02a1905345e1311b2e64f4796acdb9f34. --- .../desktop-utils/lumina-fm/widgets/vidnail.cpp | 33 ---------------------- src-qt5/desktop-utils/lumina-fm/widgets/vidnail.h | 25 ---------------- 2 files changed, 58 deletions(-) delete mode 100644 src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp delete mode 100644 src-qt5/desktop-utils/lumina-fm/widgets/vidnail.h (limited to 'src-qt5/desktop-utils/lumina-fm') diff --git a/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp b/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp deleted file mode 100644 index ee7fb9e3..00000000 --- a/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "vidnail.h" -vidnail::vidnail(QWidget *parent) : QMainWindow(parent), mplayer(parent, QMediaPlayer::VideoSurface){ //there is no UI, so not sure how to alter the constructor -} - -vidnail::~vidnail() -{ - -vidnail::grabvideothumbnail(){ - vsurface = new QAbstractVideoSurface(); - mplayer.setVideoOutput(vsurface); - mplayer.setMedia($file); // video file to get thumbnail of - imageCaptured = QPixmap(); - mplayer.setPosition(2000); // time in milliseconds - mplayer.setMuted(true); // just to make sure no sound is emited - mplayer.play(); - - currentFrame = frame; - const QImage::Format imageFormat = QVideoFrame::imageFormatFromPixelFormat(format.pixelFormat()); - const QSize size = format.frameSize(); - - this->imageFormat = imageFormat; - QAbstractVideoSurface::start(format); - QImage image( currentFrame.bits(), currentFrame.width(), currentFrame.height(), currentFrame.bytesPerLine(), imageFormat); - imageCaptured = QPixmap::fromImage(image.copy(image.rect())); - -// Now do scaling with regular thumbnail process to make proper size - - mplayer.stop(); - vsurface.stop(); -} - - - diff --git a/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.h b/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.h deleted file mode 100644 index ad565749..00000000 --- a/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef VIDNAIL_H -#define VIDNAIL_H - -#include -#include -#include "videowidgetsurface.h" -#include -#include -#include -#include -#include - -public: - - void grabvideothumbnail(); - -private: - - QAbstractVideoSurface *vsurface; - QImage::Format imageFormat; - QPixmap imageCaptured; - - -#endif // VIDNAIL_H - -- cgit From 62805a2e99df692201c8a0885e8b8e785949b634 Mon Sep 17 00:00:00 2001 From: q5sys Date: Tue, 3 Oct 2017 15:29:19 -0400 Subject: add libav video thumbnail code back to project --- .../desktop-utils/lumina-fm/widgets/vidnail.cpp | 61 ++++++++++++++++++++++ src-qt5/desktop-utils/lumina-fm/widgets/vidnail.h | 13 +++++ 2 files changed, 74 insertions(+) create mode 100644 src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp create mode 100644 src-qt5/desktop-utils/lumina-fm/widgets/vidnail.h (limited to 'src-qt5/desktop-utils/lumina-fm') diff --git a/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp b/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp new file mode 100644 index 00000000..ee76a8dc --- /dev/null +++ b/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp @@ -0,0 +1,61 @@ +#ifndef VIDNAIL_H +#define VIDNAIL_H + +extern "C" { +#include +#include +} + +class VidNail; + +struct vFrame { + vFrame() : *width(0), *height(0) {} + vFrame(int *width, int *height : width(width), height(height) {} + int *width; + int *height; +}; + +public: + + QString getCodec(); + void goto(int timeInSeconds); + void readVideoFrame(); + void getScaledVideoFrame(int scaledSize, vFrame& vFrame); + + int getWidth(); + int getHeight(); + int getLength(); + + void makeThumbnail(const QString& videoFile, QImage &image); + void setThumbnailSize(int size); + void setPercentage(int percent); + void setTime(const QString& Time); + + void writeVidNail(vFrame& frame, QImage& image); + + + private: + + bool readVideoPacket(); + bool getVideoPacket(); + void scaleVideo(int scaledSize, int& scaledWidth, int& scaledHeight); + void createVFrame(AVFrame *vFrame, quint8 *frameBuffer, int width, int height); + void calculateDimensions(int size); + void generateThumbnail(const QString& videoFile, ImageWriter& imageWriter, QImage& +image); + QString getMimeType(const QString& videoFile); + QString getExtension(const QString& videoFilename); + + + private: + int videoStream; + AVFormatContext *inputVideoFormatContext; + AVCodecContext *inputvideoCodecContext; + AVCodec *inputVideoCodec; + AVStream *inputVideoStream; + AVFrame *inputVideoFrame; + quint8 *inputFrameBuffer; + AVPacket *videoPacket; + + +#endif // VIDNAIL_H diff --git a/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.h b/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.h new file mode 100644 index 00000000..e13894e1 --- /dev/null +++ b/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.h @@ -0,0 +1,13 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2017, q5sys +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "vidnail.h" + +VidNail::VidNail(QObject *parent) : QObject(parent){ +} + +VidNail::~VidNail(){ +} -- cgit From 3005f7ab6b19cabf423b85ec7c3845d840c7cb18 Mon Sep 17 00:00:00 2001 From: ZackaryWelch Date: Tue, 3 Oct 2017 18:36:51 -0400 Subject: Reworked the VideoSurface subclass --- src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src-qt5/desktop-utils/lumina-fm') diff --git a/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp b/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp index ee76a8dc..d0ecdecf 100644 --- a/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp +++ b/src-qt5/desktop-utils/lumina-fm/widgets/vidnail.cpp @@ -18,7 +18,7 @@ struct vFrame { public: QString getCodec(); - void goto(int timeInSeconds); + void skipTo(int timeInSeconds); void readVideoFrame(); void getScaledVideoFrame(int scaledSize, vFrame& vFrame); @@ -35,14 +35,12 @@ public: private: - bool readVideoPacket(); bool getVideoPacket(); void scaleVideo(int scaledSize, int& scaledWidth, int& scaledHeight); void createVFrame(AVFrame *vFrame, quint8 *frameBuffer, int width, int height); void calculateDimensions(int size); - void generateThumbnail(const QString& videoFile, ImageWriter& imageWriter, QImage& -image); + void generateThumbnail(const QString& videoFile, ImageWriter& imageWriter, QImage& image); QString getMimeType(const QString& videoFile); QString getExtension(const QString& videoFilename); -- cgit From 2a9d6daa5afa326cc9769d23a64345efeb891ea7 Mon Sep 17 00:00:00 2001 From: ZackaryWelch Date: Tue, 3 Oct 2017 18:44:22 -0400 Subject: Reworked the video thumnail system with lumina-fm --- src-qt5/desktop-utils/lumina-fm/Browser.cpp | 29 ++++++++++------------------- src-qt5/desktop-utils/lumina-fm/Browser.h | 9 ++++----- 2 files changed, 14 insertions(+), 24 deletions(-) (limited to 'src-qt5/desktop-utils/lumina-fm') diff --git a/src-qt5/desktop-utils/lumina-fm/Browser.cpp b/src-qt5/desktop-utils/lumina-fm/Browser.cpp index e57b6aed..bebb92e7 100644 --- a/src-qt5/desktop-utils/lumina-fm/Browser.cpp +++ b/src-qt5/desktop-utils/lumina-fm/Browser.cpp @@ -94,8 +94,8 @@ void Browser::dirChanged(QString dir){ else if(dir.startsWith(currentDir)){ QtConcurrent::run(this, &Browser::loadItem, dir, this ); } } -/*void Browser::stopVideo(QMediaPlayer *player, QMediaPlayer::MediaStatus status) { - qDebug() << status; +void Browser::stopVideo(QMediaPlayer *player, QMediaPlayer::MediaStatus status) { + //qDebug() << status; if(status == QMediaPlayer::BufferedMedia) { qDebug() << "stoppingVideo" << player << player->currentMedia().canonicalUrl(); player->setPosition(player->duration() / 2); @@ -103,11 +103,11 @@ void Browser::dirChanged(QString dir){ } } -void Browser::captureFrame(QImage pix) { +void Browser::captureFrame(QPixmap pix) { qDebug() << "grabbing frame"; videoFrame = pix.scaledToHeight(64); emit frameChanged(); -}*/ +} void Browser::futureFinished(QString name, QImage icon){ //Note: this will be called once for every item that loads @@ -120,29 +120,20 @@ void Browser::futureFinished(QString name, QImage icon){ if(ico.isNull()){ if(videoFormats.contains(name.section(".",-1).toLower())) { qDebug() << "Loading Video for" << name; - qDebug() << "VIDEO" << info; - //qDebug() << obj << this << QThread::currentThread(); + //qDebug() << "VIDEO" << info; QMediaPlayer *player = new QMediaPlayer(0, QMediaPlayer::VideoSurface); qDebug() << " - created player"; LVideoSurface *surface = new LVideoSurface(); qDebug() << " - Create objects"; - //connect(surface, SIGNAL(frameReceived(QImage)), this, SLOT(captureFrame(QImage))); - //connect(player, &QMediaPlayer::mediaStatusChanged, this, [&]{ stopVideo(player, player->mediaStatus()); }); + connect(surface, SIGNAL(frameReceived(QPixmap)), this, SLOT(captureFrame(QPixmap))); + connect(player, &QMediaPlayer::mediaStatusChanged, this, [&]{ stopVideo(player, player->mediaStatus()); }); player->setVideoOutput(surface); - player->setVolume(0); + player->setMuted(true); player->setMedia(QUrl("file://"+info->absoluteFilePath())); player->play(); - qDebug() << "Wait for buffer"; - while(player->mediaStatus()!=QMediaPlayer::BufferedMedia){ - QCoreApplication::processEvents(); - } player->pause(); - player->setPosition(player->duration()/2); - while(!surface->frameReady()) { - QCoreApplication::processEvents(); - } - qDebug() << "Load Frame"; - ico.addPixmap(QPixmap::fromImage(surface->currentFrame())); + //ico.addPixmap(videoFrame); + ico = loadIcon(info->iconfile()); delete player; delete surface; }else { diff --git a/src-qt5/desktop-utils/lumina-fm/Browser.h b/src-qt5/desktop-utils/lumina-fm/Browser.h index 7ccb5199..2dfae0be 100644 --- a/src-qt5/desktop-utils/lumina-fm/Browser.h +++ b/src-qt5/desktop-utils/lumina-fm/Browser.h @@ -45,7 +45,7 @@ public: private: QString currentDir; QFileSystemWatcher *watcher; - //QImage videoFrame; + QPixmap videoFrame; bool showHidden, showThumbs; QStringList imageFormats, videoFormats, oldFiles; QHash mimeIcons; //cache for quickly re-using QIcons @@ -56,13 +56,12 @@ private: private slots: void fileChanged(QString); //tied into the watcher - for file change notifications void dirChanged(QString); // tied into the watcher - for new/removed files in the current dir - //void captureFrame(QImage); - //void stopVideo(QMediaPlayer*, QMediaPlayer::MediaStatus); + void captureFrame(QPixmap); + void stopVideo(QMediaPlayer*, QMediaPlayer::MediaStatus); void futureFinished(QString, QImage); public slots: void loadDirectory(QString dir = ""); - signals: //Main Signals void itemRemoved(QString item); //emitted if a file was removed from the underlying @@ -75,7 +74,7 @@ signals: //Internal signal for the alternate threads void threadDone(QString, QImage); - //void frameChanged(); + void frameChanged(); }; #endif -- cgit From 7de2db7ab54f9c82eaa8b2a494a745c37923f4db Mon Sep 17 00:00:00 2001 From: Coupon Date: Tue, 3 Oct 2017 20:45:30 -0400 Subject: Further lumina-fm changes for video thumbnails --- src-qt5/desktop-utils/lumina-fm/Browser.cpp | 27 ++++++++++++++++----------- src-qt5/desktop-utils/lumina-fm/Browser.h | 4 ++-- 2 files changed, 18 insertions(+), 13 deletions(-) (limited to 'src-qt5/desktop-utils/lumina-fm') diff --git a/src-qt5/desktop-utils/lumina-fm/Browser.cpp b/src-qt5/desktop-utils/lumina-fm/Browser.cpp index bebb92e7..211ef8d0 100644 --- a/src-qt5/desktop-utils/lumina-fm/Browser.cpp +++ b/src-qt5/desktop-utils/lumina-fm/Browser.cpp @@ -71,12 +71,12 @@ void Browser::loadItem(QString info, Browser *obj){ obj->emit threadDone(info, pix); } -QIcon Browser::loadIcon(QString icon){ +QIcon* Browser::loadIcon(QString icon){ if(!mimeIcons.contains(icon)){ mimeIcons.insert(icon, LXDG::findIcon(icon, "unknown")); } - return mimeIcons[icon]; + return &mimeIcons[icon]; } @@ -103,21 +103,21 @@ void Browser::stopVideo(QMediaPlayer *player, QMediaPlayer::MediaStatus status) } } -void Browser::captureFrame(QPixmap pix) { +void Browser::captureFrame(QPixmap pix, QIcon *ico) { qDebug() << "grabbing frame"; - videoFrame = pix.scaledToHeight(64); + *ico = pix.scaledToHeight(64); emit frameChanged(); } void Browser::futureFinished(QString name, QImage icon){ //Note: this will be called once for every item that loads - QIcon ico; + QIcon *ico = new QIcon(); LFileInfo *info = new LFileInfo(name); if(!icon.isNull() && showThumbs){ QPixmap pix = QPixmap::fromImage(icon); - ico.addPixmap(pix); + ico->addPixmap(pix); } - if(ico.isNull()){ + if(ico->isNull()){ if(videoFormats.contains(name.section(".",-1).toLower())) { qDebug() << "Loading Video for" << name; //qDebug() << "VIDEO" << info; @@ -125,22 +125,27 @@ void Browser::futureFinished(QString name, QImage icon){ qDebug() << " - created player"; LVideoSurface *surface = new LVideoSurface(); qDebug() << " - Create objects"; - connect(surface, SIGNAL(frameReceived(QPixmap)), this, SLOT(captureFrame(QPixmap))); + connect(surface, &LVideoSurface::frameReceived, this, [&] (QPixmap pix) { captureFrame(pix, ico); }); connect(player, &QMediaPlayer::mediaStatusChanged, this, [&]{ stopVideo(player, player->mediaStatus()); }); player->setVideoOutput(surface); player->setMuted(true); player->setMedia(QUrl("file://"+info->absoluteFilePath())); player->play(); player->pause(); - //ico.addPixmap(videoFrame); - ico = loadIcon(info->iconfile()); + + QEventLoop loop; + connect(this, SIGNAL(frameChanged()), &loop, SLOT(quit())); + loop.exec(); + + ico->addPixmap(videoFrame); + //ico = loadIcon(info->iconfile()); delete player; delete surface; }else { ico = loadIcon(info->iconfile()); } } - this->emit itemDataAvailable( ico, info); + this->emit itemDataAvailable( *ico, info); //qDebug() << " -- done:" << name; } diff --git a/src-qt5/desktop-utils/lumina-fm/Browser.h b/src-qt5/desktop-utils/lumina-fm/Browser.h index 2dfae0be..379753ab 100644 --- a/src-qt5/desktop-utils/lumina-fm/Browser.h +++ b/src-qt5/desktop-utils/lumina-fm/Browser.h @@ -51,12 +51,12 @@ private: QHash mimeIcons; //cache for quickly re-using QIcons void loadItem(QString info, Browser *obj); //this is the main loader class - multiple instances each run in a separate thread - QIcon loadIcon(QString icon); //simplification for using/populating the mimIcons cache + QIcon* loadIcon(QString icon); //simplification for using/populating the mimIcons cache private slots: void fileChanged(QString); //tied into the watcher - for file change notifications void dirChanged(QString); // tied into the watcher - for new/removed files in the current dir - void captureFrame(QPixmap); + void captureFrame(QPixmap, QIcon*); void stopVideo(QMediaPlayer*, QMediaPlayer::MediaStatus); void futureFinished(QString, QImage); -- cgit