OpenShot Library | libopenshot  0.5.0
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  bool allow_b_frames;
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  AVFrame *persistent_src_frame = nullptr;
139  AVFrame *persistent_dst_frame = nullptr;
140  uint8_t *persistent_dst_buffer = nullptr;
141  int persistent_dst_size = 0;
142 
143  int audio_outbuf_size;
144  int audio_input_frame_size;
145  int initial_audio_input_frame_size;
146  int audio_input_position;
147  int audio_encoder_buffer_size;
148  SWRCONTEXT *avr;
149  SWRCONTEXT *avr_planar;
150 
151  /* Resample options */
152  int original_sample_rate;
153  int original_channels;
154 
155  std::shared_ptr<openshot::Frame> last_frame;
156  std::map<std::shared_ptr<openshot::Frame>, AVFrame *> av_frames;
157 
159  void add_avframe(std::shared_ptr<openshot::Frame> frame, AVFrame *av_frame);
160 
162  AVStream *add_audio_stream();
163 
165  AVStream *add_video_stream();
166 
168  AVFrame *allocate_avframe(PixelFormat pix_fmt, int width, int height, int *buffer_size, uint8_t *new_buffer);
169 
171  void auto_detect_format();
172 
174  void close_audio(AVFormatContext *oc, AVStream *st);
175 
177  void close_video(AVFormatContext *oc, AVStream *st);
178 
180  void flush_encoders();
181 
183  void initialize_streams();
184 
186  void open_audio(AVFormatContext *oc, AVStream *st);
187 
189  void open_video(AVFormatContext *oc, AVStream *st);
190 
192  void process_video_packet(std::shared_ptr<openshot::Frame> frame);
193 
195  void write_audio_packets(bool is_final, std::shared_ptr<openshot::Frame> frame);
196 
198  bool write_video_packet(std::shared_ptr<openshot::Frame> frame, AVFrame *frame_final);
199 
201  void write_frame(std::shared_ptr<Frame> frame);
202 
203  public:
204 
209  FFmpegWriter(const std::string& path);
210 
212  void Close();
213 
215  bool IsOpen() { return is_open; };
216 
218  static bool IsValidCodec(std::string codec_name);
219 
221  void Open();
222 
224  void OutputStreamInfo();
225 
228  void PrepareStreams();
229 
233  void ResampleAudio(int sample_rate, int channels);
234 
244  void SetAudioOptions(bool has_audio, std::string codec, int sample_rate, int channels, openshot::ChannelLayout channel_layout, int bit_rate);
245 
255  void SetAudioOptions(std::string codec, int sample_rate, int bit_rate);
256 
269  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);
270 
283  void SetVideoOptions(std::string codec, int width, int height, openshot::Fraction fps, int bit_rate);
284 
291  void SetOption(openshot::StreamType stream, std::string name, std::string value);
292 
295  void WriteHeader();
296 
301  void WriteFrame(std::shared_ptr<openshot::Frame> frame);
302 
309  void WriteFrame(openshot::ReaderBase *reader, int64_t start, int64_t length);
310 
313  void WriteTrailer();
314 
320  void AddSphericalMetadata(const std::string& projection="equirectangular", float yaw_deg=0.0f, float pitch_deg=0.0f, float roll_deg=0.0f);
321 
322  };
323 
324 } // namespace openshot
325 
326 #endif
openshot::AUDIO_STREAM
@ AUDIO_STREAM
An audio stream (used to determine which type of stream)
Definition: FFmpegWriter.h:30
FFmpegUtilities.h
Header file for FFmpegUtilities.
WriterBase.h
Header file for WriterBase class.
openshot::FFmpegWriter::ResampleAudio
void ResampleAudio(int sample_rate, int channels)
Set audio resample options.
Definition: FFmpegWriter.cpp:2372
openshot::FFmpegWriter::OutputStreamInfo
void OutputStreamInfo()
Output the ffmpeg info about this format, streams, and codecs (i.e. dump format)
Definition: FFmpegWriter.cpp:2366
PixelFormat
#define PixelFormat
Definition: FFmpegUtilities.h:107
openshot
This namespace is the default namespace for all code in the openshot library.
Definition: Compressor.h:28
openshot::Fraction
This class represents a fraction.
Definition: Fraction.h:30
openshot::FFmpegWriter::FFmpegWriter
FFmpegWriter(const std::string &path)
Constructor for FFmpegWriter. Throws an exception on failure to open path.
Definition: FFmpegWriter.cpp:76
openshot::FFmpegWriter::Open
void Open()
Open writer.
Definition: FFmpegWriter.cpp:96
openshot::FFmpegWriter::SetVideoOptions
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.
Definition: FFmpegWriter.cpp:165
openshot::FFmpegWriter
This class uses the FFmpeg libraries, to write and encode video files and audio files.
Definition: FFmpegWriter.h:116
openshot::FFmpegWriter::IsOpen
bool IsOpen()
Determine if writer is open or closed.
Definition: FFmpegWriter.h:215
openshot::FFmpegWriter::AddSphericalMetadata
void AddSphericalMetadata(const std::string &projection="equirectangular", float yaw_deg=0.0f, float pitch_deg=0.0f, float roll_deg=0.0f)
Add spherical (360°) video metadata to the video stream.
Definition: FFmpegWriter.cpp:2378
openshot::FFmpegWriter::SetOption
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...
Definition: FFmpegWriter.cpp:335
SWRCONTEXT
#define SWRCONTEXT
Definition: FFmpegUtilities.h:155
openshot::VIDEO_STREAM
@ VIDEO_STREAM
A video stream (used to determine which type of stream)
Definition: FFmpegWriter.h:29
path
path
Definition: FFmpegWriter.cpp:1474
openshot::FFmpegWriter::WriteFrame
void WriteFrame(std::shared_ptr< openshot::Frame > frame)
Add a frame to the stack waiting to be encoded.
Definition: FFmpegWriter.cpp:672
ReaderBase.h
Header file for ReaderBase class.
openshot::FFmpegWriter::Close
void Close()
Close the writer.
Definition: FFmpegWriter.cpp:962
openshot::FFmpegWriter::IsValidCodec
static bool IsValidCodec(std::string codec_name)
Determine if codec name is valid.
Definition: FFmpegWriter.cpp:604
openshot::FFmpegWriter::WriteTrailer
void WriteTrailer()
Write the file trailer (after all frames are written). This is called automatically by the Close() me...
Definition: FFmpegWriter.cpp:749
openshot::ReaderBase
This abstract class is the base class, used by all readers in libopenshot.
Definition: ReaderBase.h:75
codec
codec
Definition: FFmpegWriter.cpp:1470
openshot::ChannelLayout
ChannelLayout
This enumeration determines the audio channel layout (such as stereo, mono, 5 point surround,...
Definition: ChannelLayouts.h:28
openshot::FFmpegWriter::SetAudioOptions
void SetAudioOptions(bool has_audio, std::string codec, int sample_rate, int channels, openshot::ChannelLayout channel_layout, int bit_rate)
Set audio export options.
Definition: FFmpegWriter.cpp:288
openshot::StreamType
StreamType
This enumeration designates the type of stream when encoding (video or audio)
Definition: FFmpegWriter.h:28
openshot::FFmpegWriter::PrepareStreams
void PrepareStreams()
Prepare & initialize streams and open codecs. This method is called automatically by the Open() metho...
Definition: FFmpegWriter.cpp:613
openshot::FFmpegWriter::WriteHeader
void WriteHeader()
Write the file header (after the options are set). This method is called automatically by the Open() ...
Definition: FFmpegWriter.cpp:630
openshot::WriterBase
This abstract class is the base class, used by writers. Writers are types of classes that encode vide...
Definition: WriterBase.h:69