From fd82da938ad1d0795ddd722707eb14fbfba35eba Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 17 Aug 2021 15:03:03 +0200 Subject: [PATCH] audioconvert: add more format support Add support to endian conversion as well. --- spa/plugins/audioconvert/fmt-ops.h | 6 +++--- spa/plugins/audioconvert/fmtconvert.c | 11 ++++++++--- spa/plugins/audioconvert/merger.c | 10 +++++++++- spa/plugins/audioconvert/splitter.c | 6 +++++- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/spa/plugins/audioconvert/fmt-ops.h b/spa/plugins/audioconvert/fmt-ops.h index 5ef0544fe..c998d29a7 100644 --- a/spa/plugins/audioconvert/fmt-ops.h +++ b/spa/plugins/audioconvert/fmt-ops.h @@ -60,13 +60,13 @@ #define S32_SCALE 2147483648.0f #define S32_MIN 2147483520.0f -#define S32_TO_F32(v) S24_TO_F32((v) >> 8) -#define S32S_TO_F32(v) bswap_32(S24_TO_F32((v) >> 8)) +#define S32_TO_F32(v) S24_TO_F32(((int32_t)(v)) >> 8) +#define S32S_TO_F32(v) S24_TO_F32(((int32_t)bswap_32(v)) >> 8) #define F32_TO_S32(v) (F32_TO_S24(v) << 8) #define F32_TO_S32S(v) bswap_32((F32_TO_S24(v) << 8)) #define S24_32_TO_F32(v) S32_TO_F32((v)<<8) -#define S24_32S_TO_F32(v) bswap_32(S32_TO_F32((v)<<8)) +#define S24_32S_TO_F32(v) S32_TO_F32(((int32_t)bswap_32(v))<<8) #define F32_TO_S24_32(v) F32_TO_S24(v) #define F32_TO_S24_32S(v) bswap_32(F32_TO_S24(v)) diff --git a/spa/plugins/audioconvert/fmtconvert.c b/spa/plugins/audioconvert/fmtconvert.c index 4d2266bf8..444e98d2b 100644 --- a/spa/plugins/audioconvert/fmtconvert.c +++ b/spa/plugins/audioconvert/fmtconvert.c @@ -398,19 +398,23 @@ static int port_enum_formats(void *object, info.info.raw.format == SPA_AUDIO_FORMAT_F32P || info.info.raw.format == SPA_AUDIO_FORMAT_F32) { spa_pod_builder_add(builder, - SPA_FORMAT_AUDIO_format, SPA_POD_CHOICE_ENUM_Id(16, + SPA_FORMAT_AUDIO_format, SPA_POD_CHOICE_ENUM_Id(20, info.info.raw.format, SPA_AUDIO_FORMAT_F32P, SPA_AUDIO_FORMAT_F32, + SPA_AUDIO_FORMAT_F32_OE, SPA_AUDIO_FORMAT_S32P, SPA_AUDIO_FORMAT_S32, + SPA_AUDIO_FORMAT_S32_OE, SPA_AUDIO_FORMAT_S24_32P, SPA_AUDIO_FORMAT_S24_32, + SPA_AUDIO_FORMAT_S24_32_OE, SPA_AUDIO_FORMAT_S24P, SPA_AUDIO_FORMAT_S24, SPA_AUDIO_FORMAT_S24_OE, SPA_AUDIO_FORMAT_S16P, SPA_AUDIO_FORMAT_S16, + SPA_AUDIO_FORMAT_S16_OE, SPA_AUDIO_FORMAT_S8P, SPA_AUDIO_FORMAT_S8, SPA_AUDIO_FORMAT_U8P, @@ -418,11 +422,12 @@ static int port_enum_formats(void *object, 0); } else { spa_pod_builder_add(builder, - SPA_FORMAT_AUDIO_format, SPA_POD_CHOICE_ENUM_Id(4, + SPA_FORMAT_AUDIO_format, SPA_POD_CHOICE_ENUM_Id(5, info.info.raw.format, info.info.raw.format, SPA_AUDIO_FORMAT_F32, - SPA_AUDIO_FORMAT_F32P), + SPA_AUDIO_FORMAT_F32P, + SPA_AUDIO_FORMAT_F32_OE), 0); } if (other->have_format) { diff --git a/spa/plugins/audioconvert/merger.c b/spa/plugins/audioconvert/merger.c index 3446d1b27..5e5590f2a 100644 --- a/spa/plugins/audioconvert/merger.c +++ b/spa/plugins/audioconvert/merger.c @@ -691,19 +691,23 @@ static int port_enum_formats(void *object, SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_audio), SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), - SPA_FORMAT_AUDIO_format, SPA_POD_CHOICE_ENUM_Id(16, + SPA_FORMAT_AUDIO_format, SPA_POD_CHOICE_ENUM_Id(20, SPA_AUDIO_FORMAT_F32P, SPA_AUDIO_FORMAT_F32P, SPA_AUDIO_FORMAT_F32, + SPA_AUDIO_FORMAT_F32_OE, SPA_AUDIO_FORMAT_S32P, SPA_AUDIO_FORMAT_S32, + SPA_AUDIO_FORMAT_S32_OE, SPA_AUDIO_FORMAT_S24_32P, SPA_AUDIO_FORMAT_S24_32, + SPA_AUDIO_FORMAT_S24_32_OE, SPA_AUDIO_FORMAT_S24P, SPA_AUDIO_FORMAT_S24, SPA_AUDIO_FORMAT_S24_OE, SPA_AUDIO_FORMAT_S16P, SPA_AUDIO_FORMAT_S16, + SPA_AUDIO_FORMAT_S16_OE, SPA_AUDIO_FORMAT_S8P, SPA_AUDIO_FORMAT_S8, SPA_AUDIO_FORMAT_U8, @@ -905,11 +909,15 @@ static int calc_width(struct spa_audio_info *info) { switch (info->info.raw.format) { case SPA_AUDIO_FORMAT_U8: + case SPA_AUDIO_FORMAT_U8P: case SPA_AUDIO_FORMAT_S8: + case SPA_AUDIO_FORMAT_S8P: return 1; + case SPA_AUDIO_FORMAT_S16P: case SPA_AUDIO_FORMAT_S16: case SPA_AUDIO_FORMAT_S16_OE: return 2; + case SPA_AUDIO_FORMAT_S24P: case SPA_AUDIO_FORMAT_S24: case SPA_AUDIO_FORMAT_S24_OE: return 3; diff --git a/spa/plugins/audioconvert/splitter.c b/spa/plugins/audioconvert/splitter.c index a268b9fb0..40191cf59 100644 --- a/spa/plugins/audioconvert/splitter.c +++ b/spa/plugins/audioconvert/splitter.c @@ -445,19 +445,23 @@ static int port_enum_formats(void *object, SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_audio), SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), - SPA_FORMAT_AUDIO_format, SPA_POD_CHOICE_ENUM_Id(16, + SPA_FORMAT_AUDIO_format, SPA_POD_CHOICE_ENUM_Id(20, SPA_AUDIO_FORMAT_F32P, SPA_AUDIO_FORMAT_F32P, SPA_AUDIO_FORMAT_F32, + SPA_AUDIO_FORMAT_F32_OE, SPA_AUDIO_FORMAT_S32P, SPA_AUDIO_FORMAT_S32, + SPA_AUDIO_FORMAT_S32_OE, SPA_AUDIO_FORMAT_S24_32P, SPA_AUDIO_FORMAT_S24_32, + SPA_AUDIO_FORMAT_S24_32_OE, SPA_AUDIO_FORMAT_S24P, SPA_AUDIO_FORMAT_S24, SPA_AUDIO_FORMAT_S24_OE, SPA_AUDIO_FORMAT_S16P, SPA_AUDIO_FORMAT_S16, + SPA_AUDIO_FORMAT_S16_OE, SPA_AUDIO_FORMAT_S8P, SPA_AUDIO_FORMAT_S8, SPA_AUDIO_FORMAT_U8P,