OpenShot Library | libopenshot  0.5.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  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  Clip(openshot::ReaderBase* new_reader);
201 
203  virtual ~Clip();
204 
206  openshot::CacheMemory* GetCache() override { return &final_cache; };
207 
209  bool IsOpen() override { return is_open; };
210 
212  std::string GetAttachedId() const { return parentObjectId; };
214  void SetAttachedId(std::string value) { parentObjectId = value; };
215 
217  void AttachToObject(std::string object_id);
218 
220  void SetAttachedObject(std::shared_ptr<openshot::TrackedObjectBase> trackedObject);
222  void SetAttachedClip(Clip* clipObject);
224  std::shared_ptr<openshot::TrackedObjectBase> GetAttachedObject() const { return parentTrackedObject; };
226  Clip* GetAttachedClip() const { return parentClipObject; };
227 
229  std::string Name() override { return "Clip"; };
230 
233  void AddEffect(openshot::EffectBase* effect);
234 
236  void Close() override;
237 
240 
242  std::shared_ptr<openshot::TrackedObjectBase> GetParentTrackedObject();
243 
245  std::list<openshot::EffectBase*> Effects() { return effects; };
246 
248  openshot::EffectBase* GetEffect(const std::string& id);
249 
255  std::shared_ptr<openshot::Frame> GetFrame(int64_t clip_frame_number) override;
256 
267  std::shared_ptr<openshot::Frame> GetFrame(std::shared_ptr<openshot::Frame> background_frame, int64_t clip_frame_number) override;
268 
281  std::shared_ptr<openshot::Frame> GetFrame(std::shared_ptr<openshot::Frame> background_frame, int64_t clip_frame_number, openshot::TimelineInfoStruct* options);
282 
284  void Open() override;
285 
288  void Reader(openshot::ReaderBase* new_reader);
289 
292 
293  // Override End() position (in seconds) of clip (trim end of video)
294  float End() const override;
295  void End(float value) override;
296  openshot::TimelineBase* ParentTimeline() override { return timeline; }
297  void ParentTimeline(openshot::TimelineBase* new_timeline) override;
298 
299  // Get and Set JSON methods
300  std::string Json() const override;
301  void SetJson(const std::string value) override;
302  Json::Value JsonValue() const override;
303  void SetJsonValue(const Json::Value root) override;
304 
307  std::string PropertiesJSON(int64_t requested_frame) const override;
308 
311  void RemoveEffect(openshot::EffectBase* effect);
312 
313  // Waveform property
314  bool Waveform() { return waveform; }
315  void Waveform(bool value) { waveform = value; }
316 
317  // Scale, Location, and Alpha curves
323 
324  // Rotation and Shear curves (origin point (x,y) is adjustable for both rotation and shear)
330 
331  // Time and Volume curves
334 
337 
338  // Perspective curves
347 
348  // Audio channel filter and mappings
351 
352  // Override has_video and has_audio properties of clip (and their readers)
355  };
356 } // namespace
357 
358 #endif // OPENSHOT_CLIP_H
openshot::Clip::Open
void Open() override
Open the internal reader.
Definition: Clip.cpp:384
openshot::ClipBase::timeline
openshot::TimelineBase * timeline
Pointer to the parent timeline instance (if any)
Definition: ClipBase.h:40
openshot::EffectBase
This abstract class is the base class, used by all effects in libopenshot.
Definition: EffectBase.h:56
openshot::Clip::anchor
openshot::AnchorType anchor
The anchor determines what parent a clip should snap to.
Definition: Clip.h:180
openshot::Clip::GetAttachedId
std::string GetAttachedId() const
Get and set the object id that this clip is attached to.
Definition: Clip.h:212
openshot::Clip::previous_location
AudioLocation previous_location
Previous time-mapped audio location.
Definition: Clip.h:95
openshot::Clip::GetCache
openshot::CacheMemory * GetCache() override
Get the cache object (always return NULL for this reader)
Definition: Clip.h:206
openshot::Clip::GetEffect
openshot::EffectBase * GetEffect(const std::string &id)
Look up an effect by ID.
Definition: Clip.cpp:553
openshot
This namespace is the default namespace for all code in the openshot library.
Definition: Compressor.h:28
openshot::Clip::scale_y
openshot::Keyframe scale_y
Curve representing the vertical scaling in percent (0 to 1)
Definition: Clip.h:319
openshot::Clip::PropertiesJSON
std::string PropertiesJSON(int64_t requested_frame) const override
Definition: Clip.cpp:838
openshot::AudioLocation
This struct holds the associated video frame and starting sample # for an audio packet.
Definition: AudioLocation.h:25
openshot::Clip::time
openshot::Keyframe time
Curve representing the frames over time to play (used for speed and direction of video)
Definition: Clip.h:332
openshot::CompositeType
CompositeType
This enumeration determines how clips are composited onto lower layers.
Definition: Enums.h:75
openshot::Clip
This class represents a clip (used to arrange readers on the timeline)
Definition: Clip.h:89
openshot::Clip::alpha
openshot::Keyframe alpha
Curve representing the alpha (1 to 0)
Definition: Clip.h:322
openshot::Clip::End
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:420
AudioLocation.h
Header file for AudioLocation class.
openshot::Clip::origin_x
openshot::Keyframe origin_x
Curve representing X origin point (0.0=0% (left), 1.0=100% (right))
Definition: Clip.h:328
openshot::Clip::ParentTimeline
void ParentTimeline(openshot::TimelineBase *new_timeline) override
Set associated Timeline pointer.
Definition: Clip.cpp:447
openshot::Clip::GetFrame
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:455
openshot::Clip::Close
void Close() override
Close the internal reader.
Definition: Clip.cpp:405
openshot::Clip::location_y
openshot::Keyframe location_y
Curve representing the relative Y position in percent based on the gravity (-1 to 1)
Definition: Clip.h:321
openshot::GravityType
GravityType
This enumeration determines how clips are aligned to their parent container.
Definition: Enums.h:21
openshot::Clip::origin_y
openshot::Keyframe origin_y
Curve representing Y origin point (0.0=0% (top), 1.0=100% (bottom))
Definition: Clip.h:329
openshot::Clip::GetParentTrackedObject
std::shared_ptr< openshot::TrackedObjectBase > GetParentTrackedObject()
Return the associated Parent Tracked Object (if any)
Definition: Clip.cpp:574
openshot::Clip::Effects
std::list< openshot::EffectBase * > Effects()
Return the list of effects on the timeline.
Definition: Clip.h:245
openshot::Clip::channel_mapping
openshot::Keyframe channel_mapping
A number representing an audio channel to output (only works when filtering a channel)
Definition: Clip.h:350
openshot::Clip::AddEffect
void AddEffect(openshot::EffectBase *effect)
Add an effect to the clip.
Definition: Clip.cpp:1229
openshot::Clip::~Clip
virtual ~Clip()
Destructor.
Definition: Clip.cpp:285
EffectBase.h
Header file for EffectBase class.
openshot::Clip::Json
std::string Json() const override
Generate JSON string of this object.
Definition: Clip.cpp:831
openshot::ClipBase::Position
void Position(float value)
Set the Id of this clip object
Definition: ClipBase.cpp:19
KeyFrame.h
Header file for the Keyframe class.
openshot::CompareClipEffects
Definition: Clip.h:48
openshot::Clip::SetJsonValue
void SetJsonValue(const Json::Value root) override
Load Json::Value into this object.
Definition: Clip.cpp:1034
openshot::Color
This class represents a color (used on the timeline and clips)
Definition: Color.h:27
openshot::Clip::display
openshot::FrameDisplayType display
The format to display the frame number (if any)
Definition: Clip.h:181
openshot::Clip::perspective_c2_y
openshot::Keyframe perspective_c2_y
Curves representing Y for coordinate 2.
Definition: Clip.h:342
openshot::Clip::scale_x
openshot::Keyframe scale_x
Curve representing the horizontal scaling in percent (0 to 1)
Definition: Clip.h:318
openshot::AudioResampler
This class is used to resample audio data for many sequential frames.
Definition: AudioResampler.h:30
openshot::Clip::SetAttachedId
void SetAttachedId(std::string value)
Set id of the object id that this clip is attached to.
Definition: Clip.h:214
openshot::Clip::perspective_c3_y
openshot::Keyframe perspective_c3_y
Curves representing Y for coordinate 3.
Definition: Clip.h:344
openshot::Clip::GetAttachedClip
Clip * GetAttachedClip() const
Return a pointer to the clip this clip is attached to.
Definition: Clip.h:226
openshot::Clip::perspective_c4_y
openshot::Keyframe perspective_c4_y
Curves representing Y for coordinate 4.
Definition: Clip.h:346
openshot::Clip::has_video
openshot::Keyframe has_video
An optional override to determine if this clip has video (-1=undefined, 0=no, 1=yes)
Definition: Clip.h:354
openshot::Keyframe
A Keyframe is a collection of Point instances, which is used to vary a number or property over time.
Definition: KeyFrame.h:53
openshot::Clip::gravity
openshot::GravityType gravity
The gravity of a clip determines where it snaps to its parent.
Definition: Clip.h:178
openshot::Clip::Name
std::string Name() override
Return the type name of the class.
Definition: Clip.h:229
EffectInfo.h
Header file for the EffectInfo class.
openshot::CacheMemory
This class is a memory-based cache manager for Frame objects.
Definition: CacheMemory.h:29
openshot::Clip::composite
openshot::CompositeType composite
How this clip is composited onto lower layers.
Definition: Clip.h:183
openshot::Clip::perspective_c1_x
openshot::Keyframe perspective_c1_x
Curves representing X for coordinate 1.
Definition: Clip.h:339
openshot::Clip::init_settings
void init_settings()
Init default settings for a clip.
Definition: Clip.cpp:69
openshot::TimelineInfoStruct
This struct contains info about the current Timeline clip instance.
Definition: TimelineBase.h:32
path
path
Definition: FFmpegWriter.cpp:1474
openshot::Clip::IsOpen
bool IsOpen() override
Determine if reader is open or closed.
Definition: Clip.h:209
openshot::Clip::Reader
openshot::ReaderBase * Reader()
Get the current reader.
Definition: Clip.cpp:374
openshot::Clip::perspective_c2_x
openshot::Keyframe perspective_c2_x
Curves representing X for coordinate 2.
Definition: Clip.h:341
openshot::Clip::volume
openshot::Keyframe volume
Curve representing the volume (0 to 1)
Definition: Clip.h:333
openshot::EffectBase::Order
int Order() const
Get the order that this effect should be executed.
Definition: EffectBase.h:182
openshot::Clip::SetJson
void SetJson(const std::string value) override
Load JSON string into this object.
Definition: Clip.cpp:1017
ReaderBase.h
Header file for ReaderBase class.
openshot::Clip::SetAttachedClip
void SetAttachedClip(Clip *clipObject)
Set the pointer to the clip this clip is attached to.
Definition: Clip.cpp:333
openshot::Clip::perspective_c4_x
openshot::Keyframe perspective_c4_x
Curves representing X for coordinate 4.
Definition: Clip.h:345
openshot::Clip::COMPILED_WITH_CV
bool COMPILED_WITH_CV
Definition: Clip.h:186
openshot::Clip::perspective_c1_y
openshot::Keyframe perspective_c1_y
Curves representing Y for coordinate 1.
Definition: Clip.h:340
openshot::Clip::channel_filter
openshot::Keyframe channel_filter
A number representing an audio channel to filter (clears all other channels)
Definition: Clip.h:349
openshot::Clip::init_reader_rotation
void init_reader_rotation()
Update default rotation from reader.
Definition: Clip.cpp:148
Enums.h
Header file for TextReader class.
openshot::Clip::init_reader_settings
void init_reader_settings()
Init reader info details.
Definition: Clip.cpp:135
openshot::TimelineBase
This class represents a timeline (used for building generic timeline implementations)
Definition: TimelineBase.h:42
openshot::Clip::Clip
Clip()
Default Constructor.
Definition: Clip.cpp:199
openshot::ReaderBase
This abstract class is the base class, used by all readers in libopenshot.
Definition: ReaderBase.h:75
openshot::Clip::SetAttachedObject
void SetAttachedObject(std::shared_ptr< openshot::TrackedObjectBase > trackedObject)
Set the pointer to the trackedObject this clip is attached to.
Definition: Clip.cpp:328
openshot::Clip::scale
openshot::ScaleType scale
The scale determines how a clip should be resized to fit its parent.
Definition: Clip.h:179
Color.h
Header file for Color class.
openshot::AnchorType
AnchorType
This enumeration determines what parent a clip should be aligned to.
Definition: Enums.h:44
openshot::ScaleType
ScaleType
This enumeration determines how clips are scaled to fit their parent container.
Definition: Enums.h:35
openshot::Clip::AttachToObject
void AttachToObject(std::string object_id)
Attach clip to Tracked Object or to another Clip.
Definition: Clip.cpp:305
openshot::Clip::has_audio
openshot::Keyframe has_audio
An optional override to determine if this clip has audio (-1=undefined, 0=no, 1=yes)
Definition: Clip.h:353
openshot::Clip::GetParentClip
openshot::Clip * GetParentClip()
Return the associated ParentClip (if any)
Definition: Clip.cpp:565
openshot::Clip::rotation
openshot::Keyframe rotation
Curve representing the rotation (0 to 360)
Definition: Clip.h:325
openshot::CompareClipEffects::operator()
bool operator()(openshot::EffectBase *lhs, openshot::EffectBase *rhs)
Definition: Clip.h:49
openshot::Clip::JsonValue
Json::Value JsonValue() const override
Generate Json::Value for this object.
Definition: Clip.cpp:960
openshot::Clip::perspective_c3_x
openshot::Keyframe perspective_c3_x
Curves representing X for coordinate 3.
Definition: Clip.h:343
openshot::ClipBase
This abstract class is the base class, used by all clips in libopenshot.
Definition: ClipBase.h:32
TrackedObjectBase.h
Header file for the TrackedObjectBase class.
openshot::ClipBase::Layer
void Layer(int value)
Set layer of clip on timeline (lower number is covered by higher numbers)
Definition: ClipBase.cpp:31
openshot::VolumeMixType
VolumeMixType
This enumeration determines the strategy when mixing audio with other clips.
Definition: Enums.h:67
ClipBase.h
Header file for ClipBase class.
openshot::Clip::wave_color
openshot::Color wave_color
Curve representing the color of the audio wave form.
Definition: Clip.h:336
openshot::Clip::shear_y
openshot::Keyframe shear_y
Curve representing Y shear angle in degrees (-45.0=down, 45.0=up)
Definition: Clip.h:327
openshot::Clip::RemoveEffect
void RemoveEffect(openshot::EffectBase *effect)
Remove an effect from the clip.
Definition: Clip.cpp:1276
openshot::Clip::mixing
openshot::VolumeMixType mixing
What strategy should be followed when mixing audio with other clips.
Definition: Clip.h:182
openshot::Clip::GetAttachedObject
std::shared_ptr< openshot::TrackedObjectBase > GetAttachedObject() const
Return a pointer to the trackedObject this clip is attached to.
Definition: Clip.h:224
openshot::Clip::shear_x
openshot::Keyframe shear_x
Curve representing X shear angle in degrees (-45.0=left, 45.0=right)
Definition: Clip.h:326
openshot::Clip::location_x
openshot::Keyframe location_x
Curve representing the relative X position in percent based on the gravity (-1 to 1)
Definition: Clip.h:320
openshot::Clip::getFrameMutex
std::recursive_mutex getFrameMutex
Mutex for multiple threads.
Definition: Clip.h:92
openshot::FrameDisplayType
FrameDisplayType
This enumeration determines the display format of the clip's frame number (if any)....
Definition: Enums.h:51