mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-28 12:41:05 +00:00
audioconvert: Use ORC for the float<->int32 conversion
This should speed up standard Vorbis encoding and decoding pipelines a bit. Thanks to David Schleef for the assistance to get the ORC code right and explaining everything.
This commit is contained in:
parent
faebf174fb
commit
5e0706c74f
2 changed files with 92 additions and 4 deletions
|
@ -41,6 +41,8 @@
|
|||
#define orc_audio_convert_unpack_u32_be orc_audio_convert_unpack_u32_swap
|
||||
#define orc_audio_convert_unpack_s32_le orc_audio_convert_unpack_s32
|
||||
#define orc_audio_convert_unpack_s32_be orc_audio_convert_unpack_s32_swap
|
||||
#define orc_audio_convert_unpack_float_le orc_audio_convert_unpack_float_s32
|
||||
#define orc_audio_convert_unpack_float_be orc_audio_convert_unpack_float_s32_swap
|
||||
#define orc_audio_convert_pack_u16_le orc_audio_convert_pack_u16
|
||||
#define orc_audio_convert_pack_u16_be orc_audio_convert_pack_u16_swap
|
||||
#define orc_audio_convert_pack_s16_le orc_audio_convert_pack_s16
|
||||
|
@ -49,6 +51,8 @@
|
|||
#define orc_audio_convert_pack_u32_be orc_audio_convert_pack_u32_swap
|
||||
#define orc_audio_convert_pack_s32_le orc_audio_convert_pack_s32
|
||||
#define orc_audio_convert_pack_s32_be orc_audio_convert_pack_s32_swap
|
||||
#define orc_audio_convert_pack_float_le orc_audio_convert_pack_s32_float
|
||||
#define orc_audio_convert_pack_float_be orc_audio_convert_pack_s32_float_swap
|
||||
#else
|
||||
#define orc_audio_convert_unpack_u16_be orc_audio_convert_unpack_u16
|
||||
#define orc_audio_convert_unpack_u16_le orc_audio_convert_unpack_u16_swap
|
||||
|
@ -58,6 +62,8 @@
|
|||
#define orc_audio_convert_unpack_u32_le orc_audio_convert_unpack_u32_swap
|
||||
#define orc_audio_convert_unpack_s32_be orc_audio_convert_unpack_s32
|
||||
#define orc_audio_convert_unpack_s32_le orc_audio_convert_unpack_s32_swap
|
||||
#define orc_audio_convert_unpack_float_be orc_audio_convert_unpack_float_s32
|
||||
#define orc_audio_convert_unpack_float_le orc_audio_convert_unpack_float_s32_swap
|
||||
#define orc_audio_convert_pack_u16_be orc_audio_convert_pack_u16
|
||||
#define orc_audio_convert_pack_u16_le orc_audio_convert_pack_u16_swap
|
||||
#define orc_audio_convert_pack_s16_be orc_audio_convert_pack_s16
|
||||
|
@ -66,6 +72,8 @@
|
|||
#define orc_audio_convert_pack_u32_le orc_audio_convert_pack_u32_swap
|
||||
#define orc_audio_convert_pack_s32_be orc_audio_convert_pack_s32
|
||||
#define orc_audio_convert_pack_s32_le orc_audio_convert_pack_s32_swap
|
||||
#define orc_audio_convert_pack_float_be orc_audio_convert_pack_s32_float
|
||||
#define orc_audio_convert_pack_float_le orc_audio_convert_pack_s32_float_swap
|
||||
#endif
|
||||
|
||||
/* sign bit in the intermediate format */
|
||||
|
@ -114,6 +122,14 @@ MAKE_UNPACK_FUNC_NAME (name) (type * src, gint32 * dst, gint s, gint count) \
|
|||
} \
|
||||
}
|
||||
|
||||
/* unpack from float to signed integer 32 with orc */
|
||||
#define MAKE_UNPACK_FUNC_ORC_FI(name, type, READ_FUNC) \
|
||||
static void \
|
||||
MAKE_UNPACK_FUNC_NAME (name) (type * src, gint32 * dst, gint s, gint count) \
|
||||
{ \
|
||||
MAKE_ORC_UNPACK_FUNC_NAME (name) ((guint32 *) dst, src, count); \
|
||||
}
|
||||
|
||||
/* unpack from float to float 64 (double) */
|
||||
#define MAKE_UNPACK_FUNC_FF(name, type, FUNC) \
|
||||
static void \
|
||||
|
@ -162,8 +178,8 @@ MAKE_UNPACK_FUNC_ORC_II (u32_le, 4, SIGNED, READ32_FROM_LE);
|
|||
MAKE_UNPACK_FUNC_ORC_II (s32_le, 4, 0, READ32_FROM_LE);
|
||||
MAKE_UNPACK_FUNC_ORC_II (u32_be, 4, SIGNED, READ32_FROM_BE);
|
||||
MAKE_UNPACK_FUNC_ORC_II (s32_be, 4, 0, READ32_FROM_BE);
|
||||
MAKE_UNPACK_FUNC_FI (float_le, gfloat, GFLOAT_FROM_LE);
|
||||
MAKE_UNPACK_FUNC_FI (float_be, gfloat, GFLOAT_FROM_BE);
|
||||
MAKE_UNPACK_FUNC_ORC_FI (float_le, gfloat, GFLOAT_FROM_LE);
|
||||
MAKE_UNPACK_FUNC_ORC_FI (float_be, gfloat, GFLOAT_FROM_BE);
|
||||
MAKE_UNPACK_FUNC_FI (double_le, gdouble, GDOUBLE_FROM_LE);
|
||||
MAKE_UNPACK_FUNC_FI (double_be, gdouble, GDOUBLE_FROM_BE);
|
||||
MAKE_UNPACK_FUNC_FF (float_hq_le, gfloat, GFLOAT_FROM_LE);
|
||||
|
@ -231,6 +247,15 @@ MAKE_PACK_FUNC_NAME (name) (gint32 *src, guint8 * dst, \
|
|||
} \
|
||||
}
|
||||
|
||||
/* pack from signed integer 32 to float using orc */
|
||||
#define MAKE_PACK_FUNC_ORC_IF(name, type, FUNC) \
|
||||
static void \
|
||||
MAKE_PACK_FUNC_NAME (name) (gint32 * src, type * dst, gint scale, \
|
||||
gint count) \
|
||||
{ \
|
||||
MAKE_PACK_FUNC_NAME_ORC (name) (dst, src, count); \
|
||||
}
|
||||
|
||||
/* pack from signed integer 32 to float */
|
||||
#define MAKE_PACK_FUNC_IF(name, type, FUNC) \
|
||||
static void \
|
||||
|
@ -309,8 +334,8 @@ MAKE_PACK_FUNC_ORC_II (u32_le, 4, SIGNED, WRITE32_TO_LE);
|
|||
MAKE_PACK_FUNC_ORC_II (s32_le, 4, 0, WRITE32_TO_LE);
|
||||
MAKE_PACK_FUNC_ORC_II (u32_be, 4, SIGNED, WRITE32_TO_BE);
|
||||
MAKE_PACK_FUNC_ORC_II (s32_be, 4, 0, WRITE32_TO_BE);
|
||||
MAKE_PACK_FUNC_IF (float_le, gfloat, GFLOAT_TO_LE);
|
||||
MAKE_PACK_FUNC_IF (float_be, gfloat, GFLOAT_TO_BE);
|
||||
MAKE_PACK_FUNC_ORC_IF (float_le, gfloat, GFLOAT_TO_LE);
|
||||
MAKE_PACK_FUNC_ORC_IF (float_be, gfloat, GFLOAT_TO_BE);
|
||||
MAKE_PACK_FUNC_IF (double_le, gdouble, GDOUBLE_TO_LE);
|
||||
MAKE_PACK_FUNC_IF (double_be, gdouble, GDOUBLE_TO_BE);
|
||||
MAKE_PACK_FUNC_FF (float_hq_le, gfloat, GFLOAT_TO_LE);
|
||||
|
|
|
@ -113,7 +113,51 @@ xorl d1, t1, c1
|
|||
swapl t1, s1
|
||||
shll d1, t1, p1
|
||||
|
||||
.function orc_audio_convert_unpack_float_s32
|
||||
.source 4 s1 gfloat
|
||||
.dest 4 d1 guint32
|
||||
.temp 4 t1
|
||||
.temp 4 t2
|
||||
.temp 4 t3
|
||||
.temp 4 t4
|
||||
|
||||
loadl t1, s1
|
||||
# multiply with 2147483647.0
|
||||
mulf t1, t1, 0x4F000000
|
||||
# add 0.5 for rounding
|
||||
addf t1, t1, 0x3F000000
|
||||
convfl t2, t1
|
||||
# if overflow, t3 = ~0
|
||||
cmpeql t3, t2, -2147483648
|
||||
# if negative, t4 = ~0
|
||||
shrsl t4, t1, 31
|
||||
# if overflow and !negative, t4 = ~0
|
||||
andnl t4, t4, t3
|
||||
# 0x80000000 + ~0 = 0x7fffffff
|
||||
addl d1, t2, t4
|
||||
|
||||
.function orc_audio_convert_unpack_float_s32_swap
|
||||
.source 4 s1 gfloat
|
||||
.dest 4 d1 guint32
|
||||
.temp 4 t1
|
||||
.temp 4 t2
|
||||
.temp 4 t3
|
||||
.temp 4 t4
|
||||
|
||||
swapl t1, s1
|
||||
# multiply with 2147483647.0
|
||||
mulf t1, t1, 0x4F000000
|
||||
# add 0.5 for rounding
|
||||
addf t1, t1, 0x3F000000
|
||||
convfl t2, t1
|
||||
# if overflow, t3 = ~0
|
||||
cmpeql t3, t2, -2147483648
|
||||
# if negative, t4 = ~0
|
||||
shrsl t4, t1, 31
|
||||
# if overflow and !negative, t4 = ~0
|
||||
andnl t4, t4, t3
|
||||
# 0x80000000 + ~0 = 0x7fffffff
|
||||
addl d1, t2, t4
|
||||
|
||||
.function orc_audio_convert_pack_u8
|
||||
.dest 1 d1 guint8
|
||||
|
@ -231,4 +275,23 @@ swapl d1, t1
|
|||
shrsl t1, s1, p1
|
||||
swapl d1, t1
|
||||
|
||||
.function orc_audio_convert_pack_s32_float
|
||||
.dest 4 d1 gfloat
|
||||
.source 4 s1 gint32
|
||||
.temp 4 t1
|
||||
|
||||
convlf t1, s1
|
||||
# divide by 2147483647.0
|
||||
divf t1, t1, 0x4F000000
|
||||
storel d1, t1
|
||||
|
||||
.function orc_audio_convert_pack_s32_float_swap
|
||||
.dest 4 d1 gfloat
|
||||
.source 4 s1 gint32
|
||||
.temp 4 t1
|
||||
|
||||
convlf t1, s1
|
||||
# divide by 2147483647.0
|
||||
divf t1, t1, 0x4F000000
|
||||
swapl d1, t1
|
||||
|
||||
|
|
Loading…
Reference in a new issue