diff --git a/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtphdrext.c b/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtphdrext.c index 44649dfd3c..f3642684b0 100644 --- a/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtphdrext.c +++ b/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtphdrext.c @@ -399,21 +399,55 @@ gst_rtp_header_extension_set_attributes_from_caps (GstRTPHeaderExtension * ext, GstRTPHeaderExtensionClass *klass; GstStructure *structure; gchar *field_name; + const GValue *val; g_return_val_if_fail (GST_IS_CAPS (caps), FALSE); g_return_val_if_fail (gst_caps_is_fixed (caps), FALSE); g_return_val_if_fail (GST_IS_RTP_HEADER_EXTENSION (ext), FALSE); g_return_val_if_fail (priv->ext_id <= MAX_RTP_EXT_ID, FALSE); klass = GST_RTP_HEADER_EXTENSION_GET_CLASS (ext); - g_return_val_if_fail (klass->set_attributes_from_caps != NULL, FALSE); structure = gst_caps_get_structure (caps, 0); g_return_val_if_fail (structure != NULL, FALSE); field_name = g_strdup_printf ("extmap-%u", priv->ext_id); g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE); + + val = gst_structure_get_value (structure, field_name); g_free (field_name); - return klass->set_attributes_from_caps (ext, caps); + if (G_VALUE_HOLDS_STRING (val)) { + const gchar *ext_uri = g_value_get_string (val); + + if (g_strcmp0 (ext_uri, gst_rtp_header_extension_get_uri (ext)) != 0) { + /* incompatible extension uri for this instance */ + goto error; + } + } else if (GST_VALUE_HOLDS_ARRAY (val) + && gst_value_array_get_size (val) == 3) { + const GValue *inner_val; + + inner_val = gst_value_array_get_value (val, 1); + if (!G_VALUE_HOLDS_STRING (inner_val)) + goto error; + if (g_strcmp0 (g_value_get_string (inner_val), + gst_rtp_header_extension_get_uri (ext)) != 0) + goto error; + + inner_val = gst_value_array_get_value (val, 2); + if (!G_VALUE_HOLDS_STRING (inner_val)) + goto error; + } else { + /* unknown caps format */ + goto error; + } + + if (klass->set_attributes_from_caps) + return klass->set_attributes_from_caps (ext, caps); + else + return TRUE; + +error: + return FALSE; } /** @@ -586,42 +620,6 @@ gst_rtp_header_extension_get_sdp_caps_field_name (GstRTPHeaderExtension * ext) return g_strdup_printf ("extmap-%u", priv->ext_id); } -/** - * gst_rtp_header_extension_set_attributes_from_caps_simple_sdp: - * @ext: the #GstRTPHeaderExtension - * @caps: #GstCaps to read attributes from - * - * Helper implementation for GstRTPExtensionClass::set_attributes_from_caps - * that retrieves the configured extension id and checks that the - * corresponding field in the sdp caps is configured for this extension uri. - * Requires that the extension does not have any attributes or direction - * advertised in the caps. - * - * Returns: whether the attributes in the @caps could be set on @ext successfully - * - * Since: 1.20 - */ -gboolean - gst_rtp_header_extension_set_attributes_from_caps_simple_sdp - (GstRTPHeaderExtension * ext, const GstCaps * caps) { - gchar *field_name = gst_rtp_header_extension_get_sdp_caps_field_name (ext); - GstStructure *s = gst_caps_get_structure (caps, 0); - const gchar *ext_uri; - - if (!(ext_uri = gst_structure_get_string (s, field_name))) - goto error; - - if (g_strcmp0 (ext_uri, gst_rtp_header_extension_get_uri (ext)) != 0) - goto error; - - g_free (field_name); - return TRUE; - -error: - g_free (field_name); - return FALSE; -} - /** * gst_rtp_header_extension_set_caps_from_attributes_simple_sdp: * @ext: the #GstRTPHeaderExtension diff --git a/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtphdrext.h b/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtphdrext.h index d68a25d9df..aedc1a66ee 100644 --- a/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtphdrext.h +++ b/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtphdrext.h @@ -248,8 +248,6 @@ GstRTPHeaderExtension * gst_rtp_header_extension_create_from_uri (const gchar * GST_RTP_API gchar * gst_rtp_header_extension_get_sdp_caps_field_name (GstRTPHeaderExtension * ext); GST_RTP_API -gboolean gst_rtp_header_extension_set_attributes_from_caps_simple_sdp (GstRTPHeaderExtension * ext, const GstCaps *caps); -GST_RTP_API gboolean gst_rtp_header_extension_set_caps_from_attributes_simple_sdp (GstRTPHeaderExtension * ext, GstCaps *caps); G_END_DECLS diff --git a/subprojects/gst-plugins-good/gst/rtp/gstrtphdrext-colorspace.c b/subprojects/gst-plugins-good/gst/rtp/gstrtphdrext-colorspace.c index eded3bed60..c099db2084 100644 --- a/subprojects/gst-plugins-good/gst/rtp/gstrtphdrext-colorspace.c +++ b/subprojects/gst-plugins-good/gst/rtp/gstrtphdrext-colorspace.c @@ -451,8 +451,6 @@ static void gst_rtp_header_extension_colorspace_set_non_rtp_sink_caps; rtp_hdr_class->update_non_rtp_src_caps = gst_rtp_header_extension_colorspace_update_non_rtp_src_caps; - rtp_hdr_class->set_attributes_from_caps = - gst_rtp_header_extension_set_attributes_from_caps_simple_sdp; rtp_hdr_class->set_caps_from_attributes = gst_rtp_header_extension_set_caps_from_attributes_simple_sdp; diff --git a/subprojects/gst-plugins-good/gst/rtpmanager/gstrtphdrext-rfc6464.c b/subprojects/gst-plugins-good/gst/rtpmanager/gstrtphdrext-rfc6464.c index 03f9e54360..5e35abc29e 100644 --- a/subprojects/gst-plugins-good/gst/rtpmanager/gstrtphdrext-rfc6464.c +++ b/subprojects/gst-plugins-good/gst/rtpmanager/gstrtphdrext-rfc6464.c @@ -119,36 +119,14 @@ gst_rtp_header_extension_rfc6464_set_attributes_from_caps (GstRTPHeaderExtension { gchar *field_name = gst_rtp_header_extension_get_sdp_caps_field_name (ext); GstStructure *s = gst_caps_get_structure (caps, 0); - const gchar *ext_uri; const GValue *arr; - if (!field_name) - return FALSE; + arr = gst_structure_get_value (s, field_name); + g_free (field_name); - if ((ext_uri = gst_structure_get_string (s, field_name))) { - if (g_strcmp0 (ext_uri, gst_rtp_header_extension_get_uri (ext)) != 0) { - /* incompatible extension uri for this instance */ - goto error; - } - set_vad (ext, DEFAULT_VAD); - } else if ((arr = gst_structure_get_value (s, field_name)) - && GST_VALUE_HOLDS_ARRAY (arr) - && gst_value_array_get_size (arr) == 3) { - const GValue *val; - const gchar *vad_attr; - - val = gst_value_array_get_value (arr, 1); - if (!G_VALUE_HOLDS_STRING (val)) - goto error; - if (g_strcmp0 (g_value_get_string (val), - gst_rtp_header_extension_get_uri (ext)) != 0) - goto error; - - val = gst_value_array_get_value (arr, 2); - if (!G_VALUE_HOLDS_STRING (val)) - goto error; - - vad_attr = g_value_get_string (val); + if (GST_VALUE_HOLDS_ARRAY (arr)) { + const GValue *val = gst_value_array_get_value (arr, 2); + const gchar *vad_attr = g_value_get_string (val); if (g_str_equal (vad_attr, "vad=on")) set_vad (ext, TRUE); @@ -156,19 +134,11 @@ gst_rtp_header_extension_rfc6464_set_attributes_from_caps (GstRTPHeaderExtension set_vad (ext, FALSE); else { GST_WARNING_OBJECT (ext, "Invalid attribute: %s", vad_attr); - goto error; + return FALSE; } - } else { - /* unknown caps format */ - goto error; } - g_free (field_name); return TRUE; - -error: - g_free (field_name); - return FALSE; } static gboolean diff --git a/subprojects/gst-plugins-good/gst/rtpmanager/gstrtphdrext-twcc.c b/subprojects/gst-plugins-good/gst/rtpmanager/gstrtphdrext-twcc.c index 1382e7ca21..bbf2b5ef67 100644 --- a/subprojects/gst-plugins-good/gst/rtpmanager/gstrtphdrext-twcc.c +++ b/subprojects/gst-plugins-good/gst/rtpmanager/gstrtphdrext-twcc.c @@ -104,8 +104,6 @@ gst_rtp_header_extension_twcc_class_init (GstRTPHeaderExtensionTWCCClass * rtp_hdr_class->get_max_size = gst_rtp_header_extension_twcc_get_max_size; rtp_hdr_class->write = gst_rtp_header_extension_twcc_write; rtp_hdr_class->read = gst_rtp_header_extension_twcc_read; - rtp_hdr_class->set_attributes_from_caps = - gst_rtp_header_extension_set_attributes_from_caps_simple_sdp; rtp_hdr_class->set_caps_from_attributes = gst_rtp_header_extension_set_caps_from_attributes_simple_sdp;