diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2007-07-25 18:50:08 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2007-07-25 18:50:08 +0000 |
commit | fa9c47f14d6b5ff16150854c5718a7c5f34fd0dc (patch) | |
tree | a1e4c5c7b166215b5837f612775ba61cda181aab /gst/rtsp/sdpmessage.c | |
parent | 8e316c0023cf3a776c93c9b731c0cad6322aafb6 (diff) |
gst/rtsp/: Use shiny new RTSP and SDP library.
Original commit message from CVS:
* gst/rtsp/Makefile.am:
* gst/rtsp/base64.c:
* gst/rtsp/base64.h:
* gst/rtsp/gstrtspext.c: (gst_rtsp_ext_list_filter),
(gst_rtsp_ext_list_init), (gst_rtsp_ext_list_get),
(gst_rtsp_ext_list_detect_server), (gst_rtsp_ext_list_before_send),
(gst_rtsp_ext_list_after_send), (gst_rtsp_ext_list_parse_sdp),
(gst_rtsp_ext_list_setup_media),
(gst_rtsp_ext_list_configure_stream),
(gst_rtsp_ext_list_get_transports),
(gst_rtsp_ext_list_stream_select):
* gst/rtsp/gstrtspext.h:
* gst/rtsp/gstrtspsrc.c: (gst_rtsp_lower_trans_get_type),
(gst_rtspsrc_class_init), (gst_rtspsrc_init),
(gst_rtspsrc_finalize), (gst_rtspsrc_create_stream),
(gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps),
(gst_rtspsrc_flush), (gst_rtspsrc_do_seek),
(gst_rtspsrc_sink_chain), (gst_rtspsrc_stream_configure_manager),
(gst_rtspsrc_stream_configure_tcp),
(gst_rtspsrc_stream_configure_mcast),
(gst_rtspsrc_stream_configure_udp),
(gst_rtspsrc_stream_configure_udp_sink),
(gst_rtspsrc_stream_configure_transport),
(gst_rtspsrc_handle_request), (gst_rtspsrc_send_keep_alive),
(gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp),
(gst_rtspsrc_loop_send_cmd), (gst_rtsp_auth_method_to_string),
(gst_rtspsrc_parse_auth_hdr), (gst_rtspsrc_setup_auth),
(gst_rtspsrc_try_send), (gst_rtspsrc_send),
(gst_rtspsrc_parse_methods),
(gst_rtspsrc_create_transports_string),
(gst_rtspsrc_prepare_transports), (gst_rtspsrc_setup_streams),
(gst_rtspsrc_parse_range), (gst_rtspsrc_open), (gst_rtspsrc_close),
(gst_rtspsrc_play), (gst_rtspsrc_pause),
(gst_rtspsrc_change_state), (gst_rtspsrc_uri_set_uri):
* gst/rtsp/gstrtspsrc.h:
* gst/rtsp/rtsp.h:
* gst/rtsp/rtspconnection.c:
* gst/rtsp/rtspconnection.h:
* gst/rtsp/rtspdefs.c:
* gst/rtsp/rtspdefs.h:
* gst/rtsp/rtspext.h:
* gst/rtsp/rtspextwms.c:
* gst/rtsp/rtspextwms.h:
* gst/rtsp/rtspmessage.c:
* gst/rtsp/rtspmessage.h:
* gst/rtsp/rtsprange.c:
* gst/rtsp/rtsprange.h:
* gst/rtsp/rtsptransport.c:
* gst/rtsp/rtsptransport.h:
* gst/rtsp/rtspurl.c:
* gst/rtsp/rtspurl.h:
* gst/rtsp/sdp.h:
* gst/rtsp/sdpmessage.c:
* gst/rtsp/sdpmessage.h:
* gst/rtsp/test.c:
Use shiny new RTSP and SDP library.
Implement RTSP extensions using the new interface.
Remove a lot of old code.
Diffstat (limited to 'gst/rtsp/sdpmessage.c')
-rw-r--r-- | gst/rtsp/sdpmessage.c | 930 |
1 files changed, 0 insertions, 930 deletions
diff --git a/gst/rtsp/sdpmessage.c b/gst/rtsp/sdpmessage.c deleted file mode 100644 index 2af52580..00000000 --- a/gst/rtsp/sdpmessage.c +++ /dev/null @@ -1,930 +0,0 @@ -/* GStreamer - * Copyright (C) <2005,2006> Wim Taymans <wim@fluendo.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. - */ -/* - * Unless otherwise indicated, Source Code is licensed under MIT license. - * See further explanation attached in License Statement (distributed in the file - * LICENSE). - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include <stdlib.h> -#include <string.h> - -#include "sdpmessage.h" - -/* FIXME, is currently allocated on the stack */ -#define MAX_LINE_LEN 1024 * 16 - -#define FREE_STRING(field) g_free ((field)); (field) = NULL; -#define FREE_ARRAY(field) \ -G_STMT_START { \ - if (field) \ - g_array_free (field, TRUE); \ - field = NULL; \ -} G_STMT_END -#define REPLACE_STRING(field,val) FREE_STRING(field);field=g_strdup (val); - -#define INIT_ARRAY(field,type,init_func) \ -G_STMT_START { \ - if (field) { \ - guint i; \ - for(i=0; i<field->len; i++) \ - init_func (&g_array_index(field, type, i)); \ - g_array_set_size (field,0); \ - } \ - else \ - field = g_array_new (FALSE, TRUE, sizeof(type)); \ -} G_STMT_END - -#define DEFINE_STRING_SETTER(field) \ -RTSPResult sdp_message_set_##field (SDPMessage *msg, gchar *val) { \ - g_free (msg->field); \ - msg->field = g_strdup (val); \ - return RTSP_OK; \ -} -#define DEFINE_STRING_GETTER(field) \ -char* sdp_message_get_##field (SDPMessage *msg) { \ - return msg->field; \ -} - -#define DEFINE_ARRAY_LEN(field) \ -gint sdp_message_##field##_len (SDPMessage *msg) { \ - return ((msg)->field->len); \ -} -#define DEFINE_ARRAY_GETTER(method,field,type) \ -type sdp_message_get_##method (SDPMessage *msg, guint idx) { \ - return g_array_index ((msg)->field, type, idx); \ -} -#define DEFINE_ARRAY_P_GETTER(method,field,type) \ -type * sdp_message_get_##method (SDPMessage *msg, guint idx) { \ - return &g_array_index ((msg)->field, type, idx); \ -} -#define DEFINE_ARRAY_ADDER(method,field,type,dup_method) \ -RTSPResult sdp_message_add_##method (SDPMessage *msg, type val) { \ - type v = dup_method(val); \ - g_array_append_val((msg)->field, v); \ - return RTSP_OK; \ -} - -static void -sdp_origin_init (SDPOrigin * origin) -{ - FREE_STRING (origin->username); - FREE_STRING (origin->sess_id); - FREE_STRING (origin->sess_version); - FREE_STRING (origin->nettype); - FREE_STRING (origin->addrtype); - FREE_STRING (origin->addr); -} - -static void -sdp_connection_init (SDPConnection * connection) -{ - FREE_STRING (connection->nettype); - FREE_STRING (connection->addrtype); - FREE_STRING (connection->address); - connection->ttl = 0; - connection->addr_number = 0; -} - -static void -sdp_bandwidth_init (SDPBandwidth * bandwidth) -{ - FREE_STRING (bandwidth->bwtype); - bandwidth->bandwidth = 0; -} - -static void -sdp_time_init (SDPTime * time) -{ - FREE_STRING (time->start); - FREE_STRING (time->stop); - time->n_repeat = 0; -} - -static void -sdp_zone_init (SDPZone * zone) -{ - FREE_STRING (zone->time); - FREE_STRING (zone->typed_time); -} - -static void -sdp_key_init (SDPKey * key) -{ - FREE_STRING (key->type); - FREE_STRING (key->data); -} - -static void -sdp_attribute_init (SDPAttribute * attr) -{ - FREE_STRING (attr->key); - FREE_STRING (attr->value); -} - -/** - * sdp_message_new: - * @msg: pointer to new #SDPMessage - * - * Allocate a new SDPMessage and store the result in @msg. - * - * Returns: a #RTSPResult. - */ -RTSPResult -sdp_message_new (SDPMessage ** msg) -{ - SDPMessage *newmsg; - - g_return_val_if_fail (msg != NULL, RTSP_EINVAL); - - newmsg = g_new0 (SDPMessage, 1); - - *msg = newmsg; - - return sdp_message_init (newmsg); -} - -/** - * sdp_message_init: - * @msg: an #SDPMessage - * - * Initialize @msg so that its contents are as if it was freshly allocated - * with sdp_message_new(). This function is mostly used to initialize a message - * allocated on the stack. sdp_message_uninit() undoes this operation. - * - * When this function is invoked on newly allocated data (with malloc or on the - * stack), its contents should be set to 0 before calling this function. - * - * Returns: a #RTSPResult. - */ -RTSPResult -sdp_message_init (SDPMessage * msg) -{ - g_return_val_if_fail (msg != NULL, RTSP_EINVAL); - - FREE_STRING (msg->version); - sdp_origin_init (&msg->origin); - FREE_STRING (msg->session_name); - FREE_STRING (msg->information); - FREE_STRING (msg->uri); - INIT_ARRAY (msg->emails, gchar *, g_free); - INIT_ARRAY (msg->phones, gchar *, g_free); - sdp_connection_init (&msg->connection); - INIT_ARRAY (msg->bandwidths, SDPBandwidth, sdp_bandwidth_init); - INIT_ARRAY (msg->times, SDPTime, sdp_time_init); - INIT_ARRAY (msg->zones, SDPZone, sdp_zone_init); - sdp_key_init (&msg->key); - INIT_ARRAY (msg->attributes, SDPAttribute, sdp_attribute_init); - INIT_ARRAY (msg->medias, SDPMedia, sdp_media_uninit); - - return RTSP_OK; -} - -/** - * sdp_message_uninit: - * @msg: an #SDPMessage - * - * Free all resources allocated in @msg. @msg should not be used anymore after - * this function. This function should be used when @msg was allocated on the - * stack and initialized with sdp_message_init(). - * - * Returns: a #RTSPResult. - */ -RTSPResult -sdp_message_uninit (SDPMessage * msg) -{ - g_return_val_if_fail (msg != NULL, RTSP_EINVAL); - - sdp_message_init (msg); - - FREE_ARRAY (msg->emails); - FREE_ARRAY (msg->phones); - FREE_ARRAY (msg->bandwidths); - FREE_ARRAY (msg->times); - FREE_ARRAY (msg->zones); - FREE_ARRAY (msg->attributes); - FREE_ARRAY (msg->medias); - - return RTSP_OK; -} - -/** - * sdp_message_free: - * @msg: an #SDPMessage - * - * Free all resources allocated by @msg. @msg should not be used anymore after - * this function. This function should be used when @msg was dynamically - * allocated with sdp_message_new(). - * - * Returns: a #RTSPResult. - */ -RTSPResult -sdp_message_free (SDPMessage * msg) -{ - g_return_val_if_fail (msg != NULL, RTSP_EINVAL); - - sdp_message_uninit (msg); - g_free (msg); - - return RTSP_OK; -} - -/** - * sdp_media_new: - * @media: pointer to new #SDPMedia - * - * Allocate a new SDPMedia and store the result in @media. - * - * Returns: a #RTSPResult. - */ -RTSPResult -sdp_media_new (SDPMedia ** media) -{ - SDPMedia *newmedia; - - g_return_val_if_fail (media != NULL, RTSP_EINVAL); - - newmedia = g_new0 (SDPMedia, 1); - - *media = newmedia; - - return sdp_media_init (newmedia); -} - -/** - * sdp_media_init: - * @media: a #SDPMedia - * - * Initialize @media so that its contents are as if it was freshly allocated - * with sdp_media_new(). This function is mostly used to initialize a media - * allocated on the stack. sdp_media_uninit() undoes this operation. - * - * When this function is invoked on newly allocated data (with malloc or on the - * stack), its contents should be set to 0 before calling this function. - * - * Returns: a #RTSPResult. - */ -RTSPResult -sdp_media_init (SDPMedia * media) -{ - g_return_val_if_fail (media != NULL, RTSP_EINVAL); - - FREE_STRING (media->media); - media->port = 0; - media->num_ports = 0; - FREE_STRING (media->proto); - INIT_ARRAY (media->fmts, gchar *, g_free); - FREE_STRING (media->information); - INIT_ARRAY (media->connections, SDPConnection, sdp_connection_init); - INIT_ARRAY (media->bandwidths, SDPBandwidth, sdp_bandwidth_init); - sdp_key_init (&media->key); - INIT_ARRAY (media->attributes, SDPAttribute, sdp_attribute_init); - - return RTSP_OK; -} - -/** - * sdp_media_uninit: - * @media: an #SDPMedia - * - * Free all resources allocated in @media. @media should not be used anymore after - * this function. This function should be used when @media was allocated on the - * stack and initialized with sdp_media_init(). - * - * Returns: a #RTSPResult. - */ -RTSPResult -sdp_media_uninit (SDPMedia * media) -{ - g_return_val_if_fail (media != NULL, RTSP_EINVAL); - - sdp_media_init (media); - FREE_ARRAY (media->fmts); - FREE_ARRAY (media->connections); - FREE_ARRAY (media->bandwidths); - FREE_ARRAY (media->attributes); - - return RTSP_OK; -} - -/** - * sdp_media_free: - * @media: an #SDPMedia - * - * Free all resources allocated by @media. @media should not be used anymore after - * this function. This function should be used when @media was dynamically - * allocated with sdp_media_new(). - * - * Returns: a #RTSPResult. - */ -RTSPResult -sdp_media_free (SDPMedia * media) -{ - g_return_val_if_fail (media != NULL, RTSP_EINVAL); - - sdp_media_uninit (media); - g_free (media); - - return RTSP_OK; -} - -DEFINE_STRING_SETTER (version); -DEFINE_STRING_GETTER (version); - -RTSPResult -sdp_message_set_origin (SDPMessage * msg, gchar * username, gchar * sess_id, - gchar * sess_version, gchar * nettype, gchar * addrtype, gchar * addr) -{ - REPLACE_STRING (msg->origin.username, username); - REPLACE_STRING (msg->origin.sess_id, sess_id); - REPLACE_STRING (msg->origin.sess_version, sess_version); - REPLACE_STRING (msg->origin.nettype, nettype); - REPLACE_STRING (msg->origin.addrtype, addrtype); - REPLACE_STRING (msg->origin.addr, addr); - return RTSP_OK; -} - -SDPOrigin * -sdp_message_get_origin (SDPMessage * msg) -{ - return &msg->origin; -} - -DEFINE_STRING_SETTER (session_name); -DEFINE_STRING_GETTER (session_name); -DEFINE_STRING_SETTER (information); -DEFINE_STRING_GETTER (information); -DEFINE_STRING_SETTER (uri); -DEFINE_STRING_GETTER (uri); - -DEFINE_ARRAY_LEN (emails); -DEFINE_ARRAY_GETTER (email, emails, gchar *); -DEFINE_ARRAY_ADDER (email, emails, gchar *, g_strdup); - -DEFINE_ARRAY_LEN (phones); -DEFINE_ARRAY_GETTER (phone, phones, gchar *); -DEFINE_ARRAY_ADDER (phone, phones, gchar *, g_strdup); - -RTSPResult -sdp_message_set_connection (SDPMessage * msg, gchar * nettype, gchar * addrtype, - gchar * address, gint ttl, gint addr_number) -{ - REPLACE_STRING (msg->connection.nettype, nettype); - REPLACE_STRING (msg->connection.addrtype, addrtype); - REPLACE_STRING (msg->connection.address, address); - msg->connection.ttl = ttl; - msg->connection.addr_number = addr_number; - return RTSP_OK; -} - -SDPConnection * -sdp_message_get_connection (SDPMessage * msg) -{ - return &msg->connection; -} - -DEFINE_ARRAY_LEN (bandwidths); -DEFINE_ARRAY_P_GETTER (bandwidth, bandwidths, SDPBandwidth); - -RTSPResult -sdp_message_add_bandwidth (SDPMessage * msg, gchar * bwtype, gint bandwidth) -{ - SDPBandwidth bw; - - bw.bwtype = g_strdup (bwtype); - bw.bandwidth = bandwidth; - - g_array_append_val (msg->bandwidths, bw); - - return RTSP_OK; -} - -DEFINE_ARRAY_LEN (times); -DEFINE_ARRAY_P_GETTER (time, times, SDPTime); - -RTSPResult -sdp_message_add_time (SDPMessage * msg, gchar * time) -{ - return RTSP_OK; -} - -DEFINE_ARRAY_LEN (zones); -DEFINE_ARRAY_P_GETTER (zone, zones, SDPZone); -RTSPResult -sdp_message_add_zone (SDPMessage * msg, gchar * time, gchar * typed_time) -{ - SDPZone zone; - - zone.time = g_strdup (time); - zone.typed_time = g_strdup (typed_time); - - g_array_append_val (msg->zones, zone); - - return RTSP_OK; -} - -RTSPResult -sdp_message_set_key (SDPMessage * msg, gchar * type, gchar * data) -{ - REPLACE_STRING (msg->key.type, type); - REPLACE_STRING (msg->key.data, data); - return RTSP_OK; -} - -SDPKey * -sdp_message_get_key (SDPMessage * msg) -{ - return &msg->key; -} - - -DEFINE_ARRAY_LEN (attributes); -DEFINE_ARRAY_P_GETTER (attribute, attributes, SDPAttribute); -gchar * -sdp_message_get_attribute_val_n (SDPMessage * msg, gchar * key, guint nth) -{ - guint i; - - for (i = 0; i < msg->attributes->len; i++) { - SDPAttribute *attr; - - attr = &g_array_index (msg->attributes, SDPAttribute, i); - if (!strcmp (attr->key, key)) { - if (nth == 0) - return attr->value; - else - nth--; - } - } - return NULL; -} - -gchar * -sdp_message_get_attribute_val (SDPMessage * msg, gchar * key) -{ - return sdp_message_get_attribute_val_n (msg, key, 0); -} - -RTSPResult -sdp_message_add_attribute (SDPMessage * msg, gchar * key, gchar * value) -{ - SDPAttribute attr; - - attr.key = g_strdup (key); - attr.value = g_strdup (value); - - g_array_append_val (msg->attributes, attr); - - return RTSP_OK; -} - -DEFINE_ARRAY_LEN (medias); -DEFINE_ARRAY_P_GETTER (media, medias, SDPMedia); - -/** - * sdp_message_add_media: - * @msg: an #SDPMessage - * @media: an #SDPMedia to add - * - * Adds @media to the array of medias in @msg. This function takes ownership of - * the contents of @media so that @media will have to be reinitialized with - * gst_media_init() before it can be used again. - * - * Returns: an #RTSPResult. - */ -RTSPResult -sdp_message_add_media (SDPMessage * msg, SDPMedia * media) -{ - gint len; - SDPMedia *nmedia; - - len = msg->medias->len; - g_array_set_size (msg->medias, len + 1); - nmedia = &g_array_index (msg->medias, SDPMedia, len); - - memcpy (nmedia, media, sizeof (SDPMedia)); - memset (media, 0, sizeof (SDPMedia)); - - return RTSP_OK; -} - -/* media access */ - -RTSPResult -sdp_media_add_attribute (SDPMedia * media, gchar * key, gchar * value) -{ - SDPAttribute attr; - - attr.key = g_strdup (key); - attr.value = g_strdup (value); - - g_array_append_val (media->attributes, attr); - - return RTSP_OK; -} - -RTSPResult -sdp_media_add_bandwidth (SDPMedia * media, gchar * bwtype, gint bandwidth) -{ - SDPBandwidth bw; - - bw.bwtype = g_strdup (bwtype); - bw.bandwidth = bandwidth; - - g_array_append_val (media->bandwidths, bw); - - return RTSP_OK; -} - -RTSPResult -sdp_media_add_format (SDPMedia * media, gchar * format) -{ - gchar *fmt; - - fmt = g_strdup (format); - - g_array_append_val (media->fmts, fmt); - - return RTSP_OK; -} - -SDPAttribute * -sdp_media_get_attribute (SDPMedia * media, guint idx) -{ - return &g_array_index (media->attributes, SDPAttribute, idx); -} - -gchar * -sdp_media_get_attribute_val_n (SDPMedia * media, gchar * key, guint nth) -{ - guint i; - - for (i = 0; i < media->attributes->len; i++) { - SDPAttribute *attr; - - attr = &g_array_index (media->attributes, SDPAttribute, i); - if (!strcmp (attr->key, key)) { - if (nth == 0) - return attr->value; - else - nth--; - } - } - return NULL; -} - -gchar * -sdp_media_get_attribute_val (SDPMedia * media, gchar * key) -{ - return sdp_media_get_attribute_val_n (media, key, 0); -} - -gchar * -sdp_media_get_format (SDPMedia * media, guint idx) -{ - if (idx >= media->fmts->len) - return NULL; - return g_array_index (media->fmts, gchar *, idx); -} - -static void -read_string (gchar * dest, guint size, gchar ** src) -{ - guint idx; - - idx = 0; - /* skip spaces */ - while (g_ascii_isspace (**src)) - (*src)++; - - while (!g_ascii_isspace (**src) && **src != '\0') { - if (idx < size - 1) - dest[idx++] = **src; - (*src)++; - } - if (size > 0) - dest[idx] = '\0'; -} - -static void -read_string_del (gchar * dest, guint size, gchar del, gchar ** src) -{ - guint idx; - - idx = 0; - /* skip spaces */ - while (g_ascii_isspace (**src)) - (*src)++; - - while (**src != del && **src != '\0') { - if (idx < size - 1) - dest[idx++] = **src; - (*src)++; - } - if (size > 0) - dest[idx] = '\0'; -} - -enum -{ - SDP_SESSION, - SDP_MEDIA, -}; - -typedef struct -{ - gint state; - SDPMessage *msg; - SDPMedia *media; -} SDPContext; - -static gboolean -sdp_parse_line (SDPContext * c, gchar type, gchar * buffer) -{ - gchar str[8192]; - gchar *p = buffer; - -#define READ_STRING(field) read_string (str, sizeof(str), &p);REPLACE_STRING (field, str); -#define READ_INT(field) read_string (str, sizeof(str), &p);field = atoi(str); - - switch (type) { - case 'v': - if (buffer[0] != '0') - g_warning ("wrong SDP version"); - sdp_message_set_version (c->msg, buffer); - break; - case 'o': - READ_STRING (c->msg->origin.username); - READ_STRING (c->msg->origin.sess_id); - READ_STRING (c->msg->origin.sess_version); - READ_STRING (c->msg->origin.nettype); - READ_STRING (c->msg->origin.addrtype); - READ_STRING (c->msg->origin.addr); - break; - case 's': - REPLACE_STRING (c->msg->session_name, buffer); - break; - case 'i': - if (c->state == SDP_SESSION) { - REPLACE_STRING (c->msg->information, buffer); - } else { - REPLACE_STRING (c->media->information, buffer); - } - break; - case 'u': - REPLACE_STRING (c->msg->uri, buffer); - break; - case 'e': - sdp_message_add_email (c->msg, buffer); - break; - case 'p': - sdp_message_add_phone (c->msg, buffer); - break; - case 'c': - READ_STRING (c->msg->connection.nettype); - READ_STRING (c->msg->connection.addrtype); - READ_STRING (c->msg->connection.address); - READ_INT (c->msg->connection.ttl); - READ_INT (c->msg->connection.addr_number); - break; - case 'b': - { - gchar str2[MAX_LINE_LEN]; - - read_string_del (str, sizeof (str), ':', &p); - read_string (str2, sizeof (str2), &p); - if (c->state == SDP_SESSION) - sdp_message_add_bandwidth (c->msg, str, atoi (str2)); - else - sdp_media_add_bandwidth (c->media, str, atoi (str2)); - break; - } - case 't': - break; - case 'k': - - break; - case 'a': - read_string_del (str, sizeof (str), ':', &p); - if (*p != '\0') - p++; - if (c->state == SDP_SESSION) - sdp_message_add_attribute (c->msg, str, p); - else - sdp_media_add_attribute (c->media, str, p); - break; - case 'm': - { - gchar *slash; - SDPMedia nmedia; - - c->state = SDP_MEDIA; - memset (&nmedia, 0, sizeof (nmedia)); - sdp_media_init (&nmedia); - - READ_STRING (nmedia.media); - read_string (str, sizeof (str), &p); - slash = g_strrstr (str, "/"); - if (slash) { - *slash = '\0'; - nmedia.port = atoi (str); - nmedia.num_ports = atoi (slash + 1); - } else { - nmedia.port = atoi (str); - nmedia.num_ports = -1; - } - READ_STRING (nmedia.proto); - do { - read_string (str, sizeof (str), &p); - sdp_media_add_format (&nmedia, str); - } while (*p != '\0'); - - sdp_message_add_media (c->msg, &nmedia); - c->media = - &g_array_index (c->msg->medias, SDPMedia, c->msg->medias->len - 1); - break; - } - default: - break; - } - return TRUE; -} - -RTSPResult -sdp_message_parse_buffer (guint8 * data, guint size, SDPMessage * msg) -{ - gchar *p; - SDPContext c; - gchar type; - gchar buffer[MAX_LINE_LEN]; - guint idx = 0; - - g_return_val_if_fail (msg != NULL, RTSP_EINVAL); - g_return_val_if_fail (data != NULL, RTSP_EINVAL); - g_return_val_if_fail (size != 0, RTSP_EINVAL); - - c.state = SDP_SESSION; - c.msg = msg; - c.media = NULL; - - p = (gchar *) data; - while (TRUE) { - while (g_ascii_isspace (*p)) - p++; - - type = *p++; - if (type == '\0') - break; - - if (*p != '=') - goto line_done; - p++; - - idx = 0; - while (*p != '\n' && *p != '\r' && *p != '\0') { - if (idx < sizeof (buffer) - 1) - buffer[idx++] = *p; - p++; - } - buffer[idx] = '\0'; - sdp_parse_line (&c, type, buffer); - - line_done: - while (*p != '\n' && *p != '\0') - p++; - if (*p == '\n') - p++; - } - - return RTSP_OK; -} - -static void -print_media (SDPMedia * media) -{ - g_print (" media: '%s'\n", media->media); - g_print (" port: '%d'\n", media->port); - g_print (" num_ports: '%d'\n", media->num_ports); - g_print (" proto: '%s'\n", media->proto); - if (media->fmts->len > 0) { - guint i; - - g_print (" formats:\n"); - for (i = 0; i < media->fmts->len; i++) { - g_print (" format '%s'\n", g_array_index (media->fmts, gchar *, i)); - } - } - g_print (" information: '%s'\n", media->information); - g_print (" key:\n"); - g_print (" type: '%s'\n", media->key.type); - g_print (" data: '%s'\n", media->key.data); - if (media->attributes->len > 0) { - guint i; - - g_print (" attributes:\n"); - for (i = 0; i < media->attributes->len; i++) { - SDPAttribute *attr = &g_array_index (media->attributes, SDPAttribute, i); - - g_print (" attribute '%s' : '%s'\n", attr->key, attr->value); - } - } -} - -RTSPResult -sdp_message_dump (SDPMessage * msg) -{ - g_return_val_if_fail (msg != NULL, RTSP_EINVAL); - - g_print ("sdp packet %p:\n", msg); - g_print (" version: '%s'\n", msg->version); - g_print (" origin:\n"); - g_print (" username: '%s'\n", msg->origin.username); - g_print (" sess_id: '%s'\n", msg->origin.sess_id); - g_print (" sess_version: '%s'\n", msg->origin.sess_version); - g_print (" nettype: '%s'\n", msg->origin.nettype); - g_print (" addrtype: '%s'\n", msg->origin.addrtype); - g_print (" addr: '%s'\n", msg->origin.addr); - g_print (" session_name: '%s'\n", msg->session_name); - g_print (" information: '%s'\n", msg->information); - g_print (" uri: '%s'\n", msg->uri); - - if (msg->emails->len > 0) { - guint i; - - g_print (" emails:\n"); - for (i = 0; i < msg->emails->len; i++) { - g_print (" email '%s'\n", g_array_index (msg->emails, gchar *, i)); - } - } - if (msg->phones->len > 0) { - guint i; - - g_print (" phones:\n"); - for (i = 0; i < msg->phones->len; i++) { - g_print (" phone '%s'\n", g_array_index (msg->phones, gchar *, i)); - } - } - g_print (" connection:\n"); - g_print (" nettype: '%s'\n", msg->connection.nettype); - g_print (" addrtype: '%s'\n", msg->connection.addrtype); - g_print (" address: '%s'\n", msg->connection.address); - g_print (" ttl: '%d'\n", msg->connection.ttl); - g_print (" addr_number: '%d'\n", msg->connection.addr_number); - g_print (" key:\n"); - g_print (" type: '%s'\n", msg->key.type); - g_print (" data: '%s'\n", msg->key.data); - if (msg->attributes->len > 0) { - guint i; - - g_print (" attributes:\n"); - for (i = 0; i < msg->attributes->len; i++) { - SDPAttribute *attr = &g_array_index (msg->attributes, SDPAttribute, i); - - g_print (" attribute '%s' : '%s'\n", attr->key, attr->value); - } - } - if (msg->medias->len > 0) { - guint i; - - g_print (" medias:\n"); - for (i = 0; i < msg->medias->len; i++) { - g_print (" media %d:\n", i); - print_media (&g_array_index (msg->medias, SDPMedia, i)); - } - } - return RTSP_OK; -} |