OpenShot Library | libopenshot 0.5.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
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.
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)