/* GStreamer RTSP extension * Copyright (C) 2007 Wim Taymans * * gstrtspextension.c: RTSP extension mechanism * * 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., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** * SECTION:gstrtspextension * @title: GstRTSPExtension * @short_description: Interface for extending RTSP protocols * * This interface is implemented e.g. by the Windows Media Streaming RTSP * exentension (rtspwms) and the RealMedia RTSP extension (rtspreal). * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstrtsp-enumtypes.h" #include "gstrtspextension.h" static void gst_rtsp_extension_iface_init (GstRTSPExtension * iface); enum { SIGNAL_SEND, LAST_SIGNAL }; static guint gst_rtsp_extension_signals[LAST_SIGNAL] = { 0 }; GType gst_rtsp_extension_get_type (void) { static volatile gsize gst_rtsp_extension_type = 0; static const GTypeInfo gst_rtsp_extension_info = { sizeof (GstRTSPExtensionInterface), (GBaseInitFunc) gst_rtsp_extension_iface_init, NULL, NULL, NULL, NULL, 0, 0, NULL, }; if (g_once_init_enter (&gst_rtsp_extension_type)) { GType tmp = g_type_register_static (G_TYPE_INTERFACE, "GstRTSPExtension", &gst_rtsp_extension_info, 0); g_once_init_leave (&gst_rtsp_extension_type, tmp); } return (GType) gst_rtsp_extension_type; } static void gst_rtsp_extension_iface_init (GstRTSPExtension * iface) { static gboolean initialized = FALSE; if (!initialized) { gst_rtsp_extension_signals[SIGNAL_SEND] = g_signal_new ("send", G_TYPE_FROM_CLASS (iface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPExtensionInterface, send), NULL, NULL, g_cclosure_marshal_generic, GST_TYPE_RTSP_RESULT, 2, G_TYPE_POINTER, G_TYPE_POINTER); initialized = TRUE; } } gboolean gst_rtsp_extension_detect_server (GstRTSPExtension * ext, GstRTSPMessage * resp) { GstRTSPExtensionInterface *iface; gboolean res = TRUE; iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext); if (iface->detect_server) res = iface->detect_server (ext, resp); return res; } GstRTSPResult gst_rtsp_extension_before_send (GstRTSPExtension * ext, GstRTSPMessage * req) { GstRTSPExtensionInterface *iface; GstRTSPResult res = GST_RTSP_OK; iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext); if (iface->before_send) res = iface->before_send (ext, req); return res; } GstRTSPResult gst_rtsp_extension_after_send (GstRTSPExtension * ext, GstRTSPMessage * req, GstRTSPMessage * resp) { GstRTSPExtensionInterface *iface; GstRTSPResult res = GST_RTSP_OK; iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext); if (iface->after_send) res = iface->after_send (ext, req, resp); return res; } GstRTSPResult gst_rtsp_extension_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp, GstStructure * s) { GstRTSPExtensionInterface *iface; GstRTSPResult res = GST_RTSP_OK; iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext); if (iface->parse_sdp) res = iface->parse_sdp (ext, sdp, s); return res; } GstRTSPResult gst_rtsp_extension_setup_media (GstRTSPExtension * ext, GstSDPMedia * media) { GstRTSPExtensionInterface *iface; GstRTSPResult res = GST_RTSP_OK; iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext); if (iface->setup_media) res = iface->setup_media (ext, media); return res; } gboolean gst_rtsp_extension_configure_stream (GstRTSPExtension * ext, GstCaps * caps) { GstRTSPExtensionInterface *iface; gboolean res = TRUE; iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext); if (iface->configure_stream) res = iface->configure_stream (ext, caps); return res; } GstRTSPResult gst_rtsp_extension_get_transports (GstRTSPExtension * ext, GstRTSPLowerTrans protocols, gchar ** transport) { GstRTSPExtensionInterface *iface; GstRTSPResult res = GST_RTSP_OK; iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext); if (iface->get_transports) res = iface->get_transports (ext, protocols, transport); return res; } GstRTSPResult gst_rtsp_extension_stream_select (GstRTSPExtension * ext, GstRTSPUrl * url) { GstRTSPExtensionInterface *iface; GstRTSPResult res = GST_RTSP_OK; iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext); if (iface->stream_select) res = iface->stream_select (ext, url); return res; } GstRTSPResult gst_rtsp_extension_receive_request (GstRTSPExtension * ext, GstRTSPMessage * msg) { GstRTSPExtensionInterface *iface; GstRTSPResult res = GST_RTSP_ENOTIMPL; iface = GST_RTSP_EXTENSION_GET_INTERFACE (ext); if (iface->receive_request) res = iface->receive_request (ext, msg); return res; } GstRTSPResult gst_rtsp_extension_send (GstRTSPExtension * ext, GstRTSPMessage * req, GstRTSPMessage * resp) { GstRTSPResult res = GST_RTSP_OK; g_signal_emit (ext, gst_rtsp_extension_signals[SIGNAL_SEND], 0, req, resp, &res); return res; }