/* GstBaseTransform vmethod implementations */ static GstFlowReturn gst_audio_invert_transform_ip (GstBaseTransform * base, GstBuffer * buf) { GstAudioInvert *filter = GST_AUDIO_INVERT (base); guint num_samples; GstClockTime timestamp, stream_time; GstMapInfo map; timestamp = GST_BUFFER_TIMESTAMP (buf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (GST_OBJECT (filter), stream_time); if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) return GST_FLOW_OK; gst_buffer_map (buf, &map, GST_MAP_READWRITE); num_samples = map.size / GST_AUDIO_FILTER_BPS (filter); filter->process (filter, map.data, num_samples); gst_buffer_unmap (buf, &map); return GST_FLOW_OK; }
/* GstBaseTransform vmethod implementations */ static GstFlowReturn gst_audio_invert_transform_ip (GstBaseTransform * base, GstBuffer * buf) { GstAudioInvert *filter = GST_AUDIO_INVERT (base); guint num_samples; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (buf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); num_samples = GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); if (gst_base_transform_is_passthrough (base) || G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) return GST_FLOW_OK; filter->process (filter, GST_BUFFER_DATA (buf), num_samples); return GST_FLOW_OK; }
static void gst_audio_invert_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioInvert *filter = GST_AUDIO_INVERT (object); switch (prop_id) { case PROP_DEGREE: g_value_set_float (value, filter->degree); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_audio_invert_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioInvert *filter = GST_AUDIO_INVERT (object); switch (prop_id) { case PROP_DEGREE: filter->degree = g_value_get_float (value); gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), filter->degree == 0.0); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static gboolean gst_audio_invert_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioInvert *filter = GST_AUDIO_INVERT (base); gboolean ret = TRUE; if (format->type == GST_BUFTYPE_FLOAT && format->width == 32) filter->process = (GstAudioInvertProcessFunc) gst_audio_invert_transform_float; else if (format->type == GST_BUFTYPE_LINEAR && format->width == 16) filter->process = (GstAudioInvertProcessFunc) gst_audio_invert_transform_int; else ret = FALSE; return ret; }
static gboolean gst_audio_invert_setup (GstAudioFilter * base, const GstAudioInfo * info) { GstAudioInvert *filter = GST_AUDIO_INVERT (base); gboolean ret = TRUE; switch (GST_AUDIO_INFO_FORMAT (info)) { case GST_AUDIO_FORMAT_S16: filter->process = (GstAudioInvertProcessFunc) gst_audio_invert_transform_int; break; case GST_AUDIO_FORMAT_F32: filter->process = (GstAudioInvertProcessFunc) gst_audio_invert_transform_float; break; default: ret = FALSE; break; } return ret; }