summaryrefslogtreecommitdiff
path: root/avmedia
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@suse.com>2012-07-30 15:15:58 +0200
committerMichael Meeks <michael.meeks@suse.com>2012-08-09 20:46:16 +0100
commit21d7f4b4bba79558de830d9e815e127f67274355 (patch)
treef0c4e2ab7f96fdcf1ce9393477b773eb64cdd01b /avmedia
parent95938a123cbc8c0741a505b61ca874c0153c3f7a (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.mk8
-rw-r--r--avmedia/Module_avmedia.mk6
-rw-r--r--avmedia/source/gstreamer/avmediagstreamer_0_10.component6
-rw-r--r--avmedia/source/gstreamer/gst_0_10.cxx15
-rw-r--r--avmedia/source/gstreamer/gstplayer.cxx69
-rw-r--r--avmedia/source/gstreamer/gstplayer.hxx4
-rw-r--r--avmedia/source/gstreamer/gstuno.cxx17
-rw-r--r--avmedia/source/inc/mediamisc.hxx11
-rw-r--r--avmedia/source/viewer/mediawindowbase_impl.cxx21
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() )
{