gst/rtsp/URLS: Added some test URLS.

Original commit message from CVS:
* gst/rtsp/URLS:
Added some test URLS.
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream),
(gst_rtspsrc_loop), (gst_rtspsrc_open):
* gst/rtsp/gstrtspsrc.h:
When creating streams, give access to the complete SDP.
Fix some leaks.
Collect and merge global stream properties in stream caps.
Preliminary support for WMServer.
* gst/rtsp/rtspconnection.c: (rtsp_connection_create),
(rtsp_connection_connect), (rtsp_connection_read), (read_body),
(rtsp_connection_receive):
* gst/rtsp/rtspconnection.h:
Make connection interruptable.
Refactor to make it reconnectable.
Don't fail on short reads when reading data packets.
* gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_set_port),
(rtsp_url_get_port):
* gst/rtsp/rtspurl.h:
Add methods for getting/setting the port.
* gst/rtsp/sdpmessage.c: (sdp_message_get_attribute_val_n),
(sdp_message_get_attribute_val), (sdp_media_get_attribute),
(sdp_media_get_attribute_val_n), (sdp_media_get_attribute_val),
(sdp_media_get_format), (sdp_parse_line),
(sdp_message_parse_buffer):
Fix headers.
Add methods for getting multiple attributes with the same name.
Increase buffer size when parsing.
Fix parsing of a=foo fields.
* gst/rtsp/test.c: (main):
Update to new connection API.
* gst/rtsp/rtspmessage.c: (rtsp_message_new_response),
(rtsp_message_init_response), (rtsp_message_init_data),
(rtsp_message_unset), (rtsp_message_free), (rtsp_message_dump):
* gst/rtsp/rtspmessage.h:
* gst/rtsp/rtsptransport.c: (rtsp_transport_free):
* gst/rtsp/rtsptransport.h:
* gst/rtsp/sdp.h:
* gst/rtsp/sdpmessage.h:
* gst/rtsp/gstrtsp.c:
* gst/rtsp/gstrtsp.h:
* gst/rtsp/gstrtpdec.c:
* gst/rtsp/gstrtpdec.h:
* gst/rtsp/rtsp.h:
* gst/rtsp/rtspdefs.c:
* gst/rtsp/rtspdefs.h:
Dual licensed under MIT and LGPL now.
This commit is contained in:
Wim Taymans 2006-09-20 16:06:27 +00:00
parent a7d7309e18
commit a365a29c77
23 changed files with 1003 additions and 202 deletions

View file

@ -1,3 +1,59 @@
2006-09-20 Wim Taymans <wim@fluendo.com>
* gst/rtsp/URLS:
Added some test URLS.
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream),
(gst_rtspsrc_loop), (gst_rtspsrc_open):
* gst/rtsp/gstrtspsrc.h:
When creating streams, give access to the complete SDP.
Fix some leaks.
Collect and merge global stream properties in stream caps.
Preliminary support for WMServer.
* gst/rtsp/rtspconnection.c: (rtsp_connection_create),
(rtsp_connection_connect), (rtsp_connection_read), (read_body),
(rtsp_connection_receive):
* gst/rtsp/rtspconnection.h:
Make connection interruptable.
Refactor to make it reconnectable.
Don't fail on short reads when reading data packets.
* gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_set_port),
(rtsp_url_get_port):
* gst/rtsp/rtspurl.h:
Add methods for getting/setting the port.
* gst/rtsp/sdpmessage.c: (sdp_message_get_attribute_val_n),
(sdp_message_get_attribute_val), (sdp_media_get_attribute),
(sdp_media_get_attribute_val_n), (sdp_media_get_attribute_val),
(sdp_media_get_format), (sdp_parse_line),
(sdp_message_parse_buffer):
Fix headers.
Add methods for getting multiple attributes with the same name.
Increase buffer size when parsing.
Fix parsing of a=foo fields.
* gst/rtsp/test.c: (main):
Update to new connection API.
* gst/rtsp/rtspmessage.c: (rtsp_message_new_response),
(rtsp_message_init_response), (rtsp_message_init_data),
(rtsp_message_unset), (rtsp_message_free), (rtsp_message_dump):
* gst/rtsp/rtspmessage.h:
* gst/rtsp/rtsptransport.c: (rtsp_transport_free):
* gst/rtsp/rtsptransport.h:
* gst/rtsp/sdp.h:
* gst/rtsp/sdpmessage.h:
* gst/rtsp/gstrtsp.c:
* gst/rtsp/gstrtsp.h:
* gst/rtsp/gstrtpdec.c:
* gst/rtsp/gstrtpdec.h:
* gst/rtsp/rtsp.h:
* gst/rtsp/rtspdefs.c:
* gst/rtsp/rtspdefs.h:
Dual licensed under MIT and LGPL now.
2006-09-19 Wim Taymans <wim@fluendo.com>
* gst/rtsp/gstrtspsrc.c: (find_stream_by_pt),

13
gst/rtsp/URLS Normal file
View file

@ -0,0 +1,13 @@
Some test URLS:
SVQ3 video:
rtsp://cumulus.creative.auckland.ac.nz/~shado/nelson_iv_512k.mov
ASF (audio/video):
rtsp://aod.mylisten.com/aod/8/03/069803_0903135.wma
rtsp://195.246.8.69/dur_pull_hi
rtsp://195.219.160.200/mcp?chid=25&pid=196&vid=2402201&br=800&tid=1&void=2844&muk=H1J4yFr0mJB
rtsp://a1174.v26630f.c26630.g.vm.akamaistream.net/7/1174/26630/361/od-video.msn.com/8/mbr/rs_perf_dilana_091206_finale9135.wmv
MP4V-ES/mpeg4-generic(ACC):
rtsp://vod.nwec.jp/quicktime/505.mov

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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.
*/
/* Element-Checklist-Version: 5 */
/**
@ -30,7 +53,6 @@
* Last reviewed on 2006-06-20 (0.10.4)
*/
#include "gstrtpdec.h"
GST_DEBUG_CATEGORY_STATIC (rtpdec_debug);

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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.
*/
#ifndef __GST_RTPDEC_H__
#define __GST_RTPDEC_H__

View file

@ -1,5 +1,6 @@
/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
* <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
@ -16,6 +17,29 @@
* 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.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"

View file

@ -1,5 +1,6 @@
/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
* <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
@ -16,7 +17,29 @@
* 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.
*/
#ifndef __GST_RTSP_H__
#define __GST_RTSP_H__

View file

@ -1,5 +1,6 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* Copyright (C) <2005,2006> Wim Taymans <wim at fluendo dot com>
* <2006> Lutz Mueller <lutz at topfrose dot de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@ -16,6 +17,29 @@
* 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.
*/
/**
* SECTION:element-rtspsrc
*
@ -307,11 +331,17 @@ find_stream_by_pt (GstRTSPStream * stream, gconstpointer a)
}
static GstRTSPStream *
gst_rtspsrc_create_stream (GstRTSPSrc * src, SDPMedia * media)
gst_rtspsrc_create_stream (GstRTSPSrc * src, SDPMessage * sdp, gint idx)
{
GstRTSPStream *stream;
gchar *control_url;
gchar *payload;
SDPMedia *media;
/* get media, should not return NULL */
media = sdp_message_get_media (sdp, idx);
if (media == NULL)
return NULL;
stream = g_new0 (GstRTSPStream, 1);
stream->parent = src;
@ -891,6 +921,7 @@ gst_rtspsrc_loop (GstRTSPSrc * src)
guint size;
GstFlowReturn ret = GST_FLOW_OK;
GstCaps *caps = NULL;
GstBuffer *buf;
do {
GST_DEBUG_OBJECT (src, "doing receive");
@ -922,7 +953,7 @@ gst_rtspsrc_loop (GstRTSPSrc * src)
/* channels are not correct on some servers, do extra check */
if (data[1] >= 200 && data[1] <= 204) {
/* hmm RTCP message */
/* hmm RTCP message switch to the RTCP pad of the same stream. */
outpad = stream->rtpdecrtcp;
}
@ -931,45 +962,58 @@ gst_rtspsrc_loop (GstRTSPSrc * src)
goto unknown_stream;
/* and chain buffer to internal element */
{
GstBuffer *buf;
rtsp_message_steal_body (&response, &data, &size);
rtsp_message_steal_body (&response, &data, &size);
/* strip the trailing \0 */
size -= 1;
/* strip the trailing \0 */
size -= 1;
buf = gst_buffer_new ();
GST_BUFFER_DATA (buf) = data;
GST_BUFFER_MALLOCDATA (buf) = data;
GST_BUFFER_SIZE (buf) = size;
buf = gst_buffer_new_and_alloc (size);
GST_BUFFER_DATA (buf) = data;
GST_BUFFER_MALLOCDATA (buf) = data;
GST_BUFFER_SIZE (buf) = size;
/* don't need message anymore */
rtsp_message_unset (&response);
if (caps)
gst_buffer_set_caps (buf, caps);
if (caps)
gst_buffer_set_caps (buf, caps);
GST_DEBUG_OBJECT (src, "pushing data of size %d on channel %d", size,
channel);
GST_DEBUG_OBJECT (src, "pushing data of size %d on channel %d", size,
channel);
/* chain to the peer pad */
ret = gst_pad_chain (outpad, buf);
/* chain to the peer pad */
ret = gst_pad_chain (outpad, buf);
/* combine all stream flows */
ret = gst_rtspsrc_combine_flows (src, stream, ret);
if (ret != GST_FLOW_OK)
goto need_pause;
/* combine all stream flows */
ret = gst_rtspsrc_combine_flows (src, stream, ret);
if (ret != GST_FLOW_OK)
goto need_pause;
}
return;
/* ERRORS */
unknown_stream:
{
GST_DEBUG_OBJECT (src, "unknown stream on channel %d, ignored", channel);
rtsp_message_unset (&response);
return;
}
receive_error:
{
GST_ELEMENT_ERROR (src, RESOURCE, READ,
("Could not receive message."), (NULL));
switch (res) {
case RTSP_ESYS:
GST_ELEMENT_ERROR (src, RESOURCE, READ,
("Could not receive message. (%d: %s)", res, strerror (errno)),
GST_ERROR_SYSTEM);
break;
default:
GST_ELEMENT_ERROR (src, RESOURCE, READ,
("Could not receive message. (%d)", res), (NULL));
break;
}
if (src->debug)
rtsp_message_dump (&response);
rtsp_message_unset (&response);
ret = GST_FLOW_UNEXPECTED;
goto need_pause;
}
@ -977,6 +1021,7 @@ invalid_length:
{
GST_ELEMENT_WARNING (src, RESOURCE, READ,
("Short message received."), (NULL));
rtsp_message_unset (&response);
return;
}
need_pause:
@ -1175,10 +1220,15 @@ gst_rtspsrc_open (GstRTSPSrc * src)
if (G_UNLIKELY (src->url == NULL))
goto no_url;
/* open connection */
GST_DEBUG_OBJECT (src, "opening connection (%s)...", src->location);
if ((res = rtsp_connection_open (src->url, &src->connection)) < 0)
goto could_not_open;
/* create connection */
GST_DEBUG_OBJECT (src, "creating connection (%s)...", src->location);
if ((res = rtsp_connection_create (src->url, &src->connection)) < 0)
goto could_not_create;
/* connect */
GST_DEBUG_OBJECT (src, "connecting (%s)...", src->location);
if ((res = rtsp_connection_connect (src->connection)) < 0)
goto could_not_connect;
/* create OPTIONS */
GST_DEBUG_OBJECT (src, "create options...");
@ -1232,6 +1282,30 @@ gst_rtspsrc_open (GstRTSPSrc * src)
if (src->debug)
sdp_message_dump (&sdp);
/* prepare global stream caps properties */
if (src->props)
gst_structure_remove_all_fields (src->props);
else
src->props = gst_structure_empty_new ("RTSP Properties");
/* FIXME, WMServer specific, move to extensions */
#define HEADER_PREFIX "data:application/vnd.ms.wms-hdr.asfv1;base64,"
{
gchar *config, *maxps;
for (i = 0; (config = sdp_message_get_attribute_val_n (&sdp, "pgmpu", i));
i++) {
if (g_str_has_prefix (config, HEADER_PREFIX)) {
config += strlen (HEADER_PREFIX);
gst_structure_set (src->props, "config", G_TYPE_STRING, config, NULL);
break;
}
}
maxps = sdp_message_get_attribute_val (&sdp, "maxps");
if (maxps)
gst_structure_set (src->props, "maxps", G_TYPE_STRING, maxps, NULL);
}
/* we initially allow all configured protocols. based on the replies from the
* server we narrow them down. */
protocols = src->protocols;
@ -1239,13 +1313,28 @@ gst_rtspsrc_open (GstRTSPSrc * src)
/* setup streams */
n_streams = sdp_message_medias_len (&sdp);
for (i = 0; i < n_streams; i++) {
SDPMedia *media;
gchar *transports;
media = sdp_message_get_media (&sdp, i);
/* create stream from the media, can never return NULL */
stream = gst_rtspsrc_create_stream (src, &sdp, i);
/* create stream from the media */
stream = gst_rtspsrc_create_stream (src, media);
/* merge global caps */
if (stream->caps) {
guint j, num;
GstStructure *s;
s = gst_caps_get_structure (stream->caps, 0);
num = gst_structure_n_fields (src->props);
for (j = 0; j < num; j++) {
const gchar *name;
const GValue *val;
name = gst_structure_nth_field_name (src->props, j);
val = gst_structure_get_value (src->props, name);
gst_structure_set_value (s, name, val);
}
}
/* skip setup if we have no URL for it */
if (stream->setup_url == NULL)
@ -1358,6 +1447,7 @@ gst_rtspsrc_open (GstRTSPSrc * src)
rtsp_transport_init (&transport);
}
}
/* if we got here all was configured. We have dynamic pads so we notify that
* we are done */
gst_element_no_more_pads (GST_ELEMENT_CAST (src));
@ -1375,10 +1465,16 @@ no_url:
("No valid RTSP url was provided"), (NULL));
goto cleanup_error;
}
could_not_open:
could_not_create:
{
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE,
("Could not open connection."), (NULL));
("Could not create connection."), (NULL));
goto cleanup_error;
}
could_not_connect:
{
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE,
("Could not connect to server."), (NULL));
goto cleanup_error;
}
create_request_failed:

View file

@ -1,5 +1,6 @@
/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
* <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
@ -16,7 +17,29 @@
* 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.
*/
#ifndef __GST_RTSPSRC_H__
#define __GST_RTSPSRC_H__
@ -105,6 +128,7 @@ struct _GstRTSPSrc {
gint numstreams;
GList *streams;
GstStructure *props;
gchar *location;
RTSPUrl *url;

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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.
*/
#ifndef __RTSP_H__
#define __RTSP_H__

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,12 +16,37 @@
* 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 <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
/* we include this here to get the G_OS_* defines */
#include <glib.h>
@ -35,9 +60,27 @@
#include <arpa/inet.h>
#endif
#include "rtspconnection.h"
/* the select call is also performed on the control sockets, that way
* we can send special commands to unlock or restart the select call */
#define CONTROL_RESTART 'R' /* restart the select call */
#define CONTROL_STOP 'S' /* stop the select call */
#define CONTROL_SOCKETS(conn) conn->control_sock
#define WRITE_SOCKET(conn) conn->control_sock[1]
#define READ_SOCKET(conn) conn->control_sock[0]
#define SEND_COMMAND(conn, command) \
G_STMT_START { \
unsigned char c; c = command; \
write (WRITE_SOCKET(conn), &c, 1); \
} G_STMT_END
#define READ_COMMAND(conn, command, res) \
G_STMT_START { \
res = read(READ_SOCKET(conn), &command, 1); \
} G_STMT_END
#ifdef G_OS_WIN32
#define CLOSE_SOCKET(sock) closesocket(sock);
#else
@ -61,7 +104,52 @@ inet_aton (const char *c, struct in_addr *paddr)
#endif
RTSPResult
rtsp_connection_open (RTSPUrl * url, RTSPConnection ** conn)
rtsp_connection_create (RTSPUrl * url, RTSPConnection ** conn)
{
gint ret;
RTSPConnection *newconn;
g_return_val_if_fail (url != NULL, RTSP_EINVAL);
g_return_val_if_fail (conn != NULL, RTSP_EINVAL);
if (url->protocol != RTSP_PROTO_TCP)
return RTSP_ENOTIMPL;
newconn = g_new (RTSPConnection, 1);
#ifdef G_OS_WIN32
/* This should work on UNIX too. PF_UNIX sockets replaced with pipe */
/* pipe( CONTROL_SOCKETS(newconn) ) */
if ((ret = pipe (CONTROL_SOCKETS (newconn))) < 0)
goto no_socket_pair;
#else
if ((ret =
socketpair (PF_UNIX, SOCK_STREAM, 0, CONTROL_SOCKETS (newconn))) < 0)
goto no_socket_pair;
fcntl (READ_SOCKET (newconn), F_SETFL, O_NONBLOCK);
fcntl (WRITE_SOCKET (newconn), F_SETFL, O_NONBLOCK);
#endif
newconn->url = url;
newconn->cseq = 0;
newconn->session_id[0] = 0;
newconn->state = RTSP_STATE_INIT;
*conn = newconn;
return RTSP_OK;
/* ERRORS */
no_socket_pair:
{
g_free (newconn);
return RTSP_ESYS;
}
}
RTSPResult
rtsp_connection_connect (RTSPConnection * conn)
{
gint fd;
struct sockaddr_in sin;
@ -70,12 +158,12 @@ rtsp_connection_open (RTSPUrl * url, RTSPConnection ** conn)
gchar *ip;
struct in_addr addr;
gint ret;
guint16 port;
RTSPUrl *url;
g_return_val_if_fail (url != NULL, RTSP_EINVAL);
g_return_val_if_fail (conn != NULL, RTSP_EINVAL);
if (url->protocol != RTSP_PROTO_TCP)
return RTSP_ENOTIMPL;
url = conn->url;
/* first check if it already is an IP address */
if (inet_aton (url->host, &addr)) {
@ -92,20 +180,25 @@ rtsp_connection_open (RTSPUrl * url, RTSPConnection ** conn)
ip = inet_ntoa (*(struct in_addr *) *addrs);
}
fd = socket (AF_INET, SOCK_STREAM, 0);
if (fd == -1)
goto sys_error;
/* get the port from the url */
rtsp_url_get_port (url, &port);
memset (&sin, 0, sizeof (sin));
sin.sin_family = AF_INET; /* network socket */
sin.sin_port = htons (url->port); /* on port */
sin.sin_port = htons (port); /* on port */
sin.sin_addr.s_addr = inet_addr (ip); /* on host ip */
fd = socket (AF_INET, SOCK_STREAM, 0);
if (fd == -1)
goto sys_error;
ret = connect (fd, (struct sockaddr *) &sin, sizeof (sin));
if (ret != 0)
goto sys_error;
return rtsp_connection_create (fd, conn);
conn->fd = fd;
return RTSP_OK;
sys_error:
{
@ -123,27 +216,6 @@ not_ip:
}
}
RTSPResult
rtsp_connection_create (gint fd, RTSPConnection ** conn)
{
RTSPConnection *newconn;
g_return_val_if_fail (conn != NULL, RTSP_EINVAL);
/* FIXME check fd, must be connected SOCK_STREAM */
newconn = g_new (RTSPConnection, 1);
newconn->fd = fd;
newconn->cseq = 0;
newconn->session_id[0] = 0;
newconn->state = RTSP_STATE_INIT;
*conn = newconn;
return RTSP_OK;
}
static void
append_header (gint key, gchar * value, GString * str)
{
@ -408,11 +480,99 @@ parse_line (gchar * buffer, RTSPMessage * msg)
return RTSP_OK;
}
static RTSPResult
read_body (gint fd, glong content_length, RTSPMessage * msg)
RTSPResult
rtsp_connection_read (RTSPConnection * conn, gpointer data, guint size)
{
gchar *body, *bodyptr;
gint to_read, r;
fd_set readfds;
guint toread;
gint retval;
gint avail;
g_return_val_if_fail (conn != NULL, RTSP_EINVAL);
g_return_val_if_fail (data != NULL, RTSP_EINVAL);
if (size == 0)
return RTSP_OK;
toread = size;
/* if the call fails, just go in the select.. it should not fail. Else if
* there is enough data to read, skip the select call al together.*/
if (ioctl (conn->fd, FIONREAD, &avail) < 0)
avail = 0;
else if (avail >= toread)
goto do_read;
FD_ZERO (&readfds);
FD_SET (conn->fd, &readfds);
FD_SET (READ_SOCKET (conn), &readfds);
while (toread > 0) {
gint bytes;
do {
retval = select (FD_SETSIZE, &readfds, NULL, NULL, NULL);
} while ((retval == -1 && errno == EINTR));
if (retval == -1)
goto select_error;
if (FD_ISSET (READ_SOCKET (conn), &readfds)) {
/* read all stop commands */
while (TRUE) {
gchar command;
int res;
READ_COMMAND (conn, command, res);
if (res < 0) {
/* no more commands */
break;
}
}
goto stopped;
}
do_read:
/* if we get here there is activity on the real fd since the select
* completed and the control socket was not readable. */
bytes = read (conn->fd, data, toread);
if (bytes == 0) {
goto eof;
} else if (bytes < 0) {
if (errno != EAGAIN && errno != EINTR)
goto read_error;
} else {
toread -= bytes;
data += bytes;
}
}
return RTSP_OK;
/* ERRORS */
select_error:
{
return RTSP_ESYS;
}
stopped:
{
return RTSP_EINTR;
}
eof:
{
return RTSP_EEOF;
}
read_error:
{
return RTSP_ESYS;
}
}
static RTSPResult
read_body (RTSPConnection * conn, glong content_length, RTSPMessage * msg)
{
gchar *body;
RTSPResult res;
if (content_length <= 0) {
body = NULL;
@ -422,29 +582,19 @@ read_body (gint fd, glong content_length, RTSPMessage * msg)
body = g_malloc (content_length + 1);
body[content_length] = '\0';
bodyptr = body;
to_read = content_length;
while (to_read > 0) {
r = read (fd, bodyptr, to_read);
if (r < 0) {
if (errno != EAGAIN && errno != EINTR)
goto read_error;
} else {
to_read -= r;
bodyptr += r;
}
}
content_length += 1;
RTSP_CHECK (rtsp_connection_read (conn, body, content_length), read_error);
done:
rtsp_message_set_body (msg, (guint8 *) body, content_length);
rtsp_message_take_body (msg, (guint8 *) body, content_length + 1);
return RTSP_OK;
/* ERRORS */
read_error:
{
g_free (body);
return RTSP_ESYS;
return res;
}
}
@ -469,14 +619,9 @@ rtsp_connection_receive (RTSPConnection * conn, RTSPMessage * msg)
/* parse first line and headers */
while (res == RTSP_OK) {
gchar c;
gint ret;
/* read first character, this identifies data messages */
ret = read (conn->fd, &c, 1);
if (ret < 0)
goto read_error;
if (ret < 1)
break;
RTSP_CHECK (rtsp_connection_read (conn, &c, 1), read_error);
/* check for data packet, first character is $ */
if (c == '$') {
@ -485,26 +630,18 @@ rtsp_connection_receive (RTSPConnection * conn, RTSPMessage * msg)
/* data packets are $<1 byte channel><2 bytes length,BE><data bytes> */
/* read channel, which is the next char */
ret = read (conn->fd, &c, 1);
if (ret < 0)
goto read_error;
if (ret < 1)
goto error;
RTSP_CHECK (rtsp_connection_read (conn, &c, 1), read_error);
/* now we create a data message */
rtsp_message_init_data (msg, (gint) c);
/* next two bytes are the length of the data */
ret = read (conn->fd, &size, 2);
if (ret < 0)
goto read_error;
if (ret < 2)
goto error;
RTSP_CHECK (rtsp_connection_read (conn, &size, 2), read_error);
size = GUINT16_FROM_BE (size);
/* and read the body */
res = read_body (conn->fd, size, msg);
res = read_body (conn, size, msg);
need_body = FALSE;
break;
} else {
@ -520,9 +657,8 @@ rtsp_connection_receive (RTSPConnection * conn, RTSPMessage * msg)
break;
/* read lines */
res = read_line (conn->fd, buffer + offset, sizeof (buffer) - offset);
if (res != RTSP_OK)
goto read_error;
RTSP_CHECK (read_line (conn->fd, buffer + offset,
sizeof (buffer) - offset), read_error);
if (buffer[0] == '\0')
break;
@ -549,7 +685,7 @@ rtsp_connection_receive (RTSPConnection * conn, RTSPMessage * msg)
&hdrval) == RTSP_OK) {
/* there is, read the body */
content_length = atol (hdrval);
res = read_body (conn->fd, content_length, msg);
RTSP_CHECK (read_body (conn, content_length, msg), read_error);
}
/* save session id in the connection for further use */
@ -577,13 +713,9 @@ rtsp_connection_receive (RTSPConnection * conn, RTSPMessage * msg)
}
return res;
error:
{
return RTSP_EPARSE;
}
read_error:
{
return RTSP_ESYS;
return res;
}
}

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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.
*/
#ifndef __RTSP_CONNECTION_H__
#define __RTSP_CONNECTION_H__
@ -30,17 +53,22 @@ G_BEGIN_DECLS
typedef struct _RTSPConnection
{
gint fd; /* our socket */
/* URL for the connection */
RTSPUrl *url;
/* connection state */
gint fd;
gint control_sock[2];
/* Session state */
RTSPState state;
gint cseq; /* sequence number */
gchar session_id[512]; /* session id */
RTSPState state; /* state of the connection */
} RTSPConnection;
/* opening/closing a connection */
RTSPResult rtsp_connection_open (RTSPUrl *url, RTSPConnection **conn);
RTSPResult rtsp_connection_create (gint fd, RTSPConnection **conn);
RTSPResult rtsp_connection_create (RTSPUrl *url, RTSPConnection **conn);
RTSPResult rtsp_connection_connect (RTSPConnection *conn);
RTSPResult rtsp_connection_close (RTSPConnection *conn);
RTSPResult rtsp_connection_free (RTSPConnection *conn);
@ -48,6 +76,8 @@ RTSPResult rtsp_connection_free (RTSPConnection *conn);
RTSPResult rtsp_connection_send (RTSPConnection *conn, RTSPMessage *message);
RTSPResult rtsp_connection_receive (RTSPConnection *conn, RTSPMessage *message);
RTSPResult rtsp_connection_flush (RTSPConnection *conn, gboolean flush);
G_END_DECLS
#endif /* __RTSP_CONNECTION_H__ */

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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 "rtspdefs.h"

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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.
*/
#ifndef __RTSP_DEFS_H__
#define __RTSP_DEFS_H__
@ -24,17 +47,22 @@
G_BEGIN_DECLS
#define RTSP_CHECK(stmt, label) \
if (G_UNLIKELY ((res = (stmt)) != RTSP_OK)) goto label
typedef enum {
RTSP_OK = 0,
/* errors */
RTSP_EINVAL = -1,
RTSP_ENOMEM = -2,
RTSP_ERESOLV = -3,
RTSP_ENOTIMPL = -4,
RTSP_ESYS = -5,
RTSP_EPARSE = -6,
RTSP_EWSASTART = -7,
RTSP_EWSAVERSION = -8,
RTSP_EINTR = -2,
RTSP_ENOMEM = -3,
RTSP_ERESOLV = -4,
RTSP_ENOTIMPL = -5,
RTSP_ESYS = -6,
RTSP_EPARSE = -7,
RTSP_EWSASTART = -8,
RTSP_EWSAVERSION = -9,
RTSP_EEOF = -10,
} RTSPResult;

View file

@ -1,5 +1,6 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* Copyright (C) <2005,2006> Wim Taymans <wim@fluendo.com>
* <2006> Lutz Mueller <lutz at topfrose dot de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@ -16,6 +17,29 @@
* 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 "rtspmessage.h"
@ -282,36 +306,40 @@ rtsp_message_dump (RTSPMessage * msg)
g_return_val_if_fail (msg != NULL, RTSP_EINVAL);
if (msg->type == RTSP_MESSAGE_REQUEST) {
g_print ("request message %p\n", msg);
g_print (" request line:\n");
g_print (" method: '%s'\n",
rtsp_method_as_text (msg->type_data.request.method));
g_print (" uri: '%s'\n", msg->type_data.request.uri);
g_print (" headers:\n");
g_hash_table_foreach (msg->hdr_fields, dump_key_value, NULL);
g_print (" body:\n");
rtsp_message_get_body (msg, &data, &size);
dump_mem (data, size);
} else if (msg->type == RTSP_MESSAGE_RESPONSE) {
g_print ("response message %p\n", msg);
g_print (" status line:\n");
g_print (" code: '%d'\n", msg->type_data.response.code);
g_print (" reason: '%s'\n", msg->type_data.response.reason);
g_print (" headers:\n");
g_hash_table_foreach (msg->hdr_fields, dump_key_value, NULL);
rtsp_message_get_body (msg, &data, &size);
g_print (" body: length %d\n", size);
dump_mem (data, size);
} else if (msg->type == RTSP_MESSAGE_DATA) {
g_print ("data message %p\n", msg);
g_print (" channel: '%d'\n", msg->type_data.data.channel);
g_print (" size: '%d'\n", msg->body_size);
rtsp_message_get_body (msg, &data, &size);
dump_mem (data, size);
} else {
g_print ("unsupported packet type %d\n", msg->type);
return RTSP_EINVAL;
switch (msg->type) {
case RTSP_MESSAGE_REQUEST:
g_print ("request message %p\n", msg);
g_print (" request line:\n");
g_print (" method: '%s'\n",
rtsp_method_as_text (msg->type_data.request.method));
g_print (" uri: '%s'\n", msg->type_data.request.uri);
g_print (" headers:\n");
g_hash_table_foreach (msg->hdr_fields, dump_key_value, NULL);
g_print (" body:\n");
rtsp_message_get_body (msg, &data, &size);
dump_mem (data, size);
break;
case RTSP_MESSAGE_RESPONSE:
g_print ("response message %p\n", msg);
g_print (" status line:\n");
g_print (" code: '%d'\n", msg->type_data.response.code);
g_print (" reason: '%s'\n", msg->type_data.response.reason);
g_print (" headers:\n");
g_hash_table_foreach (msg->hdr_fields, dump_key_value, NULL);
rtsp_message_get_body (msg, &data, &size);
g_print (" body: length %d\n", size);
dump_mem (data, size);
break;
case RTSP_MESSAGE_DATA:
g_print ("data message %p\n", msg);
g_print (" channel: '%d'\n", msg->type_data.data.channel);
g_print (" size: '%d'\n", msg->body_size);
rtsp_message_get_body (msg, &data, &size);
dump_mem (data, size);
break;
default:
g_print ("unsupported message type %d\n", msg->type);
return RTSP_EINVAL;
}
return RTSP_OK;
}

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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.
*/
#ifndef __RTSP_MESSAGE_H__
#define __RTSP_MESSAGE_H__

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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 <string.h>
#include <stdlib.h>
@ -146,5 +169,6 @@ rtsp_transport_free (RTSPTransport * transport)
rtsp_transport_init (transport);
g_free (transport);
return RTSP_OK;
}

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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.
*/
#ifndef __RTSP_TRANSPORT_H__
#define __RTSP_TRANSPORT_H__

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,30 @@
* 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>
@ -78,7 +102,8 @@ rtsp_url_parse (const gchar * urlstr, RTSPUrl ** url)
if (slash)
p = slash + 1;
} else {
res->port = RTSP_DEFAULT_PORT;
/* no port specified, set to 0. _get_port() will return the default port. */
res->port = 0;
if (!slash) {
res->host = g_strdup (p);
p = NULL;
@ -87,6 +112,7 @@ rtsp_url_parse (const gchar * urlstr, RTSPUrl ** url)
p = slash + 1;
}
}
/* FIXME, this strips the slash from the absolute path */
if (p)
res->abspath = g_strdup (p);
@ -114,3 +140,28 @@ rtsp_url_free (RTSPUrl * url)
g_free (url->abspath);
g_free (url);
}
RTSPResult
rtsp_url_set_port (RTSPUrl * url, guint16 port)
{
g_return_val_if_fail (url != NULL, RTSP_EINVAL);
url->port = port;
return RTSP_OK;
}
RTSPResult
rtsp_url_get_port (RTSPUrl * url, guint16 * port)
{
g_return_val_if_fail (url != NULL, RTSP_EINVAL);
g_return_val_if_fail (port != NULL, RTSP_EINVAL);
/* if a port was specified, use that else use the default port. */
if (url->port != 0)
*port = url->port;
else
*port = RTSP_DEFAULT_PORT;
return RTSP_OK;
}

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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.
*/
#ifndef __RTSP_URL_H__
#define __RTSP_URL_H__
@ -41,6 +64,9 @@ typedef struct _RTSPUrl {
RTSPResult rtsp_url_parse (const gchar *urlstr, RTSPUrl **url);
void rtsp_url_free (RTSPUrl *url);
RTSPResult rtsp_url_set_port (RTSPUrl *url, guint16 port);
RTSPResult rtsp_url_get_port (RTSPUrl *url, guint16 *port);
G_END_DECLS
#endif /* __RTSP_URL_H__ */

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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.
*/
#ifndef __SDP_H__
#define __SDP_H__

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,12 +16,38 @@
* 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 { \
@ -54,15 +80,15 @@ char* sdp_message_get_##field (SDPMessage *msg) { \
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, gint i) { \
return g_array_index ((msg)->field, type, i); \
#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, gint i) { \
return &g_array_index ((msg)->field, type, i); \
#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) \
#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); \
@ -294,7 +320,7 @@ sdp_message_get_key (SDPMessage * msg)
DEFINE_ARRAY_LEN (attributes);
DEFINE_ARRAY_P_GETTER (attribute, attributes, SDPAttribute);
gchar *
sdp_message_get_attribute_val (SDPMessage * msg, gchar * key)
sdp_message_get_attribute_val_n (SDPMessage * msg, gchar * key, guint nth)
{
gint i;
@ -302,12 +328,22 @@ sdp_message_get_attribute_val (SDPMessage * msg, gchar * key)
SDPAttribute *attr;
attr = &g_array_index (msg->attributes, SDPAttribute, i);
if (!strcmp (attr->key, key))
return attr->value;
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)
{
@ -378,8 +414,14 @@ sdp_media_add_format (SDPMedia * media, gchar * format)
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 (SDPMedia * media, gchar * key)
sdp_media_get_attribute_val_n (SDPMedia * media, gchar * key, guint nth)
{
gint i;
@ -387,18 +429,28 @@ sdp_media_get_attribute_val (SDPMedia * media, gchar * key)
SDPAttribute *attr;
attr = &g_array_index (media->attributes, SDPAttribute, i);
if (!strcmp (attr->key, key))
return attr->value;
if (!strcmp (attr->key, key)) {
if (nth == 0)
return attr->value;
else
nth--;
}
}
return NULL;
}
gchar *
sdp_media_get_format (SDPMedia * media, gint i)
sdp_media_get_attribute_val (SDPMedia * media, gchar * key)
{
if (i >= media->fmts->len)
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 *, i);
return g_array_index (media->fmts, gchar *, idx);
}
static void
@ -455,7 +507,7 @@ typedef struct
static gboolean
sdp_parse_line (SDPContext * c, gchar type, gchar * buffer)
{
gchar str[4096];
gchar str[8192];
gchar *p = buffer;
#define READ_STRING(field) read_string (str, sizeof(str), &p);REPLACE_STRING (field, str);
@ -503,7 +555,7 @@ sdp_parse_line (SDPContext * c, gchar type, gchar * buffer)
break;
case 'b':
{
gchar str2[4096];
gchar str2[MAX_LINE_LEN];
read_string_del (str, sizeof (str), ':', &p);
read_string (str2, sizeof (str2), &p);
@ -520,7 +572,7 @@ sdp_parse_line (SDPContext * c, gchar type, gchar * buffer)
break;
case 'a':
read_string_del (str, sizeof (str), ':', &p);
if (p != '\0')
if (*p != '\0')
p++;
if (c->state == SDP_SESSION)
sdp_message_add_attribute (c->msg, str, p);
@ -569,7 +621,7 @@ sdp_message_parse_buffer (guint8 * data, guint size, SDPMessage * msg)
gchar *p;
SDPContext c;
gchar type;
gchar buffer[4096];
gchar buffer[MAX_LINE_LEN];
gint idx = 0;
g_return_val_if_fail (msg != NULL, RTSP_EINVAL);

View file

@ -1,5 +1,5 @@
/* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* 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
@ -16,6 +16,29 @@
* 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.
*/
#ifndef __SDP_MESSAGE_H__
#define __SDP_MESSAGE_H__
@ -125,31 +148,32 @@ gchar* sdp_message_get_information (SDPMessage *msg);
RTSPResult sdp_message_set_uri (SDPMessage *msg, gchar *uri);
gchar* sdp_message_get_uri (SDPMessage *msg);
gint sdp_message_emails_len (SDPMessage *msg);
gchar* sdp_message_get_email (SDPMessage *msg, gint i);
gchar* sdp_message_get_email (SDPMessage *msg, guint idx);
RTSPResult sdp_message_add_email (SDPMessage *msg, gchar *email);
gint sdp_message_phones_len (SDPMessage *msg);
gchar* sdp_message_get_phone (SDPMessage *msg, gint i);
gchar* sdp_message_get_phone (SDPMessage *msg, guint idx);
RTSPResult sdp_message_add_phone (SDPMessage *msg, gchar *phone);
RTSPResult sdp_message_set_connection (SDPMessage *msg, gchar *nettype, gchar *addrtype,
gchar *address, gint ttl, gint addr_number);
SDPConnection* sdp_message_get_connection (SDPMessage *msg);
gint sdp_message_bandwidths_len (SDPMessage *msg);
SDPBandwidth* sdp_message_get_bandwidth (SDPMessage *msg, gint i);
SDPBandwidth* sdp_message_get_bandwidth (SDPMessage *msg, guint idx);
RTSPResult sdp_message_add_bandwidth (SDPMessage *msg, gchar *bwtype, gint bandwidth);
gint sdp_message_times_len (SDPMessage *msg);
SDPTime* sdp_message_get_time (SDPMessage *msg, gint i);
SDPTime* sdp_message_get_time (SDPMessage *msg, guint idx);
RTSPResult sdp_message_add_time (SDPMessage *msg, gchar *time);
gint sdp_message_zones_len (SDPMessage *msg);
SDPZone* sdp_message_get_zone (SDPMessage *msg, gint i);
SDPZone* sdp_message_get_zone (SDPMessage *msg, guint idx);
RTSPResult sdp_message_add_zone (SDPMessage *msg, gchar *time, gchar *typed_time);
RTSPResult sdp_message_set_key (SDPMessage *msg, gchar *type, gchar *data);
SDPKey* sdp_message_get_key (SDPMessage *msg);
gint sdp_message_attributes_len (SDPMessage *msg);
SDPAttribute* sdp_message_get_attribute (SDPMessage *msg, gint i);
SDPAttribute* sdp_message_get_attribute (SDPMessage *msg, guint idx);
gchar* sdp_message_get_attribute_val (SDPMessage *msg, gchar *key);
gchar* sdp_message_get_attribute_val_n (SDPMessage *msg, gchar *key, guint nth);
RTSPResult sdp_message_add_attribute (SDPMessage *msg, gchar *key, gchar *value);
gint sdp_message_medias_len (SDPMessage *msg);
SDPMedia* sdp_message_get_media (SDPMessage *msg, gint i);
SDPMedia* sdp_message_get_media (SDPMessage *msg, guint idx);
RTSPResult sdp_message_add_media (SDPMessage *msg, SDPMedia *media);
@ -161,8 +185,10 @@ RTSPResult sdp_media_init (SDPMedia *media);
RTSPResult sdp_media_clean (SDPMedia *media);
RTSPResult sdp_media_free (SDPMedia *media);
SDPAttribute * sdp_media_get_attribute (SDPMedia *media, guint idx);
gchar* sdp_media_get_attribute_val (SDPMedia *media, gchar *key);
gchar* sdp_media_get_format (SDPMedia *media, gint i);
gchar* sdp_media_get_attribute_val_n (SDPMedia *media, gchar *key, guint nth);
gchar* sdp_media_get_format (SDPMedia *media, guint idx);
G_END_DECLS

View file

@ -47,9 +47,17 @@ main (int argc, gchar * argv[])
g_print (" url port: %d\n", url->port);
g_print (" url path: %s\n", url->abspath);
/* create and open connection */
g_print ("creating connection...\n");
res = rtsp_connection_create (url, &conn);
if (res != RTSP_OK) {
g_print ("error creating connection to \"%s\"\n", urlstr);
return (-1);
}
/* open connection */
g_print ("opening connection...\n");
res = rtsp_connection_open (url, &conn);
res = rtsp_connection_connect (conn);
if (res != RTSP_OK) {
g_print ("error opening connection to \"%s\"\n", urlstr);
return (-1);