3 #include "framecache.h"
13 FrameCacheItem::FrameCacheItem()
18 frame_rate = (double)30000.0 / 1001;
21 FrameCacheItem::~FrameCacheItem()
26 int FrameCacheItem::get_size()
28 if(data) return data->get_data_size() + (path ? strlen(path) : 0);
46 FrameCache::FrameCache()
51 FrameCache::~FrameCache()
56 // Returns 1 if frame exists in cache and copies it to the frame argument.
57 int FrameCache::get_frame(VFrame *frame,
61 lock->lock("FrameCache::get_frame");
62 FrameCacheItem *result = 0;
64 if(frame_exists(frame,
71 frame->copy_from(result->data);
72 frame->copy_stacks(result->data);
74 result->age = get_age();
83 VFrame* FrameCache::get_frame_ptr(int64_t position,
89 lock->lock("FrameCache::get_frame_ptr");
90 FrameCacheItem *result = 0;
91 if(frame_exists(position,
98 result->age = get_age();
107 // Puts frame in cache if enough space exists and the frame doesn't already
109 void FrameCache::put_frame(VFrame *frame,
114 lock->lock("FrameCache::put_frame");
115 FrameCacheItem *item = 0;
116 if(frame_exists(frame,
121 item->age = get_age();
127 item = new FrameCacheItem;
131 item->data = new VFrame(*frame);
138 item->position = position;
139 item->frame_rate = frame_rate;
140 item->age = get_age();
149 int FrameCache::frame_exists(VFrame *format,
152 FrameCacheItem **item_return)
154 FrameCacheItem *item = (FrameCacheItem*)get_item(position);
155 while(item && item->position == position)
157 if(EQUIV(item->frame_rate, frame_rate) &&
158 format->equivalent(item->data, 1))
164 item = (FrameCacheItem*)item->next;
169 int FrameCache::frame_exists(int64_t position,
174 FrameCacheItem **item_return)
176 FrameCacheItem *item = (FrameCacheItem*)get_item(position);
177 while(item && item->position == position)
179 if(EQUIV(item->frame_rate, frame_rate) &&
180 color_model == item->data->get_color_model() &&
181 w == item->data->get_w() &&
182 h == item->data->get_h())
188 item = (FrameCacheItem*)item->next;
194 void FrameCache::dump()
196 // lock->lock("FrameCache::dump");
197 // printf("FrameCache::dump 1 %d\n", items.total);
198 // for(int i = 0; i < items.total; i++)
200 // FrameCacheItem *item = (FrameCacheItem*)items.values[i];
201 // printf(" position=%lld frame_rate=%f age=%d size=%d\n",
205 // item->data->get_data_size());