dvdplayer: ff/rw/seek was broken for inputs implementing IDisplayTime
authorJoakim Plate <elupus@ecce.se>
Sun, 6 Jan 2013 14:26:58 +0000 (15:26 +0100)
committerJoakim Plate <elupus@ecce.se>
Sun, 6 Jan 2013 14:26:58 +0000 (15:26 +0100)
This affected PVR with file based inputs and BluRay.

xbmc/cores/dvdplayer/DVDPlayer.cpp
xbmc/cores/dvdplayer/DVDPlayer.h

index 54c6b29..e00c369 100644 (file)
@@ -2016,6 +2016,11 @@ void CDVDPlayer::HandleMessages()
         double start = DVD_NOPTS_VALUE;
 
         int time = msg.GetRestore() ? (int)m_Edl.RestoreCutTime(msg.GetTime()) : msg.GetTime();
+
+        // if input streams doesn't support seektime we must convert back to clock
+        if(dynamic_cast<CDVDInputStream::ISeekTime*>(m_pInputStream) == NULL)
+          time -= m_State.time_offset;
+
         CLog::Log(LOGDEBUG, "demuxer seek to: %d", time);
         if (m_pDemuxer && m_pDemuxer->SeekTime(time, msg.GetBackward(), &start))
         {
@@ -3814,6 +3819,7 @@ void CDVDPlayer::UpdatePlayState(double timeout)
 
     state.time       = DVD_TIME_TO_MSEC(m_clock.GetClock() + m_offset_pts);
     state.time_total = m_pDemuxer->GetStreamLength();
+    state.time_src   = ETIMESOURCE_CLOCK;
   }
 
   if(m_pInputStream)
@@ -3831,6 +3837,7 @@ void CDVDPlayer::UpdatePlayState(double timeout)
     {
       state.time       = pDisplayTime->GetTime();
       state.time_total = pDisplayTime->GetTotalTime();
+      state.time_src   = ETIMESOURCE_INPUT;
     }
 
     if (dynamic_cast<CDVDInputStream::IMenus*>(m_pInputStream))
@@ -3839,6 +3846,7 @@ void CDVDPlayer::UpdatePlayState(double timeout)
       {
         state.time       = XbmcThreads::SystemClockMillis() - m_dvd.iDVDStillStartTime;
         state.time_total = m_dvd.iDVDStillTime;
+        state.time_src   = ETIMESOURCE_MENU;
       }
     }
 
@@ -3864,12 +3872,14 @@ void CDVDPlayer::UpdatePlayState(double timeout)
   state.player_state = "";
   if (m_pInputStream && m_pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD))
   {
-    state.time_offset = DVD_MSEC_TO_TIME(state.time) - state.dts;
     if(!((CDVDInputStreamNavigator*)m_pInputStream)->GetNavigatorState(state.player_state))
       state.player_state = "";
   }
-  else
+
+  if (state.time_src == ETIMESOURCE_CLOCK)
     state.time_offset = 0;
+  else
+    state.time_offset = DVD_MSEC_TO_TIME(state.time) - state.dts;
 
   if (m_CurrentAudio.id >= 0 && m_pDemuxer)
   {
index 9438a9b..d3c201e 100644 (file)
@@ -400,6 +400,13 @@ protected:
     int iSelectedAudioStream; // mpeg stream id, or -1 if disabled
   } m_dvd;
 
+  enum ETimeSource
+  {
+    ETIMESOURCE_CLOCK,
+    ETIMESOURCE_INPUT,
+    ETIMESOURCE_MENU,
+  };
+
   struct SPlayerState
   {
     SPlayerState() { Clear(); }
@@ -409,6 +416,7 @@ protected:
       time          = 0;
       time_total    = 0;
       time_offset   = 0;
+      time_src      = ETIMESOURCE_CLOCK;
       dts           = DVD_NOPTS_VALUE;
       player_state  = "";
       chapter       = 0;
@@ -431,6 +439,7 @@ protected:
 
     double time;              // current playback time
     double time_total;        // total playback time
+    ETimeSource time_src;     // current time source
     double dts;               // last known dts
 
     std::string player_state;  // full player state