From 66888a6a820e34aff80edeadc538e51105947693 Mon Sep 17 00:00:00 2001 From: "zeeshan.ali@nokia.com" Date: Wed, 21 Mar 2007 14:52:44 +0000 Subject: [MOVED FROM GST-P-FARSIGHT] Add RTPDTMFMux element 20070321145244-65035-9a01390b0dee3398e53199a1fa1d9352004f338e.gz --- gst/rtpmux/Makefile.am | 13 ++- gst/rtpmux/gstrtpdtmfmux.c | 246 +++++++++++++++++++++++++++++++++++++++++++++ gst/rtpmux/gstrtpdtmfmux.h | 67 ++++++++++++ gst/rtpmux/gstrtpmux.c | 9 -- gst/rtpmux/gstrtpmux.h | 1 + gst/rtpmux/gstrtpmuxer.c | 48 +++++++++ 6 files changed, 370 insertions(+), 14 deletions(-) create mode 100644 gst/rtpmux/gstrtpdtmfmux.c create mode 100644 gst/rtpmux/gstrtpdtmfmux.h create mode 100644 gst/rtpmux/gstrtpmuxer.c diff --git a/gst/rtpmux/Makefile.am b/gst/rtpmux/Makefile.am index 615981a8e..908181be1 100644 --- a/gst/rtpmux/Makefile.am +++ b/gst/rtpmux/Makefile.am @@ -1,7 +1,10 @@ -plugin_LTLIBRARIES = libgstrtpmux.la +plugin_LTLIBRARIES = libgstrtpmuxer.la -libgstrtpmux_la_SOURCES = gstrtpmux.c gstrtpmux.h +libgstrtpmuxer_la_SOURCES = gstrtpmuxer.c gstrtpmux.c gstrtpdtmfmux.c + +libgstrtpmuxer_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(ERROR_CFLAGS) -DEXTERN_BUF -DRTP_SUPPORT +libgstrtpmuxer_la_LIBADD = $(GST_LIBS_LIBS) +libgstrtpmuxer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstrtp-@GST_MAJORMINOR@ + +noinst_HEADERS = gstrtpmux.h gstrtpdtmfmux.h -libgstrtpmux_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(ERROR_CFLAGS) -DEXTERN_BUF -DRTP_SUPPORT -libgstrtpmux_la_LIBADD = $(GST_LIBS_LIBS) -libgstrtpmux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstrtp-@GST_MAJORMINOR@ diff --git a/gst/rtpmux/gstrtpdtmfmux.c b/gst/rtpmux/gstrtpdtmfmux.c new file mode 100644 index 000000000..5bdd34660 --- /dev/null +++ b/gst/rtpmux/gstrtpdtmfmux.c @@ -0,0 +1,246 @@ +/* RTP DTMF muxer element for GStreamer + * + * gstrtpdtmfmux.c: + * + * Copyright (C) <2007> Nokia Corporation. + * Contact: Zeeshan Ali + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000,2005 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. + */ + +/** + * SECTION:element-rtpdtmfmux + * @short_description: Muxer that takes one or several RTP streams + * and muxes them to a single rtp stream. + * + * + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +GST_DEBUG_CATEGORY_STATIC (gst_rtp_dtmf_mux_debug); +#define GST_CAT_DEFAULT gst_rtp_dtmf_mux_debug + +/* elementfactory information */ +static const GstElementDetails gst_rtp_dtmf_mux_details = +GST_ELEMENT_DETAILS ("RTP muxer", + "Codec/Muxer", + "mixes RTP DTMF streams into other RTP streams", + "Zeeshan Ali "); + +static void gst_rtp_dtmf_mux_base_init (gpointer g_class); +static void gst_rtp_dtmf_mux_class_init (GstRTPDTMFMuxClass * klass); +static void gst_rtp_dtmf_mux_finalize (GObject * object); + +static gboolean gst_rtp_dtmf_mux_sink_event (GstPad * pad, + GstEvent * event); +static GstFlowReturn gst_rtp_dtmf_mux_chain (GstPad * pad, + GstBuffer * buffer); + +static GstRTPMuxClass *parent_class = NULL; + +GType +gst_rtp_dtmf_mux_get_type (void) +{ + static GType mux_type = 0; + + if (!mux_type) { + static const GTypeInfo mux_info = { + sizeof (GstRTPDTMFMuxClass), + gst_rtp_dtmf_mux_base_init, + NULL, + (GClassInitFunc) gst_rtp_dtmf_mux_class_init, + NULL, + NULL, + sizeof (GstRTPDTMFMux), + 0, + (GInstanceInitFunc) NULL, + }; + + mux_type = + g_type_register_static (GST_TYPE_RTP_MUX, "GstRTPDTMFMux", + &mux_info, 0); + } + return mux_type; +} + +static void +gst_rtp_dtmf_mux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details (element_class, &gst_rtp_dtmf_mux_details); +} + +static void +gst_rtp_dtmf_mux_class_init (GstRTPDTMFMuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstRTPMuxClass *gstrtpmux_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstrtpmux_class = (GstRTPMuxClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = gst_rtp_dtmf_mux_finalize; + gstrtpmux_class->chain_func = gst_rtp_dtmf_mux_chain; + gstrtpmux_class->sink_event_func = gst_rtp_dtmf_mux_sink_event; +} + +static void +gst_rtp_dtmf_mux_finalize (GObject * object) +{ + GstRTPDTMFMux *mux; + + mux = GST_RTP_DTMF_MUX (object); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstFlowReturn +gst_rtp_dtmf_mux_chain (GstPad * pad, GstBuffer * buffer) +{ + GstRTPDTMFMux *mux; + gboolean drop = FALSE; + GstFlowReturn ret; + + mux = GST_RTP_DTMF_MUX (gst_pad_get_parent (pad)); + + GST_OBJECT_LOCK (mux); + if (mux->special_pad != NULL && + mux->special_pad != pad) { + drop = TRUE; + } + + if (drop) { + gst_buffer_unref (buffer); + ret = GST_FLOW_OK; + GST_OBJECT_UNLOCK (mux); + } + + else { + GST_OBJECT_UNLOCK (mux); + if (parent_class->chain_func) + ret = parent_class->chain_func (pad, buffer); + else + ret = GST_FLOW_ERROR; + } + + gst_object_unref (mux); + return ret; +} + +static gboolean +gst_rtp_dtmf_mux_sink_event (GstPad * pad, GstEvent * event) +{ + GstRTPDTMFMux *mux; + GstEventType type; + gboolean ret = FALSE; + + type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; + + mux = (GstRTPDTMFMux *) gst_pad_get_parent (pad); + + switch (type) { + case GST_EVENT_CUSTOM_DOWNSTREAM_OOB: + { + const GstStructure *structure; + + structure = gst_event_get_structure (event); + /* FIXME: is this event generic enough to be given a generic name? */ + if (structure && gst_structure_has_name (structure, "stream-lock")) { + gboolean lock; + + if (!gst_structure_get_boolean (structure, "lock", &lock)) + break; + + GST_OBJECT_LOCK (mux); + if (lock) { + if (mux->special_pad != NULL) { + GST_WARNING_OBJECT (mux, + "Stream lock already acquired by pad %s", + GST_ELEMENT_NAME (mux->special_pad)); + } + + else + mux->special_pad = gst_object_ref (pad); + } + + else { + if (mux->special_pad == NULL) { + GST_WARNING_OBJECT (mux, + "Stream lock not acquired, can't release it"); + } + + else if (pad != mux->special_pad) { + GST_WARNING_OBJECT (mux, + "pad %s attempted to release Stream lock" + " which was acquired by pad %s", GST_ELEMENT_NAME (pad), + GST_ELEMENT_NAME (mux->special_pad)); + } + + else { + gst_object_unref (mux->special_pad); + mux->special_pad = NULL; + } + } + + GST_OBJECT_UNLOCK (mux); + } + + ret = TRUE; + break; + } + default: + { + if (parent_class->sink_event_func) { + /* Give the parent a chance to handle the event first */ + ret = parent_class->sink_event_func (pad, event); + } + + else + ret = gst_pad_event_default (pad, event); + break; + } + } + + gst_object_unref (mux); + + return ret; +} + +gboolean +gst_rtp_dtmf_mux_plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_rtp_dtmf_mux_debug, "rtpdtmfmux", 0, + "rtp dtmf muxer"); + + return gst_element_register (plugin, "rtpdtmfmux", GST_RANK_NONE, + GST_TYPE_RTP_DTMF_MUX); +} + diff --git a/gst/rtpmux/gstrtpdtmfmux.h b/gst/rtpmux/gstrtpdtmfmux.h new file mode 100644 index 000000000..4fdfe0c77 --- /dev/null +++ b/gst/rtpmux/gstrtpdtmfmux.h @@ -0,0 +1,67 @@ +/* RTP muxer element for GStreamer + * + * gstrtpdtmfmux.h: + * + * Copyright (C) <2007> Nokia Corporation. + * Contact: Zeeshan Ali + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000,2005 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_RTP_DTMF_MUX_H__ +#define __GST_RTP_DTMF_MUX_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_RTP_DTMF_MUX (gst_rtp_dtmf_mux_get_type()) +#define GST_RTP_DTMF_MUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_DTMF_MUX, GstRTPDTMFMux)) +#define GST_RTP_DTMF_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_DTMF_MUX, GstRTPDTMFMux)) +#define GST_IS_RTP_DTMF_MUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_DTMF_MUX)) +#define GST_IS_RTP_DTMF_MUX_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_DTMF_MUX)) + +typedef struct _GstRTPDTMFMux GstRTPDTMFMux; +typedef struct _GstRTPDTMFMuxClass GstRTPDTMFMuxClass; + +/** + * GstRTPDTMFMux: + * + * The opaque #GstRTPDTMFMux structure. + */ +struct _GstRTPDTMFMux +{ + GstRTPMux mux; + + /* our special pad */ + GstPad *special_pad; +}; + +struct _GstRTPDTMFMuxClass +{ + GstRTPMuxClass parent_class; +}; + +GType gst_rtp_dtmf_mux_get_type (void); +gboolean gst_rtp_dtmf_mux_plugin_init (GstPlugin * plugin); + +G_END_DECLS + +#endif /* __GST_RTP_DTMF_MUX_H__ */ + diff --git a/gst/rtpmux/gstrtpmux.c b/gst/rtpmux/gstrtpmux.c index 47a285b17..391919b0a 100644 --- a/gst/rtpmux/gstrtpmux.c +++ b/gst/rtpmux/gstrtpmux.c @@ -376,12 +376,3 @@ gst_rtp_mux_plugin_init (GstPlugin * plugin) GST_TYPE_RTP_MUX); } -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "rtpmux", - "RTP muxer", - gst_rtp_mux_plugin_init, - VERSION, - "LGPL", - "Farsight", - "http://farsight.sf.net") diff --git a/gst/rtpmux/gstrtpmux.h b/gst/rtpmux/gstrtpmux.h index b4b7bc2fc..80839f662 100644 --- a/gst/rtpmux/gstrtpmux.h +++ b/gst/rtpmux/gstrtpmux.h @@ -69,6 +69,7 @@ struct _GstRTPMuxClass }; GType gst_rtp_mux_get_type (void); +gboolean gst_rtp_mux_plugin_init (GstPlugin * plugin); G_END_DECLS diff --git a/gst/rtpmux/gstrtpmuxer.c b/gst/rtpmux/gstrtpmuxer.c new file mode 100644 index 000000000..a51c54005 --- /dev/null +++ b/gst/rtpmux/gstrtpmuxer.c @@ -0,0 +1,48 @@ +/* GStreamer RTP Muxer Plugins + * + * gstrtpdtmf.c: + * + * Copyright (C) <2007> Nokia Corporation. + * Contact: Zeeshan Ali + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000,2005 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "gstrtpmux.h" +#include "gstrtpdtmfmux.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_rtp_mux_plugin_init (plugin)) + return FALSE; + if (!gst_rtp_dtmf_mux_plugin_init (plugin)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "rtpmuxer", + "RTP Muxer plugins", + plugin_init, "0.1" , "LGPL", "Farsight", "http://farsight.sf.net"); -- cgit v1.2.3