[arch-commits] Commit in wxgtk/trunk (PKGBUILD gst1.0.patch)

Jan de Groot jgc at archlinux.org
Thu Jan 19 15:18:20 UTC 2017


    Date: Thursday, January 19, 2017 @ 15:18:20
  Author: jgc
Revision: 286972

upgpkg: wxgtk 3.0.2-6

Use GStreamer 1.0 for media plugin

Added:
  wxgtk/trunk/gst1.0.patch
Modified:
  wxgtk/trunk/PKGBUILD

--------------+
 PKGBUILD     |   19 -
 gst1.0.patch |  886 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 898 insertions(+), 7 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2017-01-19 12:22:54 UTC (rev 286971)
+++ PKGBUILD	2017-01-19 15:18:20 UTC (rev 286972)
@@ -3,20 +3,21 @@
 
 pkgname=wxgtk
 pkgver=3.0.2
-pkgrel=5
+pkgrel=6
 pkgdesc="GTK+ implementation of wxWidgets API for GUI"
 arch=('i686' 'x86_64')
-url="http://wxwidgets.org"
+url="https://wxwidgets.org"
 license=('custom:wxWindows')
-depends=('gtk2' 'gstreamer0.10-base' 'libsm')
-makedepends=('gstreamer0.10-base-plugins' 'gconf' 'webkitgtk2' 'glu')
+depends=('gtk2' 'gst-plugins-base-libs' 'libsm')
+makedepends=('gst-plugins-base' 'gconf' 'webkitgtk2' 'glu')
 optdepends=('webkitgtk2: for webview support')
 options=('!emptydirs')
-source=(http://downloads.sourceforge.net/wxwindows/wxWidgets-${pkgver}.tar.bz2
-        make-abicheck-non-fatal.patch wxgtk-gcc6.patch)
+source=(https://downloads.sourceforge.net/wxwindows/wxWidgets-${pkgver}.tar.bz2
+        make-abicheck-non-fatal.patch wxgtk-gcc6.patch gst1.0.patch)
 sha1sums=('6461eab4428c0a8b9e41781b8787510484dea800'
           'dfe38650c655395b90bf082b5734c4093508bfa3'
-          '498202334c69d49c1ebbc9d36ad382cfa237f3f8')
+          '498202334c69d49c1ebbc9d36ad382cfa237f3f8'
+          '07d47f2fb2efd400ab54302b3bb55da141d76d61')
 
 prepare() {
   cd wxWidgets-${pkgver}
@@ -27,10 +28,14 @@
 
   # Fix build with GCC 6
   patch -p1 -i ../wxgtk-gcc6.patch
+
+  # Gstreamer 0.10 -> 1.0 patch
+  patch -Np1 -i ../gst1.0.patch
 }
 
 build() {
   cd wxWidgets-${pkgver}
+  ./autogen.sh
   ./configure --prefix=/usr --libdir=/usr/lib --with-gtk=2 --with-opengl --enable-unicode \
     --enable-graphics_ctx --enable-mediactrl --enable-webview --with-regex=builtin \
     --with-libpng=sys --with-libxpm=sys --with-libjpeg=sys --with-libtiff=sys \

Added: gst1.0.patch
===================================================================
--- gst1.0.patch	                        (rev 0)
+++ gst1.0.patch	2017-01-19 15:18:20 UTC (rev 286972)
@@ -0,0 +1,886 @@
+Index: wxwidgets3.0-3.0.2+dfsg/configure.in
+===================================================================
+--- wxwidgets3.0-3.0.2+dfsg.orig/configure.in
++++ wxwidgets3.0-3.0.2+dfsg/configure.in
+@@ -7543,43 +7543,22 @@ if test "$wxUSE_MEDIACTRL" = "yes" -o "$
+         wxUSE_GSTREAMER="no"
+ 
+         dnl -------------------------------------------------------------------
+-        dnl Test for at least 0.8 gstreamer module from pkg-config
+-        dnl Even totem doesn't accept 0.9 evidently.
+-        dnl
+-        dnl So, we first check to see if 0.10 if available - if not we
+-        dnl try the older 0.8 version
++        dnl Test for at least gstreamer 1.0 module from pkg-config
+         dnl -------------------------------------------------------------------
+-        GST_VERSION_MAJOR=0
+-        GST_VERSION_MINOR=10
++        GST_VERSION_MAJOR=1
++        GST_VERSION_MINOR=0
+         GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR
+ 
+-        if test "$wxUSE_GSTREAMER8" = "no"; then
+-            PKG_CHECK_MODULES(GST,
+-                [gstreamer-$GST_VERSION gstreamer-plugins-base-$GST_VERSION],
+-                [
+-                    wxUSE_GSTREAMER="yes"
+-                    GST_LIBS="$GST_LIBS -lgstinterfaces-$GST_VERSION"
+-                ],
+-                [
+-                    AC_MSG_WARN([GStreamer 0.10 not available, falling back to 0.8])
+-                    GST_VERSION_MINOR=8
+-                ]
+-            )
+-        else
+-            dnl check only for 0.8
+-            GST_VERSION_MINOR=8
+-        fi
+-
+-        if test $GST_VERSION_MINOR = "8"; then
+-            GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR
+-            PKG_CHECK_MODULES(GST,
+-                [gstreamer-$GST_VERSION gstreamer-interfaces-$GST_VERSION gstreamer-gconf-$GST_VERSION],
+-                wxUSE_GSTREAMER="yes",
+-                [
+-                    AC_MSG_WARN([GStreamer 0.8/0.10 not available.])
+-                ])
+-        fi
+-
++        PKG_CHECK_MODULES(GST,
++            [gstreamer-$GST_VERSION gstreamer-plugins-base-$GST_VERSION],
++            [
++                wxUSE_GSTREAMER="yes"
++                GST_LIBS="$GST_LIBS -lgstvideo-$GST_VERSION"
++            ],
++            [
++                AC_MSG_WARN([GStreamer 1.0 not available])
++            ]
++        )
+ 
+         if test "$wxUSE_GSTREAMER" = "yes"; then
+             CPPFLAGS="$GST_CFLAGS $CPPFLAGS"
+Index: wxwidgets3.0-3.0.2+dfsg/src/unix/mediactrl.cpp
+===================================================================
+--- wxwidgets3.0-3.0.2+dfsg.orig/src/unix/mediactrl.cpp
++++ wxwidgets3.0-3.0.2+dfsg/src/unix/mediactrl.cpp
+@@ -19,13 +19,7 @@
+ 
+ #include <gst/gst.h>                // main gstreamer header
+ 
+-// xoverlay/video stuff, gst-gconf for 0.8
+-#if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10
+-#   include <gst/interfaces/xoverlay.h>
+-#else
+-#   include <gst/xoverlay/xoverlay.h>
+-#   include <gst/gconf/gconf.h>        // gstreamer glib configuration
+-#endif
++#include <gst/video/videooverlay.h>
+ 
+ #ifndef  WX_PRECOMP
+     #include "wx/log.h"             // wxLogDebug/wxLogSysError/wxLogTrace
+@@ -48,11 +42,11 @@
+ //-----------------------------------------------------------------------------
+ 
+ /*
+-   This is the GStreamer backend for unix. Currently we require 0.8 or
+-   0.10. Here we use the "playbin" GstElement for ease of use.
++   This is the GStreamer backend for unix. Currently we require 1.0.
++   Here we use the "playbin" GstElement for ease of use.
+ 
+-   Note that now we compare state change functions to GST_STATE_FAILURE
+-   now rather than GST_STATE_SUCCESS as newer gstreamer versions return
++   Note that now we compare state change functions to GST_STATE_CHANGE_FAILURE
++   now rather than GST_STATE_CHANGE_SUCCESS as newer gstreamer versions return
+    non-success values for returns that are otherwise successful but not
+    immediate.
+ 
+@@ -60,11 +54,8 @@
+    moment but with a tad bit of work it could theorectically work in
+    straight wxX11 et al.
+ 
+-   One last note is that resuming from pausing/seeking can result
+-   in erratic video playback (GStreamer-based bug, happens in totem as well)
+-   - this is better in 0.10, however. One thing that might make it worse
+-   here is that we don't preserve the aspect ratio of the video and stretch
+-   it to the whole window.
++   One last note is that we don't preserve the aspect ratio of the video and
++   stretch it to the whole window.
+ 
+    Note that there are some things used here that could be undocumented -
+    for reference see the media player Kiss and Totem as well as some
+@@ -72,12 +63,10 @@
+    that attempted thread-safety...
+ 
+    Then there is the issue of m_asynclock. This serves several purposes:
+-   1) It prevents the C callbacks from sending wx state change events
+-      so that we don't get duplicate ones in 0.8
+-   2) It makes the sync and async handlers in 0.10 not drop any
++   1) It makes the sync and async handlers not drop any
+       messages so that while we are polling it we get the messages in
+       SyncStateChange instead of the queue.
+-   3) Keeps the pausing in Stop() synchronous
++   2) Keeps the pausing in Stop() synchronous
+ 
+    RN: Note that I've tried to follow the wxGTK conventions here as close
+    as possible. In the implementation the C Callbacks come first, then
+@@ -90,43 +79,9 @@
+ //=============================================================================
+ 
+ //-----------------------------------------------------------------------------
+-//  GStreamer (most version compatibility) macros
++//  GStreamer macros
+ //-----------------------------------------------------------------------------
+ 
+-// In 0.9 there was a HUGE change to GstQuery and the
+-// gst_element_query function changed dramatically and split off
+-// into two separate ones
+-#if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR <= 8
+-#    define wxGst_element_query_duration(e, f, p) \
+-                gst_element_query(e, GST_QUERY_TOTAL, f, p)
+-#    define wxGst_element_query_position(e, f, p) \
+-                gst_element_query(e, GST_QUERY_POSITION, f, p)
+-#elif GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR == 9
+-// However, the actual 0.9 version has a slightly different definition
+-// and instead of gst_element_query_duration it has two parameters to
+-// gst_element_query_position instead
+-#    define wxGst_element_query_duration(e, f, p) \
+-                gst_element_query_position(e, f, 0, p)
+-#    define wxGst_element_query_position(e, f, p) \
+-                gst_element_query_position(e, f, p, 0)
+-#else
+-#    define wxGst_element_query_duration \
+-                gst_element_query_duration
+-#    define wxGst_element_query_position \
+-                gst_element_query_position
+-#endif
+-
+-// Other 0.10 macros
+-#if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10
+-#   define GST_STATE_FAILURE GST_STATE_CHANGE_FAILURE
+-#   define GST_STATE_SUCCESS GST_STATE_CHANGE_SUCCESS
+-#   define GstElementState GstState
+-#   define gst_gconf_get_default_video_sink() \
+-        gst_element_factory_make ("gconfvideosink", "video-sink");
+-#   define gst_gconf_get_default_audio_sink() \
+-        gst_element_factory_make ("gconfaudiosink", "audio-sink");
+-#endif
+-
+ // Max wait time for element state waiting - GST_CLOCK_TIME_NONE for inf
+ #define wxGSTREAMER_TIMEOUT (100 * GST_MSECOND) // Max 100 milliseconds
+ 
+@@ -189,11 +144,11 @@ public:
+     bool CheckForErrors();
+     bool DoLoad(const wxString& locstring);
+     wxMediaCtrl* GetControl() { return m_ctrl; } // for C Callbacks
+-    void HandleStateChange(GstElementState oldstate, GstElementState newstate);
++    void HandleStateChange(GstState oldstate, GstState newstate);
+     bool QueryVideoSizeFromElement(GstElement* element);
+     bool QueryVideoSizeFromPad(GstPad* caps);
+-    void SetupXOverlay();
+-    bool SyncStateChange(GstElement* element, GstElementState state,
++    void SetupVideoOverlay();
++    bool SyncStateChange(GstElement* element, GstState state,
+                          gint64 llTimeout = wxGSTREAMER_TIMEOUT);
+     bool TryAudioSink(GstElement* audiosink);
+     bool TryVideoSink(GstElement* videosink);
+@@ -203,7 +158,7 @@ public:
+     double          m_dRate;        // Current playback rate -
+                                     // see GetPlaybackRate for notes
+     wxLongLong      m_llPausedPos;  // Paused position - see Pause()
+-    GstXOverlay*    m_xoverlay;     // X Overlay that contains the GST video
++    GstVideoOverlay*    m_videooverlay;     // Video Overlay that contains the GST video
+     wxMutex         m_asynclock;    // See "discussion of internals"
+     class wxGStreamerMediaEventHandler* m_eventHandler; // see below
+ 
+@@ -284,7 +239,7 @@ expose_event(GtkWidget* widget, GdkEvent
+ {
+     // I've seen this recommended somewhere...
+     // TODO: Is this needed? Maybe it is just cruft...
+-    // gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay),
++    // gst_video_overlay_set_window_handle( GST_VIDEO_OVERLAY(be->m_videooverlay),
+     //                              GDK_WINDOW_XWINDOW( window ) );
+ 
+     // If we have actual video.....
+@@ -294,7 +249,7 @@ expose_event(GtkWidget* widget, GdkEvent
+         // 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_x_overlay_expose(be->m_xoverlay);
++        gst_video_overlay_expose(be->m_videooverlay);
+     }
+     else
+     {
+@@ -334,7 +289,7 @@ static gint gtk_window_realize_callback(
+     GdkWindow* window = gtk_widget_get_window(widget);
+     wxASSERT(window);
+ 
+-    gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay),
++    gst_video_overlay_set_window_handle( GST_VIDEO_OVERLAY(be->m_videooverlay),
+                                 GDK_WINDOW_XID(window)
+                                 );
+     GtkWidget* w = be->GetControl()->m_wxwindow;
+@@ -349,30 +304,6 @@ static gint gtk_window_realize_callback(
+ #endif // wxGTK
+ 
+ //-----------------------------------------------------------------------------
+-// "state-change" from m_playbin/GST_MESSAGE_STATE_CHANGE
+-//
+-// Called by gstreamer when the state changes - here we
+-// send the appropriate corresponding wx event.
+-//
+-// 0.8 only as HandleStateChange does this in both versions
+-//-----------------------------------------------------------------------------
+-#if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR < 10
+-extern "C" {
+-static void gst_state_change_callback(GstElement *play,
+-                                      GstElementState oldstate,
+-                                      GstElementState newstate,
+-                                      wxGStreamerMediaBackend* be)
+-{
+-    if(be->m_asynclock.TryLock() == wxMUTEX_NO_ERROR)
+-    {
+-        be->HandleStateChange(oldstate, newstate);
+-        be->m_asynclock.Unlock();
+-    }
+-}
+-}
+-#endif // <0.10
+-
+-//-----------------------------------------------------------------------------
+ // "eos" from m_playbin/GST_MESSAGE_EOS
+ //
+ // Called by gstreamer when the media is done playing ("end of stream")
+@@ -425,69 +356,17 @@ static void gst_notify_caps_callback(Gst
+ }
+ 
+ //-----------------------------------------------------------------------------
+-// "notify::stream-info" from m_playbin
+-//
+-// Run through the stuff in "stream-info" of m_playbin for a valid
+-// video pad, and then attempt to query the video size from it - if not
+-// set up an event to do so when ready.
+-//
+-// Currently unused - now we just query it directly using
+-// QueryVideoSizeFromElement.
+-//
+-// (Undocumented?)
+-//-----------------------------------------------------------------------------
+-#if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10
+-extern "C" {
+-static void gst_notify_stream_info_callback(GstElement* WXUNUSED(element),
+-                                            GParamSpec* WXUNUSED(pspec),
+-                                            wxGStreamerMediaBackend* be)
+-{
+-    wxLogTrace(wxTRACE_GStreamer, wxT("gst_notify_stream_info_callback"));
+-    be->QueryVideoSizeFromElement(be->m_playbin);
+-}
+-}
+-#endif
+-
+-//-----------------------------------------------------------------------------
+-// "desired-size-changed" from m_xoverlay
+-//
+-// 0.8-specific this provides us with the video size when it changes -
+-// even though we get the caps as well this seems to come before the
+-// caps notification does...
+-//
+-// Note it will return 16,16 for an early-bird value or for audio
+-//-----------------------------------------------------------------------------
+-#if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR < 10
+-extern "C" {
+-static void gst_desired_size_changed_callback(GstElement * play,
+-                                              guint width, guint height,
+-                                              wxGStreamerMediaBackend* be)
+-{
+-    if(!(width == 16 && height == 16))
+-    {
+-        be->m_videoSize.x = width;
+-        be->m_videoSize.y = height;
+-    }
+-    else
+-        be->QueryVideoSizeFromElement(be->m_playbin);
+-}
+-}
+-#endif
+-
+-//-----------------------------------------------------------------------------
+ // gst_bus_async_callback [static]
+ // gst_bus_sync_callback [static]
+ //
+-// Called by m_playbin for notifications such as end-of-stream in 0.10 -
+-// in previous versions g_signal notifications were used. Because everything
++// Called by m_playbin for notifications such as end-of-stream. Because everything
+ // in centered in one switch statement though it reminds one of old WinAPI
+ // stuff.
+ //
+ // gst_bus_sync_callback is that sync version that is called on the main GUI
+ // thread before the async version that we use to set the xwindow id of the
+-// XOverlay (NB: This isn't currently used - see CreateControl()).
++// VideoOverlay (NB: This isn't currently used - see CreateControl()).
+ //-----------------------------------------------------------------------------
+-#if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10
+ extern "C" {
+ static gboolean gst_bus_async_callback(GstBus* WXUNUSED(bus),
+                                        GstMessage* message,
+@@ -537,8 +416,7 @@ static GstBusSyncReply gst_bus_sync_call
+ {
+     // Pass a non-xwindowid-setting event on to the async handler where it
+     // belongs
+-    if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT ||
+-        !gst_structure_has_name (message->structure, "prepare-xwindow-id"))
++    if (!gst_is_video_overlay_prepare_window_handle_message (message))
+     {
+         //
+         // NB: Unfortunately, the async callback can be quite
+@@ -552,12 +430,11 @@ static GstBusSyncReply gst_bus_sync_call
+             return GST_BUS_DROP;
+     }
+ 
+-    wxLogTrace(wxTRACE_GStreamer, wxT("Got prepare-xwindow-id"));
+-    be->SetupXOverlay();
++    wxLogTrace(wxTRACE_GStreamer, wxT("Got prepare-window-handle"));
++    be->SetupVideoOverlay();
+     return GST_BUS_DROP; // We handled this message - drop from the queue
+ }
+ }
+-#endif
+ 
+ //-----------------------------------------------------------------------------
+ //
+@@ -569,11 +446,11 @@ static GstBusSyncReply gst_bus_sync_call
+ // wxGStreamerMediaBackend::HandleStateChange
+ //
+ // Handles a state change event from our C Callback for "state-change" or
+-// the async queue in 0.10. (Mostly this is here to avoid locking the
++// the async queue . (Mostly this is here to avoid locking the
+ // the mutex twice...)
+ //-----------------------------------------------------------------------------
+-void wxGStreamerMediaBackend::HandleStateChange(GstElementState oldstate,
+-                                                GstElementState newstate)
++void wxGStreamerMediaBackend::HandleStateChange(GstState oldstate,
++                                                GstState newstate)
+ {
+     switch(newstate)
+     {
+@@ -604,83 +481,13 @@ void wxGStreamerMediaBackend::HandleStat
+ }
+ 
+ //-----------------------------------------------------------------------------
+-// wxGStreamerMediaBackend::QueryVideoSizeFromElement
+-//
+-// Run through the stuff in "stream-info" of element for a valid
+-// video pad, and then attempt to query the video size from it - if not
+-// set up an event to do so when ready. Return true
+-// if we got a valid video pad.
+-//-----------------------------------------------------------------------------
+-bool wxGStreamerMediaBackend::QueryVideoSizeFromElement(GstElement* element)
+-{
+-    const GList *list = NULL;
+-    g_object_get (G_OBJECT (element), "stream-info", &list, NULL);
+-
+-    for ( ; list != NULL; list = list->next)
+-    {
+-        GObject *info = (GObject *) list->data;
+-        gint type;
+-        GParamSpec *pspec;
+-        GEnumValue *val;
+-        GstPad *pad = NULL;
+-
+-        g_object_get (info, "type", &type, NULL);
+-        pspec = g_object_class_find_property (
+-                        G_OBJECT_GET_CLASS (info), "type");
+-        val = g_enum_get_value (G_PARAM_SPEC_ENUM (pspec)->enum_class, type);
+-
+-        if (!strncasecmp(val->value_name, "video", 5) ||
+-            !strncmp(val->value_name, "GST_STREAM_TYPE_VIDEO", 21))
+-        {
+-            // Newer gstreamer 0.8+ plugins are SUPPOSED to have "object"...
+-            // but a lot of old plugins still use "pad" :)
+-            pspec = g_object_class_find_property (
+-                        G_OBJECT_GET_CLASS (info), "object");
+-
+-            if (!pspec)
+-                g_object_get (info, "pad", &pad, NULL);
+-            else
+-                g_object_get (info, "object", &pad, NULL);
+-
+-#if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR <= 8
+-            // Killed in 0.9, presumely because events and such
+-            // should be pushed on pads regardless of whether they
+-            // are currently linked
+-            pad = (GstPad *) GST_PAD_REALIZE (pad);
+-            wxASSERT(pad);
+-#endif
+-
+-            if(!QueryVideoSizeFromPad(pad))
+-            {
+-                // wait for those caps to get ready
+-                g_signal_connect(
+-                pad,
+-                "notify::caps",
+-                G_CALLBACK(gst_notify_caps_callback),
+-                this);
+-            }
+-            break;
+-        }// end if video
+-    }// end searching through info list
+-
+-    // no video (or extremely delayed stream-info)
+-    if(list == NULL)
+-    {
+-        m_videoSize = wxSize(0,0);
+-        return false;
+-    }
+-
+-    return true;
+-}
+-
+-//-----------------------------------------------------------------------------
+ // wxGStreamerMediaBackend::QueryVideoSizeFromPad
+ //
+ // Gets the size of our video (in wxSize) from a GstPad
+ //-----------------------------------------------------------------------------
+ bool wxGStreamerMediaBackend::QueryVideoSizeFromPad(GstPad* pad)
+ {
+-    const GstCaps* caps = GST_PAD_CAPS(pad);
++    GstCaps* caps = gst_pad_get_current_caps(pad);
+     if ( caps )
+     {
+         const GstStructure *s = gst_caps_get_structure (caps, 0);
+@@ -706,23 +513,26 @@ bool wxGStreamerMediaBackend::QueryVideo
+                 m_videoSize.y = (int) ((float) den * m_videoSize.y / num);
+         }
+ 
+-         wxLogTrace(wxTRACE_GStreamer, wxT("Adjusted video size: [%i,%i]"),
+-                     m_videoSize.x, m_videoSize.y);
++        wxLogTrace(wxTRACE_GStreamer, wxT("Adjusted video size: [%i,%i]"),
++                    m_videoSize.x, m_videoSize.y);
++
++        gst_caps_unref (caps);
+         return true;
+     } // end if caps
+ 
++    m_videoSize = wxSize(0,0);
+     return false; // not ready/massive failure
+ }
+ 
+ //-----------------------------------------------------------------------------
+-// wxGStreamerMediaBackend::SetupXOverlay
++// wxGStreamerMediaBackend::SetupVideoOverlay
+ //
+-// Attempts to set the XWindow id of our GstXOverlay to tell it which
++// Attempts to set the XWindow id of our GstVideoOverlay to tell it which
+ // window to play video in.
+ //-----------------------------------------------------------------------------
+-void wxGStreamerMediaBackend::SetupXOverlay()
++void wxGStreamerMediaBackend::SetupVideoOverlay()
+ {
+-    // Use the xoverlay extension to tell gstreamer to play in our window
++    // Use the videooverlay extension to tell gstreamer to play in our window
+ #ifdef __WXGTK__
+     if (!gtk_widget_get_realized(m_ctrl->m_wxwindow))
+     {
+@@ -739,7 +549,7 @@ void wxGStreamerMediaBackend::SetupXOver
+         GdkWindow* window = gtk_widget_get_window(m_ctrl->m_wxwindow);
+         wxASSERT(window);
+ #endif
+-        gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(m_xoverlay),
++        gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(m_videooverlay),
+ #ifdef __WXGTK__
+                         GDK_WINDOW_XID(window)
+ #else
+@@ -769,9 +579,8 @@ void wxGStreamerMediaBackend::SetupXOver
+ //
+ // PRECONDITION: Assumes m_asynclock is Lock()ed
+ //-----------------------------------------------------------------------------
+-#if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10
+ bool wxGStreamerMediaBackend::SyncStateChange(GstElement* element,
+-                                              GstElementState desiredstate,
++                                              GstState desiredstate,
+                                               gint64 llTimeout)
+ {
+     GstBus* bus = gst_element_get_bus(element);
+@@ -844,23 +653,6 @@ bool wxGStreamerMediaBackend::SyncStateC
+ 
+     return bSuccess;
+ }
+-#else // 0.8 implementation
+-bool wxGStreamerMediaBackend::SyncStateChange(GstElement* element,
+-                                              GstElementState desiredstate,
+-                                              gint64 llTimeout)
+-{
+-    gint64 llTimeWaited = 0;
+-    while(GST_STATE(element) != desiredstate)
+-    {
+-        if(llTimeWaited >= llTimeout)
+-            break;
+-        llTimeWaited += 10*GST_MSECOND;
+-        wxMilliSleep(10);
+-    }
+-
+-    return llTimeWaited != llTimeout;
+-}
+-#endif
+ 
+ //-----------------------------------------------------------------------------
+ // wxGStreamerMediaBackend::TryAudioSink
+@@ -884,25 +676,25 @@ bool wxGStreamerMediaBackend::TryAudioSi
+ 
+ bool wxGStreamerMediaBackend::TryVideoSink(GstElement* videosink)
+ {
+-    // Check if the video sink either is an xoverlay or might contain one...
+-    if( !GST_IS_BIN(videosink) && !GST_IS_X_OVERLAY(videosink) )
++    // Check if the video sink either is an videooverlay or might contain one...
++    if( !GST_IS_BIN(videosink) && !GST_IS_VIDEO_OVERLAY(videosink) )
+     {
+         if(G_IS_OBJECT(videosink))
+             g_object_unref(videosink);
+         return false;
+     }
+ 
+-    // Make our video sink and make sure it supports the x overlay interface
+-    // the x overlay enables us to put the video in our control window
++    // Make our video sink and make sure it supports the video overlay interface
++    // the video overlay enables us to put the video in our control window
+     // (i.e. we NEED it!) - also connect to the natural video size change event
+     if( GST_IS_BIN(videosink) )
+-        m_xoverlay = (GstXOverlay*)
++        m_videooverlay = (GstVideoOverlay*)
+                         gst_bin_get_by_interface (GST_BIN (videosink),
+-                                                  GST_TYPE_X_OVERLAY);
++                                                  GST_TYPE_VIDEO_OVERLAY);
+     else
+-        m_xoverlay = (GstXOverlay*) videosink;
++        m_videooverlay = (GstVideoOverlay*) videosink;
+ 
+-    if ( !GST_IS_X_OVERLAY(m_xoverlay) )
++    if ( !GST_IS_VIDEO_OVERLAY(m_videooverlay) )
+     {
+         g_object_unref(videosink);
+         return false;
+@@ -1046,11 +838,7 @@ bool wxGStreamerMediaBackend::CreateCont
+     //Really init gstreamer
+     gboolean bInited;
+     GError* error = NULL;
+-#if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10
+     bInited = gst_init_check(&argcGST, &argvGST, &error);
+-#else
+-    bInited = gst_init_check(&argcGST, &argvGST);
+-#endif
+ 
+     // Cleanup arguments for unicode case
+ #if wxUSE_UNICODE
+@@ -1117,78 +905,52 @@ bool wxGStreamerMediaBackend::CreateCont
+         return false;
+     }
+ 
+-#if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR < 10
+-    // Connect the glib events/callbacks we want to our playbin
+-    g_signal_connect(m_playbin, "eos",
+-                     G_CALLBACK(gst_finish_callback), this);
+-    g_signal_connect(m_playbin, "error",
+-                     G_CALLBACK(gst_error_callback), this);
+-    g_signal_connect(m_playbin, "state-change",
+-                     G_CALLBACK(gst_state_change_callback), this);
+-#else
+-    // GStreamer 0.10+ uses GstBus for this now, connect to the sync
+-    // handler as well so we can set the X window id of our xoverlay
++    // GStreamer uses GstBus for this now, connect to the sync
++    // handler as well so we can set the video window id of our videooverlay
+     gst_bus_add_watch (gst_element_get_bus(m_playbin),
+                        (GstBusFunc) gst_bus_async_callback, this);
+     gst_bus_set_sync_handler(gst_element_get_bus(m_playbin),
+-                             (GstBusSyncHandler) gst_bus_sync_callback, this);
+-    g_signal_connect(m_playbin, "notify::stream-info",
+-                     G_CALLBACK(gst_notify_stream_info_callback), this);
+-#endif
++                             (GstBusSyncHandler) gst_bus_sync_callback, this, NULL);
+ 
+     // Get the audio sink
+-    GstElement* audiosink = gst_gconf_get_default_audio_sink();
++    // Use autodetection, then alsa, then oss as a stopgap
++    GstElement* audiosink = gst_element_factory_make ("autoaudiosink", "audio-sink");
+     if( !TryAudioSink(audiosink) )
+     {
+-        // fallback to autodetection, then alsa, then oss as a stopgap
+-        audiosink = gst_element_factory_make ("autoaudiosink", "audio-sink");
++        audiosink = gst_element_factory_make ("alsasink", "alsa-output");
+         if( !TryAudioSink(audiosink) )
+         {
+-            audiosink = gst_element_factory_make ("alsasink", "alsa-output");
++            audiosink = gst_element_factory_make ("osssink", "play_audio");
+             if( !TryAudioSink(audiosink) )
+             {
+-                audiosink = gst_element_factory_make ("osssink", "play_audio");
+-                if( !TryAudioSink(audiosink) )
+-                {
+-                    wxLogSysError(wxT("Could not find a valid audiosink"));
+-                    return false;
+-                }
++                wxLogSysError(wxT("Could not find a valid audiosink"));
++                return false;
+             }
+         }
+     }
+ 
+     // Setup video sink - first try gconf, then auto, then xvimage and
+     // then finally plain ximage
+-    GstElement* videosink = gst_gconf_get_default_video_sink();
++    GstElement* videosink = gst_element_factory_make ("autovideosink", "video-sink");
+     if( !TryVideoSink(videosink) )
+     {
+-        videosink = gst_element_factory_make ("autovideosink", "video-sink");
++        videosink = gst_element_factory_make ("xvimagesink", "video-sink");
+         if( !TryVideoSink(videosink) )
+         {
+-            videosink = gst_element_factory_make ("xvimagesink", "video-sink");
++            // finally, do a final fallback to ximagesink
++            videosink =
++                gst_element_factory_make ("ximagesink", "video-sink");
+             if( !TryVideoSink(videosink) )
+             {
+-                // finally, do a final fallback to ximagesink
+-                videosink =
+-                    gst_element_factory_make ("ximagesink", "video-sink");
+-                if( !TryVideoSink(videosink) )
+-                {
+-                    g_object_unref(audiosink);
+-                    wxLogSysError(wxT("Could not find a suitable video sink"));
+-                    return false;
+-                }
++                g_object_unref(audiosink);
++                wxLogSysError(wxT("Could not find a suitable video sink"));
++                return false;
+             }
+         }
+     }
+ 
+-#if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR < 10
+-    // Not on 0.10... called when video size changes
+-    g_signal_connect(m_xoverlay, "desired-size-changed",
+-                     G_CALLBACK(gst_desired_size_changed_callback), this);
+-#endif
+-    // Tell GStreamer which window to draw to in 0.8 - 0.10
+-    // sometimes needs this too...
+-    SetupXOverlay();
++    // Tell GStreamer which window to draw to
++    SetupVideoOverlay();
+ 
+     // Now that we know (or, rather think) our video and audio sink
+     // are valid set our playbin to use them
+@@ -1197,6 +959,10 @@ bool wxGStreamerMediaBackend::CreateCont
+                   "audio-sink", audiosink,
+                    NULL);
+ 
++    GstPad *video_sinkpad = gst_element_get_static_pad (videosink, "sink");
++    g_signal_connect (video_sinkpad, "notify::caps", G_CALLBACK (gst_notify_caps_callback), this);
++    gst_object_unref (video_sinkpad);
++
+     m_eventHandler = new wxGStreamerMediaEventHandler(this);
+     return true;
+ }
+@@ -1213,26 +979,10 @@ bool wxGStreamerMediaBackend::Load(const
+ 
+ //-----------------------------------------------------------------------------
+ // wxGStreamerMediaBackend::Load (URI version)
+-//
+-// In the case of a file URI passes it unencoded -
+-// also, as of 0.10.3 and earlier GstURI (the uri parser for gstreamer)
+-// is sort of broken and only accepts uris with at least two slashes
+-// after the scheme (i.e. file: == not ok, file:// == ok)
+ //-----------------------------------------------------------------------------
+ bool wxGStreamerMediaBackend::Load(const wxURI& location)
+ {
+-    if(location.GetScheme().CmpNoCase(wxT("file")) == 0)
+-    {
+-        wxString uristring = location.BuildUnescapedURI();
+-
+-        //Workaround GstURI leading "//" problem and make sure it leads
+-        //with that
+-        return DoLoad(wxString(wxT("file://")) +
+-                      uristring.Right(uristring.length() - 5)
+-                     );
+-    }
+-    else
+-        return DoLoad(location.BuildURI());
++    return DoLoad(location.BuildURI());
+ }
+ 
+ //-----------------------------------------------------------------------------
+@@ -1258,7 +1008,7 @@ bool wxGStreamerMediaBackend::DoLoad(con
+ 
+     // Set playbin to ready to stop the current media...
+     if( gst_element_set_state (m_playbin,
+-                               GST_STATE_READY) == GST_STATE_FAILURE ||
++                               GST_STATE_READY) == GST_STATE_CHANGE_FAILURE ||
+         !SyncStateChange(m_playbin, GST_STATE_READY))
+     {
+         CheckForErrors();
+@@ -1281,7 +1031,7 @@ bool wxGStreamerMediaBackend::DoLoad(con
+     // Try to pause media as gstreamer won't let us query attributes
+     // such as video size unless it is paused or playing
+     if( gst_element_set_state (m_playbin,
+-                               GST_STATE_PAUSED) == GST_STATE_FAILURE ||
++                               GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE ||
+         !SyncStateChange(m_playbin, GST_STATE_PAUSED))
+     {
+         CheckForErrors();
+@@ -1307,12 +1057,11 @@ bool wxGStreamerMediaBackend::DoLoad(con
+ //
+ // Sets the stream to a playing state
+ //
+-// THREAD-UNSAFE in 0.8, maybe in 0.10 as well
+ //-----------------------------------------------------------------------------
+ bool wxGStreamerMediaBackend::Play()
+ {
+     if (gst_element_set_state (m_playbin,
+-                               GST_STATE_PLAYING) == GST_STATE_FAILURE)
++                               GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE)
+     {
+         CheckForErrors();
+         return false;
+@@ -1326,13 +1075,12 @@ bool wxGStreamerMediaBackend::Play()
+ //
+ // Marks where we paused and pauses the stream
+ //
+-// THREAD-UNSAFE in 0.8, maybe in 0.10 as well
+ //-----------------------------------------------------------------------------
+ bool wxGStreamerMediaBackend::Pause()
+ {
+     m_llPausedPos = wxGStreamerMediaBackend::GetPosition();
+     if (gst_element_set_state (m_playbin,
+-                               GST_STATE_PAUSED) == GST_STATE_FAILURE)
++                               GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE)
+     {
+         CheckForErrors();
+         return false;
+@@ -1353,7 +1101,7 @@ bool wxGStreamerMediaBackend::Stop()
+     {   // begin state lock
+         wxMutexLocker lock(m_asynclock);
+         if(gst_element_set_state (m_playbin,
+-                                  GST_STATE_PAUSED) == GST_STATE_FAILURE ||
++                                  GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE ||
+           !SyncStateChange(m_playbin, GST_STATE_PAUSED))
+         {
+             CheckForErrors();
+@@ -1417,10 +1165,8 @@ wxLongLong wxGStreamerMediaBackend::GetP
+     else
+     {
+         gint64 pos;
+-        GstFormat fmtTime = GST_FORMAT_TIME;
+ 
+-        if (!wxGst_element_query_position(m_playbin, &fmtTime, &pos) ||
+-            fmtTime != GST_FORMAT_TIME || pos == -1)
++        if (!gst_element_query_position(m_playbin, GST_FORMAT_TIME, &pos) || pos == -1)
+             return 0;
+         return pos / GST_MSECOND ;
+     }
+@@ -1438,44 +1184,21 @@ wxLongLong wxGStreamerMediaBackend::GetP
+ // This is also an exceedingly ugly function due to the three implementations
+ // (or, rather two plus one implementation without a seek function).
+ //
+-// This is asynchronous and thread-safe on both 0.8 and 0.10.
+-//
+ // NB: This fires both a stop and play event if the media was previously
+ // playing... which in some ways makes sense. And yes, this makes the video
+ // go all haywire at times - a gstreamer bug...
+ //-----------------------------------------------------------------------------
+ bool wxGStreamerMediaBackend::SetPosition(wxLongLong where)
+ {
+-#if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR == 8 \
+-                           && GST_VERSION_MICRO == 0
+-    // 0.8.0 has no gst_element_seek according to official docs!!!
+-    wxLogSysError(wxT("GStreamer 0.8.0 does not have gst_element_seek")
+-                  wxT(" according to official docs"));
+-    return false;
+-#else // != 0.8.0
+-
+-#   if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10
+-        gst_element_seek (m_playbin, m_dRate, GST_FORMAT_TIME,
++    if ( gst_element_seek (m_playbin, m_dRate, GST_FORMAT_TIME,
+            (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
+                           GST_SEEK_TYPE_SET, where.GetValue() * GST_MSECOND,
+-                          GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE );
+-#   else
+-        // NB: Some gstreamer versions return false basically all the time
+-        // here - even totem doesn't bother to check the return value here
+-        // so I guess we'll just assume it worked -
+-        // TODO: maybe check the gst error callback???
+-        gst_element_seek (m_playbin, (GstSeekType) (GST_SEEK_METHOD_SET |
+-            GST_FORMAT_TIME | GST_SEEK_FLAG_FLUSH),
+-            where.GetValue() * GST_MSECOND );
+-
+-#   endif // GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10
+-
++                          GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE ) )
+     {
+         m_llPausedPos = where;
+         return true;
+     }
+-    return true;
+-#endif //== 0.8.0
++    return false;
+ }
+ 
+ //-----------------------------------------------------------------------------
+@@ -1487,10 +1210,8 @@ bool wxGStreamerMediaBackend::SetPositio
+ wxLongLong wxGStreamerMediaBackend::GetDuration()
+ {
+     gint64 length;
+-    GstFormat fmtTime = GST_FORMAT_TIME;
+ 
+-    if(!wxGst_element_query_duration(m_playbin, &fmtTime, &length) ||
+-       fmtTime != GST_FORMAT_TIME || length == -1)
++    if(!gst_element_query_duration(m_playbin, GST_FORMAT_TIME, &length) || length == -1)
+         return 0;
+     return length / GST_MSECOND ;
+ }
+@@ -1512,7 +1233,7 @@ void wxGStreamerMediaBackend::Move(int W
+ // wxGStreamerMediaBackend::GetVideoSize
+ //
+ // Returns our cached video size from Load/gst_notify_caps_callback
+-// gst_x_overlay_get_desired_size also does this in 0.8...
++// gst_video_overlay_get_desired_size also does this in 0.8...
+ //-----------------------------------------------------------------------------
+ wxSize wxGStreamerMediaBackend::GetVideoSize() const
+ {
+@@ -1539,9 +1260,8 @@ wxSize wxGStreamerMediaBackend::GetVideo
+ //TODO: forcing frame/samplerates, see audioscale and videorate. Audioscale is
+ //TODO: part of playbin.
+ //
+-// In 0.10 GStreamer has new gst_element_seek API that might
+-// support this - and I've got an attempt to do so but it is untested
+-// but it would appear to work...
++// In has new gst_element_seek API that supports this - and I've got an attempt
++// to do so but it is untested but it would appear to work...
+ //-----------------------------------------------------------------------------
+ double wxGStreamerMediaBackend::GetPlaybackRate()
+ {
+@@ -1552,7 +1272,6 @@ double wxGStreamerMediaBackend::GetPlayb
+ 
+ bool wxGStreamerMediaBackend::SetPlaybackRate(double dRate)
+ {
+-#if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10
+ #if 0 // not tested enough
+     if( gst_element_seek (m_playbin, dRate, GST_FORMAT_TIME,
+                  (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
+@@ -1565,7 +1284,6 @@ bool wxGStreamerMediaBackend::SetPlaybac
+ #else
+     wxUnusedVar(dRate);
+ #endif
+-#endif
+ 
+     // failure
+     return false;
+@@ -1593,10 +1311,8 @@ wxLongLong wxGStreamerMediaBackend::GetD
+ wxLongLong wxGStreamerMediaBackend::GetDownloadTotal()
+ {
+     gint64 length;
+-    GstFormat fmtBytes = GST_FORMAT_BYTES;
+ 
+-    if (!wxGst_element_query_duration(m_playbin, &fmtBytes, &length) ||
+-          fmtBytes != GST_FORMAT_BYTES || length == -1)
++    if (!gst_element_query_duration(m_playbin, GST_FORMAT_BYTES, &length) || length == -1)
+         return 0;
+     return length;
+ }



More information about the arch-commits mailing list