28 #include "../include/Cache.h"
31 using namespace openshot;
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)
147 total_bytes += frames[*itr]->GetBytes();
157 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
160 deque<long int>::iterator itr;
161 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
163 if (*itr == frame_number)
166 frame_numbers.erase(itr);
172 frames.erase(frame_number);
179 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
182 if (frames.count(frame_number))
185 deque<long int>::iterator itr;
186 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
188 if (*itr == frame_number)
191 frame_numbers.erase(itr);
194 frame_numbers.push_front(frame_number);
205 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
208 frame_numbers.clear();
215 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
218 return frames.size();
222 void Cache::CleanUp()
225 const GenericScopedLock<CriticalSection> lock(*cacheCriticalSection);
230 while (
GetBytes() > max_bytes && frame_numbers.size() > 20)
233 long int frame_to_remove = frame_numbers.back();
244 cout <<
"----- Cache List (" << frames.size() <<
") ------" << endl;
245 deque<long int>::iterator itr;
248 for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr)
250 cout <<
" " << i <<
") --- Frame " << *itr << endl;
259 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.
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.