31 #include "../include/CacheMemory.h"
41 needs_range_processing =
false;
49 needs_range_processing =
false;
56 frame_numbers.clear();
57 ordered_frame_numbers.clear();
66 void CacheMemory::CalculateRanges() {
68 if (needs_range_processing) {
74 std::sort(ordered_frame_numbers.begin(), ordered_frame_numbers.end());
77 Json::Value ranges = Json::Value(Json::arrayValue);
82 std::vector<int64_t>::iterator itr_ordered;
83 int64_t starting_frame = *ordered_frame_numbers.begin();
84 int64_t ending_frame = *ordered_frame_numbers.begin();
87 for (itr_ordered = ordered_frame_numbers.begin(); itr_ordered != ordered_frame_numbers.end(); ++itr_ordered) {
88 int64_t frame_number = *itr_ordered;
89 if (frame_number - ending_frame > 1) {
95 range[
"start"] = std::to_string(starting_frame);
96 range[
"end"] = std::to_string(ending_frame);
100 starting_frame = frame_number;
104 ending_frame = frame_number;
112 range[
"start"] = std::to_string(starting_frame);
113 range[
"end"] = std::to_string(ending_frame);
114 ranges.append(range);
117 json_ranges = ranges.toStyledString();
120 needs_range_processing =
false;
129 int64_t frame_number = frame->
number;
132 if (frames.count(frame_number))
139 frames[frame_number] = frame;
140 frame_numbers.push_front(frame_number);
141 ordered_frame_numbers.push_back(frame_number);
142 needs_range_processing =
true;
156 if (frames.count(frame_number))
158 return frames[frame_number];
162 return std::shared_ptr<Frame>();
170 std::shared_ptr<openshot::Frame> f;
173 std::deque<int64_t>::iterator itr;
174 int64_t smallest_frame = -1;
175 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
177 if (*itr < smallest_frame || smallest_frame == -1)
178 smallest_frame = *itr;
193 int64_t total_bytes = 0;
196 std::deque<int64_t>::reverse_iterator itr;
197 for(itr = frame_numbers.rbegin(); itr != frame_numbers.rend(); ++itr)
199 total_bytes += frames[*itr]->GetBytes();
208 Remove(frame_number, frame_number);
218 std::deque<int64_t>::iterator itr;
219 for(itr = frame_numbers.begin(); itr != frame_numbers.end();)
221 if (*itr >= start_frame_number && *itr <= end_frame_number)
224 itr = frame_numbers.erase(itr);
230 std::vector<int64_t>::iterator itr_ordered;
231 for(itr_ordered = ordered_frame_numbers.begin(); itr_ordered != ordered_frame_numbers.end();)
233 if (*itr_ordered >= start_frame_number && *itr_ordered <= end_frame_number)
236 frames.erase(*itr_ordered);
237 itr_ordered = ordered_frame_numbers.erase(itr_ordered);
243 needs_range_processing =
true;
253 if (frames.count(frame_number))
256 std::deque<int64_t>::iterator itr;
257 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
259 if (*itr == frame_number)
262 frame_numbers.erase(itr);
265 frame_numbers.push_front(frame_number);
279 frame_numbers.clear();
280 ordered_frame_numbers.clear();
281 needs_range_processing =
true;
291 return frames.size();
295 void CacheMemory::CleanUp()
306 int64_t frame_to_remove = frame_numbers.back();
332 root[
"version"] = std::to_string(range_version);
337 root[
"ranges"] = ranges;
354 catch (
const std::exception& e)
357 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)");
370 if (!root[
"type"].isNull())