1 /** 2 * @file 3 * @brief Header file for CacheBase 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_BASE_H 32 #define OPENSHOT_CACHE_BASE_H 33 34 #include <memory> 35 #include <cstdlib> 36 #include "Frame.h" 37 #include "Json.h" 38 39 namespace openshot { 40 41 /** 42 * @brief All cache managers in libopenshot are based on this CacheBase class 43 * 44 * Cache is a very important element of video editing, and is required to achieve a high degree 45 * of performance. There are multiple derived cache objects based on this class, some which use 46 * memory, and some which use disk to store the cache. 47 */ 48 class CacheBase 49 { 50 protected: 51 std::string cache_type; ///< This is a friendly type name of the derived cache instance 52 int64_t max_bytes; ///< This is the max number of bytes to cache (0 = no limit) 53 54 /// Section lock for multiple threads 55 juce::CriticalSection *cacheCriticalSection; 56 57 58 public: 59 /// Default constructor, no max bytes 60 CacheBase(); 61 62 /// @brief Constructor that sets the max bytes to cache 63 /// @param max_bytes The maximum bytes to allow in the cache. Once exceeded, the cache will purge the oldest frames. 64 CacheBase(int64_t max_bytes); 65 66 /// @brief Add a Frame to the cache 67 /// @param frame The openshot::Frame object needing to be cached. 68 virtual void Add(std::shared_ptr<openshot::Frame> frame) = 0; 69 70 /// Clear the cache of all frames 71 virtual void Clear() = 0; 72 73 /// Count the frames in the queue 74 virtual int64_t Count() = 0; 75 76 /// @brief Get a frame from the cache 77 /// @param frame_number The frame number of the cached frame 78 virtual std::shared_ptr<openshot::Frame> GetFrame(int64_t frame_number) = 0; 79 80 /// Gets the maximum bytes value 81 virtual int64_t GetBytes() = 0; 82 83 /// Get the smallest frame number 84 virtual std::shared_ptr<openshot::Frame> GetSmallestFrame() = 0; 85 86 /// @brief Remove a specific frame 87 /// @param frame_number The frame number of the cached frame 88 virtual void Remove(int64_t frame_number) = 0; 89 90 /// @brief Remove a range of frames 91 /// @param start_frame_number The starting frame number of the cached frame 92 /// @param end_frame_number The ending frame number of the cached frame 93 virtual void Remove(int64_t start_frame_number, int64_t end_frame_number) = 0; 94 95 /// Gets the maximum bytes value GetMaxBytes()96 int64_t GetMaxBytes() { return max_bytes; }; 97 98 /// @brief Set maximum bytes to a different amount 99 /// @param number_of_bytes The maximum bytes to allow in the cache. Once exceeded, the cache will purge the oldest frames. SetMaxBytes(int64_t number_of_bytes)100 void SetMaxBytes(int64_t number_of_bytes) { max_bytes = number_of_bytes; }; 101 102 /// @brief Set maximum bytes to a different amount based on a ReaderInfo struct 103 /// @param number_of_frames The maximum number of frames to hold in cache 104 /// @param width The width of the frame's image 105 /// @param height The height of the frame's image 106 /// @param sample_rate The sample rate of the frame's audio data 107 /// @param channels The number of audio channels in the frame 108 void SetMaxBytesFromInfo(int64_t number_of_frames, int width, int height, int sample_rate, int channels); 109 110 // Get and Set JSON methods 111 virtual std::string Json() = 0; ///< Generate JSON string of this object 112 virtual void SetJson(const std::string value) = 0; ///< Load JSON string into this object 113 virtual Json::Value JsonValue() = 0; ///< Generate Json::Value for this object 114 virtual void SetJsonValue(const Json::Value root) = 0; ///< Load Json::Value into this object 115 virtual ~CacheBase() = default; 116 117 }; 118 119 } 120 121 #endif 122