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<int64_t>::iterator itr_ordered;
80 int64_t starting_frame = *ordered_frame_numbers.begin();
81 int64_t ending_frame = *ordered_frame_numbers.begin();
84 for (itr_ordered = ordered_frame_numbers.begin(); itr_ordered != ordered_frame_numbers.end(); ++itr_ordered) {
85 int64_t 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 int64_t 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<int64_t>::iterator itr;
179 int64_t 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 int64_t total_bytes = 0;
201 deque<int64_t>::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<int64_t>::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<int64_t>::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<int64_t>::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 int64_t 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 SetJsonValue(Json::Value root)
Load Json::JsonValue into this object.
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.
std::shared_ptr< 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< 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.
This namespace is the default namespace for all code in the openshot library.
Exception for invalid JSON.
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)
string Json()
Get and Set JSON methods.
virtual void SetJsonValue(Json::Value root)=0
Load Json::JsonValue into this object.