Commit fa9c47f1 authored by Wim Taymans's avatar Wim Taymans
Browse files

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.
parent 8e316c00
2007-07-25 Wim Taymans <wim.taymans@gmail.com>
* 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.
2007-07-24 Edward Hervey <bilboed@bilboed.com>
* gst/qtdemux/qtdemux.c: (qtdemux_video_caps):
......
plugin_LTLIBRARIES = libgstrtsp.la
libgstrtsp_la_SOURCES = gstrtsp.c gstrtspsrc.c \
gstrtpdec.c \
rtspconnection.c \
rtspdefs.c \
rtspextwms.c \
rtspmessage.c \
rtsptransport.c \
rtsprange.c \
rtspurl.c \
sdpmessage.c \
base64.c
gstrtpdec.c gstrtspext.c
libgstrtsp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
libgstrtsp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \
-lgstrtp-@GST_MAJORMINOR@ $(GST_LIBS) $(WIN32_LIBS)
-lgstinterfaces-@GST_MAJORMINOR@ \
-lgstrtp-@GST_MAJORMINOR@ -lgstrtsp-@GST_MAJORMINOR@ \
-lgstsdp-@GST_MAJORMINOR@ $(GST_LIBS) $(WIN32_LIBS)
libgstrtsp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
check_PROGRAMS = test
test_SOURCES = test.c rtspdefs.c rtspurl.c rtspconnection.c rtspmessage.c rtsptransport.c sdpmessage.c base64.c
test_CFLAGS = $(GST_CFLAGS)
test_LDFLAGS = $(GST_LIBS) $(WIN32_LIBS)
noinst_HEADERS = gstrtspsrc.h \
gstrtsp.h \
gstrtpdec.h \
rtsptransport.h \
rtsp.h \
rtspurl.h \
rtsprange.h \
rtspconnection.h \
rtspdefs.h \
rtspmessage.h \
sdp.h \
sdpmessage.h \
rtspextwms.h \
rtspext.h \
base64.h
gstrtspext.h
/* GStreamer
* Copyright (C) <2007> Mike Smith <msmith@xiph.org>
*
* 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 "base64.h"
static char base64table[64] = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e',
'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
};
/* This isn't efficient, but it doesn't need to be */
gchar *
util_base64_encode (gchar * data, gint len)
{
gchar *out = g_malloc (len * 4 / 3 + 4);
gchar *result = out;
int chunk;
while (len > 0) {
chunk = (len > 3) ? 3 : len;
*out++ = base64table[(*data & 0xFC) >> 2];
*out++ = base64table[((*data & 0x03) << 4) | ((*(data + 1) & 0xF0) >> 4)];
switch (chunk) {
case 3:
*out++ =
base64table[((*(data + 1) & 0x0F) << 2) | ((*(data +
2) & 0xC0) >> 6)];
*out++ = base64table[(*(data + 2)) & 0x3F];
break;
case 2:
*out++ = base64table[((*(data + 1) & 0x0F) << 2)];
*out++ = '=';
break;
case 1:
*out++ = '=';
*out++ = '=';
break;
}
data += chunk;
len -= chunk;
}
*out = 0;
return result;
}
/* GStreamer
* Copyright (C) <2007> Mike Smith <msmith@xiph.org>
*
* 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.
*/
#ifndef __BASE64_H__
#define __BASE64_H__
#include <glib.h>
G_BEGIN_DECLS
gchar *util_base64_encode(gchar *data, gint len);
G_END_DECLS
#endif
......@@ -40,149 +40,177 @@
* SOFTWARE.
*/
#include <string.h>
#include "gstrtspext.h"
#include "gstrtspsrc.h"
#include "rtspextwms.h"
GST_DEBUG_CATEGORY_STATIC (rtspext_debug);
#define GST_CAT_DEFAULT (rtspext_debug)
#define SERVER_PREFIX "WMServer/"
#define HEADER_PREFIX "data:application/vnd.ms.wms-hdr.asfv1;base64,"
static GList *extensions;
typedef struct _RTSPExtWMSCtx RTSPExtWMSCtx;
static gboolean
gst_rtsp_ext_list_filter (GstPluginFeature * feature, gpointer user_data)
{
GstElementFactory *factory;
/* we only care about element factories */
if (!GST_IS_ELEMENT_FACTORY (feature))
return FALSE;
factory = GST_ELEMENT_FACTORY (feature);
struct _RTSPExtWMSCtx
if (!gst_element_factory_has_interface (factory, "GstRTSPExtension"))
return FALSE;
return TRUE;
}
void
gst_rtsp_ext_list_init (void)
{
RTSPExtensionCtx ctx;
GST_DEBUG_CATEGORY_INIT (rtspext_debug, "rtspext", 0, "RTSP extension");
gboolean active;
};
/* get a list of all extensions */
extensions = gst_registry_feature_filter (gst_registry_get_default (),
(GstPluginFeatureFilter) gst_rtsp_ext_list_filter, FALSE, NULL);
}
static RTSPResult
rtsp_ext_wms_before_send (RTSPExtensionCtx * ctx, RTSPMessage * request)
GstRTSPExtensionList *
gst_rtsp_ext_list_get (void)
{
RTSPExtWMSCtx *rext = (RTSPExtWMSCtx *) ctx;
switch (request->type_data.request.method) {
case RTSP_OPTIONS:
{
/* activate ourselves with the first request */
rext->active = TRUE;
break;
GstRTSPExtensionList *result;
GList *walk;
result = g_new0 (GstRTSPExtensionList, 1);
for (walk = extensions; walk; walk = g_list_next (walk)) {
GstElementFactory *factory = GST_ELEMENT_FACTORY (walk->data);
GstElement *element;
element = gst_element_factory_create (factory, NULL);
if (!element) {
GST_ERROR ("could not create extension instance");
continue;
}
default:
break;
GST_DEBUG ("added extension interface for '%s'",
GST_ELEMENT_NAME (element));
result->extensions = g_list_prepend (result->extensions, element);
}
return RTSP_OK;
return result;
}
static RTSPResult
rtsp_ext_wms_after_send (RTSPExtensionCtx * ctx, RTSPMessage * req,
RTSPMessage * resp)
gboolean
gst_rtsp_ext_list_detect_server (GstRTSPExtensionList * ext,
GstRTSPMessage * resp)
{
RTSPExtWMSCtx *rext = (RTSPExtWMSCtx *) ctx;
switch (req->type_data.request.method) {
case RTSP_OPTIONS:
{
gchar *server = NULL;
rtsp_message_get_header (resp, RTSP_HDR_SERVER, &server, 0);
if (server && g_str_has_prefix (server, SERVER_PREFIX))
rext->active = TRUE;
else
rext->active = FALSE;
break;
}
default:
break;
GList *walk;
gboolean res = TRUE;
for (walk = ext->extensions; walk; walk = g_list_next (walk)) {
GstRTSPExtension *elem = (GstRTSPExtension *) walk->data;
res = gst_rtsp_extension_detect_server (elem, resp);
}
return RTSP_OK;
return res;
}
static RTSPResult
rtsp_ext_wms_parse_sdp (RTSPExtensionCtx * ctx, SDPMessage * sdp)
GstRTSPResult
gst_rtsp_ext_list_before_send (GstRTSPExtensionList * ext, GstRTSPMessage * req)
{
GstRTSPSrc *src = (GstRTSPSrc *) ctx->src;
RTSPExtWMSCtx *rext = (RTSPExtWMSCtx *) ctx;
gchar *config, *maxps;
gint i;
if (!rext->active)
return RTSP_OK;
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;
}
}
if (config == NULL)
goto no_config;
GList *walk;
GstRTSPResult res = GST_RTSP_OK;
gst_structure_set (src->props, "config", G_TYPE_STRING, config, NULL);
for (walk = ext->extensions; walk; walk = g_list_next (walk)) {
GstRTSPExtension *elem = (GstRTSPExtension *) walk->data;
maxps = sdp_message_get_attribute_val (sdp, "maxps");
if (maxps)
gst_structure_set (src->props, "maxps", G_TYPE_STRING, maxps, NULL);
res = gst_rtsp_extension_before_send (elem, req);
}
return res;
}
gst_structure_set (src->props, "encoding-name", G_TYPE_STRING, "X-ASF-PF",
NULL);
gst_structure_set (src->props, "media", G_TYPE_STRING, "application", NULL);
GstRTSPResult
gst_rtsp_ext_list_after_send (GstRTSPExtensionList * ext, GstRTSPMessage * req,
GstRTSPMessage * resp)
{
GList *walk;
GstRTSPResult res = GST_RTSP_OK;
return RTSP_OK;
for (walk = ext->extensions; walk; walk = g_list_next (walk)) {
GstRTSPExtension *elem = (GstRTSPExtension *) walk->data;
/* ERRORS */
no_config:
{
GST_DEBUG_OBJECT (src, "Could not find config SDP field, deactivating.");
rext->active = FALSE;
return RTSP_OK;
res = gst_rtsp_extension_after_send (elem, req, resp);
}
return res;
}
static gboolean
rtsp_ext_wms_configure_stream (RTSPExtensionCtx * ctx, GstRTSPStream * stream)
GstRTSPResult
gst_rtsp_ext_list_parse_sdp (GstRTSPExtensionList * ext, GstSDPMessage * sdp,
GstStructure * s)
{
GstRTSPSrc *src;
GstStructure *s;
const gchar *encoding;
GList *walk;
GstRTSPResult res = GST_RTSP_OK;
src = (GstRTSPSrc *) ctx->src;
for (walk = ext->extensions; walk; walk = g_list_next (walk)) {
GstRTSPExtension *elem = (GstRTSPExtension *) walk->data;
s = gst_caps_get_structure (stream->caps, 0);
encoding = gst_structure_get_string (s, "encoding-name");
res = gst_rtsp_extension_parse_sdp (elem, sdp, s);
}
return res;
}
if (!encoding)
return TRUE;
GstRTSPResult
gst_rtsp_ext_list_setup_media (GstRTSPExtensionList * ext, GstSDPMedia * media)
{
GList *walk;
GstRTSPResult res = GST_RTSP_OK;
GST_DEBUG_OBJECT (src, "%" GST_PTR_FORMAT " encoding-name: %s", stream->caps,
encoding);
for (walk = ext->extensions; walk; walk = g_list_next (walk)) {
GstRTSPExtension *elem = (GstRTSPExtension *) walk->data;
/* rtx streams do not need to be configured */
if (!strcmp (encoding, "X-WMS-RTX"))
return FALSE;
res = gst_rtsp_extension_setup_media (elem, media);
}
return res;
}
return TRUE;
gboolean
gst_rtsp_ext_list_configure_stream (GstRTSPExtensionList * ext, GstCaps * caps)
{
GList *walk;
gboolean res = TRUE;
for (walk = ext->extensions; walk; walk = g_list_next (walk)) {
GstRTSPExtension *elem = (GstRTSPExtension *) walk->data;
res = gst_rtsp_extension_configure_stream (elem, caps);
}
return res;
}
RTSPExtensionCtx *
rtsp_ext_wms_get_context (void)
GstRTSPResult
gst_rtsp_ext_list_get_transports (GstRTSPExtensionList * ext,
GstRTSPLowerTrans protocols, gchar ** transport)
{
RTSPExtWMSCtx *res;
GList *walk;
GstRTSPResult res = GST_RTSP_OK;
res = g_new0 (RTSPExtWMSCtx, 1);
res->ctx.parse_sdp = rtsp_ext_wms_parse_sdp;
res->ctx.before_send = rtsp_ext_wms_before_send;
res->ctx.after_send = rtsp_ext_wms_after_send;
res->ctx.configure_stream = rtsp_ext_wms_configure_stream;
for (walk = ext->extensions; walk; walk = g_list_next (walk)) {
GstRTSPExtension *elem = (GstRTSPExtension *) walk->data;
return (RTSPExtensionCtx *) res;
res = gst_rtsp_extension_get_transports (elem, protocols, transport);
}
return res;
}
void
rtsp_ext_wms_free_context (RTSPExtensionCtx * ctx)
GstRTSPResult
gst_rtsp_ext_list_stream_select (GstRTSPExtensionList * ext)
{
g_free (ctx);
GList *walk;
GstRTSPResult res = GST_RTSP_OK;
for (walk = ext->extensions; walk; walk = g_list_next (walk)) {
GstRTSPExtension *elem = (GstRTSPExtension *) walk->data;
res = gst_rtsp_extension_stream_select (elem);
}
return res;
}
......@@ -40,44 +40,38 @@
* SOFTWARE.
*/
#ifndef __RTSP_EXT_H__
#define __RTSP_EXT_H__
#ifndef __GST_RTSP_EXT_H__
#define __GST_RTSP_EXT_H__
#include <glib.h>
#include "gstrtspsrc.h"
#include "rtsptransport.h"
#include "sdp.h"
#include <gst/gst.h>
#include <gst/interfaces/rtspextension.h>
G_BEGIN_DECLS
typedef struct _RTSPExtensionCtx RTSPExtensionCtx;
typedef struct _GstRTSPExtensionList GstRTSPExtensionList;
struct _RTSPExtensionCtx
struct _GstRTSPExtensionList
{
GstRank rank;
gchar *name;
gpointer *src;
gboolean (*detect_server) (RTSPExtensionCtx *ctx, RTSPMessage *resp);
RTSPResult (*before_send) (RTSPExtensionCtx *ctx, RTSPMessage *req);
RTSPResult (*after_send) (RTSPExtensionCtx *ctx, RTSPMessage *req, RTSPMessage *resp);
RTSPResult (*parse_sdp) (RTSPExtensionCtx *ctx, SDPMessage *sdp);
RTSPResult (*setup_media) (RTSPExtensionCtx *ctx, SDPMedia *media);
gboolean (*configure_stream) (RTSPExtensionCtx *ctx, GstRTSPStream *stream);
RTSPResult (*get_transports) (RTSPExtensionCtx *ctx, RTSPLowerTrans protocols, gchar **transport);
RTSPResult (*stream_select) (RTSPExtensionCtx *ctx);
GList *extensions;
};
RTSPExtensionCtx* rtsp_extension_detect (RTSPMessage *resp);
void gst_rtsp_ext_list_init (void);
GstRTSPExtensionList * gst_rtsp_ext_list_get (void);
gboolean rtsp_extension_register (RTSPExtensionCtx *ctx);
gboolean gst_rtsp_ext_list_detect_server (GstRTSPExtensionList *ext, GstRTSPMessage *resp);
GstRTSPResult gst_rtsp_ext_list_before_send (GstRTSPExtensionList *ext, GstRTSPMessage *req);
GstRTSPResult gst_rtsp_ext_list_after_send (GstRTSPExtensionList *ext, GstRTSPMessage *req,
GstRTSPMessage *resp);
GstRTSPResult gst_rtsp_ext_list_parse_sdp (GstRTSPExtensionList *ext, GstSDPMessage *sdp,
GstStructure *s);
GstRTSPResult gst_rtsp_ext_list_setup_media (GstRTSPExtensionList *ext, GstSDPMedia *media);
gboolean gst_rtsp_ext_list_configure_stream (GstRTSPExtensionList *ext, GstCaps *caps);
GstRTSPResult gst_rtsp_ext_list_get_transports (GstRTSPExtensionList *ext, GstRTSPLowerTrans protocols,
gchar **transport);
GstRTSPResult gst_rtsp_ext_list_stream_select (GstRTSPExtensionList *ext);
G_END_DECLS
#endif /* __RTSP_EXT_H__ */
#endif /* __GST_RTSP_EXT_H__ */
This diff is collapsed.
......@@ -48,8 +48,11 @@
G_BEGIN_DECLS
#include "gstrtsp.h"
#include "rtsp.h"
#include <gst/rtsp/gstrtspconnection.h>
#include <gst/rtsp/gstrtspmessage.h>
#include <gst/rtsp/gstrtspurl.h>
#include "gstrtspext.h"
#define GST_TYPE_RTSPSRC \
(gst_rtspsrc_get_type())
......@@ -77,8 +80,6 @@ typedef struct _GstRTSPSrcClass GstRTSPSrcClass;
typedef struct _GstRTSPStream GstRTSPStream;
#include "rtspext.h"
struct _GstRTSPStream {
gint id;
......@@ -142,34 +143,35 @@ struct _GstRTSPSrc {
gboolean need_activate;
/* properties */
gchar *location;
gchar *req_location; /* Sanitised URL to use in network requests */
RTSPUrl *url;
RTSPLowerTrans protocols;
gboolean debug;
guint retry;
guint64 udp_timeout;
GTimeVal tcp_timeout;
guint latency;
gchar *location;
gchar *req_location; /* Sanitised URL to use in network requests */
GstRTSPUrl *url;
GstRTSPLowerTrans protocols;
gboolean debug;
guint retry;
guint64 udp_timeout;
GTimeVal tcp_timeout;
guint latency;