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);
74 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
76 if (frames.count(frame_number) > 0) {
87 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
90 if (frames.count(frame_number))
92 return frames[frame_number];
96 return std::shared_ptr<Frame>();
103 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
105 std::vector<std::shared_ptr<openshot::Frame>> all_frames;
106 std::vector<int64_t>::iterator itr_ordered;
109 int64_t frame_number = *itr_ordered;
110 all_frames.push_back(
GetFrame(frame_number));
120 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
123 std::deque<int64_t>::iterator itr;
124 int64_t smallest_frame = -1;
125 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
127 if (*itr < smallest_frame || smallest_frame == -1)
128 smallest_frame = *itr;
132 if (smallest_frame != -1) {
133 return frames[smallest_frame];
143 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
145 int64_t total_bytes = 0;
148 std::deque<int64_t>::reverse_iterator itr;
149 for(itr = frame_numbers.rbegin(); itr != frame_numbers.rend(); ++itr)
151 total_bytes += frames[*itr]->GetBytes();
160 Remove(frame_number, frame_number);
167 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
169 std::deque<int64_t>::iterator itr;
170 for(itr = frame_numbers.begin(); itr != frame_numbers.end();)
172 if (*itr >= start_frame_number && *itr <= end_frame_number)
175 itr = frame_numbers.erase(itr);
181 std::vector<int64_t>::iterator itr_ordered;
184 if (*itr_ordered >= start_frame_number && *itr_ordered <= end_frame_number)
187 frames.erase(*itr_ordered);
201 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
204 if (frames.count(frame_number))
207 std::deque<int64_t>::iterator itr;
208 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
210 if (*itr == frame_number)
213 frame_numbers.erase(itr);
216 frame_numbers.push_front(frame_number);
227 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
230 frame_numbers.clear();
231 frame_numbers.shrink_to_fit();
243 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
246 return frames.size();
250 void CacheMemory::CleanUp()
256 const std::lock_guard<std::recursive_mutex> lock(*
cacheMutex);
261 int64_t frame_to_remove = frame_numbers.back();
292 root[
"ranges"] = ranges;
309 catch (
const std::exception& e)
312 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)");
325 if (!root[
"type"].isNull())