|
OpenShot Library | libopenshot
0.5.0
|
Go to the documentation of this file.
27 : Thread(
"video-cache")
32 , preroll_on_next_fill(false)
33 , requested_display_frame(1)
34 , current_display_frame(1)
35 , cached_frame_count(0)
37 , timeline_max_frame(0)
39 , force_directional_cache(false)
40 , last_cached_index(0)
85 int64_t bytes =
static_cast<int64_t
>(width) * height *
sizeof(
char) * 4;
87 bytes += ((sample_rate * channels) / fps) *
sizeof(float);
96 startThread(Priority::high);
97 return isThreadRunning();
103 stopThread(timeoutMs);
104 return !isThreadRunning();
114 if (cache && !cache->
Contains(new_position))
136 Seek(new_position,
false);
153 int64_t timeline_end,
154 int64_t preroll_frames)
156 int64_t preroll_start = playhead;
157 if (preroll_frames > 0) {
159 preroll_start = std::max<int64_t>(1, playhead - preroll_frames);
162 preroll_start = std::min<int64_t>(timeline_end, playhead + preroll_frames);
175 if (min_frames < 0) {
178 if (max_frames > 0 && min_frames > max_frames) {
179 min_frames = max_frames;
188 if (paused && !cache->
Contains(playhead)) {
201 int64_t timeline_end,
202 int64_t& window_begin,
203 int64_t& window_end)
const
207 window_begin = playhead;
208 window_end = playhead + ahead_count;
212 window_begin = playhead - ahead_count;
213 window_end = playhead;
216 window_begin = std::max<int64_t>(window_begin, 1);
217 window_end = std::min<int64_t>(window_end, timeline_end);
221 int64_t window_begin,
226 bool window_full =
true;
230 while ((dir > 0 && next_frame <= window_end) ||
231 (dir < 0 && next_frame >= window_begin))
233 if (threadShouldExit()) {
245 cache->
Add(framePtr);
254 cache->
Touch(next_frame);
266 using micro_sec = std::chrono::microseconds;
267 using double_micro_sec = std::chrono::duration<double, micro_sec::period>;
269 while (!threadShouldExit()) {
277 std::this_thread::sleep_for(double_micro_sec(50000));
287 bool paused = (
speed == 0);
307 int64_t capacity = 0;
308 if (max_bytes > 0 && bytes_per_frame > 0) {
309 capacity = max_bytes / bytes_per_frame;
327 else if (!paused && capacity >= 1) {
331 int64_t window_begin, window_end;
341 bool outside_window =
344 if (outside_window) {
351 std::this_thread::sleep_for(double_micro_sec(50000));
354 int64_t ahead_count =
static_cast<int64_t
>(capacity *
356 int64_t window_size = ahead_count + 1;
357 if (window_size < 1) {
360 int64_t ready_target = window_size - 1;
361 if (ready_target < 0) {
374 int64_t window_begin, window_end;
386 if (paused && window_full) {
387 cache->
Touch(playhead);
391 int64_t sleep_us =
static_cast<int64_t
>(
394 std::this_thread::sleep_for(double_micro_sec(sleep_us));
Header file for global Settings class.
int sample_rate
The number of audio samples per second (44100 is a common sample rate)
VideoCacheThread()
Constructor: initializes member variables and assumes forward direction on first launch.
float ToFloat()
Return this fraction as a float (i.e. 1/2 = 0.5)
float VIDEO_CACHE_PERCENT_AHEAD
Percentage of cache in front of the playhead (0.0 to 1.0)
int preview_width
Optional preview width of timeline image. If your preview window is smaller than the timeline,...
bool StartThread()
Start the cache thread at high priority. Returns true if it’s actually running.
virtual std::shared_ptr< openshot::Frame > GetFrame(int64_t number)=0
bool prefetchWindow(CacheBase *cache, int64_t window_begin, int64_t window_end, int dir, ReaderBase *reader)
Prefetch all missing frames in [window_begin ... window_end] or [window_end ... window_begin].
This namespace is the default namespace for all code in the openshot library.
int preview_height
Optional preview width of timeline image. If your preview window is smaller than the timeline,...
virtual void Add(std::shared_ptr< openshot::Frame > frame)=0
Add a Frame to the cache.
int64_t min_frames_ahead
Minimum number of frames considered “ready” (pre-roll).
int computeDirection() const
ReaderBase * reader
The source reader (e.g., Timeline, FFmpegReader).
openshot::ReaderInfo info
Information about the current media file.
This class is contains settings used by libopenshot (and can be safely toggled at any point)
Header file for Timeline class.
void handleUserSeek(int64_t playhead, int dir)
If userSeeked is true, reset last_cached_index just behind the playhead.
void ClearAllCache(bool deep=false)
int64_t computePrerollFrames(const Settings *settings) const
Compute preroll frame count from settings.
bool ENABLE_PLAYBACK_CACHING
Enable/Disable the cache thread to pre-fetch and cache video frames before we need them.
int width
The width of the video (in pixesl)
All cache managers in libopenshot are based on this CacheBase class.
int VIDEO_CACHE_MAX_FRAMES
Max number of frames (when paused) to cache for playback.
Header file for CacheBase class.
Exception for frames that are out of bounds.
~VideoCacheThread() override
int height
The height of the video (in pixels)
int VIDEO_CACHE_MAX_PREROLL_FRAMES
Max number of frames (ahead of playhead) to cache during playback.
int last_speed
Last non-zero speed (for tracking).
int VIDEO_CACHE_MIN_PREROLL_FRAMES
Minimum number of frames to cache before playback begins.
This class represents a timeline.
void setSpeed(int new_speed)
Set playback speed/direction. Positive = forward, negative = rewind, zero = pause.
bool userSeeked
True if Seek(..., true) was called (forces a cache reset).
int speed
Current playback speed (0=paused, >0 forward, <0 backward).
static Settings * Instance()
Create or get an instance of this logger singleton (invoke the class with this method)
virtual void Touch(int64_t frame_number)=0
Move frame to front of queue (so it lasts longer)
Header file for Frame class.
void run() override
Thread entry point: loops until threadShouldExit() is true.
virtual int64_t Count()=0
Count the frames in the queue.
int64_t last_cached_index
Index of the most recently cached frame.
Header file for VideoCacheThread class.
int64_t getBytes(int width, int height, int sample_rate, int channels, float fps)
Estimate memory usage for a single frame (video + audio).
bool clearCacheIfPaused(int64_t playhead, bool paused, CacheBase *cache)
When paused and playhead is outside current cache, clear all frames.
int last_dir
Last direction sign (+1 forward, –1 backward).
int64_t cached_frame_count
Estimated count of frames currently stored in cache.
bool StopThread(int timeoutMs=0)
Stop the cache thread (wait up to timeoutMs ms). Returns true if it stopped.
int64_t GetMaxBytes()
Gets the maximum bytes value.
openshot::Fraction fps
Frames per second, as a fraction (i.e. 24/1 = 24 fps)
virtual bool Contains(int64_t frame_number)=0
Check if frame is already contained in cache.
This abstract class is the base class, used by all readers in libopenshot.
int64_t GetMaxFrame()
Look up the end frame number of the latest element on the timeline.
void computeWindowBounds(int64_t playhead, int dir, int64_t ahead_count, int64_t timeline_end, int64_t &window_begin, int64_t &window_end) const
Compute the “window” of frames to cache around playhead.
void Seek(int64_t new_position)
Seek to a specific frame (no preroll).
void handleUserSeekWithPreroll(int64_t playhead, int dir, int64_t timeline_end, int64_t preroll_frames)
Reset last_cached_index to start caching with a directional preroll offset.
int64_t requested_display_frame
Frame index the user requested.
int channels
The number of audio channels used in the audio stream.
virtual openshot::CacheBase * GetCache()=0
Get the cache object used by this reader (note: not all readers use cache)
Header file for all Exception classes.
bool preroll_on_next_fill
True if next cache rebuild should include preroll offset.