From 84e8b42b69804464ffb978ea4a2d0b700fe17d89 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sun, 1 Oct 2023 23:28:05 +0200 Subject: [PATCH] Port FFmpegCapture to the AVChannelLayout API. This removes the last compilation warnings with FFmpeg 6.0. --- nageru/ffmpeg_capture.cpp | 38 +++++++++++++++++++++++--------------- nageru/ffmpeg_capture.h | 3 ++- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/nageru/ffmpeg_capture.cpp b/nageru/ffmpeg_capture.cpp index 4b9d477..49f37cf 100644 --- a/nageru/ffmpeg_capture.cpp +++ b/nageru/ffmpeg_capture.cpp @@ -1020,28 +1020,36 @@ void FFmpegCapture::convert_audio(const AVFrame *audio_avframe, FrameAllocator:: } audio_format->num_channels = 2; - int64_t channel_layout = audio_avframe->channel_layout; - if (channel_layout == 0) { - channel_layout = av_get_default_channel_layout(audio_avframe->channels); + AVChannelLayout channel_layout = audio_avframe->ch_layout; + if (!av_channel_layout_check(&channel_layout) || + channel_layout.order == AV_CHANNEL_ORDER_UNSPEC) { + av_channel_layout_default(&channel_layout, audio_avframe->ch_layout.nb_channels); } if (resampler == nullptr || audio_avframe->format != last_src_format || dst_format != last_dst_format || - channel_layout != last_channel_layout || + av_channel_layout_compare(&channel_layout, &last_channel_layout) != 0|| audio_avframe->sample_rate != last_sample_rate) { + // TODO: When we get C++20, use AV_CHANNEL_LAYOUT_STEREO_DOWNMIX. + AVChannelLayout stereo_downmix; + stereo_downmix.order = AV_CHANNEL_ORDER_NATIVE; + stereo_downmix.nb_channels = 2; + stereo_downmix.u.mask = AV_CH_LAYOUT_STEREO_DOWNMIX; + swr_free(&resampler); - resampler = swr_alloc_set_opts(nullptr, - /*out_ch_layout=*/AV_CH_LAYOUT_STEREO_DOWNMIX, - /*out_sample_fmt=*/dst_format, - /*out_sample_rate=*/OUTPUT_FREQUENCY, - /*in_ch_layout=*/channel_layout, - /*in_sample_fmt=*/AVSampleFormat(audio_avframe->format), - /*in_sample_rate=*/audio_avframe->sample_rate, - /*log_offset=*/0, - /*log_ctx=*/nullptr); - - if (resampler == nullptr) { + resampler = nullptr; + int err = swr_alloc_set_opts2(&resampler, + /*out_ch_layout=*/&stereo_downmix, + /*out_sample_fmt=*/dst_format, + /*out_sample_rate=*/OUTPUT_FREQUENCY, + /*in_ch_layout=*/&channel_layout, + /*in_sample_fmt=*/AVSampleFormat(audio_avframe->format), + /*in_sample_rate=*/audio_avframe->sample_rate, + /*log_offset=*/0, + /*log_ctx=*/nullptr); + + if (err != 0 || resampler == nullptr) { fprintf(stderr, "Allocating resampler failed.\n"); abort(); } diff --git a/nageru/ffmpeg_capture.h b/nageru/ffmpeg_capture.h index 1fcd82b..fc58482 100644 --- a/nageru/ffmpeg_capture.h +++ b/nageru/ffmpeg_capture.h @@ -38,6 +38,7 @@ extern "C" { #include +#include #include #include #include @@ -330,7 +331,7 @@ private: // Audio resampler. SwrContext *resampler = nullptr; AVSampleFormat last_src_format, last_dst_format; - int64_t last_channel_layout; + AVChannelLayout last_channel_layout; int last_sample_rate; // Subtitles (no decoding done, really). -- 2.39.2