00001 #include "asset.h"
00002 #include "bcsignals.h"
00003 #include "clip.h"
00004 #include "framecache.h"
00005 #include "mutex.h"
00006 #include "vframe.h"
00007
00008
00009 #include <math.h>
00010 #include <string.h>
00011 #include <unistd.h>
00012
00013
00014
00015 FrameCacheItem::FrameCacheItem()
00016 : CacheItemBase()
00017 {
00018 data = 0;
00019 position = 0;
00020 frame_rate = (double)30000.0 / 1001;
00021 }
00022
00023 FrameCacheItem::~FrameCacheItem()
00024 {
00025 delete data;
00026 }
00027
00028 int FrameCacheItem::get_size()
00029 {
00030 if(data) return data->get_data_size() + (path ? strlen(path) : 0);
00031 return 0;
00032 }
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 FrameCache::FrameCache()
00049 : CacheBase()
00050 {
00051 }
00052
00053 FrameCache::~FrameCache()
00054 {
00055 }
00056
00057
00058
00059 int FrameCache::get_frame(VFrame *frame,
00060 int64_t position,
00061 int layer,
00062 double frame_rate,
00063 int asset_id)
00064 {
00065 lock->lock("FrameCache::get_frame");
00066 FrameCacheItem *result = 0;
00067
00068 if(frame_exists(frame,
00069 position,
00070 layer,
00071 frame_rate,
00072 &result,
00073 asset_id))
00074 {
00075 if(result->data)
00076 {
00077 frame->copy_from(result->data);
00078 frame->copy_stacks(result->data);
00079 }
00080 result->age = get_age();
00081 }
00082
00083 lock->unlock();
00084 if(result) return 1;
00085 return 0;
00086 }
00087
00088
00089 VFrame* FrameCache::get_frame_ptr(int64_t position,
00090 int layer,
00091 double frame_rate,
00092 int color_model,
00093 int w,
00094 int h,
00095 int asset_id)
00096 {
00097 lock->lock("FrameCache::get_frame_ptr");
00098 FrameCacheItem *result = 0;
00099 if(frame_exists(position,
00100 layer,
00101 frame_rate,
00102 color_model,
00103 w,
00104 h,
00105 &result,
00106 asset_id))
00107 {
00108 result->age = get_age();
00109 return result->data;
00110 }
00111
00112
00113 lock->unlock();
00114 return 0;
00115 }
00116
00117
00118
00119 void FrameCache::put_frame(VFrame *frame,
00120 int64_t position,
00121 int layer,
00122 double frame_rate,
00123 int use_copy,
00124 Asset *asset)
00125 {
00126 lock->lock("FrameCache::put_frame");
00127 FrameCacheItem *item = 0;
00128 if(frame_exists(frame,
00129 position,
00130 layer,
00131 frame_rate,
00132 &item,
00133 asset ? asset->id : -1))
00134 {
00135 item->age = get_age();
00136 lock->unlock();
00137 return;
00138 }
00139
00140
00141 item = new FrameCacheItem;
00142
00143 if(use_copy)
00144 {
00145 item->data = new VFrame(*frame);
00146 }
00147 else
00148 {
00149 item->data = frame;
00150 }
00151
00152
00153 item->position = position;
00154 item->layer = layer;
00155 item->frame_rate = frame_rate;
00156 if(asset)
00157 {
00158 item->asset_id = asset->id;
00159 item->path = strdup(asset->path);
00160 }
00161 else
00162 {
00163 item->asset_id = -1;
00164 }
00165 item->age = get_age();
00166
00167 put_item(item);
00168 lock->unlock();
00169 }
00170
00171
00172
00173
00174 int FrameCache::frame_exists(VFrame *format,
00175 int64_t position,
00176 int layer,
00177 double frame_rate,
00178 FrameCacheItem **item_return,
00179 int asset_id)
00180 {
00181 FrameCacheItem *item = (FrameCacheItem*)get_item(position);
00182 while(item && item->position == position)
00183 {
00184 if(EQUIV(item->frame_rate, frame_rate) &&
00185 layer == item->layer &&
00186 format->equivalent(item->data, 1) &&
00187 (asset_id == -1 || item->asset_id == -1 || asset_id == item->asset_id))
00188 {
00189 *item_return = item;
00190 return 1;
00191 }
00192 else
00193 item = (FrameCacheItem*)item->next;
00194 }
00195 return 0;
00196 }
00197
00198 int FrameCache::frame_exists(int64_t position,
00199 int layer,
00200 double frame_rate,
00201 int color_model,
00202 int w,
00203 int h,
00204 FrameCacheItem **item_return,
00205 int asset_id)
00206 {
00207 FrameCacheItem *item = (FrameCacheItem*)get_item(position);
00208 while(item && item->position == position)
00209 {
00210 if(EQUIV(item->frame_rate, frame_rate) &&
00211 layer == item->layer &&
00212 color_model == item->data->get_color_model() &&
00213 w == item->data->get_w() &&
00214 h == item->data->get_h() &&
00215 (asset_id == -1 || item->asset_id == -1 || asset_id == item->asset_id))
00216 {
00217 *item_return = item;
00218 return 1;
00219 }
00220 else
00221 item = (FrameCacheItem*)item->next;
00222 }
00223 return 0;
00224 }
00225
00226
00227 void FrameCache::dump()
00228 {
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 }
00242
00243
00244
00245