From 3544cb1ab57a1ddb70daf4c160d203cae4364930 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 25 Jul 2007 18:38:42 +0000 Subject: [PATCH] gst/asfdemux/: Move WMS RTSP extension from -good to here. Original commit message from CVS: * gst/asfdemux/Makefile.am: * gst/asfdemux/gstasf.c: (plugin_init): * gst/asfdemux/gstrtspwms.c: (gst_rtsp_wms_before_send), (gst_rtsp_wms_after_send), (gst_rtsp_wms_parse_sdp), (gst_rtsp_wms_configure_stream), (_do_init), (gst_rtsp_wms_base_init), (gst_rtsp_wms_class_init), (gst_rtsp_wms_init), (gst_rtsp_wms_finalize), (gst_rtsp_wms_change_state), (gst_rtsp_wms_extension_init): * gst/asfdemux/gstrtspwms.h: Move WMS RTSP extension from -good to here. Port it to the new pluggable extension interface. --- ChangeLog | 14 +++ gst/asfdemux/Makefile.am | 7 +- gst/asfdemux/gstasf.c | 5 + gst/asfdemux/gstrtspwms.c | 251 ++++++++++++++++++++++++++++++++++++++ gst/asfdemux/gstrtspwms.h | 50 ++++++++ 5 files changed, 324 insertions(+), 3 deletions(-) create mode 100644 gst/asfdemux/gstrtspwms.c create mode 100644 gst/asfdemux/gstrtspwms.h diff --git a/ChangeLog b/ChangeLog index 43707d25e2..2015f57802 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2007-07-25 Wim Taymans + + * gst/asfdemux/Makefile.am: + * gst/asfdemux/gstasf.c: (plugin_init): + * gst/asfdemux/gstrtspwms.c: (gst_rtsp_wms_before_send), + (gst_rtsp_wms_after_send), (gst_rtsp_wms_parse_sdp), + (gst_rtsp_wms_configure_stream), (_do_init), + (gst_rtsp_wms_base_init), (gst_rtsp_wms_class_init), + (gst_rtsp_wms_init), (gst_rtsp_wms_finalize), + (gst_rtsp_wms_change_state), (gst_rtsp_wms_extension_init): + * gst/asfdemux/gstrtspwms.h: + Move WMS RTSP extension from -good to here. + Port it to the new pluggable extension interface. + 2007-07-24 Stefan Kost * ext/mad/Makefile.am: diff --git a/gst/asfdemux/Makefile.am b/gst/asfdemux/Makefile.am index b0ae6d9e2c..4bc7f1e174 100644 --- a/gst/asfdemux/Makefile.am +++ b/gst/asfdemux/Makefile.am @@ -1,9 +1,10 @@ plugin_LTLIBRARIES = libgstasf.la -libgstasf_la_SOURCES = gstasfdemux.c gstasf.c asfheaders.c asfpacket.c +libgstasf_la_SOURCES = gstasfdemux.c gstasf.c asfheaders.c asfpacket.c gstrtspwms.c libgstasf_la_CFLAGS = $(GST_BASE_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) libgstasf_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS)\ - -lgstriff-@GST_MAJORMINOR@ + -lgstriff-@GST_MAJORMINOR@ -lgstinterfaces-@GST_MAJORMINOR@ \ + -lgstrtsp-@GST_MAJORMINOR@ -lgstsdp-@GST_MAJORMINOR@ libgstasf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -noinst_HEADERS = gstasfdemux.h asfheaders.h asfpacket.h gstasfmux.h +noinst_HEADERS = gstasfdemux.h asfheaders.h asfpacket.h gstasfmux.h gstrtspwms.h diff --git a/gst/asfdemux/gstasf.c b/gst/asfdemux/gstasf.c index 9bb3c66d9b..c09e82fad7 100644 --- a/gst/asfdemux/gstasf.c +++ b/gst/asfdemux/gstasf.c @@ -26,6 +26,7 @@ #include "gst/gst-i18n-plugin.h" #include "gstasfdemux.h" +#include "gstrtspwms.h" /* #include "gstasfmux.h" */ static gboolean @@ -45,6 +46,10 @@ plugin_init (GstPlugin * plugin) GST_TYPE_ASF_DEMUX)) { return FALSE; } + if (!gst_element_register (plugin, "rtspwms", GST_RANK_SECONDARY, + GST_TYPE_RTSP_WMS)) { + return FALSE; + } /* if (!gst_element_register (plugin, "asfmux", GST_RANK_NONE, GST_TYPE_ASFMUX)) return FALSE; diff --git a/gst/asfdemux/gstrtspwms.c b/gst/asfdemux/gstrtspwms.c new file mode 100644 index 0000000000..452551ffc8 --- /dev/null +++ b/gst/asfdemux/gstrtspwms.c @@ -0,0 +1,251 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans + * + * 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. + */ +/* Element-Checklist-Version: 5 */ + +/** + * SECTION:element-rtspwms + * + * + * + * A WMS RTSP extension + * + * + * + * Last reviewed on 2007-07-25 (0.10.14) + */ + +#include + +#include + +#include "gstrtspwms.h" + +GST_DEBUG_CATEGORY_STATIC (rtspwms_debug); +#define GST_CAT_DEFAULT (rtspwms_debug) + +/* elementfactory information */ +static const GstElementDetails rtspwms_details = +GST_ELEMENT_DETAILS ("WMS RTSP Extension", + "Network/Extension/Protocol", + "Extends RTSP so that it can handle WMS setup", + "Wim Taymans "); + +#define SERVER_PREFIX "WMServer/" +#define HEADER_PREFIX "data:application/vnd.ms.wms-hdr.asfv1;base64," + +static GstRTSPResult +gst_rtsp_wms_before_send (GstRTSPExtension * ext, GstRTSPMessage * request) +{ + GstRTSPWMS *ctx = (GstRTSPWMS *) ext; + + GST_DEBUG_OBJECT (ext, "before send"); + + switch (request->type_data.request.method) { + case GST_RTSP_OPTIONS: + { + /* activate ourselves with the first request */ + ctx->active = TRUE; + break; + } + default: + break; + } + return GST_RTSP_OK; +} + +static GstRTSPResult +gst_rtsp_wms_after_send (GstRTSPExtension * ext, GstRTSPMessage * req, + GstRTSPMessage * resp) +{ + GstRTSPWMS *ctx = (GstRTSPWMS *) ext; + + GST_DEBUG_OBJECT (ext, "after send"); + + switch (req->type_data.request.method) { + case GST_RTSP_OPTIONS: + { + gchar *server = NULL; + + gst_rtsp_message_get_header (resp, GST_RTSP_HDR_SERVER, &server, 0); + if (server && g_str_has_prefix (server, SERVER_PREFIX)) + ctx->active = TRUE; + else + ctx->active = FALSE; + break; + } + default: + break; + } + return GST_RTSP_OK; +} + + +static GstRTSPResult +gst_rtsp_wms_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp, + GstStructure * props) +{ + const gchar *config, *maxps; + gint i; + GstRTSPWMS *ctx = (GstRTSPWMS *) ext; + + if (!ctx->active) + return GST_RTSP_OK; + + for (i = 0; (config = gst_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 (props, "config", G_TYPE_STRING, config, NULL); + break; + } + } + if (config == NULL) + goto no_config; + + gst_structure_set (props, "config", G_TYPE_STRING, config, NULL); + + maxps = gst_sdp_message_get_attribute_val (sdp, "maxps"); + if (maxps) + gst_structure_set (props, "maxps", G_TYPE_STRING, maxps, NULL); + + gst_structure_set (props, "encoding-name", G_TYPE_STRING, "X-ASF-PF", NULL); + gst_structure_set (props, "media", G_TYPE_STRING, "application", NULL); + + return GST_RTSP_OK; + + /* ERRORS */ +no_config: + { + GST_DEBUG_OBJECT (ctx, "Could not find config SDP field, deactivating."); + ctx->active = FALSE; + return GST_RTSP_OK; + } +} + +static gboolean +gst_rtsp_wms_configure_stream (GstRTSPExtension * ext, GstCaps * caps) +{ + GstRTSPWMS *ctx = (GstRTSPWMS *) ext; + GstStructure *s; + const gchar *encoding; + + s = gst_caps_get_structure (caps, 0); + encoding = gst_structure_get_string (s, "encoding-name"); + + if (!encoding) + return TRUE; + + GST_DEBUG_OBJECT (ctx, "%" GST_PTR_FORMAT " encoding-name: %s", caps, + encoding); + + /* rtx streams do not need to be configured */ + if (!strcmp (encoding, "X-WMS-RTX")) + return FALSE; + + return TRUE; +} + +static void gst_rtsp_wms_finalize (GObject * object); + +static GstStateChangeReturn gst_rtsp_wms_change_state (GstElement * element, + GstStateChange transition); + +static void gst_rtsp_wms_extension_init (gpointer g_iface, gpointer iface_data); + +static void +_do_init (GType rtspwms_type) +{ + static const GInterfaceInfo rtspextension_info = { + gst_rtsp_wms_extension_init, + NULL, + NULL + }; + + g_type_add_interface_static (rtspwms_type, GST_TYPE_RTSP_EXTENSION, + &rtspextension_info); +} + +GST_BOILERPLATE_FULL (GstRTSPWMS, gst_rtsp_wms, GstElement, GST_TYPE_ELEMENT, + _do_init); + +static void +gst_rtsp_wms_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details (element_class, &rtspwms_details); +} + +static void +gst_rtsp_wms_class_init (GstRTSPWMSClass * g_class) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstRTSPWMSClass *klass; + + klass = (GstRTSPWMSClass *) g_class; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = gst_rtsp_wms_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_rtsp_wms_change_state); + + GST_DEBUG_CATEGORY_INIT (rtspwms_debug, "rtspwms", 0, "WMS RTSP extension"); +} + +static void +gst_rtsp_wms_init (GstRTSPWMS * rtspwms, GstRTSPWMSClass * klass) +{ +} + +static void +gst_rtsp_wms_finalize (GObject * object) +{ + GstRTSPWMS *rtspwms; + + rtspwms = GST_RTSP_WMS (object); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstStateChangeReturn +gst_rtsp_wms_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstRTSPWMS *rtspwms; + + rtspwms = GST_RTSP_WMS (element); + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + return ret; +} + +static void +gst_rtsp_wms_extension_init (gpointer g_iface, gpointer iface_data) +{ + GstRTSPExtensionInterface *iface = (GstRTSPExtensionInterface *) g_iface; + + iface->parse_sdp = gst_rtsp_wms_parse_sdp; + iface->before_send = gst_rtsp_wms_before_send; + iface->after_send = gst_rtsp_wms_after_send; + iface->configure_stream = gst_rtsp_wms_configure_stream; +} diff --git a/gst/asfdemux/gstrtspwms.h b/gst/asfdemux/gstrtspwms.h new file mode 100644 index 0000000000..8eebbfc773 --- /dev/null +++ b/gst/asfdemux/gstrtspwms.h @@ -0,0 +1,50 @@ +/* GStreamer + * Copyright (C) <2005,2006> Wim Taymans + * + * 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 __GST_RTSP_WMS_H__ +#define __GST_RTSP_WMS_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTSP_WMS (gst_rtsp_wms_get_type()) +#define GST_IS_RTSP_WMS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTSP_WMS)) +#define GST_IS_RTSP_WMS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTSP_WMS)) +#define GST_RTSP_WMS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTSP_WMS, GstRTSPWMS)) +#define GST_RTSP_WMS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTSP_WMS, GstRTSPWMSClass)) + +typedef struct _GstRTSPWMS GstRTSPWMS; +typedef struct _GstRTSPWMSClass GstRTSPWMSClass; + +struct _GstRTSPWMS { + GstElement element; + + gboolean active; +}; + +struct _GstRTSPWMSClass { + GstElementClass parent_class; +}; + +GType gst_rtsp_wms_get_type(void); + +G_END_DECLS + +#endif /* __GST_RTSP_WMS_H__ */