OpenShot Library | libopenshot  0.3.1
FFmpegWriter.h
Go to the documentation of this file.
1 
12 // Copyright (c) 2008-2019 OpenShot Studios, LLC, Fabrice Bellard
13 //
14 // SPDX-License-Identifier: LGPL-3.0-or-later
15 
16 #ifndef OPENSHOT_FFMPEG_WRITER_H
17 #define OPENSHOT_FFMPEG_WRITER_H
18 
19 #include "ReaderBase.h"
20 #include "WriterBase.h"
21 
22 // Include FFmpeg headers and macros
23 #include "FFmpegUtilities.h"
24 
25 namespace openshot {
26 
28  enum StreamType {
31  };
32 
116  class FFmpegWriter : public WriterBase {
117  private:
118  std::string path;
119  int cache_size;
120  bool is_writing;
121  bool is_open;
122  int64_t video_timestamp;
123  int64_t audio_timestamp;
124 
125  bool prepare_streams;
126  bool write_header;
127  bool write_trailer;
128 
129  AVFormatContext* oc;
130  AVStream *audio_st, *video_st;
131  AVCodecContext *video_codec_ctx;
132  AVCodecContext *audio_codec_ctx;
133  SwsContext *img_convert_ctx;
134  int16_t *samples;
135  uint8_t *audio_outbuf;
136  uint8_t *audio_encoder_buffer;
137 
138  int num_of_rescalers;
139  int rescaler_position;
140  std::vector<SwsContext *> image_rescalers;
141 
142  int audio_outbuf_size;
143  int audio_input_frame_size;
144  int initial_audio_input_frame_size;
145  int audio_input_position;
146  int audio_encoder_buffer_size;
147  SWRCONTEXT *avr;
148  SWRCONTEXT *avr_planar;
149 
150  /* Resample options */
151  int original_sample_rate;
152  int original_channels;
153 
154  std::shared_ptr<openshot::Frame> last_frame;
155  std::deque<std::shared_ptr<openshot::Frame> > spooled_audio_frames;
156  std::deque<std::shared_ptr<openshot::Frame> > spooled_video_frames;
157 
158  std::deque<std::shared_ptr<openshot::Frame> > queued_audio_frames;
159  std::deque<std::shared_ptr<openshot::Frame> > queued_video_frames;
160 
161  std::deque<std::shared_ptr<openshot::Frame> > processed_frames;
162  std::deque<std::shared_ptr<openshot::Frame> > deallocate_frames;
163 
164  std::map<std::shared_ptr<openshot::Frame>, AVFrame *> av_frames;
165 
167  void add_avframe(std::shared_ptr<openshot::Frame> frame, AVFrame *av_frame);
168 
170  AVStream *add_audio_stream();
171 
173  AVStream *add_video_stream();
174 
176  AVFrame *allocate_avframe(PixelFormat pix_fmt, int width, int height, int *buffer_size, uint8_t *new_buffer);
177 
179  void auto_detect_format();
180 
182  void close_audio(AVFormatContext *oc, AVStream *st);
183 
185  void close_video(AVFormatContext *oc, AVStream *st);
186 
188  void flush_encoders();
189 
191  void initialize_streams();
192 
196  void InitScalers(int source_width, int source_height);
197 
199  void open_audio(AVFormatContext *oc, AVStream *st);
200 
202  void open_video(AVFormatContext *oc, AVStream *st);
203 
205  void process_video_packet(std::shared_ptr<openshot::Frame> frame);
206 
208  void write_audio_packets(bool is_final);
209 
211  bool write_video_packet(std::shared_ptr<openshot::Frame> frame, AVFrame *frame_final);
212 
214  void write_queued_frames();
215 
216  public:
217 
222  FFmpegWriter(const std::string& path);
223 
225  void Close();
226 
228  int GetCacheSize() { return cache_size; };
229 
231  bool IsOpen() { return is_open; };
232 
234  static bool IsValidCodec(std::string codec_name);
235 
237  void Open();
238 
240  void OutputStreamInfo();
241 
244  void PrepareStreams();
245 
247  void RemoveScalers();
248 
252  void ResampleAudio(int sample_rate, int channels);
253 
263  void SetAudioOptions(bool has_audio, std::string codec, int sample_rate, int channels, openshot::ChannelLayout channel_layout, int bit_rate);
264 
274  void SetAudioOptions(std::string codec, int sample_rate, int bit_rate);
275 
278  void SetCacheSize(int new_size) { cache_size = new_size; };
279 
292  void SetVideoOptions(bool has_video, std::string codec, openshot::Fraction fps, int width, int height, openshot::Fraction pixel_ratio, bool interlaced, bool top_field_first, int bit_rate);
293 
306  void SetVideoOptions(std::string codec, int width, int height, openshot::Fraction fps, int bit_rate);
307 
314  void SetOption(openshot::StreamType stream, std::string name, std::string value);
315 
318  void WriteHeader();
319 
324  void WriteFrame(std::shared_ptr<openshot::Frame> frame);
325 
332  void WriteFrame(openshot::ReaderBase *reader, int64_t start, int64_t length);
333 
336  void WriteTrailer();
337 
338  };
339 
340 }
341 
342 #endif
A video stream (used to determine which type of stream)
Definition: FFmpegWriter.h:29
#define SWRCONTEXT
int GetCacheSize()
Get the cache size (number of frames to queue before writing)
Definition: FFmpegWriter.h:228
void OutputStreamInfo()
Output the ffmpeg info about this format, streams, and codecs (i.e. dump format)
An audio stream (used to determine which type of stream)
Definition: FFmpegWriter.h:30
Header file for ReaderBase class.
This class uses the FFmpeg libraries, to write and encode video files and audio files.
Definition: FFmpegWriter.h:116
static bool IsValidCodec(std::string codec_name)
Determine if codec name is valid.
This abstract class is the base class, used by all readers in libopenshot.
Definition: ReaderBase.h:75
bool IsOpen()
Determine if writer is open or closed.
Definition: FFmpegWriter.h:231
void WriteFrame(std::shared_ptr< openshot::Frame > frame)
Add a frame to the stack waiting to be encoded.
void Open()
Open writer.
void SetVideoOptions(bool has_video, std::string codec, openshot::Fraction fps, int width, int height, openshot::Fraction pixel_ratio, bool interlaced, bool top_field_first, int bit_rate)
Set video export options.
void SetAudioOptions(bool has_audio, std::string codec, int sample_rate, int channels, openshot::ChannelLayout channel_layout, int bit_rate)
Set audio export options.
void RemoveScalers()
Remove & deallocate all software scalers.
Header file for WriterBase class.
This abstract class is the base class, used by writers. Writers are types of classes that encode vide...
Definition: WriterBase.h:69
This class represents a fraction.
Definition: Fraction.h:30
void ResampleAudio(int sample_rate, int channels)
Set audio resample options.
ChannelLayout
This enumeration determines the audio channel layout (such as stereo, mono, 5 point surround...
void SetCacheSize(int new_size)
Set the cache size.
Definition: FFmpegWriter.h:278
#define PixelFormat
void WriteTrailer()
Write the file trailer (after all frames are written). This is called automatically by the Close() me...
void WriteHeader()
Write the file header (after the options are set). This method is called automatically by the Open() ...
void Close()
Close the writer.
This namespace is the default namespace for all code in the openshot library.
Definition: Compressor.h:28
void PrepareStreams()
Prepare & initialize streams and open codecs. This method is called automatically by the Open() metho...
Header file for FFmpegUtilities.
FFmpegWriter(const std::string &path)
Constructor for FFmpegWriter. Throws an exception on failure to open path.
void SetOption(openshot::StreamType stream, std::string name, std::string value)
Set custom options (some codecs accept additional params). This must be called after the PrepareStrea...
StreamType
This enumeration designates the type of stream when encoding (video or audio)
Definition: FFmpegWriter.h:28