bluez5: aac: set reasonable default bitrate

Set default bitrate to a reasonable value in caps, and handle unknown or
bogus bitrates from device.
This commit is contained in:
Pauli Virtanen 2021-02-10 09:33:00 +02:00 committed by Wim Taymans
parent b23e33c99f
commit 0dee15d0f6

View file

@ -35,6 +35,9 @@
#include "rtp.h"
#include "a2dp-codecs.h"
#define DEFAULT_AAC_BITRATE 320000
#define MIN_AAC_BITRATE 64000
struct impl {
HANDLE_AACENCODER aacenc;
@ -77,7 +80,7 @@ static int codec_fill_caps(const struct a2dp_codec *codec, uint32_t flags,
AAC_CHANNELS_1 |
AAC_CHANNELS_2,
.vbr = 1,
AAC_INIT_BITRATE(0xFFFFF)
AAC_INIT_BITRATE(DEFAULT_AAC_BITRATE)
};
memcpy(caps, &a2dp_aac, sizeof(a2dp_aac));
return sizeof(a2dp_aac);
@ -101,6 +104,16 @@ static struct {
{ AAC_SAMPLING_FREQ_8000, 8000 },
};
static int get_valid_aac_bitrate(a2dp_aac_t *conf)
{
if (AAC_GET_BITRATE(*conf) < MIN_AAC_BITRATE) {
/* Unknown (0) or bogus bitrate */
return DEFAULT_AAC_BITRATE;
} else {
return SPA_MIN(AAC_GET_BITRATE(*conf), DEFAULT_AAC_BITRATE);
}
}
static int codec_select_config(const struct a2dp_codec *codec, uint32_t flags,
const void *caps, size_t caps_size,
const struct spa_dict *settings, uint8_t config[A2DP_MAX_CAPS_SIZE])
@ -144,6 +157,8 @@ static int codec_select_config(const struct a2dp_codec *codec, uint32_t flags,
else
return -ENOTSUP;
AAC_SET_BITRATE(conf, get_valid_aac_bitrate(&conf));
memcpy(config, &conf, sizeof(conf));
return sizeof(conf);
@ -267,7 +282,7 @@ static void *codec_init(const struct a2dp_codec *codec, uint32_t flags,
// Fragmentation is not implemented yet,
// so make sure every encoded AAC frame fits in (mtu - header)
this->max_bitrate = ((this->mtu - sizeof(struct rtp_header)) * 8 * this->rate) / 1024;
this->max_bitrate = SPA_MIN(this->max_bitrate, AAC_GET_BITRATE(*conf));
this->max_bitrate = SPA_MIN(this->max_bitrate, get_valid_aac_bitrate(conf));
this->cur_bitrate = this->max_bitrate;
res = aacEncoder_SetParam(this->aacenc, AACENC_BITRATE, this->cur_bitrate);