const AegiVideoFrame VideoProviderCache::GetFrame(int n) { size_t total_size = 0; // See if frame is cached for (auto cur = cache.begin(); cur != cache.end(); ++cur) { if (cur->frame_number == n) { cache.push_front(*cur); cache.erase(cur); return cache.front(); } total_size += cur->memSize; } // Not cached, retrieve it const AegiVideoFrame frame = master->GetFrame(n); // Cache full, use oldest frame if (total_size >= max_cache_size) { cache.push_front(cache.back()); cache.pop_back(); } // Cache not full, insert new one else cache.push_front(CachedFrame()); // Cache cache.front().frame_number = n; cache.front().CopyFrom(frame); return cache.front(); }
/// @brief Add to cache /// @param n /// @param frame void VideoProviderCache::Cache(int n,const AegiVideoFrame frame) { // Cache full, use frame at front if (GetCurCacheSize() >= cacheMax) { cache.push_back(cache.front()); cache.pop_front(); } // Cache not full, insert new one else { cache.push_back(CachedFrame()); } // Cache cache.back().n = n; cache.back().frame.CopyFrom(frame); }