summaryrefslogtreecommitdiffstats
path: root/smglobals.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'smglobals.cpp')
-rw-r--r--smglobals.cpp99
1 files changed, 98 insertions, 1 deletions
diff --git a/smglobals.cpp b/smglobals.cpp
index 9b4837c..f163ac1 100644
--- a/smglobals.cpp
+++ b/smglobals.cpp
@@ -10,6 +10,12 @@
#include <QStringList>
#include <QMessageBox>
#include <QSettings>
+#include <QDir>
+#include <QFile>
+#include <QDataStream>
+#include <QFileInfo>
+#include <QTemporaryFile>
+#include <QProcess>
#include <QX11Info>
#include <X11/Xlib.h>
@@ -28,6 +34,7 @@ SmGlobals::~SmGlobals(){
delete model;
}
QSqlDatabase::removeDatabase("treedb");
+ delete mFrameCache;
}
SmGlobals *SmGlobals::instance(){
@@ -84,6 +91,13 @@ PictureViewer *SmGlobals::pictureViewer() {
return mPictureViewer;
}
+SmGlobals::FrameCache *SmGlobals::frameCache() {
+ if(!mFrameCache){
+ mFrameCache = new SmGlobals::FrameCache;
+ }
+ return mFrameCache;
+}
+
QSize SmGlobals::cursorSize() {
if(!mCursorSize.isValid()){
XFixesCursorImage *curImage = XFixesGetCursorImage(QX11Info::display());
@@ -93,4 +107,87 @@ QSize SmGlobals::cursorSize() {
return mCursorSize;
}
-SmGlobals::SmGlobals() : mPictureViewer(0) {}
+SmGlobals::SmGlobals() : mPictureViewer(0), mFrameCache(0) {}
+
+//FrameCache
+SmGlobals::FrameCache::FrameCache(QObject *parent) : QObject(parent), mMagic(0xDEADBEEF), mCacheSubDir(".frameCache"), mCacheFileName("cache") {
+ readConfig();
+ readCache();
+}
+
+SmGlobals::FrameCache::~FrameCache(){
+ QFile outfile(mCacheFile);
+ outfile.open(QIODevice::WriteOnly | QIODevice::Truncate);
+ QDataStream ds(&outfile);
+ ds << (qint32)mMagic;
+ for(QHash<QPair<QString, QString>, QString>::const_iterator it = mFrameCache.constBegin(); it != mFrameCache.constEnd(); ++it){
+ ds << it.key().first << it.key().second << it.value();
+ }
+ outfile.close();
+}
+
+void SmGlobals::FrameCache::readConfig(){
+ QSettings s;
+ QString archive = s.value("paths/archivedir").toString();
+ if(archive.isEmpty()){
+ return;
+ }
+ QDir archiveDir(archive);
+ if(!archiveDir.exists(mCacheSubDir)){
+ archiveDir.mkdir(mCacheSubDir);
+ }
+ mCacheDir = QString("%1/%2").arg(archive).arg(mCacheSubDir);
+ mCacheFile = QString("%1/%2").arg(mCacheDir).arg(mCacheFileName);
+ mWhen = s.value("ui/grabframe", "00:00:00").toString();
+ mFfMpegPath = s.value("paths/ffmpeg").toString();
+}
+
+const QPixmap SmGlobals::FrameCache::entry(const QString &sourcePath, const QString &when){
+ QString realWhen = when;
+ if(realWhen.isEmpty()){
+ realWhen = mWhen;
+ }
+ const QPair<QString, QString> source(sourcePath, realWhen);
+ if(!mFrameCache.contains(source)){
+ grabFrame(sourcePath, realWhen);
+ }
+ return QPixmap(mFrameCache.value(source));
+}
+
+void SmGlobals::FrameCache::grabFrame(const QString &sourceFile, QString when){
+ QFileInfo sourceInfo(sourceFile);
+ if(!sourceInfo.exists()){
+ return;
+ }
+ QString tmpTemplate = QString("%1/%2_%3-XXXXXX.png").arg(mCacheDir).arg(sourceInfo.fileName()).arg(when);
+ QTemporaryFile tempFile(tmpTemplate);
+ tempFile.setAutoRemove(false);
+ if(tempFile.open()){
+ QStringList ffMpegArgs = QStringList() << "-vframes" << "1" << "-ss" << when << "-i" << sourceFile << "-y" << tempFile.fileName();
+ QProcess ffmpeg;
+ ffmpeg.start(mFfMpegPath, ffMpegArgs);
+ if(!ffmpeg.waitForStarted()){
+ return;
+ }
+ ffmpeg.waitForFinished();
+ QPair<QString, QString> pair(sourceFile, when);
+ mFrameCache.insert(pair, tempFile.fileName());
+ }
+}
+
+void SmGlobals::FrameCache::readCache(){
+ QFile cache(mCacheFile);
+ cache.open(QIODevice::ReadOnly);
+ QDataStream ds(&cache);
+ qint32 magic;
+ ds >> magic;
+ if(magic != mMagic){
+ return;
+ }
+ while(!ds.atEnd()){
+ QString source, pos, cacheFile;
+ ds >> source >> pos >> cacheFile;
+ QPair<QString, QString> pair(source, pos);
+ mFrameCache.insert(pair, cacheFile);
+ }
+}