16#ifndef OPENSHOT_FFMPEG_WRITER_H
17#define OPENSHOT_FFMPEG_WRITER_H
121 int64_t video_timestamp;
122 int64_t audio_timestamp;
124 bool prepare_streams;
131 AVStream *audio_st, *video_st;
132 AVCodecContext *video_codec_ctx;
133 AVCodecContext *audio_codec_ctx;
134 SwsContext *img_convert_ctx;
136 uint8_t *audio_outbuf;
137 uint8_t *audio_encoder_buffer;
139 AVFrame *persistent_src_frame =
nullptr;
140 AVFrame *persistent_dst_frame =
nullptr;
141 uint8_t *persistent_dst_buffer =
nullptr;
142 int persistent_dst_size = 0;
144 int audio_outbuf_size;
145 int audio_input_frame_size;
146 int initial_audio_input_frame_size;
147 int audio_input_position;
148 int audio_encoder_buffer_size;
153 int original_sample_rate;
154 int original_channels;
156 std::shared_ptr<openshot::Frame> last_frame;
157 std::map<std::shared_ptr<openshot::Frame>, AVFrame *> av_frames;
160 void add_avframe(std::shared_ptr<openshot::Frame> frame, AVFrame *av_frame);
163 AVStream *add_audio_stream();
166 AVStream *add_video_stream();
169 AVFrame *allocate_avframe(
PixelFormat pix_fmt,
int width,
int height,
int *buffer_size, uint8_t *new_buffer);
172 void auto_detect_format();
175 void close_audio(AVFormatContext *oc, AVStream *st);
178 void close_video(AVFormatContext *oc, AVStream *st);
181 void flush_encoders();
184 void initialize_streams();
187 void open_audio(AVFormatContext *oc, AVStream *st);
190 void open_video(AVFormatContext *oc, AVStream *st);
193 void process_video_packet(std::shared_ptr<openshot::Frame> frame);
196 void write_audio_packets(
bool is_final, std::shared_ptr<openshot::Frame> frame);
199 bool write_video_packet(std::shared_ptr<openshot::Frame> frame, AVFrame *frame_final);
202 void write_frame(std::shared_ptr<Frame> frame);
247 static std::string
GetEncoders(std::string media_type, std::string format_name =
"");
347 void WriteFrame(std::shared_ptr<openshot::Frame> frame);
355 void WriteFrameAt(std::shared_ptr<openshot::Frame> frame, int64_t frame_number);
374 void AddSphericalMetadata(
const std::string& projection=
"equirectangular",
float yaw_deg=0.0f,
float pitch_deg=0.0f,
float roll_deg=0.0f);
Header file for FFmpegUtilities.
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.
static std::string GetEncoders(std::string media_type, std::string format_name="")
List the available encoders as a JSON array.
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...
static std::string GetFormats()
List the file extensions the writer can export to, as a JSON array.
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.
void WriteFrameAt(std::shared_ptr< openshot::Frame > frame, int64_t frame_number)
Add a frame at a specific output video frame number.
bool IsOpen()
Determine if writer is open or closed.
static std::string GetFormatInfo(std::string format_name)
Describe an output format as JSON (name, extensions, and default codecs).
static int IsCodecSupportedByFormat(std::string format_name, std::string codec_name)
Determine if an output format can store a codec.
void ResampleAudio(int sample_rate, int channels)
Set audio resample options.
static std::string GetEncoderInfo(std::string codec_name)
Describe an encoder's capabilities as JSON.
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)
std::string Test()
Check the current settings without writing a file, and return the result as JSON.
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.
This abstract class is the base class, used by all readers in libopenshot.
This abstract class is the base class, used by writers. Writers are types of classes that encode vide...
This namespace is the default namespace for all code in the openshot library.
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)