From: Wim Taymans Date: Mon, 12 Sep 2005 11:38:05 +0000 (+0000) Subject: gst/audioconvert/audioconvert.*: Cleanups, speedups, simplifications, added back... X-Git-Tag: 1.19.3~511^2~12756 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1237e1e701df0335bd432edba6d76a575cfa3db2;p=platform%2Fupstream%2Fgstreamer.git gst/audioconvert/audioconvert.*: Cleanups, speedups, simplifications, added back support for 24 bits. Original commit message from CVS: * gst/audioconvert/audioconvert.c: (float), (audio_convert_prepare_context), (audio_convert_convert): * gst/audioconvert/audioconvert.h: Cleanups, speedups, simplifications, added back support for 24 bits. --- diff --git a/ChangeLog b/ChangeLog index 15c0a73..ec71639 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-09-12 Wim Taymans + + * gst/audioconvert/audioconvert.c: (float), + (audio_convert_prepare_context), (audio_convert_convert): + * gst/audioconvert/audioconvert.h: + Cleanups, speedups, simplifications, added back support + for 24 bits. + 2005-09-11 Thomas Vander Stichele * docs/plugins/gst-plugins-base-plugins-docs.sgml: diff --git a/gst/audioconvert/audioconvert.c b/gst/audioconvert/audioconvert.c index a1b8eb7..7e5f3e9 100644 --- a/gst/audioconvert/audioconvert.c +++ b/gst/audioconvert/audioconvert.c @@ -31,71 +31,31 @@ /* int to float conversion: int2float(i) = 1 / (2^31-1) * i */ #define INT2FLOAT(i) (4.6566128752457969e-10 * ((gfloat)i)) -#define UNPACK_CODE(type, corr, E_FUNC) \ - type* p = (type *) src; \ - gint64 tmp; \ - for (;count; count--) { \ - tmp = ((gint64) E_FUNC (*p) - corr) * scale; \ - *dst++ = CLAMP (tmp, -((gint64) 1 << 32), (gint64) 0x7FFFFFFF); \ - p++; \ - } +/* sign bit in the intermediate format */ +#define SIGNED (1<<31) +/*** + * unpack code + */ #define MAKE_UNPACK_FUNC_NAME(name) \ audio_convert_unpack_##name -/* unsigned case */ -#define MAKE_UNPACK_FUNC_U(name, type, E_FUNC) \ +#define MAKE_UNPACK_FUNC(name, stride, sign, READ_FUNC) \ static void \ MAKE_UNPACK_FUNC_NAME (name) (gpointer src, gint32 *dst, \ - gint64 scale, gint count) \ + gint scale, gint count) \ { \ - UNPACK_CODE(type, (1 << (sizeof (type) * 8 - 1)), E_FUNC); \ -} - -/* signed case */ -#define MAKE_UNPACK_FUNC_S(name, type, E_FUNC) \ -static void \ -MAKE_UNPACK_FUNC_NAME (name) (gpointer src, gint32 *dst, \ - gint64 scale, gint count) \ -{ \ - UNPACK_CODE(type, 0, E_FUNC); \ -} - -MAKE_UNPACK_FUNC_U (u8, guint8, /* nothing */ ); -MAKE_UNPACK_FUNC_S (s8, gint8, /* nothing */ ); -MAKE_UNPACK_FUNC_U (u16_le, guint16, GUINT16_FROM_LE); -MAKE_UNPACK_FUNC_S (s16_le, gint16, GINT16_FROM_LE); -MAKE_UNPACK_FUNC_U (u16_be, guint16, GUINT16_FROM_BE); -MAKE_UNPACK_FUNC_S (s16_be, gint16, GINT16_FROM_BE); -MAKE_UNPACK_FUNC_U (u32_le, guint32, GUINT32_FROM_LE); -MAKE_UNPACK_FUNC_S (s32_le, gint32, GINT32_FROM_LE); -MAKE_UNPACK_FUNC_U (u32_be, guint32, GUINT32_FROM_BE); -MAKE_UNPACK_FUNC_S (s32_be, gint32, GINT32_FROM_BE); - -/* FIXME 24 bits */ -#if 0 -gint64 cur = 0; - - /* FIXME */ - - /* Read 24-bits LE/BE into signed 64 host-endian */ -if (this->sinkcaps.endianness == G_LITTLE_ENDIAN) { - cur = src[0] | (src[1] << 8) | (src[2] << 16); -} else { - cur = src[2] | (src[1] << 8) | (src[0] << 16); + guint8* p = (guint8 *) src; \ + for (;count; count--) { \ + *dst++ = (((gint32) READ_FUNC (p)) << scale) ^ (sign); \ + p+=stride; \ + } \ } - /* Sign extend */ -if ((this->sinkcaps.sign) - && (cur & (1 << (this->sinkcaps.depth - 1)))) - cur |= ((gint64) (-1)) ^ ((1 << this->sinkcaps.depth) - 1); - -src -= 3; -#endif - +/* special unpack code for float */ static void MAKE_UNPACK_FUNC_NAME (float) (gpointer src, gint32 * dst, - gint64 scale, gint count) + gint scale, gint count) { gfloat *p = (gfloat *) src; gfloat temp; @@ -106,46 +66,52 @@ MAKE_UNPACK_FUNC_NAME (float) (gpointer src, gint32 * dst, } } -#define PACK_CODE(type, corr, E_FUNC) \ - type* p = (type *) dst; \ - gint32 scale = (32 - depth); \ - for (;count; count--) { \ - *p = E_FUNC ((type)((*src) >> scale) + corr); \ - p++; src++; \ - } - +#define READ8(p) GST_READ_UINT8(p) +#define READ16_FROM_LE(p) GST_READ_UINT16_LE (p) +#define READ16_FROM_BE(p) GST_READ_UINT16_BE (p) +#define READ24_FROM_LE(p) (p[0] | (p[1] << 8) | (p[2] << 16)) +#define READ24_FROM_BE(p) (p[2] | (p[1] << 8) | (p[0] << 16)) +#define READ32_FROM_LE(p) GST_READ_UINT32_LE (p) +#define READ32_FROM_BE(p) GST_READ_UINT32_BE (p) + +MAKE_UNPACK_FUNC (u8, 1, SIGNED, READ8); +MAKE_UNPACK_FUNC (s8, 1, 0, READ8); +MAKE_UNPACK_FUNC (u16_le, 2, SIGNED, READ16_FROM_LE); +MAKE_UNPACK_FUNC (s16_le, 2, 0, READ16_FROM_LE); +MAKE_UNPACK_FUNC (u16_be, 2, SIGNED, READ16_FROM_BE); +MAKE_UNPACK_FUNC (s16_be, 2, 0, READ16_FROM_BE); +MAKE_UNPACK_FUNC (u24_le, 3, SIGNED, READ24_FROM_LE); +MAKE_UNPACK_FUNC (s24_le, 3, 0, READ24_FROM_LE); +MAKE_UNPACK_FUNC (u24_be, 3, SIGNED, READ24_FROM_BE); +MAKE_UNPACK_FUNC (s24_be, 3, 0, READ24_FROM_BE); +MAKE_UNPACK_FUNC (u32_le, 4, SIGNED, READ32_FROM_LE); +MAKE_UNPACK_FUNC (s32_le, 4, 0, READ32_FROM_LE); +MAKE_UNPACK_FUNC (u32_be, 4, SIGNED, READ32_FROM_BE); +MAKE_UNPACK_FUNC (s32_be, 4, 0, READ32_FROM_BE); + +/*** + * packing code + */ #define MAKE_PACK_FUNC_NAME(name) \ audio_convert_pack_##name -#define MAKE_PACK_FUNC_U(name, type, E_FUNC) \ +#define MAKE_PACK_FUNC(name, stride, sign, WRITE_FUNC) \ static void \ MAKE_PACK_FUNC_NAME (name) (gint32 *src, gpointer dst, \ - gint depth, gint count) \ -{ \ - PACK_CODE (type, (1 << (depth - 1)), E_FUNC); \ -} - -#define MAKE_PACK_FUNC_S(name, type, E_FUNC) \ -static void \ -MAKE_PACK_FUNC_NAME (name) (gint32 *src, gpointer dst, \ - gint depth, gint count) \ + gint scale, gint count) \ { \ - PACK_CODE (type, 0, E_FUNC); \ + guint8 *p = (guint8 *)dst; \ + guint32 tmp; \ + for (;count; count--) { \ + tmp = (*src++ ^ (sign)) >> scale; \ + WRITE_FUNC (p, tmp); \ + p+=stride; \ + } \ } -MAKE_PACK_FUNC_U (u8, guint8, /* nothing */ ); -MAKE_PACK_FUNC_S (s8, gint8, /* nothing */ ); -MAKE_PACK_FUNC_U (u16_le, guint16, GUINT16_TO_LE); -MAKE_PACK_FUNC_S (s16_le, gint16, GINT16_TO_LE); -MAKE_PACK_FUNC_U (u16_be, guint16, GUINT16_TO_BE); -MAKE_PACK_FUNC_S (s16_be, gint16, GINT16_TO_BE); -MAKE_PACK_FUNC_U (u32_le, guint32, GUINT32_TO_LE); -MAKE_PACK_FUNC_S (s32_le, gint32, GINT32_TO_LE); -MAKE_PACK_FUNC_U (u32_be, guint32, GUINT32_TO_BE); -MAKE_PACK_FUNC_S (s32_be, gint32, GINT32_TO_BE); - +/* special float pack function */ static void -MAKE_PACK_FUNC_NAME (float) (gint32 * src, gpointer dst, gint depth, gint count) +MAKE_PACK_FUNC_NAME (float) (gint32 * src, gpointer dst, gint scale, gint count) { gfloat *p = (gfloat *) dst; @@ -154,6 +120,29 @@ MAKE_PACK_FUNC_NAME (float) (gint32 * src, gpointer dst, gint depth, gint count) } } +#define WRITE8(p, v) GST_WRITE_UINT8 (p, v) +#define WRITE16_TO_LE(p,v) GST_WRITE_UINT16_LE (p, (guint16)(v)) +#define WRITE16_TO_BE(p,v) GST_WRITE_UINT16_BE (p, (guint16)(v)) +#define WRITE24_TO_LE(p,v) p[0] = v & 0xff; p[1] = (v >> 8) & 0xff; p[2] = (v >> 16) & 0xff +#define WRITE24_TO_BE(p,v) p[2] = v & 0xff; p[1] = (v >> 8) & 0xff; p[0] = (v >> 16) & 0xff +#define WRITE32_TO_LE(p,v) GST_WRITE_UINT32_LE (p, (guint32)(v)) +#define WRITE32_TO_BE(p,v) GST_WRITE_UINT32_BE (p, (guint32)(v)) + +MAKE_PACK_FUNC (u8, 1, SIGNED, WRITE8); +MAKE_PACK_FUNC (s8, 1, 0, WRITE8); +MAKE_PACK_FUNC (u16_le, 2, SIGNED, WRITE16_TO_LE); +MAKE_PACK_FUNC (s16_le, 2, 0, WRITE16_TO_LE); +MAKE_PACK_FUNC (u16_be, 2, SIGNED, WRITE16_TO_BE); +MAKE_PACK_FUNC (s16_be, 2, 0, WRITE16_TO_BE); +MAKE_PACK_FUNC (u24_le, 3, SIGNED, WRITE24_TO_LE); +MAKE_PACK_FUNC (s24_le, 3, 0, WRITE24_TO_LE); +MAKE_PACK_FUNC (u24_be, 3, SIGNED, WRITE24_TO_BE); +MAKE_PACK_FUNC (s24_be, 3, 0, WRITE24_TO_BE); +MAKE_PACK_FUNC (u32_le, 4, SIGNED, WRITE32_TO_LE); +MAKE_PACK_FUNC (s32_le, 4, 0, WRITE32_TO_LE); +MAKE_PACK_FUNC (u32_be, 4, SIGNED, WRITE32_TO_BE); +MAKE_PACK_FUNC (s32_be, 4, 0, WRITE32_TO_BE); + static AudioConvertUnpack unpack_funcs[] = { MAKE_UNPACK_FUNC_NAME (u8), MAKE_UNPACK_FUNC_NAME (s8), @@ -163,10 +152,10 @@ static AudioConvertUnpack unpack_funcs[] = { MAKE_UNPACK_FUNC_NAME (s16_le), MAKE_UNPACK_FUNC_NAME (u16_be), MAKE_UNPACK_FUNC_NAME (s16_be), - NULL, - NULL, - NULL, - NULL, + MAKE_UNPACK_FUNC_NAME (u24_le), + MAKE_UNPACK_FUNC_NAME (s24_le), + MAKE_UNPACK_FUNC_NAME (u24_be), + MAKE_UNPACK_FUNC_NAME (s24_be), MAKE_UNPACK_FUNC_NAME (u32_le), MAKE_UNPACK_FUNC_NAME (s32_le), MAKE_UNPACK_FUNC_NAME (u32_be), @@ -183,10 +172,10 @@ static AudioConvertPack pack_funcs[] = { MAKE_PACK_FUNC_NAME (s16_le), MAKE_PACK_FUNC_NAME (u16_be), MAKE_PACK_FUNC_NAME (s16_be), - NULL, - NULL, - NULL, - NULL, + MAKE_PACK_FUNC_NAME (u24_le), + MAKE_PACK_FUNC_NAME (s24_le), + MAKE_PACK_FUNC_NAME (u24_be), + MAKE_PACK_FUNC_NAME (s24_be), MAKE_PACK_FUNC_NAME (u32_le), MAKE_PACK_FUNC_NAME (s32_le), MAKE_PACK_FUNC_NAME (u32_be), @@ -261,8 +250,8 @@ audio_convert_prepare_context (AudioConvertCtx * ctx, AudioConvertFmt * in, /* check if output is in default format */ ctx->out_default = check_default (out); - ctx->scale = ((gint64) 1 << (32 - in->depth)); - ctx->depth = out->depth; + ctx->in_scale = 32 - in->depth; + ctx->out_scale = 32 - out->depth; return TRUE; @@ -348,7 +337,7 @@ audio_convert_convert (AudioConvertCtx * ctx, gpointer src, outbuf = dst; /* unpack to default format */ - ctx->unpack (src, outbuf, ctx->scale, samples * ctx->in.channels); + ctx->unpack (src, outbuf, ctx->in_scale, samples * ctx->in.channels); src = outbuf; } @@ -368,7 +357,7 @@ audio_convert_convert (AudioConvertCtx * ctx, gpointer src, if (!ctx->out_default) { /* pack default format into dst */ - ctx->pack (src, dst, ctx->depth, samples * ctx->out.channels); + ctx->pack (src, dst, ctx->out_scale, samples * ctx->out.channels); } return TRUE; diff --git a/gst/audioconvert/audioconvert.h b/gst/audioconvert/audioconvert.h index 736745e..448a2cb 100644 --- a/gst/audioconvert/audioconvert.h +++ b/gst/audioconvert/audioconvert.h @@ -48,8 +48,8 @@ struct _AudioConvertFmt gint unit_size; }; -typedef void (*AudioConvertUnpack) (gpointer src, gint32 *dst, gint64 scale, gint count); -typedef void (*AudioConvertPack) (gint32 *src, gpointer dst, gint depth, gint count); +typedef void (*AudioConvertUnpack) (gpointer src, gint32 *dst, gint scale, gint count); +typedef void (*AudioConvertPack) (gint32 *src, gpointer dst, gint scale, gint count); struct _AudioConvertCtx { @@ -70,8 +70,8 @@ struct _AudioConvertCtx gpointer tmpbuf; gint tmpbufsize; - gint64 scale; - gint depth; + gint in_scale; + gint out_scale; }; gboolean audio_convert_clean_fmt (AudioConvertFmt *fmt);