28 #include "../include/Cache.h" 34 Cache::Cache() : max_bytes(0) {
36 cacheCriticalSection =
new CriticalSection();
42 cacheCriticalSection =
new CriticalSection();
49 frame_numbers.clear();
52 delete cacheCriticalSection;
53 cacheCriticalSection = NULL;
57 void Cache::Add(
long int frame_number, tr1::shared_ptr<Frame> frame)
60 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
63 if (frames.count(frame_number))
70 frames[frame_number] = frame;
71 frame_numbers.push_front(frame_number);
82 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
85 if (frames.count(frame_number))
87 return frames[frame_number];
91 return tr1::shared_ptr<Frame>();
98 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
101 deque<long int> copy_frame_numbers;
104 deque<long int>::iterator itr;
105 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
106 copy_frame_numbers.push_back(*itr);
108 return copy_frame_numbers;
115 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
116 tr1::shared_ptr<openshot::Frame> f;
119 deque<long int>::iterator itr;
120 long int smallest_frame = -1;
121 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
123 if (*itr < smallest_frame || smallest_frame == -1)
124 smallest_frame = *itr;
137 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
139 int64 total_bytes = 0;
142 deque<long int>::reverse_iterator itr;
143 for(itr = frame_numbers.rbegin(); itr != frame_numbers.rend(); ++itr)
145 total_bytes += frames[*itr]->GetBytes();
155 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
158 deque<long int>::iterator itr;
159 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
161 if (*itr == frame_number)
164 frame_numbers.erase(itr);
170 frames.erase(frame_number);
177 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
183 if (frames.count(frame_number))
186 deque<long int>::iterator itr;
187 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
189 if (*itr == frame_number)
192 frame_numbers.erase(itr);
195 frame_numbers.push_front(frame_number);
206 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
209 frame_numbers.clear();
216 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
219 return frames.size();
223 void Cache::CleanUp()
226 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
231 while (
GetBytes() > max_bytes && frame_numbers.size() > 20)
234 long int frame_to_remove = frame_numbers.back();
245 cout <<
"----- Cache List (" << frames.size() <<
") ------" << endl;
246 deque<long int>::iterator itr;
249 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
251 cout <<
" " << i <<
") --- Frame " << *itr << endl;
260 int64 bytes = number_of_frames * (height * width * 4 + (sample_rate * channels * 4));
void SetMaxBytes(int64 number_of_bytes)
Set maximum bytes to a different amount.
void Add(long int frame_number, tr1::shared_ptr< Frame > frame)
Add a Frame to the cache.
void Remove(long int frame_number)
Remove a specific frame.
deque< long int > GetFrameNumbers()
Return a deque of all frame numbers in this queue (returns just a copy of the data) ...
void SetMaxBytesFromInfo(long int number_of_frames, int width, int height, int sample_rate, int channels)
Set maximum bytes to a different amount based on a ReaderInfo struct.
int64 GetBytes()
Gets the maximum bytes value.
tr1::shared_ptr< Frame > GetSmallestFrame()
Get the smallest frame number.
Cache()
Default constructor, no max bytes.
tr1::shared_ptr< Frame > GetFrame(long int frame_number)
Get a frame from the cache.
void Clear()
Clear the cache of all frames.
This namespace is the default namespace for all code in the openshot library.
void Display()
Display a list of cached frame numbers.
void MoveToFront(long int frame_number)
Move frame to front of queue (so it lasts longer)
long int Count()
Count the frames in the queue.