39 #ifndef OPENSHOT_FFMPEG_WRITER_H
40 #define OPENSHOT_FFMPEG_WRITER_H
154 int64_t video_timestamp;
155 int64_t audio_timestamp;
157 bool prepare_streams;
162 AVStream *audio_st, *video_st;
163 AVCodecContext *video_codec_ctx;
164 AVCodecContext *audio_codec_ctx;
165 SwsContext *img_convert_ctx;
167 uint8_t *audio_outbuf;
168 uint8_t *audio_encoder_buffer;
170 int num_of_rescalers;
171 int rescaler_position;
172 std::vector<SwsContext *> image_rescalers;
174 int audio_outbuf_size;
175 int audio_input_frame_size;
176 int initial_audio_input_frame_size;
177 int audio_input_position;
178 int audio_encoder_buffer_size;
183 int original_sample_rate;
184 int original_channels;
186 std::shared_ptr<openshot::Frame> last_frame;
187 std::deque<std::shared_ptr<openshot::Frame> > spooled_audio_frames;
188 std::deque<std::shared_ptr<openshot::Frame> > spooled_video_frames;
190 std::deque<std::shared_ptr<openshot::Frame> > queued_audio_frames;
191 std::deque<std::shared_ptr<openshot::Frame> > queued_video_frames;
193 std::deque<std::shared_ptr<openshot::Frame> > processed_frames;
194 std::deque<std::shared_ptr<openshot::Frame> > deallocate_frames;
196 std::map<std::shared_ptr<openshot::Frame>, AVFrame *> av_frames;
199 void add_avframe(std::shared_ptr<openshot::Frame> frame, AVFrame *av_frame);
202 AVStream *add_audio_stream();
205 AVStream *add_video_stream();
208 AVFrame *allocate_avframe(
PixelFormat pix_fmt,
int width,
int height,
int *buffer_size, uint8_t *new_buffer);
211 void auto_detect_format();
214 void close_audio(AVFormatContext *oc, AVStream *st);
217 void close_video(AVFormatContext *oc, AVStream *st);
220 void flush_encoders();
223 void initialize_streams();
228 void InitScalers(
int source_width,
int source_height);
231 void open_audio(AVFormatContext *oc, AVStream *st);
234 void open_video(AVFormatContext *oc, AVStream *st);
237 void process_video_packet(std::shared_ptr<openshot::Frame> frame);
240 void write_audio_packets(
bool is_final);
243 bool write_video_packet(std::shared_ptr<openshot::Frame> frame, AVFrame *frame_final);
246 void write_queued_frames();
356 void WriteFrame(std::shared_ptr<openshot::Frame> frame);
Header file for CacheMemory class.
Header file for FFmpegUtilities.
Header file for OpenMPUtilities (set some common macros)
Header file for ReaderBase class.
Header file for global Settings class.
Header file for WriterBase class.
Header file for ZeroMQ-based Logger 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 SetCacheSize(int new_size)
Set the cache size.
void ResampleAudio(int sample_rate, int channels)
Set audio resample options.
int GetCacheSize()
Get the cache size (number of frames to queue before writing)
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...
void RemoveScalers()
Remove & deallocate all software scalers.
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)