static gboolean gst_audio_panorama_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps) { GstAudioPanorama *filter = GST_AUDIO_PANORAMA (base); GstAudioInfo info; /*GST_INFO ("incaps are %" GST_PTR_FORMAT, incaps); */ if (!gst_audio_info_from_caps (&info, incaps)) goto no_format; GST_DEBUG ("try to process %d input with %d channels", GST_AUDIO_INFO_FORMAT (&info), GST_AUDIO_INFO_CHANNELS (&info)); if (!gst_audio_panorama_set_process_function (filter, &info)) goto no_format; filter->info = info; return TRUE; no_format: { GST_DEBUG ("invalid caps"); return FALSE; } }
static void gst_audio_panorama_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioPanorama *filter = GST_AUDIO_PANORAMA (object); switch (prop_id) { case PROP_PANORAMA: g_value_set_float (value, filter->panorama); break; case PROP_METHOD: g_value_set_enum (value, filter->method); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static gboolean gst_audio_panorama_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps) { GstAudioPanorama *filter = GST_AUDIO_PANORAMA (base); const GstStructure *structure; gboolean ret; gint width; const gchar *fmt; /*GST_INFO ("incaps are %" GST_PTR_FORMAT, incaps); */ structure = gst_caps_get_structure (incaps, 0); ret = gst_structure_get_int (structure, "channels", &filter->channels); if (!ret) goto no_channels; ret = gst_structure_get_int (structure, "width", &width); if (!ret) goto no_width; filter->width = width / 8; fmt = gst_structure_get_name (structure); if (!strcmp (fmt, "audio/x-raw-int")) filter->format_float = FALSE; else filter->format_float = TRUE; GST_DEBUG ("try to process %s input with %d channels", fmt, filter->channels); ret = gst_audio_panorama_set_process_function (filter); if (!ret) GST_WARNING ("can't process input with %d channels", filter->channels); return ret; no_channels: GST_DEBUG ("no channels in caps"); return ret; no_width: GST_DEBUG ("no width in caps"); return ret; }
/* this function does the actual processing */ static GstFlowReturn gst_audio_panorama_transform (GstBaseTransform * base, GstBuffer * inbuf, GstBuffer * outbuf) { GstAudioPanorama *filter = GST_AUDIO_PANORAMA (base); guint num_samples = GST_BUFFER_SIZE (outbuf) / (2 * filter->width); if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (outbuf))) gst_object_sync_values (G_OBJECT (filter), GST_BUFFER_TIMESTAMP (outbuf)); if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_GAP))) { GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP); memset (GST_BUFFER_DATA (outbuf), 0, GST_BUFFER_SIZE (outbuf)); return GST_FLOW_OK; } filter->process (filter, GST_BUFFER_DATA (inbuf), GST_BUFFER_DATA (outbuf), num_samples); return GST_FLOW_OK; }
/* this function does the actual processing */ static GstFlowReturn gst_audio_panorama_transform (GstBaseTransform * base, GstBuffer * inbuf, GstBuffer * outbuf) { GstAudioPanorama *filter = GST_AUDIO_PANORAMA (base); GstClockTime timestamp, stream_time; GstMapInfo inmap, outmap; timestamp = GST_BUFFER_TIMESTAMP (inbuf); 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); gst_buffer_map (inbuf, &inmap, GST_MAP_READ); gst_buffer_map (outbuf, &outmap, GST_MAP_WRITE); if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_GAP))) { GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP); memset (outmap.data, 0, outmap.size); } else { /* output always stereo, input mono or stereo, * and info describes input format */ guint num_samples = outmap.size / (2 * GST_AUDIO_INFO_BPS (&filter->info)); filter->process (filter, inmap.data, outmap.data, num_samples); } gst_buffer_unmap (inbuf, &inmap); gst_buffer_unmap (outbuf, &outmap); return GST_FLOW_OK; }