mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 12:49:40 +00:00
volume: convert from liboil to orc
This commit is contained in:
parent
dbcf70eaae
commit
3bbdc0c5a2
5 changed files with 582 additions and 25 deletions
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
#include <gst/controller/gstcontroller.h>
|
||||
#include <gst/audio/audio.h>
|
||||
#include <gst/audio/gstaudiofilter.h>
|
||||
#include <liboil/liboil.h>
|
||||
#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);
|
||||
|
||||
|
|
458
gst/volume/gstvolumeorc-dist.c
Normal file
458
gst/volume/gstvolumeorc-dist.c
Normal file
|
@ -0,0 +1,458 @@
|
|||
|
||||
/* autogenerated from gstvolumeorc.orc */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#ifndef DISABLE_ORC
|
||||
#include <orc/orc.h>
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#include <glib.h>
|
||||
|
||||
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
|
23
gst/volume/gstvolumeorc-dist.h
Normal file
23
gst/volume/gstvolumeorc-dist.h
Normal file
|
@ -0,0 +1,23 @@
|
|||
|
||||
/* autogenerated from gstvolumeorc.orc */
|
||||
|
||||
#ifndef _GSTVOLUMEORC_H_
|
||||
#define _GSTVOLUMEORC_H_
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#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
|
||||
|
49
gst/volume/gstvolumeorc.orc
Normal file
49
gst/volume/gstvolumeorc.orc
Normal file
|
@ -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
|
||||
|
||||
|
Loading…
Reference in a new issue