mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-11 09:55:36 +00:00
sdp: add boxed type for GstSDPMessage
Also added some tests of this improvement. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=697808
This commit is contained in:
parent
90620b236a
commit
ba1e693853
6 changed files with 363 additions and 0 deletions
|
@ -136,6 +136,29 @@ GstSDPResult gst_sdp_message_add_##method (GstSDPMessage *msg, type val) { \
|
|||
return GST_SDP_OK; \
|
||||
}
|
||||
|
||||
static GstSDPMessage *gst_sdp_message_boxed_copy (GstSDPMessage * orig);
|
||||
static void gst_sdp_message_boxed_free (GstSDPMessage * msg);
|
||||
|
||||
G_DEFINE_BOXED_TYPE (GstSDPMessage, gst_sdp_message, gst_sdp_message_boxed_copy,
|
||||
gst_sdp_message_boxed_free);
|
||||
|
||||
static GstSDPMessage *
|
||||
gst_sdp_message_boxed_copy (GstSDPMessage * orig)
|
||||
{
|
||||
GstSDPMessage *copy;
|
||||
|
||||
if (gst_sdp_message_copy (orig, ©) == GST_SDP_OK)
|
||||
return copy;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sdp_message_boxed_free (GstSDPMessage * msg)
|
||||
{
|
||||
gst_sdp_message_free (msg);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sdp_origin_init (GstSDPOrigin * origin)
|
||||
{
|
||||
|
@ -280,6 +303,108 @@ gst_sdp_message_uninit (GstSDPMessage * msg)
|
|||
return GST_SDP_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_sdp_message_copy:
|
||||
* @msg: a #GstSDPMessage
|
||||
* @copy: (out) (transfer full): pointer to new #GstSDPMessage
|
||||
*
|
||||
* Allocate a new copy of @msg and store the result in @copy. The value in
|
||||
* @copy should be release with gst_sdp_message_free function.
|
||||
*
|
||||
* Returns: a #GstSDPResult
|
||||
*/
|
||||
GstSDPResult
|
||||
gst_sdp_message_copy (const GstSDPMessage * msg, GstSDPMessage ** copy)
|
||||
{
|
||||
GstSDPResult ret;
|
||||
GstSDPMessage *cp;
|
||||
guint i, len;
|
||||
|
||||
if (msg == NULL)
|
||||
return GST_SDP_EINVAL;
|
||||
|
||||
ret = gst_sdp_message_new (copy);
|
||||
if (ret != GST_SDP_OK)
|
||||
return ret;
|
||||
|
||||
cp = *copy;
|
||||
|
||||
REPLACE_STRING (cp->version, msg->version);
|
||||
gst_sdp_message_set_origin (cp, msg->origin.username, msg->origin.sess_id,
|
||||
msg->origin.sess_version, msg->origin.nettype, msg->origin.addrtype,
|
||||
msg->origin.addr);
|
||||
REPLACE_STRING (cp->session_name, msg->session_name);
|
||||
REPLACE_STRING (cp->information, msg->information);
|
||||
REPLACE_STRING (cp->uri, msg->uri);
|
||||
|
||||
len = gst_sdp_message_emails_len (msg);
|
||||
for (i = 0; i < len; i++) {
|
||||
gst_sdp_message_add_email (cp, gst_sdp_message_get_email (msg, i));
|
||||
}
|
||||
|
||||
len = gst_sdp_message_phones_len (msg);
|
||||
for (i = 0; i < len; i++) {
|
||||
gst_sdp_message_add_phone (cp, gst_sdp_message_get_phone (msg, i));
|
||||
}
|
||||
|
||||
gst_sdp_message_set_connection (cp, msg->connection.nettype,
|
||||
msg->connection.addrtype, msg->connection.address, msg->connection.ttl,
|
||||
msg->connection.addr_number);
|
||||
|
||||
len = gst_sdp_message_bandwidths_len (msg);
|
||||
for (i = 0; i < len; i++) {
|
||||
const GstSDPBandwidth *bw = gst_sdp_message_get_bandwidth (msg, i);
|
||||
gst_sdp_message_add_bandwidth (cp, bw->bwtype, bw->bandwidth);
|
||||
}
|
||||
|
||||
len = gst_sdp_message_times_len (msg);
|
||||
for (i = 0; i < len; i++) {
|
||||
const gchar **repeat = NULL;
|
||||
const GstSDPTime *time = gst_sdp_message_get_time (msg, i);
|
||||
|
||||
if (time->repeat != NULL) {
|
||||
guint j;
|
||||
|
||||
repeat = g_malloc0 (time->repeat->len * sizeof (gchar *));
|
||||
|
||||
for (j = 0; j < time->repeat->len; j++) {
|
||||
repeat[j] = g_array_index (time->repeat, char *, j);
|
||||
}
|
||||
}
|
||||
|
||||
gst_sdp_message_add_time (cp, time->start, time->stop, repeat);
|
||||
|
||||
g_free (repeat);
|
||||
}
|
||||
|
||||
len = gst_sdp_message_zones_len (msg);
|
||||
for (i = 0; i < len; i++) {
|
||||
const GstSDPZone *zone = gst_sdp_message_get_zone (msg, i);
|
||||
gst_sdp_message_add_zone (cp, zone->time, zone->typed_time);
|
||||
}
|
||||
|
||||
gst_sdp_message_set_key (cp, msg->key.type, msg->key.data);
|
||||
|
||||
len = gst_sdp_message_attributes_len (msg);
|
||||
for (i = 0; i < len; i++) {
|
||||
const GstSDPAttribute *attr = gst_sdp_message_get_attribute (msg, i);
|
||||
gst_sdp_message_add_attribute (cp, attr->key, attr->value);
|
||||
}
|
||||
|
||||
len = gst_sdp_message_medias_len (msg);
|
||||
for (i = 0; i < len; i++) {
|
||||
GstSDPMedia *media_copy;
|
||||
const GstSDPMedia *media = gst_sdp_message_get_media (msg, i);
|
||||
|
||||
if (gst_sdp_media_copy (media, &media_copy) == GST_SDP_OK) {
|
||||
gst_sdp_message_add_media (cp, media_copy);
|
||||
gst_sdp_media_free (media_copy);
|
||||
}
|
||||
}
|
||||
|
||||
return GST_SDP_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_sdp_message_free:
|
||||
* @msg: a #GstSDPMessage
|
||||
|
@ -1273,6 +1398,69 @@ gst_sdp_media_free (GstSDPMedia * media)
|
|||
return GST_SDP_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_sdp_media_copy:
|
||||
* @media: a #GstSDPMedia
|
||||
* @copy: (out) (transfer full): pointer to new #GstSDPMedia
|
||||
*
|
||||
* Allocate a new copy of @media and store the result in @copy. The value in
|
||||
* @copy should be release with gst_sdp_media_free function.
|
||||
*
|
||||
* Returns: a #GstSDPResult
|
||||
*/
|
||||
GstSDPResult
|
||||
gst_sdp_media_copy (const GstSDPMedia * media, GstSDPMedia ** copy)
|
||||
{
|
||||
GstSDPResult ret;
|
||||
GstSDPMedia *cp;
|
||||
guint i, len;
|
||||
|
||||
if (media == NULL)
|
||||
return GST_SDP_EINVAL;
|
||||
|
||||
ret = gst_sdp_media_new (copy);
|
||||
if (ret != GST_SDP_OK)
|
||||
return ret;
|
||||
|
||||
cp = *copy;
|
||||
|
||||
REPLACE_STRING (cp->media, media->media);
|
||||
cp->port = media->port;
|
||||
cp->num_ports = media->num_ports;
|
||||
REPLACE_STRING (cp->proto, media->proto);
|
||||
|
||||
len = gst_sdp_media_formats_len (media);
|
||||
for (i = 0; i < len; i++) {
|
||||
gst_sdp_media_add_format (cp, gst_sdp_media_get_format (media, i));
|
||||
}
|
||||
|
||||
REPLACE_STRING (cp->information, media->information);
|
||||
|
||||
len = gst_sdp_media_connections_len (media);
|
||||
for (i = 0; i < len; i++) {
|
||||
const GstSDPConnection *connection =
|
||||
gst_sdp_media_get_connection (media, i);
|
||||
gst_sdp_media_add_connection (cp, connection->nettype, connection->addrtype,
|
||||
connection->address, connection->ttl, connection->addr_number);
|
||||
}
|
||||
|
||||
len = gst_sdp_media_bandwidths_len (media);
|
||||
for (i = 0; i < len; i++) {
|
||||
const GstSDPBandwidth *bw = gst_sdp_media_get_bandwidth (media, i);
|
||||
gst_sdp_media_add_bandwidth (cp, bw->bwtype, bw->bandwidth);
|
||||
}
|
||||
|
||||
gst_sdp_media_set_key (cp, media->key.type, media->key.data);
|
||||
|
||||
len = gst_sdp_media_attributes_len (media);
|
||||
for (i = 0; i < len; i++) {
|
||||
const GstSDPAttribute *att = gst_sdp_media_get_attribute (media, i);
|
||||
gst_sdp_media_add_attribute (cp, att->key, att->value);
|
||||
}
|
||||
|
||||
return GST_SDP_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_sdp_media_as_text:
|
||||
* @media: a #GstSDPMedia
|
||||
|
|
|
@ -267,11 +267,19 @@ typedef struct {
|
|||
GArray *medias;
|
||||
} GstSDPMessage;
|
||||
|
||||
|
||||
GType gst_sdp_message_get_type (void);
|
||||
|
||||
#define GST_TYPE_SDP_MESSAGE (gst_sdp_message_get_type())
|
||||
#define GST_SDP_MESSAGE_CAST(object) ((GstSDPMessage *)(object))
|
||||
#define GST_SDP_MESSAGE(object) (GST_SDP_MESSAGE_CAST(object))
|
||||
|
||||
/* Session descriptions */
|
||||
GstSDPResult gst_sdp_message_new (GstSDPMessage **msg);
|
||||
GstSDPResult gst_sdp_message_init (GstSDPMessage *msg);
|
||||
GstSDPResult gst_sdp_message_uninit (GstSDPMessage *msg);
|
||||
GstSDPResult gst_sdp_message_free (GstSDPMessage *msg);
|
||||
GstSDPResult gst_sdp_message_copy (const GstSDPMessage *msg, GstSDPMessage **copy);
|
||||
|
||||
GstSDPResult gst_sdp_message_parse_buffer (const guint8 *data, guint size, GstSDPMessage *msg);
|
||||
gchar* gst_sdp_message_as_text (const GstSDPMessage *msg);
|
||||
|
@ -363,6 +371,7 @@ GstSDPResult gst_sdp_media_new (GstSDPMedia **media
|
|||
GstSDPResult gst_sdp_media_init (GstSDPMedia *media);
|
||||
GstSDPResult gst_sdp_media_uninit (GstSDPMedia *media);
|
||||
GstSDPResult gst_sdp_media_free (GstSDPMedia *media);
|
||||
GstSDPResult gst_sdp_media_copy (const GstSDPMedia *media, GstSDPMedia **copy);
|
||||
|
||||
gchar* gst_sdp_media_as_text (const GstSDPMedia *media);
|
||||
|
||||
|
|
|
@ -109,6 +109,7 @@ check_PROGRAMS = \
|
|||
libs/profile \
|
||||
libs/rtp \
|
||||
libs/rtsp \
|
||||
libs/sdp \
|
||||
libs/tag \
|
||||
libs/video \
|
||||
libs/xmpwriter \
|
||||
|
@ -234,6 +235,13 @@ libs_navigation_LDADD = \
|
|||
$(GST_BASE_LIBS) \
|
||||
$(LDADD)
|
||||
|
||||
libs_sdp_CFLAGS = \
|
||||
$(GST_PLUGINS_BASE_CFLAGS) \
|
||||
$(AM_CFLAGS)
|
||||
libs_sdp_LDADD = \
|
||||
$(top_builddir)/gst-libs/gst/sdp/libgstsdp-@GST_API_VERSION@.la \
|
||||
$(GST_BASE_LIBS) $(LDADD)
|
||||
|
||||
libs_rtp_CFLAGS = \
|
||||
$(GST_PLUGINS_BASE_CFLAGS) \
|
||||
$(AM_CFLAGS)
|
||||
|
|
1
tests/check/libs/.gitignore
vendored
1
tests/check/libs/.gitignore
vendored
|
@ -11,6 +11,7 @@ pbutils
|
|||
profile
|
||||
rtp
|
||||
rtsp
|
||||
sdp
|
||||
tag
|
||||
utils
|
||||
video
|
||||
|
|
154
tests/check/libs/sdp.c
Normal file
154
tests/check/libs/sdp.c
Normal file
|
@ -0,0 +1,154 @@
|
|||
/* GStreamer unit tests for the SDP support library
|
||||
*
|
||||
* Copyright (C) 2013 Jose Antonio Santos Cadenas <santoscadenas@gmail.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <gst/check/gstcheck.h>
|
||||
|
||||
/*
|
||||
* test_sdp.c - gst-kurento-plugins
|
||||
*
|
||||
* Copyright (C) 2013 Kurento
|
||||
* Contact: Miguel París Díaz <mparisdiaz@gmail.com>
|
||||
* Contact: José Antonio Santos Cadenas <santoscadenas@kurento.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 3
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <gst/check/gstcheck.h>
|
||||
#include <gst/sdp/gstsdpmessage.h>
|
||||
|
||||
static const gchar *sdp = "v=0\r\n"
|
||||
"o=- 123456 0 IN IP4 127.0.0.1\r\n"
|
||||
"s=TestSessionToCopy\r\n"
|
||||
"c=IN IP4 127.0.0.1\r\n"
|
||||
"t=0 0\r\n"
|
||||
"m=video 3434 RTP/AVP 96 97 99\r\n"
|
||||
"a=rtpmap:96 MP4V-ES/90000\r\n"
|
||||
"a=rtpmap:97 H263-1998/90000\r\n"
|
||||
"a=rtpmap:99 H263/90000\r\n"
|
||||
"a=sendrecv\r\n"
|
||||
"m=video 6565 RTP/AVP 98\r\n"
|
||||
"a=rtpmap:98 VP8/90000\r\n"
|
||||
"a=sendrecv\r\n" "m=audio 4545 RTP/AVP 14\r\n" "a=sendrecv\r\n"
|
||||
"m=audio 1010 TCP 14\r\n";
|
||||
|
||||
GST_START_TEST (boxed)
|
||||
{
|
||||
GValue value = G_VALUE_INIT;
|
||||
GValue value_copy = G_VALUE_INIT;
|
||||
GstSDPMessage *message, *copy;
|
||||
gchar *message1_str, *message2_str, *copy_str;
|
||||
const gchar *repeat1[] = { "789", "012", NULL };
|
||||
|
||||
gst_sdp_message_new (&message);
|
||||
gst_sdp_message_parse_buffer ((guint8 *) sdp, -1, message);
|
||||
|
||||
gst_sdp_message_add_time (message, "123", "456", repeat1);
|
||||
|
||||
g_value_init (&value, GST_TYPE_SDP_MESSAGE);
|
||||
g_value_init (&value_copy, GST_TYPE_SDP_MESSAGE);
|
||||
|
||||
g_value_set_boxed (&value, message);
|
||||
message1_str = gst_sdp_message_as_text (message);
|
||||
GST_DEBUG ("message1:\n%s", message1_str);
|
||||
gst_sdp_message_free (message);
|
||||
|
||||
message = g_value_get_boxed (&value);
|
||||
message2_str = gst_sdp_message_as_text (message);
|
||||
GST_DEBUG ("message2:\n%s", message2_str);
|
||||
|
||||
fail_if (g_strcmp0 (message1_str, message2_str) != 0);
|
||||
|
||||
g_value_copy (&value, &value_copy);
|
||||
g_value_reset (&value);
|
||||
|
||||
copy = g_value_dup_boxed (&value_copy);
|
||||
g_value_reset (&value_copy);
|
||||
|
||||
copy_str = gst_sdp_message_as_text (copy);
|
||||
GST_DEBUG ("copy:\n%s", copy_str);
|
||||
|
||||
fail_if (g_strcmp0 (message1_str, copy_str));
|
||||
|
||||
g_free (message1_str);
|
||||
g_free (message2_str);
|
||||
g_free (copy_str);
|
||||
}
|
||||
|
||||
GST_END_TEST
|
||||
GST_START_TEST (copy)
|
||||
{
|
||||
GstSDPMessage *message, *copy;
|
||||
glong length = -1;
|
||||
gchar *message_str, *copy_str;
|
||||
const gchar *repeat1[] = { "789", "012", NULL };
|
||||
const gchar *repeat2[] = { "987", "210", NULL };
|
||||
|
||||
gst_sdp_message_new (&message);
|
||||
gst_sdp_message_parse_buffer ((guint8 *) sdp, length, message);
|
||||
|
||||
gst_sdp_message_add_time (message, "123", "456", repeat1);
|
||||
gst_sdp_message_add_time (message, "321", "654", repeat2);
|
||||
|
||||
gst_sdp_message_copy (message, ©);
|
||||
|
||||
message_str = gst_sdp_message_as_text (message);
|
||||
GST_DEBUG ("Original:\n%s", message_str);
|
||||
gst_sdp_message_free (message);
|
||||
copy_str = gst_sdp_message_as_text (copy);
|
||||
gst_sdp_message_free (copy);
|
||||
GST_DEBUG ("Copy:\n%s", copy_str);
|
||||
|
||||
fail_if (g_strcmp0 (copy_str, message_str) != 0);
|
||||
g_free (copy_str);
|
||||
g_free (message_str);
|
||||
}
|
||||
|
||||
GST_END_TEST
|
||||
/*
|
||||
* End of test cases
|
||||
*/
|
||||
static Suite *
|
||||
sdp_suite (void)
|
||||
{
|
||||
Suite *s = suite_create ("sdp");
|
||||
TCase *tc_chain = tcase_create ("sdp");
|
||||
|
||||
suite_add_tcase (s, tc_chain);
|
||||
tcase_add_test (tc_chain, copy);
|
||||
tcase_add_test (tc_chain, boxed);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
GST_CHECK_MAIN (sdp);
|
|
@ -8,6 +8,7 @@ EXPORTS
|
|||
gst_sdp_media_attributes_len
|
||||
gst_sdp_media_bandwidths_len
|
||||
gst_sdp_media_connections_len
|
||||
gst_sdp_media_copy
|
||||
gst_sdp_media_formats_len
|
||||
gst_sdp_media_free
|
||||
gst_sdp_media_get_attribute
|
||||
|
@ -41,6 +42,7 @@ EXPORTS
|
|||
gst_sdp_message_as_uri
|
||||
gst_sdp_message_attributes_len
|
||||
gst_sdp_message_bandwidths_len
|
||||
gst_sdp_message_copy
|
||||
gst_sdp_message_dump
|
||||
gst_sdp_message_emails_len
|
||||
gst_sdp_message_free
|
||||
|
@ -57,6 +59,7 @@ EXPORTS
|
|||
gst_sdp_message_get_phone
|
||||
gst_sdp_message_get_session_name
|
||||
gst_sdp_message_get_time
|
||||
gst_sdp_message_get_type
|
||||
gst_sdp_message_get_uri
|
||||
gst_sdp_message_get_version
|
||||
gst_sdp_message_get_zone
|
||||
|
|
Loading…
Reference in a new issue