[FFmpeg-devel] [PATCH 008/279] lavf: convert the generic layer to the new channel layout
James Almer
jamrial at gmail.com
Wed Dec 8 03:06:24 EET 2021
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 cb02c84f33..3bfd753f64 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)
@@ -1335,8 +1347,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 fc9199230c..9dd6b13ac8 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 7643e5ca10..269223aaa8 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -526,7 +526,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);
@@ -1512,7 +1512,7 @@ static int match_stream_specifier(AVFormatContext *s, 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