OpenShot Library | libopenshot  0.5.0
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 <mutex>
19 #include <set>
20 #include <QtGui/QImage>
21 #include <QtGui/QPainter>
22 #include <QtCore/QRegularExpression>
23 
24 #include "TimelineBase.h"
25 #include "ReaderBase.h"
26 
27 #include "Color.h"
28 #include "Clip.h"
29 #include "EffectBase.h"
30 #include "Fraction.h"
31 #include "Frame.h"
32 #include "KeyFrame.h"
33 #ifdef USE_OPENCV
34 #include "TrackedObjectBBox.h"
35 #endif
36 #include "TrackedObjectBase.h"
37 
38 
39 
40 namespace openshot {
41 
42  // Forward decls
43  class FrameMapper;
44  class CacheBase;
45 
49  struct CompareClips {
50  bool operator()(openshot::Clip* lhs, openshot::Clip* rhs) const {
51  // Strict-weak ordering (no <=) to keep sort well-defined
52  if (lhs == rhs) return false; // irreflexive
53  if (lhs->Layer() != rhs->Layer())
54  return lhs->Layer() < rhs->Layer();
55  if (lhs->Position() != rhs->Position())
56  return lhs->Position() < rhs->Position();
57  // Stable tie-breaker on address to avoid equivalence when layer/position match
58  return std::less<openshot::Clip*>()(lhs, rhs);
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 
82  bool operator()(const openshot::EffectBase* lhs, const openshot::EffectBase* rhs) {
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 
171  std::map<std::string, std::shared_ptr<openshot::TrackedObjectBase>> tracked_objects;
172 
174  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);
175 
177  void apply_mapper_to_clip(openshot::Clip* clip);
178 
179  // Apply JSON Diffs to various objects contained in this timeline
180  void apply_json_to_clips(Json::Value change);
181  void apply_json_to_effects(Json::Value change);
182  void apply_json_to_effects(Json::Value change, openshot::EffectBase* existing_effect);
183  void apply_json_to_timeline(Json::Value change);
184 
186  void calculate_max_duration();
187 
189  double calculate_time(int64_t number, openshot::Fraction rate);
190 
197  std::vector<openshot::Clip*> find_intersecting_clips(int64_t requested_frame, int number_of_frames, bool include);
198 
200  std::shared_ptr<openshot::Frame> GetOrCreateFrame(std::shared_ptr<Frame> background_frame, openshot::Clip* clip, int64_t number, openshot::TimelineInfoStruct* options);
201 
203  bool isEqual(double a, double b);
204 
206  void sort_clips();
207 
209  void sort_effects();
210 
212  void update_open_clips(openshot::Clip *clip, bool does_clip_intersect);
213 
214  public:
215 
223  Timeline(int width, int height, openshot::Fraction fps, int sample_rate, int channels, openshot::ChannelLayout channel_layout);
224 
228 
236  Timeline(const std::string& projectPath, bool convert_absolute_paths);
237 
238  virtual ~Timeline();
239 
241  void AddTrackedObject(std::shared_ptr<openshot::TrackedObjectBase> trackedObject);
243  std::shared_ptr<openshot::TrackedObjectBase> GetTrackedObject(std::string id) const;
245  std::list<std::string> GetTrackedObjectsIds() const;
247  #ifdef USE_OPENCV
248  std::string GetTrackedObjectValues(std::string id, int64_t frame_number) const;
249  #endif
250 
253  void AddClip(openshot::Clip* clip);
254 
257  void AddEffect(openshot::EffectBase* effect);
258 
260  std::shared_ptr<openshot::Frame> apply_effects(std::shared_ptr<openshot::Frame> frame, int64_t timeline_frame_number, int layer, TimelineInfoStruct* options);
261 
263  void ApplyMapperToClips();
264 
266  bool AutoMapClips() { return auto_map_clips; };
267 
269  void AutoMapClips(bool auto_map) { auto_map_clips = auto_map; };
270 
272  void Clear();
273 
276  void ClearAllCache(bool deep=false);
277 
279  std::list<openshot::Clip*> Clips() override { return clips; };
280 
282  openshot::Clip* GetClip(const std::string& id);
283 
285  openshot::EffectBase* GetClipEffect(const std::string& id);
286 
288  openshot::EffectBase* GetEffect(const std::string& id);
289 
291  double GetMaxTime();
293  int64_t GetMaxFrame();
294 
296  double GetMinTime();
298  int64_t GetMinFrame();
299 
301  void Close() override;
302 
304  std::list<openshot::EffectBase*> Effects() { return effects; };
305 
307  std::list<openshot::EffectBase*> ClipEffects() const;
308 
310  openshot::CacheBase* GetCache() override { return final_cache; };
311 
314  void SetCache(openshot::CacheBase* new_cache);
315 
320  std::shared_ptr<openshot::Frame> GetFrame(int64_t requested_frame) override;
321 
322  // Curves for the viewport
326 
327  // Background color
329 
331  bool IsOpen() override { return is_open; };
332 
334  std::string Name() override { return "Timeline"; };
335 
336  // Get and Set JSON methods
337  std::string Json() const override;
338  void SetJson(const std::string value) override;
339  Json::Value JsonValue() const override;
340  void SetJsonValue(const Json::Value root) override;
341 
344  void SetMaxSize(int width, int height);
345 
350  void ApplyJsonDiff(std::string value);
351 
353  void Open() override;
354 
358 
361  void RemoveEffect(openshot::EffectBase* effect);
362 
365  void SortTimeline() { sort_clips(); sort_effects(); }
366  };
367 
368 }
369 
370 #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:90
int Layer() const
Get layer of clip on timeline (lower number is covered by higher numbers)
Definition: ClipBase.h:87
float Position() const
Get position on timeline (in seconds)
Definition: ClipBase.h:86
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:54
int Order() const
Get the order that this effect should be executed.
Definition: EffectBase.h:116
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:88
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:224
Json::Value JsonValue() const override
Generate Json::Value for this object.
Definition: Timeline.cpp:1194
std::string Name() override
Return the type name of the class.
Definition: Timeline.h:334
openshot::Keyframe viewport_scale
Curve representing the scale of the viewport (0 to 100)
Definition: Timeline.h:323
void ApplyJsonDiff(std::string value)
Apply a special formatted JSON object, which represents a change to the timeline (add,...
Definition: Timeline.cpp:1347
openshot::EffectBase * GetClipEffect(const std::string &id)
Look up a clip effect by ID.
Definition: Timeline.cpp:436
void AddClip(openshot::Clip *clip)
Add an openshot::Clip to the timeline.
Definition: Timeline.cpp:333
virtual ~Timeline()
Definition: Timeline.cpp:207
std::list< openshot::EffectBase * > ClipEffects() const
Return the list of effects on all clips.
Definition: Timeline.cpp:449
void AutoMapClips(bool auto_map)
Automatically map all clips to the timeline's framerate and samplerate.
Definition: Timeline.h:269
openshot::CacheBase * GetCache() override
Get the cache object used by this reader.
Definition: Timeline.h:310
std::list< std::string > GetTrackedObjectsIds() const
Return the ID's of the tracked objects as a list of strings.
Definition: Timeline.cpp:259
std::string Json() const override
Generate JSON string of this object.
Definition: Timeline.cpp:1187
int64_t GetMaxFrame()
Look up the end frame number of the latest element on the timeline.
Definition: Timeline.cpp:474
double GetMinTime()
Look up the position/start time of the first timeline element.
Definition: Timeline.cpp:490
std::shared_ptr< openshot::Frame > GetFrame(int64_t requested_frame) override
Definition: Timeline.cpp:937
std::list< openshot::EffectBase * > Effects()
Return the list of effects on the timeline.
Definition: Timeline.h:304
bool AutoMapClips()
Determine if clips are automatically mapped to the timeline's framerate and samplerate.
Definition: Timeline.h:266
void ApplyMapperToClips()
Apply the timeline's framerate and samplerate to all clips.
Definition: Timeline.cpp:522
void SortTimeline()
Sort all clips and effects on timeline - which affects the internal order of clips and effects arrays...
Definition: Timeline.h:365
openshot::Color color
Background color of timeline canvas.
Definition: Timeline.h:328
std::string GetTrackedObjectValues(std::string id, int64_t frame_number) const
Return the trackedObject's properties as a JSON string.
Definition: Timeline.cpp:275
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:31
std::shared_ptr< openshot::TrackedObjectBase > GetTrackedObject(std::string id) const
Return tracked object pointer by it's id.
Definition: Timeline.cpp:242
int64_t GetMinFrame()
Look up the start frame number of the first element on the timeline (first frame is 1)
Definition: Timeline.cpp:482
openshot::EffectBase * GetEffect(const std::string &id)
Look up a timeline effect by ID.
Definition: Timeline.cpp:425
void SetJsonValue(const Json::Value root) override
Load Json::Value into this object.
Definition: Timeline.cpp:1248
openshot::Clip * GetClip(const std::string &id)
Look up a single clip by ID.
Definition: Timeline.cpp:413
void ClearAllCache(bool deep=false)
Definition: Timeline.cpp:1746
void AddEffect(openshot::EffectBase *effect)
Add an effect to the timeline.
Definition: Timeline.cpp:359
void SetCache(openshot::CacheBase *new_cache)
Definition: Timeline.cpp:1171
bool IsOpen() override
Determine if reader is open or closed.
Definition: Timeline.h:331
void Clear()
Clear all clips, effects, and frame mappers from timeline (and free memory)
Definition: Timeline.cpp:857
openshot::Keyframe viewport_x
Curve representing the x coordinate for the viewport.
Definition: Timeline.h:324
void RemoveClip(openshot::Clip *clip)
Remove an openshot::Clip from the timeline.
Definition: Timeline.cpp:394
void SetMaxSize(int width, int height)
Definition: Timeline.cpp:1782
double GetMaxTime()
Look up the end time of the latest timeline element.
Definition: Timeline.cpp:468
void RemoveEffect(openshot::EffectBase *effect)
Remove an effect from the timeline.
Definition: Timeline.cpp:375
std::list< openshot::Clip * > Clips() override
Return a list of clips on the timeline.
Definition: Timeline.h:279
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:546
void Open() override
Open the reader (and start consuming resources)
Definition: Timeline.cpp:925
void SetJson(const std::string value) override
Load JSON string into this object.
Definition: Timeline.cpp:1228
openshot::Keyframe viewport_y
Curve representing the y coordinate for the viewport.
Definition: Timeline.h:325
void Close() override
Close the timeline reader (and any resources it was consuming)
Definition: Timeline.cpp:903
This namespace is the default namespace for all code in the openshot library.
Definition: Compressor.h:29
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:50
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