X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e17b4db3f8167a2eb8dc831775de4b7d86948da6..815f65bd0f673965230ed915d794497a8818dd35:/src/unix/mediactrl.cpp diff --git a/src/unix/mediactrl.cpp b/src/unix/mediactrl.cpp index 3edabd669f..5e5fa01382 100644 --- a/src/unix/mediactrl.cpp +++ b/src/unix/mediactrl.cpp @@ -12,10 +12,10 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/mediactrl.h" - #if wxUSE_MEDIACTRL +#include "wx/mediactrl.h" + #if wxUSE_GSTREAMER #include // main gstreamer header @@ -28,13 +28,18 @@ # include // gstreamer glib configuration #endif -#include "wx/log.h" // wxLogDebug/wxLogSysError/wxLogTrace -#include "wx/app.h" // wxTheApp->argc, wxTheApp->argv +#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/thread.h" // wxMutex/wxMutexLocker -#include "wx/timer.h" // wxTimer #ifdef __WXGTK__ -# include "wx/gtk/win_gtk.h" // for /GDK_WINDOW_XWINDOW + #include + #include + #include "wx/gtk/private/gtk2-compat.h" #endif //----------------------------------------------------------------------------- @@ -124,28 +129,6 @@ // Max wait time for element state waiting - GST_CLOCK_TIME_NONE for inf #define wxGSTREAMER_TIMEOUT (100 * GST_MSECOND) // Max 100 milliseconds -//----------------------------------------------------------------------------- -// wxGTK Debugging and idle stuff -//----------------------------------------------------------------------------- -#ifdef __WXGTK__ - -# ifdef __WXDEBUG__ -# if wxUSE_THREADS -# define DEBUG_MAIN_THREAD \ - if (wxThread::IsMain() && g_mainThreadLocked) \ - wxPrintf(wxT("gui reentrance")); -# else -# define DEBUG_MAIN_THREAD -# endif -# else -# define DEBUG_MAIN_THREAD -# endif // Debug - -extern void wxapp_install_idle_handler(); -extern bool g_isIdle; -extern bool g_mainThreadLocked; -#endif // wxGTK - //----------------------------------------------------------------------------- // wxLogTrace mask string //----------------------------------------------------------------------------- @@ -162,7 +145,7 @@ class WXDLLIMPEXP_MEDIA public: wxGStreamerMediaBackend(); - ~wxGStreamerMediaBackend(); + virtual ~wxGStreamerMediaBackend(); virtual bool CreateControl(wxControl* ctrl, wxWindow* parent, wxWindowID id, @@ -178,6 +161,10 @@ public: virtual bool Load(const wxString& fileName); virtual bool Load(const wxURI& location); + virtual bool Load(const wxURI& location, + const wxURI& proxy) + { return wxMediaBackendCommonBase::Load(location, proxy); } + virtual wxMediaState GetState(); @@ -220,7 +207,7 @@ public: friend class wxGStreamerMediaEventHandler; friend class wxGStreamerLoadWaitTimer; - DECLARE_DYNAMIC_CLASS(wxGStreamerMediaBackend); + DECLARE_DYNAMIC_CLASS(wxGStreamerMediaBackend) }; //----------------------------------------------------------------------------- @@ -276,7 +263,7 @@ static gboolean gtk_window_expose_callback(GtkWidget *widget, if(event->count > 0) return FALSE; - GdkWindow *window = GTK_PIZZA(be->GetControl()->m_wxwindow)->bin_window; + GdkWindow* window = gtk_widget_get_window(widget); // I've seen this reccommended somewhere... // TODO: Is this needed? Maybe it is just cruft... @@ -314,18 +301,12 @@ static gboolean gtk_window_expose_callback(GtkWidget *widget, //----------------------------------------------------------------------------- #ifdef __WXGTK__ extern "C" { -static gint gtk_window_realize_callback(GtkWidget* theWidget, +static gint gtk_window_realize_callback(GtkWidget* widget, wxGStreamerMediaBackend* be) { - DEBUG_MAIN_THREAD // TODO: Is this neccessary? - - if (g_isIdle) // FIXME: Why is needed? For wxYield? ?? - wxapp_install_idle_handler(); + gdk_flush(); - wxYield(); // FIXME: RN: X Server gets an error/crash if I don't do - // this or a messagebox beforehand?!?!?? - - GdkWindow *window = GTK_PIZZA(theWidget)->bin_window; + GdkWindow* window = gtk_widget_get_window(widget); wxASSERT(window); gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(be->m_xoverlay), @@ -369,7 +350,7 @@ static void gst_state_change_callback(GstElement *play, // Called by gstreamer when the media is done playing ("end of stream") //----------------------------------------------------------------------------- extern "C" { -static void gst_finish_callback(GstElement *play, +static void gst_finish_callback(GstElement *WXUNUSED(play), wxGStreamerMediaBackend* be) { wxLogTrace(wxTRACE_GStreamer, wxT("gst_finish_callback")); @@ -386,11 +367,11 @@ static void gst_finish_callback(GstElement *play, // on the command line as well for those who want extra traces. //----------------------------------------------------------------------------- extern "C" { -static void gst_error_callback(GstElement *play, - GstElement *src, +static void gst_error_callback(GstElement *WXUNUSED(play), + GstElement *WXUNUSED(src), GError *err, gchar *debug, - wxGStreamerMediaBackend* be) + wxGStreamerMediaBackend* WXUNUSED(be)) { wxString sError; sError.Printf(wxT("gst_error_callback\n") @@ -412,7 +393,7 @@ static void gst_error_callback(GstElement *play, //----------------------------------------------------------------------------- extern "C" { static void gst_notify_caps_callback(GstPad* pad, - GParamSpec* pspec, + GParamSpec* WXUNUSED(pspec), wxGStreamerMediaBackend* be) { wxLogTrace(wxTRACE_GStreamer, wxT("gst_notify_caps_callback")); @@ -434,8 +415,8 @@ static void gst_notify_caps_callback(GstPad* pad, //----------------------------------------------------------------------------- #if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10 extern "C" { -static void gst_notify_stream_info_callback(GstElement* element, - GParamSpec* pspec, +static void gst_notify_stream_info_callback(GstElement* WXUNUSED(element), + GParamSpec* WXUNUSED(pspec), wxGStreamerMediaBackend* be) { wxLogTrace(wxTRACE_GStreamer, wxT("gst_notify_stream_info_callback")); @@ -485,7 +466,7 @@ static void gst_desired_size_changed_callback(GstElement * play, //----------------------------------------------------------------------------- #if GST_VERSION_MAJOR > 0 || GST_VERSION_MINOR >= 10 extern "C" { -static gboolean gst_bus_async_callback(GstBus* bus, +static gboolean gst_bus_async_callback(GstBus* WXUNUSED(bus), GstMessage* message, wxGStreamerMediaBackend* be) { @@ -718,7 +699,7 @@ void wxGStreamerMediaBackend::SetupXOverlay() { // Use the xoverlay extension to tell gstreamer to play in our window #ifdef __WXGTK__ - if(!GTK_WIDGET_REALIZED(m_ctrl->m_wxwindow)) + 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, @@ -728,21 +709,20 @@ void wxGStreamerMediaBackend::SetupXOverlay() } else { - wxYield(); // see realize callback... - GdkWindow *window = GTK_PIZZA(m_ctrl->m_wxwindow)->bin_window; + gdk_flush(); + + 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_x_overlay_set_xwindow_id(GST_X_OVERLAY(m_xoverlay), #ifdef __WXGTK__ GDK_WINDOW_XWINDOW( window ) #else ctrl->GetHandle() #endif ); - #ifdef __WXGTK__ - g_signal_connect (m_ctrl->m_wxwindow, + g_signal_connect(m_ctrl->m_wxwindow, // m_ctrl->m_wxwindow/*m_ctrl->m_widget*/, "expose_event", G_CALLBACK(gtk_window_expose_callback), this); @@ -909,7 +889,7 @@ bool wxGStreamerMediaBackend::TryVideoSink(GstElement* videosink) // // Called when the media is about to stop //----------------------------------------------------------------------------- -void wxGStreamerMediaEventHandler::OnMediaFinish(wxMediaEvent& event) +void wxGStreamerMediaEventHandler::OnMediaFinish(wxMediaEvent& WXUNUSED(event)) { // (RN - I have no idea why I thought this was good behaviour.... // maybe it made sense for streaming/nonseeking data but @@ -951,7 +931,8 @@ void wxGStreamerMediaEventHandler::OnMediaFinish(wxMediaEvent& event) // Sets m_playbin to NULL signifying we havn't loaded anything yet //----------------------------------------------------------------------------- wxGStreamerMediaBackend::wxGStreamerMediaBackend() - : m_playbin(NULL) + : m_playbin(NULL), + m_eventHandler(NULL) { } @@ -998,7 +979,11 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, char **argvGST = new char*[wxTheApp->argc + 1]; for ( i = 0; i < wxTheApp->argc; i++ ) { +#if wxUSE_UNICODE_WCHAR argvGST[i] = wxStrdupA(wxConvUTF8.cWX2MB(wxTheApp->argv[i])); +#else + argvGST[i] = wxStrdupA(wxTheApp->argv[i].utf8_str()); +#endif } argvGST[wxTheApp->argc] = NULL; @@ -1033,7 +1018,7 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, if(error) { wxLogSysError(wxT("Could not initialize GStreamer\n") - wxT("Error Message:%s"), + wxT("Error Message:%s"), (const wxChar*) wxConvUTF8.cMB2WX(error->message) ); g_error_free(error); @@ -1051,7 +1036,7 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, #ifdef __WXGTK__ // We handle our own GTK expose events - m_ctrl->m_noExpose = TRUE; + m_ctrl->m_noExpose = true; #endif if( !m_ctrl->wxControl::Create(parent, id, pos, size, @@ -1067,9 +1052,6 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, // 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); - - // Tell GtkPizza not to clear the background - gtk_pizza_set_clear(GTK_PIZZA(m_ctrl->m_wxwindow), FALSE); #endif // don't erase the background of our control window @@ -1079,12 +1061,12 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, // Create our playbin object m_playbin = gst_element_factory_make ("playbin", "play"); if (!GST_IS_ELEMENT(m_playbin)) - { + { if(G_IS_OBJECT(m_playbin)) g_object_unref(m_playbin); wxLogSysError(wxT("Got an invalid playbin")); return false; - } + } #if GST_VERSION_MAJOR == 0 && GST_VERSION_MINOR < 10 // Connect the glib events/callbacks we want to our playbin @@ -1120,7 +1102,7 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, if( !TryAudioSink(audiosink) ) { wxLogSysError(wxT("Could not find a valid audiosink")); - return false; + return false; } } } @@ -1145,7 +1127,7 @@ bool wxGStreamerMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, g_object_unref(audiosink); wxLogSysError(wxT("Could not find a suitable video sink")); return false; - } + } } } } @@ -1196,11 +1178,11 @@ bool wxGStreamerMediaBackend::Load(const wxURI& location) //Workaround GstURI leading "//" problem and make sure it leads //with that - return DoLoad(wxString(wxT("file://")) + - uristring.Right(uristring.Length() - 5) + return DoLoad(wxString(wxT("file://")) + + uristring.Right(uristring.length() - 5) ); } - else + else return DoLoad(location.BuildURI()); } @@ -1235,6 +1217,9 @@ bool wxGStreamerMediaBackend::DoLoad(const wxString& locstring) return false; } + // free current media resources + gst_element_set_state (m_playbin, GST_STATE_NULL); + // 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")); @@ -1357,7 +1342,7 @@ wxMediaState wxGStreamerMediaBackend::GetState() // NB: whether we have paused or not and keep track of the time after the // NB: pause and whenever the user seeks while paused // NB: -// +// // THREAD-UNSAFE, at least if not paused. Requires media to be at least paused. //----------------------------------------------------------------------------- wxLongLong wxGStreamerMediaBackend::GetPosition() @@ -1451,7 +1436,10 @@ wxLongLong wxGStreamerMediaBackend::GetDuration() // Called when the window is moved - GStreamer takes care of this // for us so nothing is needed //----------------------------------------------------------------------------- -void wxGStreamerMediaBackend::Move(int x, int y, int w, int h) +void wxGStreamerMediaBackend::Move(int WXUNUSED(x), + int WXUNUSED(y), + int WXUNUSED(w), + int WXUNUSED(h)) { } @@ -1509,6 +1497,8 @@ bool wxGStreamerMediaBackend::SetPlaybackRate(double dRate) m_dRate = dRate; return true; } +#else + wxUnusedVar(dRate); #endif #endif