Add support for GStreamer 1.x in Unix wxMediaCtrl implementation

Do it while keeping both 0.8 and 0.10 support, unlike the commit d0ef5d7,
which this is based on, that removed support for 0.8.

Closes https://github.com/wxWidgets/wxWidgets/pull/400
This commit is contained in:
Scott Talbert
2017-01-22 15:56:50 -05:00
committed by Vadim Zeitlin
parent c047751abf
commit 501b377435
3 changed files with 239 additions and 33 deletions

114
configure vendored
View File

@@ -37321,8 +37321,8 @@ if test "$wxUSE_MEDIACTRL" = "yes" -o "$wxUSE_MEDIACTRL" = "auto"; then
if test "$wxUSE_GTK" = 1; then if test "$wxUSE_GTK" = 1; then
wxUSE_GSTREAMER="no" wxUSE_GSTREAMER="no"
GST_VERSION_MAJOR=0 GST_VERSION_MAJOR=1
GST_VERSION_MINOR=10 GST_VERSION_MINOR=0
GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR
if test "$wxUSE_GSTREAMER8" = "no"; then if test "$wxUSE_GSTREAMER8" = "no"; then
@@ -37331,6 +37331,93 @@ pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST" >&5
$as_echo_n "checking for GST... " >&6; } $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\""; } >&5
($PKG_CONFIG --exists --print-errors "gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION") 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" 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\""; } >&5
($PKG_CONFIG --exists --print-errors "gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION") 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" 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"`
else
GST_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION"`
fi
# Put the nasty error message in config.log where it belongs
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: 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
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: 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
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"
fi
if test $GST_VERSION_MINOR = "10"; 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 "$PKG_CONFIG"; then
if test -n "$GST_CFLAGS"; then if test -n "$GST_CFLAGS"; then
pkg_cv_GST_CFLAGS="$GST_CFLAGS" pkg_cv_GST_CFLAGS="$GST_CFLAGS"
@@ -37386,16 +37473,14 @@ fi
echo "$GST_PKG_ERRORS" >&5 echo "$GST_PKG_ERRORS" >&5
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 0.10 not available, falling back to 0.8" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 0.10 not available, falling back to 0.8" >&5
$as_echo "$as_me: WARNING: GStreamer 0.10 not available, falling back to 0.8" >&2;} $as_echo "$as_me: WARNING: GStreamer 0.10 not available, falling back to 0.8" >&2;}
GST_VERSION_MINOR=8
elif test $pkg_failed = untried; then elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 0.10 not available, falling back to 0.8" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 0.10 not available, falling back to 0.8" >&5
$as_echo "$as_me: WARNING: GStreamer 0.10 not available, falling back to 0.8" >&2;} $as_echo "$as_me: WARNING: GStreamer 0.10 not available, falling back to 0.8" >&2;}
GST_VERSION_MINOR=8
else else
@@ -37404,12 +37489,15 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
wxUSE_GSTREAMER="yes" wxUSE_GSTREAMER="yes"
GST_LIBS="$GST_LIBS -lgstinterfaces-$GST_VERSION" GST_LIBS="$GST_LIBS -lgstinterfaces-$GST_VERSION"
fi fi
fi
else else
GST_VERSION_MINOR=8 GST_VERSION_MAJOR=0
GST_VERSION_MINOR=8
fi fi
if test $GST_VERSION_MINOR = "8"; then if test $GST_VERSION_MINOR = "8"; then
@@ -37474,13 +37562,13 @@ fi
echo "$GST_PKG_ERRORS" >&5 echo "$GST_PKG_ERRORS" >&5
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 0.8/0.10 not available." >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 0.8/0.10/1.0 not available." >&5
$as_echo "$as_me: WARNING: GStreamer 0.8/0.10 not available." >&2;} $as_echo "$as_me: WARNING: GStreamer 0.8/0.10/1.0 not available." >&2;}
elif test $pkg_failed = untried; then elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 0.8/0.10 not available." >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GStreamer 0.8/0.10/1.0 not available." >&5
$as_echo "$as_me: WARNING: GStreamer 0.8/0.10 not available." >&2;} $as_echo "$as_me: WARNING: GStreamer 0.8/0.10/1.0 not available." >&2;}
else else
GST_CFLAGS=$pkg_cv_GST_CFLAGS GST_CFLAGS=$pkg_cv_GST_CFLAGS

View File

@@ -7548,27 +7548,43 @@ if test "$wxUSE_MEDIACTRL" = "yes" -o "$wxUSE_MEDIACTRL" = "auto"; then
dnl Test for at least 0.8 gstreamer module from pkg-config dnl Test for at least 0.8 gstreamer module from pkg-config
dnl Even totem doesn't accept 0.9 evidently. dnl Even totem doesn't accept 0.9 evidently.
dnl dnl
dnl So, we first check to see if 0.10 if available - if not we dnl So, we first check to see if 1.0 if available - if not we
dnl try the older 0.8 version dnl try the older 0.10 and 0.8 versions
dnl ------------------------------------------------------------------- dnl -------------------------------------------------------------------
GST_VERSION_MAJOR=0 GST_VERSION_MAJOR=1
GST_VERSION_MINOR=10 GST_VERSION_MINOR=0
GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR
if test "$wxUSE_GSTREAMER8" = "no"; then if test "$wxUSE_GSTREAMER8" = "no"; then
PKG_CHECK_MODULES(GST, PKG_CHECK_MODULES(GST,
[gstreamer-$GST_VERSION gstreamer-plugins-base-$GST_VERSION], [gstreamer-$GST_VERSION gstreamer-video-$GST_VERSION],
[ [
wxUSE_GSTREAMER="yes" wxUSE_GSTREAMER="yes"
GST_LIBS="$GST_LIBS -lgstinterfaces-$GST_VERSION"
], ],
[ [
AC_MSG_WARN([GStreamer 0.10 not available, falling back to 0.8]) AC_MSG_WARN([GStreamer 1.0 not available, falling back to 0.10])
GST_VERSION_MINOR=8 GST_VERSION_MAJOR=0
GST_VERSION_MINOR=10
GST_VERSION=$GST_VERSION_MAJOR.$GST_VERSION_MINOR
] ]
) )
if test $GST_VERSION_MINOR = "10"; 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])
]
)
fi
else else
dnl check only for 0.8 dnl check only for 0.8
GST_VERSION_MAJOR=0
GST_VERSION_MINOR=8 GST_VERSION_MINOR=8
fi fi
@@ -7578,7 +7594,7 @@ if test "$wxUSE_MEDIACTRL" = "yes" -o "$wxUSE_MEDIACTRL" = "auto"; then
[gstreamer-$GST_VERSION gstreamer-interfaces-$GST_VERSION gstreamer-gconf-$GST_VERSION], [gstreamer-$GST_VERSION gstreamer-interfaces-$GST_VERSION gstreamer-gconf-$GST_VERSION],
wxUSE_GSTREAMER="yes", wxUSE_GSTREAMER="yes",
[ [
AC_MSG_WARN([GStreamer 0.8/0.10 not available.]) AC_MSG_WARN([GStreamer 0.8/0.10/1.0 not available.])
]) ])
fi fi

View File

@@ -20,7 +20,9 @@
#include <gst/gst.h> // main gstreamer header #include <gst/gst.h> // main gstreamer header
// xoverlay/video stuff, gst-gconf for 0.8 // xoverlay/video stuff, gst-gconf for 0.8
#if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10 #if GST_VERSION_MAJOR > 0
# include <gst/video/video.h>
#elif GST_VERSION_MINOR >= 10
# include <gst/interfaces/xoverlay.h> # include <gst/interfaces/xoverlay.h>
#else #else
# include <gst/xoverlay/xoverlay.h> # include <gst/xoverlay/xoverlay.h>
@@ -48,8 +50,8 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/* /*
This is the GStreamer backend for unix. Currently we require 0.8 or This is the GStreamer backend for unix. Currently we require 0.8, 0.10, or
0.10. Here we use the "playbin" GstElement for ease of use. 1.0. Here we use the "playbin" GstElement for ease of use.
Note that now we compare state change functions to GST_STATE_FAILURE Note that now we compare state change functions to GST_STATE_FAILURE
now rather than GST_STATE_SUCCESS as newer gstreamer versions return now rather than GST_STATE_SUCCESS as newer gstreamer versions return
@@ -203,7 +205,11 @@ public:
double m_dRate; // Current playback rate - double m_dRate; // Current playback rate -
// see GetPlaybackRate for notes // see GetPlaybackRate for notes
wxLongLong m_llPausedPos; // Paused position - see Pause() wxLongLong m_llPausedPos; // Paused position - see Pause()
#if GST_VERSION_MAJOR > 0
GstVideoOverlay* m_xoverlay; // X Overlay that contains the GST video
#else
GstXOverlay* m_xoverlay; // X Overlay that contains the GST video GstXOverlay* m_xoverlay; // X Overlay that contains the GST video
#endif
wxMutex m_asynclock; // See "discussion of internals" wxMutex m_asynclock; // See "discussion of internals"
class wxGStreamerMediaEventHandler* m_eventHandler; // see below class wxGStreamerMediaEventHandler* m_eventHandler; // see below
@@ -294,7 +300,11 @@ expose_event(GtkWidget* widget, GdkEventExpose* event, wxGStreamerMediaBackend*
// GST Doesn't redraw automatically while paused // GST Doesn't redraw automatically while paused
// Plus, the video sometimes doesn't redraw when it looses focus // Plus, the video sometimes doesn't redraw when it looses focus
// or is painted over so we just tell it to redraw... // or is painted over so we just tell it to redraw...
#if GST_VERSION_MAJOR > 0
gst_video_overlay_expose(be->m_xoverlay);
#else
gst_x_overlay_expose(be->m_xoverlay); gst_x_overlay_expose(be->m_xoverlay);
#endif
} }
else else
{ {
@@ -334,9 +344,15 @@ static gint gtk_window_realize_callback(GtkWidget* widget,
GdkWindow* window = gtk_widget_get_window(widget); GdkWindow* window = gtk_widget_get_window(widget);
wxASSERT(window); wxASSERT(window);
#if GST_VERSION_MAJOR > 0
gst_video_overlay_set_window_handle(be->m_xoverlay,
GDK_WINDOW_XID(window)
);
#else
gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay), gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay),
GDK_WINDOW_XID(window) GDK_WINDOW_XID(window)
); );
#endif
GtkWidget* w = be->GetControl()->m_wxwindow; GtkWidget* w = be->GetControl()->m_wxwindow;
#ifdef __WXGTK3__ #ifdef __WXGTK3__
g_signal_connect(w, "draw", G_CALLBACK(draw), be); g_signal_connect(w, "draw", G_CALLBACK(draw), be);
@@ -436,7 +452,7 @@ static void gst_notify_caps_callback(GstPad* pad,
// //
// (Undocumented?) // (Undocumented?)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10 #if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR >= 10
extern "C" { extern "C" {
static void gst_notify_stream_info_callback(GstElement* WXUNUSED(element), static void gst_notify_stream_info_callback(GstElement* WXUNUSED(element),
GParamSpec* WXUNUSED(pspec), GParamSpec* WXUNUSED(pspec),
@@ -537,8 +553,12 @@ static GstBusSyncReply gst_bus_sync_callback(GstBus* bus,
{ {
// Pass a non-xwindowid-setting event on to the async handler where it // Pass a non-xwindowid-setting event on to the async handler where it
// belongs // belongs
#if GST_VERSION_MAJOR > 0
if (!gst_is_video_overlay_prepare_window_handle_message (message))
#else
if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT || if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT ||
!gst_structure_has_name (message->structure, "prepare-xwindow-id")) !gst_structure_has_name (message->structure, "prepare-xwindow-id"))
#endif
{ {
// //
// NB: Unfortunately, the async callback can be quite // NB: Unfortunately, the async callback can be quite
@@ -603,6 +623,7 @@ void wxGStreamerMediaBackend::HandleStateChange(GstElementState oldstate,
} }
} }
#if GST_VERSION_MAJOR == 0
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxGStreamerMediaBackend::QueryVideoSizeFromElement // wxGStreamerMediaBackend::QueryVideoSizeFromElement
// //
@@ -672,6 +693,7 @@ bool wxGStreamerMediaBackend::QueryVideoSizeFromElement(GstElement* element)
return true; return true;
} }
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxGStreamerMediaBackend::QueryVideoSizeFromPad // wxGStreamerMediaBackend::QueryVideoSizeFromPad
@@ -680,7 +702,11 @@ bool wxGStreamerMediaBackend::QueryVideoSizeFromElement(GstElement* element)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool wxGStreamerMediaBackend::QueryVideoSizeFromPad(GstPad* pad) bool wxGStreamerMediaBackend::QueryVideoSizeFromPad(GstPad* pad)
{ {
#if GST_VERSION_MAJOR > 0
GstCaps* caps = gst_pad_get_current_caps(pad);
#else
const GstCaps* caps = GST_PAD_CAPS(pad); const GstCaps* caps = GST_PAD_CAPS(pad);
#endif
if ( caps ) if ( caps )
{ {
const GstStructure *s = gst_caps_get_structure (caps, 0); const GstStructure *s = gst_caps_get_structure (caps, 0);
@@ -706,11 +732,15 @@ bool wxGStreamerMediaBackend::QueryVideoSizeFromPad(GstPad* pad)
m_videoSize.y = (int) ((float) den * m_videoSize.y / num); m_videoSize.y = (int) ((float) den * m_videoSize.y / num);
} }
wxLogTrace(wxTRACE_GStreamer, wxT("Adjusted video size: [%i,%i]"), wxLogTrace(wxTRACE_GStreamer, wxT("Adjusted video size: [%i,%i]"),
m_videoSize.x, m_videoSize.y); m_videoSize.x, m_videoSize.y);
#if GST_VERSION_MAJOR > 0
gst_caps_unref (caps);
#endif
return true; return true;
} // end if caps } // end if caps
m_videoSize = wxSize(0,0);
return false; // not ready/massive failure return false; // not ready/massive failure
} }
@@ -739,7 +769,11 @@ void wxGStreamerMediaBackend::SetupXOverlay()
GdkWindow* window = gtk_widget_get_window(m_ctrl->m_wxwindow); GdkWindow* window = gtk_widget_get_window(m_ctrl->m_wxwindow);
wxASSERT(window); wxASSERT(window);
#endif #endif
#if GST_VERSION_MAJOR > 0
gst_video_overlay_set_window_handle(m_xoverlay,
#else
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(m_xoverlay), gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(m_xoverlay),
#endif
#ifdef __WXGTK__ #ifdef __WXGTK__
GDK_WINDOW_XID(window) GDK_WINDOW_XID(window)
#else #else
@@ -884,6 +918,31 @@ bool wxGStreamerMediaBackend::TryAudioSink(GstElement* audiosink)
bool wxGStreamerMediaBackend::TryVideoSink(GstElement* videosink) bool wxGStreamerMediaBackend::TryVideoSink(GstElement* videosink)
{ {
#if GST_VERSION_MAJOR > 0
// Check if the video sink either is an xoverlay 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
// (i.e. we NEED it!) - also connect to the natural video size change event
if( GST_IS_BIN(videosink) )
m_xoverlay = (GstVideoOverlay*)
gst_bin_get_by_interface (GST_BIN (videosink),
GST_TYPE_VIDEO_OVERLAY);
else
m_xoverlay = (GstVideoOverlay*) videosink;
if ( !GST_IS_VIDEO_OVERLAY(m_xoverlay) )
{
g_object_unref(videosink);
return false;
}
#else
// Check if the video sink either is an xoverlay or might contain one... // Check if the video sink either is an xoverlay or might contain one...
if( !GST_IS_BIN(videosink) && !GST_IS_X_OVERLAY(videosink) ) if( !GST_IS_BIN(videosink) && !GST_IS_X_OVERLAY(videosink) )
{ {
@@ -907,7 +966,7 @@ bool wxGStreamerMediaBackend::TryVideoSink(GstElement* videosink)
g_object_unref(videosink); g_object_unref(videosink);
return false; return false;
} }
#endif
return true; return true;
} }
@@ -1130,16 +1189,22 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
// handler as well so we can set the X window id of our xoverlay // handler as well so we can set the X window id of our xoverlay
gst_bus_add_watch (gst_element_get_bus(m_playbin), gst_bus_add_watch (gst_element_get_bus(m_playbin),
(GstBusFunc) gst_bus_async_callback, this); (GstBusFunc) gst_bus_async_callback, this);
#endif
#if GST_VERSION_MAJOR > 0
gst_bus_set_sync_handler(gst_element_get_bus(m_playbin),
(GstBusSyncHandler) gst_bus_sync_callback, this, NULL);
#else
gst_bus_set_sync_handler(gst_element_get_bus(m_playbin), gst_bus_set_sync_handler(gst_element_get_bus(m_playbin),
(GstBusSyncHandler) gst_bus_sync_callback, this); (GstBusSyncHandler) gst_bus_sync_callback, this);
g_signal_connect(m_playbin, "notify::stream-info",
G_CALLBACK(gst_notify_stream_info_callback), this);
#endif #endif
// Get the audio sink // Get the audio sink
GstElement* audiosink = gst_gconf_get_default_audio_sink(); GstElement* audiosink;
#if GST_VERSION_MAJOR == 0
audiosink = gst_gconf_get_default_audio_sink();
if( !TryAudioSink(audiosink) ) if( !TryAudioSink(audiosink) )
{ {
#endif
// fallback to autodetection, then alsa, then oss as a stopgap // fallback to autodetection, then alsa, then oss as a stopgap
audiosink = gst_element_factory_make ("autoaudiosink", "audio-sink"); audiosink = gst_element_factory_make ("autoaudiosink", "audio-sink");
if( !TryAudioSink(audiosink) ) if( !TryAudioSink(audiosink) )
@@ -1155,13 +1220,18 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
} }
} }
} }
#if GST_VERSION_MAJOR == 0
} }
#endif
// Setup video sink - first try gconf, then auto, then xvimage and // Setup video sink - first try gconf, then auto, then xvimage and
// then finally plain ximage // then finally plain ximage
GstElement* videosink = gst_gconf_get_default_video_sink(); GstElement* videosink;
#if GST_VERSION_MAJOR == 0
videosink = gst_gconf_get_default_video_sink();
if( !TryVideoSink(videosink) ) if( !TryVideoSink(videosink) )
{ {
#endif
videosink = gst_element_factory_make ("autovideosink", "video-sink"); videosink = gst_element_factory_make ("autovideosink", "video-sink");
if( !TryVideoSink(videosink) ) if( !TryVideoSink(videosink) )
{ {
@@ -1179,13 +1249,25 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
} }
} }
} }
#if GST_VERSION_MAJOR == 0
} }
#endif
#if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR < 10 #if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR < 10
// Not on 0.10... called when video size changes // Not on 0.10... called when video size changes
g_signal_connect(m_xoverlay, "desired-size-changed", g_signal_connect(m_xoverlay, "desired-size-changed",
G_CALLBACK(gst_desired_size_changed_callback), this); G_CALLBACK(gst_desired_size_changed_callback), this);
#endif #endif
#if GST_VERSION_MAJOR > 0
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);
#else
g_signal_connect(m_playbin, "notify::stream-info",
G_CALLBACK(gst_notify_stream_info_callback), this);
#endif
// Tell GStreamer which window to draw to in 0.8 - 0.10 // Tell GStreamer which window to draw to in 0.8 - 0.10
// sometimes needs this too... // sometimes needs this too...
SetupXOverlay(); SetupXOverlay();
@@ -1221,6 +1303,7 @@ bool wxGStreamerMediaBackend::Load(const wxString& fileName)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool wxGStreamerMediaBackend::Load(const wxURI& location) bool wxGStreamerMediaBackend::Load(const wxURI& location)
{ {
#if GST_VERSION_MAJOR == 0
if(location.GetScheme().CmpNoCase(wxT("file")) == 0) if(location.GetScheme().CmpNoCase(wxT("file")) == 0)
{ {
wxString uristring = location.BuildUnescapedURI(); wxString uristring = location.BuildUnescapedURI();
@@ -1232,6 +1315,7 @@ bool wxGStreamerMediaBackend::Load(const wxURI& location)
); );
} }
else else
#endif
return DoLoad(location.BuildURI()); return DoLoad(location.BuildURI());
} }
@@ -1417,11 +1501,17 @@ wxLongLong wxGStreamerMediaBackend::GetPosition()
else else
{ {
gint64 pos; gint64 pos;
#if GST_VERSION_MAJOR > 0
if (!gst_element_query_position(m_playbin, GST_FORMAT_TIME, &pos) ||
pos == -1)
return 0;
#else
GstFormat fmtTime = GST_FORMAT_TIME; GstFormat fmtTime = GST_FORMAT_TIME;
if (!wxGst_element_query_position(m_playbin, &fmtTime, &pos) || if (!wxGst_element_query_position(m_playbin, &fmtTime, &pos) ||
fmtTime != GST_FORMAT_TIME || pos == -1) fmtTime != GST_FORMAT_TIME || pos == -1)
return 0; return 0;
#endif
return pos / GST_MSECOND ; return pos / GST_MSECOND ;
} }
} }
@@ -1487,11 +1577,17 @@ bool wxGStreamerMediaBackend::SetPosition(wxLongLong where)
wxLongLong wxGStreamerMediaBackend::GetDuration() wxLongLong wxGStreamerMediaBackend::GetDuration()
{ {
gint64 length; gint64 length;
#if GST_VERSION_MAJOR > 0
if(!gst_element_query_duration(m_playbin, GST_FORMAT_TIME, &length) ||
length == -1)
return 0;
#else
GstFormat fmtTime = GST_FORMAT_TIME; GstFormat fmtTime = GST_FORMAT_TIME;
if(!wxGst_element_query_duration(m_playbin, &fmtTime, &length) || if(!wxGst_element_query_duration(m_playbin, &fmtTime, &length) ||
fmtTime != GST_FORMAT_TIME || length == -1) fmtTime != GST_FORMAT_TIME || length == -1)
return 0; return 0;
#endif
return length / GST_MSECOND ; return length / GST_MSECOND ;
} }
@@ -1593,11 +1689,17 @@ wxLongLong wxGStreamerMediaBackend::GetDownloadProgress()
wxLongLong wxGStreamerMediaBackend::GetDownloadTotal() wxLongLong wxGStreamerMediaBackend::GetDownloadTotal()
{ {
gint64 length; gint64 length;
#if GST_VERSION_MAJOR > 0
if (!gst_element_query_duration(m_playbin, GST_FORMAT_BYTES, &length) ||
length == -1)
return 0;
#else
GstFormat fmtBytes = GST_FORMAT_BYTES; GstFormat fmtBytes = GST_FORMAT_BYTES;
if (!wxGst_element_query_duration(m_playbin, &fmtBytes, &length) || if (!wxGst_element_query_duration(m_playbin, &fmtBytes, &length) ||
fmtBytes != GST_FORMAT_BYTES || length == -1) fmtBytes != GST_FORMAT_BYTES || length == -1)
return 0; return 0;
#endif
return length; return length;
} }