42 needs_range_processing =
false;
50 needs_range_processing =
false;
57 frame_numbers.clear();
58 ordered_frame_numbers.clear();
67void CacheMemory::CalculateRanges() {
69 if (needs_range_processing) {
75 std::sort(ordered_frame_numbers.begin(), ordered_frame_numbers.end());
78 Json::Value ranges = Json::Value(Json::arrayValue);
83 std::vector<int64_t>::iterator itr_ordered;
84 int64_t starting_frame = *ordered_frame_numbers.begin();
85 int64_t ending_frame = *ordered_frame_numbers.begin();
88 for (itr_ordered = ordered_frame_numbers.begin(); itr_ordered != ordered_frame_numbers.end(); ++itr_ordered) {
89 int64_t frame_number = *itr_ordered;
90 if (frame_number - ending_frame > 1) {
96 range[
"start"] = std::to_string(starting_frame);
97 range[
"end"] = std::to_string(ending_frame);
101 starting_frame = frame_number;
105 ending_frame = frame_number;
113 range[
"start"] = std::to_string(starting_frame);
114 range[
"end"] = std::to_string(ending_frame);
115 ranges.append(range);
118 json_ranges = ranges.toStyledString();
121 needs_range_processing =
false;
130 int64_t frame_number = frame->number;
133 if (frames.count(frame_number))
140 frames[frame_number] = frame;
141 frame_numbers.push_front(frame_number);
142 ordered_frame_numbers.push_back(frame_number);
143 needs_range_processing =
true;
157 if (frames.count(frame_number))
159 return frames[frame_number];
163 return std::shared_ptr<Frame>();
171 std::shared_ptr<openshot::Frame> f;
174 std::deque<int64_t>::iterator itr;
175 int64_t smallest_frame = -1;
176 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
178 if (*itr < smallest_frame || smallest_frame == -1)
179 smallest_frame = *itr;
194 int64_t total_bytes = 0;
197 std::deque<int64_t>::reverse_iterator itr;
198 for(itr = frame_numbers.rbegin(); itr != frame_numbers.rend(); ++itr)
200 total_bytes += frames[*itr]->GetBytes();
209 Remove(frame_number, frame_number);
219 std::deque<int64_t>::iterator itr;
220 for(itr = frame_numbers.begin(); itr != frame_numbers.end();)
222 if (*itr >= start_frame_number && *itr <= end_frame_number)
225 itr = frame_numbers.erase(itr);
231 std::vector<int64_t>::iterator itr_ordered;
232 for(itr_ordered = ordered_frame_numbers.begin(); itr_ordered != ordered_frame_numbers.end();)
234 if (*itr_ordered >= start_frame_number && *itr_ordered <= end_frame_number)
237 frames.erase(*itr_ordered);
238 itr_ordered = ordered_frame_numbers.erase(itr_ordered);
244 needs_range_processing =
true;
254 if (frames.count(frame_number))
257 std::deque<int64_t>::iterator itr;
258 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
260 if (*itr == frame_number)
263 frame_numbers.erase(itr);
266 frame_numbers.push_front(frame_number);
280 frame_numbers.clear();
281 ordered_frame_numbers.clear();
282 needs_range_processing =
true;
292 return frames.size();
296void CacheMemory::CleanUp()
307 int64_t frame_to_remove = frame_numbers.back();
333 root[
"version"] = std::to_string(range_version);
338 root[
"ranges"] = ranges;
355 catch (
const std::exception& e)
358 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)");
371 if (!root[
"type"].isNull())
Header file for CacheMemory class.
Header file for all Exception classes.
All cache managers in libopenshot are based on this CacheBase class.
virtual Json::Value JsonValue()=0
Generate Json::Value for this object.
std::string cache_type
This is a friendly type name of the derived cache instance.
virtual void SetJsonValue(const Json::Value root)=0
Load Json::Value into this object.
juce::CriticalSection * cacheCriticalSection
Section lock for multiple threads.
int64_t max_bytes
This is the max number of bytes to cache (0 = no limit)
CacheMemory()
Default constructor, no max bytes.
int64_t Count()
Count the frames in the queue.
void Add(std::shared_ptr< openshot::Frame > frame)
Add a Frame to the cache.
void SetJson(const std::string value)
Load JSON string into this object.
int64_t GetBytes()
Gets the maximum bytes value.
std::string Json()
Generate JSON string of this object.
std::shared_ptr< openshot::Frame > GetFrame(int64_t frame_number)
Get a frame from the cache.
void SetJsonValue(const Json::Value root)
Load Json::Value into this object.
void MoveToFront(int64_t frame_number)
Move frame to front of queue (so it lasts longer)
void Remove(int64_t frame_number)
Remove a specific frame.
void Clear()
Clear the cache of all frames.
Json::Value JsonValue()
Generate Json::Value for this object.
std::shared_ptr< openshot::Frame > GetSmallestFrame()
Get the smallest frame number.
Exception for invalid JSON.
This namespace is the default namespace for all code in the openshot library.
const Json::Value stringToJson(const std::string value)