mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
gst/volume/gstvolume.c: memset buffers to zero if we get a GAP buffer. We usually see a buffer as one unit so let's h...
Original commit message from CVS: * gst/volume/gstvolume.c: (gst_volume_interface_supported), (gst_volume_base_init), (gst_volume_class_init), (volume_process_double), (volume_process_float), (volume_transform_ip), (plugin_init): memset buffers to zero if we get a GAP buffer. We usually see a buffer as one unit so let's handle it as one and don't care about volume changes while processing one buffer. Also clean up some stuff a bit.
This commit is contained in:
parent
88136fc11a
commit
2034387d4d
2 changed files with 47 additions and 27 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2008-03-21 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
|
* gst/volume/gstvolume.c: (gst_volume_interface_supported),
|
||||||
|
(gst_volume_base_init), (gst_volume_class_init),
|
||||||
|
(volume_process_double), (volume_process_float),
|
||||||
|
(volume_transform_ip), (plugin_init):
|
||||||
|
memset buffers to zero if we get a GAP buffer. We usually see a
|
||||||
|
buffer as one unit so let's handle it as one and don't care about
|
||||||
|
volume changes while processing one buffer.
|
||||||
|
Also clean up some stuff a bit.
|
||||||
|
|
||||||
2008-03-21 Sebastian Dröge <slomo@circular-chaos.org>
|
2008-03-21 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
* gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init),
|
* gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init),
|
||||||
|
|
|
@ -84,11 +84,6 @@
|
||||||
#define GST_CAT_DEFAULT gst_volume_debug
|
#define GST_CAT_DEFAULT gst_volume_debug
|
||||||
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
|
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
|
||||||
|
|
||||||
static const GstElementDetails volume_details = GST_ELEMENT_DETAILS ("Volume",
|
|
||||||
"Filter/Effect/Audio",
|
|
||||||
"Set volume on audio/raw streams",
|
|
||||||
"Andy Wingo <wingo@pobox.com>");
|
|
||||||
|
|
||||||
/* Filter signals and args */
|
/* Filter signals and args */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -293,7 +288,7 @@ volume_update_real_volume (GstVolume * this)
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_volume_interface_supported (GstImplementsInterface * iface, GType type)
|
gst_volume_interface_supported (GstImplementsInterface * iface, GType type)
|
||||||
{
|
{
|
||||||
g_assert (type == GST_TYPE_MIXER);
|
g_return_val_if_fail (type == GST_TYPE_MIXER, FALSE);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -391,7 +386,9 @@ gst_volume_base_init (gpointer g_class)
|
||||||
GstAudioFilterClass *filter_class = GST_AUDIO_FILTER_CLASS (g_class);
|
GstAudioFilterClass *filter_class = GST_AUDIO_FILTER_CLASS (g_class);
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
|
||||||
gst_element_class_set_details (element_class, &volume_details);
|
gst_element_class_set_details_simple (element_class, "Volume",
|
||||||
|
"Filter/Effect/Audio",
|
||||||
|
"Set volume on audio/raw streams", "Andy Wingo <wingo@pobox.com>");
|
||||||
|
|
||||||
caps = gst_caps_from_string (ALLOWED_CAPS);
|
caps = gst_caps_from_string (ALLOWED_CAPS);
|
||||||
gst_audio_filter_class_add_pad_templates (filter_class, caps);
|
gst_audio_filter_class_add_pad_templates (filter_class, caps);
|
||||||
|
@ -422,8 +419,6 @@ gst_volume_class_init (GstVolumeClass * klass)
|
||||||
0.0, VOLUME_MAX_DOUBLE, 1.0,
|
0.0, VOLUME_MAX_DOUBLE, 1.0,
|
||||||
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
|
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "volume", 0, "Volume gain");
|
|
||||||
|
|
||||||
trans_class->transform_ip = GST_DEBUG_FUNCPTR (volume_transform_ip);
|
trans_class->transform_ip = GST_DEBUG_FUNCPTR (volume_transform_ip);
|
||||||
filter_class->setup = GST_DEBUG_FUNCPTR (volume_setup);
|
filter_class->setup = GST_DEBUG_FUNCPTR (volume_setup);
|
||||||
}
|
}
|
||||||
|
@ -455,11 +450,6 @@ gst_volume_init (GstVolume * this, GstVolumeClass * g_class)
|
||||||
gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (this), TRUE);
|
gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (this), TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: although it might be tempting to have volume_process_mute() which uses
|
|
||||||
* memset(bytes, 0, nbytes) for the vol=0 case, this has the downside that
|
|
||||||
* unmuting would only take place after processing a buffer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
volume_process_double (GstVolume * this, gpointer bytes, guint n_bytes)
|
volume_process_double (GstVolume * this, gpointer bytes, guint n_bytes)
|
||||||
{
|
{
|
||||||
|
@ -471,6 +461,8 @@ volume_process_double (GstVolume * this, gpointer bytes, guint n_bytes)
|
||||||
|
|
||||||
oil_scalarmultiply_f64_ns (data, data, &vol, num_samples);
|
oil_scalarmultiply_f64_ns (data, data, &vol, num_samples);
|
||||||
#else
|
#else
|
||||||
|
gint i;
|
||||||
|
|
||||||
for (i = 0; i < num_samples; i++) {
|
for (i = 0; i < num_samples; i++) {
|
||||||
*data++ *= this->real_vol_f;
|
*data++ *= this->real_vol_f;
|
||||||
}
|
}
|
||||||
|
@ -483,15 +475,16 @@ volume_process_float (GstVolume * this, gpointer bytes, guint n_bytes)
|
||||||
gfloat *data = (gfloat *) bytes;
|
gfloat *data = (gfloat *) bytes;
|
||||||
guint num_samples = n_bytes / sizeof (gfloat);
|
guint num_samples = n_bytes / sizeof (gfloat);
|
||||||
|
|
||||||
/*
|
#if 0
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
for (i = 0; i < num_samples; i++) {
|
for (i = 0; i < num_samples; i++) {
|
||||||
*data++ *= this->real_vol_f;
|
*data++ *= this->real_vol_f;
|
||||||
}
|
}
|
||||||
|
/* 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
|
||||||
*/
|
*/
|
||||||
/* time gst-launch 2>/dev/null audiotestsrc wave=7 num-buffers=10000 ! audio/x-raw-float ! volume volume=1.5 ! fakesink
|
#endif
|
||||||
* goes from 0m0.850s -> 0m0.717s with liboil
|
|
||||||
*/
|
|
||||||
oil_scalarmultiply_f32_ns (data, data, &this->real_vol_f, num_samples);
|
oil_scalarmultiply_f32_ns (data, data, &this->real_vol_f, num_samples);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -530,10 +523,22 @@ volume_process_int32_clamp (GstVolume * this, gpointer bytes, guint n_bytes)
|
||||||
|
|
||||||
#if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
|
#if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
|
||||||
#define get_unaligned_i24(_x) ( (((guint8*)_x)[0]) | ((((guint8*)_x)[1]) << 8) | ((((gint8*)_x)[2]) << 16) )
|
#define get_unaligned_i24(_x) ( (((guint8*)_x)[0]) | ((((guint8*)_x)[1]) << 8) | ((((gint8*)_x)[2]) << 16) )
|
||||||
#define write_unaligned_u24(_x,samp) do { *(_x)++ = samp & 0xFF; *(_x)++ = (samp >> 8) & 0xFF; *(_x)++ = (samp >> 16) & 0xFF; } while (0)
|
|
||||||
|
#define write_unaligned_u24(_x,samp) \
|
||||||
|
G_STMT_START { \
|
||||||
|
*(_x)++ = samp & 0xFF; \
|
||||||
|
*(_x)++ = (samp >> 8) & 0xFF; \
|
||||||
|
*(_x)++ = (samp >> 16) & 0xFF; \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
#else /* BIG ENDIAN */
|
#else /* BIG ENDIAN */
|
||||||
#define get_unaligned_i24(_x) ( (((guint8*)_x)[2]) | ((((guint8*)_x)[1]) << 8) | ((((gint8*)_x)[0]) << 16) )
|
#define get_unaligned_i24(_x) ( (((guint8*)_x)[2]) | ((((guint8*)_x)[1]) << 8) | ((((gint8*)_x)[0]) << 16) )
|
||||||
#define write_unaligned_u24(_x,samp) do { *(_x)++ = (samp >> 16) & 0xFF; *(_x)++ = (samp >> 8) & 0xFF; *(_x)++ = samp & 0xFF; } while (0)
|
#define write_unaligned_u24(_x,samp) \
|
||||||
|
G_STMT_START { \
|
||||||
|
*(_x)++ = (samp >> 16) & 0xFF; \
|
||||||
|
*(_x)++ = (samp >> 8) & 0xFF; \
|
||||||
|
*(_x)++ = samp & 0xFF; \
|
||||||
|
} G_STMT_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -709,10 +714,12 @@ volume_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
|
||||||
GST_BUFFER_FLAG_IS_SET (outbuf, GST_BUFFER_FLAG_GAP))
|
GST_BUFFER_FLAG_IS_SET (outbuf, GST_BUFFER_FLAG_GAP))
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
|
||||||
if (this->real_vol_f == 0.0)
|
if (this->real_vol_f == 0.0) {
|
||||||
this->silent_buffer = TRUE;
|
this->silent_buffer = TRUE;
|
||||||
|
memset (GST_BUFFER_DATA (outbuf), 0, GST_BUFFER_SIZE (outbuf));
|
||||||
|
} else if (this->real_vol_f != 1.0) {
|
||||||
this->process (this, GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf));
|
this->process (this, GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf));
|
||||||
|
}
|
||||||
|
|
||||||
if (this->silent_buffer)
|
if (this->silent_buffer)
|
||||||
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP);
|
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP);
|
||||||
|
@ -799,6 +806,8 @@ plugin_init (GstPlugin * plugin)
|
||||||
/* initialize gst controller library */
|
/* initialize gst controller library */
|
||||||
gst_controller_init (NULL, NULL);
|
gst_controller_init (NULL, NULL);
|
||||||
|
|
||||||
|
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "volume", 0, "Volume gain");
|
||||||
|
|
||||||
return gst_element_register (plugin, "volume", GST_RANK_NONE,
|
return gst_element_register (plugin, "volume", GST_RANK_NONE,
|
||||||
GST_TYPE_VOLUME);
|
GST_TYPE_VOLUME);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue