summaryrefslogtreecommitdiff
path: root/libavcodec/codec_par.c
diff options
context:
space:
mode:
authorVittorio Giovara <vittorio.giovara@gmail.com>2017-04-07 18:08:41 +0200
committerJames Almer <jamrial@gmail.com>2022-03-15 09:42:39 -0300
commit548aeb93834b8425c86d1ce60fddc1d41805724d (patch)
tree0e6f61649b3a70f407e225d247ba5ef0fe812a48 /libavcodec/codec_par.c
parentb6746b74621798d9b6697cd7369ee41625b375df (diff)
lavc: switch to the new channel layout API
Since the request_channel_layout is used only by a handful of codecs, move the option to codec private contexts. Signed-off-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec/codec_par.c')
-rw-r--r--libavcodec/codec_par.c58
1 files changed, 44 insertions, 14 deletions
diff --git a/libavcodec/codec_par.c b/libavcodec/codec_par.c
index 5d36f6db45..e4b329c838 100644
--- a/libavcodec/codec_par.c
+++ b/libavcodec/codec_par.c
@@ -98,6 +98,8 @@ int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src
int avcodec_parameters_from_context(AVCodecParameters *par,
const AVCodecContext *codec)
{
+ int ret;
+
codec_parameters_reset(par);
par->codec_type = codec->codec_type;
@@ -126,14 +128,27 @@ int avcodec_parameters_from_context(AVCodecParameters *par,
break;
case AVMEDIA_TYPE_AUDIO:
par->format = codec->sample_fmt;
- if (codec->channel_layout)
- av_channel_layout_from_mask(&par->ch_layout, codec->channel_layout);
- else {
- par->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
- par->ch_layout.nb_channels = codec->channels;
- }
#if FF_API_OLD_CHANNEL_LAYOUT
FF_DISABLE_DEPRECATION_WARNINGS
+ // if the old/new fields are set inconsistently, prefer the old ones
+ if ((codec->channels && codec->channels != codec->ch_layout.nb_channels) ||
+ (codec->channel_layout && (codec->ch_layout.order != AV_CHANNEL_ORDER_NATIVE ||
+ codec->ch_layout.u.mask != codec->channel_layout))) {
+ if (codec->channel_layout)
+ av_channel_layout_from_mask(&par->ch_layout, codec->channel_layout);
+ else {
+ par->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
+ par->ch_layout.nb_channels = codec->channels;
+ }
+FF_ENABLE_DEPRECATION_WARNINGS
+ } else {
+#endif
+ ret = av_channel_layout_copy(&par->ch_layout, &codec->ch_layout);
+ if (ret < 0)
+ return ret;
+#if FF_API_OLD_CHANNEL_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
+ }
par->channel_layout = par->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
par->ch_layout.u.mask : 0;
par->channels = par->ch_layout.nb_channels;
@@ -166,6 +181,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
int avcodec_parameters_to_context(AVCodecContext *codec,
const AVCodecParameters *par)
{
+ int ret;
+
codec->codec_type = par->codec_type;
codec->codec_id = par->codec_id;
codec->codec_tag = par->codec_tag;
@@ -192,18 +209,31 @@ int avcodec_parameters_to_context(AVCodecContext *codec,
break;
case AVMEDIA_TYPE_AUDIO:
codec->sample_fmt = par->format;
- if (par->ch_layout.nb_channels) {
- codec->channel_layout = par->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
- par->ch_layout.u.mask : 0;
- codec->channels = par->ch_layout.nb_channels;
- }
#if FF_API_OLD_CHANNEL_LAYOUT
- else {
FF_DISABLE_DEPRECATION_WARNINGS
- codec->channel_layout = par->channel_layout;
- codec->channels = par->channels;
+ // if the old/new fields are set inconsistently, prefer the old ones
+ if ((par->channels && par->channels != par->ch_layout.nb_channels) ||
+ (par->channel_layout && (par->ch_layout.order != AV_CHANNEL_ORDER_NATIVE ||
+ par->ch_layout.u.mask != par->channel_layout))) {
+ if (par->channel_layout)
+ av_channel_layout_from_mask(&codec->ch_layout, par->channel_layout);
+ else {
+ codec->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
+ codec->ch_layout.nb_channels = par->channels;
+ }
FF_ENABLE_DEPRECATION_WARNINGS
+ } else {
+#endif
+ ret = av_channel_layout_copy(&codec->ch_layout, &par->ch_layout);
+ if (ret < 0)
+ return ret;
+#if FF_API_OLD_CHANNEL_LAYOUT
+FF_DISABLE_DEPRECATION_WARNINGS
}
+ codec->channel_layout = codec->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
+ codec->ch_layout.u.mask : 0;
+ codec->channels = codec->ch_layout.nb_channels;
+FF_ENABLE_DEPRECATION_WARNINGS
#endif
codec->sample_rate = par->sample_rate;
codec->block_align = par->block_align;