|
Packit |
971217 |
/* GStreamer RTSP extension
|
|
Packit |
971217 |
* Copyright (C) 2007 Wim Taymans <wim.taymans@gmail.com>
|
|
Packit |
971217 |
*
|
|
Packit |
971217 |
* gstrtspextension.c: RTSP extension mechanism
|
|
Packit |
971217 |
*
|
|
Packit |
971217 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
971217 |
* modify it under the terms of the GNU Library General Public
|
|
Packit |
971217 |
* License as published by the Free Software Foundation; either
|
|
Packit |
971217 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
971217 |
*
|
|
Packit |
971217 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
971217 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
971217 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
971217 |
* Library General Public License for more details.
|
|
Packit |
971217 |
*
|
|
Packit |
971217 |
* You should have received a copy of the GNU Library General Public
|
|
Packit |
971217 |
* License along with this library; if not, write to the
|
|
Packit |
971217 |
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
Packit |
971217 |
* Boston, MA 02110-1301, USA.
|
|
Packit |
971217 |
*/
|
|
Packit |
971217 |
|
|
Packit |
971217 |
/**
|
|
Packit |
971217 |
* SECTION:gstrtspextension
|
|
Packit |
971217 |
* @title: GstRTSPExtension
|
|
Packit |
971217 |
* @short_description: Interface for extending RTSP protocols
|
|
Packit |
971217 |
*
|
|
Packit |
971217 |
* This interface is implemented e.g. by the Windows Media Streaming RTSP
|
|
Packit |
971217 |
* exentension (rtspwms) and the RealMedia RTSP extension (rtspreal).
|
|
Packit |
971217 |
*
|
|
Packit |
971217 |
*/
|
|
Packit |
971217 |
|
|
Packit |
971217 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
971217 |
#include "config.h"
|
|
Packit |
971217 |
#endif
|
|
Packit |
971217 |
|
|
Packit |
971217 |
#include "gstrtsp-enumtypes.h"
|
|
Packit |
971217 |
#include "gstrtspextension.h"
|
|
Packit |
971217 |
|
|
Packit |
971217 |
static void gst_rtsp_extension_iface_init (GstRTSPExtension * iface);
|
|
Packit |
971217 |
|
|
Packit |
971217 |
enum
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
SIGNAL_SEND,
|
|
Packit |
971217 |
LAST_SIGNAL
|
|
Packit |
971217 |
};
|
|
Packit |
971217 |
|
|
Packit |
971217 |
static guint gst_rtsp_extension_signals[LAST_SIGNAL] = { 0 };
|
|
Packit |
971217 |
|
|
Packit |
971217 |
GType
|
|
Packit |
971217 |
gst_rtsp_extension_get_type (void)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
static volatile gsize gst_rtsp_extension_type = 0;
|
|
Packit |
971217 |
static const GTypeInfo gst_rtsp_extension_info = {
|
|
Packit |
971217 |
sizeof (GstRTSPExtensionInterface),
|
|
Packit |
971217 |
(GBaseInitFunc) gst_rtsp_extension_iface_init,
|
|
Packit |
971217 |
NULL,
|
|
Packit |
971217 |
NULL,
|
|
Packit |
971217 |
NULL,
|
|
Packit |
971217 |
NULL,
|
|
Packit |
971217 |
0,
|
|
Packit |
971217 |
0,
|
|
Packit |
971217 |
NULL,
|
|
Packit |
971217 |
};
|
|
Packit |
971217 |
|
|
Packit |
971217 |
if (g_once_init_enter (&gst_rtsp_extension_type)) {
|
|
Packit |
971217 |
GType tmp = g_type_register_static (G_TYPE_INTERFACE,
|
|
Packit |
971217 |
"GstRTSPExtension", &gst_rtsp_extension_info, 0);
|
|
Packit |
971217 |
g_once_init_leave (&gst_rtsp_extension_type, tmp);
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
return (GType) gst_rtsp_extension_type;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
static void
|
|
Packit |
971217 |
gst_rtsp_extension_iface_init (GstRTSPExtension * iface)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
static gboolean initialized = FALSE;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
if (!initialized) {
|
|
Packit |
971217 |
gst_rtsp_extension_signals[SIGNAL_SEND] =
|
|
Packit |
971217 |
g_signal_new ("send", G_TYPE_FROM_CLASS (iface),
|
|
Packit |
971217 |
G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPExtensionInterface,
|
|
Packit |
971217 |
send), NULL, NULL, g_cclosure_marshal_generic,
|
|
Packit |
971217 |
GST_TYPE_RTSP_RESULT, 2, G_TYPE_POINTER, G_TYPE_POINTER);
|
|
Packit |
971217 |
initialized = TRUE;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
gboolean
|
|
Packit |
971217 |
gst_rtsp_extension_detect_server (GstRTSPExtension * ext, GstRTSPMessage * resp)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
GstRTSPExtensionInterface *iface;
|
|
Packit |
971217 |
gboolean res = TRUE;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext);
|
|
Packit |
971217 |
if (iface->detect_server)
|
|
Packit |
971217 |
res = iface->detect_server (ext, resp);
|
|
Packit |
971217 |
|
|
Packit |
971217 |
return res;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
GstRTSPResult
|
|
Packit |
971217 |
gst_rtsp_extension_before_send (GstRTSPExtension * ext, GstRTSPMessage * req)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
GstRTSPExtensionInterface *iface;
|
|
Packit |
971217 |
GstRTSPResult res = GST_RTSP_OK;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext);
|
|
Packit |
971217 |
if (iface->before_send)
|
|
Packit |
971217 |
res = iface->before_send (ext, req);
|
|
Packit |
971217 |
|
|
Packit |
971217 |
return res;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
GstRTSPResult
|
|
Packit |
971217 |
gst_rtsp_extension_after_send (GstRTSPExtension * ext, GstRTSPMessage * req,
|
|
Packit |
971217 |
GstRTSPMessage * resp)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
GstRTSPExtensionInterface *iface;
|
|
Packit |
971217 |
GstRTSPResult res = GST_RTSP_OK;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext);
|
|
Packit |
971217 |
if (iface->after_send)
|
|
Packit |
971217 |
res = iface->after_send (ext, req, resp);
|
|
Packit |
971217 |
|
|
Packit |
971217 |
return res;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
GstRTSPResult
|
|
Packit |
971217 |
gst_rtsp_extension_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp,
|
|
Packit |
971217 |
GstStructure * s)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
GstRTSPExtensionInterface *iface;
|
|
Packit |
971217 |
GstRTSPResult res = GST_RTSP_OK;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext);
|
|
Packit |
971217 |
if (iface->parse_sdp)
|
|
Packit |
971217 |
res = iface->parse_sdp (ext, sdp, s);
|
|
Packit |
971217 |
|
|
Packit |
971217 |
return res;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
GstRTSPResult
|
|
Packit |
971217 |
gst_rtsp_extension_setup_media (GstRTSPExtension * ext, GstSDPMedia * media)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
GstRTSPExtensionInterface *iface;
|
|
Packit |
971217 |
GstRTSPResult res = GST_RTSP_OK;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext);
|
|
Packit |
971217 |
if (iface->setup_media)
|
|
Packit |
971217 |
res = iface->setup_media (ext, media);
|
|
Packit |
971217 |
|
|
Packit |
971217 |
return res;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
gboolean
|
|
Packit |
971217 |
gst_rtsp_extension_configure_stream (GstRTSPExtension * ext, GstCaps * caps)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
GstRTSPExtensionInterface *iface;
|
|
Packit |
971217 |
gboolean res = TRUE;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext);
|
|
Packit |
971217 |
if (iface->configure_stream)
|
|
Packit |
971217 |
res = iface->configure_stream (ext, caps);
|
|
Packit |
971217 |
|
|
Packit |
971217 |
return res;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
GstRTSPResult
|
|
Packit |
971217 |
gst_rtsp_extension_get_transports (GstRTSPExtension * ext,
|
|
Packit |
971217 |
GstRTSPLowerTrans protocols, gchar ** transport)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
GstRTSPExtensionInterface *iface;
|
|
Packit |
971217 |
GstRTSPResult res = GST_RTSP_OK;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext);
|
|
Packit |
971217 |
if (iface->get_transports)
|
|
Packit |
971217 |
res = iface->get_transports (ext, protocols, transport);
|
|
Packit |
971217 |
|
|
Packit |
971217 |
return res;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
GstRTSPResult
|
|
Packit |
971217 |
gst_rtsp_extension_stream_select (GstRTSPExtension * ext, GstRTSPUrl * url)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
GstRTSPExtensionInterface *iface;
|
|
Packit |
971217 |
GstRTSPResult res = GST_RTSP_OK;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext);
|
|
Packit |
971217 |
if (iface->stream_select)
|
|
Packit |
971217 |
res = iface->stream_select (ext, url);
|
|
Packit |
971217 |
|
|
Packit |
971217 |
return res;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
GstRTSPResult
|
|
Packit |
971217 |
gst_rtsp_extension_receive_request (GstRTSPExtension * ext,
|
|
Packit |
971217 |
GstRTSPMessage * msg)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
GstRTSPExtensionInterface *iface;
|
|
Packit |
971217 |
GstRTSPResult res = GST_RTSP_ENOTIMPL;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext);
|
|
Packit |
971217 |
if (iface->receive_request)
|
|
Packit |
971217 |
res = iface->receive_request (ext, msg);
|
|
Packit |
971217 |
|
|
Packit |
971217 |
return res;
|
|
Packit |
971217 |
}
|
|
Packit |
971217 |
|
|
Packit |
971217 |
GstRTSPResult
|
|
Packit |
971217 |
gst_rtsp_extension_send (GstRTSPExtension * ext, GstRTSPMessage * req,
|
|
Packit |
971217 |
GstRTSPMessage * resp)
|
|
Packit |
971217 |
{
|
|
Packit |
971217 |
GstRTSPResult res = GST_RTSP_OK;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
g_signal_emit (ext, gst_rtsp_extension_signals[SIGNAL_SEND], 0,
|
|
Packit |
971217 |
req, resp, &res;;
|
|
Packit |
971217 |
|
|
Packit |
971217 |
return res;
|
|
Packit |
971217 |
}
|