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 std::stringstream start_str;
96 start_str << starting_frame;
97 std::stringstream end_str;
98 end_str << ending_frame;
99 range[
"start"] = start_str.str();
100 range[
"end"] = end_str.str();
101 ranges.append(range);
104 starting_frame = frame_number;
108 ending_frame = frame_number;
116 std::stringstream start_str;
117 start_str << starting_frame;
118 std::stringstream end_str;
119 end_str << ending_frame;
120 range[
"start"] = start_str.str();
121 range[
"end"] = end_str.str();
122 ranges.append(range);
125 json_ranges = ranges.toStyledString();
128 needs_range_processing =
false;
137 int64_t frame_number = frame->number;
140 if (frames.count(frame_number))
147 frames[frame_number] = frame;
148 frame_numbers.push_front(frame_number);
149 ordered_frame_numbers.push_back(frame_number);
150 needs_range_processing =
true;
164 if (frames.count(frame_number))
166 return frames[frame_number];
170 return std::shared_ptr<Frame>();
178 std::shared_ptr<openshot::Frame> f;
181 std::deque<int64_t>::iterator itr;
182 int64_t smallest_frame = -1;
183 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
185 if (*itr < smallest_frame || smallest_frame == -1)
186 smallest_frame = *itr;
201 int64_t total_bytes = 0;
204 std::deque<int64_t>::reverse_iterator itr;
205 for(itr = frame_numbers.rbegin(); itr != frame_numbers.rend(); ++itr)
207 total_bytes += frames[*itr]->GetBytes();
216 Remove(frame_number, frame_number);
226 std::deque<int64_t>::iterator itr;
227 for(itr = frame_numbers.begin(); itr != frame_numbers.end();)
229 if (*itr >= start_frame_number && *itr <= end_frame_number)
232 itr = frame_numbers.erase(itr);
238 std::vector<int64_t>::iterator itr_ordered;
239 for(itr_ordered = ordered_frame_numbers.begin(); itr_ordered != ordered_frame_numbers.end();)
241 if (*itr_ordered >= start_frame_number && *itr_ordered <= end_frame_number)
244 frames.erase(*itr_ordered);
245 itr_ordered = ordered_frame_numbers.erase(itr_ordered);
251 needs_range_processing =
true;
261 if (frames.count(frame_number))
264 std::deque<int64_t>::iterator itr;
265 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
267 if (*itr == frame_number)
270 frame_numbers.erase(itr);
273 frame_numbers.push_front(frame_number);
287 frame_numbers.clear();
288 ordered_frame_numbers.clear();
289 needs_range_processing =
true;
299 return frames.size();
303 void CacheMemory::CleanUp()
314 int64_t frame_to_remove = frame_numbers.back();
340 std::stringstream range_version_str;
341 range_version_str << range_version;
342 root[
"version"] = range_version_str.str();
346 Json::CharReaderBuilder rbuilder;
347 Json::CharReader* reader(rbuilder.newCharReader());
350 bool success = reader->parse( json_ranges.c_str(),
351 json_ranges.c_str() + json_ranges.size(), &ranges, &errors );
355 root[
"ranges"] = ranges;
366 Json::CharReaderBuilder rbuilder;
367 Json::CharReader* reader(rbuilder.newCharReader());
370 bool success = reader->parse( value.c_str(),
371 value.c_str() + value.size(), &root, &errors );
375 throw InvalidJSON(
"JSON could not be parsed (or is invalid)");
382 catch (
const std::exception& e)
385 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)");
398 if (!root[
"type"].isNull())
juce::CriticalSection * cacheCriticalSection
Section lock for multiple threads.
void SetJsonValue(Json::Value root)
Load Json::JsonValue into this object.
Json::Value JsonValue()
Generate Json::JsonValue for this object.
std::string Json()
Get and Set JSON methods.
CacheMemory()
Default constructor, no max bytes.
void SetJson(std::string value)
Load JSON string into this object.
std::shared_ptr< openshot::Frame > GetSmallestFrame()
Get the smallest frame number.
All cache managers in libopenshot are based on this CacheBase class.
void MoveToFront(int64_t frame_number)
Move frame to front of queue (so it lasts longer)
std::shared_ptr< openshot::Frame > GetFrame(int64_t frame_number)
Get a frame from the cache.
virtual Json::Value JsonValue()=0
Generate Json::JsonValue for this object.
void Clear()
Clear the cache of all frames.
int64_t Count()
Count the frames in the queue.
int64_t GetBytes()
Gets the maximum bytes value.
std::string cache_type
This is a friendly type name of the derived cache instance.
This namespace is the default namespace for all code in the openshot library.
Exception for invalid JSON.
void Add(std::shared_ptr< openshot::Frame > frame)
Add a Frame to the cache.
void Remove(int64_t frame_number)
Remove a specific frame.
int64_t max_bytes
This is the max number of bytes to cache (0 = no limit)
virtual void SetJsonValue(Json::Value root)=0
Load Json::JsonValue into this object.