OpenShot Library | libopenshot 0.6.0
Loading...
Searching...
No Matches
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
25namespace openshot {
26
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
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.
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.
void ResampleAudio(int sample_rate, int channels)
Set audio resample options.
void Open()
Open writer.
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.
void WriteHeader()
Write the file header (after the options are set). This method is called automatically by the Open() ...
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...
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)
@ AUDIO_STREAM
An audio stream (used to determine which type of stream)
@ VIDEO_STREAM
A video stream (used to determine which type of stream)