OpenShot Library | libopenshot  0.6.0
Frame.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_FRAME_H
14 #define OPENSHOT_FRAME_H
15 
16 #ifdef USE_OPENCV
17  #define int64 opencv_broken_int
18  #define uint64 opencv_broken_uint
19  #include <opencv2/imgproc/imgproc.hpp>
20  #undef uint64
21  #undef int64
22 #endif
23 
24 #include <memory>
25 #include <mutex>
26 
27 #include "ChannelLayouts.h"
28 #include "Enums.h"
29 #include "Fraction.h"
30 
31 #include <QColor>
32 #include <QImage>
33 
34 class QApplication;
35 
36 namespace juce {
37  template <typename Type> class AudioBuffer;
38 }
39 
40 namespace openshot
41 {
42  class AudioBufferSource;
43  class AudioResampler;
89  class Frame
90  {
91  private:
92  std::shared_ptr<QImage> image;
93  std::shared_ptr<QImage> wave_image;
94 
95  std::shared_ptr<QApplication> previewApp;
96  std::recursive_mutex addingImageMutex;
97  std::recursive_mutex addingAudioMutex;
98  openshot::Fraction pixel_ratio;
99  int channels;
100  ChannelLayout channel_layout;
101  int width;
102  int height;
103  int sample_rate;
104  std::string color;
105  int64_t max_audio_sample;
106  bool audio_is_increasing;
107 
108 #ifdef USE_OPENCV
109  cv::Mat imagecv;
110 #endif
111 
113  int constrain(int color_value);
114 
115  public:
116  std::shared_ptr<juce::AudioBuffer<float>> audio;
117  int64_t number;
120 
121 
123  Frame();
124 
126  Frame(int64_t number, int width, int height, std::string color);
127 
129  Frame(int64_t number, int samples, int channels);
130 
132  Frame(int64_t number, int width, int height, std::string color, int samples, int channels);
133 
135  Frame ( const Frame &other );
136 
138  Frame& operator= (const Frame& other);
139 
141  virtual ~Frame();
142 
144  void AddColor(int new_width, int new_height, std::string new_color);
145 
147  void AddColor(const QColor& new_color);
148 
150  void AddImage(int new_width, int new_height, int bytes_per_pixel, QImage::Format type, const unsigned char *pixels_);
151 
153  void AddImage(std::shared_ptr<QImage> new_image);
154 
156  void AddImage(std::shared_ptr<QImage> new_image, bool only_odd_lines);
157 
159  void AddAudio(bool replaceSamples, int destChannel, int destStartSample, const float* source, int numSamples, float gainToApplyToSource);
160 
162  void AddAudioSilence(int numSamples);
163 
165  void ApplyGainRamp(int destChannel, int destStartSample, int numSamples, float initial_gain, float final_gain);
166 
170 
171  // Set the channel layout of audio samples (i.e. mono, stereo, 5 point surround, etc...)
172  void ChannelsLayout(openshot::ChannelLayout new_channel_layout) { channel_layout = new_channel_layout; };
173 
175  void ClearWaveform();
176 
178  void DeepCopy(const Frame& other);
179 
181  void Display();
182 
184  void DisplayWaveform();
185 
187  float GetAudioSample(int channel, int sample, int magnitude_range);
188 
190  float* GetAudioSamples(int channel);
191 
193  float* GetInterleavedAudioSamples(int* sample_count);
194 
196  int GetAudioChannelsCount();
197 
199  int GetAudioSamplesCount();
200 
202 
204  int64_t GetBytes();
205 
207  std::shared_ptr<QImage> GetImage();
208 
210  openshot::Fraction GetPixelRatio() { return pixel_ratio; };
211 
213  const unsigned char* GetPixels();
214 
216  const unsigned char* GetPixels(int row);
217 
219  bool CheckPixel(int row, int col, int red, int green, int blue, int alpha, int threshold);
220 
222  int GetHeight();
223 
225  int GetSamplesPerFrame(openshot::Fraction fps, int sample_rate, int channels);
226 
228  static int GetSamplesPerFrame(int64_t frame_number, openshot::Fraction fps, int sample_rate, int channels);
229 
231  std::shared_ptr<QImage> GetWaveform(int width, int height, int Red, int Green, int Blue, int Alpha);
232 
234  const unsigned char* GetWaveformPixels(int width, int height, int Red, int Green, int Blue, int Alpha);
235 
237  int GetWidth();
238 
240  void ResizeAudio(int channels, int length, int sample_rate, openshot::ChannelLayout channel_layout);
241 
243  int SampleRate();
244 
246  void SampleRate(int orig_sample_rate) { sample_rate = orig_sample_rate; };
247 
249  void SetAudioDirection(bool is_increasing);
250 
252  void Save(std::string path, float scale, std::string format="PNG", int quality=100);
253 
255  void SetFrameNumber(int64_t number);
256 
258  void SetPixelRatio(int num, int den);
259 
264  void Thumbnail(std::string path, int new_width, int new_height, std::string mask_path, std::string overlay_path,
265  std::string background_color, bool ignore_aspect, std::string format="png", int quality=100,
266  float rotate=0.0, ScaleType scale_mode=SCALE_FIT);
267 
269  void Play();
270 
271 #ifdef USE_OPENCV
272  cv::Mat Qimage2mat( std::shared_ptr<QImage>& qimage);
274 
276  std::shared_ptr<QImage> Mat2Qimage(cv::Mat img);
277 
279  cv::Mat GetImageCV();
280 
282  void SetImageCV(cv::Mat _image);
283 #endif
284  };
285 
286 }
287 
288 #endif
openshot::Frame::GetWaveformPixels
const unsigned char * GetWaveformPixels(int width, int height, int Red, int Green, int Blue, int Alpha)
Get an audio waveform image pixels.
Definition: Frame.cpp:258
openshot::Frame::SampleRate
int SampleRate()
Get the original sample rate of this frame's audio data.
Definition: Frame.cpp:502
ChannelLayouts.h
Header file for ChannelLayout class.
openshot::Frame::operator=
Frame & operator=(const Frame &other)
Assignment operator.
Definition: Frame.cpp:77
Fraction.h
Header file for Fraction class.
openshot::Frame::GetAudioSamples
float * GetAudioSamples(int channel)
Get an array of sample data (and optional reverse the sample values)
Definition: Frame.cpp:314
openshot::Frame::SetFrameNumber
void SetFrameNumber(int64_t number)
Set frame number.
Definition: Frame.cpp:450
openshot::Frame::has_audio_data
bool has_audio_data
This frame has been loaded with audio data.
Definition: Frame.h:118
openshot
This namespace is the default namespace for all code in the openshot library.
Definition: Compressor.h:28
juce::AudioBuffer
Definition: Frame.h:37
openshot::Fraction
This class represents a fraction.
Definition: Fraction.h:30
openshot::Frame::GetPixelRatio
openshot::Fraction GetPixelRatio()
Set Pixel Aspect Ratio.
Definition: Frame.h:210
openshot::Frame
This class represents a single frame of video (i.e. image & audio data)
Definition: Frame.h:89
openshot::Frame::ChannelsLayout
void ChannelsLayout(openshot::ChannelLayout new_channel_layout)
Definition: Frame.h:172
openshot::Frame::has_image_data
bool has_image_data
This frame has been loaded with pixel data.
Definition: Frame.h:119
openshot::Frame::AddAudioSilence
void AddAudioSilence(int numSamples)
Add audio silence.
Definition: Frame.cpp:1001
openshot::Frame::GetBytes
int64_t GetBytes()
Get the size in bytes of this frame (rough estimate)
Definition: Frame.cpp:380
openshot::Frame::ResizeAudio
void ResizeAudio(int channels, int length, int sample_rate, openshot::ChannelLayout channel_layout)
Resize audio container to hold more (or less) samples and channels.
Definition: Frame.cpp:804
openshot::Frame::GetPixels
const unsigned char * GetPixels()
Get pixel data (as packets)
Definition: Frame.cpp:397
openshot::Frame::AddImage
void AddImage(int new_width, int new_height, int bytes_per_pixel, QImage::Format type, const unsigned char *pixels_)
Add (or replace) pixel data to the frame.
Definition: Frame.cpp:712
juce
Definition: Robotization.h:29
openshot::Frame::ApplyGainRamp
void ApplyGainRamp(int destChannel, int destStartSample, int numSamples, float initial_gain, float final_gain)
Apply gain ramp (i.e. fading volume)
Definition: Frame.cpp:861
openshot::Frame::GetAudioChannelsCount
int GetAudioChannelsCount()
Get number of audio channels.
Definition: Frame.cpp:358
openshot::Frame::GetHeight
int GetHeight()
Get height of image.
Definition: Frame.cpp:490
path
path
Definition: FFmpegWriter.cpp:1474
openshot::Frame::GetSamplesPerFrame
int GetSamplesPerFrame(openshot::Fraction fps, int sample_rate, int channels)
Calculate the # of samples per video frame (for the current frame number)
Definition: Frame.cpp:484
openshot::Frame::GetInterleavedAudioSamples
float * GetInterleavedAudioSamples(int *sample_count)
Get an array of sample data (all channels interleaved together), using any sample rate.
Definition: Frame.cpp:324
openshot::SCALE_FIT
@ SCALE_FIT
Scale the clip until either height or width fills the canvas (with no cropping)
Definition: Enums.h:38
openshot::Frame::CheckPixel
bool CheckPixel(int row, int col, int red, int green, int blue, int alpha, int threshold)
Check a specific pixel color value (returns True/False)
Definition: Frame.cpp:421
openshot::Frame::GetWaveform
std::shared_ptr< QImage > GetWaveform(int width, int height, int Red, int Green, int Blue, int Alpha)
Get an audio waveform image.
Definition: Frame.cpp:159
openshot::Frame::AddAudio
void AddAudio(bool replaceSamples, int destChannel, int destStartSample, const float *source, int numSamples, float gainToApplyToSource)
Add audio samples to a specific channel.
Definition: Frame.cpp:830
openshot::Frame::SampleRate
void SampleRate(int orig_sample_rate)
Set the original sample rate of this frame's audio data.
Definition: Frame.h:246
openshot::Frame::Thumbnail
void Thumbnail(std::string path, int new_width, int new_height, std::string mask_path, std::string overlay_path, std::string background_color, bool ignore_aspect, std::string format="png", int quality=100, float rotate=0.0, ScaleType scale_mode=SCALE_FIT)
Definition: Frame.cpp:543
openshot::Frame::GetWidth
int GetWidth()
Get height of image.
Definition: Frame.cpp:496
openshot::Frame::audio
std::shared_ptr< juce::AudioBuffer< float > > audio
Definition: Frame.h:116
Enums.h
Header file for TextReader class.
openshot::Frame::ClearWaveform
void ClearWaveform()
Clear the waveform image (and deallocate its memory)
Definition: Frame.cpp:251
openshot::Frame::SetPixelRatio
void SetPixelRatio(int num, int den)
Set Pixel Aspect Ratio.
Definition: Frame.cpp:443
openshot::Frame::Save
void Save(std::string path, float scale, std::string format="PNG", int quality=100)
Save the frame image to the specified path. The image format can be BMP, JPG, JPEG,...
Definition: Frame.cpp:515
openshot::Frame::GetImage
std::shared_ptr< QImage > GetImage()
Get pointer to Qt QImage image object.
Definition: Frame.cpp:870
openshot::Frame::SetAudioDirection
void SetAudioDirection(bool is_increasing)
Set the direction of the audio buffer of this frame.
Definition: Frame.cpp:818
openshot::Frame::GetImageCV
cv::Mat GetImageCV()
Get pointer to OpenCV Mat image object.
Definition: Frame.cpp:894
openshot::Frame::ChannelsLayout
openshot::ChannelLayout ChannelsLayout()
Definition: Frame.cpp:508
openshot::Frame::GetAudioSampleBuffer
juce::AudioBuffer< float > * GetAudioSampleBuffer()
Definition: Frame.cpp:374
openshot::ScaleType
ScaleType
This enumeration determines how clips are scaled to fit their parent container.
Definition: Enums.h:35
openshot::ChannelLayout
ChannelLayout
This enumeration determines the audio channel layout (such as stereo, mono, 5 point surround,...
Definition: ChannelLayouts.h:28
openshot::Frame::Play
void Play()
Play audio samples for this frame.
Definition: Frame.cpp:930
openshot::Frame::DeepCopy
void DeepCopy(const Frame &other)
Copy data and pointers from another Frame instance.
Definition: Frame.cpp:86
openshot::Frame::GetAudioSample
float GetAudioSample(int channel, int sample, int magnitude_range)
Get magnitude of range of samples (if channel is -1, return average of all channels for that sample)
Definition: Frame.cpp:301
openshot::Frame::number
int64_t number
This is the frame number (starting at 1)
Definition: Frame.h:117
openshot::Frame::Mat2Qimage
std::shared_ptr< QImage > Mat2Qimage(cv::Mat img)
Convert OpenCV Mat to QImage.
Definition: Frame.cpp:908
openshot::Frame::SetImageCV
void SetImageCV(cv::Mat _image)
Set pointer to OpenCV image object.
Definition: Frame.cpp:922
openshot::Frame::Display
void Display()
Display the frame image to the screen (primarily used for debugging reasons)
Definition: Frame.cpp:120
openshot::Frame::~Frame
virtual ~Frame()
Destructor.
Definition: Frame.cpp:110
openshot::Frame::Qimage2mat
cv::Mat Qimage2mat(std::shared_ptr< QImage > &qimage)
Convert Qimage to Mat.
Definition: Frame.cpp:883
openshot::Frame::Frame
Frame()
Constructor - blank frame.
Definition: Frame.cpp:58
openshot::Frame::GetAudioSamplesCount
int GetAudioSamplesCount()
Get number of audio samples.
Definition: Frame.cpp:368
openshot::Frame::AddColor
void AddColor(int new_width, int new_height, std::string new_color)
Add (or replace) pixel data to the frame (based on a solid color)
Definition: Frame.cpp:689
openshot::Frame::DisplayWaveform
void DisplayWaveform()
Display the wave form.
Definition: Frame.cpp:268