diff --git a/Makefile.in b/Makefile.in index f94b6b0086..acec86397c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -6055,8 +6055,11 @@ COND_TOOLKIT_X11___ADVANCED_PLATFORM_SRC_OBJECTS_1 = \ @COND_TOOLKIT_X11@__ADVANCED_UNIV_SRC_OBJECTS = monodll_animateg.o @COND_TOOLKIT_COCOA@__MEDIA_PLATFORM_SRC_OBJECTS = \ @COND_TOOLKIT_COCOA@ monodll_src_cocoa_mediactrl.o -@COND_TOOLKIT_GTK@__MEDIA_PLATFORM_SRC_OBJECTS = monodll_unix_mediactrl.o -@COND_TOOLKIT_MOTIF@__MEDIA_PLATFORM_SRC_OBJECTS = monodll_unix_mediactrl.o +@COND_TOOLKIT_GTK@__MEDIA_PLATFORM_SRC_OBJECTS = \ +@COND_TOOLKIT_GTK@ monodll_unix_mediactrl.o monodll_mediactrl_gstplayer.o +@COND_TOOLKIT_MOTIF@__MEDIA_PLATFORM_SRC_OBJECTS = \ +@COND_TOOLKIT_MOTIF@ monodll_unix_mediactrl.o \ +@COND_TOOLKIT_MOTIF@ monodll_mediactrl_gstplayer.o @COND_TOOLKIT_MSW@__MEDIA_PLATFORM_SRC_OBJECTS = \ @COND_TOOLKIT_MSW@ monodll_mediactrl_am.o monodll_mediactrl_wmp10.o \ @COND_TOOLKIT_MSW@ monodll_mediactrl_qt.o @@ -6065,7 +6068,8 @@ COND_TOOLKIT_X11___ADVANCED_PLATFORM_SRC_OBJECTS_1 = \ @COND_TOOLKIT_OSX_IPHONE@__MEDIA_PLATFORM_SRC_OBJECTS \ @COND_TOOLKIT_OSX_IPHONE@ = monodll_osx_cocoa_mediactrl.o @COND_TOOLKIT_QT@__MEDIA_PLATFORM_SRC_OBJECTS = monodll_qt_mediactrl.o -@COND_TOOLKIT_X11@__MEDIA_PLATFORM_SRC_OBJECTS = monodll_unix_mediactrl.o +@COND_TOOLKIT_X11@__MEDIA_PLATFORM_SRC_OBJECTS = \ +@COND_TOOLKIT_X11@ monodll_unix_mediactrl.o monodll_mediactrl_gstplayer.o @COND_PLATFORM_MACOSX_1@__HTML_SRC_PLATFORM_OBJECTS = monodll_chm.o @COND_PLATFORM_UNIX_1@__HTML_SRC_PLATFORM_OBJECTS = monodll_chm.o @COND_TOOLKIT_MSW@__HTML_SRC_PLATFORM_OBJECTS = \ @@ -8066,9 +8070,10 @@ COND_TOOLKIT_X11___ADVANCED_PLATFORM_SRC_OBJECTS_3 = \ @COND_TOOLKIT_COCOA@__MEDIA_PLATFORM_SRC_OBJECTS_1 = \ @COND_TOOLKIT_COCOA@ monolib_src_cocoa_mediactrl.o @COND_TOOLKIT_GTK@__MEDIA_PLATFORM_SRC_OBJECTS_1 = \ -@COND_TOOLKIT_GTK@ monolib_unix_mediactrl.o +@COND_TOOLKIT_GTK@ monolib_unix_mediactrl.o monolib_mediactrl_gstplayer.o @COND_TOOLKIT_MOTIF@__MEDIA_PLATFORM_SRC_OBJECTS_1 = \ -@COND_TOOLKIT_MOTIF@ monolib_unix_mediactrl.o +@COND_TOOLKIT_MOTIF@ monolib_unix_mediactrl.o \ +@COND_TOOLKIT_MOTIF@ monolib_mediactrl_gstplayer.o @COND_TOOLKIT_MSW@__MEDIA_PLATFORM_SRC_OBJECTS_1 = \ @COND_TOOLKIT_MSW@ monolib_mediactrl_am.o monolib_mediactrl_wmp10.o \ @COND_TOOLKIT_MSW@ monolib_mediactrl_qt.o @@ -8077,7 +8082,8 @@ COND_TOOLKIT_X11___ADVANCED_PLATFORM_SRC_OBJECTS_3 = \ @COND_TOOLKIT_OSX_IPHONE@__MEDIA_PLATFORM_SRC_OBJECTS_1 \ @COND_TOOLKIT_OSX_IPHONE@ = monolib_osx_cocoa_mediactrl.o @COND_TOOLKIT_QT@__MEDIA_PLATFORM_SRC_OBJECTS_1 = monolib_qt_mediactrl.o -@COND_TOOLKIT_X11@__MEDIA_PLATFORM_SRC_OBJECTS_1 = monolib_unix_mediactrl.o +@COND_TOOLKIT_X11@__MEDIA_PLATFORM_SRC_OBJECTS_1 = \ +@COND_TOOLKIT_X11@ monolib_unix_mediactrl.o monolib_mediactrl_gstplayer.o @COND_PLATFORM_MACOSX_1@__HTML_SRC_PLATFORM_OBJECTS_1 = monolib_chm.o @COND_PLATFORM_UNIX_1@__HTML_SRC_PLATFORM_OBJECTS_1 = monolib_chm.o @COND_TOOLKIT_MSW@__HTML_SRC_PLATFORM_OBJECTS_1 = \ @@ -12131,9 +12137,11 @@ COND_USE_SOVERSOLARIS_1___mediadll___so_symlinks_uninst_cmd = rm -f \ @COND_TOOLKIT_COCOA@__MEDIA_PLATFORM_SRC_OBJECTS_2 = \ @COND_TOOLKIT_COCOA@ mediadll_src_cocoa_mediactrl.o @COND_TOOLKIT_GTK@__MEDIA_PLATFORM_SRC_OBJECTS_2 = \ -@COND_TOOLKIT_GTK@ mediadll_unix_mediactrl.o +@COND_TOOLKIT_GTK@ mediadll_unix_mediactrl.o \ +@COND_TOOLKIT_GTK@ mediadll_mediactrl_gstplayer.o @COND_TOOLKIT_MOTIF@__MEDIA_PLATFORM_SRC_OBJECTS_2 = \ -@COND_TOOLKIT_MOTIF@ mediadll_unix_mediactrl.o +@COND_TOOLKIT_MOTIF@ mediadll_unix_mediactrl.o \ +@COND_TOOLKIT_MOTIF@ mediadll_mediactrl_gstplayer.o COND_TOOLKIT_MSW___MEDIA_PLATFORM_SRC_OBJECTS_2 = \ mediadll_mediactrl_am.o \ mediadll_mediactrl_wmp10.o \ @@ -12145,7 +12153,8 @@ COND_TOOLKIT_MSW___MEDIA_PLATFORM_SRC_OBJECTS_2 = \ @COND_TOOLKIT_OSX_IPHONE@ = mediadll_osx_cocoa_mediactrl.o @COND_TOOLKIT_QT@__MEDIA_PLATFORM_SRC_OBJECTS_2 = mediadll_qt_mediactrl.o @COND_TOOLKIT_X11@__MEDIA_PLATFORM_SRC_OBJECTS_2 = \ -@COND_TOOLKIT_X11@ mediadll_unix_mediactrl.o +@COND_TOOLKIT_X11@ mediadll_unix_mediactrl.o \ +@COND_TOOLKIT_X11@ mediadll_mediactrl_gstplayer.o COND_MONOLITHIC_0_SHARED_0_USE_GUI_1_USE_MEDIA_1___medialib___depname = \ $(LIBDIRNAME)/$(LIBPREFIX)wx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_media-$(WX_RELEASE)$(HOST_SUFFIX)$(LIBEXT) @COND_MONOLITHIC_0_SHARED_0_USE_GUI_1_USE_MEDIA_1@__medialib___depname = $(COND_MONOLITHIC_0_SHARED_0_USE_GUI_1_USE_MEDIA_1___medialib___depname) @@ -12161,9 +12170,11 @@ COND_MONOLITHIC_0_SHARED_0_USE_GUI_1_USE_MEDIA_1___medialib___depname = \ @COND_TOOLKIT_COCOA@__MEDIA_PLATFORM_SRC_OBJECTS_3 = \ @COND_TOOLKIT_COCOA@ medialib_src_cocoa_mediactrl.o @COND_TOOLKIT_GTK@__MEDIA_PLATFORM_SRC_OBJECTS_3 = \ -@COND_TOOLKIT_GTK@ medialib_unix_mediactrl.o +@COND_TOOLKIT_GTK@ medialib_unix_mediactrl.o \ +@COND_TOOLKIT_GTK@ medialib_mediactrl_gstplayer.o @COND_TOOLKIT_MOTIF@__MEDIA_PLATFORM_SRC_OBJECTS_3 = \ -@COND_TOOLKIT_MOTIF@ medialib_unix_mediactrl.o +@COND_TOOLKIT_MOTIF@ medialib_unix_mediactrl.o \ +@COND_TOOLKIT_MOTIF@ medialib_mediactrl_gstplayer.o COND_TOOLKIT_MSW___MEDIA_PLATFORM_SRC_OBJECTS_3 = \ medialib_mediactrl_am.o \ medialib_mediactrl_wmp10.o \ @@ -12175,7 +12186,8 @@ COND_TOOLKIT_MSW___MEDIA_PLATFORM_SRC_OBJECTS_3 = \ @COND_TOOLKIT_OSX_IPHONE@ = medialib_osx_cocoa_mediactrl.o @COND_TOOLKIT_QT@__MEDIA_PLATFORM_SRC_OBJECTS_3 = medialib_qt_mediactrl.o @COND_TOOLKIT_X11@__MEDIA_PLATFORM_SRC_OBJECTS_3 = \ -@COND_TOOLKIT_X11@ medialib_unix_mediactrl.o +@COND_TOOLKIT_X11@ medialib_unix_mediactrl.o \ +@COND_TOOLKIT_X11@ medialib_mediactrl_gstplayer.o @COND_SHARED_1@____wxmedia_namedll_DEP = $(__mediadll___depname) @COND_SHARED_0@____wxmedia_namelib_DEP = $(__medialib___depname) COND_MONOLITHIC_0_SHARED_1_USE_GUI_1_USE_HTML_1___htmldll___depname = \ @@ -20339,6 +20351,15 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP) @COND_TOOLKIT_X11_USE_GUI_1@monodll_unix_mediactrl.o: $(srcdir)/src/unix/mediactrl.cpp $(MONODLL_ODEP) @COND_TOOLKIT_X11_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/mediactrl.cpp +@COND_TOOLKIT_MOTIF_USE_GUI_1@monodll_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MONODLL_ODEP) +@COND_TOOLKIT_MOTIF_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + +@COND_TOOLKIT_GTK_USE_GUI_1@monodll_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MONODLL_ODEP) +@COND_TOOLKIT_GTK_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + +@COND_TOOLKIT_X11_USE_GUI_1@monodll_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MONODLL_ODEP) +@COND_TOOLKIT_X11_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + @COND_TOOLKIT_MSW_USE_GUI_1@monodll_chm.o: $(srcdir)/src/html/chm.cpp $(MONODLL_ODEP) @COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/html/chm.cpp @@ -25160,6 +25181,15 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_X11_USE_GUI_1@monolib_unix_mediactrl.o: $(srcdir)/src/unix/mediactrl.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_X11_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/mediactrl.cpp +@COND_TOOLKIT_MOTIF_USE_GUI_1@monolib_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MONOLIB_ODEP) +@COND_TOOLKIT_MOTIF_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + +@COND_TOOLKIT_GTK_USE_GUI_1@monolib_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MONOLIB_ODEP) +@COND_TOOLKIT_GTK_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + +@COND_TOOLKIT_X11_USE_GUI_1@monolib_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MONOLIB_ODEP) +@COND_TOOLKIT_X11_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + @COND_TOOLKIT_MSW_USE_GUI_1@monolib_chm.o: $(srcdir)/src/html/chm.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/html/chm.cpp @@ -33929,6 +33959,15 @@ mediadll_qt_mediactrl.o: $(srcdir)/src/qt/mediactrl.cpp $(MEDIADLL_ODEP) @COND_TOOLKIT_X11@mediadll_unix_mediactrl.o: $(srcdir)/src/unix/mediactrl.cpp $(MEDIADLL_ODEP) @COND_TOOLKIT_X11@ $(CXXC) -c -o $@ $(MEDIADLL_CXXFLAGS) $(srcdir)/src/unix/mediactrl.cpp +@COND_TOOLKIT_MOTIF@mediadll_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MEDIADLL_ODEP) +@COND_TOOLKIT_MOTIF@ $(CXXC) -c -o $@ $(MEDIADLL_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + +@COND_TOOLKIT_GTK@mediadll_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MEDIADLL_ODEP) +@COND_TOOLKIT_GTK@ $(CXXC) -c -o $@ $(MEDIADLL_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + +@COND_TOOLKIT_X11@mediadll_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MEDIADLL_ODEP) +@COND_TOOLKIT_X11@ $(CXXC) -c -o $@ $(MEDIADLL_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + medialib_mediactrlcmn.o: $(srcdir)/src/common/mediactrlcmn.cpp $(MEDIALIB_ODEP) $(CXXC) -c -o $@ $(MEDIALIB_CXXFLAGS) $(srcdir)/src/common/mediactrlcmn.cpp @@ -33962,6 +34001,15 @@ medialib_qt_mediactrl.o: $(srcdir)/src/qt/mediactrl.cpp $(MEDIALIB_ODEP) @COND_TOOLKIT_X11@medialib_unix_mediactrl.o: $(srcdir)/src/unix/mediactrl.cpp $(MEDIALIB_ODEP) @COND_TOOLKIT_X11@ $(CXXC) -c -o $@ $(MEDIALIB_CXXFLAGS) $(srcdir)/src/unix/mediactrl.cpp +@COND_TOOLKIT_MOTIF@medialib_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MEDIALIB_ODEP) +@COND_TOOLKIT_MOTIF@ $(CXXC) -c -o $@ $(MEDIALIB_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + +@COND_TOOLKIT_GTK@medialib_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MEDIALIB_ODEP) +@COND_TOOLKIT_GTK@ $(CXXC) -c -o $@ $(MEDIALIB_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + +@COND_TOOLKIT_X11@medialib_mediactrl_gstplayer.o: $(srcdir)/src/unix/mediactrl_gstplayer.cpp $(MEDIALIB_ODEP) +@COND_TOOLKIT_X11@ $(CXXC) -c -o $@ $(MEDIALIB_CXXFLAGS) $(srcdir)/src/unix/mediactrl_gstplayer.cpp + htmldll_version_rc.o: $(srcdir)/src/msw/version.rc $(HTMLDLL_ODEP) $(WINDRES) -i$< -o$@ --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_67) $(__DEBUG_DEFINE_p_66) $(__EXCEPTIONS_DEFINE_p_65) $(__RTTI_DEFINE_p_65) $(__THREAD_DEFINE_p_65) --define WXBUILDING --define WXDLLNAME=$(WXDLLNAMEPREFIXGUI)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_html$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG) $(__RCDEFDIR_p) --include-dir $(top_srcdir)/include $(__INC_TIFF_BUILD_p_66) $(__INC_TIFF_p_66) $(__INC_JPEG_p_66) $(__INC_PNG_p_65) $(__INC_ZLIB_p_67) $(__INC_REGEX_p_65) $(__INC_EXPAT_p_65) --define WXUSINGDLL --define WXMAKINGDLL_HTML diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index e51be9d6fc..9660bf0066 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -2990,6 +2990,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/unix/mediactrl.cpp + src/unix/mediactrl_gstplayer.cpp diff --git a/build/files b/build/files index 66520c08de..9ac55577b9 100644 --- a/build/files +++ b/build/files @@ -2732,6 +2732,7 @@ MEDIA_COCOA_HDR = MEDIA_UNIX_SRC = src/unix/mediactrl.cpp + src/unix/mediactrl_gstplayer.cpp MEDIA_UNIX_HDR = MEDIA_GTK_SRC = diff --git a/configure b/configure index fefaac3757..ae980109fa 100755 --- a/configure +++ b/configure @@ -35905,6 +35905,89 @@ pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST" >&5 $as_echo_n "checking for GST... " >&6; } +if test -n "$PKG_CONFIG"; then + if test -n "$GST_CFLAGS"; then + pkg_cv_GST_CFLAGS="$GST_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-\$GST_VERSION gstreamer-video-\$GST_VERSION gstreamer-player-\$GST_VERSION >= 1.7.2.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION gstreamer-player-$GST_VERSION >= 1.7.2.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_CFLAGS=`$PKG_CONFIG --cflags "gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION gstreamer-player-$GST_VERSION >= 1.7.2.1" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$GST_LIBS"; then + pkg_cv_GST_LIBS="$GST_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-\$GST_VERSION gstreamer-video-\$GST_VERSION gstreamer-player-\$GST_VERSION >= 1.7.2.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION gstreamer-player-$GST_VERSION >= 1.7.2.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GST_LIBS=`$PKG_CONFIG --libs "gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION gstreamer-player-$GST_VERSION >= 1.7.2.1" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GST_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION gstreamer-player-$GST_VERSION >= 1.7.2.1"` + else + GST_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION gstreamer-player-$GST_VERSION >= 1.7.2.1"` + fi + # Put the nasty error message in config.log where it belongs + echo "$GST_PKG_ERRORS" >&5 + + + { $as_echo "$as_me:${as_lineno-$LINENO}: GStreamer 1.7.2+ not available. Not using GstPlayer and falling back to 1.0" >&5 +$as_echo "$as_me: GStreamer 1.7.2+ not available. Not using GstPlayer and falling back to 1.0" >&6;} + + +elif test $pkg_failed = untried; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: GStreamer 1.7.2+ not available. Not using GstPlayer and falling back to 1.0" >&5 +$as_echo "$as_me: GStreamer 1.7.2+ not available. Not using GstPlayer and falling back to 1.0" >&6;} + + +else + GST_CFLAGS=$pkg_cv_GST_CFLAGS + GST_LIBS=$pkg_cv_GST_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + wxUSE_GSTREAMER="yes" + $as_echo "#define wxUSE_GSTREAMER_PLAYER 1" >>confdefs.h + + +fi + + if test $wxUSE_GSTREAMER = "no"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST" >&5 +$as_echo_n "checking for GST... " >&6; } + if test -n "$PKG_CONFIG"; then if test -n "$GST_CFLAGS"; then pkg_cv_GST_CFLAGS="$GST_CFLAGS" @@ -35960,20 +36043,20 @@ fi echo "$GST_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 1.0 not available, falling back to 0.10" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 1.0 not available, falling back to 0.10" >&5 $as_echo "$as_me: WARNING: GStreamer 1.0 not available, falling back to 0.10" >&2;} - GST_VERSION_MAJOR=0 - GST_VERSION_MINOR=10 - GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR + GST_VERSION_MAJOR=0 + GST_VERSION_MINOR=10 + GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 1.0 not available, falling back to 0.10" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 1.0 not available, falling back to 0.10" >&5 $as_echo "$as_me: WARNING: GStreamer 1.0 not available, falling back to 0.10" >&2;} - GST_VERSION_MAJOR=0 - GST_VERSION_MINOR=10 - GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR + GST_VERSION_MAJOR=0 + GST_VERSION_MINOR=10 + GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR else @@ -35982,9 +36065,10 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - wxUSE_GSTREAMER="yes" + wxUSE_GSTREAMER="yes" fi + fi if test $GST_VERSION_MINOR = "10"; then diff --git a/configure.in b/configure.in index d0c441f1c3..41d34cdcc2 100644 --- a/configure.in +++ b/configure.in @@ -7260,18 +7260,31 @@ if test "$wxUSE_MEDIACTRL" = "yes" -o "$wxUSE_MEDIACTRL" = "auto"; then GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR PKG_CHECK_MODULES(GST, - [gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION], + [gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION gstreamer-player-$GST_VERSION >= 1.7.2.1], [ wxUSE_GSTREAMER="yes" + AC_DEFINE(wxUSE_GSTREAMER_PLAYER) ], [ - AC_MSG_WARN([GStreamer 1.0 not available, falling back to 0.10]) - GST_VERSION_MAJOR=0 - GST_VERSION_MINOR=10 - GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR + AC_MSG_NOTICE([GStreamer 1.7.2+ not available. Not using GstPlayer and falling back to 1.0]) ] ) + if test $wxUSE_GSTREAMER = "no"; then + PKG_CHECK_MODULES(GST, + [gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION], + [ + wxUSE_GSTREAMER="yes" + ], + [ + AC_MSG_WARN([GStreamer 1.0 not available, falling back to 0.10]) + GST_VERSION_MAJOR=0 + GST_VERSION_MINOR=10 + GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR + ] + ) + fi + if test $GST_VERSION_MINOR = "10"; then PKG_CHECK_MODULES(GST, [gstreamer-$GST_VERSION gstreamer-plugins-base-$GST_VERSION], diff --git a/docs/changes.txt b/docs/changes.txt index 31d43b9b23..ecd554c980 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -72,6 +72,10 @@ wxOSX: - Set up extensions filter correctly in wxFileDialog (nick863). - Turn off automatic quotes substitutions in wxTextCtrl (Xlord2). +Unix: + +- Support new gstreamer API in 1.7.2+ in wxMediaCtrl (Sebastian Dröge). + 3.1.0: (released 2016-02-29) ---------------------------- diff --git a/setup.h.in b/setup.h.in index ee9d346573..6965f925da 100644 --- a/setup.h.in +++ b/setup.h.in @@ -635,6 +635,8 @@ */ #define wxUSE_GSTREAMER 0 +#define wxUSE_GSTREAMER_PLAYER 0 + /* --- start MSW options --- */ diff --git a/src/unix/mediactrl.cpp b/src/unix/mediactrl.cpp index 81da7425b0..c38c20efd6 100644 --- a/src/unix/mediactrl.cpp +++ b/src/unix/mediactrl.cpp @@ -11,12 +11,10 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#if wxUSE_MEDIACTRL +#if wxUSE_MEDIACTRL && wxUSE_GSTREAMER && !wxUSE_GSTREAMER_PLAYER #include "wx/mediactrl.h" -#if wxUSE_GSTREAMER - #include // main gstreamer header #if GST_CHECK_VERSION(1,0,0) @@ -1589,10 +1587,8 @@ double wxGStreamerMediaBackend::GetVolume() return dVolume; } -#endif //wxUSE_GSTREAMER - // Force link into main library so this backend can be loaded #include "wx/html/forcelnk.h" FORCE_LINK_ME(basewxmediabackends) -#endif //wxUSE_MEDIACTRL +#endif // wxUSE_MEDIACTRL && wxUSE_GSTREAMER && !wxUSE_GSTREAMER_PLAYER diff --git a/src/unix/mediactrl_gstplayer.cpp b/src/unix/mediactrl_gstplayer.cpp new file mode 100644 index 0000000000..b7c22c0a04 --- /dev/null +++ b/src/unix/mediactrl_gstplayer.cpp @@ -0,0 +1,514 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/unix/mediactrl.cpp +// Purpose: GStreamer backend for Unix +// Author: Sebastian Dröge +// Created: 2016-02-28 +// Copyright: (c) 2004-2005 Ryan Norton +// (c) 2016 Sebastian Dröge +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if wxUSE_MEDIACTRL && wxUSE_GSTREAMER && wxUSE_GSTREAMER_PLAYER + +#include "wx/mediactrl.h" + +#include // main gstreamer player header + +#ifndef WX_PRECOMP + #include "wx/log.h" // wxLogDebug/wxLogSysError/wxLogTrace + #include "wx/app.h" // wxTheApp->argc, wxTheApp->argv + #include "wx/timer.h" // wxTimer +#endif + +#include "wx/filesys.h" // FileNameToURL() +#include "wx/thread.h" // wxMutex/wxMutexLocker +#include "wx/vector.h" // wxVector + +#ifdef __WXGTK__ + #include + #include + #include "wx/gtk/private/gtk2-compat.h" +#endif + +//============================================================================= +// Declarations +//============================================================================= +//----------------------------------------------------------------------------- +// wxLogTrace mask string +//----------------------------------------------------------------------------- +#define wxTRACE_GStreamer wxT("GStreamer") + +//----------------------------------------------------------------------------- +// +// wxGStreamerMediaBackend +// +//----------------------------------------------------------------------------- +class WXDLLIMPEXP_MEDIA + wxGStreamerMediaBackend : public wxMediaBackendCommonBase +{ +public: + + wxGStreamerMediaBackend(); + virtual ~wxGStreamerMediaBackend(); + + virtual bool CreateControl(wxControl* ctrl, wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) wxOVERRIDE; + + virtual bool Play() wxOVERRIDE; + virtual bool Pause() wxOVERRIDE; + virtual bool Stop() wxOVERRIDE; + + virtual bool Load(const wxString& fileName) wxOVERRIDE; + virtual bool Load(const wxURI& location) wxOVERRIDE; + virtual bool Load(const wxURI& location, + const wxURI& proxy) wxOVERRIDE + { return wxMediaBackendCommonBase::Load(location, proxy); } + + + virtual bool SetPosition(wxLongLong where) wxOVERRIDE; + virtual wxLongLong GetPosition() wxOVERRIDE; + virtual wxLongLong GetDuration() wxOVERRIDE; + + virtual void Move(int x, int y, int w, int h) wxOVERRIDE; + wxSize GetVideoSize() const wxOVERRIDE; + + virtual double GetPlaybackRate() wxOVERRIDE; + virtual bool SetPlaybackRate(double dRate) wxOVERRIDE; + + virtual wxMediaState GetState() wxOVERRIDE; + + virtual bool SetVolume(double dVolume) wxOVERRIDE; + virtual double GetVolume() wxOVERRIDE; + + virtual wxLongLong GetDownloadProgress() wxOVERRIDE; + virtual wxLongLong GetDownloadTotal() wxOVERRIDE; + + bool DoLoad(const wxString& locstring); + wxMediaCtrl* GetControl() { return m_ctrl; } // for C Callbacks + + void VideoDimensionsChanged(int width, int height); + void StateChanged(GstPlayerState state); + void EndOfStream(); + + GstPlayer *m_player; + GstPlayerVideoRenderer *m_video_renderer; + wxSize m_videoSize; + wxMediaState m_last_state; + bool m_loaded; + + wxDECLARE_DYNAMIC_CLASS(wxGStreamerMediaBackend); +}; + +//============================================================================= +// Implementation +//============================================================================= + +wxIMPLEMENT_DYNAMIC_CLASS(wxGStreamerMediaBackend, wxMediaBackend); + +//----------------------------------------------------------------------------- +// +// C Callbacks +// +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// "expose_event" from m_ctrl->m_wxwindow +// +// Handle GTK expose event from our window - here we hopefully +// redraw the video in the case of pausing and other instances... +// (Returns TRUE to pass to other handlers, FALSE if not) +// +//----------------------------------------------------------------------------- +#ifdef __WXGTK__ +static gboolean +#ifdef __WXGTK3__ +draw_callback(GtkWidget* widget, cairo_t* cr, wxGStreamerMediaBackend* be) +#else +expose_event_callback(GtkWidget* widget, GdkEventExpose* event, wxGStreamerMediaBackend* be) +#endif +{ + // If we have actual video..... + if(!(be->m_videoSize.x==0&&be->m_videoSize.y==0)) + { + // GST Doesn't redraw automatically while paused + // Plus, the video sometimes doesn't redraw when it looses focus + // or is painted over so we just tell it to redraw... + gst_player_video_overlay_video_renderer_expose(GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER(be->m_video_renderer)); + } + else + { + // draw a black background like some other backends do.... +#ifdef __WXGTK3__ + GtkAllocation a; + gtk_widget_get_allocation(widget, &a); + cairo_rectangle(cr, 0, 0, a.width, a.height); + cairo_set_source_rgb(cr, 0, 0, 0); + cairo_fill(cr); +#else + gdk_draw_rectangle (event->window, widget->style->black_gc, TRUE, 0, 0, + widget->allocation.width, + widget->allocation.height); +#endif + } + + return FALSE; +} +#endif // wxGTK + +//----------------------------------------------------------------------------- +// "realize" from m_ctrl->m_wxwindow +// +// If the window wasn't realized when Load was called, this is the +// callback for when it is - the purpose of which is to tell +// GStreamer to play the video in our control +//----------------------------------------------------------------------------- +#ifdef __WXGTK__ +extern "C" { +static void realize_callback(GtkWidget* widget, wxGStreamerMediaBackend* be) +{ + gdk_flush(); + + GdkWindow* window = gtk_widget_get_window(widget); + wxASSERT(window); + + gst_player_video_overlay_video_renderer_set_window_handle(GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER(be->m_video_renderer), + (gpointer) GDK_WINDOW_XID(window) + ); + GtkWidget* w = be->GetControl()->m_wxwindow; +#ifdef __WXGTK3__ + g_signal_connect(w, "draw", G_CALLBACK(draw_callback), be); +#else + g_signal_connect(w, "expose_event", G_CALLBACK(expose_event_callback), be); +#endif +} +} +#endif // wxGTK + +wxGStreamerMediaBackend::wxGStreamerMediaBackend() + : m_player(0), m_video_renderer(0), m_videoSize(0, 0), m_last_state(wxMEDIASTATE_STOPPED), m_loaded(false) +{ + +} + +wxGStreamerMediaBackend::~wxGStreamerMediaBackend() +{ + m_video_renderer = NULL; + if (m_player) + gst_object_unref(m_player); + m_player = NULL; +} + +extern "C" { +static void video_dimensions_changed_callback(GstPlayer * WXUNUSED(player), gint width, gint height, wxGStreamerMediaBackend* be) +{ + be->VideoDimensionsChanged(width, height); +} + +static void state_changed_callback(GstPlayer * WXUNUSED(player), GstPlayerState state, wxGStreamerMediaBackend* be) +{ + be->StateChanged(state); +} + +static void end_of_stream_callback(GstPlayer * WXUNUSED(player), wxGStreamerMediaBackend* be) +{ + be->EndOfStream(); +} +} + +bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + // + //init gstreamer + // + + //Convert arguments to unicode if enabled +#if wxUSE_UNICODE + int i; + char **argvGST = new char*[wxTheApp->argc + 1]; + for ( i = 0; i < wxTheApp->argc; i++ ) + { + argvGST[i] = wxStrdupA(wxTheApp->argv[i].utf8_str()); + } + + argvGST[wxTheApp->argc] = NULL; + + int argcGST = wxTheApp->argc; +#else +#define argcGST wxTheApp->argc +#define argvGST wxTheApp->argv +#endif + + //Really init gstreamer + gboolean bInited; + GError* error = NULL; + bInited = gst_init_check(&argcGST, &argvGST, &error); + + // Cleanup arguments for unicode case +#if wxUSE_UNICODE + for ( i = 0; i < argcGST; i++ ) + { + free(argvGST[i]); + } + + delete [] argvGST; +#endif + + if(!bInited) //gst_init_check fail? + { + if(error) + { + wxLogSysError(wxT("Could not initialize GStreamer\n") + wxT("Error Message:%s"), + (const wxChar*) wxConvUTF8.cMB2WX(error->message) + ); + g_error_free(error); + } + else + wxLogSysError(wxT("Could not initialize GStreamer")); + + return false; + } + + // + // wxControl creation + // + m_ctrl = wxStaticCast(ctrl, wxMediaCtrl); + +#ifdef __WXGTK__ + // We handle our own GTK expose events + m_ctrl->m_noExpose = true; +#endif + + if( !m_ctrl->wxControl::Create(parent, id, pos, size, + style, // TODO: remove borders??? + validator, name) ) + { + wxFAIL_MSG(wxT("Could not create wxControl!!!")); + return false; + } + +#ifdef __WXGTK__ + // Turn off double-buffering so that + // so it doesn't draw over the video and cause sporadic + // disappearances of the video + gtk_widget_set_double_buffered(m_ctrl->m_wxwindow, FALSE); +#endif + + // don't erase the background of our control window + // so that resizing is a bit smoother + m_ctrl->SetBackgroundStyle(wxBG_STYLE_CUSTOM); + + // Tell gstreamer to play in our window + gpointer window_handle = NULL; +#ifdef __WXGTK__ + if (!gtk_widget_get_realized(m_ctrl->m_wxwindow)) + { + // Not realized yet - set to connect at realization time + g_signal_connect (m_ctrl->m_wxwindow, + "realize", + G_CALLBACK (realize_callback), + this); + } + else + { + GdkWindow* window = gtk_widget_get_window(m_ctrl->m_wxwindow); + wxASSERT(window); + window_handle = (gpointer) GDK_WINDOW_XID(window); + + GtkWidget* w = m_ctrl->m_wxwindow; +#ifdef __WXGTK3__ + g_signal_connect(w, "draw", G_CALLBACK(draw_callback), this); +#else + g_signal_connect(w, "expose_event", G_CALLBACK(expose_event_callback), this); +#endif + } +#else + window_handle = ctrl->GetHandle(); +#endif + + m_video_renderer = gst_player_video_overlay_video_renderer_new(window_handle); + m_player = gst_player_new(m_video_renderer, gst_player_g_main_context_signal_dispatcher_new(NULL)); + + g_signal_connect(m_player, "video-dimensions-changed", G_CALLBACK(video_dimensions_changed_callback), this); + g_signal_connect(m_player, "state-changed", G_CALLBACK(state_changed_callback), this); + g_signal_connect(m_player, "end-of-stream", G_CALLBACK(end_of_stream_callback), this); + + return true; +} + +bool wxGStreamerMediaBackend::Play() +{ + gst_player_play(m_player); + + return true; +} + +bool wxGStreamerMediaBackend::Pause() +{ + gst_player_pause(m_player); + + return true; +} + +bool wxGStreamerMediaBackend::Stop() +{ + gst_player_stop(m_player); + + return true; +} + +bool wxGStreamerMediaBackend::Load(const wxString& fileName) +{ + return DoLoad(wxFileSystem::FileNameToURL(fileName)); +} + +bool wxGStreamerMediaBackend::Load(const wxURI& location) +{ + return DoLoad(location.BuildURI()); +} + +bool wxGStreamerMediaBackend::DoLoad(const wxString& locstring) +{ + // Make sure the passed URI is valid and tell playbin to load it + // non-file uris are encoded + wxASSERT(gst_uri_protocol_is_valid("file")); + wxASSERT(gst_uri_is_valid(locstring.mb_str())); + + gst_player_stop(m_player); + m_loaded = false; + gst_player_set_uri(m_player, (const char*)locstring.mb_str()); + gst_player_pause(m_player); + + return true; +} + +void wxGStreamerMediaBackend::VideoDimensionsChanged(int width, int height) +{ + if (m_loaded) { + m_videoSize.x = width; + m_videoSize.y = height; + NotifyMovieSizeChanged(); + } +} + +void wxGStreamerMediaBackend::StateChanged(GstPlayerState state) +{ + switch (state) { + case GST_PLAYER_STATE_BUFFERING: + case GST_PLAYER_STATE_PAUSED: + if (!m_loaded) { + NotifyMovieLoaded(); + m_loaded = true; + } + + m_last_state = wxMEDIASTATE_PAUSED; + QueuePauseEvent(); + break; + case GST_PLAYER_STATE_PLAYING: + m_last_state = wxMEDIASTATE_PLAYING; + QueuePlayEvent(); + break; + case GST_PLAYER_STATE_STOPPED: + default: + m_last_state = wxMEDIASTATE_STOPPED; + QueueStopEvent(); + break; + } +} + +void wxGStreamerMediaBackend::EndOfStream() +{ + if (SendStopEvent()) + QueueFinishEvent(); +} + +bool wxGStreamerMediaBackend::SetPosition(wxLongLong where) +{ + gst_player_seek(m_player, where.GetValue() * GST_MSECOND); + + return true; +} + +wxLongLong wxGStreamerMediaBackend::GetPosition() +{ + GstClockTime position = gst_player_get_position(m_player); + + return GST_CLOCK_TIME_IS_VALID(position) ? position / GST_MSECOND : 0; +} + +wxLongLong wxGStreamerMediaBackend::GetDuration() +{ + GstClockTime duration = gst_player_get_duration(m_player); + + return GST_CLOCK_TIME_IS_VALID(duration) ? duration / GST_MSECOND : 0; +} + +void wxGStreamerMediaBackend::Move(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(w), int WXUNUSED(h)) +{ + /* Nothing to be done here, at least for GTK+. For other toolkits we might + * have to call + * gst_player_video_overlay_video_renderer_set_render_rectangle() here + */ +} + +wxSize wxGStreamerMediaBackend::GetVideoSize() const +{ + return m_videoSize; +} + +double wxGStreamerMediaBackend::GetPlaybackRate() +{ + return gst_player_get_rate(m_player); +} + +bool wxGStreamerMediaBackend::SetPlaybackRate(double dRate) +{ + gst_player_set_rate(m_player, dRate); + return true; +} + +wxMediaState wxGStreamerMediaBackend::GetState() +{ + return m_last_state; +} + +bool wxGStreamerMediaBackend::SetVolume(double dVolume) +{ + gst_player_set_volume(m_player, dVolume); + return true; +} + +double wxGStreamerMediaBackend::GetVolume() +{ + return gst_player_get_volume(m_player); +} + +wxLongLong wxGStreamerMediaBackend::GetDownloadProgress() +{ + return 0; +} + +wxLongLong wxGStreamerMediaBackend::GetDownloadTotal() +{ + return 0; +} + +// Force link into main library so this backend can be loaded +#include "wx/html/forcelnk.h" +FORCE_LINK_ME(basewxmediabackends) + +#endif // wxUSE_MEDIACTRL && wxUSE_GSTREAMER && wxUSE_GSTREAMER_PLAYER