[FFmpeg-devel] [PATCH 008/281] lavf: convert the generic layer to the new channel layout

James Almer jamrial at gmail.com
Thu Jan 13 03:49:30 EET 2022


From: Anton Khirnov <anton at khirnov.net>

Signed-off-by: James Almer <jamrial at gmail.com>
---
 libavformat/demux.c | 16 ++++++++++++++++
 libavformat/mux.c   | 18 +++++++++++++++++-
 libavformat/utils.c |  4 ++--
 3 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/libavformat/demux.c b/libavformat/demux.c
index c78c6c16a2..29c5f7539c 100644
--- a/libavformat/demux.c
+++ b/libavformat/demux.c
@@ -206,6 +206,18 @@ static int update_stream_avctx(AVFormatContext *s)
             }
         }
 
+#if FF_API_OLD_CHANNEL_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
+        if (st->codecpar->ch_layout.nb_channels &&
+            !st->codecpar->channels) {
+            st->codecpar->channels = st->codecpar->ch_layout.nb_channels;
+            st->codecpar->channel_layout = st->codecpar->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
+                                           st->codecpar->ch_layout.u.mask : 0;
+
+        }
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
         /* update internal codec context, for the parser */
         ret = avcodec_parameters_to_context(sti->avctx, st->codecpar);
         if (ret < 0)
@@ -1333,8 +1345,12 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
                 return ret;
             st->codecpar->sample_rate = sti->avctx->sample_rate;
             st->codecpar->bit_rate = sti->avctx->bit_rate;
+#if FF_API_OLD_CHANNEL_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
             st->codecpar->channels = sti->avctx->channels;
             st->codecpar->channel_layout = sti->avctx->channel_layout;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
             st->codecpar->codec_id = sti->avctx->codec_id;
         } else {
             /* free packet */
diff --git a/libavformat/mux.c b/libavformat/mux.c
index 775e3e0d76..68983c773f 100644
--- a/libavformat/mux.c
+++ b/libavformat/mux.c
@@ -282,8 +282,24 @@ static int init_muxer(AVFormatContext *s, AVDictionary **options)
                                       par->ch_layout.u.mask : 0;
             }
 
+#if FF_API_OLD_CHANNEL_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
+            /* if the caller is using the deprecated channel layout API,
+             * convert it to the new style */
+            if (!par->ch_layout.nb_channels &&
+                par->channels) {
+                if (par->channel_layout) {
+                    av_channel_layout_from_mask(&par->ch_layout, par->channel_layout);
+                } else {
+                    par->ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
+                    par->ch_layout.nb_channels = par->channels;
+                }
+            }
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
             if (!par->block_align)
-                par->block_align = par->channels *
+                par->block_align = par->ch_layout.nb_channels *
                                    av_get_bits_per_sample(par->codec_id) >> 3;
             break;
         case AVMEDIA_TYPE_VIDEO:
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 7468ec301d..1667d6f6f5 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -525,7 +525,7 @@ int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
             continue;
         if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
             continue;
-        if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate))
+        if (type == AVMEDIA_TYPE_AUDIO && !(par->ch_layout.nb_channels && par->sample_rate))
             continue;
         if (decoder_ret) {
             decoder = ff_find_decoder(ic, st, par->codec_id);
@@ -1522,7 +1522,7 @@ static int match_stream_specifier(const AVFormatContext *s, const AVStream *st,
             int val;
             switch (par->codec_type) {
             case AVMEDIA_TYPE_AUDIO:
-                val = par->sample_rate && par->channels;
+                val = par->sample_rate && par->ch_layout.nb_channels;
                 if (par->format == AV_SAMPLE_FMT_NONE)
                     return 0;
                 break;
-- 
2.34.1



More information about the ffmpeg-devel mailing list