From 070eacdd4f9798919f144b3861e631a8e13be866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Wed, 20 Mar 2019 18:31:48 -0400 Subject: [PATCH] rtpstorage + rtpulpfecdec: Get the storage using a query as fallback This allows it to be used using gst-launch for easier testing. --- gst/rtp/gstrtpstorage.c | 19 +++++++++++++++++++ gst/rtp/gstrtpulpfecdec.c | 29 ++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/gst/rtp/gstrtpstorage.c b/gst/rtp/gstrtpstorage.c index 4be1aec591..b43eb982c6 100644 --- a/gst/rtp/gstrtpstorage.c +++ b/gst/rtp/gstrtpstorage.c @@ -132,6 +132,23 @@ gst_rtp_storage_get_property (GObject * object, guint prop_id, } } +static gboolean +gst_rtp_storage_src_query (GstPad * pad, GstObject * parent, GstQuery * query) +{ + GstRtpStorage *self = GST_RTP_STORAGE (parent); + + if (GST_QUERY_TYPE (query) == GST_QUERY_CUSTOM) { + GstStructure *s = gst_query_writable_structure (query); + + if (gst_structure_has_name (s, "GstRtpStorage")) { + gst_structure_set (s, "storage", G_TYPE_OBJECT, self->storage, NULL); + return TRUE; + } + } + + return gst_pad_query_default (pad, parent, query); +} + static void gst_rtp_storage_init (GstRtpStorage * self) { @@ -141,6 +158,8 @@ gst_rtp_storage_init (GstRtpStorage * self) GST_PAD_SET_PROXY_ALLOCATION (self->sinkpad); gst_pad_set_chain_function (self->sinkpad, gst_rtp_storage_chain); + gst_pad_set_query_function (self->srcpad, gst_rtp_storage_src_query); + gst_element_add_pad (GST_ELEMENT (self), self->srcpad); gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); diff --git a/gst/rtp/gstrtpulpfecdec.c b/gst/rtp/gstrtpulpfecdec.c index 4a73b6db9b..08d68fe975 100644 --- a/gst/rtp/gstrtpulpfecdec.c +++ b/gst/rtp/gstrtpulpfecdec.c @@ -30,10 +30,10 @@ * element and attempt to recover packets declared lost through custom * 'GstRTPPacketLost' events, usually emitted by #GstRtpJitterBuffer. * - * As such, this element cannot be usefully used from the command line, - * because a reference to the upstream storage object needs to be - * provided to it through its #GstRtpUlpFecDec:storage property, example - * programs are available at + * If no storage is provided using the #GstRtpUlpFecDec:storage + * property, it will try to get it from an element upstream. + * + * Example programs are available at * * and * . @@ -472,7 +472,26 @@ gst_rtp_ulpfec_dec_handle_sink_event (GstPad * pad, GstObject * parent, s = gst_event_writable_structure (event); g_assert (self->have_caps_ssrc); - g_assert (self->storage); + + if (self->storage == NULL) { + GstQuery *q = gst_query_new_custom (GST_QUERY_CUSTOM, + gst_structure_new_empty ("GstRtpStorage")); + + if (gst_pad_peer_query (self->sinkpad, q)) { + const GstStructure *s = gst_query_get_structure (q); + + if (gst_structure_has_field_typed (s, "storage", G_TYPE_OBJECT)) { + gst_structure_get (s, "storage", G_TYPE_OBJECT, &self->storage, NULL); + } + } + gst_query_unref (q); + } + + if (self->storage == NULL) { + GST_ELEMENT_WARNING (self, STREAM, FAILED, ("Internal storage not found"), + ("You need to add rtpstorage element upstream from rtpulpfecdec.")); + return FALSE; + } if (!gst_structure_get (s, "seqnum", G_TYPE_UINT, &seqnum,