From 1462715cd71d8f61b9e53b31c34d591d150f2df3 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 23 Apr 2016 23:36:49 +0200 Subject: [PATCH] Make the VideoEncoder own the stream audio encoder (and make it unconditionally), not the QuickSyncEncoder. --- quicksync_encoder.cpp | 26 ++++++++------------------ quicksync_encoder.h | 5 +++-- video_encoder.cpp | 11 +++++++++-- video_encoder.h | 2 ++ 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/quicksync_encoder.cpp b/quicksync_encoder.cpp index b3a832c..7d21179 100644 --- a/quicksync_encoder.cpp +++ b/quicksync_encoder.cpp @@ -193,7 +193,7 @@ FrameReorderer::Frame FrameReorderer::get_first_frame() class QuickSyncEncoderImpl { public: - QuickSyncEncoderImpl(const std::string &filename, QSurface *surface, const string &va_display, int width, int height, Mux *stream_mux); + QuickSyncEncoderImpl(const std::string &filename, QSurface *surface, const string &va_display, int width, int height, Mux *stream_mux, AudioEncoder *stream_audio_encoder); ~QuickSyncEncoderImpl(); void add_audio(int64_t pts, vector audio); bool begin_frame(GLuint *y_tex, GLuint *cbcr_tex); @@ -273,7 +273,7 @@ private: QSurface *surface; unique_ptr file_audio_encoder; - unique_ptr stream_audio_encoder; + AudioEncoder *stream_audio_encoder; Mux* stream_mux; // To HTTP. unique_ptr file_mux; // To local disk. @@ -1651,9 +1651,7 @@ void QuickSyncEncoderImpl::save_codeddata(storage_task task) } file_audio_encoder->encode_audio(audio, audio_pts + global_delay()); - if (stream_audio_encoder) { - stream_audio_encoder->encode_audio(audio, audio_pts + global_delay()); - } + stream_audio_encoder->encode_audio(audio, audio_pts + global_delay()); if (audio_pts == task.pts) break; } @@ -1732,18 +1730,12 @@ namespace { } // namespace -QuickSyncEncoderImpl::QuickSyncEncoderImpl(const std::string &filename, QSurface *surface, const string &va_display, int width, int height, Mux *stream_mux) - : current_storage_frame(0), surface(surface), stream_mux(stream_mux), frame_width(width), frame_height(height) +QuickSyncEncoderImpl::QuickSyncEncoderImpl(const std::string &filename, QSurface *surface, const string &va_display, int width, int height, Mux *stream_mux, AudioEncoder *stream_audio_encoder) + : current_storage_frame(0), surface(surface), stream_audio_encoder(stream_audio_encoder), stream_mux(stream_mux), frame_width(width), frame_height(height) { file_audio_encoder.reset(new AudioEncoder(AUDIO_OUTPUT_CODEC_NAME, DEFAULT_AUDIO_OUTPUT_BIT_RATE)); open_output_file(filename); file_audio_encoder->add_mux(file_mux.get()); - if (global_flags.stream_audio_codec_name.empty()) { - file_audio_encoder->add_mux(stream_mux); - } else { - stream_audio_encoder.reset(new AudioEncoder(global_flags.stream_audio_codec_name, global_flags.stream_audio_codec_bitrate)); - stream_audio_encoder->add_mux(stream_mux); - } frame_width_mbaligned = (frame_width + 15) & (~15); frame_height_mbaligned = (frame_height + 15) & (~15); @@ -2056,10 +2048,8 @@ void QuickSyncEncoderImpl::encode_remaining_audio() pending_audio_frames.clear(); // Encode any leftover audio in the queues, and also any delayed frames. + // Note: stream_audio_encoder is not owned by us, so don't call encode_last_audio(). file_audio_encoder->encode_last_audio(); - if (stream_audio_encoder) { - stream_audio_encoder->encode_last_audio(); - } } void QuickSyncEncoderImpl::add_packet_for_uncompressed_frame(int64_t pts, int64_t duration, const uint8_t *data) @@ -2181,8 +2171,8 @@ void QuickSyncEncoderImpl::encode_frame(QuickSyncEncoderImpl::PendingFrame frame } // Proxy object. -QuickSyncEncoder::QuickSyncEncoder(const std::string &filename, QSurface *surface, const string &va_display, int width, int height, Mux *stream_mux) - : impl(new QuickSyncEncoderImpl(filename, surface, va_display, width, height, stream_mux)) {} +QuickSyncEncoder::QuickSyncEncoder(const std::string &filename, QSurface *surface, const string &va_display, int width, int height, Mux *stream_mux, AudioEncoder *stream_audio_encoder) + : impl(new QuickSyncEncoderImpl(filename, surface, va_display, width, height, stream_mux, stream_audio_encoder)) {} // Must be defined here because unique_ptr<> destructor needs to know the impl. QuickSyncEncoder::~QuickSyncEncoder() {} diff --git a/quicksync_encoder.h b/quicksync_encoder.h index 994987e..9ec7c85 100644 --- a/quicksync_encoder.h +++ b/quicksync_encoder.h @@ -33,10 +33,11 @@ #include #include -#include "mux.h" #include "ref_counted_frame.h" #include "ref_counted_gl_sync.h" +class AudioEncoder; +class Mux; class QuickSyncEncoderImpl; class QSurface; @@ -45,7 +46,7 @@ class QSurface; // .cpp file. class QuickSyncEncoder { public: - QuickSyncEncoder(const std::string &filename, QSurface *surface, const std::string &va_display, int width, int height, Mux *stream_mux); + QuickSyncEncoder(const std::string &filename, QSurface *surface, const std::string &va_display, int width, int height, Mux *stream_mux, AudioEncoder *stream_audio_encoder); ~QuickSyncEncoder(); void add_audio(int64_t pts, std::vector audio); diff --git a/video_encoder.cpp b/video_encoder.cpp index ed9a93e..0df3b4f 100644 --- a/video_encoder.cpp +++ b/video_encoder.cpp @@ -38,8 +38,15 @@ VideoEncoder::VideoEncoder(QSurface *surface, const std::string &va_display, int { open_output_stream(); + if (global_flags.stream_audio_codec_name.empty()) { + stream_audio_encoder.reset(new AudioEncoder(AUDIO_OUTPUT_CODEC_NAME, DEFAULT_AUDIO_OUTPUT_BIT_RATE)); + } else { + stream_audio_encoder.reset(new AudioEncoder(global_flags.stream_audio_codec_name, global_flags.stream_audio_codec_bitrate)); + } + stream_audio_encoder->add_mux(stream_mux.get()); + string filename = generate_local_dump_filename(/*frame=*/0); - quicksync_encoder.reset(new QuickSyncEncoder(filename, surface, va_display, width, height, stream_mux.get())); + quicksync_encoder.reset(new QuickSyncEncoder(filename, surface, va_display, width, height, stream_mux.get(), stream_audio_encoder.get())); } VideoEncoder::~VideoEncoder() @@ -53,7 +60,7 @@ void VideoEncoder::do_cut(int frame) string filename = generate_local_dump_filename(frame); printf("Starting new recording: %s\n", filename.c_str()); quicksync_encoder->shutdown(); - quicksync_encoder.reset(new QuickSyncEncoder(filename, surface, va_display, width, height, stream_mux.get())); + quicksync_encoder.reset(new QuickSyncEncoder(filename, surface, va_display, width, height, stream_mux.get(), stream_audio_encoder.get())); } void VideoEncoder::add_audio(int64_t pts, std::vector audio) diff --git a/video_encoder.h b/video_encoder.h index 489d9d3..bf203f1 100644 --- a/video_encoder.h +++ b/video_encoder.h @@ -10,6 +10,7 @@ #include #include +#include "audio_encoder.h" #include "mux.h" #include "ref_counted_frame.h" #include "ref_counted_gl_sync.h" @@ -47,6 +48,7 @@ private: HTTPD *httpd; std::unique_ptr stream_mux; // To HTTP. + std::unique_ptr stream_audio_encoder; // While Mux object is constructing, is true, // and the header is being collected into stream_mux_header. -- 2.39.2