rtphdrext: Put simple caps generation as the base class default

Instead of having a helper function that gets called by almost every
subclass, just let the base class set the caps fields automatically.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/906>
This commit is contained in:
Olivier Crête 2021-09-23 15:36:00 -04:00 committed by GStreamer Marge Bot
parent ecf84cdd4e
commit 498740fe57
5 changed files with 42 additions and 80 deletions

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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

View file

@ -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;