OpenShot Library | libopenshot 1.1.1
Timeline.h
Go to the documentation of this file.
1
9// Copyright (c) 2008-2019 OpenShot Studios, LLC
10//
11// SPDX-License-Identifier: LGPL-3.0-or-later
12
13#ifndef OPENSHOT_TIMELINE_H
14#define OPENSHOT_TIMELINE_H
15
16#include <list>
17#include <memory>
18#include <set>
19#include <atomic>
20#include <cstdint>
21#include <utility>
22
23#include "TimelineBase.h"
24#include "ReaderBase.h"
25
26#include "Color.h"
27#include "Clip.h"
28#include "EffectBase.h"
29#include "Fraction.h"
30#include "Frame.h"
31#include "KeyFrame.h"
32#ifdef USE_OPENCV
33#include "TrackedObjectBBox.h"
34#endif
35#include "TrackedObjectBase.h"
36
37
38
39namespace openshot {
40
41 // Forward decls
42 class FrameMapper;
43 class CacheBase;
44
48 struct CompareClips {
49 bool operator()(openshot::Clip* lhs, openshot::Clip* rhs) const {
50 // Strict-weak ordering (no <=) to keep sort well-defined
51 if (lhs == rhs) return false; // irreflexive
52 if (lhs->Layer() != rhs->Layer())
53 return lhs->Layer() < rhs->Layer();
54 if (lhs->Position() != rhs->Position())
55 return lhs->Position() < rhs->Position();
56 // list::sort is stable: preserve compositing order for tied clips,
57 // including their project order when loading a saved timeline.
58 return false;
59 }
60 };
61
67 if( lhs->Layer() < rhs->Layer() ) return true;
68 if( lhs->Layer() == rhs->Layer() && lhs->Position() < rhs->Position() ) return true;
69 if( lhs->Layer() == rhs->Layer() && lhs->Position() == rhs->Position() && lhs->Order() > rhs->Order() ) return true;
70 return false;
71 }};
72
76 bool operator()(const openshot::Clip* lhs, const openshot::Clip* rhs) {
77 return (lhs->Position() + lhs->Duration()) < (rhs->Position() + rhs->Duration());
78 }};
79
83 return (lhs->Position() + lhs->Duration()) < (rhs->Position() + rhs->Duration());
84 }};
85
155 private:
156 bool is_open;
157 bool auto_map_clips;
158 std::list<openshot::Clip*> clips;
159 std::list<openshot::Clip*> closing_clips;
160 std::map<openshot::Clip*, openshot::Clip*> open_clips;
161 std::set<openshot::Clip*> allocated_clips;
162 std::list<openshot::EffectBase*> effects;
163 std::set<openshot::EffectBase*> allocated_effects;
164 openshot::CacheBase *final_cache;
165 std::set<openshot::FrameMapper*> allocated_frame_mappers;
166 bool managed_cache;
167 std::string path;
168 double max_time;
169 double min_time;
170 std::atomic<uint64_t> cache_clear_requested{0};
171 std::atomic<uint64_t> cache_clear_completed{0};
172 std::atomic<uint64_t> cache_epoch;
173
174 std::map<std::string, std::shared_ptr<openshot::TrackedObjectBase>> tracked_objects;
175
177 void add_layer(std::shared_ptr<openshot::Frame> new_frame, openshot::Clip* source_clip, int64_t clip_frame_number, bool is_top_clip, float max_volume);
178
180 std::pair<float, float> ResolveTransitionAudioGains(openshot::Clip* source_clip, int64_t timeline_frame_number, bool is_top_clip) const;
181
183 void apply_mapper_to_clip(openshot::Clip* clip);
184
185 // Apply JSON Diffs to various objects contained in this timeline
186 void apply_json_to_clips(Json::Value change);
187 void apply_json_to_effects(Json::Value change);
188 void apply_json_to_effects(Json::Value change, openshot::EffectBase* existing_effect);
189 void apply_json_to_timeline(Json::Value change);
190
192 void calculate_max_duration();
193
195 double calculate_time(int64_t number, openshot::Fraction rate);
196
203 std::vector<openshot::Clip*> find_intersecting_clips(int64_t requested_frame, int number_of_frames, bool include);
204
206 std::shared_ptr<openshot::Frame> GetOrCreateFrame(std::shared_ptr<Frame> background_frame, openshot::Clip* clip, int64_t number, openshot::TimelineInfoStruct* options);
207
209 bool isEqual(double a, double b);
210
212 void sort_clips();
213
215 void sort_effects();
216
218 void update_open_clips(openshot::Clip *clip, bool does_clip_intersect);
219
221 void BumpCacheEpoch();
222
224 void InvalidateCacheForClip(const openshot::Clip* clip);
225
226 public:
227
235 Timeline(int width, int height, openshot::Fraction fps, int sample_rate, int channels, openshot::ChannelLayout channel_layout);
236
240
248 Timeline(const std::string& projectPath, bool convert_absolute_paths);
249
250 virtual ~Timeline();
251
253 void AddTrackedObject(std::shared_ptr<openshot::TrackedObjectBase> trackedObject);
255 std::shared_ptr<openshot::TrackedObjectBase> GetTrackedObject(std::string id) const;
257 std::list<std::string> GetTrackedObjectsIds() const;
259 #ifdef USE_OPENCV
260 std::string GetTrackedObjectValues(std::string id, int64_t frame_number) const;
261 #endif
262
266
269 void AddEffect(openshot::EffectBase* effect);
270
272 std::shared_ptr<openshot::Frame> apply_effects(std::shared_ptr<openshot::Frame> frame, int64_t timeline_frame_number, int layer, TimelineInfoStruct* options);
273
275 void ApplyMapperToClips();
276
278 bool AutoMapClips() { return auto_map_clips; };
279
281 void AutoMapClips(bool auto_map) { auto_map_clips = auto_map; };
282
284 void Clear();
285
288 void ClearAllCache(bool deep=false);
289
291 std::list<openshot::Clip*> Clips() override { return clips; };
292
294 openshot::Clip* GetClip(const std::string& id);
295
297 openshot::EffectBase* GetClipEffect(const std::string& id);
298
300 openshot::EffectBase* GetEffect(const std::string& id);
301
303 double GetMaxTime();
305 int64_t GetMaxFrame();
306
308 double GetMinTime();
310 int64_t GetMinFrame();
311
313 void Close() override;
314
316 std::list<openshot::EffectBase*> Effects() { return effects; };
317
319 std::list<openshot::EffectBase*> ClipEffects() const;
320
322 openshot::CacheBase* GetCache() override { return final_cache; };
323
326 void SetCache(openshot::CacheBase* new_cache);
327
331 bool CacheRefreshPending() const { return cache_clear_requested.load() != cache_clear_completed.load(); }
332
334 uint64_t CacheEpoch() const { return cache_epoch.load(std::memory_order_relaxed); };
335
340 std::shared_ptr<openshot::Frame> GetFrame(int64_t requested_frame) override;
341
342 // Curves for the viewport
346
347 // Background color
349
351 bool IsOpen() override { return is_open; };
352
354 std::string Name() override { return "Timeline"; };
355
356 // Get and Set JSON methods
357 std::string Json() const override;
358 void SetJson(const std::string value) override;
359 Json::Value JsonValue() const override;
360 void SetJsonValue(const Json::Value root) override;
361
364 void SetMaxSize(int width, int height);
365
370 void ApplyJsonDiff(std::string value);
371
373 void Open() override;
374
378
382
385 void SortTimeline() { sort_clips(); sort_effects(); }
386 };
387
388}
389
390#endif // OPENSHOT_TIMELINE_H
Header file for Clip class.
Header file for Color class.
Header file for EffectBase class.
Header file for Fraction class.
Header file for Frame class.
Header file for the Keyframe class.
Header file for ReaderBase class.
Header file for Timeline class.
Header file for the TrackedObjectBBox class.
Header file for the TrackedObjectBase class.
All cache managers in libopenshot are based on this CacheBase class.
Definition: CacheBase.h:35
float Duration() const
Get the length of this clip (in seconds)
Definition: ClipBase.h:93
int Layer() const
Get layer of clip on timeline (lower number is covered by higher numbers)
Definition: ClipBase.h:90
float Position() const
Get position on timeline (in seconds)
Definition: ClipBase.h:89
This class represents a clip (used to arrange readers on the timeline)
Definition: Clip.h:89
This class represents a color (used on the timeline and clips)
Definition: Color.h:27
This abstract class is the base class, used by all effects in libopenshot.
Definition: EffectBase.h:57
int Order() const
Get the order that this effect should be executed.
Definition: EffectBase.h:193
This class represents a fraction.
Definition: Fraction.h:30
A Keyframe is a collection of Point instances, which is used to vary a number or property over time.
Definition: KeyFrame.h:53
This abstract class is the base class, used by all readers in libopenshot.
Definition: ReaderBase.h:76
openshot::ReaderInfo info
Information about the current media file.
Definition: ReaderBase.h:91
openshot::ClipBase * clip
Pointer to the parent clip instance (if any)
Definition: ReaderBase.h:80
This class represents a timeline (used for building generic timeline implementations)
Definition: TimelineBase.h:41
This class represents a timeline.
Definition: Timeline.h:154
void AddTrackedObject(std::shared_ptr< openshot::TrackedObjectBase > trackedObject)
Add to the tracked_objects map a pointer to a tracked object (TrackedObjectBBox)
Definition: Timeline.cpp:231
Json::Value JsonValue() const override
Generate Json::Value for this object.
Definition: Timeline.cpp:1247
std::string Name() override
Return the type name of the class.
Definition: Timeline.h:354
openshot::Keyframe viewport_scale
Curve representing the scale of the viewport (0 to 100)
Definition: Timeline.h:343
void ApplyJsonDiff(std::string value)
Apply a special formatted JSON object, which represents a change to the timeline (add,...
Definition: Timeline.cpp:1403
openshot::EffectBase * GetClipEffect(const std::string &id)
Look up a clip effect by ID.
Definition: Timeline.cpp:445
void AddClip(openshot::Clip *clip)
Add an openshot::Clip to the timeline.
Definition: Timeline.cpp:340
virtual ~Timeline()
Definition: Timeline.cpp:214
void RequestClearAllCache()
Definition: Timeline.cpp:1830
std::list< openshot::EffectBase * > ClipEffects() const
Return the list of effects on all clips.
Definition: Timeline.cpp:458
void AutoMapClips(bool auto_map)
Automatically map all clips to the timeline's framerate and samplerate.
Definition: Timeline.h:281
std::list< std::string > GetTrackedObjectsIds() const
Return the ID's of the tracked objects as a list of strings.
Definition: Timeline.cpp:266
std::string Json() const override
Generate JSON string of this object.
Definition: Timeline.cpp:1240
std::list< openshot::EffectBase * > Effects()
Return the list of effects on the timeline.
Definition: Timeline.h:316
int64_t GetMaxFrame()
Look up the end frame number of the latest element on the timeline.
Definition: Timeline.cpp:483
double GetMinTime()
Look up the position/start time of the first timeline element.
Definition: Timeline.cpp:504
std::shared_ptr< openshot::Frame > GetFrame(int64_t requested_frame) override
Definition: Timeline.cpp:980
bool AutoMapClips()
Determine if clips are automatically mapped to the timeline's framerate and samplerate.
Definition: Timeline.h:278
void ApplyMapperToClips()
Apply the timeline's framerate and samplerate to all clips.
Definition: Timeline.cpp:539
void SortTimeline()
Sort all clips and effects on timeline - which affects the internal order of clips and effects arrays...
Definition: Timeline.h:385
openshot::Color color
Background color of timeline canvas.
Definition: Timeline.h:348
std::string GetTrackedObjectValues(std::string id, int64_t frame_number) const
Return the trackedObject's properties as a JSON string.
Definition: Timeline.cpp:282
Timeline(int width, int height, openshot::Fraction fps, int sample_rate, int channels, openshot::ChannelLayout channel_layout)
Constructor for the timeline (which configures the default frame properties)
Definition: Timeline.cpp:36
std::shared_ptr< openshot::TrackedObjectBase > GetTrackedObject(std::string id) const
Return tracked object pointer by it's id.
Definition: Timeline.cpp:249
int64_t GetMinFrame()
Look up the start frame number of the first element on the timeline (first frame is 1)
Definition: Timeline.cpp:496
openshot::EffectBase * GetEffect(const std::string &id)
Look up a timeline effect by ID.
Definition: Timeline.cpp:434
void SetJsonValue(const Json::Value root) override
Load Json::Value into this object.
Definition: Timeline.cpp:1301
openshot::Clip * GetClip(const std::string &id)
Look up a single clip by ID.
Definition: Timeline.cpp:422
void ClearAllCache(bool deep=false)
Definition: Timeline.cpp:1836
void AddEffect(openshot::EffectBase *effect)
Add an effect to the timeline.
Definition: Timeline.cpp:368
bool CacheRefreshPending() const
Definition: Timeline.h:331
std::list< openshot::Clip * > Clips() override
Return a list of clips on the timeline.
Definition: Timeline.h:291
void SetCache(openshot::CacheBase *new_cache)
Definition: Timeline.cpp:1224
bool IsOpen() override
Determine if reader is open or closed.
Definition: Timeline.h:351
uint64_t CacheEpoch() const
Return the current cache invalidation epoch.
Definition: Timeline.h:334
openshot::CacheBase * GetCache() override
Get the cache object used by this reader.
Definition: Timeline.h:322
void Clear()
Clear all clips, effects, and frame mappers from timeline (and free memory)
Definition: Timeline.cpp:900
openshot::Keyframe viewport_x
Curve representing the x coordinate for the viewport.
Definition: Timeline.h:344
void RemoveClip(openshot::Clip *clip)
Remove an openshot::Clip from the timeline.
Definition: Timeline.cpp:403
void SetMaxSize(int width, int height)
Definition: Timeline.cpp:1880
double GetMaxTime()
Look up the end time of the latest timeline element.
Definition: Timeline.cpp:477
void RemoveEffect(openshot::EffectBase *effect)
Remove an effect from the timeline.
Definition: Timeline.cpp:384
std::shared_ptr< openshot::Frame > apply_effects(std::shared_ptr< openshot::Frame > frame, int64_t timeline_frame_number, int layer, TimelineInfoStruct *options)
Apply global/timeline effects to the source frame (if any)
Definition: Timeline.cpp:563
void Open() override
Open the reader (and start consuming resources)
Definition: Timeline.cpp:968
void SetJson(const std::string value) override
Load JSON string into this object.
Definition: Timeline.cpp:1281
openshot::Keyframe viewport_y
Curve representing the y coordinate for the viewport.
Definition: Timeline.h:345
void Close() override
Close the timeline reader (and any resources it was consuming)
Definition: Timeline.cpp:946
This namespace is the default namespace for all code in the openshot library.
Definition: AnimatedCurve.h:24
ChannelLayout
This enumeration determines the audio channel layout (such as stereo, mono, 5 point surround,...
bool operator()(const openshot::Clip *lhs, const openshot::Clip *rhs)
Definition: Timeline.h:76
bool operator()(openshot::Clip *lhs, openshot::Clip *rhs) const
Definition: Timeline.h:49
Like CompareClipEndFrames, but for effects.
Definition: Timeline.h:81
bool operator()(const openshot::EffectBase *lhs, const openshot::EffectBase *rhs)
Definition: Timeline.h:82
bool operator()(openshot::EffectBase *lhs, openshot::EffectBase *rhs)
Definition: Timeline.h:66
This struct contains info about a media file, such as height, width, frames per second,...
Definition: ReaderBase.h:39
This struct contains info about the current Timeline clip instance.
Definition: TimelineBase.h:33