22 CacheMemory::CacheMemory() :
CacheBase(0), bytes_freed_since_trim(0) {
50 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
51 int64_t frame_number = frame->number;
54 if (frames.count(frame_number))
61 frames[frame_number] = frame;
62 frame_numbers.push_front(frame_number);
73 if (frames.count(frame_number) > 0) {
84 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
87 if (frames.count(frame_number))
89 return frames[frame_number];
93 return std::shared_ptr<Frame>();
100 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
102 std::vector<std::shared_ptr<openshot::Frame>> all_frames;
103 std::vector<int64_t>::iterator itr_ordered;
106 int64_t frame_number = *itr_ordered;
107 all_frames.push_back(
GetFrame(frame_number));
117 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
120 std::deque<int64_t>::iterator itr;
121 int64_t smallest_frame = -1;
122 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
124 if (*itr < smallest_frame || smallest_frame == -1)
125 smallest_frame = *itr;
129 if (smallest_frame != -1) {
130 return frames[smallest_frame];
140 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
142 int64_t total_bytes = 0;
145 std::deque<int64_t>::reverse_iterator itr;
146 for(itr = frame_numbers.rbegin(); itr != frame_numbers.rend(); ++itr)
148 total_bytes += frames[*itr]->GetBytes();
157 Remove(frame_number, frame_number);
164 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
165 int64_t removed_bytes = 0;
168 std::deque<int64_t>::iterator itr;
169 for(itr = frame_numbers.begin(); itr != frame_numbers.end();)
171 if (*itr >= start_frame_number && *itr <= end_frame_number)
174 itr = frame_numbers.erase(itr);
180 std::vector<int64_t>::iterator itr_ordered;
183 if (*itr_ordered >= start_frame_number && *itr_ordered <= end_frame_number)
186 if (frames.count(*itr_ordered))
187 removed_bytes += frames[*itr_ordered]->GetBytes();
190 frames.erase(*itr_ordered);
196 if (removed_bytes > 0)
198 bytes_freed_since_trim += removed_bytes;
199 if (bytes_freed_since_trim >= TRIM_THRESHOLD_BYTES)
203 bytes_freed_since_trim = 0;
215 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
218 if (frames.count(frame_number))
221 std::deque<int64_t>::iterator itr;
222 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
224 if (*itr == frame_number)
227 frame_numbers.erase(itr);
230 frame_numbers.push_front(frame_number);
241 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
244 frame_numbers.clear();
245 frame_numbers.shrink_to_fit();
249 bytes_freed_since_trim = 0;
259 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
262 return frames.size();
266 void CacheMemory::CleanUp()
272 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
277 int64_t frame_to_remove = frame_numbers.back();
308 root[
"ranges"] = ranges;
325 catch (
const std::exception& e)
328 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)");
341 if (!root[
"type"].isNull())