Kaydet (Commit) 79bed99d authored tarafından Minh Ngo's avatar Minh Ngo

Refactoring vlc module

Change-Id: If5454d2ce70eee40cf42205a5dcbcfef93f0abe8
üst 6b1b5b7c
...@@ -24,7 +24,7 @@ const ::rtl::OUString AVMEDIA_VLC_GRABBER_IMPLEMENTATIONNAME = "com.sun.star.com ...@@ -24,7 +24,7 @@ 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 ::rtl::OUString AVMEDIA_VLC_GRABBER_SERVICENAME = "com.sun.star.media.VLCFrameGrabber_VLC";
const int MSEC_IN_SEC = 1000; const int MSEC_IN_SEC = 1000;
VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh, const rtl::OUString& url ) VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, VLC::EventHandler& eh, const rtl::OUString& url )
: FrameGrabber_BASE() : FrameGrabber_BASE()
, mPlayer( player ) , mPlayer( player )
, mUrl( url ) , mUrl( url )
...@@ -45,7 +45,8 @@ VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, boost::shared_ptr<VLC::Ev ...@@ -45,7 +45,8 @@ VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, boost::shared_ptr<VLC::Ev
if ( !mPlayer.play() ) if ( !mPlayer.play() )
{ {
std::cerr << "Couldn't play" << std::endl; std::cerr << "Couldn't play when trying to grab frame" << std::endl;
return ::uno::Reference< css::graphic::XGraphic >();
} }
mPlayer.setTime( ( fMediaTime > 0 ? fMediaTime : 0 ) * MSEC_IN_SEC ); mPlayer.setTime( ( fMediaTime > 0 ? fMediaTime : 0 ) * MSEC_IN_SEC );
...@@ -63,7 +64,8 @@ VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, boost::shared_ptr<VLC::Ev ...@@ -63,7 +64,8 @@ VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, boost::shared_ptr<VLC::Ev
return ::uno::Reference< css::graphic::XGraphic >(); return ::uno::Reference< css::graphic::XGraphic >();
} }
mPlayer.takeSnapshot( fileName ); std::cout << "Take snapshot " << fileName << std::endl;
std::cout << mPlayer.takeSnapshot( fileName ) << std::endl;
mPlayer.setMute( false ); mPlayer.setMute( false );
mPlayer.stop(); mPlayer.stop();
......
...@@ -41,9 +41,9 @@ class VLCFrameGrabber : public FrameGrabber_BASE ...@@ -41,9 +41,9 @@ class VLCFrameGrabber : public FrameGrabber_BASE
{ {
VLC::Player& mPlayer; VLC::Player& mPlayer;
const rtl::OUString& mUrl; const rtl::OUString& mUrl;
boost::shared_ptr<VLC::EventHandler> mEventHandler; VLC::EventHandler& mEventHandler;
public: public:
VLCFrameGrabber( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh, const rtl::OUString& url ); VLCFrameGrabber( VLC::Player& player, VLC::EventHandler& eh, const rtl::OUString& url );
::com::sun::star::uno::Reference< css::graphic::XGraphic > SAL_CALL grabFrame( double fMediaTime ) throw ( ::com::sun::star::uno::RuntimeException ); ::com::sun::star::uno::Reference< css::graphic::XGraphic > SAL_CALL grabFrame( double fMediaTime ) throw ( ::com::sun::star::uno::RuntimeException );
......
...@@ -13,20 +13,32 @@ using namespace ::com::sun::star; ...@@ -13,20 +13,32 @@ using namespace ::com::sun::star;
namespace avmedia { namespace avmedia {
namespace vlc { namespace vlc {
const rtl::OUString VLC_IMPLEMENTATION_NAME = "com.sun.star.comp.avmedia.Manager_VLC"; namespace
const ::rtl::OUString VLC_SERVICENAME = "com.sun.star.media.Manager_VLC"; {
const rtl::OUString VLC_IMPLEMENTATION_NAME = "com.sun.star.comp.avmedia.Manager_VLC";
const ::rtl::OUString VLC_SERVICENAME = "com.sun.star.media.Manager_VLC";
const char * const VLC_ARGS[] = {
"-Vdummy",
"--snapshot-format=png",
"--ffmpeg-threads",
"--verbose=-1"
};
}
Manager::Manager( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) Manager::Manager( const uno::Reference< lang::XMultiServiceFactory >& rxMgr )
: mEventHandler(new VLC::EventHandler( "EventHandler" ) ) : mEventHandler()
, mxMgr( rxMgr ) , mxMgr( rxMgr )
{ {
using namespace VLC; using namespace VLC;
static bool success = Instance::LoadSymbols() && EventManager::LoadSymbols() static bool success = Instance::LoadSymbols() && EventManager::LoadSymbols()
&& Media::LoadSymbols() && Player::LoadSymbols() && Common::LoadSymbols(); && Media::LoadSymbols() && Player::LoadSymbols()
&& Common::LoadSymbols();
m_is_vlc_found = success; m_is_vlc_found = success;
if (m_is_vlc_found) if (m_is_vlc_found)
{ {
mInstance.reset(new Instance( sizeof( VLC_ARGS ) / sizeof( VLC_ARGS[0] ), VLC_ARGS ));
//Check VLC version //Check VLC version
std::vector<std::string> verComponents; std::vector<std::string> verComponents;
const std::string str(Common::Version()); const std::string str(Common::Version());
...@@ -37,20 +49,20 @@ Manager::Manager( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) ...@@ -37,20 +49,20 @@ Manager::Manager( const uno::Reference< lang::XMultiServiceFactory >& rxMgr )
boost::is_any_of(". ")); boost::is_any_of(". "));
if (verComponents.size() < 3 if (verComponents.size() < 3
|| boost::lexical_cast<int>(verComponents[0]) < 2 || boost::lexical_cast<int>(verComponents[0]) < 2
|| (boost::lexical_cast<int>(verComponents[1]) == 0 && boost::lexical_cast<int>(verComponents[2]) < 8)) || (boost::lexical_cast<int>(verComponents[1]) == 0
&& boost::lexical_cast<int>(verComponents[2]) < 8))
{ {
m_is_vlc_found = false; m_is_vlc_found = false;
} }
} }
std::cout << "T" << std::endl; if (m_is_vlc_found)
//if (m_is_vlc_found) mEventHandler.create();
// mEventHandler->launch();
std::cout << "T" << std::endl;
} }
Manager::~Manager() Manager::~Manager()
{ {
mEventHandler.stop();
} }
uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const rtl::OUString& rURL ) uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const rtl::OUString& rURL )
...@@ -59,12 +71,10 @@ uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const rtl::OUSt ...@@ -59,12 +71,10 @@ uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const rtl::OUSt
if ( !m_is_vlc_found ) if ( !m_is_vlc_found )
return uno::Reference< media::XPlayer >(); return uno::Reference< media::XPlayer >();
if ( !rURL.isEmpty() || (mPlayer.is() && dynamic_cast<VLCPlayer*>( mPlayer.get() )->url() != rURL)) VLCPlayer* pPlayer( new VLCPlayer( rURL,
{ *mInstance,
VLCPlayer* pPlayer( new VLCPlayer( rURL, mEventHandler /*, mxMgr */ ) ); mEventHandler /*, mxMgr */ ) );
mPlayer = uno::Reference< media::XPlayer >( pPlayer ); mPlayer = uno::Reference< media::XPlayer >( pPlayer );
}
std::cout << "A" << std::endl;
return mPlayer; return mPlayer;
} }
......
...@@ -19,11 +19,10 @@ ...@@ -19,11 +19,10 @@
#ifndef _VLCMANAGER_HXX #ifndef _VLCMANAGER_HXX
#define _VLCMANAGER_HXX #define _VLCMANAGER_HXX
#include <boost/shared_ptr.hpp> #include <boost/scoped_ptr.hpp>
#include <com/sun/star/media/XManager.hpp>
#include "vlccommon.hxx" #include "vlccommon.hxx"
#include "wrapper/Wrapper.hxx"
#include "com/sun/star/media/XManager.hpp"
#include "wrapper/EventHandler.hxx"
namespace avmedia { namespace avmedia {
namespace vlc { namespace vlc {
...@@ -31,7 +30,8 @@ namespace vlc { ...@@ -31,7 +30,8 @@ namespace vlc {
class Manager : public ::cppu::WeakImplHelper2 < ::com::sun::star::media::XManager, class Manager : public ::cppu::WeakImplHelper2 < ::com::sun::star::media::XManager,
::com::sun::star::lang::XServiceInfo > ::com::sun::star::lang::XServiceInfo >
{ {
boost::shared_ptr<VLC::EventHandler> mEventHandler; boost::scoped_ptr<VLC::Instance> mInstance;
VLC::EventHandler mEventHandler;
public: public:
Manager( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxMgr ); Manager( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxMgr );
~Manager(); ~Manager();
......
#include <iostream>
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <vcl/syschild.hxx> #include <vcl/syschild.hxx>
#include <vcl/sysdata.hxx> #include <vcl/sysdata.hxx>
...@@ -18,34 +19,24 @@ namespace ...@@ -18,34 +19,24 @@ namespace
const ::rtl::OUString AVMEDIA_VLC_PLAYER_SERVICENAME = "com.sun.star.media.Player_VLC"; const ::rtl::OUString AVMEDIA_VLC_PLAYER_SERVICENAME = "com.sun.star.media.Player_VLC";
const int MS_IN_SEC = 1000; // Millisec in sec const int MS_IN_SEC = 1000; // Millisec in sec
const char * const VLC_ARGS[] = {
"-Vdummy",
"--snapshot-format=png",
"--ffmpeg-threads",
"--verbose=2"
};
} }
VLCPlayer::VLCPlayer( const rtl::OUString& iurl, boost::shared_ptr<VLC::EventHandler> eh ) VLCPlayer::VLCPlayer( const rtl::OUString& url,
: VLC_Base(m_aMutex) VLC::Instance& instance,
VLC::EventHandler& eh )
: VLC_Base( m_aMutex )
, mInstance( instance )
, mEventHandler( eh ) , mEventHandler( eh )
, mInstance( sizeof( VLC_ARGS ) / sizeof( VLC_ARGS[0] ), VLC_ARGS ) , mMedia( url, mInstance )
, mMedia( iurl, mInstance )
, mPlayer( mMedia ) , mPlayer( mMedia )
, mEventManager( mPlayer, mEventHandler ) , mEventManager( mPlayer, mEventHandler )
, mUrl( iurl ) , mUrl( url )
, mPlaybackLoop( false ) , mPlaybackLoop( false )
{ {
mPlayer.setMouseHandling(false); mPlayer.setMouseHandling( false );
}
const rtl::OUString& VLCPlayer::url() const
{
return mUrl;
} }
void SAL_CALL VLCPlayer::start() throw (::com::sun::star::uno::RuntimeException) void SAL_CALL VLCPlayer::start() throw ( ::com::sun::star::uno::RuntimeException )
{ {
::osl::MutexGuard aGuard(m_aMutex); ::osl::MutexGuard aGuard(m_aMutex);
mPlayer.play(); mPlayer.play();
......
...@@ -42,17 +42,18 @@ typedef ::cppu::WeakComponentImplHelper2< ::com::sun::star::media::XPlayer, ...@@ -42,17 +42,18 @@ typedef ::cppu::WeakComponentImplHelper2< ::com::sun::star::media::XPlayer,
class VLCPlayer : public ::cppu::BaseMutex, class VLCPlayer : public ::cppu::BaseMutex,
public VLC_Base public VLC_Base
{ {
boost::shared_ptr<VLC::EventHandler> mEventHandler; VLC::Instance& mInstance;
VLC::Instance mInstance; VLC::EventHandler& mEventHandler;
VLC::Media mMedia; VLC::Media mMedia;
VLC::Player mPlayer; VLC::Player mPlayer;
VLC::EventManager mEventManager; VLC::EventManager mEventManager;
const rtl::OUString mUrl; const rtl::OUString mUrl;
bool mPlaybackLoop; bool mPlaybackLoop;
public: public:
VLCPlayer( const rtl::OUString& iurl, boost::shared_ptr<VLC::EventHandler> eh ); VLCPlayer( const rtl::OUString& url,
VLC::Instance& instance,
const rtl::OUString& url() const; VLC::EventHandler& eh );
void SAL_CALL start() throw ( ::com::sun::star::uno::RuntimeException ); void SAL_CALL start() throw ( ::com::sun::star::uno::RuntimeException );
void SAL_CALL stop() throw ( ::com::sun::star::uno::RuntimeException ); void SAL_CALL stop() throw ( ::com::sun::star::uno::RuntimeException );
...@@ -70,11 +71,15 @@ public: ...@@ -70,11 +71,15 @@ public:
css::awt::Size SAL_CALL getPreferredPlayerWindowSize() throw ( ::com::sun::star::uno::RuntimeException ); css::awt::Size SAL_CALL getPreferredPlayerWindowSize() throw ( ::com::sun::star::uno::RuntimeException );
::com::sun::star::uno::Reference< css::media::XPlayerWindow > SAL_CALL createPlayerWindow( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) ::com::sun::star::uno::Reference< css::media::XPlayerWindow > SAL_CALL createPlayerWindow( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments )
throw ( ::com::sun::star::uno::RuntimeException ); throw ( ::com::sun::star::uno::RuntimeException );
::com::sun::star::uno::Reference< css::media::XFrameGrabber > SAL_CALL createFrameGrabber() throw ( ::com::sun::star::uno::RuntimeException ); ::com::sun::star::uno::Reference< css::media::XFrameGrabber > SAL_CALL createFrameGrabber()
throw ( ::com::sun::star::uno::RuntimeException );
::rtl::OUString SAL_CALL getImplementationName() throw ( ::com::sun::star::uno::RuntimeException );; ::rtl::OUString SAL_CALL getImplementationName()
::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& serviceName ) throw ( ::com::sun::star::uno::RuntimeException );; throw ( ::com::sun::star::uno::RuntimeException );
::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw ( ::com::sun::star::uno::RuntimeException );; ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& serviceName )
throw ( ::com::sun::star::uno::RuntimeException );;
::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
throw ( ::com::sun::star::uno::RuntimeException );;
private: private:
void replay(); void replay();
......
...@@ -30,13 +30,14 @@ namespace VLC ...@@ -30,13 +30,14 @@ namespace VLC
void EventManager::Handler( const libvlc_event_t *event, void *pData ) void EventManager::Handler( const libvlc_event_t *event, void *pData )
{ {
EventManager *instance = static_cast<EventManager*>( pData ); EventManager *instance = static_cast<EventManager*>( pData );
std::cout << "HANDLER" << std::endl;
switch ( event->type ) switch ( event->type )
{ {
case libvlc_MediaPlayerPaused: case libvlc_MediaPlayerPaused:
instance->mEventHandler->mCallbackQueue.push( instance->mOnPaused ); instance->mEventHandler.mCallbackQueue.push( instance->mOnPaused );
break; break;
case libvlc_MediaPlayerEndReached: case libvlc_MediaPlayerEndReached:
instance->mEventHandler->mCallbackQueue.push( instance->mOnEndReached ); instance->mEventHandler.mCallbackQueue.push( instance->mOnEndReached );
break; break;
} }
} }
...@@ -53,17 +54,13 @@ bool EventManager::LoadSymbols() ...@@ -53,17 +54,13 @@ bool EventManager::LoadSymbols()
return InitApiMap( VLC_EVENT_MANAGER_API ); return InitApiMap( VLC_EVENT_MANAGER_API );
} }
EventManager::EventManager( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh ) EventManager::EventManager( VLC::Player& player, VLC::EventHandler& eh )
: mEventHandler( eh ) : mEventHandler( eh )
, mManager( libvlc_media_player_event_manager( player ) ) , mManager( libvlc_media_player_event_manager( player ) )
{ {
} }
EventManager::~EventManager()
{
}
void EventManager::registerSignal( int signal, const Callback& callback ) void EventManager::registerSignal( int signal, const Callback& callback )
{ {
if ( callback.empty() ) if ( callback.empty() )
......
...@@ -28,14 +28,13 @@ namespace VLC ...@@ -28,14 +28,13 @@ namespace VLC
static bool LoadSymbols(); static bool LoadSymbols();
typedef boost::function<void()> Callback; typedef boost::function<void()> Callback;
EventManager( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh ); EventManager( VLC::Player& player, VLC::EventHandler& eh );
virtual ~EventManager();
void onPaused( const Callback& callback = Callback() ); void onPaused( const Callback& callback = Callback() );
void onEndReached( const Callback& callback = Callback() ); void onEndReached( const Callback& callback = Callback() );
private: private:
boost::shared_ptr<VLC::EventHandler> mEventHandler; VLC::EventHandler& mEventHandler;
typedef boost::function< void() > TCallback; typedef boost::function< void() > TCallback;
libvlc_event_manager_t *mManager; libvlc_event_manager_t *mManager;
TCallback mOnPaused; TCallback mOnPaused;
......
...@@ -115,7 +115,7 @@ namespace VLC ...@@ -115,7 +115,7 @@ namespace VLC
bool Player::play() bool Player::play()
{ {
return libvlc_media_player_play( mPlayer ); return libvlc_media_player_play( mPlayer ) == 0;
} }
void Player::pause() void Player::pause()
...@@ -190,11 +190,11 @@ namespace VLC ...@@ -190,11 +190,11 @@ namespace VLC
#endif #endif
} }
void Player::takeSnapshot(const rtl::OUString& file) bool Player::takeSnapshot(const rtl::OUString& file)
{ {
rtl::OString dest; rtl::OString dest;
file.convertToString( &dest, RTL_TEXTENCODING_UTF8, 0 ); file.convertToString( &dest, RTL_TEXTENCODING_UTF8, 0 );
libvlc_video_take_snapshot( mPlayer, 0, dest.getStr(), 0, 0 ); return libvlc_video_take_snapshot( mPlayer, 0, dest.getStr(), 480, 360 ) == 0;
} }
bool Player::hasVout() const bool Player::hasVout() const
......
...@@ -51,7 +51,7 @@ namespace VLC ...@@ -51,7 +51,7 @@ namespace VLC
void setWindow( intptr_t id ); void setWindow( intptr_t id );
void takeSnapshot(const rtl::OUString& file); bool takeSnapshot(const rtl::OUString& file);
bool hasVout() const; bool hasVout() const;
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include "Common.hxx"
#include "EventHandler.hxx"
#include "EventManager.hxx"
#include "Instance.hxx"
#include "Media.hxx"
#include "Player.hxx"
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment