static GstFlowReturn gst_stereo_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) { GstStereo *stereo = GST_STEREO (base); gint samples; gint i; gdouble avg, ldiff, rdiff, tmp; gdouble mul = stereo->stereo; gint16 *data; GstMapInfo info; if (!gst_buffer_map (outbuf, &info, GST_MAP_READWRITE)) return GST_FLOW_ERROR; data = (gint16 *) info.data; samples = info.size / 2; if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (outbuf))) gst_object_sync_values (GST_OBJECT (stereo), GST_BUFFER_TIMESTAMP (outbuf)); if (stereo->active) { for (i = 0; i < samples / 2; i += 2) { avg = (data[i] + data[i + 1]) / 2; ldiff = data[i] - avg; rdiff = data[i + 1] - avg; tmp = avg + ldiff * mul; if (tmp < -32768) tmp = -32768; if (tmp > 32767) tmp = 32767; data[i] = tmp; tmp = avg + rdiff * mul; if (tmp < -32768) tmp = -32768; if (tmp > 32767) tmp = 32767; data[i + 1] = tmp; } } gst_buffer_unmap (outbuf, &info); return GST_FLOW_OK; }
static void gst_stereo_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstStereo *stereo = GST_STEREO (object); switch (prop_id) { case ARG_ACTIVE: g_value_set_boolean (value, stereo->active); break; case ARG_STEREO: g_value_set_float (value, stereo->stereo / 10.0); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_stereo_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstStereo *stereo; g_return_if_fail (GST_IS_STEREO (object)); stereo = GST_STEREO (object); switch (prop_id) { case ARG_ACTIVE: stereo->active = g_value_get_boolean (value); break; case ARG_STEREO: stereo->stereo = g_value_get_float (value) * 10.0; break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static GstFlowReturn gst_stereo_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) { GstStereo *stereo = GST_STEREO (base); gint16 *data = (gint16 *) GST_BUFFER_DATA (outbuf); gint samples = GST_BUFFER_SIZE (outbuf) / 2; gint i; gdouble avg, ldiff, rdiff, tmp; gdouble mul = stereo->stereo; if (!gst_buffer_is_writable (outbuf)) return GST_FLOW_OK; if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (outbuf))) gst_object_sync_values (GST_OBJECT (stereo), GST_BUFFER_TIMESTAMP (outbuf)); if (stereo->active) { for (i = 0; i < samples / 2; i += 2) { avg = (data[i] + data[i + 1]) / 2; ldiff = data[i] - avg; rdiff = data[i + 1] - avg; tmp = avg + ldiff * mul; if (tmp < -32768) tmp = -32768; if (tmp > 32767) tmp = 32767; data[i] = tmp; tmp = avg + rdiff * mul; if (tmp < -32768) tmp = -32768; if (tmp > 32767) tmp = 32767; data[i + 1] = tmp; } } return GST_FLOW_OK; }