1 /** 2 * @file 3 * @brief Header file for CacheDisk class 4 * @author Jonathan Thomas <jonathan@openshot.org> 5 * 6 * @ref License 7 */ 8 9 /* LICENSE 10 * 11 * Copyright (c) 2008-2019 OpenShot Studios, LLC 12 * <http://www.openshotstudios.com/>. This file is part of 13 * OpenShot Library (libopenshot), an open-source project dedicated to 14 * delivering high quality video editing and animation solutions to the 15 * world. For more information visit <http://www.openshot.org/>. 16 * 17 * OpenShot Library (libopenshot) is free software: you can redistribute it 18 * and/or modify it under the terms of the GNU Lesser General Public License 19 * as published by the Free Software Foundation, either version 3 of the 20 * License, or (at your option) any later version. 21 * 22 * OpenShot Library (libopenshot) is distributed in the hope that it will be 23 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25 * GNU Lesser General Public License for more details. 26 * 27 * You should have received a copy of the GNU Lesser General Public License 28 * along with OpenShot Library. If not, see <http://www.gnu.org/licenses/>. 29 */ 30 31 #ifndef OPENSHOT_CACHE_DISK_H 32 #define OPENSHOT_CACHE_DISK_H 33 34 #include <map> 35 #include <deque> 36 #include <memory> 37 #include "CacheBase.h" 38 #include "Frame.h" 39 #include <QDir> 40 41 namespace openshot { 42 43 /** 44 * @brief This class is a disk-based cache manager for Frame objects. 45 * 46 * It is used by the Timeline class, if enabled, to cache video and audio frames to disk, to cut down on CPU 47 * and memory utilization. This will thrash a user's disk, but save their memory and CPU. It's a trade off that 48 * sometimes makes perfect sense. You can also set the max number of bytes to cache. 49 */ 50 class CacheDisk : public CacheBase { 51 private: 52 QDir path; ///< This is the folder path of the cache directory 53 std::map<int64_t, int64_t> frames; ///< This map holds the frame number and Frame objects 54 std::deque<int64_t> frame_numbers; ///< This queue holds a sequential list of cached Frame numbers 55 std::string image_format; 56 float image_quality; 57 float image_scale; 58 59 int64_t frame_size_bytes; ///< The size of the cached frame in bytes 60 bool needs_range_processing; ///< Something has changed, and the range data needs to be re-calculated 61 std::string json_ranges; ///< JSON ranges of frame numbers 62 std::vector<int64_t> ordered_frame_numbers; ///< Ordered list of frame numbers used by cache 63 std::map<int64_t, int64_t> frame_ranges; ///< This map holds the ranges of frames, useful for quickly displaying the contents of the cache 64 int64_t range_version; ///< The version of the JSON range data (incremented with each change) 65 66 /// Clean up cached frames that exceed the max number of bytes 67 void CleanUp(); 68 69 /// Init path directory 70 void InitPath(std::string cache_path); 71 72 /// Calculate ranges of frames 73 void CalculateRanges(); 74 75 public: 76 /// @brief Default constructor, no max bytes 77 /// @param cache_path The folder path of the cache directory (empty string = /tmp/preview-cache/) 78 /// @param format The image format for disk caching (ppm, jpg, png) 79 /// @param quality The quality of the image (1.0=highest quality/slowest speed, 0.0=worst quality/fastest speed) 80 /// @param scale The scale factor for the preview images (1.0 = original size, 0.5=half size, 0.25=quarter size, etc...) 81 CacheDisk(std::string cache_path, std::string format, float quality, float scale); 82 83 /// @brief Constructor that sets the max bytes to cache 84 /// @param cache_path The folder path of the cache directory (empty string = /tmp/preview-cache/) 85 /// @param format The image format for disk caching (ppm, jpg, png) 86 /// @param quality The quality of the image (1.0=highest quality/slowest speed, 0.0=worst quality/fastest speed) 87 /// @param scale The scale factor for the preview images (1.0 = original size, 0.5=half size, 0.25=quarter size, etc...) 88 /// @param max_bytes The maximum bytes to allow in the cache. Once exceeded, the cache will purge the oldest frames. 89 CacheDisk(std::string cache_path, std::string format, float quality, float scale, int64_t max_bytes); 90 91 // Default destructor 92 ~CacheDisk(); 93 94 /// @brief Add a Frame to the cache 95 /// @param frame The openshot::Frame object needing to be cached. 96 void Add(std::shared_ptr<openshot::Frame> frame); 97 98 /// Clear the cache of all frames 99 void Clear(); 100 101 /// Count the frames in the queue 102 int64_t Count(); 103 104 /// @brief Get a frame from the cache 105 /// @param frame_number The frame number of the cached frame 106 std::shared_ptr<openshot::Frame> GetFrame(int64_t frame_number); 107 108 /// Gets the maximum bytes value 109 int64_t GetBytes(); 110 111 /// Get the smallest frame number 112 std::shared_ptr<openshot::Frame> GetSmallestFrame(); 113 114 /// @brief Move frame to front of queue (so it lasts longer) 115 /// @param frame_number The frame number of the cached frame 116 void MoveToFront(int64_t frame_number); 117 118 /// @brief Remove a specific frame 119 /// @param frame_number The frame number of the cached frame 120 void Remove(int64_t frame_number); 121 122 /// @brief Remove a range of frames 123 /// @param start_frame_number The starting frame number of the cached frame 124 /// @param end_frame_number The ending frame number of the cached frame 125 void Remove(int64_t start_frame_number, int64_t end_frame_number); 126 127 // Get and Set JSON methods 128 std::string Json(); ///< Generate JSON string of this object 129 void SetJson(const std::string value); ///< Load JSON string into this object 130 Json::Value JsonValue(); ///< Generate Json::Value for this object 131 void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object 132 }; 133 134 } 135 136 #endif 137