diff --git a/src/client/videomanager.cpp b/src/client/videomanager.cpp index cbf2f1dab1d9fd3ba2106f20e5bf92c6c076657a..a0a93751e7b895df076994b478834f8a07910e32 100644 --- a/src/client/videomanager.cpp +++ b/src/client/videomanager.cpp @@ -35,6 +35,7 @@ #include "client/ring_signal.h" #include "audio/ringbufferpool.h" #include "dring/media_const.h" +#include "libav_utils.h" #include <functional> #include <memory> @@ -108,6 +109,7 @@ AudioFrame::mix(const AudioFrame& frame) } if (f.nb_samples == 0) { reserve(fIn.nb_samples); + ring::libav_utils::fillWithSilence(&f); } else if (f.nb_samples != fIn.nb_samples) { throw std::invalid_argument("Can't mix frames with different length"); } diff --git a/src/media/libav_deps.h b/src/media/libav_deps.h index a835996d0179b28e487f55b0785467307f8f7028..add322d167ce7553f7a8607b03048fc0be1c6089 100644 --- a/src/media/libav_deps.h +++ b/src/media/libav_deps.h @@ -38,6 +38,7 @@ extern "C" { #include <libavutil/imgutils.h> #include <libavutil/intreadwrite.h> #include <libavutil/log.h> +#include <libavutil/samplefmt.h> } #include "libav_utils.h" diff --git a/src/media/libav_utils.cpp b/src/media/libav_utils.cpp index e963921f7530b445ea1097e5b51a57bb88df85bc..cdb82a742083b924dcbc2c04b91692a39225de1e 100644 --- a/src/media/libav_utils.cpp +++ b/src/media/libav_utils.cpp @@ -222,4 +222,12 @@ fillWithBlack(AVFrame* frame) } } +void +fillWithSilence(AVFrame* frame) +{ + int ret = av_samples_set_silence(frame->extended_data, 0, frame->nb_samples, frame->channels, (AVSampleFormat)frame->format); + if (ret < 0) + RING_ERR() << "Failed to fill frame with silence"; +} + }} // namespace ring::libav_utils diff --git a/src/media/libav_utils.h b/src/media/libav_utils.h index d61c7b08d757ac484e14b4c62752666820294e75..79bb356a7797405e39bca124acc61021ecc8323d 100644 --- a/src/media/libav_utils.h +++ b/src/media/libav_utils.h @@ -47,4 +47,6 @@ namespace ring { namespace libav_utils { void fillWithBlack(AVFrame* frame); + void fillWithSilence(AVFrame* frame); + }} // namespace ring::libav_utils