diff options
author | Michael Meeks <michael.meeks@suse.com> | 2012-07-30 15:15:58 +0200 |
---|---|---|
committer | Michael Meeks <michael.meeks@suse.com> | 2012-08-09 20:46:16 +0100 |
commit | 21d7f4b4bba79558de830d9e815e127f67274355 (patch) | |
tree | f0c4e2ab7f96fdcf1ce9393477b773eb64cdd01b /avmedia | |
parent | 95938a123cbc8c0741a505b61ca874c0153c3f7a (diff) |
gstreamer: make gstreamer 1.0 and 0.10 dual compile
Add fallback activation of an _OLD media component to the core.
Compile both a 0.10 and 1.0 version of the gstreamer component
Change-Id: I91f65d05391cb2d7e02f9cff18f96178a128705O1
Diffstat (limited to 'avmedia')
-rw-r--r-- | avmedia/Library_avmediagst.mk | 8 | ||||
-rw-r--r-- | avmedia/Module_avmedia.mk | 6 | ||||
-rw-r--r-- | avmedia/source/gstreamer/avmediagstreamer_0_10.component | 6 | ||||
-rw-r--r-- | avmedia/source/gstreamer/gst_0_10.cxx | 15 | ||||
-rw-r--r-- | avmedia/source/gstreamer/gstplayer.cxx | 69 | ||||
-rw-r--r-- | avmedia/source/gstreamer/gstplayer.hxx | 4 | ||||
-rw-r--r-- | avmedia/source/gstreamer/gstuno.cxx | 17 | ||||
-rw-r--r-- | avmedia/source/inc/mediamisc.hxx | 11 | ||||
-rw-r--r-- | avmedia/source/viewer/mediawindowbase_impl.cxx | 21 |
9 files changed, 106 insertions, 51 deletions
diff --git a/avmedia/Library_avmediagst.mk b/avmedia/Library_avmediagst.mk index 6336ee44b2db..ee8a09aadb98 100644 --- a/avmedia/Library_avmediagst.mk +++ b/avmedia/Library_avmediagst.mk @@ -33,8 +33,9 @@ $(eval $(call gb_Library_set_componentfile,avmediagst,avmedia/source/gstreamer/a $(eval $(call gb_Library_set_include,avmediagst,\ $$(INCLUDE) \ -I$(SRCDIR)/avmedia/source/inc \ - $(shell pkg-config --cflags gstreamer-0.10, gstreamer-plugins-base-0.10) \ + $(GSTREAMER_CFLAGS) \ )) +$(eval $(call gb_Library_add_libs,avmediagst,$(GSTREAMER_LIBS))) $(eval $(call gb_Library_use_sdk_api,avmediagst)) @@ -54,11 +55,6 @@ $(eval $(call gb_Library_use_libraries,avmediagst,\ $(gb_STDLIBS) \ )) -$(eval $(call gb_Library_add_libs,avmediagst,\ - $(shell pkg-config --libs gstreamer-0.10, gstreamer-plugins-base-0.10) \ - -lgstinterfaces-0.10 \ -)) - $(eval $(call gb_Library_add_exception_objects,avmediagst,\ avmedia/source/gstreamer/gstmanager \ avmedia/source/gstreamer/gstplayer \ diff --git a/avmedia/Module_avmedia.mk b/avmedia/Module_avmedia.mk index 729c24f0322a..ef504574b701 100644 --- a/avmedia/Module_avmedia.mk +++ b/avmedia/Module_avmedia.mk @@ -40,6 +40,12 @@ $(eval $(call gb_Module_add_targets,avmedia,\ )) endif +ifeq ($(ENABLE_GSTREAMER_0_10),TRUE) +$(eval $(call gb_Module_add_targets,avmedia,\ + Library_avmediagst_0_10 \ +)) +endif + ifeq ($(GUIBASE),aqua) $(eval $(call gb_Module_add_targets,avmedia,\ Library_avmediaQuickTime \ diff --git a/avmedia/source/gstreamer/avmediagstreamer_0_10.component b/avmedia/source/gstreamer/avmediagstreamer_0_10.component new file mode 100644 index 000000000000..3fc61d76cf25 --- /dev/null +++ b/avmedia/source/gstreamer/avmediagstreamer_0_10.component @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<component loader="com.sun.star.loader.SharedLibrary" xmlns="http://openoffice.org/2010/uno-components"> + <implementation name="com.sun.star.comp.media.Manager_GStreamer_0_10"> + <service name="com.sun.star.comp.avmedia.Manager_GStreamer_0_10"/> + </implementation> +</component> diff --git a/avmedia/source/gstreamer/gst_0_10.cxx b/avmedia/source/gstreamer/gst_0_10.cxx new file mode 100644 index 000000000000..a0624c40b91f --- /dev/null +++ b/avmedia/source/gstreamer/gst_0_10.cxx @@ -0,0 +1,15 @@ +#define AVMEDIA_GST_0_10 + +// forward compatibility goodness +#include <gst/interfaces/xoverlay.h> +#define gst_video_overlay_expose(a) gst_x_overlay_expose(GST_X_OVERLAY (a)) +#define gst_video_overlay_set_window_handle(a,b) gst_x_overlay_set_xwindow_id( \ + reinterpret_cast<GstXOverlay *>(a), (b) ) +#define GST_VIDEO_OVERLAY(a) reinterpret_cast<GstVideoOverlay *>(a) + +// #define GstVideoOverlay GstXOverlay + +#include "gstmanager.cxx" +#include "gstplayer.cxx" +#include "gstuno.cxx" +#include "gstwindow.cxx" diff --git a/avmedia/source/gstreamer/gstplayer.cxx b/avmedia/source/gstreamer/gstplayer.cxx index d95342a4afb5..28e5d343bfaf 100644 --- a/avmedia/source/gstreamer/gstplayer.cxx +++ b/avmedia/source/gstreamer/gstplayer.cxx @@ -33,7 +33,6 @@ #include <vcl/syschild.hxx> #include <vcl/sysdata.hxx> - #include "gstplayer.hxx" #include "gstframegrabber.hxx" #include "gstwindow.hxx" @@ -45,8 +44,14 @@ #define AVMEDIA_GST_PLAYER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Player_GStreamer" #define AVMEDIA_GST_PLAYER_SERVICENAME "com.sun.star.media.Player_GStreamer" -#if OSL_DEBUG_LEVEL > 2 -#define DBG OSL_TRACE +#ifdef AVMEDIA_GST_0_10 +# define AVVERSION "gst 0.10: " +#else +# define AVVERSION "gst 1.0: " +#endif + +#if 1 //OSL_DEBUG_LEVEL > 2 +#define DBG(...) do { fprintf (stderr, "%s", AVVERSION); fprintf (stderr, __VA_ARGS__); fprintf (stderr, "\n"); } while (0); #else #define DBG(...) #endif @@ -83,15 +88,22 @@ Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) : mbInitialized = gst_init_check( &argc, &argv, &pError ); + DBG( "%p Player::Player", this ); + if (pError != NULL) + { // TODO: thow an exception? + DBG( "%p Player::Player error '%s'", this, pError->message ); g_error_free (pError); + } } // ------------------------------------------------------------------------------ Player::~Player() { + DBG( "%p Player::~Player", this ); + // Release the elements and pipeline if( mbInitialized ) { @@ -160,7 +172,7 @@ static gboolean wrap_element_query_position (GstElement *element, GstFormat form { #ifdef AVMEDIA_GST_0_10 GstFormat my_format = format; - return gst_element_query_position( mpPlaybin, &my_format, cur) && my_format == format && *cur > 0L; + return gst_element_query_position( element, &my_format, cur) && my_format == format && *cur > 0L; #else return gst_element_query_position( element, format, cur ); #endif @@ -170,7 +182,7 @@ static gboolean wrap_element_query_duration (GstElement *element, GstFormat form { #ifdef AVMEDIA_GST_0_10 GstFormat my_format = format; - return gst_element_query_duration( mpPlaybin, &my_format, duration) && my_format == format && *duration > 0L; + return gst_element_query_duration( element, &my_format, duration) && my_format == format && *duration > 0L; #else return gst_element_query_duration( element, format, duration ); #endif @@ -178,21 +190,27 @@ static gboolean wrap_element_query_duration (GstElement *element, GstFormat form GstBusSyncReply Player::processSyncMessage( GstMessage *message ) { - DBG( "%p processSyncMessage: %s", this, GST_MESSAGE_TYPE_NAME( message ) ); +// DBG( "%p processSyncMessage has handle: %s", this, GST_MESSAGE_TYPE_NAME( message ) ); -#if OSL_DEBUG_LEVEL > 0 +#if 1 // OSL_DEBUG_LEVEL > 0 if ( GST_MESSAGE_TYPE( message ) == GST_MESSAGE_ERROR ) { GError* error; gchar* error_debug; gst_message_parse_error( message, &error, &error_debug ); - OSL_TRACE("gstreamer error: '%s' debug: '%s'", error->message, error_debug); + fprintf(stderr, "gstreamer error: '%s' debug: '%s'", error->message, error_debug); } #endif - if (gst_message_has_name (message, "prepare-xwindow-id") && mnWindowID != 0 ) +#ifdef AVMEDIA_GST_0_10 + if (message->structure && + !strcmp( gst_structure_get_name( message->structure ), "prepare-xwindow-id" ) && mnWindowID != 0 ) +#else + if (gst_message_has_name (message, "prepare-window-handle") && mnWindowID != 0 ) +#endif { + DBG( "%p processSyncMessage has handle: %s", this, GST_MESSAGE_TYPE_NAME( message ) ); if( mpXOverlay ) g_object_unref( G_OBJECT ( mpXOverlay ) ); mpXOverlay = GST_VIDEO_OVERLAY( GST_MESSAGE_SRC( message ) ); @@ -208,7 +226,8 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message ) gst_message_parse_state_changed (message, NULL, &newstate, &pendingstate); - DBG( "%p state change received, new state %d", this, newstate ); + DBG( "%p state change received, new state %d pending %d", this, + (int)newstate, (int)pendingstate ); if( newstate == GST_STATE_PAUSED && pendingstate == GST_STATE_VOID_PENDING ) { @@ -280,7 +299,7 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message ) mnWidth = w; mnHeight = h; - DBG( "queried size: %d x %d", mnWidth, mnHeight ); + fprintf (stderr, "queried size: %d x %d", mnWidth, mnHeight ); maSizeCondition.set(); } @@ -289,6 +308,7 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message ) } #endif } else if( GST_MESSAGE_TYPE( message ) == GST_MESSAGE_ERROR ) { + fprintf (stderr, "Error !\n"); if( mnWidth == 0 ) { // an error occurred, set condition so that OOo thread doesn't wait for us maSizeCondition.set(); @@ -353,7 +373,7 @@ bool Player::create( const ::rtl::OUString& rURL ) // ------------------------------------------------------------------------------ -void SAL_CALL Player::start( ) +void SAL_CALL Player::start() throw (uno::RuntimeException) { // set the pipeline state to READY and run the loop @@ -366,7 +386,7 @@ void SAL_CALL Player::start( ) // ------------------------------------------------------------------------------ -void SAL_CALL Player::stop( ) +void SAL_CALL Player::stop() throw (uno::RuntimeException) { // set the pipeline in PAUSED STATE @@ -397,7 +417,7 @@ sal_Bool SAL_CALL Player::isPlaying() // ------------------------------------------------------------------------------ -double SAL_CALL Player::getDuration( ) +double SAL_CALL Player::getDuration() throw (uno::RuntimeException) { // slideshow checks for non-zero duration, so cheat here @@ -432,14 +452,13 @@ void SAL_CALL Player::setMediaTime( double fTime ) // ------------------------------------------------------------------------------ -double SAL_CALL Player::getMediaTime( ) +double SAL_CALL Player::getMediaTime() throw (uno::RuntimeException) { double position = 0.0; if( mpPlaybin ) { // get current position in the stream - GstFormat format = GST_FORMAT_TIME; gint64 gst_position; if( wrap_element_query_position( mpPlaybin, GST_FORMAT_TIME, &gst_position ) ) position = gst_position / 1E9; @@ -450,7 +469,7 @@ double SAL_CALL Player::getMediaTime( ) // ------------------------------------------------------------------------------ -double SAL_CALL Player::getRate( ) +double SAL_CALL Player::getRate() throw (uno::RuntimeException) { double rate = 0.0; @@ -475,7 +494,7 @@ void SAL_CALL Player::setPlaybackLoop( sal_Bool bSet ) // ------------------------------------------------------------------------------ -sal_Bool SAL_CALL Player::isPlaybackLoop( ) +sal_Bool SAL_CALL Player::isPlaybackLoop() throw (uno::RuntimeException) { // TODO check how to do with GST @@ -506,7 +525,7 @@ void SAL_CALL Player::setMute( sal_Bool bSet ) // ------------------------------------------------------------------------------ -sal_Bool SAL_CALL Player::isMute( ) +sal_Bool SAL_CALL Player::isMute() throw (uno::RuntimeException) { return mbMuted; @@ -530,7 +549,7 @@ void SAL_CALL Player::setVolumeDB( sal_Int16 nVolumeDB ) // ------------------------------------------------------------------------------ -sal_Int16 SAL_CALL Player::getVolumeDB( ) +sal_Int16 SAL_CALL Player::getVolumeDB() throw (uno::RuntimeException) { sal_Int16 nVolumeDB(0); @@ -548,7 +567,7 @@ sal_Int16 SAL_CALL Player::getVolumeDB( ) // ------------------------------------------------------------------------------ -awt::Size SAL_CALL Player::getPreferredPlayerWindowSize( ) +awt::Size SAL_CALL Player::getPreferredPlayerWindowSize() throw (uno::RuntimeException) { awt::Size aSize( 0, 0 ); @@ -556,7 +575,7 @@ awt::Size SAL_CALL Player::getPreferredPlayerWindowSize( ) DBG( "%p Player::getPreferredPlayerWindowSize, member %d x %d", this, mnWidth, mnHeight ); TimeValue aTimeout = { 10, 0 }; -#if OSL_DEBUG_LEVEL > 2 +#if 1 // OSL_DEBUG_LEVEL > 2 osl::Condition::Result aResult = #endif maSizeCondition.wait( &aTimeout ); @@ -612,7 +631,7 @@ uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( co // ------------------------------------------------------------------------------ -uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber( ) +uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber() throw (uno::RuntimeException) { uno::Reference< media::XFrameGrabber > xRet; @@ -622,7 +641,7 @@ uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber( ) // ------------------------------------------------------------------------------ -::rtl::OUString SAL_CALL Player::getImplementationName( ) +::rtl::OUString SAL_CALL Player::getImplementationName() throw (uno::RuntimeException) { return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_GST_PLAYER_IMPLEMENTATIONNAME ) ); @@ -638,7 +657,7 @@ sal_Bool SAL_CALL Player::supportsService( const ::rtl::OUString& ServiceName ) // ------------------------------------------------------------------------------ -uno::Sequence< ::rtl::OUString > SAL_CALL Player::getSupportedServiceNames( ) +uno::Sequence< ::rtl::OUString > SAL_CALL Player::getSupportedServiceNames() throw (uno::RuntimeException) { uno::Sequence< ::rtl::OUString > aRet(1); diff --git a/avmedia/source/gstreamer/gstplayer.hxx b/avmedia/source/gstreamer/gstplayer.hxx index aa6c020e9f3a..c6f46359ef43 100644 --- a/avmedia/source/gstreamer/gstplayer.hxx +++ b/avmedia/source/gstreamer/gstplayer.hxx @@ -34,7 +34,7 @@ #include "com/sun/star/media/XPlayer.hpp" -typedef struct _GstXOverlay GstXOverlay; +typedef struct _GstVideoOverlay GstVideoOverlay; namespace avmedia { namespace gstreamer { @@ -95,7 +95,7 @@ private: sal_Bool mbInitialized; long mnWindowID; - GstXOverlay* mpXOverlay; + GstVideoOverlay* mpXOverlay; gint64 mnDuration; int mnWidth; int mnHeight; diff --git a/avmedia/source/gstreamer/gstuno.cxx b/avmedia/source/gstreamer/gstuno.cxx index 80953536a6e4..affb8eb20fce 100644 --- a/avmedia/source/gstreamer/gstuno.cxx +++ b/avmedia/source/gstreamer/gstuno.cxx @@ -26,6 +26,7 @@ * ************************************************************************/ +#include "mediamisc.hxx" #include "gstmanager.hxx" using namespace ::com::sun::star; @@ -34,6 +35,14 @@ using namespace ::com::sun::star; // - factory methods - // ------------------- +#ifdef AVMEDIA_GST_0_10 +# define IMPL_NAME "com.sun.star.comp.media.Manager_GStreamer_0_10" +# define SERVICE_NAME AVMEDIA_MANAGER_SERVICE_NAME_OLD // "com.sun.star.comp.avmedia.Manager_GStreamer_0_10" +#else +# define IMPL_NAME "com.sun.star.comp.media.Manager_GStreamer" +# define SERVICE_NAME AVMEDIA_MANAGER_SERVICE_NAME // "com.sun.star.comp.avmedia.Manager_GStreamer" +#endif + static uno::Reference< uno::XInterface > SAL_CALL create_MediaPlayer( const uno::Reference< lang::XMultiServiceFactory >& rxFact ) { return uno::Reference< uno::XInterface >( *new ::avmedia::gstreamer::Manager( rxFact ) ); @@ -44,14 +53,12 @@ extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( const sal_C uno::Reference< lang::XSingleServiceFactory > xFactory; void* pRet = 0; - if( rtl_str_compare( pImplName, "com.sun.star.comp.media.Manager_GStreamer" ) == 0 ) + if( rtl_str_compare( pImplName, IMPL_NAME ) == 0 ) { - const ::rtl::OUString aServiceName( ::rtl::OUString("com.sun.star.media.Manager_GStreamer" ) ); - + const ::rtl::OUString aServiceName( SERVICE_NAME ); xFactory = uno::Reference< lang::XSingleServiceFactory >( ::cppu::createSingleFactory( reinterpret_cast< lang::XMultiServiceFactory* >( pServiceManager ), - ::rtl::OUString("com.sun.star.comp.media.Manager_GStreamer" ), - create_MediaPlayer, uno::Sequence< ::rtl::OUString >( &aServiceName, 1 ) ) ); + IMPL_NAME, create_MediaPlayer, uno::Sequence< ::rtl::OUString >( &aServiceName, 1 ) ) ); } if( xFactory.is() ) diff --git a/avmedia/source/inc/mediamisc.hxx b/avmedia/source/inc/mediamisc.hxx index 8f129bb89122..f0426296074e 100644 --- a/avmedia/source/inc/mediamisc.hxx +++ b/avmedia/source/inc/mediamisc.hxx @@ -30,23 +30,14 @@ class ResMgr; #define AVMEDIA_RESID( nId ) ResId( nId, * ::avmedia::GetResMgr() ) -#ifdef GSTREAMER -#define AVMEDIA_MANAGER_SERVICE_NAME "com.sun.star.comp.avmedia.Manager_GStreamer" -#else #ifdef WNT - #define AVMEDIA_MANAGER_SERVICE_NAME "com.sun.star.comp.avmedia.Manager_DirectX" - #else #ifdef QUARTZ - #define AVMEDIA_MANAGER_SERVICE_NAME "com.sun.star.comp.avmedia.Manager_QuickTime" - #else - +#define AVMEDIA_MANAGER_SERVICE_NAME_OLD "com.sun.star.comp.avmedia.Manager_GStreamer_0_10" #define AVMEDIA_MANAGER_SERVICE_NAME "com.sun.star.comp.avmedia.Manager_GStreamer" - -#endif #endif #endif diff --git a/avmedia/source/viewer/mediawindowbase_impl.cxx b/avmedia/source/viewer/mediawindowbase_impl.cxx index e7d4534f34cf..bc81869a86fe 100644 --- a/avmedia/source/viewer/mediawindowbase_impl.cxx +++ b/avmedia/source/viewer/mediawindowbase_impl.cxx @@ -70,10 +70,25 @@ uno::Reference< media::XPlayer > MediaWindowBaseImpl::createPlayer( const ::rtl: { try { + uno::Reference< ::com::sun::star::media::XManager > xManager; - uno::Reference< ::com::sun::star::media::XManager > xManager( - xFactory->createInstance( ::rtl::OUString( AVMEDIA_MANAGER_SERVICE_NAME ) ), - uno::UNO_QUERY ); + try { + xManager = uno::Reference< ::com::sun::star::media::XManager >( + xFactory->createInstance( AVMEDIA_MANAGER_SERVICE_NAME ), + uno::UNO_QUERY ); + } catch ( const uno::Exception &e ) { + } + +// a fallback path just for gstreamer which has +// two significant versions deployed at once ... +#ifdef AVMEDIA_MANAGER_SERVICE_NAME_OLD + if( !xManager.is() ) + { + xManager = uno::Reference< ::com::sun::star::media::XManager >( + xFactory->createInstance( AVMEDIA_MANAGER_SERVICE_NAME_OLD ), + uno::UNO_QUERY ); + } +#endif if( xManager.is() ) { |