#include "../libzmpeg3.h" zcache_t:: ~cache_t() { clear(); } void zcache_t:: clear() { if( frames ) { for( int i=0; iy ) delete [] frame->y; if( frame->u ) delete [] frame->u; if( frame->v ) delete [] frame->v; } delete [] frames; total = 0; allocation = 0; frames = 0; seq = 0; } } int zcache_t:: extend_cache() { if( total >= MAX_CACHE_FRAMES ) { int i = 0, n = 0; uint32_t vtim = frames[0].age; while( ++i < total ) { if( frames[i].age < vtim ) { n = i; vtim = frames[i].age; } } frames[n].age = seq++; return n; } if( total >= allocation ) { int new_allocation = ZMAX(allocation*2,8); cacheframe_t *new_frames = new cacheframe_t[new_allocation]; for( int i=0; itotal, frame->y, frame->u, frame->v); if( zy ) { if( zy_size > frame->y_alloc ) { delete [] frame->y; frame->y = new uint8_t[frame->y_alloc=zy_size]; } memcpy(frame->y, zy, frame->y_size=zy_size); } if( zu ) { if( zu_size > frame->u_alloc ) { delete [] frame->u; frame->u = new uint8_t[frame->u_alloc=zu_size]; } memcpy(frame->u, zu, frame->u_size=zu_size); } if( zv ) { if( zv_size > frame->v_alloc ) { delete [] frame->v; frame->v = new uint8_t[frame->v_alloc=zv_size]; } memcpy(frame->v, zv, frame->v_size=zv_size); } frame->frame_number = zframe_number; } } int zcache_t:: get_frame(int64_t zframe_number, uint8_t **zy, uint8_t **zu, uint8_t **zv) { for( int i=0; iframe_number == zframe_number ) { frame->age = seq++; *zy = frame->y; *zu = frame->u; *zv = frame->v; //zmsgs("hit %d\n",zframe_number); return 1; } } clear(); //zmsgs("missed %d\n",zframe_number); return 0; } int zcache_t:: has_frame(int64_t zframe_number) { for( int i=0; iy_alloc + frame->u_alloc + frame->v_alloc; } return result; }