OpenShot Library | libopenshot  0.3.3
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  bool is_writing;
120  bool is_open;
121  int64_t video_timestamp;
122  int64_t audio_timestamp;
123 
124  bool prepare_streams;
125  bool write_header;
126  bool write_trailer;
127 
128  AVFormatContext* oc;
129  AVStream *audio_st, *video_st;
130  AVCodecContext *video_codec_ctx;
131  AVCodecContext *audio_codec_ctx;
132  SwsContext *img_convert_ctx;
133  int16_t *samples;
134  uint8_t *audio_outbuf;
135  uint8_t *audio_encoder_buffer;
136 
137  int num_of_rescalers;
138  int rescaler_position;
139  std::vector<SwsContext *> image_rescalers;
140 
141  int audio_outbuf_size;
142  int audio_input_frame_size;
143  int initial_audio_input_frame_size;
144  int audio_input_position;
145  int audio_encoder_buffer_size;
146  SWRCONTEXT *avr;
147  SWRCONTEXT *avr_planar;
148 
149  /* Resample options */
150  int original_sample_rate;
151  int original_channels;
152 
153  std::shared_ptr<openshot::Frame> last_frame;
154  std::map<std::shared_ptr<openshot::Frame>, AVFrame *> av_frames;
155 
157  void add_avframe(std::shared_ptr<openshot::Frame> frame, AVFrame *av_frame);
158 
160  AVStream *add_audio_stream();
161 
163  AVStream *add_video_stream();
164 
166  AVFrame *allocate_avframe(PixelFormat pix_fmt, int width, int height, int *buffer_size, uint8_t *new_buffer);
167 
169  void auto_detect_format();
170 
172  void close_audio(AVFormatContext *oc, AVStream *st);
173 
175  void close_video(AVFormatContext *oc, AVStream *st);
176 
178  void flush_encoders();
179 
181  void initialize_streams();
182 
186  void InitScalers(int source_width, int source_height);
187 
189  void open_audio(AVFormatContext *oc, AVStream *st);
190 
192  void open_video(AVFormatContext *oc, AVStream *st);
193 
195  void process_video_packet(std::shared_ptr<openshot::Frame> frame);
196 
198  void write_audio_packets(bool is_final, std::shared_ptr<openshot::Frame> frame);
199 
201  bool write_video_packet(std::shared_ptr<openshot::Frame> frame, AVFrame *frame_final);
202 
204  void write_frame(std::shared_ptr<Frame> frame);
205 
206  public:
207 
212  FFmpegWriter(const std::string& path);
213 
215  void Close();
216 
218  bool IsOpen() { return is_open; };
219 
221  static bool IsValidCodec(std::string codec_name);
222 
224  void Open();
225 
227  void OutputStreamInfo();
228 
231  void PrepareStreams();
232 
234  void RemoveScalers();
235 
239  void ResampleAudio(int sample_rate, int channels);
240 
250  void SetAudioOptions(bool has_audio, std::string codec, int sample_rate, int channels, openshot::ChannelLayout channel_layout, int bit_rate);
251 
261  void SetAudioOptions(std::string codec, int sample_rate, int bit_rate);
262 
275  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);
276 
289  void SetVideoOptions(std::string codec, int width, int height, openshot::Fraction fps, int bit_rate);
290 
297  void SetOption(openshot::StreamType stream, std::string name, std::string value);
298 
301  void WriteHeader();
302 
307  void WriteFrame(std::shared_ptr<openshot::Frame> frame);
308 
315  void WriteFrame(openshot::ReaderBase *reader, int64_t start, int64_t length);
316 
319  void WriteTrailer();
320 
321  };
322 
323 }
324 
325 #endif
Header file for FFmpegUtilities.
#define PixelFormat
#define SWRCONTEXT
Header file for ReaderBase class.
Header file for WriterBase class.
This class uses the FFmpeg libraries, to write and encode video files and audio files.
Definition: FFmpegWriter.h:116
void Close()
Close the writer.
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 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...
void PrepareStreams()
Prepare & initialize streams and open codecs. This method is called automatically by the Open() metho...
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.
bool IsOpen()
Determine if writer is open or closed.
Definition: FFmpegWriter.h:218
void ResampleAudio(int sample_rate, int channels)
Set audio resample options.
void Open()
Open writer.
void WriteHeader()
Write the file header (after the options are set). This method is called automatically by the Open() ...
FFmpegWriter(const std::string &path)
Constructor for FFmpegWriter. Throws an exception on failure to open path.
static bool IsValidCodec(std::string codec_name)
Determine if codec name is valid.
void OutputStreamInfo()
Output the ffmpeg info about this format, streams, and codecs (i.e. dump format)
void WriteFrame(std::shared_ptr< openshot::Frame > frame)
Add a frame to the stack waiting to be encoded.
void WriteTrailer()
Write the file trailer (after all frames are written). This is called automatically by the Close() me...
void RemoveScalers()
Remove & deallocate all software scalers.
This class represents a fraction.
Definition: Fraction.h:30
This abstract class is the base class, used by all readers in libopenshot.
Definition: ReaderBase.h:76
This abstract class is the base class, used by writers. Writers are types of classes that encode vide...
Definition: WriterBase.h:70
This namespace is the default namespace for all code in the openshot library.
Definition: Compressor.h:29
ChannelLayout
This enumeration determines the audio channel layout (such as stereo, mono, 5 point surround,...
StreamType
This enumeration designates the type of stream when encoding (video or audio)
Definition: FFmpegWriter.h:28
@ AUDIO_STREAM
An audio stream (used to determine which type of stream)
Definition: FFmpegWriter.h:30
@ VIDEO_STREAM
A video stream (used to determine which type of stream)
Definition: FFmpegWriter.h:29