[FFmpeg-devel] [PATCH 255/281] sbc: convert to new channel layout API
James Almer
jamrial at gmail.com
Thu Jan 13 04:06:59 EET 2022
From: Anton Khirnov <anton at khirnov.net>
Signed-off-by: James Almer <jamrial at gmail.com>
---
libavcodec/sbc_parser.c | 8 ++++++--
libavcodec/sbcdec.c | 9 ++++++++-
libavcodec/sbcenc.c | 15 ++++++++++-----
3 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/libavcodec/sbc_parser.c b/libavcodec/sbc_parser.c
index 8bf726b39e..2d427cc7cb 100644
--- a/libavcodec/sbc_parser.c
+++ b/libavcodec/sbc_parser.c
@@ -41,7 +41,9 @@ static int sbc_parse_header(AVCodecParserContext *s, AVCodecContext *avctx,
return -1;
if (data[0] == MSBC_SYNCWORD && data[1] == 0 && data[2] == 0) {
- avctx->channels = 1;
+ av_channel_layout_uninit(&avctx->ch_layout);
+ avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
+ avctx->ch_layout.nb_channels = 1;
avctx->sample_rate = 16000;
avctx->frame_size = 120;
s->duration = avctx->frame_size;
@@ -64,7 +66,9 @@ static int sbc_parse_header(AVCodecParserContext *s, AVCodecContext *avctx,
+ ((((mode == SBC_MODE_DUAL_CHANNEL) + 1) * blocks * bitpool
+ (joint * subbands)) + 7) / 8;
- avctx->channels = channels;
+ av_channel_layout_uninit(&avctx->ch_layout);
+ avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
+ avctx->ch_layout.nb_channels = channels;
avctx->sample_rate = sample_rates[sr];
avctx->frame_size = subbands * blocks;
s->duration = avctx->frame_size;
diff --git a/libavcodec/sbcdec.c b/libavcodec/sbcdec.c
index e14d8c8958..1c053ad9a7 100644
--- a/libavcodec/sbcdec.c
+++ b/libavcodec/sbcdec.c
@@ -351,7 +351,9 @@ static int sbc_decode_frame(AVCodecContext *avctx,
if (frame_length <= 0)
return frame_length;
- avctx->channels = sbc->frame.channels;
+ av_channel_layout_uninit(&avctx->ch_layout);
+ avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
+ avctx->ch_layout.nb_channels = sbc->frame.channels;
frame->nb_samples = sbc->frame.blocks * sbc->frame.subbands;
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
@@ -374,8 +376,13 @@ const AVCodec ff_sbc_decoder = {
.decode = sbc_decode_frame,
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
+#if FF_API_OLD_CHANNEL_LAYOUT
.channel_layouts = (const uint64_t[]) { AV_CH_LAYOUT_MONO,
AV_CH_LAYOUT_STEREO, 0},
+#endif
+ .ch_layouts = (const AVChannelLayout[]) { AV_CHANNEL_LAYOUT_MONO,
+ AV_CHANNEL_LAYOUT_STEREO,
+ { 0 } },
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
AV_SAMPLE_FMT_NONE },
.supported_samplerates = (const int[]) { 16000, 32000, 44100, 48000, 0 },
diff --git a/libavcodec/sbcenc.c b/libavcodec/sbcenc.c
index 45156277b7..cff93e8917 100644
--- a/libavcodec/sbcenc.c
+++ b/libavcodec/sbcenc.c
@@ -202,7 +202,7 @@ static int sbc_encode_init(AVCodecContext *avctx)
sbc->msbc = 1;
if (sbc->msbc) {
- if (avctx->channels != 1) {
+ if (avctx->ch_layout.nb_channels != 1) {
av_log(avctx, AV_LOG_ERROR, "mSBC require mono channel.\n");
return AVERROR(EINVAL);
}
@@ -227,7 +227,7 @@ static int sbc_encode_init(AVCodecContext *avctx)
return AVERROR(EINVAL);
}
- if (avctx->channels == 1) {
+ if (avctx->ch_layout.nb_channels == 1) {
frame->mode = SBC_MODE_MONO;
if (sbc->max_delay <= 3000 || avctx->bit_rate > 270000)
frame->subbands = 4;
@@ -251,7 +251,7 @@ static int sbc_encode_init(AVCodecContext *avctx)
d = frame->blocks * ((frame->mode == SBC_MODE_DUAL_CHANNEL) + 1);
frame->bitpool = (((avctx->bit_rate * frame->subbands * frame->blocks) / avctx->sample_rate)
- - 4 * frame->subbands * avctx->channels
+ - 4 * frame->subbands * avctx->ch_layout.nb_channels
- (frame->mode == SBC_MODE_JOINT_STEREO)*frame->subbands - 32 + d/2) / d;
if (avctx->global_quality > 0)
frame->bitpool = avctx->global_quality / FF_QP2LAMBDA;
@@ -263,8 +263,8 @@ static int sbc_encode_init(AVCodecContext *avctx)
if (avctx->sample_rate == avctx->codec->supported_samplerates[i])
frame->frequency = i;
- frame->channels = avctx->channels;
- frame->codesize = frame->subbands * frame->blocks * avctx->channels * 2;
+ frame->channels = avctx->ch_layout.nb_channels;
+ frame->codesize = frame->subbands * frame->blocks * avctx->ch_layout.nb_channels * 2;
frame->crc_ctx = av_crc_get_table(AV_CRC_8_EBU);
memset(&sbc->dsp.X, 0, sizeof(sbc->dsp.X));
@@ -353,8 +353,13 @@ const AVCodec ff_sbc_encoder = {
.init = sbc_encode_init,
.encode2 = sbc_encode_frame,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
+#if FF_API_OLD_CHANNEL_LAYOUT
.channel_layouts = (const uint64_t[]) { AV_CH_LAYOUT_MONO,
AV_CH_LAYOUT_STEREO, 0},
+#endif
+ .ch_layouts = (const AVChannelLayout[]) { AV_CHANNEL_LAYOUT_MONO,
+ AV_CHANNEL_LAYOUT_STEREO,
+ { 0 } },
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_NONE },
.supported_samplerates = (const int[]) { 16000, 32000, 44100, 48000, 0 },
--
2.34.1
More information about the ffmpeg-devel
mailing list