]> git.sesse.net Git - nageru/commitdiff
Port FFmpegCapture to the AVChannelLayout API.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 1 Oct 2023 21:28:05 +0000 (23:28 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 1 Oct 2023 21:28:05 +0000 (23:28 +0200)
This removes the last compilation warnings with FFmpeg 6.0.

nageru/ffmpeg_capture.cpp
nageru/ffmpeg_capture.h

index 4b9d477648cdbc8ee7e3efedfb79e112e972a2b3..49f37cf351fd0e0df056d8f17ffc4f95338fe897 100644 (file)
@@ -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();
                }
index 1fcd82b10d9182ad6e57f63ad53e714f5900623b..fc584827a373e791ae85123a3a58de3d553b72c7 100644 (file)
@@ -38,6 +38,7 @@
 
 extern "C" {
 #include <libswresample/swresample.h>
+#include <libavutil/channel_layout.h>
 #include <libavutil/pixfmt.h>
 #include <libavutil/rational.h>
 #include <libavutil/samplefmt.h>
@@ -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).