OpenShot Library | libopenshot 0.5.0
Loading...
Searching...
No Matches
FFmpegWriter.h
Go to the documentation of this file.
1
11
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
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 AVFrame *persistent_src_frame = nullptr;
138 AVFrame *persistent_dst_frame = nullptr;
139 uint8_t *persistent_dst_buffer = nullptr;
140 int persistent_dst_size = 0;
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::map<std::shared_ptr<openshot::Frame>, AVFrame *> av_frames;
156
158 void add_avframe(std::shared_ptr<openshot::Frame> frame, AVFrame *av_frame);
159
161 AVStream *add_audio_stream();
162
164 AVStream *add_video_stream();
165
167 AVFrame *allocate_avframe(PixelFormat pix_fmt, int width, int height, int *buffer_size, uint8_t *new_buffer);
168
170 void auto_detect_format();
171
173 void close_audio(AVFormatContext *oc, AVStream *st);
174
176 void close_video(AVFormatContext *oc, AVStream *st);
177
179 void flush_encoders();
180
182 void initialize_streams();
183
185 void open_audio(AVFormatContext *oc, AVStream *st);
186
188 void open_video(AVFormatContext *oc, AVStream *st);
189
191 void process_video_packet(std::shared_ptr<openshot::Frame> frame);
192
194 void write_audio_packets(bool is_final, std::shared_ptr<openshot::Frame> frame);
195
197 bool write_video_packet(std::shared_ptr<openshot::Frame> frame, AVFrame *frame_final);
198
200 void write_frame(std::shared_ptr<Frame> frame);
201
202 public:
203
208 FFmpegWriter(const std::string& path);
209
211 void Close();
212
214 bool IsOpen() { return is_open; };
215
217 static bool IsValidCodec(std::string codec_name);
218
220 void Open();
221
223 void OutputStreamInfo();
224
227 void PrepareStreams();
228
232 void ResampleAudio(int sample_rate, int channels);
233
243 void SetAudioOptions(bool has_audio, std::string codec, int sample_rate, int channels, openshot::ChannelLayout channel_layout, int bit_rate);
244
254 void SetAudioOptions(std::string codec, int sample_rate, int bit_rate);
255
268 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);
269
282 void SetVideoOptions(std::string codec, int width, int height, openshot::Fraction fps, int bit_rate);
283
290 void SetOption(openshot::StreamType stream, std::string name, std::string value);
291
294 void WriteHeader();
295
300 void WriteFrame(std::shared_ptr<openshot::Frame> frame);
301
308 void WriteFrame(openshot::ReaderBase *reader, int64_t start, int64_t length);
309
312 void WriteTrailer();
313
319 void AddSphericalMetadata(const std::string& projection="equirectangular", float yaw_deg=0.0f, float pitch_deg=0.0f, float roll_deg=0.0f);
320
321 };
322
323} // namespace openshot
324
325#endif
Header file for FFmpegUtilities.
#define PixelFormat
#define SWRCONTEXT
Header file for ReaderBase class.
Header file for WriterBase class.
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() ...
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...
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
WriterBase()
Constructor for WriterBase class, many things are initialized here.
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).