From a401c0fa2ee31ec55a1b46c23e2160047cf82e11 Mon Sep 17 00:00:00 2001 From: "chunmao.guo" Date: Mon, 6 Mar 2023 16:02:57 +0800 Subject: [PATCH] FIX: [STUDIO-2340] [STUDIO-2297] handle linux gstreamer error Change-Id: Iadc6dcb9d7a9f2c5d1ce9cf979bbbfbd0f805d19 --- src/slic3r/GUI/MediaPlayCtrl.cpp | 7 ++----- src/slic3r/GUI/Printer/gstbambusrc.c | 10 +++++++--- src/slic3r/GUI/wxMediaCtrl2.cpp | 27 ++++++++++++++++++++++++++- src/slic3r/GUI/wxMediaCtrl2.h | 3 ++- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index 2e88131df..2a687be53 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -27,9 +27,6 @@ MediaPlayCtrl::MediaPlayCtrl(wxWindow *parent, wxMediaCtrl2 *media_ctrl, const w { SetBackgroundColour(*wxWHITE); m_media_ctrl->Bind(wxEVT_MEDIA_STATECHANGED, &MediaPlayCtrl::onStateChanged, this); -#if wxUSE_GSTREAMER_PLAYER - m_media_ctrl->Bind(wxEVT_MEDIA_LOADED, &MediaPlayCtrl::onStateChanged, this); -#endif m_button_play = new Button(this, "", "media_play", wxBORDER_NONE); m_button_play->SetCanFocus(false); @@ -365,11 +362,11 @@ void MediaPlayCtrl::onStateChanged(wxMediaEvent &event) Stop(); return; } - if (last_state == MEDIASTATE_LOADING && (state == wxMEDIASTATE_STOPPED || state == wxMEDIASTATE_PAUSED || event.GetEventType() == wxEVT_MEDIA_LOADED)) { + if (last_state == MEDIASTATE_LOADING && (state == wxMEDIASTATE_STOPPED || state == wxMEDIASTATE_PAUSED)) { wxSize size = m_media_ctrl->GetVideoSize(); BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::onStateChanged: size: " << size.x << "x" << size.y; m_failed_code = m_media_ctrl->GetLastError(); - if (size.GetWidth() > 1000 || (event.GetEventType() == wxEVT_MEDIA_LOADED)) { + if (size.GetWidth() > 1000) { m_last_state = state; SetStatus(_L("Playing..."), false); m_failed_retry = 0; diff --git a/src/slic3r/GUI/Printer/gstbambusrc.c b/src/slic3r/GUI/Printer/gstbambusrc.c index e7339ec17..14f2476f2 100644 --- a/src/slic3r/GUI/Printer/gstbambusrc.c +++ b/src/slic3r/GUI/Printer/gstbambusrc.c @@ -259,6 +259,8 @@ gst_bambusrc_get_property (GObject * object, guint prop_id, } } +int gst_bambu_last_error = 0; + static GstFlowReturn gst_bambusrc_create (GstPushSrc * psrc, GstBuffer ** outbuf) { @@ -286,7 +288,8 @@ gst_bambusrc_create (GstPushSrc * psrc, GstBuffer ** outbuf) } if (rv != Bambu_success) { - return GST_FLOW_ERROR; + gst_bambu_last_error = rv; + return GST_FLOW_ERROR; } #if GLIB_CHECK_VERSION(2,68,0) @@ -316,7 +319,7 @@ gst_bambusrc_create (GstPushSrc * psrc, GstBuffer ** outbuf) //if (GST_CLOCK_TIME_NONE == src->sttime) // src->sttime GST_DEBUG_OBJECT(src, - "sttime init to %llu.", + "sttime init to %lu.", src->sttime); } //GST_BUFFER_DTS(*outbuf) = gst_element_get_current_clock_time((GstElement *)psrc) - src->sttime; @@ -325,7 +328,7 @@ gst_bambusrc_create (GstPushSrc * psrc, GstBuffer ** outbuf) GST_BUFFER_DURATION(*outbuf) = GST_CLOCK_TIME_NONE; } GST_DEBUG_OBJECT(src, - "sttime:%llu, DTS:%llu, PTS: %llu~", + "sttime:%lu, DTS:%lu, PTS: %lu~", src->sttime, GST_BUFFER_DTS(*outbuf), GST_BUFFER_PTS(*outbuf)); return GST_FLOW_OK; @@ -377,6 +380,7 @@ gst_bambusrc_start (GstBaseSrc * bsrc) BAMBULIB(Bambu_Close)(src->tnl); BAMBULIB(Bambu_Destroy)(src->tnl); src->tnl = NULL; + gst_bambu_last_error = rv; return FALSE; } diff --git a/src/slic3r/GUI/wxMediaCtrl2.cpp b/src/slic3r/GUI/wxMediaCtrl2.cpp index 446e819df..6ef78eec6 100644 --- a/src/slic3r/GUI/wxMediaCtrl2.cpp +++ b/src/slic3r/GUI/wxMediaCtrl2.cpp @@ -31,6 +31,9 @@ wxMediaCtrl2::wxMediaCtrl2(wxWindow *parent) #ifdef __LINUX__ /* Register only after we have created the wxMediaCtrl, since only then are we guaranteed to have fired up Gstreamer's plugin registry. */ gstbambusrc_register(); + Bind(wxEVT_MEDIA_LOADED, [this](auto & e) { + m_loaded = true; + }); #endif } @@ -138,22 +141,44 @@ void wxMediaCtrl2::Load(wxURI url) wxPostEvent(this, event); return; } + wxLog::EnableLogging(false); #endif m_error = 0; + m_loaded = false; wxMediaCtrl::Load(url); + +#ifdef __WXGTK3__ + wxMediaEvent event(wxEVT_MEDIA_STATECHANGED); + event.SetId(GetId()); + event.SetEventObject(this); + wxPostEvent(this, event); +#endif } void wxMediaCtrl2::Play() { wxMediaCtrl::Play(); } void wxMediaCtrl2::Stop() { wxMediaCtrl::Stop(); } +#ifdef __LINUX__ +extern int gst_bambu_last_error; +#endif + +int wxMediaCtrl2::GetLastError() const +{ +#ifdef __LINUX__ + return gst_bambu_last_error; +#else + return m_error; +#endif +} + wxSize wxMediaCtrl2::GetVideoSize() const { #ifdef __LINUX__ // Gstreamer doesn't give us a VideoSize until we're playing, which // confuses the MediaPlayCtrl into claiming that it is stuck // "Loading...". Fake it out for now. - return wxSize(1280, 720); + return m_loaded ? wxSize(1280, 720) : wxSize{}; #else return m_imp ? m_imp->GetVideoSize() : wxSize(0, 0); #endif diff --git a/src/slic3r/GUI/wxMediaCtrl2.h b/src/slic3r/GUI/wxMediaCtrl2.h index e894793af..3f1467a13 100644 --- a/src/slic3r/GUI/wxMediaCtrl2.h +++ b/src/slic3r/GUI/wxMediaCtrl2.h @@ -65,7 +65,7 @@ public: void SetIdleImage(wxString const & image); - int GetLastError() const { return m_error; } + int GetLastError() const; wxSize GetVideoSize() const; @@ -83,6 +83,7 @@ protected: private: wxString m_idle_image; int m_error = 0; + bool m_loaded = false; }; #endif