mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-16 08:56:45 -05:00
bluez5: opus: better default bitrates
Use smaller bitrate caps, as it's not necessary to use all bandwidth available.
This commit is contained in:
parent
f1dfa9797b
commit
5724d405d6
1 changed files with 72 additions and 21 deletions
|
|
@ -53,11 +53,18 @@ static struct spa_log_topic log_topic = SPA_LOG_TOPIC(0, "spa.bluez5.codecs.opus
|
||||||
|
|
||||||
#define BUFSIZE_FROM_BITRATE(frame_dms,bitrate) ((bitrate)/8 * (frame_dms) / 10000 * 5/4) /* estimate */
|
#define BUFSIZE_FROM_BITRATE(frame_dms,bitrate) ((bitrate)/8 * (frame_dms) / 10000 * 5/4) /* estimate */
|
||||||
|
|
||||||
#define BITRATE_MAX 960000
|
#define BITRATE_DEFAULT 128000
|
||||||
#define BITRATE_DEFAULT 192000
|
#define BITRATE_MAX 192000
|
||||||
#define BITRATE_MIN 1024
|
#define BITRATE_MIN 64000
|
||||||
|
|
||||||
|
#define BITRATE_DEFAULT_51 256000
|
||||||
|
#define BITRATE_MAX_51 384000
|
||||||
|
#define BITRATE_MIN_51 85000
|
||||||
|
|
||||||
|
#define BITRATE_DEFAULT_71 450000
|
||||||
|
#define BITRATE_MAX_71 675000
|
||||||
|
#define BITRATE_MIN_71 170000
|
||||||
|
|
||||||
#define BITRATE_DUPLEX_MAX 320000
|
|
||||||
#define BITRATE_DUPLEX_BIDI 160000
|
#define BITRATE_DUPLEX_BIDI 160000
|
||||||
|
|
||||||
#define OPUS_05_MAX_BYTES (15 * 1024)
|
#define OPUS_05_MAX_BYTES (15 * 1024)
|
||||||
|
|
@ -446,6 +453,51 @@ static int set_channel_conf(const struct a2dp_codec *codec, a2dp_opus_05_t *caps
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void get_default_bitrates(const struct a2dp_codec *codec, bool bidi, int *min, int *max, int *def)
|
||||||
|
{
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
if (min == NULL)
|
||||||
|
min = &tmp;
|
||||||
|
if (max == NULL)
|
||||||
|
max = &tmp;
|
||||||
|
if (def == NULL)
|
||||||
|
def = &tmp;
|
||||||
|
|
||||||
|
if (bidi) {
|
||||||
|
*min = SPA_MIN(BITRATE_MIN, BITRATE_DUPLEX_BIDI);
|
||||||
|
*max = BITRATE_DUPLEX_BIDI;
|
||||||
|
*def = BITRATE_DUPLEX_BIDI;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (codec->id) {
|
||||||
|
case SPA_BLUETOOTH_AUDIO_CODEC_OPUS_05:
|
||||||
|
*min = BITRATE_MIN;
|
||||||
|
*max = BITRATE_MAX;
|
||||||
|
*def = BITRATE_DEFAULT;
|
||||||
|
break;
|
||||||
|
case SPA_BLUETOOTH_AUDIO_CODEC_OPUS_05_51:
|
||||||
|
*min = BITRATE_MIN_51;
|
||||||
|
*max = BITRATE_MAX_51;
|
||||||
|
*def = BITRATE_DEFAULT_51;
|
||||||
|
break;
|
||||||
|
case SPA_BLUETOOTH_AUDIO_CODEC_OPUS_05_71:
|
||||||
|
*min = BITRATE_MIN_71;
|
||||||
|
*max = BITRATE_MAX_71;
|
||||||
|
*def = BITRATE_DEFAULT_71;
|
||||||
|
break;
|
||||||
|
case SPA_BLUETOOTH_AUDIO_CODEC_OPUS_05_DUPLEX:
|
||||||
|
*min = BITRATE_MIN;
|
||||||
|
*max = BITRATE_MAX;
|
||||||
|
*def = BITRATE_DEFAULT;
|
||||||
|
break;
|
||||||
|
case SPA_BLUETOOTH_AUDIO_CODEC_OPUS_05_PRO:
|
||||||
|
default:
|
||||||
|
spa_assert_not_reached();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
static int get_mapping(const struct a2dp_codec *codec, const a2dp_opus_05_direction_t *conf,
|
static int get_mapping(const struct a2dp_codec *codec, const a2dp_opus_05_direction_t *conf,
|
||||||
bool use_surround_encoder, uint8_t *streams_ret, uint8_t *coupled_streams_ret,
|
bool use_surround_encoder, uint8_t *streams_ret, uint8_t *coupled_streams_ret,
|
||||||
const uint8_t **surround_mapping, uint32_t *positions)
|
const uint8_t **surround_mapping, uint32_t *positions)
|
||||||
|
|
@ -550,7 +602,6 @@ static int codec_select_config(const struct a2dp_codec *codec, uint32_t flags,
|
||||||
const struct a2dp_codec_audio_info *info,
|
const struct a2dp_codec_audio_info *info,
|
||||||
const struct spa_dict *global_settings, uint8_t config[A2DP_MAX_CAPS_SIZE])
|
const struct spa_dict *global_settings, uint8_t config[A2DP_MAX_CAPS_SIZE])
|
||||||
{
|
{
|
||||||
bool duplex = (codec->id == SPA_BLUETOOTH_AUDIO_CODEC_OPUS_05_DUPLEX);
|
|
||||||
struct props props;
|
struct props props;
|
||||||
a2dp_opus_05_t conf;
|
a2dp_opus_05_t conf;
|
||||||
int res;
|
int res;
|
||||||
|
|
@ -610,7 +661,7 @@ static int codec_select_config(const struct a2dp_codec *codec, uint32_t flags,
|
||||||
else
|
else
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
max = duplex ? BITRATE_DUPLEX_MAX : BITRATE_MAX;
|
get_default_bitrates(codec, false, NULL, &max, NULL);
|
||||||
|
|
||||||
if (OPUS_05_GET_BITRATE(conf.main) != 0)
|
if (OPUS_05_GET_BITRATE(conf.main) != 0)
|
||||||
OPUS_05_SET_BITRATE(conf.main, SPA_MIN(OPUS_05_GET_BITRATE(conf.main), max / 1024));
|
OPUS_05_SET_BITRATE(conf.main, SPA_MIN(OPUS_05_GET_BITRATE(conf.main), max / 1024));
|
||||||
|
|
@ -633,12 +684,14 @@ static int codec_select_config(const struct a2dp_codec *codec, uint32_t flags,
|
||||||
else
|
else
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
get_default_bitrates(codec, true, NULL, &max, NULL);
|
||||||
|
|
||||||
if (conf.bidi.channels == 0)
|
if (conf.bidi.channels == 0)
|
||||||
true;
|
true;
|
||||||
else if (OPUS_05_GET_BITRATE(conf.bidi) != 0)
|
else if (OPUS_05_GET_BITRATE(conf.bidi) != 0)
|
||||||
OPUS_05_SET_BITRATE(conf.bidi, SPA_MIN(OPUS_05_GET_BITRATE(conf.bidi), BITRATE_DUPLEX_BIDI / 1024));
|
OPUS_05_SET_BITRATE(conf.bidi, SPA_MIN(OPUS_05_GET_BITRATE(conf.bidi), max / 1024));
|
||||||
else
|
else
|
||||||
OPUS_05_SET_BITRATE(conf.bidi, BITRATE_DUPLEX_BIDI / 1024);
|
OPUS_05_SET_BITRATE(conf.bidi, max / 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(config, &conf, sizeof(conf));
|
memcpy(config, &conf, sizeof(conf));
|
||||||
|
|
@ -941,22 +994,20 @@ static void *codec_init(const struct a2dp_codec *codec, uint32_t flags,
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this->is_bidi) {
|
if (codec->id != SPA_BLUETOOTH_AUDIO_CODEC_OPUS_05_PRO) {
|
||||||
if (codec->id != SPA_BLUETOOTH_AUDIO_CODEC_OPUS_05_PRO)
|
get_default_bitrates(codec, this->is_bidi, &this->e.bitrate_min,
|
||||||
this->e.bitrate_max = SPA_MIN(BITRATE_MAX, OPUS_05_GET_BITRATE(*dir) * 1024);
|
&this->e.bitrate_max, &this->e.bitrate);
|
||||||
else
|
this->e.bitrate_max = SPA_MIN(this->e.bitrate_max,
|
||||||
this->e.bitrate_max = OPUS_05_GET_BITRATE(*dir) * 1024;
|
OPUS_05_GET_BITRATE(*dir) * 1024);
|
||||||
this->e.bitrate_min = SPA_MIN(BITRATE_MIN, this->e.bitrate_max);
|
|
||||||
this->e.bitrate = SPA_CLAMP(BITRATE_DEFAULT, this->e.bitrate_min, this->e.bitrate_max);
|
|
||||||
} else {
|
} else {
|
||||||
if (codec->id != SPA_BLUETOOTH_AUDIO_CODEC_OPUS_05_PRO)
|
|
||||||
this->e.bitrate_max = SPA_MIN(BITRATE_DUPLEX_BIDI, OPUS_05_GET_BITRATE(*dir) * 1024);
|
|
||||||
else
|
|
||||||
this->e.bitrate_max = OPUS_05_GET_BITRATE(*dir) * 1024;
|
this->e.bitrate_max = OPUS_05_GET_BITRATE(*dir) * 1024;
|
||||||
this->e.bitrate_min = SPA_MIN(BITRATE_MIN, this->e.bitrate_max);
|
this->e.bitrate_min = BITRATE_MIN;
|
||||||
this->e.bitrate = SPA_CLAMP(BITRATE_DUPLEX_BIDI, this->e.bitrate_min, this->e.bitrate_max);
|
this->e.bitrate = BITRATE_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this->e.bitrate_min = SPA_MIN(this->e.bitrate_min, this->e.bitrate_max);
|
||||||
|
this->e.bitrate = SPA_CLAMP(this->e.bitrate, this->e.bitrate_min, this->e.bitrate_max);
|
||||||
|
|
||||||
this->e.next_bitrate = this->e.bitrate;
|
this->e.next_bitrate = this->e.bitrate;
|
||||||
opus_multistream_encoder_ctl(this->enc, OPUS_SET_BITRATE(this->e.bitrate));
|
opus_multistream_encoder_ctl(this->enc, OPUS_SET_BITRATE(this->e.bitrate));
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue