From 28cf2f02e79676d9ecfb8806401f457d7b6f3b39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Fri, 15 Apr 2016 00:18:50 -0700 Subject: [PATCH] sdpmessage: new gst_sdp_media_parse_keymgmt/gst_sdp_media_parse_keymgmt We add a couple of new functions gst_sdp_media_parse_keymgmt and gst_sdp_media_parse_keymgmt. We also implement gst_sdp_message_attributes_to_caps and gst_sdp_media_attributes_to_caps in terms of these new functions and also gst_mikey_message_to_caps. --- gst-libs/gst/sdp/gstsdpmessage.c | 104 ++++++++++++++++++++++++++----- gst-libs/gst/sdp/gstsdpmessage.h | 4 ++ 2 files changed, 93 insertions(+), 15 deletions(-) diff --git a/gst-libs/gst/sdp/gstsdpmessage.c b/gst-libs/gst/sdp/gstsdpmessage.c index 17fa6c4068..a0685f884a 100644 --- a/gst-libs/gst/sdp/gstsdpmessage.c +++ b/gst-libs/gst/sdp/gstsdpmessage.c @@ -64,7 +64,6 @@ #include #include "gstsdpmessage.h" -#include "gstmikey.h" #define FREE_STRING(field) g_free (field); (field) = NULL #define REPLACE_STRING(field, val) FREE_STRING(field); (field) = g_strdup (val) @@ -3620,12 +3619,10 @@ gst_sdp_make_keymgmt (const gchar * uri, const gchar * base64) } static gboolean -gst_sdp_parse_keymgmt (const gchar * keymgmt, GstCaps * caps) +gst_sdp_parse_keymgmt (const gchar * keymgmt, GstMIKEYMessage ** mikey) { - gboolean res = FALSE; gsize size; guchar *data; - GstMIKEYMessage *msg; gchar *orig_value; gchar *p, *kmpid; @@ -3648,19 +3645,76 @@ gst_sdp_parse_keymgmt (const gchar * keymgmt, GstCaps * caps) if (data == NULL) return FALSE; - msg = gst_mikey_message_new_from_data (data, size, NULL, NULL); + *mikey = gst_mikey_message_new_from_data (data, size, NULL, NULL); g_free (data); - if (msg == NULL) - return FALSE; - res = gst_mikey_message_to_caps (msg, caps); - gst_mikey_message_unref (msg); + return (*mikey != NULL); +} + +static GstSDPResult +sdp_add_attributes_to_keymgmt (GArray * attributes, GstMIKEYMessage ** mikey) +{ + GstSDPResult res = GST_SDP_OK; + + if (attributes->len > 0) { + guint i; + for (i = 0; i < attributes->len; i++) { + GstSDPAttribute *attr = &g_array_index (attributes, GstSDPAttribute, i); + + if (g_str_equal (attr->key, "key-mgmt")) { + res = gst_sdp_parse_keymgmt (attr->value, mikey); + break; + } + } + } return res; } +/** + * gst_sdp_message_parse_keymgmt: + * @msg: a #GstSDPMessage + * @mikey: (out) (transfer full): pointer to new #GstMIKEYMessage + * + * Creates a new #GstMIKEYMessage after parsing the key-mgmt attribute + * from a #GstSDPMessage. + * + * Returns: a #GstSDPResult. + * + * Since: 1.10 + */ +GstSDPResult +gst_sdp_message_parse_keymgmt (const GstSDPMessage * msg, + GstMIKEYMessage ** mikey) +{ + g_return_val_if_fail (msg != NULL, GST_SDP_EINVAL); + + return sdp_add_attributes_to_keymgmt (msg->attributes, mikey); +} + +/** + * gst_sdp_media_parse_keymgmt: + * @media: a #GstSDPMedia + * @mikey: (out) (transfer full): pointer to new #GstMIKEYMessage + * + * Creates a new #GstMIKEYMessage after parsing the key-mgmt attribute + * from a #GstSDPMedia. + * + * Returns: a #GstSDPResult. + * + * Since: 1.10 + */ +GstSDPResult +gst_sdp_media_parse_keymgmt (const GstSDPMedia * media, + GstMIKEYMessage ** mikey) +{ + g_return_val_if_fail (media != NULL, GST_SDP_EINVAL); + + return sdp_add_attributes_to_keymgmt (media->attributes, mikey); +} + static GstSDPResult -sdp_addtributes_to_caps (GArray * attributes, GstCaps * caps) +sdp_add_attributes_to_caps (GArray * attributes, GstCaps * caps) { if (attributes->len > 0) { GstStructure *s; @@ -3685,10 +3739,8 @@ sdp_addtributes_to_caps (GArray * attributes, GstCaps * caps) continue; if (!strcmp (key, "framesize")) continue; - if (g_str_equal (key, "key-mgmt")) { - gst_sdp_parse_keymgmt (attr->value, caps); + if (!strcmp (key, "key-mgmt")) continue; - } /* string must be valid UTF8 */ if (!g_utf8_validate (attr->value, -1, NULL)) @@ -3722,10 +3774,21 @@ sdp_addtributes_to_caps (GArray * attributes, GstCaps * caps) GstSDPResult gst_sdp_message_attributes_to_caps (const GstSDPMessage * msg, GstCaps * caps) { + GstSDPResult res; + GstMIKEYMessage *mikey = NULL; + g_return_val_if_fail (msg != NULL, GST_SDP_EINVAL); g_return_val_if_fail (caps != NULL && GST_IS_CAPS (caps), GST_SDP_EINVAL); - return sdp_addtributes_to_caps (msg->attributes, caps); + res = gst_sdp_message_parse_keymgmt (msg, &mikey); + if (mikey) { + res = GST_SDP_EINVAL; + if (gst_mikey_message_to_caps (mikey, caps)) + res = sdp_add_attributes_to_caps (msg->attributes, caps); + gst_mikey_message_unref (mikey); + } + + return res; } /** @@ -3742,8 +3805,19 @@ gst_sdp_message_attributes_to_caps (const GstSDPMessage * msg, GstCaps * caps) GstSDPResult gst_sdp_media_attributes_to_caps (const GstSDPMedia * media, GstCaps * caps) { + GstSDPResult res; + GstMIKEYMessage *mikey = NULL; + g_return_val_if_fail (media != NULL, GST_SDP_EINVAL); g_return_val_if_fail (caps != NULL && GST_IS_CAPS (caps), GST_SDP_EINVAL); - return sdp_addtributes_to_caps (media->attributes, caps); + res = gst_sdp_media_parse_keymgmt (media, &mikey); + if (mikey) { + res = GST_SDP_EINVAL; + if (gst_mikey_message_to_caps (mikey, caps)) + res = sdp_add_attributes_to_caps (media->attributes, caps); + gst_mikey_message_unref (mikey); + } + + return res; } diff --git a/gst-libs/gst/sdp/gstsdpmessage.h b/gst-libs/gst/sdp/gstsdpmessage.h index deffb4cb62..15ae60ab79 100644 --- a/gst-libs/gst/sdp/gstsdpmessage.h +++ b/gst-libs/gst/sdp/gstsdpmessage.h @@ -43,6 +43,8 @@ #ifndef __GST_SDP_MESSAGE_H__ #define __GST_SDP_MESSAGE_H__ +#include "gstmikey.h" + #include #include #include @@ -504,6 +506,8 @@ GstSDPResult gst_sdp_media_add_attribute (GstSDPMedia *media, GstCaps* gst_sdp_media_get_caps_from_media (const GstSDPMedia *media, gint pt); GstSDPResult gst_sdp_media_set_media_from_caps (const GstCaps* caps, GstSDPMedia *media); gchar * gst_sdp_make_keymgmt (const gchar *uri, const gchar *base64); +GstSDPResult gst_sdp_message_parse_keymgmt (const GstSDPMessage *msg, GstMIKEYMessage **mikey); +GstSDPResult gst_sdp_media_parse_keymgmt (const GstSDPMedia *media, GstMIKEYMessage **mikey); GstSDPResult gst_sdp_message_attributes_to_caps (const GstSDPMessage *msg, GstCaps *caps); GstSDPResult gst_sdp_media_attributes_to_caps (const GstSDPMedia *media, GstCaps *caps);