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.
This commit is contained in:
Aleix Conchillo Flaqué 2016-04-15 00:18:50 -07:00 committed by Josep Torra
parent 7a864c177f
commit 28cf2f02e7
2 changed files with 93 additions and 15 deletions

View file

@ -64,7 +64,6 @@
#include <gst/rtp/gstrtppayloads.h> #include <gst/rtp/gstrtppayloads.h>
#include "gstsdpmessage.h" #include "gstsdpmessage.h"
#include "gstmikey.h"
#define FREE_STRING(field) g_free (field); (field) = NULL #define FREE_STRING(field) g_free (field); (field) = NULL
#define REPLACE_STRING(field, val) FREE_STRING(field); (field) = g_strdup (val) #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 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; gsize size;
guchar *data; guchar *data;
GstMIKEYMessage *msg;
gchar *orig_value; gchar *orig_value;
gchar *p, *kmpid; gchar *p, *kmpid;
@ -3648,19 +3645,76 @@ gst_sdp_parse_keymgmt (const gchar * keymgmt, GstCaps * caps)
if (data == NULL) if (data == NULL)
return FALSE; 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); g_free (data);
if (msg == NULL)
return FALSE;
res = gst_mikey_message_to_caps (msg, caps); return (*mikey != NULL);
gst_mikey_message_unref (msg); }
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; 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 static GstSDPResult
sdp_addtributes_to_caps (GArray * attributes, GstCaps * caps) sdp_add_attributes_to_caps (GArray * attributes, GstCaps * caps)
{ {
if (attributes->len > 0) { if (attributes->len > 0) {
GstStructure *s; GstStructure *s;
@ -3685,10 +3739,8 @@ sdp_addtributes_to_caps (GArray * attributes, GstCaps * caps)
continue; continue;
if (!strcmp (key, "framesize")) if (!strcmp (key, "framesize"))
continue; continue;
if (g_str_equal (key, "key-mgmt")) { if (!strcmp (key, "key-mgmt"))
gst_sdp_parse_keymgmt (attr->value, caps);
continue; continue;
}
/* string must be valid UTF8 */ /* string must be valid UTF8 */
if (!g_utf8_validate (attr->value, -1, NULL)) if (!g_utf8_validate (attr->value, -1, NULL))
@ -3722,10 +3774,21 @@ sdp_addtributes_to_caps (GArray * attributes, GstCaps * caps)
GstSDPResult GstSDPResult
gst_sdp_message_attributes_to_caps (const GstSDPMessage * msg, GstCaps * caps) 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 (msg != NULL, GST_SDP_EINVAL);
g_return_val_if_fail (caps != NULL && GST_IS_CAPS (caps), 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 GstSDPResult
gst_sdp_media_attributes_to_caps (const GstSDPMedia * media, GstCaps * caps) 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 (media != NULL, GST_SDP_EINVAL);
g_return_val_if_fail (caps != NULL && GST_IS_CAPS (caps), 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;
} }

View file

@ -43,6 +43,8 @@
#ifndef __GST_SDP_MESSAGE_H__ #ifndef __GST_SDP_MESSAGE_H__
#define __GST_SDP_MESSAGE_H__ #define __GST_SDP_MESSAGE_H__
#include "gstmikey.h"
#include <glib.h> #include <glib.h>
#include <gst/gst.h> #include <gst/gst.h>
#include <gst/sdp/gstsdp.h> #include <gst/sdp/gstsdp.h>
@ -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); 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); GstSDPResult gst_sdp_media_set_media_from_caps (const GstCaps* caps, GstSDPMedia *media);
gchar * gst_sdp_make_keymgmt (const gchar *uri, const gchar *base64); 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_message_attributes_to_caps (const GstSDPMessage *msg, GstCaps *caps);
GstSDPResult gst_sdp_media_attributes_to_caps (const GstSDPMedia *media, GstCaps *caps); GstSDPResult gst_sdp_media_attributes_to_caps (const GstSDPMedia *media, GstCaps *caps);