28 #include "../include/CacheMemory.h" 38 needs_range_processing =
false;
46 needs_range_processing =
false;
53 frame_numbers.clear();
54 ordered_frame_numbers.clear();
63 void CacheMemory::CalculateRanges() {
65 if (needs_range_processing) {
71 std::sort(ordered_frame_numbers.begin(), ordered_frame_numbers.end());
74 Json::Value ranges = Json::Value(Json::arrayValue);
79 vector<long int>::iterator itr_ordered;
80 long int starting_frame = *ordered_frame_numbers.begin();
81 long int ending_frame = *ordered_frame_numbers.begin();
84 for (itr_ordered = ordered_frame_numbers.begin(); itr_ordered != ordered_frame_numbers.end(); ++itr_ordered) {
85 long int frame_number = *itr_ordered;
86 if (frame_number - ending_frame > 1) {
92 stringstream start_str;
93 start_str << starting_frame;
95 end_str << ending_frame;
96 range[
"start"] = start_str.str();
97 range[
"end"] = end_str.str();
101 starting_frame = frame_number;
105 ending_frame = frame_number;
113 stringstream start_str;
114 start_str << starting_frame;
115 stringstream end_str;
116 end_str << ending_frame;
117 range[
"start"] = start_str.str();
118 range[
"end"] = end_str.str();
119 ranges.append(range);
122 json_ranges = ranges.toStyledString();
125 needs_range_processing =
false;
134 long int frame_number = frame->number;
137 if (frames.count(frame_number))
144 frames[frame_number] = frame;
145 frame_numbers.push_front(frame_number);
146 ordered_frame_numbers.push_back(frame_number);
147 needs_range_processing =
true;
161 if (frames.count(frame_number))
163 return frames[frame_number];
167 return std::shared_ptr<Frame>();
175 std::shared_ptr<openshot::Frame> f;
178 deque<long int>::iterator itr;
179 long int smallest_frame = -1;
180 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
182 if (*itr < smallest_frame || smallest_frame == -1)
183 smallest_frame = *itr;
198 long long int total_bytes = 0;
201 deque<long int>::reverse_iterator itr;
202 for(itr = frame_numbers.rbegin(); itr != frame_numbers.rend(); ++itr)
204 total_bytes += frames[*itr]->GetBytes();
213 Remove(frame_number, frame_number);
223 deque<long int>::iterator itr;
224 for(itr = frame_numbers.begin(); itr != frame_numbers.end();)
226 if (*itr >= start_frame_number && *itr <= end_frame_number)
229 itr = frame_numbers.erase(itr);
235 vector<long int>::iterator itr_ordered;
236 for(itr_ordered = ordered_frame_numbers.begin(); itr_ordered != ordered_frame_numbers.end();)
238 if (*itr_ordered >= start_frame_number && *itr_ordered <= end_frame_number)
241 frames.erase(*itr_ordered);
242 itr_ordered = ordered_frame_numbers.erase(itr_ordered);
248 needs_range_processing =
true;
258 if (frames.count(frame_number))
261 deque<long int>::iterator itr;
262 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
264 if (*itr == frame_number)
267 frame_numbers.erase(itr);
270 frame_numbers.push_front(frame_number);
284 frame_numbers.clear();
285 ordered_frame_numbers.clear();
286 needs_range_processing =
true;
296 return frames.size();
300 void CacheMemory::CleanUp()
311 long int frame_to_remove = frame_numbers.back();
337 stringstream range_version_str;
338 range_version_str << range_version;
339 root[
"version"] = range_version_str.str();
344 bool success = reader.parse( json_ranges, ranges );
346 root[
"ranges"] = ranges;
358 bool success = reader.parse( value, root );
361 throw InvalidJSON(
"JSON could not be parsed (or is invalid)",
"");
371 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)",
"");
384 if (!root[
"type"].isNull())
CriticalSection * cacheCriticalSection
Section lock for multiple threads.
string cache_type
This is a friendly type name of the derived cache instance.
void MoveToFront(long int frame_number)
Move frame to front of queue (so it lasts longer)
void Remove(long int frame_number)
Remove a specific frame.
void SetJsonValue(Json::Value root)
Load Json::JsonValue into this object.
long long int max_bytes
This is the max number of bytes to cache (0 = no limit)
Json::Value JsonValue()
Generate Json::JsonValue for this object.
void Add(std::shared_ptr< Frame > frame)
Add a Frame to the cache.
CacheMemory()
Default constructor, no max bytes.
void SetJson(string value)
Load JSON string into this object.
Exception when a reader is closed, and a frame is requested.
long long int GetBytes()
Gets the maximum bytes value.
std::shared_ptr< Frame > GetSmallestFrame()
Get the smallest frame number.
Exception for files that can not be found or opened.
All cache managers in libopenshot are based on this CacheBase class.
virtual Json::Value JsonValue()=0
Generate Json::JsonValue for this object.
void Clear()
Clear the cache of all frames.
This namespace is the default namespace for all code in the openshot library.
Exception for invalid JSON.
long int Count()
Count the frames in the queue.
string Json()
Get and Set JSON methods.
virtual void SetJsonValue(Json::Value root)=0
Load Json::JsonValue into this object.
std::shared_ptr< Frame > GetFrame(long int frame_number)
Get a frame from the cache.