X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Flibzmpeg3%2Fvideo%2Fcache.C;fp=cinelerra-5.1%2Flibzmpeg3%2Fvideo%2Fcache.C;h=2a5857cbd679dfec80afe7c166938a13a2a63ae3;hp=0000000000000000000000000000000000000000;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b diff --git a/cinelerra-5.1/libzmpeg3/video/cache.C b/cinelerra-5.1/libzmpeg3/video/cache.C new file mode 100644 index 00000000..2a5857cb --- /dev/null +++ b/cinelerra-5.1/libzmpeg3/video/cache.C @@ -0,0 +1,139 @@ +#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; +} +