avmedia/Library_avmediavlc.mk | 1 avmedia/source/vlc/vlcframegrabber.cxx | 72 ++++++++++++++++++++++++++++++--- avmedia/source/vlc/vlcmanager.cxx | 9 ++-- avmedia/source/vlc/vlcmanager.hxx | 1 avmedia/source/vlc/vlcplayer.cxx | 13 ++++- avmedia/source/vlc/vlcplayer.hxx | 2 6 files changed, 86 insertions(+), 12 deletions(-)
New commits: commit 74f86ac6510189000d5508f81b9f8c20c3f92fa2 Author: Minh Ngo <nlmin...@gmail.com> Date: Mon Jul 29 23:49:18 2013 +0300 Optimizing VLC player initialization process. Manager checks if an URL is the same or empty. Change-Id: I4ab2db31f73fef45feff1973fa82452dc579ef9d diff --git a/avmedia/source/vlc/vlcmanager.cxx b/avmedia/source/vlc/vlcmanager.cxx index 0b2ad6a..a3e762b 100644 --- a/avmedia/source/vlc/vlcmanager.cxx +++ b/avmedia/source/vlc/vlcmanager.cxx @@ -21,10 +21,13 @@ Manager::~Manager() uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const rtl::OUString& rURL ) throw (uno::RuntimeException) { - VLCPlayer* pPlayer( new VLCPlayer( rURL/*, mxMgr */ ) ); - uno::Reference< media::XPlayer > xRet( pPlayer ); + if ( !rURL.isEmpty() || (mPlayer.is() && dynamic_cast<VLCPlayer*>( mPlayer.get() )->url() != rURL)) + { + VLCPlayer* pPlayer( new VLCPlayer( rURL/*, mxMgr */ ) ); + mPlayer = uno::Reference< media::XPlayer >( pPlayer ); + } - return xRet; + return mPlayer; } rtl::OUString SAL_CALL Manager::getImplementationName() diff --git a/avmedia/source/vlc/vlcmanager.hxx b/avmedia/source/vlc/vlcmanager.hxx index 2e81a35..9417480 100644 --- a/avmedia/source/vlc/vlcmanager.hxx +++ b/avmedia/source/vlc/vlcmanager.hxx @@ -42,6 +42,7 @@ public: private: ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMgr; + ::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayer > mPlayer; }; } diff --git a/avmedia/source/vlc/vlcplayer.cxx b/avmedia/source/vlc/vlcplayer.cxx index 34ebb00..c4628ed 100644 --- a/avmedia/source/vlc/vlcplayer.cxx +++ b/avmedia/source/vlc/vlcplayer.cxx @@ -14,11 +14,13 @@ const ::rtl::OUString AVMEDIA_VLC_PLAYER_IMPLEMENTATIONNAME = "com.sun.star.comp const ::rtl::OUString AVMEDIA_VLC_PLAYER_SERVICENAME = "com.sun.star.media.Player_VLC"; const char * const VLC_ARGS[] = { - "-I", +// "-I", "-Vdummy", - "--ignore-config", + "--snapshot-format=png", +// "--ignore-config", + "--ffmpeg-threads", "--verbose=-1", - "--quiet" +// "--quiet" }; const int MS_IN_SEC = 1000; // Millisec in sec @@ -43,6 +45,11 @@ VLCPlayer::VLCPlayer( const rtl::OUString& url ) { } +const rtl::OUString& VLCPlayer::url() const +{ + return mUrl; +} + void SAL_CALL VLCPlayer::start() { ::osl::MutexGuard aGuard(m_aMutex); diff --git a/avmedia/source/vlc/vlcplayer.hxx b/avmedia/source/vlc/vlcplayer.hxx index 00a55eb..8113602 100644 --- a/avmedia/source/vlc/vlcplayer.hxx +++ b/avmedia/source/vlc/vlcplayer.hxx @@ -44,6 +44,8 @@ class VLCPlayer : public ::cppu::BaseMutex, public: VLCPlayer( const rtl::OUString& url ); + const rtl::OUString& url() const; + void SAL_CALL start(); void SAL_CALL stop(); ::sal_Bool SAL_CALL isPlaying(); commit f5845bf20f10ae17326879e9b5f6d078e6d86c67 Author: Minh Ngo <nlmin...@gmail.com> Date: Mon Jul 29 23:47:20 2013 +0300 Upd frame grabber. Will work with this patch [1][2]. [1] vlc git 5a43de506f31e1fa5460f8b62e25a1d640136597 [2] http://git.videolan.org/gitweb.cgi/vlc.git/?p=vlc.git;a=commitdiff_plain;h=5a43de506f31e1fa5460f8b62e25a1d640136597 Change-Id: I2aa0b4c579ff534e20a425919f0efba59101d7af diff --git a/avmedia/Library_avmediavlc.mk b/avmedia/Library_avmediavlc.mk index 06fb035..f17b18c 100644 --- a/avmedia/Library_avmediavlc.mk +++ b/avmedia/Library_avmediavlc.mk @@ -35,6 +35,7 @@ $(eval $(call gb_Library_use_libraries,avmediavlc,\ sal \ tl \ vcl \ + utl \ $(gb_UWINAPI) \ )) diff --git a/avmedia/source/vlc/vlcframegrabber.cxx b/avmedia/source/vlc/vlcframegrabber.cxx index a189190..efabd39 100644 --- a/avmedia/source/vlc/vlcframegrabber.cxx +++ b/avmedia/source/vlc/vlcframegrabber.cxx @@ -1,11 +1,18 @@ #include <osl/conditn.hxx> -#include <vcl/bmpacc.hxx> #include <vcl/graph.hxx> +#include <vcl/bmpacc.hxx> +#include <vcl/pngread.hxx> #include <avmedia/mediawindow.hxx> +#include <unotools/localfilehelper.hxx> +#include <unotools/tempfile.hxx> +#include <unotools/ucbstreamhelper.hxx> +#include <tools/stream.hxx> + #include "vlcframegrabber.hxx" #include "vlcplayer.hxx" + +#include <vlc/libvlc_events.h> #include <vlc/libvlc_media_player.h> -#include <boost/bind.hpp> using namespace ::com::sun::star; @@ -23,15 +30,68 @@ SAL_CALL VLCFrameGrabber::VLCFrameGrabber( boost::shared_ptr<libvlc_media_player { } +namespace +{ + void EventHandler( const libvlc_event_t *evemt, void *pData ) + { + switch (evemt->type) + { + case libvlc_MediaPlayerPaused: + osl::Condition *condition = static_cast<osl::Condition*>( pData ); + condition->set(); + break; + } + } +} + ::uno::Reference< css::graphic::XGraphic > SAL_CALL VLCFrameGrabber::grabFrame( double fMediaTime ) { - if ( mUrl.isEmpty() ) + osl::Condition condition; + + libvlc_media_player_t *player = mPlayer.get(); + libvlc_event_manager_t *manager = libvlc_media_player_event_manager( player ); + libvlc_event_attach( manager, libvlc_MediaPlayerPaused, EventHandler, &condition ); + + libvlc_audio_set_mute( player, true ); + if (libvlc_media_player_play( player ) == -1) + { + std::cerr << "Couldn't play" << std::endl; + } + + libvlc_media_player_set_time( player, ( fMediaTime > 0 ? fMediaTime : 0 ) * MSEC_IN_SEC ); + + libvlc_media_player_pause( player ); + const TimeValue timeout = {2, 0}; + condition.wait(&timeout); + + if ( mUrl.isEmpty() || !libvlc_media_player_has_vout( player ) ) + { + std::cerr << "Couldn't grab frame" << std::endl; + libvlc_audio_set_mute( player, false ); + + libvlc_event_detach( manager, libvlc_MediaPlayerPaused, EventHandler, &condition ); return ::uno::Reference< css::graphic::XGraphic >(); + } + + const rtl::OUString& fileName = utl::TempFile::CreateTempName(); + rtl::OString dest; + fileName.convertToString( &dest, RTL_TEXTENCODING_UTF8, 0 ); + + libvlc_video_take_snapshot( player, 0, dest.getStr(), 0, 0 ); + libvlc_audio_set_mute( player, false ); + libvlc_media_player_stop( player ); + libvlc_event_detach( manager, libvlc_MediaPlayerPaused, EventHandler, &condition ); + + rtl::OUString url; + utl::LocalFileHelper::ConvertPhysicalNameToURL( fileName, url ); + boost::shared_ptr<SvStream> stream( utl::UcbStreamHelper::CreateStream( url, + STREAM_STD_READ ) ); + + vcl::PNGReader reader( *stream ); - // libvlc_video_take_snapshot must be used, but it doesn't work for PNG files - // + const BitmapEx& bitmap = reader.Read(); - return ::uno::Reference< css::graphic::XGraphic >(); + return Graphic( bitmap ).GetXGraphic(); } ::rtl::OUString SAL_CALL VLCFrameGrabber::getImplementationName() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits