task-vuplus-enigma2
[vuplus_openvuplus] / meta-openvuplus / recipes-enigma2 / enigma2 / enigma2 / enigma2_vuplus_mediaplayer_subtitle.patch
diff --git a/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_subtitle.patch b/meta-openvuplus/recipes-enigma2/enigma2/enigma2/enigma2_vuplus_mediaplayer_subtitle.patch
new file mode 100644 (file)
index 0000000..60e8f1a
--- /dev/null
@@ -0,0 +1,104 @@
+diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp
+index 7ce34c1..e620225 100755
+--- a/lib/service/servicemp3.cpp
++++ b/lib/service/servicemp3.cpp
+@@ -235,6 +235,8 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
+       CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll);
+       m_aspect = m_width = m_height = m_framerate = m_progressive = -1;
++      m_subs_behind_seek = 0;
++      m_block_sub = FALSE;
+       m_cur_rate=1.0;
+       m_state = stIdle;
+       eDebug("eServiceMP3::construct!");
+@@ -572,6 +574,7 @@ RESULT eServiceMP3::seekTo(pts_t to)
+       RESULT ret = -1;
+       if (m_gst_playbin) {
++              m_block_sub = TRUE;
+               eSingleLocker l(m_subs_to_pull_lock); // this is needed to dont handle incomming subtitles during seek!
+               if (!(ret = seekToImpl(to)))
+               {
+@@ -580,6 +583,13 @@ RESULT eServiceMP3::seekTo(pts_t to)
+                       m_decoder_time_valid_state = 0;
+                       m_subs_to_pull = 0;
+               }
++              m_block_sub = FALSE;
++      }
++      m_subs_to_pull+=m_subs_behind_seek;
++      while(m_subs_behind_seek)
++      {
++              m_pump.send(Message(2));
++              m_subs_behind_seek--;
+       }
+       return ret;
+@@ -593,6 +603,7 @@ RESULT eServiceMP3::trickSeek(gdouble ratio)
+       if (!ratio)
+               return seekRelative(0, 0);
++      m_block_sub = TRUE;
+       eSingleLocker l(m_subs_to_pull_lock);
+       GstEvent *s_event;
+@@ -632,6 +643,13 @@ RESULT eServiceMP3::trickSeek(gdouble ratio)
+       m_decoder_time_valid_state = 0;
+       m_subs_to_pull = 0;
+       m_cur_rate=ratio;
++      m_block_sub = FALSE;
++      m_subs_to_pull+=m_subs_behind_seek;
++      while(m_subs_behind_seek)
++      {
++              m_pump.send(Message(2));
++              m_subs_behind_seek--;
++      }
+       return 0;
+ }
+@@ -1572,10 +1590,17 @@ eAutoInitPtr<eServiceFactoryMP3> init_eServiceFactoryMP3(eAutoInitNumbers::servi
+ void eServiceMP3::gstCBsubtitleAvail(GstElement *appsink, gpointer user_data)
+ {
+-      eServiceMP3 *_this = (eServiceMP3*)user_data;   
+-      eSingleLocker l(_this->m_subs_to_pull_lock);
+-      ++_this->m_subs_to_pull;
+-      _this->m_pump.send(Message(2));
++      eServiceMP3 *_this = (eServiceMP3*)user_data;
++      if(_this->m_block_sub != TRUE)
++      {
++              eSingleLocker l(_this->m_subs_to_pull_lock);
++              ++_this->m_subs_to_pull;
++              _this->m_pump.send(Message(2));
++      }
++      else
++      {
++              _this->m_subs_behind_seek++;
++      }
+ }
+ void eServiceMP3::gstTextpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data)
+@@ -1651,6 +1676,11 @@ void eServiceMP3::pullSubtitle()
+               {
+                       GstBuffer *buffer;
+                       {
++                              if(m_block_sub == TRUE)
++                              {
++                                      g_signal_emit_by_name (sink, "pull-buffer", &buffer);
++                                      return;
++                              }
+                               eSingleLocker l(m_subs_to_pull_lock);
+                               --m_subs_to_pull;
+                               g_signal_emit_by_name (sink, "pull-buffer", &buffer);
+diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h
+index 07eb321..f6282bf 100755
+--- a/lib/service/servicemp3.h
++++ b/lib/service/servicemp3.h
+@@ -266,6 +266,8 @@ private:
+       std::string m_useragent;
+       RESULT trickSeek(gdouble ratio);
+       double m_cur_rate;
++      bool m_block_sub;
++      int m_subs_behind_seek;
+ };
+ #endif