[Opalvoip-svn] SF.net SVN: opalvoip:[28495] ptlib/trunk
Brought to you by:
csoutheren,
rjongbloed
From: <rjo...@us...> - 2012-10-05 12:14:46
|
Revision: 28495 http://opalvoip.svn.sourceforge.net/opalvoip/?rev=28495&view=rev Author: rjongbloed Date: 2012-10-05 12:14:37 +0000 (Fri, 05 Oct 2012) Log Message: ----------- Added gstreamer wrapper classes. Very basic at this stage. Inspired by work by Jonathan Henson. Modified Paths: -------------- ptlib/trunk/configure.ac ptlib/trunk/include/ptbuildopts.h.in ptlib/trunk/src/ptlib/msos/Console_2008.vcproj ptlib/trunk/src/ptlib/msos/Console_2010.vcxproj ptlib/trunk/src/ptlib/msos/Console_2010.vcxproj.filters Added Paths: ----------- ptlib/trunk/include/ptclib/gstreamer.h ptlib/trunk/src/ptclib/gstreamer.cxx Modified: ptlib/trunk/configure.ac =================================================================== --- ptlib/trunk/configure.ac 2012-10-05 09:53:34 UTC (rev 28494) +++ ptlib/trunk/configure.ac 2012-10-05 12:14:37 UTC (rev 28495) @@ -1752,6 +1752,37 @@ dnl ######################################################################## +dnl check for GStreamer library + +dnl MSWIN_DISPLAY gstreamer,GStreamer (OSSBuild) +dnl MSWIN_CHECK_FILE gstreamer,include\gstreamer-0.10\gst\gst.h,P_GSTREAMER_WIN32=1 +dnl MSWIN_DIR_SYMBOL gstreamer,GSTREAMER_DIR +dnl MSWIN_CHECK_DIR gstreamer,\Program Files\OSSBuild\GStreamer\v0.10.6\sdk +dnl MSWIN_CHECK_DIR gstreamer,\Program Files (x86)\OSSBuild\GStreamer\v0.10.6\sdk + +AC_ARG_ENABLE([gstreamer], + AS_HELP_STRING([--disable-lgstreamerua],[disable GStreamer support]), + [enable_gstreamer=$enableval], + [enable_gstreamer=$default_lua] + ) + +if test "$enable_gstreamer" = "no" ; then + AC_MSG_NOTICE(GStreamer disabled) +else + PKG_CHECK_MODULES([GSTREAMER], + [gstreamer-app-0.10], + [ + HAS_GSTREAMER=1 + AC_DEFINE(P_GSTREAMER, 1, "GStreamer found") + STDCCFLAGS="$STDCCFLAGS $GSTREAMER_CFLAGS" + ENDLDLIBS="$ENDLDLIBS $GSTREAMER_LIBS" + ], + [HAS_GSTREAMER=]) +fi +AC_SUBST(HAS_GSTREAMER) + + +dnl ######################################################################## dnl look for MEMORY_CHECK enabled. AC_ARG_ENABLE(memcheck, AS_HELP_STRING([--enable-memcheck],[enable leak testing code (off by default)])) Modified: ptlib/trunk/include/ptbuildopts.h.in =================================================================== --- ptlib/trunk/include/ptbuildopts.h.in 2012-10-05 09:53:34 UTC (rev 28494) +++ ptlib/trunk/include/ptbuildopts.h.in 2012-10-05 12:14:37 UTC (rev 28495) @@ -825,6 +825,196 @@ ///////////////////////////////////////////////// // +// GStreamer +// + +#undef P_GSTREAMER +#undef P_GSTREAMER_WIN64 +#undef P_GSTREAMER_WIN32 +#undef P_GSTREAMER_WINCE + +#if (defined(P_GSTREAMER_WIN64) && defined(P_64BIT) ) || \ + (defined(P_GSTREAMER_WIN32) && !defined(P_64BIT) && !defined(_WIN32_WCE)) || \ + (defined(P_GSTREAMER_WINCE) && defined(_WIN32_WCE)) + #define P_GSTREAMER 1 +#endif + +#if defined(_MSC_VER) && defined(P_GSTREAMER) + #define P_GSTREAMER_INCLUDE(inc) include_alias(<inc>, <@GSTREAMER_DIR@/include/gstreamer-0.10/inc>) + #pragma P_GSTREAMER_INCLUDE(gst/gst.h) + #pragma P_GSTREAMER_INCLUDE(gst/glib-compat.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstenumtypes.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstversion.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstbin.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstbuffer.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstbufferlist.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstcaps.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstchildproxy.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstclock.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstdebugutils.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstelement.h) + #pragma P_GSTREAMER_INCLUDE(gst/gsterror.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstevent.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstghostpad.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstindex.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstindexfactory.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstinfo.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstinterface.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstiterator.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstmarshal.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstmessage.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstminiobject.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstobject.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstpad.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstparamspecs.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstpipeline.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstplugin.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstpoll.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstpreset.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstquery.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstregistry.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstsegment.h) + #pragma P_GSTREAMER_INCLUDE(gst/gststructure.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstsystemclock.h) + #pragma P_GSTREAMER_INCLUDE(gst/gsttaglist.h) + #pragma P_GSTREAMER_INCLUDE(gst/gsttagsetter.h) + #pragma P_GSTREAMER_INCLUDE(gst/gsttask.h) + #pragma P_GSTREAMER_INCLUDE(gst/gsttaskpool.h) + #pragma P_GSTREAMER_INCLUDE(gst/gsttrace.h) + #pragma P_GSTREAMER_INCLUDE(gst/gsttypefind.h) + #pragma P_GSTREAMER_INCLUDE(gst/gsttypefindfactory.h) + #pragma P_GSTREAMER_INCLUDE(gst/gsturi.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstutils.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstvalue.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstxml.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstparse.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstcompat.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstconfig.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstformat.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstpadtemplate.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstbus.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstelementfactory.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstpluginfeature.h) + #pragma P_GSTREAMER_INCLUDE(gst/gstmacros.h) + #pragma P_GSTREAMER_INCLUDE(gst/app/gstappsrc.h) + #pragma P_GSTREAMER_INCLUDE(gst/base/gstpushsrc.h) + #pragma P_GSTREAMER_INCLUDE(gst/base/gstbasesrc.h) + + #define P_GLIB_INCLUDE(inc) include_alias(<inc>, <@GSTREAMER_DIR@/include/glib-2.0/inc>) + #pragma P_GLIB_INCLUDE(glib.h) + #pragma P_GLIB_INCLUDE(gmodule.h) + #pragma P_GLIB_INCLUDE(glibconfig.h) + #pragma P_GLIB_INCLUDE(glib-object.h) + #pragma P_GLIB_INCLUDE(glib/galloca.h) + #pragma P_GLIB_INCLUDE(glib/garray.h) + #pragma P_GLIB_INCLUDE(glib/gasyncqueue.h) + #pragma P_GLIB_INCLUDE(glib/gatomic.h) + #pragma P_GLIB_INCLUDE(glib/gbacktrace.h) + #pragma P_GLIB_INCLUDE(glib/gbase64.h) + #pragma P_GLIB_INCLUDE(glib/gbitlock.h) + #pragma P_GLIB_INCLUDE(glib/gbookmarkfile.h) + #pragma P_GLIB_INCLUDE(glib/gcache.h) + #pragma P_GLIB_INCLUDE(glib/gchecksum.h) + #pragma P_GLIB_INCLUDE(glib/gcompletion.h) + #pragma P_GLIB_INCLUDE(glib/gconvert.h) + #pragma P_GLIB_INCLUDE(glib/gdataset.h) + #pragma P_GLIB_INCLUDE(glib/gdate.h) + #pragma P_GLIB_INCLUDE(glib/gdir.h) + #pragma P_GLIB_INCLUDE(glib/gerror.h) + #pragma P_GLIB_INCLUDE(glib/gfileutils.h) + #pragma P_GLIB_INCLUDE(glib/ghash.h) + #pragma P_GLIB_INCLUDE(glib/ghook.h) + #pragma P_GLIB_INCLUDE(glib/ghostutils.h) + #pragma P_GLIB_INCLUDE(glib/giochannel.h) + #pragma P_GLIB_INCLUDE(glib/gkeyfile.h) + #pragma P_GLIB_INCLUDE(glib/glist.h) + #pragma P_GLIB_INCLUDE(glib/gmacros.h) + #pragma P_GLIB_INCLUDE(glib/gmain.h) + #pragma P_GLIB_INCLUDE(glib/gmappedfile.h) + #pragma P_GLIB_INCLUDE(glib/gmarkup.h) + #pragma P_GLIB_INCLUDE(glib/gmem.h) + #pragma P_GLIB_INCLUDE(glib/gmessages.h) + #pragma P_GLIB_INCLUDE(glib/gnode.h) + #pragma P_GLIB_INCLUDE(glib/goption.h) + #pragma P_GLIB_INCLUDE(glib/gpattern.h) + #pragma P_GLIB_INCLUDE(glib/gpoll.h) + #pragma P_GLIB_INCLUDE(glib/gprimes.h) + #pragma P_GLIB_INCLUDE(glib/gqsort.h) + #pragma P_GLIB_INCLUDE(glib/gquark.h) + #pragma P_GLIB_INCLUDE(glib/gqueue.h) + #pragma P_GLIB_INCLUDE(glib/grand.h) + #pragma P_GLIB_INCLUDE(glib/grel.h) + #pragma P_GLIB_INCLUDE(glib/gregex.h) + #pragma P_GLIB_INCLUDE(glib/gscanner.h) + #pragma P_GLIB_INCLUDE(glib/gsequence.h) + #pragma P_GLIB_INCLUDE(glib/gshell.h) + #pragma P_GLIB_INCLUDE(glib/gslice.h) + #pragma P_GLIB_INCLUDE(glib/gslist.h) + #pragma P_GLIB_INCLUDE(glib/gspawn.h) + #pragma P_GLIB_INCLUDE(glib/gstrfuncs.h) + #pragma P_GLIB_INCLUDE(glib/gstring.h) + #pragma P_GLIB_INCLUDE(glib/gtestutils.h) + #pragma P_GLIB_INCLUDE(glib/gthread.h) + #pragma P_GLIB_INCLUDE(glib/gthreadpool.h) + #pragma P_GLIB_INCLUDE(glib/gtimer.h) + #pragma P_GLIB_INCLUDE(glib/gtree.h) + #pragma P_GLIB_INCLUDE(glib/gtypes.h) + #pragma P_GLIB_INCLUDE(glib/gunicode.h) + #pragma P_GLIB_INCLUDE(glib/gurifuncs.h) + #pragma P_GLIB_INCLUDE(glib/gutils.h) + #pragma P_GLIB_INCLUDE(glib/gvarianttype.h) + #pragma P_GLIB_INCLUDE(glib/gvariant.h) + #pragma P_GLIB_INCLUDE(glib/gwin32.h) + #pragma P_GLIB_INCLUDE(gobject/gboxed.h) + #pragma P_GLIB_INCLUDE(gobject/genums.h) + #pragma P_GLIB_INCLUDE(gobject/gobject.h) + #pragma P_GLIB_INCLUDE(gobject/gparam.h) + #pragma P_GLIB_INCLUDE(gobject/gparamspecs.h) + #pragma P_GLIB_INCLUDE(gobject/gsignal.h) + #pragma P_GLIB_INCLUDE(gobject/gsourceclosure.h) + #pragma P_GLIB_INCLUDE(gobject/gtype.h) + #pragma P_GLIB_INCLUDE(gobject/gtypemodule.h) + #pragma P_GLIB_INCLUDE(gobject/gtypeplugin.h) + #pragma P_GLIB_INCLUDE(gobject/gvalue.h) + #pragma P_GLIB_INCLUDE(gobject/gvaluearray.h) + #pragma P_GLIB_INCLUDE(gobject/gvaluetypes.h) + #pragma P_GLIB_INCLUDE(gobject/gclosure.h) + #pragma P_GLIB_INCLUDE(gobject/gmarshal.h) + + #define P_LIBXML_INCLUDE(inc) include_alias(<inc>, <@GSTREAMER_DIR@/include/libxml2/inc>) + #pragma P_LIBXML_INCLUDE(libxml/parser.h) + #pragma P_LIBXML_INCLUDE(libxml/xmlversion.h) + #pragma P_LIBXML_INCLUDE(libxml/list.h) + #pragma P_LIBXML_INCLUDE(libxml/tree.h) + #pragma P_LIBXML_INCLUDE(libxml/dict.h) + #pragma P_LIBXML_INCLUDE(libxml/hash.h) + #pragma P_LIBXML_INCLUDE(libxml/valid.h) + #pragma P_LIBXML_INCLUDE(libxml/entities.h) + #pragma P_LIBXML_INCLUDE(libxml/xmlerror.h) + #pragma P_LIBXML_INCLUDE(libxml/xmlstring.h) + #pragma P_LIBXML_INCLUDE(libxml/xmlexports.h) + #pragma P_LIBXML_INCLUDE(libxml/xmlregexp.h) + #pragma P_LIBXML_INCLUDE(libxml/xmlautomata.h) + #pragma P_LIBXML_INCLUDE(libxml/encoding.h) + #pragma P_LIBXML_INCLUDE(libxml/xmlIO.h) + #pragma P_LIBXML_INCLUDE(libxml/globals.h) + #pragma P_LIBXML_INCLUDE(libxml/SAX.h) + #pragma P_LIBXML_INCLUDE(libxml/SAX2.h) + #pragma P_LIBXML_INCLUDE(libxml/xmlmemory.h) + #pragma P_LIBXML_INCLUDE(libxml/xlink.h) + #pragma P_LIBXML_INCLUDE(libxml/threads.h) + + #pragma include_alias(<iconv.h>, <@GSTREAMER_DIR@/include/iconv.h>) + + #define P_GSTREAMER_LIBRARY "@GSTREAMER_DIR@/lib/gstreamer-0.10.lib" + #define P_GST_APP_LIBRARY "@GSTREAMER_DIR@/lib/gstapp-0.10.lib" + #define P_GOBJECT_LIBRARY "@GSTREAMER_DIR@/lib/gobject-2.0.lib" + #define P_GLIB_LIBRARY "@GSTREAMER_DIR@/lib/glib-2.0.lib" +#endif + + +///////////////////////////////////////////////// +// // COM/DCOM Support (Windows only) // Added: ptlib/trunk/include/ptclib/gstreamer.h =================================================================== --- ptlib/trunk/include/ptclib/gstreamer.h (rev 0) +++ ptlib/trunk/include/ptclib/gstreamer.h 2012-10-05 12:14:37 UTC (rev 28495) @@ -0,0 +1,308 @@ +/* + * gstreamer.h + * + * Interface classes for Gstreamer. + * + * Portable Tools Library + * + * Copyright (c) 2011 Vox Lucida Pty. Ltd. + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Original Code is Portable Windows Library. + * + * The Initial Developer of the Original Code is Vox Lucida Pty. Ltd. + * + * Contributor(s): ______________________________________. + * + * $Revision$ + * $Author$ + * $Date$ + */ + +#ifndef PTLIB_GSTREMER_H +#define PTLIB_GSTREMER_H + +#ifdef P_USE_PRAGMA +#pragma interface +#endif + +#include <ptbuildopts.h> + +#if P_GSTREAMER + +#include <list> + + +////////////////////////////////////////////////////////////////////////////// +// GStreamer classes + +/** GLib object. + */ +class PGBaseObject : public PObject +{ + PCLASSINFO(PGBaseObject, PObject) + protected: + PGBaseObject() : m_object(NULL) { } + + private: + PGBaseObject(const PGBaseObject &) { } + void operator=(const PGBaseObject &) { } + + public: + template<typename T> T * As() const { return reinterpret_cast<T *>(m_object); } + void * Ptr() const { return m_object; } + bool IsValid() const { return m_object != NULL; } + operator bool() const { return m_object != NULL; } + bool operator!() const { return m_object == NULL; } + + bool Attach(void * object); + void * Detach(); + + protected: + virtual void Unreference() = 0; + + private: + void * m_object; +}; + + +class PGObject : public PGBaseObject +{ + PCLASSINFO(PGObject, PGBaseObject) + protected: + PGObject() { } + PGObject(const PGObject & other); + void operator=(const PGObject &); + + public: + ~PGObject() { Unreference(); } + + protected: + virtual void Unreference(); + + public: + bool Set( + const char * attribute, + const char * value + ); + bool Get( + const char * attribute, + PString & value + ); +}; + + +class PGstMiniObject : public PGBaseObject +{ + PCLASSINFO(PGstMiniObject, PGBaseObject) + protected: + PGstMiniObject() { } + PGstMiniObject(const PGstMiniObject & other); + void operator=(const PGstMiniObject &); + + public: + ~PGstMiniObject() { Unreference(); } + + protected: + virtual void Unreference(); +}; + + +class PGstObject : public PGObject +{ + PCLASSINFO(PGstObject, PGObject) + public: + + PString GetName() const; +}; + + +class PGstPluginFeature : public PGstObject +{ + PCLASSINFO(PGstPluginFeature, PGstObject) + public: + PString GetName() const; + + static PStringList Inspect( + const char * klassRegex, + bool detailed + ); +}; + + +class PGstElementFactory : public PGstPluginFeature +{ + PCLASSINFO(PGstElementFactory, PGstPluginFeature) + public: + PGstElementFactory( + const char * factoryName = NULL + ); + + PString GetKlass() const; + PString GetDescription() const; +}; + + +class PGstElement : public PGstObject +{ + PCLASSINFO(PGstElement, PGstObject) + public: + PGstElement() { } + PGstElement( + const char * factoryName, + const char * name + ); + + bool Link( + const PGstElement & dest + ); + + enum States { + VoidPending, + Null, + Ready, + Paused, + Playing + }; + + enum StateResult { + Failed, + Success, + Changing, + NoPreRoll + }; + StateResult SetState( + States newState + ); + StateResult GetState( + States & state + ); + StateResult GetPendingState( + States & state + ); + StateResult WaitStateChange(); + StateResult WaitStateChange( + const PTimeInterval & timeout + ); +}; + + +class PGstBin : public PGstElement +{ + PCLASSINFO(PGstBin, PGstElement) + public: + bool AddElement( + const PGstElement & element + ); +}; + + +class PGstAppSrc : public PGstElement +{ + PCLASSINFO(PGstAppSrc, PGstElement) + public: + PGstAppSrc( + const PGstBin & bin, + const char * name + ); + + enum Types { + Stream, + Seekable, + RandomAccess + }; + void SetType(Types type); + Types GetType() const; + + bool Push( + const void * data, + PINDEX size + ); + + bool EndStream(); +}; + + +class PGstAppSink : public PGstElement +{ + PCLASSINFO(PGstAppSink, PGstElement) + public: + PGstAppSink( + const PGstBin & bin, + const char * name + ); + + bool Pull( + void * data, + PINDEX & size + ); + + bool IsEndStream(); +}; + + +class PGstPipeline : public PGstBin +{ + PCLASSINFO(PGstPipeline, PGstBin) + public: + PGstPipeline( + const char * name = NULL + ); + + bool Parse( + const char * pipeline + ); +}; + + +class PGstMessage : public PGstMiniObject +{ + PCLASSINFO(PGstMessage, PGstMiniObject) + public: + + PString GetType() const; + + void PrintOn(ostream & strm) const; +}; + + +class PGstBus : public PGstObject +{ + PCLASSINFO(PGstBus, PGstObject) + public: + PGstBus() { } + PGstBus( + const PGstPipeline & pipeline + ); + + bool HavePending(); + bool Peek(PGstMessage & message); + bool Pop(PGstMessage & message); + bool POp(PGstMessage & message, PTimeInterval & wait); + + typedef PNotifierTemplate<PGstMessage> Notifier; + #define PDECLARE_GstBusNotifier(cls, fn) PDECLARE_NOTIFIER2(PGstBus, cls, fn, PGstMessage) + #define PDECLARE_ASYNC_GstBusNotifier(cls, fn) PDECLARE_ASYNC_NOTIFIER2(PGstBus, cls, fn, PGstMessage) + #define PCREATE_GstBusNotifier(fn) PCREATE_NOTIFIER2(fn, PGstMessage) + + bool SetNotifier( + Notifier & notifier + ); +}; + + +#endif // P_GSTREAMER + +#endif // PTLIB_GSTREMER_H + + +// End Of File /////////////////////////////////////////////////////////////// Added: ptlib/trunk/src/ptclib/gstreamer.cxx =================================================================== --- ptlib/trunk/src/ptclib/gstreamer.cxx (rev 0) +++ ptlib/trunk/src/ptclib/gstreamer.cxx 2012-10-05 12:14:37 UTC (rev 28495) @@ -0,0 +1,595 @@ +/* + * gstreamer.cxx + * + * Interface classes for Gstreamer. + * + * Portable Tools Library + * + * Copyright (c) 2011 Vox Lucida Pty. Ltd. + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Original Code is Portable Windows Library. + * + * The Initial Developer of the Original Code is Vox Lucida Pty. Ltd. + * + * Contributor(s): ______________________________________. + * + * $Revision$ + * $Author$ + * $Date$ + */ + +#ifdef __GNUC__ +#pragma implementation "gstreamer.h" +#endif + +#include <ptlib.h> + +#include <ptclib/gstreamer.h> + +#include <ptlib/pprocess.h> + + +#if P_GSTREAMER + +#ifdef _MSC_VER + #pragma warning(disable:4127) + #include <gst/gst.h> + #pragma warning(default:4127) + + #pragma comment(lib, P_GSTREAMER_LIBRARY) + #pragma comment(lib, P_GST_APP_LIBRARY) + #pragma comment(lib, P_GOBJECT_LIBRARY) + #pragma comment(lib, P_GLIB_LIBRARY) + #pragma message("GStreamer support enabled") +#else + #include <gst/gst.h> +#endif + +#include <gst/app/gstappsrc.h> +#include <gst/app/gstappsink.h> +#include <gst/app/gstappbuffer.h> + + +class PGError +{ + GError * m_error; +public: + PGError() + : m_error(NULL) + { + } + + ~PGError() + { + if (m_error != NULL) + g_error_free(m_error); + } + + GError ** operator&() { return &m_error; } + bool operator!() const { return m_error == NULL; } + + friend ostream & operator<<(ostream & strm, const PGError & error) + { + if (error.m_error != NULL) + strm << error.m_error->message; + return strm; + } +}; + + + +#if PTRACING +static void LogFunction(GstDebugCategory * /*category*/, + GstDebugLevel level, + const gchar *file, + const gchar *function, + gint line, + GObject * /*object*/, + GstDebugMessage *message, + gpointer /*data*/) +{ + PTrace::Begin(level, file+1, line, NULL) + << "GStreamer\t" + << function << ": " + << gst_debug_message_get(message) + << PTrace::End; +} +#endif + + +class PGstInitialiser : public PProcessStartup +{ + PCLASSINFO(PGstInitialiser, PProcessStartup) + public: + virtual void OnStartup() + { +#if PTRACING + gst_debug_add_log_function(LogFunction, NULL); + gst_debug_set_default_threshold(GST_LEVEL_DEBUG); + gst_debug_set_active(true); +#endif + + PGError error; + if (gst_init_check(NULL, NULL, &error)) { + PTRACE(3, "GStreamer\tUsing version " << gst_version_string()); + } + else { + PTRACE(1, "GStreamer\tCould not initialise, error: " << error); + } + } + + virtual void OnShutdown() + { + gst_deinit(); + +#if PTRACING + gst_debug_set_active(false); + gst_debug_add_log_function(NULL, NULL); +#endif + } +}; + +static PFactory<PProcessStartup>::Worker<PGstInitialiser> PGstInitialiserInstance("GStreamer", true); + + +/////////////////////////////////////////////////////////////////////// + +bool PGBaseObject::Attach(void * object) +{ + Unreference(); + m_object = object; + return IsValid(); +} + + +void * PGBaseObject::Detach() +{ + void * object = m_object; + m_object = NULL; + return object; +} + + +/////////////////////////////////////////////////////////////////////// + +PGObject::PGObject(const PGObject & other) +{ + Attach(gst_object_ref(other.Ptr())); +} + + +void PGObject::operator=(const PGObject & other) +{ + Attach(gst_object_ref(other.Ptr())); +} + + +void PGObject::Unreference() +{ + if (IsValid()) + gst_object_unref(Ptr()); +} + + +bool PGObject::Set(const char * attribute, const char * value) +{ + if (!IsValid()) + return false; + + g_object_set(Ptr(), attribute, value, NULL); + return true; +} + + +bool PGObject::Get(const char * attribute, PString & value) +{ + if (!IsValid()) + return false; + + gchar * ptr; + g_object_get(Ptr(), attribute, &ptr, NULL); + value = ptr; + g_free(ptr); + return true; +} + + +/////////////////////////////////////////////////////////////////////// + +PString PGstObject::GetName() const +{ + gchar * ptr = gst_object_get_name(As<GstObject>()); + PString str(ptr); + g_free(ptr); + return str; +} + + +/////////////////////////////////////////////////////////////////////// + +PGstMiniObject::PGstMiniObject(const PGstMiniObject & other) +{ + Attach(gst_mini_object_ref(other.As<GstMiniObject>())); +} + + +void PGstMiniObject::operator=(const PGstMiniObject & other) +{ + Attach(gst_mini_object_ref(other.As<GstMiniObject>())); +} + + +void PGstMiniObject::Unreference() +{ + if (IsValid()) + gst_mini_object_unref(As<GstMiniObject>()); +} + + +/////////////////////////////////////////////////////////////////////// + +PString PGstPluginFeature::GetName() const +{ + if (IsValid()) + return gst_plugin_feature_get_name(As<GstPluginFeature>()); + else + return PString::Empty(); +} + + +PStringList PGstPluginFeature::Inspect(const char * klassRegex, bool detailed) +{ + PStringList elements; + + PRegularExpression regex(klassRegex == NULL || *klassRegex == '\0' ? "*" : klassRegex); + + GstRegistry * registry = gst_registry_get_default(); + + GList * pluginList = gst_registry_get_plugin_list(registry); + for (GList * pluginIter = pluginList; pluginIter != NULL; pluginIter = g_list_next(pluginIter)) { + GstPlugin * plugin = GST_PLUGIN(pluginIter->data); + + GList * featureList = gst_registry_get_feature_list_by_plugin(registry, plugin->desc.name); + for (GList * featureIter = featureList; featureIter != NULL; featureIter = g_list_next(featureIter)) { + GstPluginFeature * feature = GST_PLUGIN_FEATURE(featureIter->data); + + if (GST_IS_ELEMENT_FACTORY(feature)) { + GstElementFactory * factory = GST_ELEMENT_FACTORY(feature); + PINDEX dummy; + if (regex.Execute(factory->details.klass, dummy)) { + PStringStream info; + info << GST_PLUGIN_FEATURE_NAME(factory); + if (detailed) { + info << '\t' << factory->details.klass + << '\t' << factory->details.longname + << '\t' << factory->details.description; + } + elements.AppendString(info); + } + } + } + + gst_plugin_feature_list_free(featureList); + } + + gst_plugin_list_free(pluginList); + + return elements; +} + + +/////////////////////////////////////////////////////////////////////// + +PGstElementFactory::PGstElementFactory(const char * factoryName) +{ + if (IsValid()) + Attach(gst_element_factory_find(factoryName)); +} + + +PString PGstElementFactory::GetKlass() const +{ + if (IsValid()) + return gst_element_factory_get_klass(As<GstElementFactory>()); + else + return PString::Empty(); +} + + +PString PGstElementFactory::GetDescription() const +{ + if (IsValid()) + return gst_element_factory_get_description(As<GstElementFactory>()); + else + return PString::Empty(); +} + + +/////////////////////////////////////////////////////////////////////// + +PGstElement::PGstElement(const char * factoryName, const char * name) +{ + Attach(gst_element_factory_make(factoryName, name)); +} + + +bool PGstElement::Link(const PGstElement & dest) +{ + return IsValid() && dest.IsValid() && gst_element_link(As<GstElement>(), dest.As<GstElement>()); +} + + +PGstElement::StateResult PGstElement::SetState(States newState) +{ + return IsValid() ? (StateResult)gst_element_set_state(As<GstElement>(), (GstState)newState) : Failed; +} + + +PGstElement::StateResult PGstElement::GetState(States & state) +{ + return IsValid() ? (StateResult)gst_element_get_state(As<GstElement>(), (GstState *)&state, NULL, 0) : Failed; +} + + +PGstElement::StateResult PGstElement::GetPendingState(States & state) +{ + return IsValid() ? (StateResult)gst_element_get_state(As<GstElement>(), NULL, (GstState *)&state, 0) : Failed; +} + + +PGstElement::StateResult PGstElement::WaitStateChange() +{ + return IsValid() ? (StateResult)gst_element_get_state(As<GstElement>(), NULL, NULL, GST_CLOCK_TIME_NONE) : Failed; +} + + +PGstElement::StateResult PGstElement::WaitStateChange(const PTimeInterval & timeout) +{ + return IsValid() ? (StateResult)gst_element_get_state(As<GstElement>(), NULL, NULL, + timeout.GetMilliSeconds()*1000000) : Failed; +} + + +/////////////////////////////////////////////////////////////////////// + +bool PGstBin::AddElement(const PGstElement & element) +{ + return IsValid() && element.IsValid() && gst_bin_add(As<GstBin>(), element.As<GstElement>()); +} + + +/////////////////////////////////////////////////////////////////////// + +PGstAppSrc::PGstAppSrc(const PGstBin & bin, const char * name) +{ + if (bin.IsValid()) + Attach(gst_bin_get_by_name(bin.As<GstBin>(), name)); +} + + +void PGstAppSrc::SetType(Types type) +{ + gst_app_src_set_stream_type(As<GstAppSrc>(), (GstAppStreamType)type); +} + + +PGstAppSrc::Types PGstAppSrc::GetType() const +{ + return (Types)gst_app_src_get_stream_type(As<GstAppSrc>()); +} + + +bool PGstAppSrc::Push(const void * data, PINDEX size) +{ + gchar * bufPtr = (gchar*)g_malloc0 (size); + memcpy(bufPtr, data, size); + GstBuffer * buffer = gst_app_buffer_new(bufPtr, size, (GstAppBufferFinalizeFunc)g_free, bufPtr); + return gst_app_src_push_buffer(As<GstAppSrc>(), buffer) == GST_FLOW_OK; +} + + +bool PGstAppSrc::EndStream() +{ + return gst_app_src_end_of_stream(As<GstAppSrc>()) == GST_FLOW_OK; +} + + +/////////////////////////////////////////////////////////////////////// + +PGstAppSink::PGstAppSink(const PGstBin & bin, const char * name) +{ + if (bin.IsValid()) + Attach(gst_bin_get_by_name(bin.As<GstBin>(), name)); +} + + +bool PGstAppSink::Pull(void * data, PINDEX & size) +{ + GstBuffer * buffer = gst_app_sink_pull_buffer(As<GstAppSink>()); + if (buffer == NULL) + return false; + + if (size > (PINDEX)buffer->size) + size = buffer->size; + + memcpy(data, buffer->data, size); + gst_buffer_unref(buffer); + return true; +} + + +bool PGstAppSink::IsEndStream() +{ + return gst_app_sink_is_eos(As<GstAppSink>()) == GST_FLOW_OK; +} + + +/////////////////////////////////////////////////////////////////////// + +PGstPipeline::PGstPipeline(const char * name) +{ + if (name != NULL && *name != '\0') + Attach(gst_pipeline_new(name)); +} + + +bool PGstPipeline::Parse(const char * pipeline) +{ + PGError error; + if (!Attach(gst_parse_launch(pipeline, &error))) { + PTRACE(1, "GStreamer\tCould not parse pipline \"" << pipeline << "\", error: " << error); + return false; + } + + if (!error) { + PTRACE(4, "GStreamer\tParsed pipline \"" << pipeline << '"'); + return true; + } + + PTRACE(2, "GStreamer\tError parsing pipline \"" << pipeline << "\": " << error); + return false; +} + + +/////////////////////////////////////////////////////////////////////// + +PString PGstMessage::GetType() const +{ + if (!IsValid()) + return PString::Empty(); + + return GST_MESSAGE_TYPE_NAME(As<GstMessage>()); +} + + +void PGstMessage::PrintOn(ostream & strm) const +{ + if (!IsValid()) { + strm << "(null)"; + return; + } + + GstMessage * msg = As<GstMessage>(); + + strm << GST_MESSAGE_TYPE_NAME(msg) << ": "; + + if (GST_MESSAGE_SRC(msg) != NULL) { + gchar * srcName = gst_object_get_name(GST_MESSAGE_SRC(msg)); + strm << " src=" << srcName << ", "; + g_free(srcName); + } + + PGError error; + gchar * debug = NULL; + + switch (GST_MESSAGE_TYPE(msg)) { + case GST_MESSAGE_EOS : + break; + case GST_MESSAGE_ERROR : + gst_message_parse_error(msg, &error, &debug); + break; + case GST_MESSAGE_WARNING : + gst_message_parse_warning(msg, &error, &debug); + break; + case GST_MESSAGE_INFO : + gst_message_parse_info(msg, &error, &debug); + break; + case GST_MESSAGE_STATE_CHANGED : + { + GstState oldstate, newstate, pending; + gst_message_parse_state_changed(msg, &oldstate, &newstate, &pending); + strm << "old=" << gst_element_state_get_name(oldstate) + << ", new=" << gst_element_state_get_name(newstate) + << ", pending=" << gst_element_state_get_name(pending); + } + break; + } + + strm << error; + if (debug != NULL) { + strm << ", debug=" << debug; + g_free(debug); + } +} + + +/////////////////////////////////////////////////////////////////////// + +PGstBus::PGstBus(const PGstPipeline & pipeline) +{ + if (pipeline.IsValid()) + Attach(gst_pipeline_get_bus(pipeline.As<GstPipeline>())); +} + + +bool PGstBus::HavePending() +{ + return IsValid() && gst_bus_have_pending(As<GstBus>()); +} + + +bool PGstBus::Peek(PGstMessage & message) +{ + return IsValid() && message.Attach(gst_bus_peek(As<GstBus>())); +} + + +bool PGstBus::Pop(PGstMessage & message) +{ + return IsValid() && message.Attach(gst_bus_pop(As<GstBus>())); +} + + +bool PGstBus::POp(PGstMessage & message, PTimeInterval & wait) +{ + return IsValid() && message.Attach(gst_bus_timed_pop(As<GstBus>(), wait.GetMilliSeconds()*1000000)); +} + + +static GstBusSyncReply MySyncHandler(GstBus * bus, GstMessage * message, gpointer data) +{ + PGstBus pbus; + pbus.Attach(bus); + + PGstMessage pmessage; + pmessage.Attach(message); + + PGstBus::Notifier & notifier = *reinterpret_cast<PGstBus::Notifier *>(data); + + notifier(pbus, pmessage); + return GST_BUS_PASS; +} + + +bool PGstBus::SetNotifier(Notifier & notifier) +{ + if (!IsValid() || notifier.IsNULL()) + return false; + + gst_bus_set_sync_handler(As<GstBus>(), MySyncHandler, ¬ifier); + return true; +} + + +/////////////////////////////////////////////////////////////////////// + +#else + + #ifdef _MSC_VER + #pragma message("GStreamer support DISABLED") + #endif + +#endif // P_GSTREAMER + + +// End Of File /////////////////////////////////////////////////////////////// Modified: ptlib/trunk/src/ptlib/msos/Console_2008.vcproj =================================================================== --- ptlib/trunk/src/ptlib/msos/Console_2008.vcproj 2012-10-05 09:53:34 UTC (rev 28494) +++ ptlib/trunk/src/ptlib/msos/Console_2008.vcproj 2012-10-05 12:14:37 UTC (rev 28495) @@ -7441,6 +7441,10 @@ > </File> <File + RelativePath="..\..\ptclib\gstreamer.cxx" + > + </File> + <File RelativePath="..\..\ptclib\guid.cxx" > </File> @@ -9404,6 +9408,10 @@ > </File> <File + RelativePath="..\..\..\include\ptclib\gstreamer.h" + > + </File> + <File RelativePath="..\..\..\include\ptclib\html.h" > </File> Modified: ptlib/trunk/src/ptlib/msos/Console_2010.vcxproj =================================================================== --- ptlib/trunk/src/ptlib/msos/Console_2010.vcxproj 2012-10-05 09:53:34 UTC (rev 28494) +++ ptlib/trunk/src/ptlib/msos/Console_2010.vcxproj 2012-10-05 12:14:37 UTC (rev 28495) @@ -278,6 +278,9 @@ </Lib> </ItemDefinitionGroup> <ItemGroup> + <ClCompile Include="..\..\ptclib\gstreamer.cxx"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\include;C:\Program Files %28x86%29\OSSBuild\GStreamer\v0.10.6\sdk\include\gstreamer-0.10;C:\Program Files %28x86%29\OSSBuild\GStreamer\v0.10.6\sdk\include\glib-2.0;C:\Program Files\OSSBuild\GStreamer\v0.10.6\sdk\include\gstreamer-0.10;C:\Program Files\OSSBuild\GStreamer\v0.10.6\sdk\include\glib-2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> <ClCompile Include="..\..\ptclib\jscript.cxx"> <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\..\external\v8\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='No Trace|Win32'">..\..\..\..\external\v8\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> @@ -668,6 +671,7 @@ </CustomBuild> </ItemGroup> <ItemGroup> + <ClInclude Include="..\..\..\include\ptclib\gstreamer.h" /> <ClInclude Include="..\..\..\include\ptclib\jscript.h" /> <ClInclude Include="..\..\..\include\ptclib\script.h" /> <ClInclude Include="..\..\..\include\ptclib\pnat.h" /> Modified: ptlib/trunk/src/ptlib/msos/Console_2010.vcxproj.filters =================================================================== --- ptlib/trunk/src/ptlib/msos/Console_2010.vcxproj.filters 2012-10-05 09:53:34 UTC (rev 28494) +++ ptlib/trunk/src/ptlib/msos/Console_2010.vcxproj.filters 2012-10-05 12:14:37 UTC (rev 28495) @@ -331,6 +331,9 @@ <ClCompile Include="..\..\ptclib\ssdp.cxx"> <Filter>Source Files\Components</Filter> </ClCompile> + <ClCompile Include="..\..\ptclib\gstreamer.cxx"> + <Filter>Source Files\Components</Filter> + </ClCompile> <ClCompile Include="..\..\ptclib\script.cxx"> <Filter>Source Files\Components</Filter> </ClCompile> @@ -792,6 +795,9 @@ <ClInclude Include="..\..\..\include\ptlib\msos\ptlib\platform.h"> <Filter>Header Files\MSOS</Filter> </ClInclude> + <ClInclude Include="..\..\..\include\ptclib\gstreamer.h"> + <Filter>Header Files\Components</Filter> + </ClInclude> <ClInclude Include="..\..\..\include\ptclib\script.h"> <Filter>Header Files\Components</Filter> </ClInclude> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |