Blame gst-libs/gst/rtsp/gstrtspextension.c

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
}