[mythtv] FF/Rew Repositioning

David Engel dlengel at attbi.com
Sun Jul 27 16:17:59 EDT 2003


On Sun, Jul 27, 2003 at 11:00:16AM -0400, Isaac Richards wrote:
> Mind making a config option to turn it off completely, too?

Sure, here it is.  There is one minor issue with the ending position
reported in the OSD not being as accurate as it should be.  I'm going
to save that for later since the best fix for it might not be confined
to just this feature.

David
-- 
David Engel
dlengel at attbi.com

Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/NuppelVideoPlayer.cpp,v
retrieving revision 1.234
diff -u -r1.234 NuppelVideoPlayer.cpp
--- libs/libmythtv/NuppelVideoPlayer.cpp	26 Jul 2003 16:49:17 -0000	1.234
+++ libs/libmythtv/NuppelVideoPlayer.cpp	27 Jul 2003 20:11:55 -0000
@@ -1328,16 +1328,20 @@
     return NULL;
 }
 
-void NuppelVideoPlayer::FastForward(float seconds)
+bool NuppelVideoPlayer::FastForward(float seconds)
 {
     if (fftime == 0)
         fftime = (int)(seconds * video_frame_rate);
+
+    return fftime > CalcMaxFFTime(fftime);
 }
 
-void NuppelVideoPlayer::Rewind(float seconds)
+bool NuppelVideoPlayer::Rewind(float seconds)
 {
     if (rewindtime == 0)
         rewindtime = (int)(seconds * video_frame_rate);
+
+    return rewindtime >= framesPlayed;
 }
 
 void NuppelVideoPlayer::SkipCommercials(int direction)
Index: libs/libmythtv/NuppelVideoPlayer.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/NuppelVideoPlayer.h,v
retrieving revision 1.97
diff -u -r1.97 NuppelVideoPlayer.h
--- libs/libmythtv/NuppelVideoPlayer.h	26 Jul 2003 16:49:17 -0000	1.97
+++ libs/libmythtv/NuppelVideoPlayer.h	27 Jul 2003 20:11:55 -0000
@@ -72,8 +72,8 @@
     void Unpause(void); 
     bool GetPause(void);
    
-    void FastForward(float seconds);
-    void Rewind(float seconds);
+    bool FastForward(float seconds);
+    bool Rewind(float seconds);
 
     void SkipCommercials(int direction);
 
Index: libs/libmythtv/tv_play.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/tv_play.cpp,v
retrieving revision 1.83
diff -u -r1.83 tv_play.cpp
--- libs/libmythtv/tv_play.cpp	26 Jul 2003 16:49:17 -0000	1.83
+++ libs/libmythtv/tv_play.cpp	27 Jul 2003 20:11:57 -0000
@@ -39,21 +39,23 @@
 };
 
 struct SeekSpeedInfo {
-  QString   dispString;
-  float  scaling;
+    QString dispString;
+    float   scaling;
+    float   ff_repos;
+    float   rew_repos;
 };
 
 SeekSpeedInfo seek_speed_array[] =
-  {{"", 0.0},
-   {"1/4X", 0.25},
-   {"1/2X", 0.50},
-   {"1X", 1.00},
-   {"1.5X", 1.50},
-   {"2X", 2.24},
-   {"3X", 3.34},
-   {"8X", 7.48},
-   {"10X", 11.18},
-   {"16X", 16.72}};
+  {{"",     0.00,   0.00,   0.00},
+   {"1/4X", 0.25,   0.00,   0.00},
+   {"1/2X", 0.50,   4.00,   4.00},
+   {"1X",   1.00,  12.00,   9.00},
+   {"1.5X", 1.50,  16.00,  11.50},
+   {"2X",   2.24,  20.00,  14.00},
+   {"3X",   3.34,  28.00,  19.00},
+   {"8X",   7.48,  68.00,  44.00},
+   {"10X", 11.18,  84.00,  54.00},
+   {"16X", 16.72, 132.00,  84.00}};
 
 void *SpawnDecode(void *param)
 {
@@ -679,6 +681,7 @@
     int keypressed;
 
     stickykeys = gContext->GetNumSetting("StickyKeys");
+    ff_rew_repos = gContext->GetNumSetting("FFRewRepos", 1);
     doing_ff_rew = 0;
     ff_rew_scaling = 1.0;
     ff_rew_index = SSPEED_NORMAL;
@@ -904,7 +907,7 @@
         }
         case Key_Z:
         {
-            StopFFRew();
+            StopFFRew(ff_rew_repos);
             DoSkipCommercials(1);
             break;
         }
@@ -915,13 +918,13 @@
         }
         case Key_Q:
         {
-            StopFFRew();
+            StopFFRew(ff_rew_repos);
             DoSkipCommercials(-1);
             break;
         }
         case Key_S: case Key_P: 
         {
-            StopFFRew();
+            StopFFRew(ff_rew_repos);
             DoPause();
             break;
         }
@@ -929,7 +932,7 @@
         {
             if (!stickykeys)
             {
-                StopFFRew();
+                StopFFRew(ff_rew_repos);
                 DoFF(fftime); 
                 break;
             }
@@ -951,7 +954,7 @@
         {
             if (!stickykeys)
             {
-                StopFFRew();
+                StopFFRew(ff_rew_repos);
                 DoRew(rewtime);
                 break;
             }
@@ -1029,7 +1032,7 @@
                     case Key_9: ff_rew_index = SSPEED_FAST_6; break;
 
                     default:
-                       StopFFRew();
+                       StopFFRew(ff_rew_repos);
                        was_doing_ff_rew = true;
                        break;
                 }
@@ -1376,7 +1379,8 @@
         osd->StartPause(pos, slidertype, scaleString, desc, 2);
     }
 
-    activenvp->FastForward(time * ff_rew_scaling);
+    if (activenvp->FastForward(time * ff_rew_scaling))
+	StopFFRew(false);
 
     if (muted) 
         muteTimer->start(600, true);
@@ -1416,7 +1420,8 @@
         osd->StartPause(pos, slidertype, scaleString, desc, 2);
     }
 
-    activenvp->Rewind(time * ff_rew_scaling);
+    if (activenvp->Rewind(time * ff_rew_scaling))
+	StopFFRew(false);
 
     if (muted) 
         muteTimer->start(600, true);
@@ -1428,32 +1433,18 @@
     }
 }
 
-void TV::StopFFRew(void)
+void TV::StopFFRew(bool repos)
 {
     if (!doing_ff_rew)
         return;
 
-    const double ff_offset = 7.00;
-    const double ff_scale = 6.00;
-    const double rew_offset = 0.00;
-    const double rew_scale = 6.00;
-
-    bool muted = false;
-
-    if (volumeControl && !volumeControl->GetMute())
+    if (repos)
     {
-        volumeControl->ToggleMute();
-        muted = true;
+	if (doing_ff_rew > 0)
+	    activenvp->Rewind(seek_speed_array[ff_rew_index].ff_repos);
+	else
+	    activenvp->FastForward(seek_speed_array[ff_rew_index].rew_repos);
     }
-
-    ff_rew_scaling = seek_speed_array[ff_rew_index].scaling;
-    if (doing_ff_rew > 0)
-        activenvp->Rewind(ff_offset + ff_scale * ff_rew_scaling);
-    else
-        activenvp->FastForward(rew_offset + rew_scale * ff_rew_scaling);
-
-    if (muted) 
-        muteTimer->start(600, true);
 
     doing_ff_rew = 0;
     ff_rew_index = SSPEED_NORMAL;
Index: libs/libmythtv/tv_play.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/tv_play.h,v
retrieving revision 1.39
diff -u -r1.39 tv_play.h
--- libs/libmythtv/tv_play.h	25 Jul 2003 01:23:40 -0000	1.39
+++ libs/libmythtv/tv_play.h	27 Jul 2003 20:11:57 -0000
@@ -118,7 +118,7 @@
 
     void DoInfo(void);
     void DoPause(void);
-    void StopFFRew(void);
+    void StopFFRew(bool repos);
     void DoFF(int time);
     void DoRew(int time);
     void DoJumpAhead(void);
@@ -182,6 +182,7 @@
     int fftime;
     int rewtime;
     int stickykeys;
+    int ff_rew_repos;
     int doing_ff_rew;
     int ff_rew_index;
     float ff_rew_scaling;
Index: programs/mythfrontend/globalsettings.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythfrontend/globalsettings.cpp,v
retrieving revision 1.84
diff -u -r1.84 globalsettings.cpp
--- programs/mythfrontend/globalsettings.cpp	26 Jul 2003 16:49:17 -0000	1.84
+++ programs/mythfrontend/globalsettings.cpp	27 Jul 2003 20:11:57 -0000
@@ -319,6 +319,20 @@
     };
 };
 
+class FFRewRepos: public CheckBoxSetting, public GlobalSetting {
+public:
+    FFRewRepos():
+        GlobalSetting("FFRewRepos") {
+        setLabel("Reposition after fast forward/rewind");
+        setValue(true);
+        setHelpText("When exiting sticky keys fast forward/rewind mode, "
+		    "reposition before resuming normal playback.  This is to "
+		    "compensate for the reaction time between seeing where to "
+		    "resume playback and actually exiting fast forward/rewind "
+		    "mode.");
+    };
+};
+
 class OSDDisplayTime: public SpinBoxSetting, public GlobalSetting {
 public:
     OSDDisplayTime():
@@ -1059,6 +1073,7 @@
     seek->addChild(new FastForwardAmount());
     seek->addChild(new RewindAmount());
     seek->addChild(new StickyKeys());
+    seek->addChild(new FFRewRepos());
     seek->addChild(new ExactSeeking());
     seek->addChild(new JumpAmount());
     addChild(seek);


More information about the mythtv-dev mailing list