OpenShot Library | libopenshot  0.7.0
Clip.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_CLIP_H
14 #define OPENSHOT_CLIP_H
15 
16 #ifdef USE_OPENCV
17  #define int64 opencv_broken_int
18  #define uint64 opencv_broken_uint
19  #include <opencv2/opencv.hpp>
20  #include <opencv2/core.hpp>
21  #undef uint64
22  #undef int64
23 
24 #endif
25 
26 #include <memory>
27 #include <string>
28 
29 #include "AudioLocation.h"
30 #include "ClipBase.h"
31 #include "ReaderBase.h"
32 
33 #include "Color.h"
34 #include "Enums.h"
35 #include "EffectBase.h"
36 #include "EffectInfo.h"
37 #include "KeyFrame.h"
38 #include "TrackedObjectBase.h"
39 
40 namespace openshot {
41  class AudioResampler;
42  class EffectInfo;
43  class Frame;
44 
50  if( lhs->Layer() < rhs->Layer() ) return true;
51  if( lhs->Layer() == rhs->Layer() && lhs->Position() < rhs->Position() ) return true;
52  if( lhs->Layer() == rhs->Layer() && lhs->Position() == rhs->Position() && lhs->Order() > rhs->Order() ) return true;
53  return false;
54  }};
55 
89  class Clip : public openshot::ClipBase, public openshot::ReaderBase {
90  protected:
92  std::recursive_mutex getFrameMutex;
93 
96 
98  void init_settings();
99 
101  void init_reader_settings();
102 
104  void init_reader_rotation();
105 
106  private:
107  bool waveform;
108  std::list<openshot::EffectBase*> effects;
109  bool is_open;
110  std::string parentObjectId;
111  std::shared_ptr<openshot::TrackedObjectBase> parentTrackedObject;
112  openshot::Clip* parentClipObject;
113 
115  CacheMemory final_cache;
116 
117  // Audio resampler (if time mapping)
118  openshot::AudioResampler *resampler;
119 
120  // File Reader object
121  openshot::ReaderBase* reader;
122 
125  openshot::ReaderBase* allocated_reader;
126 
128  int64_t adjust_frame_number_minimum(int64_t frame_number);
129 
131  void apply_background(std::shared_ptr<openshot::Frame> frame,
132  std::shared_ptr<openshot::Frame> background_frame,
133  bool update_frame_image = true);
134 
136  void apply_effects(std::shared_ptr<openshot::Frame> frame, int64_t timeline_frame_number, TimelineInfoStruct* options, bool before_keyframes);
137 
139  void apply_keyframes(std::shared_ptr<Frame> frame, QSize timeline_size);
140 
142  void apply_waveform(std::shared_ptr<Frame> frame, QSize timeline_size);
143 
145  int64_t adjust_timeline_framenumber(int64_t clip_frame_number);
146 
148  QTransform get_transform(std::shared_ptr<Frame> frame, int width, int height);
149 
151  static std::string get_file_extension(std::string path);
152 
154  std::shared_ptr<openshot::Frame> GetOrCreateFrame(int64_t number, bool enable_time=true);
155 
157  double resolve_timeline_fps() const;
158 
160  int64_t curve_extent_frames() const;
161 
163  int64_t trim_extent_frames(double fps_value) const;
164 
166  void apply_timemapping(std::shared_ptr<openshot::Frame> frame);
167 
169  bool isNear(double a, double b);
170 
172  void sort_effects();
173 
175  QSize scale_size(QSize source_size, ScaleType source_scale, int target_width, int target_height);
176 
177  public:
184 
185  #ifdef USE_OPENCV
186  bool COMPILED_WITH_CV = true;
187  #else
188  bool COMPILED_WITH_CV = false;
189  #endif
190 
192  Clip();
193 
196  Clip(std::string path);
197 
200  static openshot::ReaderBase* CreateReader(std::string path, bool inspect_reader=true);
201 
204  Clip(openshot::ReaderBase* new_reader);
205 
207  virtual ~Clip();
208 
210  openshot::CacheMemory* GetCache() override { return &final_cache; };
211 
213  bool IsOpen() override { return is_open; };
214 
216  std::string GetAttachedId() const { return parentObjectId; };
218  void SetAttachedId(std::string value) { parentObjectId = value; };
219 
221  void AttachToObject(std::string object_id);
222 
224  void SetAttachedObject(std::shared_ptr<openshot::TrackedObjectBase> trackedObject);
226  void SetAttachedClip(Clip* clipObject);
228  std::shared_ptr<openshot::TrackedObjectBase> GetAttachedObject() const { return parentTrackedObject; };
230  Clip* GetAttachedClip() const { return parentClipObject; };
231 
233  std::string Name() override { return "Clip"; };
234 
237  void AddEffect(openshot::EffectBase* effect);
238 
240  void Close() override;
241 
244 
246  std::shared_ptr<openshot::TrackedObjectBase> GetParentTrackedObject();
247 
249  std::list<openshot::EffectBase*> Effects() { return effects; };
250 
252  openshot::EffectBase* GetEffect(const std::string& id);
253 
259  std::shared_ptr<openshot::Frame> GetFrame(int64_t clip_frame_number) override;
260 
271  std::shared_ptr<openshot::Frame> GetFrame(std::shared_ptr<openshot::Frame> background_frame, int64_t clip_frame_number) override;
272 
285  std::shared_ptr<openshot::Frame> GetFrame(std::shared_ptr<openshot::Frame> background_frame, int64_t clip_frame_number, openshot::TimelineInfoStruct* options);
286 
288  void Open() override;
289 
292  void Reader(openshot::ReaderBase* new_reader);
293 
296 
297  // Override End() position (in seconds) of clip (trim end of video)
298  float End() const override;
299  void End(float value) override;
301  void ParentTimeline(openshot::TimelineBase* new_timeline) override;
302 
303  // Get and Set JSON methods
304  std::string Json() const override;
305  void SetJson(const std::string value) override;
306  Json::Value JsonValue() const override;
307  void SetJsonValue(const Json::Value root) override;
308 
311  std::string PropertiesJSON(int64_t requested_frame) const override;
312 
315  void RemoveEffect(openshot::EffectBase* effect);
316 
317  // Waveform property
318  bool Waveform() { return waveform; }
319  void Waveform(bool value) { waveform = value; }
320 
321  // Scale, Location, and Alpha curves
327 
328  // Rotation and Shear curves (origin point (x,y) is adjustable for both rotation and shear)
334 
335  // Time and Volume curves
338 
341 
342  // Perspective curves
351 
352  // Audio channel filter and mappings
355 
356  // Override has_video and has_audio properties of clip (and their readers)
359  };
360 } // namespace
361 
362 #endif // OPENSHOT_CLIP_H
Header file for AudioLocation class.
Header file for ClipBase class.
Header file for Color class.
Header file for EffectBase class.
Header file for the EffectInfo class.
Header file for TextReader class.
Header file for the Keyframe class.
Header file for ReaderBase class.
Header file for the TrackedObjectBase class.
This class is used to resample audio data for many sequential frames.
This class is a memory-based cache manager for Frame objects.
Definition: CacheMemory.h:29
This abstract class is the base class, used by all clips in libopenshot.
Definition: ClipBase.h:32
int Layer() const
Get layer of clip on timeline (lower number is covered by higher numbers)
Definition: ClipBase.h:87
openshot::TimelineBase * timeline
Pointer to the parent timeline instance (if any)
Definition: ClipBase.h:40
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
void SetAttachedObject(std::shared_ptr< openshot::TrackedObjectBase > trackedObject)
Set the pointer to the trackedObject this clip is attached to.
Definition: Clip.cpp:322
openshot::Keyframe scale_x
Curve representing the horizontal scaling in percent (0 to 1)
Definition: Clip.h:322
openshot::Keyframe location_y
Curve representing the relative Y position in percent based on the gravity (-1 to 1)
Definition: Clip.h:325
std::list< openshot::EffectBase * > Effects()
Return the list of effects on the timeline.
Definition: Clip.h:249
openshot::Keyframe shear_x
Curve representing X shear angle in degrees (-45.0=left, 45.0=right)
Definition: Clip.h:330
openshot::Keyframe perspective_c4_x
Curves representing X for coordinate 4.
Definition: Clip.h:349
openshot::AnchorType anchor
The anchor determines what parent a clip should snap to.
Definition: Clip.h:180
openshot::VolumeMixType mixing
What strategy should be followed when mixing audio with other clips.
Definition: Clip.h:182
void Open() override
Open the internal reader.
Definition: Clip.cpp:378
std::string GetAttachedId() const
Get and set the object id that this clip is attached to.
Definition: Clip.h:216
openshot::Keyframe rotation
Curve representing the rotation (0 to 360)
Definition: Clip.h:329
openshot::Keyframe channel_filter
A number representing an audio channel to filter (clears all other channels)
Definition: Clip.h:353
openshot::FrameDisplayType display
The format to display the frame number (if any)
Definition: Clip.h:181
void init_reader_rotation()
Update default rotation from reader.
Definition: Clip.cpp:148
Clip()
Default Constructor.
Definition: Clip.cpp:199
openshot::Keyframe perspective_c1_x
Curves representing X for coordinate 1.
Definition: Clip.h:343
void AttachToObject(std::string object_id)
Attach clip to Tracked Object or to another Clip.
Definition: Clip.cpp:299
std::string Json() const override
Generate JSON string of this object.
Definition: Clip.cpp:809
openshot::TimelineBase * ParentTimeline() override
Get the associated Timeline pointer (if any)
Definition: Clip.h:300
openshot::EffectBase * GetEffect(const std::string &id)
Look up an effect by ID.
Definition: Clip.cpp:531
void SetJsonValue(const Json::Value root) override
Load Json::Value into this object.
Definition: Clip.cpp:1012
openshot::Keyframe alpha
Curve representing the alpha (1 to 0)
Definition: Clip.h:326
openshot::Keyframe has_audio
An optional override to determine if this clip has audio (-1=undefined, 0=no, 1=yes)
Definition: Clip.h:357
Clip * GetAttachedClip() const
Return a pointer to the clip this clip is attached to.
Definition: Clip.h:230
openshot::Keyframe perspective_c3_x
Curves representing X for coordinate 3.
Definition: Clip.h:347
void init_reader_settings()
Init reader info details.
Definition: Clip.cpp:135
openshot::Keyframe perspective_c1_y
Curves representing Y for coordinate 1.
Definition: Clip.h:344
Json::Value JsonValue() const override
Generate Json::Value for this object.
Definition: Clip.cpp:938
void SetAttachedClip(Clip *clipObject)
Set the pointer to the clip this clip is attached to.
Definition: Clip.cpp:327
openshot::Keyframe perspective_c4_y
Curves representing Y for coordinate 4.
Definition: Clip.h:350
openshot::Keyframe time
Curve representing the frames over time to play (used for speed and direction of video)
Definition: Clip.h:336
openshot::Clip * GetParentClip()
Return the associated ParentClip (if any)
Definition: Clip.cpp:543
bool Waveform()
Get the waveform property of this clip.
Definition: Clip.h:318
openshot::CompositeType composite
How this clip is composited onto lower layers.
Definition: Clip.h:183
openshot::GravityType gravity
The gravity of a clip determines where it snaps to its parent.
Definition: Clip.h:178
std::shared_ptr< openshot::TrackedObjectBase > GetAttachedObject() const
Return a pointer to the trackedObject this clip is attached to.
Definition: Clip.h:228
AudioLocation previous_location
Previous time-mapped audio location.
Definition: Clip.h:95
openshot::Keyframe perspective_c3_y
Curves representing Y for coordinate 3.
Definition: Clip.h:348
std::shared_ptr< openshot::TrackedObjectBase > GetParentTrackedObject()
Return the associated Parent Tracked Object (if any)
Definition: Clip.cpp:552
void AddEffect(openshot::EffectBase *effect)
Add an effect to the clip.
Definition: Clip.cpp:1222
void Close() override
Close the internal reader.
Definition: Clip.cpp:399
void Waveform(bool value)
Set the waveform property of this clip.
Definition: Clip.h:319
virtual ~Clip()
Destructor.
Definition: Clip.cpp:279
openshot::Keyframe perspective_c2_y
Curves representing Y for coordinate 2.
Definition: Clip.h:346
openshot::Keyframe volume
Curve representing the volume (0 to 1)
Definition: Clip.h:337
openshot::Keyframe shear_y
Curve representing Y shear angle in degrees (-45.0=down, 45.0=up)
Definition: Clip.h:331
openshot::Keyframe scale_y
Curve representing the vertical scaling in percent (0 to 1)
Definition: Clip.h:323
float End() const override
Get end position (in seconds) of clip (trim end of video), which can be affected by the time curve.
Definition: Clip.cpp:414
std::shared_ptr< openshot::Frame > GetFrame(int64_t clip_frame_number) override
Get an openshot::Frame object for a specific frame number of this clip. The image size and number of ...
Definition: Clip.cpp:449
std::string Name() override
Return the type name of the class.
Definition: Clip.h:233
openshot::ReaderBase * Reader()
Get the current reader.
Definition: Clip.cpp:368
void RemoveEffect(openshot::EffectBase *effect)
Remove an effect from the clip.
Definition: Clip.cpp:1269
void SetAttachedId(std::string value)
Set id of the object id that this clip is attached to.
Definition: Clip.h:218
openshot::Keyframe channel_mapping
A number representing an audio channel to output (only works when filtering a channel)
Definition: Clip.h:354
openshot::Keyframe has_video
An optional override to determine if this clip has video (-1=undefined, 0=no, 1=yes)
Definition: Clip.h:358
std::string PropertiesJSON(int64_t requested_frame) const override
Definition: Clip.cpp:816
bool COMPILED_WITH_CV
Definition: Clip.h:186
openshot::Color wave_color
Curve representing the color of the audio wave form.
Definition: Clip.h:340
void init_settings()
Init default settings for a clip.
Definition: Clip.cpp:69
openshot::Keyframe perspective_c2_x
Curves representing X for coordinate 2.
Definition: Clip.h:345
static openshot::ReaderBase * CreateReader(std::string path, bool inspect_reader=true)
Definition: Clip.cpp:241
openshot::ScaleType scale
The scale determines how a clip should be resized to fit its parent.
Definition: Clip.h:179
openshot::Keyframe location_x
Curve representing the relative X position in percent based on the gravity (-1 to 1)
Definition: Clip.h:324
openshot::CacheMemory * GetCache() override
Get the cache object (always return NULL for this reader)
Definition: Clip.h:210
openshot::Keyframe origin_x
Curve representing X origin point (0.0=0% (left), 1.0=100% (right))
Definition: Clip.h:332
std::recursive_mutex getFrameMutex
Mutex for multiple threads.
Definition: Clip.h:92
void SetJson(const std::string value) override
Load JSON string into this object.
Definition: Clip.cpp:995
openshot::Keyframe origin_y
Curve representing Y origin point (0.0=0% (top), 1.0=100% (bottom))
Definition: Clip.h:333
bool IsOpen() override
Determine if reader is open or closed.
Definition: Clip.h:213
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:182
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
This class represents a timeline (used for building generic timeline implementations)
Definition: TimelineBase.h:41
This namespace is the default namespace for all code in the openshot library.
Definition: Compressor.h:29
AnchorType
This enumeration determines what parent a clip should be aligned to.
Definition: Enums.h:45
GravityType
This enumeration determines how clips are aligned to their parent container.
Definition: Enums.h:22
ScaleType
This enumeration determines how clips are scaled to fit their parent container.
Definition: Enums.h:36
VolumeMixType
This enumeration determines the strategy when mixing audio with other clips.
Definition: Enums.h:68
FrameDisplayType
This enumeration determines the display format of the clip's frame number (if any)....
Definition: Enums.h:52
CompositeType
This enumeration determines how clips are composited onto lower layers.
Definition: Enums.h:75
This struct holds the associated video frame and starting sample # for an audio packet.
Definition: AudioLocation.h:25
bool operator()(openshot::EffectBase *lhs, openshot::EffectBase *rhs)
Definition: Clip.h:49
This struct contains info about the current Timeline clip instance.
Definition: TimelineBase.h:33