mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Video thumbnails are more complex than simple picture thumbnails. We store a duration and might want to store multiple images. Therefore, refactor the thumbnailing in imagedownloader.cpp. Move the thumbnail-writing down in the call chain to where the thumbnails are created, since we have more information there (i.e. whether we could parse the file but not extract an image, etc.). Split the write-to-cache function into three versions: - pictures - videos - unknown Define the video-thumbnail on-disk format as - uint32 MEDIATYPE_VIDEO - uint32 duration of video in seconds - uint32 number of pictures for each picture: - uint32 offset in msec from begining of video - QImage frame Currently, we write 0 pictures. This will be filled in subsequent commits. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
#ifndef IMAGEDOWNLOADER_H
|
|
#define IMAGEDOWNLOADER_H
|
|
|
|
#include "metadata.h"
|
|
#include <QImage>
|
|
#include <QFuture>
|
|
#include <QNetworkReply>
|
|
#include <QThreadPool>
|
|
|
|
class ImageDownloader : public QObject {
|
|
Q_OBJECT
|
|
public:
|
|
static ImageDownloader *instance();
|
|
ImageDownloader();
|
|
public slots:
|
|
void load(QUrl url, QString filename);
|
|
signals:
|
|
void loaded(QString filename);
|
|
void failed(QString filename);
|
|
private:
|
|
QNetworkAccessManager manager;
|
|
void loadFromUrl(const QString &filename, const QUrl &);
|
|
void saveImage(QNetworkReply *reply);
|
|
};
|
|
|
|
struct PictureEntry;
|
|
class Thumbnailer : public QObject {
|
|
Q_OBJECT
|
|
public:
|
|
static Thumbnailer *instance();
|
|
|
|
// Schedule a thumbnail for fetching or calculation.
|
|
// Returns a placeholder thumbnail. The actual thumbnail will be sent
|
|
// via a signal later.
|
|
QImage fetchThumbnail(const QString &filename);
|
|
|
|
// Schedule multiple thumbnails for forced recalculation
|
|
void calculateThumbnails(const QVector<QString> &filenames);
|
|
|
|
// If we change dive, clear all unfinished thumbnail creations
|
|
void clearWorkQueue();
|
|
static int maxThumbnailSize();
|
|
static int defaultThumbnailSize();
|
|
static int thumbnailSize(double zoomLevel);
|
|
public slots:
|
|
void imageDownloaded(QString filename);
|
|
void imageDownloadFailed(QString filename);
|
|
signals:
|
|
void thumbnailChanged(QString filename, QImage thumbnail);
|
|
private:
|
|
struct Thumbnail {
|
|
QImage img;
|
|
mediatype_t type;
|
|
duration_t duration;
|
|
};
|
|
|
|
Thumbnailer();
|
|
static void addPictureThumbnailToCache(const QString &picture_filename, const QImage &thumbnail);
|
|
static void addVideoThumbnailToCache(const QString &picture_filename, duration_t duration);
|
|
static void addUnknownThumbnailToCache(const QString &picture_filename);
|
|
void recalculate(QString filename);
|
|
void processItem(QString filename, bool tryDownload);
|
|
Thumbnail getThumbnailFromCache(const QString &picture_filename);
|
|
Thumbnail getPictureThumbnailFromStream(QDataStream &stream);
|
|
Thumbnail getVideoThumbnailFromStream(QDataStream &stream);
|
|
Thumbnail fetchImage(const QString &filename, const QString &originalFilename, bool tryDownload);
|
|
Thumbnail getHashedImage(const QString &filename, bool tryDownload);
|
|
|
|
mutable QMutex lock;
|
|
QThreadPool pool;
|
|
QImage failImage; // Shown when image-fetching fails
|
|
QImage dummyImage; // Shown before thumbnail is fetched
|
|
QImage videoImage; // Place holder for videos
|
|
QImage unknownImage; // Place holder for files where we couldn't determine the type
|
|
|
|
QMap<QString,QFuture<void>> workingOn;
|
|
};
|
|
|
|
#endif // IMAGEDOWNLOADER_H
|