#ifndef OPENSHOT_CACHE_H #define OPENSHOT_CACHE_H /** * \file * \brief Header file for Cache class * \author Copyright (c) 2011 Jonathan Thomas */ #include #include #include "Frame.h" #include "Exceptions.h" /// This namespace is the default namespace for all code in the openshot library. namespace openshot { /** * \brief This class is a cache manager for Frame objects. It is used by FileReaders (such as FFmpegReader) to cache * recently accessed frames. * * Due to the high cost of decoding streams, once a frame is decoded, converted to RGB, and a Frame object is created, * it critical to keep these Frames cached for performance reasons. However, the larger the cache, the more memory * is required. You can set the max number of previous frames (relative to the current frame) to cache. Frames that * come after the current frame are allowed to increase as much as needed (a requirement of the file readers). A call * to GetFrame() sets the current frame of the cache. */ class Cache { private: int max_frames; ///< This is the max number of "previous" frames to cache map frames; ///< This map holds the frame number and Frame objects deque frame_numbers; ///< This queue holds a sequential list of cached Frame numbers int current_frame; ///< This is the last requested frame (used to dynamically adjust the max_frames) /// Clean up cached frames that exceed the max number of previous frames void CleanUp(); public: /// Default constructor, max previous frames to cache is 20 Cache(); /// Constructor that sets the max previous frames to cache Cache(int max_frames); /// Add a Frame to the cache void Add(int frame_number, Frame frame); /// Check for the existence of a frame in the cache bool Exists(int frame_number); /// Get a frame from the cache Frame GetFrame(int frame_number); /// Get the smallest frame number Frame GetSmallestFrame(); /// Remove a specific frame void Remove(int frame_number); /// Clear the cache of all frames void Clear(); /// Display a list of cached frame numbers void Display(); /// Display the list of cache and clear the cache (mainly for debugging reasons) void DisplayAndClear(); /// Count the frames in the queue int Count(); /// Set current frame number (used to determine which previous frames to delete) void SetCurrentFrame(int frame_number) { current_frame = frame_number; CleanUp(); }; /// Get the current frame number (used to determine which previous frames to delete) int GetCurrentFrame() { return current_frame; }; /// Set maximum frames to a different amount void SetMaxFrames(int number_of_frames) { max_frames = number_of_frames; }; /// Gets the maximum frames value int GetMaxFrames() { return max_frames; }; }; } #endif