aboutsummaryrefslogtreecommitdiff
path: root/include/AsyncImageLoader.hpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-10-19 14:44:55 +0200
committerdec05eba <dec05eba@protonmail.com>2020-10-19 14:44:55 +0200
commit1569d02aa38baa53d5442b3babdbf1a3aaa3aaa0 (patch)
treee2d58b2ad86168c238f996e699097ca1d3991a47 /include/AsyncImageLoader.hpp
parent1ea92d1aa4656160fee3059500c405ce4260bce7 (diff)
Load thumbnails with multiple threads, use sha256 for saving image to path instead of base64 (filename limit is 256 on linux...)
Diffstat (limited to 'include/AsyncImageLoader.hpp')
-rw-r--r--include/AsyncImageLoader.hpp32
1 files changed, 29 insertions, 3 deletions
diff --git a/include/AsyncImageLoader.hpp b/include/AsyncImageLoader.hpp
index 0b3f4bf..3189565 100644
--- a/include/AsyncImageLoader.hpp
+++ b/include/AsyncImageLoader.hpp
@@ -1,11 +1,16 @@
#pragma once
-#include <string>
+#include "../include/Storage.hpp"
#include <SFML/System/Vector2.hpp>
#include <SFML/Graphics/Texture.hpp>
#include <SFML/System/Clock.hpp>
+#include <string>
+#include <vector>
#include <memory>
#include <thread>
+#include <mutex>
+#include <condition_variable>
+#include <deque>
namespace QuickMedia {
enum class LoadingState {
@@ -23,15 +28,36 @@ namespace QuickMedia {
sf::Clock texture_applied_time;
};
+ constexpr int NUM_IMAGE_LOAD_THREADS = 4;
+
class AsyncImageLoader {
public:
+ AsyncImageLoader();
+ ~AsyncImageLoader();
// Returns false if the image loader is already loading an image. In that case, this function should be called again later.
// set |resize_target_size| to {0, 0} to disable resizing.
// |thumbnail_data.loading_state| has to be LoadingState::NOT_LOADED when calling this!
// Note: this method is not thread-safe
- bool load_thumbnail(const std::string &url, bool local, sf::Vector2i resize_target_size, bool use_tor, std::shared_ptr<ThumbnailData> thumbnail_data);
+ void load_thumbnail(const std::string &url, bool local, sf::Vector2i resize_target_size, bool use_tor, std::shared_ptr<ThumbnailData> thumbnail_data);
+ private:
+ struct ThumbnailLoadData {
+ Path path;
+ Path thumbnail_path;
+ bool local;
+ std::shared_ptr<ThumbnailData> thumbnail_data;
+ sf::Vector2i resize_target_size;
+ };
+
+ // Returns -1 if all threads are busy
+ int get_free_load_index() const;
private:
- bool loading_image = false;
+ bool loading_image[NUM_IMAGE_LOAD_THREADS];
+ // TODO: Use curl single-threaded multi-download feature instead
+ std::thread download_image_thread[NUM_IMAGE_LOAD_THREADS];
std::thread load_image_thread;
+ std::mutex load_image_mutex;
+ std::condition_variable load_image_cv;
+ std::deque<ThumbnailLoadData> images_to_load;
+ bool running = true;
};
} \ No newline at end of file