OpenShot Library | libopenshot 0.3.3
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 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.
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 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...
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)
@ AUDIO_STREAM
An audio stream (used to determine which type of stream)
@ VIDEO_STREAM
A video stream (used to determine which type of stream)