OpenShot Library | libopenshot  0.3.1
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 #include <QImage>
41 
42 namespace openshot {
43  class AudioResampler;
44  class EffectInfo;
45  class Frame;
46 
52  if( lhs->Layer() < rhs->Layer() ) return true;
53  if( lhs->Layer() == rhs->Layer() && lhs->Position() < rhs->Position() ) return true;
54  if( lhs->Layer() == rhs->Layer() && lhs->Position() == rhs->Position() && lhs->Order() > rhs->Order() ) return true;
55  return false;
56  }};
57 
91  class Clip : public openshot::ClipBase, public openshot::ReaderBase {
92  protected:
94  std::recursive_mutex getFrameMutex;
95 
98 
100  void init_settings();
101 
103  void init_reader_settings();
104 
106  void init_reader_rotation();
107 
108  private:
109  bool waveform;
110  std::list<openshot::EffectBase*> effects;
111  bool is_open;
112  std::string parentObjectId;
113  std::shared_ptr<openshot::TrackedObjectBase> parentTrackedObject;
114  openshot::Clip* parentClipObject;
115 
117  CacheMemory final_cache;
118 
119  // Audio resampler (if time mapping)
120  openshot::AudioResampler *resampler;
121 
122  // File Reader object
123  openshot::ReaderBase* reader;
124 
127  openshot::ReaderBase* allocated_reader;
128 
130  int64_t adjust_frame_number_minimum(int64_t frame_number);
131 
133  void apply_effects(std::shared_ptr<openshot::Frame> frame);
134 
136  void apply_keyframes(std::shared_ptr<Frame> frame, std::shared_ptr<QImage> background_canvas);
137 
139  void apply_waveform(std::shared_ptr<Frame> frame, std::shared_ptr<QImage> background_canvas);
140 
142  int64_t adjust_timeline_framenumber(int64_t clip_frame_number);
143 
145  QTransform get_transform(std::shared_ptr<Frame> frame, int width, int height);
146 
148  std::string get_file_extension(std::string path);
149 
151  std::shared_ptr<openshot::Frame> GetOrCreateFrame(int64_t number, bool enable_time=true);
152 
154  void apply_timemapping(std::shared_ptr<openshot::Frame> frame);
155 
157  bool isEqual(double a, double b);
158 
160  void sort_effects();
161 
163  void reverse_buffer(juce::AudioBuffer<float>* buffer);
164 
165 
166  public:
172 
173  #ifdef USE_OPENCV
174  bool COMPILED_WITH_CV = true;
175  #else
176  bool COMPILED_WITH_CV = false;
177  #endif
178 
180  Clip();
181 
184  Clip(std::string path);
185 
188  Clip(openshot::ReaderBase* new_reader);
189 
191  virtual ~Clip();
192 
194  openshot::CacheMemory* GetCache() override { return &final_cache; };
195 
197  bool IsOpen() override { return is_open; };
198 
200  std::string GetAttachedId() const { return parentObjectId; };
202  void SetAttachedId(std::string value) { parentObjectId = value; };
203 
205  void AttachToObject(std::string object_id);
206 
208  void SetAttachedObject(std::shared_ptr<openshot::TrackedObjectBase> trackedObject);
210  void SetAttachedClip(Clip* clipObject);
212  std::shared_ptr<openshot::TrackedObjectBase> GetAttachedObject() const { return parentTrackedObject; };
214  Clip* GetAttachedClip() const { return parentClipObject; };
215 
217  std::string Name() override { return "Clip"; };
218 
221  void AddEffect(openshot::EffectBase* effect);
222 
224  void Close() override;
225 
227  std::list<openshot::EffectBase*> Effects() { return effects; };
228 
230  openshot::EffectBase* GetEffect(const std::string& id);
231 
237  std::shared_ptr<openshot::Frame> GetFrame(int64_t clip_frame_number) override;
238 
249  std::shared_ptr<openshot::Frame> GetFrame(std::shared_ptr<openshot::Frame> background_frame, int64_t clip_frame_number) override;
250 
263  std::shared_ptr<openshot::Frame> GetFrame(std::shared_ptr<openshot::Frame> background_frame, int64_t clip_frame_number, openshot::TimelineInfoStruct* options);
264 
266  void Open() override;
267 
270  void Reader(openshot::ReaderBase* new_reader);
271 
273  openshot::ReaderBase* Reader();
274 
275  // Override End() position (in seconds) of clip (trim end of video)
276  float End() const override;
277  void End(float value) override;
278  openshot::TimelineBase* ParentTimeline() override { return timeline; }
279  void ParentTimeline(openshot::TimelineBase* new_timeline) override;
280 
281  // Get and Set JSON methods
282  std::string Json() const override;
283  void SetJson(const std::string value) override;
284  Json::Value JsonValue() const override;
285  void SetJsonValue(const Json::Value root) override;
286 
289  std::string PropertiesJSON(int64_t requested_frame) const override;
290 
293  void RemoveEffect(openshot::EffectBase* effect);
294 
295  // Waveform property
296  bool Waveform() { return waveform; }
297  void Waveform(bool value) { waveform = value; }
298 
299  // Scale, Location, and Alpha curves
305 
306  // Rotation and Shear curves (origin point (x,y) is adjustable for both rotation and shear)
312 
313  // Time and Volume curves
316 
319 
320  // Perspective curves
329 
330  // Audio channel filter and mappings
333 
334  // Override has_video and has_audio properties of clip (and their readers)
337  };
338 } // namespace
339 
340 #endif // OPENSHOT_CLIP_H
std::string GetAttachedId() const
Get and set the object id that this clip is attached to.
Definition: Clip.h:200
This class represents a timeline (used for building generic timeline implementations) ...
Definition: TimelineBase.h:40
Header file for ClipBase class.
This abstract class is the base class, used by all effects in libopenshot.
Definition: EffectBase.h:52
openshot::Keyframe perspective_c4_y
Curves representing Y for coordinate 4.
Definition: Clip.h:328
openshot::Keyframe time
Curve representing the frames over time to play (used for speed and direction of video) ...
Definition: Clip.h:314
openshot::Color wave_color
Curve representing the color of the audio wave form.
Definition: Clip.h:318
openshot::Keyframe has_video
An optional override to determine if this clip has video (-1=undefined, 0=no, 1=yes) ...
Definition: Clip.h:336
openshot::Keyframe perspective_c3_x
Curves representing X for coordinate 3.
Definition: Clip.h:325
Header file for ReaderBase class.
openshot::Keyframe location_y
Curve representing the relative Y position in percent based on the gravity (-1 to 1) ...
Definition: Clip.h:303
bool operator()(openshot::EffectBase *lhs, openshot::EffectBase *rhs)
Definition: Clip.h:51
VolumeMixType
This enumeration determines the strategy when mixing audio with other clips.
Definition: Enums.h:60
This struct contains info about the current Timeline clip instance.
Definition: TimelineBase.h:32
openshot::GravityType gravity
The gravity of a clip determines where it snaps to its parent.
Definition: Clip.h:167
ScaleType
This enumeration determines how clips are scaled to fit their parent container.
Definition: Enums.h:35
Clip * GetAttachedClip() const
Return a pointer to the clip this clip is attached to.
Definition: Clip.h:214
openshot::Keyframe scale_x
Curve representing the horizontal scaling in percent (0 to 1)
Definition: Clip.h:300
This abstract class is the base class, used by all readers in libopenshot.
Definition: ReaderBase.h:75
openshot::FrameDisplayType display
The format to display the frame number (if any)
Definition: Clip.h:170
openshot::Keyframe volume
Curve representing the volume (0 to 1)
Definition: Clip.h:315
openshot::Keyframe scale_y
Curve representing the vertical scaling in percent (0 to 1)
Definition: Clip.h:301
Header file for the Keyframe class.
std::string Name() override
Return the type name of the class.
Definition: Clip.h:217
openshot::Keyframe shear_x
Curve representing X shear angle in degrees (-45.0=left, 45.0=right)
Definition: Clip.h:308
std::shared_ptr< openshot::TrackedObjectBase > GetAttachedObject() const
Return a pointer to the trackedObject this clip is attached to.
Definition: Clip.h:212
void SetAttachedId(std::string value)
Set id of the object id that this clip is attached to.
Definition: Clip.h:202
std::list< openshot::EffectBase * > Effects()
Return the list of effects on the timeline.
Definition: Clip.h:227
Header file for AudioLocation class.
This class represents a clip (used to arrange readers on the timeline)
Definition: Clip.h:91
bool Waveform()
Get the waveform property of this clip.
Definition: Clip.h:296
openshot::Keyframe channel_filter
A number representing an audio channel to filter (clears all other channels)
Definition: Clip.h:331
openshot::TimelineBase * ParentTimeline() override
Get the associated Timeline pointer (if any)
Definition: Clip.h:278
openshot::Keyframe alpha
Curve representing the alpha (1 to 0)
Definition: Clip.h:304
FrameDisplayType
This enumeration determines the display format of the clip&#39;s frame number (if any). Useful for debugging.
Definition: Enums.h:51
openshot::Keyframe rotation
Curve representing the rotation (0 to 360)
Definition: Clip.h:307
openshot::Keyframe perspective_c1_x
Curves representing X for coordinate 1.
Definition: Clip.h:321
openshot::Keyframe has_audio
An optional override to determine if this clip has audio (-1=undefined, 0=no, 1=yes) ...
Definition: Clip.h:335
This abstract class is the base class, used by all clips in libopenshot.
Definition: ClipBase.h:33
openshot::Keyframe perspective_c4_x
Curves representing X for coordinate 4.
Definition: Clip.h:327
openshot::Keyframe perspective_c1_y
Curves representing Y for coordinate 1.
Definition: Clip.h:322
openshot::Keyframe origin_y
Curve representing Y origin point (0.0=0% (top), 1.0=100% (bottom))
Definition: Clip.h:311
openshot::Keyframe origin_x
Curve representing X origin point (0.0=0% (left), 1.0=100% (right))
Definition: Clip.h:310
openshot::Keyframe channel_mapping
A number representing an audio channel to output (only works when filtering a channel) ...
Definition: Clip.h:332
openshot::Keyframe perspective_c2_x
Curves representing X for coordinate 2.
Definition: Clip.h:323
openshot::Keyframe perspective_c3_y
Curves representing Y for coordinate 3.
Definition: Clip.h:326
int Order() const
Get the order that this effect should be executed.
Definition: EffectBase.h:112
Header file for Color class.
AnchorType
This enumeration determines what parent a clip should be aligned to.
Definition: Enums.h:44
bool IsOpen() override
Determine if reader is open or closed.
Definition: Clip.h:197
This class represents a color (used on the timeline and clips)
Definition: Color.h:27
Header file for TextReader class.
openshot::CacheMemory * GetCache() override
Get the cache object (always return NULL for this reader)
Definition: Clip.h:194
This namespace is the default namespace for all code in the openshot library.
Definition: Compressor.h:28
Header file for EffectBase class.
std::recursive_mutex getFrameMutex
Mutex for multiple threads.
Definition: Clip.h:94
This struct holds the associated video frame and starting sample # for an audio packet.
Definition: AudioLocation.h:25
openshot::ScaleType scale
The scale determines how a clip should be resized to fit its parent.
Definition: Clip.h:168
openshot::Keyframe shear_y
Curve representing Y shear angle in degrees (-45.0=down, 45.0=up)
Definition: Clip.h:309
openshot::Keyframe location_x
Curve representing the relative X position in percent based on the gravity (-1 to 1) ...
Definition: Clip.h:302
float Position() const
Get position on timeline (in seconds)
Definition: ClipBase.h:86
Header file for the TrackedObjectBase class.
Header file for the EffectInfo class.
A Keyframe is a collection of Point instances, which is used to vary a number or property over time...
Definition: KeyFrame.h:53
void Waveform(bool value)
Set the waveform property of this clip.
Definition: Clip.h:297
openshot::VolumeMixType mixing
What strategy should be followed when mixing audio with other clips.
Definition: Clip.h:171
openshot::AnchorType anchor
The anchor determines what parent a clip should snap to.
Definition: Clip.h:169
AudioLocation previous_location
Previous time-mapped audio location.
Definition: Clip.h:97
This class is a memory-based cache manager for Frame objects.
Definition: CacheMemory.h:29
GravityType
This enumeration determines how clips are aligned to their parent container.
Definition: Enums.h:21
int Layer() const
Get layer of clip on timeline (lower number is covered by higher numbers)
Definition: ClipBase.h:87
openshot::Keyframe perspective_c2_y
Curves representing Y for coordinate 2.
Definition: Clip.h:324
This class is used to resample audio data for many sequential frames.