audioconvert: dither in 24 bits

This saves some shifts.
This commit is contained in:
Wim Taymans 2022-06-28 17:15:27 +02:00
parent 7a0f201dc7
commit 22d02a7891
2 changed files with 20 additions and 25 deletions

View file

@ -956,8 +956,8 @@ conv_f32d_to_s16d_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], cons
for (j = 0; j < n_samples;) {
chunk = SPA_MIN(n_samples - j, conv->dither_size);
for (k = 0; k < chunk; k++, j++) {
v = F32_TO_S32(s[j]) + conv->dither[k];
d[j] = v >> 16;
v = F32_TO_S24(s[j]) + conv->dither[k];
d[j] = v >> 8;
}
}
}
@ -1020,8 +1020,8 @@ conv_f32d_to_s16_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], const
chunk = SPA_MIN(n_samples - j, conv->dither_size);
for (k = 0; k < chunk; k++, j++) {
for (i = 0; i < n_channels; i++) {
v = F32_TO_S32(s[i][j]) + conv->dither[k];
*d++ = v >> 16;
v = F32_TO_S24(s[i][j]) + conv->dither[k];
*d++ = v >> 8;
}
}
}
@ -1056,8 +1056,8 @@ conv_f32d_to_s16s_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], cons
chunk = SPA_MIN(n_samples - j, conv->dither_size);
for (k = 0; k < chunk; k++, j++) {
for (i = 0; i < n_channels; i++) {
v = F32_TO_S32(s[i][j]) + conv->dither[k];
*d++ = bswap_16(v >> 16);
v = F32_TO_S24(s[i][j]) + conv->dither[k];
*d++ = bswap_16(v >> 8);
}
}
}
@ -1358,8 +1358,8 @@ conv_f32d_to_s24d_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], cons
for (j = 0; j < n_samples;) {
chunk = SPA_MIN(n_samples - j, conv->dither_size);
for (k = 0; k < chunk; k++, j++) {
v = F32_TO_S32(s[j]) + conv->dither[k];
write_s24(d, v >> 8);
v = F32_TO_S24(s[j]) + conv->dither[k];
write_s24(d, v);
d += 3;
}
}
@ -1428,8 +1428,8 @@ conv_f32d_to_s24_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], const
chunk = SPA_MIN(n_samples - j, conv->dither_size);
for (k = 0; k < chunk; k++, j++) {
for (i = 0; i < n_channels; i++) {
v = F32_TO_S32(s[i][j]) + conv->dither[k];
write_s24(d, v >> 8);
v = F32_TO_S24(s[i][j]) + conv->dither[k];
write_s24(d, v);
d += 3;
}
}
@ -1468,8 +1468,8 @@ conv_f32d_to_s24s_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], cons
chunk = SPA_MIN(n_samples - j, conv->dither_size);
for (k = 0; k < chunk; k++, j++) {
for (i = 0; i < n_channels; i++) {
v = F32_TO_S32(s[i][j]) + conv->dither[k];
write_s24s(d, v >> 8);
v = F32_TO_S24(s[i][j]) + conv->dither[k];
write_s24s(d, v);
d += 3;
}
}
@ -1496,7 +1496,6 @@ conv_f32d_to_s24_32d_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], c
uint32_t n_samples)
{
uint32_t i, j, k, chunk, n_channels = conv->n_channels;
int32_t v;
update_dither_c(conv, SPA_MIN(n_samples, conv->dither_size));
@ -1506,10 +1505,8 @@ conv_f32d_to_s24_32d_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], c
for (j = 0; j < n_samples;) {
chunk = SPA_MIN(n_samples - j, conv->dither_size);
for (k = 0; k < chunk; k++, j++) {
v = F32_TO_S32(s[j]) + conv->dither[k];
d[j] = v >> 8;
}
for (k = 0; k < chunk; k++, j++)
d[j] = F32_TO_S24_32(s[j]) + conv->dither[k];
}
}
}
@ -1589,7 +1586,7 @@ conv_f32d_to_s24_32_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], co
uint32_t n_samples)
{
const float **s = (const float **) src;
int32_t *d = dst[0], v;
int32_t *d = dst[0];
uint32_t i, j, k, chunk, n_channels = conv->n_channels;
update_dither_c(conv, SPA_MIN(n_samples, conv->dither_size));
@ -1597,10 +1594,8 @@ conv_f32d_to_s24_32_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], co
for (j = 0; j < n_samples;) {
chunk = SPA_MIN(n_samples - j, conv->dither_size);
for (k = 0; k < chunk; k++, j++) {
for (i = 0; i < n_channels; i++) {
v = F32_TO_S32(s[i][j]) + conv->dither[k];
*d++ = v >> 8;
}
for (i = 0; i < n_channels; i++)
*d++ = F32_TO_S24_32(s[i][j]) + conv->dither[k];
}
}
}
@ -1633,8 +1628,8 @@ conv_f32d_to_s24_32s_dither_c(struct convert *conv, void * SPA_RESTRICT dst[], c
chunk = SPA_MIN(n_samples - j, conv->dither_size);
for (k = 0; k < chunk; k++, j++) {
for (i = 0; i < n_channels; i++) {
v = F32_TO_S32(s[i][j]) + conv->dither[k];
*d++ = bswap_32(v >> 8);
v = F32_TO_S24_32(s[i][j]) + conv->dither[k];
*d++ = bswap_32(v);
}
}
}

View file

@ -362,7 +362,7 @@ int convert_init(struct convert *conv)
const struct conv_info *info;
uint32_t i, shift, dither_flags;
shift = 32u - SPA_MIN(conv->quantize, 32u);
shift = 24u - SPA_MIN(conv->quantize, 24u);
shift += conv->noise;
conv->mask = (1ULL << (shift + 1)) - 1;