summaryrefslogtreecommitdiff
path: root/avmedia
diff options
context:
space:
mode:
authorMinh Ngo <nlminhtl@gmail.com>2013-08-19 00:50:58 +0300
committerMichael Meeks <michael.meeks@suse.com>2013-08-21 10:54:53 +0100
commit46575e931479a4e967f2ad6a056b5f4d5490146c (patch)
tree75a7a42b919fe40eed7d862deb770ba45c01dd38 /avmedia
parentc40a63642c402d8e6f52fcc3994ff5e8cf8ee50b (diff)
Playback loop
Change-Id: I1262f16e60f928481626ef952d929cc931335233
Diffstat (limited to 'avmedia')
-rw-r--r--avmedia/source/vlc/vlcframegrabber.cxx52
-rw-r--r--avmedia/source/vlc/vlcframegrabber.hxx4
-rw-r--r--avmedia/source/vlc/vlcmanager.cxx6
-rw-r--r--avmedia/source/vlc/vlcmanager.hxx4
-rw-r--r--avmedia/source/vlc/vlcplayer.cxx16
-rw-r--r--avmedia/source/vlc/vlcplayer.hxx3
-rw-r--r--avmedia/source/vlc/wrapper/EventManager.cxx23
-rw-r--r--avmedia/source/vlc/wrapper/EventManager.hxx18
-rw-r--r--avmedia/source/vlc/wrapper/Player.cxx2
-rw-r--r--avmedia/source/vlc/wrapper/Player.hxx1
10 files changed, 74 insertions, 55 deletions
diff --git a/avmedia/source/vlc/vlcframegrabber.cxx b/avmedia/source/vlc/vlcframegrabber.cxx
index 4ca6addefd72..adc59b71df3b 100644
--- a/avmedia/source/vlc/vlcframegrabber.cxx
+++ b/avmedia/source/vlc/vlcframegrabber.cxx
@@ -23,10 +23,11 @@ const ::rtl::OUString AVMEDIA_VLC_GRABBER_IMPLEMENTATIONNAME = "com.sun.star.com
const ::rtl::OUString AVMEDIA_VLC_GRABBER_SERVICENAME = "com.sun.star.media.VLCFrameGrabber_VLC";
const int MSEC_IN_SEC = 1000;
-SAL_CALL VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, const rtl::OUString& url )
+SAL_CALL VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh, const rtl::OUString& url )
: FrameGrabber_BASE()
, mPlayer( player )
, mUrl( url )
+ , mEventHandler( eh )
{
}
@@ -34,39 +35,42 @@ SAL_CALL VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, const rtl::OUStr
{
osl::Condition condition;
- VLC::EventManager manager( mPlayer );
- manager.onPaused(boost::bind(&osl::Condition::set, &condition));
+ const rtl::OUString& fileName = utl::TempFile::CreateTempName();
+ {
+ VLC::EventManager manager( mPlayer, mEventHandler );
+ manager.onPaused(boost::bind(&osl::Condition::set, &condition));
- mPlayer.setMute( true );
+ mPlayer.setMute( true );
- if ( !mPlayer.play() )
- {
- std::cerr << "Couldn't play" << std::endl;
- }
+ if ( !mPlayer.play() )
+ {
+ std::cerr << "Couldn't play" << std::endl;
+ }
- mPlayer.setTime( ( fMediaTime > 0 ? fMediaTime : 0 ) * MSEC_IN_SEC );
- mPlayer.pause();
+ mPlayer.setTime( ( fMediaTime > 0 ? fMediaTime : 0 ) * MSEC_IN_SEC );
+ mPlayer.pause();
- const TimeValue timeout = {2, 0};
- condition.wait(&timeout);
+ const TimeValue timeout = {2, 0};
+ condition.wait(&timeout);
- if ( mUrl.isEmpty() || !mPlayer.hasVout() )
- {
- std::cerr << "Couldn't grab frame" << std::endl;
- mPlayer.setMute( false );
+ if ( mUrl.isEmpty() || !mPlayer.hasVout() )
+ {
+ std::cerr << "Couldn't grab frame" << std::endl;
+ mPlayer.setMute( false );
+
+ manager.onPaused();
+ return ::uno::Reference< css::graphic::XGraphic >();
+ }
- manager.onPaused();
- return ::uno::Reference< css::graphic::XGraphic >();
- }
- const rtl::OUString& fileName = utl::TempFile::CreateTempName();
- mPlayer.takeSnapshot( fileName );
+ mPlayer.takeSnapshot( fileName );
- mPlayer.setMute( false );
- mPlayer.stop();
+ mPlayer.setMute( false );
+ mPlayer.stop();
- manager.onPaused();
+ manager.onPaused();
+ }
rtl::OUString url;
utl::LocalFileHelper::ConvertPhysicalNameToURL( fileName, url );
diff --git a/avmedia/source/vlc/vlcframegrabber.hxx b/avmedia/source/vlc/vlcframegrabber.hxx
index 53dce41bcea0..923b63fd50ad 100644
--- a/avmedia/source/vlc/vlcframegrabber.hxx
+++ b/avmedia/source/vlc/vlcframegrabber.hxx
@@ -28,6 +28,7 @@
namespace VLC
{
class Player;
+ class EventHandler;
}
namespace avmedia {
@@ -40,8 +41,9 @@ class VLCFrameGrabber : public FrameGrabber_BASE
{
VLC::Player& mPlayer;
const rtl::OUString& mUrl;
+ boost::shared_ptr<VLC::EventHandler> mEventHandler;
public:
- SAL_CALL VLCFrameGrabber( VLC::Player& player, const rtl::OUString& url );
+ SAL_CALL VLCFrameGrabber( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh, const rtl::OUString& url );
::com::sun::star::uno::Reference< css::graphic::XGraphic > SAL_CALL grabFrame( double fMediaTime );
diff --git a/avmedia/source/vlc/vlcmanager.cxx b/avmedia/source/vlc/vlcmanager.cxx
index a3e762bacc77..6a5431d2fedb 100644
--- a/avmedia/source/vlc/vlcmanager.cxx
+++ b/avmedia/source/vlc/vlcmanager.cxx
@@ -10,8 +10,10 @@ const rtl::OUString VLC_IMPLEMENTATION_NAME = "com.sun.star.comp.avmedia.Manager
const ::rtl::OUString VLC_SERVICENAME = "com.sun.star.media.Manager_VLC";
Manager::Manager( const uno::Reference< lang::XMultiServiceFactory >& rxMgr )
- : mxMgr( rxMgr )
+ : mEventHandler(new VLC::EventHandler( "EventHandler" ) )
+ , mxMgr( rxMgr )
{
+ mEventHandler->launch();
}
Manager::~Manager()
@@ -23,7 +25,7 @@ uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const rtl::OUSt
{
if ( !rURL.isEmpty() || (mPlayer.is() && dynamic_cast<VLCPlayer*>( mPlayer.get() )->url() != rURL))
{
- VLCPlayer* pPlayer( new VLCPlayer( rURL/*, mxMgr */ ) );
+ VLCPlayer* pPlayer( new VLCPlayer( rURL, mEventHandler /*, mxMgr */ ) );
mPlayer = uno::Reference< media::XPlayer >( pPlayer );
}
diff --git a/avmedia/source/vlc/vlcmanager.hxx b/avmedia/source/vlc/vlcmanager.hxx
index 94174802f064..dbcaed650bd8 100644
--- a/avmedia/source/vlc/vlcmanager.hxx
+++ b/avmedia/source/vlc/vlcmanager.hxx
@@ -19,10 +19,11 @@
#ifndef _VLCMANAGER_HXX
#define _VLCMANAGER_HXX
-
+#include <boost/shared_ptr.hpp>
#include "vlccommon.hxx"
#include "com/sun/star/media/XManager.hpp"
+#include "wrapper/EventHandler.hxx"
namespace avmedia {
namespace vlc {
@@ -30,6 +31,7 @@ namespace vlc {
class Manager : public ::cppu::WeakImplHelper2 < ::com::sun::star::media::XManager,
::com::sun::star::lang::XServiceInfo >
{
+ boost::shared_ptr<VLC::EventHandler> mEventHandler;
public:
Manager( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxMgr );
~Manager();
diff --git a/avmedia/source/vlc/vlcplayer.cxx b/avmedia/source/vlc/vlcplayer.cxx
index 945d7d9bc404..a0887c238bec 100644
--- a/avmedia/source/vlc/vlcplayer.cxx
+++ b/avmedia/source/vlc/vlcplayer.cxx
@@ -24,12 +24,13 @@ const char * const VLC_ARGS[] = {
const int MS_IN_SEC = 1000; // Millisec in sec
-VLCPlayer::VLCPlayer( const rtl::OUString& url )
+VLCPlayer::VLCPlayer( const rtl::OUString& url, boost::shared_ptr<VLC::EventHandler> eh )
: VLC_Base(m_aMutex)
+ , mEventHandler( eh )
, mInstance( VLC_ARGS )
, mMedia( url, mInstance )
, mPlayer( mMedia )
- , mEventManager( mPlayer )
+ , mEventManager( mPlayer, mEventHandler )
, mUrl( url )
, mPlaybackLoop( false )
{
@@ -91,8 +92,10 @@ double SAL_CALL VLCPlayer::getRate()
void VLCPlayer::replay()
{
- mPlayer.stop();
- mPlayer.play();
+ setPlaybackLoop( false );
+ stop();
+ setMediaTime( 0 );
+ start();
}
void SAL_CALL VLCPlayer::setPlaybackLoop( ::sal_Bool bSet )
@@ -100,9 +103,6 @@ void SAL_CALL VLCPlayer::setPlaybackLoop( ::sal_Bool bSet )
::osl::MutexGuard aGuard(m_aMutex);
mPlaybackLoop = bSet;
- //TODO: Fix it
- return;
-
if ( bSet )
mEventManager.onEndReached(boost::bind(&VLCPlayer::replay, this));
else
@@ -190,7 +190,7 @@ uno::Reference< css::media::XPlayerWindow > SAL_CALL VLCPlayer::createPlayerWind
uno::Reference< css::media::XFrameGrabber > SAL_CALL VLCPlayer::createFrameGrabber()
{
::osl::MutexGuard aGuard(m_aMutex);
- VLCFrameGrabber *frameGrabber = new VLCFrameGrabber( mPlayer, mUrl );
+ VLCFrameGrabber *frameGrabber = new VLCFrameGrabber( mPlayer, mEventHandler, mUrl );
return uno::Reference< css::media::XFrameGrabber >( frameGrabber );
}
diff --git a/avmedia/source/vlc/vlcplayer.hxx b/avmedia/source/vlc/vlcplayer.hxx
index 3723f16c3e9b..18e4e6f6d5cb 100644
--- a/avmedia/source/vlc/vlcplayer.hxx
+++ b/avmedia/source/vlc/vlcplayer.hxx
@@ -41,6 +41,7 @@ typedef ::cppu::WeakComponentImplHelper2< ::com::sun::star::media::XPlayer,
class VLCPlayer : public ::cppu::BaseMutex,
public VLC_Base
{
+ boost::shared_ptr<VLC::EventHandler> mEventHandler;
VLC::Instance mInstance;
VLC::Media mMedia;
VLC::Player mPlayer;
@@ -48,7 +49,7 @@ class VLCPlayer : public ::cppu::BaseMutex,
const rtl::OUString mUrl;
bool mPlaybackLoop;
public:
- VLCPlayer( const rtl::OUString& url );
+ VLCPlayer( const rtl::OUString& url, boost::shared_ptr<VLC::EventHandler> eh );
const rtl::OUString& url() const;
diff --git a/avmedia/source/vlc/wrapper/EventManager.cxx b/avmedia/source/vlc/wrapper/EventManager.cxx
index bafd4a99fd16..96e86b68bd3c 100644
--- a/avmedia/source/vlc/wrapper/EventManager.cxx
+++ b/avmedia/source/vlc/wrapper/EventManager.cxx
@@ -1,9 +1,11 @@
+#include <boost/thread.hpp>
#include <vlc/libvlc.h>
#include <vlc/libvlc_media.h>
#include <vlc/libvlc_events.h>
#include "EventManager.hxx"
#include "SymbolLoader.hxx"
+#include "EventHandler.hxx"
typedef void ( *libvlc_callback_t ) ( const struct libvlc_event_t *, void * );
@@ -35,15 +37,16 @@ void EventManagerEventHandler( const libvlc_event_t *event, void *pData )
switch ( event->type )
{
case libvlc_MediaPlayerPaused:
- instance->mOnPaused();
+ instance->mEventHandler->mCallbackQueue.push( instance->mOnPaused );
break;
case libvlc_MediaPlayerEndReached:
- instance->mOnEndReached();
+ instance->mEventHandler->mCallbackQueue.push( instance->mOnEndReached );
break;
}
}
-EventManager::EventManager(VLC::Player& player)
+EventManager::EventManager( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh )
+ : mEventHandler( eh )
{
InitApiMap( VLC_EVENT_MANAGER_API );
mManager = libvlc_media_player_event_manager( player );
@@ -53,24 +56,26 @@ EventManager::~EventManager()
{
}
-void EventManager::registerSignal(int signal, const Callback& callback)
+void EventManager::registerSignal( int signal, const Callback& callback )
{
- if (callback.empty())
+ if ( callback.empty() )
libvlc_event_detach( mManager, signal, EventManagerEventHandler, this );
else
libvlc_event_attach( mManager, signal, EventManagerEventHandler, this );
}
-void EventManager::onPaused(const EventManager::Callback& callback)
+void EventManager::onPaused( const EventManager::Callback& callback )
{
mOnPaused = callback;
- registerSignal(libvlc_MediaPlayerPaused, callback);
+ registerSignal( libvlc_MediaPlayerPaused, callback );
}
-void EventManager::onEndReached(const Callback& callback)
+void EventManager::onEndReached( const Callback& callback )
{
mOnEndReached = callback;
- registerSignal(libvlc_MediaPlayerEndReached, callback);
+ registerSignal( libvlc_MediaPlayerEndReached, callback );
}
+
+
} \ No newline at end of file
diff --git a/avmedia/source/vlc/wrapper/EventManager.hxx b/avmedia/source/vlc/wrapper/EventManager.hxx
index 9143b5551c17..aad486d7cdee 100644
--- a/avmedia/source/vlc/wrapper/EventManager.hxx
+++ b/avmedia/source/vlc/wrapper/EventManager.hxx
@@ -19,30 +19,36 @@
#ifndef _WRAPPER_EVENT_MANAGER_HXX
#define _WRAPPER_EVENT_MANAGER_HXX
#include <boost/function.hpp>
+#include <boost/shared_ptr.hpp>
+
#include "Player.hxx"
struct libvlc_event_manager_t;
struct libvlc_event_t;
+
namespace VLC
{
+ class EventHandler;
class EventManager
{
friend void EventManagerEventHandler( const libvlc_event_t *event, void *pData );
public:
typedef boost::function<void()> Callback;
- EventManager(VLC::Player& player);
+ EventManager( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh );
virtual ~EventManager();
- void onPaused(const Callback& callback = Callback());
- void onEndReached(const Callback& callback = Callback());
+ void onPaused( const Callback& callback = Callback() );
+ void onEndReached( const Callback& callback = Callback() );
private:
+ boost::shared_ptr<VLC::EventHandler> mEventHandler;
+ typedef boost::function< void() > TCallback;
libvlc_event_manager_t *mManager;
- boost::function<void()> mOnPaused;
- boost::function<void()> mOnEndReached;
+ TCallback mOnPaused;
+ TCallback mOnEndReached;
- void registerSignal(int signal, const Callback& callback);
+ void registerSignal( int signal, const Callback& callback );
};
}
diff --git a/avmedia/source/vlc/wrapper/Player.cxx b/avmedia/source/vlc/wrapper/Player.cxx
index 37779d1a5ea0..a64b7471bab1 100644
--- a/avmedia/source/vlc/wrapper/Player.cxx
+++ b/avmedia/source/vlc/wrapper/Player.cxx
@@ -154,8 +154,6 @@ namespace VLC
{
return libvlc_media_player_has_vout( mPlayer );
}
-
-
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ \ No newline at end of file
diff --git a/avmedia/source/vlc/wrapper/Player.hxx b/avmedia/source/vlc/wrapper/Player.hxx
index 7832ad9c3676..ed52062fcba0 100644
--- a/avmedia/source/vlc/wrapper/Player.hxx
+++ b/avmedia/source/vlc/wrapper/Player.hxx
@@ -64,7 +64,6 @@ namespace VLC
}
void setMouseHandling(bool flag);
-
private:
libvlc_media_player_t *mPlayer;
};