diff --git a/gst/volume/Makefile.am b/gst/volume/Makefile.am index 393b2eff20..04c348d11b 100644 --- a/gst/volume/Makefile.am +++ b/gst/volume/Makefile.am @@ -1,7 +1,11 @@ plugin_LTLIBRARIES = libgstvolume.la +ORC_SOURCE=gstvolumeorc +include $(top_srcdir)/common/orc.mak + libgstvolume_la_SOURCES = gstvolume.c -libgstvolume_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(LIBOIL_CFLAGS) +nodist_libgstvolume_la_SOURCES = $(ORC_NODIST_SOURCES) +libgstvolume_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS) libgstvolume_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstvolume_la_LIBADD = \ $(top_builddir)/gst-libs/gst/interfaces/libgstinterfaces-$(GST_MAJORMINOR).la \ @@ -9,8 +13,9 @@ libgstvolume_la_LIBADD = \ $(GST_BASE_LIBS) \ $(GST_CONTROLLER_LIBS) \ $(GST_LIBS) \ - $(LIBOIL_LIBS) + $(ORC_LIBS) libgstvolume_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstvolume.h + diff --git a/gst/volume/gstvolume.c b/gst/volume/gstvolume.c index 2cf24274a1..09318f562e 100644 --- a/gst/volume/gstvolume.c +++ b/gst/volume/gstvolume.c @@ -49,7 +49,7 @@ #include #include #include -#include +#include "gstvolumeorc.h" #include "gstvolume.h" @@ -502,10 +502,13 @@ volume_process_double (GstVolume * self, gpointer bytes, guint n_bytes) { gdouble *data = (gdouble *) bytes; guint num_samples = n_bytes / sizeof (gdouble); + int i; gdouble vol = self->current_volume; - oil_scalarmultiply_f64_ns (data, data, &vol, num_samples); + for (i = 0; i < num_samples; i++) { + data[i] *= vol; + } } static void @@ -531,17 +534,15 @@ volume_process_float (GstVolume * self, gpointer bytes, guint n_bytes) gfloat *data = (gfloat *) bytes; guint num_samples = n_bytes / sizeof (gfloat); -#if 0 - guint i; - +#ifndef broken + int i; for (i = 0; i < num_samples; i++) { - *data++ *= self->real_vol_f; + *data++ *= self->current_volume; } - /* time "gst-launch 2>/dev/null audiotestsrc wave=7 num-buffers=10000 ! audio/x-raw-float ! - * volume volume=1.5 ! fakesink" goes from 0m0.850s -> 0m0.717s with liboil - */ +#else + /* FIXME compiler doesn't set the float parameter correctly */ + orc_scalarmultiply_f32_ns (data, data, self->current_volume, num_samples); #endif - oil_scalarmultiply_f32_ns (data, data, &self->current_volume, num_samples); } static void @@ -717,28 +718,40 @@ volume_process_int16 (GstVolume * self, gpointer bytes, guint n_bytes) (gint16) ((self->current_vol_i16 * val) >> VOLUME_UNITY_INT16_BIT_SHIFT); } +#if 0 + /* FIXME */ + /* hard coded in volume.orc */ + g_assert (VOLUME_UNITY_INT16_BIT_SHIFT == 13); + + orc_process_int16 (data, this->current_vol_i16, num_samples); +#endif } static void volume_process_int16_clamp (GstVolume * self, gpointer bytes, guint n_bytes) { gint16 *data = (gint16 *) bytes; - guint i, num_samples; - gint val; + guint num_samples = n_bytes / sizeof (gint16); + int i; - num_samples = n_bytes / sizeof (gint16); + /* hard coded in volume.orc */ + g_assert (VOLUME_UNITY_INT16_BIT_SHIFT == 13); /* FIXME: oil_scalarmultiply_s16_ns ? * https://bugs.freedesktop.org/show_bug.cgi?id=7060 */ for (i = 0; i < num_samples; i++) { /* we use bitshifting instead of dividing by UNITY_INT for speed */ - val = (gint) * data; + int val = (gint) * data; *data++ = (gint16) CLAMP ((self->current_vol_i16 * val) >> VOLUME_UNITY_INT16_BIT_SHIFT, VOLUME_MIN_INT16, VOLUME_MAX_INT16); } +#if 0 + /* FIXME */ + orc_process_int16_clamp (data, this->current_vol_i16, num_samples); +#endif } static void @@ -764,34 +777,45 @@ volume_process_int8 (GstVolume * self, gpointer bytes, guint n_bytes) { gint8 *data = (gint8 *) bytes; guint num_samples = n_bytes / sizeof (gint8); - guint i; - gint val; + int i; for (i = 0; i < num_samples; i++) { /* we use bitshifting instead of dividing by UNITY_INT for speed */ - val = (gint) * data; + int val = (gint) * data; *data++ = (gint8) ((self->current_vol_i8 * val) >> VOLUME_UNITY_INT8_BIT_SHIFT); } +#if 0 + /* FIXME */ + /* hard coded in volume.orc */ + g_assert (VOLUME_UNITY_INT8_BIT_SHIFT == 5); + + orc_process_int8 (data, this->current_vol_i8, num_samples); +#endif } static void volume_process_int8_clamp (GstVolume * self, gpointer bytes, guint n_bytes) { gint8 *data = (gint8 *) bytes; - guint i, num_samples; - gint val; + guint num_samples = n_bytes / sizeof (gint8); + int i; - num_samples = n_bytes / sizeof (gint8); + /* hard coded in volume.orc */ + g_assert (VOLUME_UNITY_INT8_BIT_SHIFT == 5); for (i = 0; i < num_samples; i++) { /* we use bitshifting instead of dividing by UNITY_INT for speed */ - val = (gint) * data; + int val = (gint) * data; *data++ = (gint8) CLAMP ((self->current_vol_i8 * val) >> VOLUME_UNITY_INT8_BIT_SHIFT, VOLUME_MIN_INT8, VOLUME_MAX_INT8); } +#if 0 + /* FIXME */ + orc_process_int8_clamp (data, this->current_vol_i8, num_samples); +#endif } static void @@ -1053,8 +1077,6 @@ volume_get_property (GObject * object, guint prop_id, GValue * value, static gboolean plugin_init (GstPlugin * plugin) { - oil_init (); - /* initialize gst controller library */ gst_controller_init (NULL, NULL); diff --git a/gst/volume/gstvolumeorc-dist.c b/gst/volume/gstvolumeorc-dist.c new file mode 100644 index 0000000000..a2519121dd --- /dev/null +++ b/gst/volume/gstvolumeorc-dist.c @@ -0,0 +1,458 @@ + +/* autogenerated from gstvolumeorc.orc */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifndef DISABLE_ORC +#include +#else +#include +#endif +#include + +void orc_process_int16 (gint16 * d1, int p1, int n); +void orc_process_int16_clamp (gint16 * d1, int p1, int n); +void orc_process_int8 (gint8 * d1, int p1, int n); +void orc_process_int8_clamp (gint8 * d1, int p1, int n); + + +/* begin Orc C target preamble */ +#define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x))) +#define ORC_ABS(a) ((a)<0 ? -(a) : (a)) +#define ORC_MIN(a,b) ((a)<(b) ? (a) : (b)) +#define ORC_MAX(a,b) ((a)>(b) ? (a) : (b)) +#define ORC_SB_MAX 127 +#define ORC_SB_MIN (-1-ORC_SB_MAX) +#define ORC_UB_MAX 255 +#define ORC_UB_MIN 0 +#define ORC_SW_MAX 32767 +#define ORC_SW_MIN (-1-ORC_SW_MAX) +#define ORC_UW_MAX 65535 +#define ORC_UW_MIN 0 +#define ORC_SL_MAX 2147483647 +#define ORC_SL_MIN (-1-ORC_SL_MAX) +#define ORC_UL_MAX 4294967295U +#define ORC_UL_MIN 0 +#define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX) +#define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX) +#define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX) +#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX) +#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX) +#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX) +#define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8)) +#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24)) +#define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset))) +#define ORC_AS_FLOAT(x) (((union { int i; float f; } *)(&x))->f) +typedef union +{ + int32_t i; + float f; +} orc_union32; +typedef union +{ + int64_t i; + double f; +} orc_union64; +/* end Orc C target preamble */ + + + +/* orc_process_int16 */ +#ifdef DISABLE_ORC +void +orc_process_int16 (gint16 * d1, int p1, int n) +{ + int i; + int16_t var0; + int16_t *ptr0; + const int16_t var16 = 13; + const int16_t var24 = p1; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (int16_t *) d1; + + for (i = 0; i < n; i++) { + var0 = *ptr0; + /* 0: mulswl */ + var32.i = var0 * var24; + /* 1: shrsl */ + var33.i = var32.i >> var16; + /* 2: convlw */ + var0 = var33.i; + *ptr0 = var0; + ptr0++; + } + +} + +#else +static void +_backup_orc_process_int16 (OrcExecutor * ex) +{ + int i; + int n = ex->n; + int16_t var0; + int16_t *ptr0; + const int16_t var16 = 13; + const int16_t var24 = ex->params[24]; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (int16_t *) ex->arrays[0]; + + for (i = 0; i < n; i++) { + var0 = *ptr0; + /* 0: mulswl */ + var32.i = var0 * var24; + /* 1: shrsl */ + var33.i = var32.i >> var16; + /* 2: convlw */ + var0 = var33.i; + *ptr0 = var0; + ptr0++; + } + +} + +void +orc_process_int16 (gint16 * d1, int p1, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + OrcCompileResult result; + + p = orc_program_new (); + orc_program_set_name (p, "orc_process_int16"); + orc_program_set_backup_function (p, _backup_orc_process_int16); + orc_program_add_destination (p, 2, "d1"); + orc_program_add_constant (p, 2, 13, "c1"); + orc_program_add_parameter (p, 2, "p1"); + orc_program_add_temporary (p, 4, "t1"); + + orc_program_append (p, "mulswl", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1); + orc_program_append (p, "shrsl", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1); + orc_program_append (p, "convlw", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1); + + result = orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif + + +/* orc_process_int16_clamp */ +#ifdef DISABLE_ORC +void +orc_process_int16_clamp (gint16 * d1, int p1, int n) +{ + int i; + int16_t var0; + int16_t *ptr0; + const int16_t var16 = 13; + const int16_t var24 = p1; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (int16_t *) d1; + + for (i = 0; i < n; i++) { + var0 = *ptr0; + /* 0: mulswl */ + var32.i = var0 * var24; + /* 1: shrsl */ + var33.i = var32.i >> var16; + /* 2: convssslw */ + var0 = ORC_CLAMP_SW (var33.i); + *ptr0 = var0; + ptr0++; + } + +} + +#else +static void +_backup_orc_process_int16_clamp (OrcExecutor * ex) +{ + int i; + int n = ex->n; + int16_t var0; + int16_t *ptr0; + const int16_t var16 = 13; + const int16_t var24 = ex->params[24]; + orc_union32 var32; + orc_union32 var33; + + ptr0 = (int16_t *) ex->arrays[0]; + + for (i = 0; i < n; i++) { + var0 = *ptr0; + /* 0: mulswl */ + var32.i = var0 * var24; + /* 1: shrsl */ + var33.i = var32.i >> var16; + /* 2: convssslw */ + var0 = ORC_CLAMP_SW (var33.i); + *ptr0 = var0; + ptr0++; + } + +} + +void +orc_process_int16_clamp (gint16 * d1, int p1, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + OrcCompileResult result; + + p = orc_program_new (); + orc_program_set_name (p, "orc_process_int16_clamp"); + orc_program_set_backup_function (p, _backup_orc_process_int16_clamp); + orc_program_add_destination (p, 2, "d1"); + orc_program_add_constant (p, 2, 13, "c1"); + orc_program_add_parameter (p, 2, "p1"); + orc_program_add_temporary (p, 4, "t1"); + + orc_program_append (p, "mulswl", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1); + orc_program_append (p, "shrsl", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1); + orc_program_append (p, "convssslw", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1); + + result = orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif + + +/* orc_process_int8 */ +#ifdef DISABLE_ORC +void +orc_process_int8 (gint8 * d1, int p1, int n) +{ + int i; + int8_t var0; + int8_t *ptr0; + const int16_t var16 = 5; + const int8_t var24 = p1; + int16_t var32; + int16_t var33; + + ptr0 = (int8_t *) d1; + + for (i = 0; i < n; i++) { + var0 = *ptr0; + /* 0: mulsbw */ + var32 = var0 * var24; + /* 1: shrsw */ + var33 = var32 >> var16; + /* 2: convwb */ + var0 = var33; + *ptr0 = var0; + ptr0++; + } + +} + +#else +static void +_backup_orc_process_int8 (OrcExecutor * ex) +{ + int i; + int n = ex->n; + int8_t var0; + int8_t *ptr0; + const int16_t var16 = 5; + const int8_t var24 = ex->params[24]; + int16_t var32; + int16_t var33; + + ptr0 = (int8_t *) ex->arrays[0]; + + for (i = 0; i < n; i++) { + var0 = *ptr0; + /* 0: mulsbw */ + var32 = var0 * var24; + /* 1: shrsw */ + var33 = var32 >> var16; + /* 2: convwb */ + var0 = var33; + *ptr0 = var0; + ptr0++; + } + +} + +void +orc_process_int8 (gint8 * d1, int p1, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + OrcCompileResult result; + + p = orc_program_new (); + orc_program_set_name (p, "orc_process_int8"); + orc_program_set_backup_function (p, _backup_orc_process_int8); + orc_program_add_destination (p, 1, "d1"); + orc_program_add_constant (p, 2, 5, "c1"); + orc_program_add_parameter (p, 1, "p1"); + orc_program_add_temporary (p, 2, "t1"); + + orc_program_append (p, "mulsbw", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1); + orc_program_append (p, "shrsw", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1); + orc_program_append (p, "convwb", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1); + + result = orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif + + +/* orc_process_int8_clamp */ +#ifdef DISABLE_ORC +void +orc_process_int8_clamp (gint8 * d1, int p1, int n) +{ + int i; + int8_t var0; + int8_t *ptr0; + const int16_t var16 = 5; + const int8_t var24 = p1; + int16_t var32; + int16_t var33; + + ptr0 = (int8_t *) d1; + + for (i = 0; i < n; i++) { + var0 = *ptr0; + /* 0: mulsbw */ + var32 = var0 * var24; + /* 1: shrsw */ + var33 = var32 >> var16; + /* 2: convssswb */ + var0 = ORC_CLAMP_SB (var33); + *ptr0 = var0; + ptr0++; + } + +} + +#else +static void +_backup_orc_process_int8_clamp (OrcExecutor * ex) +{ + int i; + int n = ex->n; + int8_t var0; + int8_t *ptr0; + const int16_t var16 = 5; + const int8_t var24 = ex->params[24]; + int16_t var32; + int16_t var33; + + ptr0 = (int8_t *) ex->arrays[0]; + + for (i = 0; i < n; i++) { + var0 = *ptr0; + /* 0: mulsbw */ + var32 = var0 * var24; + /* 1: shrsw */ + var33 = var32 >> var16; + /* 2: convssswb */ + var0 = ORC_CLAMP_SB (var33); + *ptr0 = var0; + ptr0++; + } + +} + +void +orc_process_int8_clamp (gint8 * d1, int p1, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + OrcCompileResult result; + + p = orc_program_new (); + orc_program_set_name (p, "orc_process_int8_clamp"); + orc_program_set_backup_function (p, _backup_orc_process_int8_clamp); + orc_program_add_destination (p, 1, "d1"); + orc_program_add_constant (p, 2, 5, "c1"); + orc_program_add_parameter (p, 1, "p1"); + orc_program_add_temporary (p, 2, "t1"); + + orc_program_append (p, "mulsbw", ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1); + orc_program_append (p, "shrsw", ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1); + orc_program_append (p, "convssswb", ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1); + + result = orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->params[ORC_VAR_P1] = p1; + + func = p->code_exec; + func (ex); +} +#endif diff --git a/gst/volume/gstvolumeorc-dist.h b/gst/volume/gstvolumeorc-dist.h new file mode 100644 index 0000000000..756e6de326 --- /dev/null +++ b/gst/volume/gstvolumeorc-dist.h @@ -0,0 +1,23 @@ + +/* autogenerated from gstvolumeorc.orc */ + +#ifndef _GSTVOLUMEORC_H_ +#define _GSTVOLUMEORC_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void orc_process_int16 (gint16 * d1, int p1, int n); +void orc_process_int16_clamp (gint16 * d1, int p1, int n); +void orc_process_int8 (gint8 * d1, int p1, int n); +void orc_process_int8_clamp (gint8 * d1, int p1, int n); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/gst/volume/gstvolumeorc.orc b/gst/volume/gstvolumeorc.orc new file mode 100644 index 0000000000..a251df5b8d --- /dev/null +++ b/gst/volume/gstvolumeorc.orc @@ -0,0 +1,49 @@ + +#.function orc_scalarmultiply_f32_ns +#.dest 4 d1 float +#.source 4 s1 float +#.param 4 p1 + +#mulf d1, s1, p1 + + +.function orc_process_int16 +.dest 2 d1 gint16 +.param 2 p1 +.temp 4 t1 + +mulswl t1, d1, p1 +shrsl t1, t1, 13 +convlw d1, t1 + + +.function orc_process_int16_clamp +.dest 2 d1 gint16 +.param 2 p1 +.temp 4 t1 + +mulswl t1, d1, p1 +shrsl t1, t1, 13 +convssslw d1, t1 + + +.function orc_process_int8 +.dest 1 d1 gint8 +.param 1 p1 +.temp 2 t1 + +mulsbw t1, d1, p1 +shrsw t1, t1, 5 +convwb d1, t1 + + +.function orc_process_int8_clamp +.dest 1 d1 gint8 +.param 1 p1 +.temp 2 t1 + +mulsbw t1, d1, p1 +shrsw t1, t1, 5 +convssswb d1, t1 + +