mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-26 09:08:14 +00:00
rtphdrext: allow updating depayloader src caps
Add overridable method that updates depayloader's src caps based on the data from RTP header. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1011>
This commit is contained in:
parent
899c69abad
commit
c222f322c0
3 changed files with 135 additions and 0 deletions
|
@ -60,6 +60,8 @@ struct _GstRTPBaseDepayloadPrivate
|
||||||
gboolean negotiated;
|
gboolean negotiated;
|
||||||
|
|
||||||
GstCaps *last_caps;
|
GstCaps *last_caps;
|
||||||
|
gboolean needs_src_caps_update;
|
||||||
|
|
||||||
GstEvent *segment_event;
|
GstEvent *segment_event;
|
||||||
guint32 segment_seqnum; /* Note: this is a GstEvent seqnum */
|
guint32 segment_seqnum; /* Note: this is a GstEvent seqnum */
|
||||||
|
|
||||||
|
@ -1241,6 +1243,10 @@ read_rtp_header_extensions (GstRTPBaseDepayload * depayload,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gst_rtp_header_extension_wants_update_non_rtp_src_caps (ext)) {
|
||||||
|
depayload->priv->needs_src_caps_update = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
gst_object_unref (ext);
|
gst_object_unref (ext);
|
||||||
}
|
}
|
||||||
GST_OBJECT_UNLOCK (depayload);
|
GST_OBJECT_UNLOCK (depayload);
|
||||||
|
@ -1307,6 +1313,46 @@ gst_rtp_base_depayload_prepare_push (GstRTPBaseDepayload * filter,
|
||||||
set_headers (buf, 0, filter);
|
set_headers (buf, 0, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* header extensions may want to update src caps */
|
||||||
|
if (G_UNLIKELY (filter->priv->needs_src_caps_update)) {
|
||||||
|
GstCaps *src_caps = gst_pad_get_current_caps (filter->srcpad);
|
||||||
|
|
||||||
|
if (src_caps) {
|
||||||
|
GstCaps *new_caps;
|
||||||
|
gboolean update_ok = TRUE;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
new_caps = gst_caps_copy (src_caps);
|
||||||
|
for (i = 0; i < filter->priv->header_exts->len; i++) {
|
||||||
|
GstRTPHeaderExtension *ext;
|
||||||
|
|
||||||
|
ext = g_ptr_array_index (filter->priv->header_exts, i);
|
||||||
|
update_ok =
|
||||||
|
gst_rtp_header_extension_update_non_rtp_src_caps (ext, new_caps);
|
||||||
|
|
||||||
|
if (!update_ok) {
|
||||||
|
GST_ELEMENT_ERROR (filter, STREAM, DECODE,
|
||||||
|
("RTP header extension (%s) could not update src caps",
|
||||||
|
GST_OBJECT_NAME (ext)), (NULL));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (G_UNLIKELY (update_ok && !gst_caps_is_equal (src_caps, new_caps))) {
|
||||||
|
gst_pad_set_caps (filter->srcpad, new_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_caps_unref (src_caps);
|
||||||
|
gst_caps_unref (new_caps);
|
||||||
|
|
||||||
|
if (!update_ok) {
|
||||||
|
return GST_FLOW_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filter->priv->needs_src_caps_update = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* if this is the first buffer send a NEWSEGMENT */
|
/* if this is the first buffer send a NEWSEGMENT */
|
||||||
if (G_UNLIKELY (filter->priv->segment_event)) {
|
if (G_UNLIKELY (filter->priv->segment_event)) {
|
||||||
gst_pad_push_event (filter->srcpad, filter->priv->segment_event);
|
gst_pad_push_event (filter->srcpad, filter->priv->segment_event);
|
||||||
|
|
|
@ -394,6 +394,49 @@ gst_rtp_header_extension_set_attributes_from_caps (GstRTPHeaderExtension * ext,
|
||||||
return klass->set_attributes_from_caps (ext, caps);
|
return klass->set_attributes_from_caps (ext, caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_rtp_header_extension_wants_update_non_rtp_src_caps:
|
||||||
|
* @ext: a #GstRTPHeaderExtension
|
||||||
|
*
|
||||||
|
* Call this function after gst_rtp_header_extension_read() to check if
|
||||||
|
* the depayloader's src caps need updating with data received in the last RTP
|
||||||
|
* packet.
|
||||||
|
*
|
||||||
|
* Returns: Whether @ext wants to update depayloader's src caps.
|
||||||
|
*
|
||||||
|
* Since: 1.20
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_rtp_header_extension_wants_update_non_rtp_src_caps (GstRTPHeaderExtension *
|
||||||
|
ext)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (GST_IS_RTP_HEADER_EXTENSION (ext), FALSE);
|
||||||
|
|
||||||
|
return ext->wants_update_non_rtp_src_caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_rtp_header_extension_set_wants_update_non_rtp_src_caps:
|
||||||
|
* @ext: a #GstRTPHeaderExtension
|
||||||
|
* @state: TRUE if caps update is needed
|
||||||
|
*
|
||||||
|
* Call this function in a subclass from #GstRTPHeaderExtensionClass::read to
|
||||||
|
* tell the depayloader whether the data just parsed from RTP packet require
|
||||||
|
* updating its src (non-RTP) caps. If @state is TRUE, #GstRTPBaseDepayload will
|
||||||
|
* eventually invoke gst_rtp_header_extension_update_non_rtp_src_caps() to
|
||||||
|
* have the caps update applied. Applying the update also flips the internal
|
||||||
|
* "wants update" flag back to FALSE.
|
||||||
|
*
|
||||||
|
* Since: 1.20
|
||||||
|
*/
|
||||||
|
void gst_rtp_header_extension_set_wants_update_non_rtp_src_caps
|
||||||
|
(GstRTPHeaderExtension * ext, gboolean state)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GST_IS_RTP_HEADER_EXTENSION (ext));
|
||||||
|
|
||||||
|
ext->wants_update_non_rtp_src_caps = state;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_rtp_header_extension_set_non_rtp_sink_caps:
|
* gst_rtp_header_extension_set_non_rtp_sink_caps:
|
||||||
* @ext: a #GstRTPHeaderExtension
|
* @ext: a #GstRTPHeaderExtension
|
||||||
|
@ -424,6 +467,39 @@ gst_rtp_header_extension_set_non_rtp_sink_caps (GstRTPHeaderExtension * ext,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_rtp_header_extension_update_non_rtp_src_caps:
|
||||||
|
* @ext: a #GstRTPHeaderExtension
|
||||||
|
* @caps: src #GstCaps to modify
|
||||||
|
*
|
||||||
|
* Updates depayloader src caps based on the information received in RTP header.
|
||||||
|
* @caps must be writable as this function may modify them.
|
||||||
|
*
|
||||||
|
* Returns: whether @caps were modified successfully
|
||||||
|
*
|
||||||
|
* Since: 1.20
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_rtp_header_extension_update_non_rtp_src_caps (GstRTPHeaderExtension * ext,
|
||||||
|
GstCaps * caps)
|
||||||
|
{
|
||||||
|
GstRTPHeaderExtensionClass *klass;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
|
||||||
|
g_return_val_if_fail (gst_caps_is_writable (caps), FALSE);
|
||||||
|
g_return_val_if_fail (GST_IS_RTP_HEADER_EXTENSION (ext), FALSE);
|
||||||
|
g_return_val_if_fail (ext->ext_id <= MAX_RTP_EXT_ID, FALSE);
|
||||||
|
klass = GST_RTP_HEADER_EXTENSION_GET_CLASS (ext);
|
||||||
|
|
||||||
|
ext->wants_update_non_rtp_src_caps = FALSE;
|
||||||
|
|
||||||
|
if (klass->update_non_rtp_src_caps) {
|
||||||
|
return klass->update_non_rtp_src_caps (ext, caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_rtp_header_extension_set_caps_from_attributes:
|
* gst_rtp_header_extension_set_caps_from_attributes:
|
||||||
* @ext: a #GstRTPHeaderExtension
|
* @ext: a #GstRTPHeaderExtension
|
||||||
|
|
|
@ -117,6 +117,7 @@ struct _GstRTPHeaderExtension
|
||||||
GstElement parent;
|
GstElement parent;
|
||||||
|
|
||||||
guint ext_id;
|
guint ext_id;
|
||||||
|
gboolean wants_update_non_rtp_src_caps;
|
||||||
|
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
gpointer _gst_reserved[GST_PADDING];
|
||||||
|
@ -140,6 +141,8 @@ struct _GstRTPHeaderExtension
|
||||||
* information, optionally adding some meta onto the output buffer.
|
* information, optionally adding some meta onto the output buffer.
|
||||||
* @set_non_rtp_sink_caps: read any information from sink caps that the header
|
* @set_non_rtp_sink_caps: read any information from sink caps that the header
|
||||||
* extension needs for its function.
|
* extension needs for its function.
|
||||||
|
* @update_non_rtp_src_caps: update depayloader non-RTP (depayloaded) caps with
|
||||||
|
* the information parsed from RTP header.
|
||||||
* @set_attributes_from_caps: read the caps information to set the necessary
|
* @set_attributes_from_caps: read the caps information to set the necessary
|
||||||
* attributes that may be signaled e.g. with an SDP.
|
* attributes that may be signaled e.g. with an SDP.
|
||||||
* @set_caps_from_attributes: write the necessary caps field/s for the configured
|
* @set_caps_from_attributes: write the necessary caps field/s for the configured
|
||||||
|
@ -173,6 +176,8 @@ struct _GstRTPHeaderExtensionClass
|
||||||
GstBuffer * buffer);
|
GstBuffer * buffer);
|
||||||
gboolean (*set_non_rtp_sink_caps) (GstRTPHeaderExtension * ext,
|
gboolean (*set_non_rtp_sink_caps) (GstRTPHeaderExtension * ext,
|
||||||
const GstCaps * caps);
|
const GstCaps * caps);
|
||||||
|
gboolean (*update_non_rtp_src_caps) (GstRTPHeaderExtension * ext,
|
||||||
|
GstCaps * caps);
|
||||||
gboolean (*set_attributes_from_caps) (GstRTPHeaderExtension * ext,
|
gboolean (*set_attributes_from_caps) (GstRTPHeaderExtension * ext,
|
||||||
const GstCaps * caps);
|
const GstCaps * caps);
|
||||||
gboolean (*set_caps_from_attributes) (GstRTPHeaderExtension * ext,
|
gboolean (*set_caps_from_attributes) (GstRTPHeaderExtension * ext,
|
||||||
|
@ -224,6 +229,14 @@ GST_RTP_API
|
||||||
gboolean gst_rtp_header_extension_set_non_rtp_sink_caps (GstRTPHeaderExtension * ext,
|
gboolean gst_rtp_header_extension_set_non_rtp_sink_caps (GstRTPHeaderExtension * ext,
|
||||||
const GstCaps * caps);
|
const GstCaps * caps);
|
||||||
GST_RTP_API
|
GST_RTP_API
|
||||||
|
gboolean gst_rtp_header_extension_wants_update_non_rtp_src_caps (GstRTPHeaderExtension * ext);
|
||||||
|
GST_RTP_API
|
||||||
|
void gst_rtp_header_extension_set_wants_update_non_rtp_src_caps (GstRTPHeaderExtension * ext,
|
||||||
|
gboolean state);
|
||||||
|
GST_RTP_API
|
||||||
|
gboolean gst_rtp_header_extension_update_non_rtp_src_caps (GstRTPHeaderExtension * ext,
|
||||||
|
GstCaps * caps);
|
||||||
|
GST_RTP_API
|
||||||
gboolean gst_rtp_header_extension_set_caps_from_attributes (GstRTPHeaderExtension * ext,
|
gboolean gst_rtp_header_extension_set_caps_from_attributes (GstRTPHeaderExtension * ext,
|
||||||
GstCaps * caps);
|
GstCaps * caps);
|
||||||
GST_RTP_API
|
GST_RTP_API
|
||||||
|
|
Loading…
Reference in a new issue