static GstCaps * gst_play_sink_audio_convert_getcaps (GstPad * pad) { GstPlaySinkAudioConvert *self = GST_PLAY_SINK_AUDIO_CONVERT (gst_pad_get_parent (pad)); GstCaps *ret; GstPad *otherpad, *peer = NULL; GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self); otherpad = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (pad)); GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self); if (otherpad) { peer = gst_pad_get_peer (otherpad); gst_object_unref (otherpad); otherpad = NULL; } if (peer) { ret = gst_pad_get_caps_reffed (peer); gst_object_unref (peer); } else { ret = gst_caps_new_any (); } gst_object_unref (self); return ret; }
static GstCaps * gst_play_sink_audio_convert_getcaps (GstPad * pad) { GstPlaySinkAudioConvert *self = GST_PLAY_SINK_AUDIO_CONVERT (gst_pad_get_parent (pad)); GstCaps *ret; GstPad *otherpad, *peer; GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self); if (pad == self->srcpad) otherpad = gst_object_ref (self->sinkpad); else otherpad = gst_object_ref (self->srcpad); GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self); peer = gst_pad_get_peer (otherpad); if (peer) { ret = gst_pad_get_caps_reffed (peer); gst_object_unref (peer); } else { ret = gst_caps_new_any (); } gst_object_unref (otherpad); gst_object_unref (self); return ret; }
static gboolean gst_play_sink_audio_convert_sink_setcaps (GstPad * pad, GstCaps * caps) { GstPlaySinkAudioConvert *self = GST_PLAY_SINK_AUDIO_CONVERT (gst_pad_get_parent (pad)); gboolean ret; GstStructure *s; const gchar *name; gboolean reconfigure = FALSE; GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self); s = gst_caps_get_structure (caps, 0); name = gst_structure_get_name (s); if (g_str_has_prefix (name, "audio/x-raw-")) { if (!self->raw && !gst_pad_is_blocked (self->sink_proxypad)) { GST_DEBUG_OBJECT (self, "Changing caps from non-raw to raw"); reconfigure = TRUE; gst_pad_set_blocked_async_full (self->sink_proxypad, TRUE, (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self), (GDestroyNotify) gst_object_unref); } } else { if (self->raw && !gst_pad_is_blocked (self->sink_proxypad)) { GST_DEBUG_OBJECT (self, "Changing caps from raw to non-raw"); reconfigure = TRUE; gst_pad_set_blocked_async_full (self->sink_proxypad, TRUE, (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self), (GDestroyNotify) gst_object_unref); } } /* Otherwise the setcaps below fails */ if (reconfigure) { gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL); gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL); } GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self); ret = gst_ghost_pad_setcaps_default (pad, caps); GST_DEBUG_OBJECT (self, "Setting sink caps %" GST_PTR_FORMAT ": %d", caps, ret); gst_object_unref (self); return ret; }
static gboolean gst_play_sink_audio_convert_sink_event (GstPad * pad, GstEvent * event) { GstPlaySinkAudioConvert *self = GST_PLAY_SINK_AUDIO_CONVERT (gst_pad_get_parent (pad)); gboolean ret; ret = gst_proxy_pad_event_default (pad, gst_event_ref (event)); if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { gboolean update; gdouble rate, applied_rate; GstFormat format; gint64 start, stop, position; GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self); gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, &format, &start, &stop, &position); GST_DEBUG_OBJECT (self, "Segment before %" GST_SEGMENT_FORMAT, &self->segment); gst_segment_set_newsegment_full (&self->segment, update, rate, applied_rate, format, start, stop, position); GST_DEBUG_OBJECT (self, "Segment after %" GST_SEGMENT_FORMAT, &self->segment); GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self); } else if (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) { GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self); GST_DEBUG_OBJECT (self, "Resetting segment"); gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED); GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self); } gst_event_unref (event); gst_object_unref (self); return ret; }