OpenShot Library | libopenshot 1.1.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
40namespace 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
90 protected:
92 std::recursive_mutex getFrameMutex;
93
96
98 void init_settings();
99
102
105
106 private:
107 enum class ReaderOrientationMode {
108 Reader,
109 LegacyClipTransform
110 };
111
112 bool waveform;
113 int waveform_mode;
114 ReaderOrientationMode reader_orientation_mode;
115 std::list<openshot::EffectBase*> effects;
116 bool is_open;
117 std::string parentObjectId;
118 std::shared_ptr<openshot::TrackedObjectBase> parentTrackedObject;
119 openshot::Clip* parentClipObject;
120
122 CacheMemory final_cache;
123
124 // Audio resampler (if time mapping)
125 openshot::AudioResampler *resampler;
126
127 // File Reader object
128 openshot::ReaderBase* reader;
129
132 openshot::ReaderBase* allocated_reader;
133
135 int64_t adjust_frame_number_minimum(int64_t frame_number);
136
138 void apply_background(std::shared_ptr<openshot::Frame> frame,
139 std::shared_ptr<openshot::Frame> background_frame,
140 bool update_frame_image = true);
141
143 void apply_effects(std::shared_ptr<openshot::Frame> frame, int64_t timeline_frame_number, TimelineInfoStruct* options, bool before_keyframes);
144
146 void apply_keyframes(std::shared_ptr<Frame> frame, QSize timeline_size);
147
149 void apply_waveform(std::shared_ptr<Frame> frame, QSize timeline_size);
150
152 int64_t adjust_timeline_framenumber(int64_t clip_frame_number);
153
155 QTransform get_transform(std::shared_ptr<Frame> frame, int width, int height);
156
158 static std::string get_file_extension(std::string path);
159
161 std::shared_ptr<openshot::Frame> GetOrCreateFrame(int64_t number, bool enable_time=true);
162
164 double resolve_timeline_fps() const;
165
167 int64_t curve_extent_frames() const;
168
170 int64_t trim_extent_frames(double fps_value) const;
171
173 void apply_timemapping(std::shared_ptr<openshot::Frame> frame);
174
176 bool isNear(double a, double b);
177
179 void sort_effects();
180
182 QSize scale_size(QSize source_size, ScaleType source_scale, int target_width, int target_height);
183
184 public:
194
195 #ifdef USE_OPENCV
196 bool COMPILED_WITH_CV = true;
197 #else
198 bool COMPILED_WITH_CV = false;
199 #endif
200
202 Clip();
203
206 Clip(std::string path);
207
210 static openshot::ReaderBase* CreateReader(std::string path, bool inspect_reader=true);
211
214 Clip(openshot::ReaderBase* new_reader);
215
217 virtual ~Clip();
218
220 openshot::CacheMemory* GetCache() override { return &final_cache; };
221
223 bool IsOpen() override { return is_open; };
224
226 std::string GetAttachedId() const { return parentObjectId; };
228 void SetAttachedId(std::string value) { parentObjectId = value; };
229
231 void AttachToObject(std::string object_id);
232
234 void SetAttachedObject(std::shared_ptr<openshot::TrackedObjectBase> trackedObject);
236 void SetAttachedClip(Clip* clipObject);
238 std::shared_ptr<openshot::TrackedObjectBase> GetAttachedObject() const { return parentTrackedObject; };
240 Clip* GetAttachedClip() const { return parentClipObject; };
241
243 std::string Name() override { return "Clip"; };
244
247 void AddEffect(openshot::EffectBase* effect);
248
250 void Close() override;
251
254
256 std::shared_ptr<openshot::TrackedObjectBase> GetParentTrackedObject();
257
259 std::list<openshot::EffectBase*> Effects() { return effects; };
260
262 openshot::EffectBase* GetEffect(const std::string& id);
263
269 std::shared_ptr<openshot::Frame> GetFrame(int64_t clip_frame_number) override;
270
281 std::shared_ptr<openshot::Frame> GetFrame(std::shared_ptr<openshot::Frame> background_frame, int64_t clip_frame_number) override;
282
295 std::shared_ptr<openshot::Frame> GetFrame(std::shared_ptr<openshot::Frame> background_frame, int64_t clip_frame_number, openshot::TimelineInfoStruct* options);
296
298 void Open() override;
299
302 void Reader(openshot::ReaderBase* new_reader);
303
306
307 // Override End() position (in seconds) of clip (trim end of video)
308 float End() const override;
309 void End(float value) override;
311 void ParentTimeline(openshot::TimelineBase* new_timeline) override;
312
313 // Get and Set JSON methods
314 std::string Json() const override;
315 void SetJson(const std::string value) override;
316 Json::Value JsonValue() const override;
317 void SetJsonValue(const Json::Value root) override;
318
321 std::string PropertiesJSON(int64_t requested_frame) const override;
322
326
327 // Waveform property
328 bool Waveform() { return waveform; }
329 void Waveform(bool value) { waveform = value; }
330 int WaveformMode() { return waveform_mode; }
331 void WaveformMode(int value) { waveform_mode = value; }
332
333 // Scale, Location, and Alpha curves
341
342 // Rotation and Shear curves (origin point (x,y) is adjustable for both rotation and shear)
348
349 // Time and Volume curves
352
355
356 // Perspective curves
365
366 // Audio channel filter and mappings
369
370 // Override has_video and has_audio properties of clip (and their readers)
373 };
374} // namespace
375
376#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:90
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:89
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:336
void WaveformMode(int value)
Set the waveform visualization mode.
Definition: Clip.h:331
openshot::Keyframe scale_x
Curve representing the horizontal scaling in percent (0 to 1)
Definition: Clip.h:334
openshot::Keyframe location_y
Curve representing the relative Y position in percent based on the gravity (-1 to 1)
Definition: Clip.h:337
openshot::Keyframe shear_x
Curve representing X shear angle in degrees (-45.0=left, 45.0=right)
Definition: Clip.h:344
openshot::Keyframe perspective_c4_x
Curves representing X for coordinate 4.
Definition: Clip.h:363
openshot::AnchorType anchor
The anchor determines what parent a clip should snap to.
Definition: Clip.h:190
openshot::VolumeMixType mixing
What strategy should be followed when mixing audio with other clips.
Definition: Clip.h:192
int WaveformMode()
Get the waveform visualization mode.
Definition: Clip.h:330
void Open() override
Open the internal reader.
Definition: Clip.cpp:393
std::shared_ptr< openshot::TrackedObjectBase > GetAttachedObject() const
Return a pointer to the trackedObject this clip is attached to.
Definition: Clip.h:238
std::string GetAttachedId() const
Get and set the object id that this clip is attached to.
Definition: Clip.h:226
openshot::Keyframe rotation
Curve representing the rotation (0 to 360)
Definition: Clip.h:343
openshot::Keyframe channel_filter
A number representing an audio channel to filter (clears all other channels)
Definition: Clip.h:367
openshot::FrameDisplayType display
The format to display the frame number (if any)
Definition: Clip.h:191
void init_reader_rotation()
Update default rotation from reader.
Definition: Clip.cpp:157
Clip()
Default Constructor.
Definition: Clip.cpp:213
openshot::Keyframe perspective_c1_x
Curves representing X for coordinate 1.
Definition: Clip.h:357
void AttachToObject(std::string object_id)
Attach clip to Tracked Object or to another Clip.
Definition: Clip.cpp:313
std::string Json() const override
Generate JSON string of this object.
Definition: Clip.cpp:824
openshot::EffectBase * GetEffect(const std::string &id)
Look up an effect by ID.
Definition: Clip.cpp:546
void SetJsonValue(const Json::Value root) override
Load Json::Value into this object.
Definition: Clip.cpp:1054
openshot::CacheMemory * GetCache() override
Get the cache object (always return NULL for this reader)
Definition: Clip.h:220
openshot::Keyframe alpha
Curve representing the alpha (1 to 0)
Definition: Clip.h:338
openshot::Keyframe has_audio
An optional override to determine if this clip has audio (-1=undefined, 0=no, 1=yes)
Definition: Clip.h:371
openshot::Keyframe perspective_c3_x
Curves representing X for coordinate 3.
Definition: Clip.h:361
void init_reader_settings()
Init reader info details.
Definition: Clip.cpp:144
openshot::Keyframe perspective_c1_y
Curves representing Y for coordinate 1.
Definition: Clip.h:358
Json::Value JsonValue() const override
Generate Json::Value for this object.
Definition: Clip.cpp:967
void SetAttachedClip(Clip *clipObject)
Set the pointer to the clip this clip is attached to.
Definition: Clip.cpp:341
openshot::TimelineBase * ParentTimeline() override
Get the associated Timeline pointer (if any)
Definition: Clip.h:310
openshot::Keyframe perspective_c4_y
Curves representing Y for coordinate 4.
Definition: Clip.h:364
openshot::Keyframe time
Curve representing the frames over time to play (used for speed and direction of video)
Definition: Clip.h:350
openshot::Clip * GetParentClip()
Return the associated ParentClip (if any)
Definition: Clip.cpp:558
bool Waveform()
Get the waveform property of this clip.
Definition: Clip.h:328
openshot::CompositeType composite
How this clip is composited onto lower layers.
Definition: Clip.h:193
openshot::GravityType gravity
The gravity of a clip determines where it snaps to its parent.
Definition: Clip.h:185
std::list< openshot::EffectBase * > Effects()
Return the list of effects on the timeline.
Definition: Clip.h:259
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:362
std::shared_ptr< openshot::TrackedObjectBase > GetParentTrackedObject()
Return the associated Parent Tracked Object (if any)
Definition: Clip.cpp:567
void AddEffect(openshot::EffectBase *effect)
Add an effect to the clip.
Definition: Clip.cpp:1296
void Close() override
Close the internal reader.
Definition: Clip.cpp:414
void Waveform(bool value)
Set the waveform property of this clip.
Definition: Clip.h:329
virtual ~Clip()
Destructor.
Definition: Clip.cpp:293
openshot::Keyframe perspective_c2_y
Curves representing Y for coordinate 2.
Definition: Clip.h:360
std::string location_coordinate_system
Definition: Clip.h:189
openshot::Keyframe volume
Curve representing the volume (0 to 1)
Definition: Clip.h:351
openshot::Keyframe shear_y
Curve representing Y shear angle in degrees (-45.0=down, 45.0=up)
Definition: Clip.h:345
Clip * GetAttachedClip() const
Return a pointer to the clip this clip is attached to.
Definition: Clip.h:240
openshot::Keyframe scale_y
Curve representing the vertical scaling in percent (0 to 1)
Definition: Clip.h:335
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:429
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:464
std::string Name() override
Return the type name of the class.
Definition: Clip.h:243
openshot::ReaderBase * Reader()
Get the current reader.
Definition: Clip.cpp:383
void RemoveEffect(openshot::EffectBase *effect)
Remove an effect from the clip.
Definition: Clip.cpp:1343
void SetAttachedId(std::string value)
Set id of the object id that this clip is attached to.
Definition: Clip.h:228
openshot::Keyframe channel_mapping
A number representing an audio channel to output (only works when filtering a channel)
Definition: Clip.h:368
openshot::Keyframe has_video
An optional override to determine if this clip has video (-1=undefined, 0=no, 1=yes)
Definition: Clip.h:372
openshot::Keyframe corner_radius
Curve representing corner radius as a percent of the clip's shortest side.
Definition: Clip.h:340
std::string PropertiesJSON(int64_t requested_frame) const override
Definition: Clip.cpp:831
bool COMPILED_WITH_CV
Definition: Clip.h:196
openshot::Color wave_color
Curve representing the color of the audio wave form.
Definition: Clip.h:354
void init_settings()
Init default settings for a clip.
Definition: Clip.cpp:73
openshot::Keyframe perspective_c2_x
Curves representing X for coordinate 2.
Definition: Clip.h:359
static openshot::ReaderBase * CreateReader(std::string path, bool inspect_reader=true)
Definition: Clip.cpp:255
openshot::Keyframe margin
Curve representing edge margin as a percent of the canvas' shortest side.
Definition: Clip.h:339
openshot::ScaleType scale
Definition: Clip.h:186
openshot::Keyframe location_x
Curve representing the relative X position in percent based on the gravity (-1 to 1)
Definition: Clip.h:336
openshot::Keyframe origin_x
Curve representing X origin point (0.0=0% (left), 1.0=100% (right))
Definition: Clip.h:346
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:1037
openshot::Keyframe origin_y
Curve representing Y origin point (0.0=0% (top), 1.0=100% (bottom))
Definition: Clip.h:347
bool IsOpen() override
Determine if reader is open or closed.
Definition: Clip.h:223
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
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: AnimatedCurve.h:24
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:26
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