Index: libs/libmythtv/tv_play.cpp
===================================================================
--- libs/libmythtv/tv_play.cpp	(revision 7679)
+++ libs/libmythtv/tv_play.cpp	(working copy)
@@ -187,6 +187,7 @@
       exitPlayer(false), paused(false), errored(false),
       stretchAdjustment(false),
       audiosyncAdjustment(false), audiosyncBaseline(LONG_LONG_MIN),
+      skipAdjustment(kSkipNone), skipNumeric(false),
       editmode(false), zoomMode(false), sigMonMode(false),
       update_osd_pos(false), endOfRecording(false), requestDelete(false),
       doSmartForward(false),
@@ -1857,6 +1858,31 @@
         }
     }
 
+    if (skipAdjustment != kSkipNone)
+    {
+        for (unsigned int i = 0; i < actions.size(); i++)
+        {
+            action = actions[i];
+            handled = true;
+
+            if (action == "LEFT")
+                ChangeSkip(-1);
+            else if (action == "RIGHT")
+                ChangeSkip(1);
+            else if (action == "UP")
+                ChangeSkip(-10);
+            else if (action == "DOWN")
+                ChangeSkip(10);
+            else if (action == "0" || action == "1" || action == "2" ||
+                     action == "3" || action == "4" || action == "5" ||
+                     action == "6" || action == "7" || action == "8" ||
+                     action == "9")
+                ChangeSkip(1000000 + action.toInt());
+            else
+                handled = false;
+        }
+    }
+
 #if DEBUG_ACTIONS
     for (uint i = 0; i < actions.size(); ++i)
         VERBOSE(VB_IMPORTANT, LOC + QString("handled(%1) actions[%2](%3)")
@@ -4040,6 +4066,75 @@
     }
 }
 
+void TV::ChangeSkip(int dir, bool allowEdit)
+{
+    int *val;
+    int newval;
+    QString desc;
+
+    switch (skipAdjustment)
+    {
+        case kSkipNone:
+            return;
+        case kSkipForward:
+            val = &fftime;
+            desc = tr("Skip Ahead");
+            break;
+        case kSkipReverse:
+            val = &rewtime;
+            desc = tr("Skip Back");
+            break;
+        case kSkipJump:
+            val = &jumptime;
+            desc = tr("Jump");
+            break;
+        default:
+            return;
+    }
+
+    newval = *val;
+
+    if (dir > 1000000)
+    {
+        if (!skipNumeric) newval = 0;
+        else newval *= 10;
+        skipNumeric = true;
+        newval += (dir - 1000000);
+    }
+    else
+    {
+        skipNumeric = false;
+        newval += dir;
+    }
+
+    if (newval < 0) newval = 0;
+
+    *val = newval;
+
+    if (GetOSD() && !browsemode)
+    {
+        QString text;
+        int dispval = newval;
+
+        if (skipAdjustment == kSkipForward || skipAdjustment == kSkipReverse)
+        {
+            dispval *= 10;
+            text = QString(" %1 s").arg(newval);
+        }
+        else 
+        {
+            dispval *= 100;
+            text = QString(" %1 m").arg(newval);
+        }
+
+        GetOSD()->StartPause(dispval, false, desc, desc + text, 10, 
+                        kOSDFunctionalType_SkipAdjust);
+        update_osd_pos = false;
+    }
+
+    if (!allowEdit) skipAdjustment = kSkipNone;
+}
+
 void TV::ToggleMute(void)
 {
     kMuteState mute_status;
@@ -4527,6 +4622,9 @@
         case kOSDFunctionalType_AudioSyncAdjust:
             audiosyncAdjustment = false;
             break;
+        case kOSDFunctionalType_SkipAdjust:
+            skipAdjustment = kSkipNone;
+            break;
         case kOSDFunctionalType_Default:
             break;
     }
@@ -4727,6 +4825,21 @@
         ToggleLetterbox(action.right(1).toInt());
         hidetree = false;
     }
+    else if (action == "EDITFFTIME")
+    {
+        skipAdjustment = kSkipForward;
+        ChangeSkip(0);
+    }
+    else if (action == "EDITREWTIME")
+    {
+        skipAdjustment = kSkipReverse;
+        ChangeSkip(0);
+    }
+    else if (action == "EDITJUMPTIME")
+    {
+        skipAdjustment = kSkipJump;
+        ChangeSkip(0);
+    }
     else if (action == "NEXTAUDIO")
         ChangeAudioTrack(1);
     else if (action == "PREVAUDIO")
@@ -4933,6 +5046,11 @@
         }
     }
 
+    item = new OSDGenericTree(treeMenu, tr("Change Skip Lengths"));
+    subitem = new OSDGenericTree(item, tr("Change Skip Ahead"), "EDITFFTIME");
+    subitem = new OSDGenericTree(item, tr("Change Skip Back"), "EDITREWTIME");
+    subitem = new OSDGenericTree(item, tr("Change Jump"), "EDITJUMPTIME");
+
     int letterbox = nvp->GetLetterbox();
     item = new OSDGenericTree(treeMenu, tr("Change Aspect Ratio"));
     subitem = new OSDGenericTree(item, tr("4:3"), "TOGGLEASPECT" +
