Index: libs/libmyth/remotefile.h
===================================================================
--- libs/libmyth/remotefile.h	(revision 14091)
+++ libs/libmyth/remotefile.h	(working copy)
@@ -22,6 +22,7 @@
 
     int Read(void *data, int size);
     void Reset(void);
+    int GetStarvedCount() const { return starvedCount; };
 
     bool SaveAs(QByteArray &data);
 
@@ -47,6 +48,7 @@
     bool            timeoutisfast;
     long long       readposition;
     int             recordernum;
+    int             starvedCount;
 
     mutable QMutex  lock;
     MythSocket     *controlSock;
Index: libs/libmyth/remotefile.cpp
===================================================================
--- libs/libmyth/remotefile.cpp	(revision 14091)
+++ libs/libmyth/remotefile.cpp	(working copy)
@@ -224,6 +224,7 @@
     strlist << QString::number(size);
     controlSock->writeStringList(strlist);
 
+    starvedCount = 0;
     sent = size;
     
     while (recv < sent && !error && zerocnt++ < 50)
@@ -235,6 +236,10 @@
             {
                 recv += ret;
             }
+            else if (ret == 0)
+            {
+                starvedCount++;
+            }
             else if (sock->error() != MythSocket::NoError)
             {
                 VERBOSE(VB_IMPORTANT, "RemoteFile::Read(): socket error");
Index: libs/libmythtv/RingBuffer.h
===================================================================
--- libs/libmythtv/RingBuffer.h	(revision 14091)
+++ libs/libmythtv/RingBuffer.h	(working copy)
@@ -57,6 +57,8 @@
                bool toAdjust      = false,
                bool resetInternal = false);
 
+    int  GetStarvedCount() const { return starvedCount; }
+
     // Seeks
     long long Seek(long long pos, int whence);
 
@@ -172,6 +174,8 @@
     LiveTVChain *livetvchain;
     bool ignoreliveeof;
 
+    int starvedCount;
+
     long long readAdjust;
 
     /// Condition to signal that the read ahead thread is running
Index: libs/libmythtv/RingBuffer.cpp
===================================================================
--- libs/libmythtv/RingBuffer.cpp	(revision 14091)
+++ libs/libmythtv/RingBuffer.cpp	(working copy)
@@ -100,6 +100,7 @@
       numfailures(0),           commserror(false),
       dvdPriv(NULL),            oldfile(false),
       livetvchain(NULL),        ignoreliveeof(false),
+      starvedCount(0),
       readAdjust(0)
 {
     pthread_rwlock_init(&rwlock, NULL);
@@ -396,6 +397,9 @@
     unsigned errcnt = 0;
     unsigned zerocnt = 0;
 
+    if (!readaheadrunning)
+        starvedCount = 0;
+
     if (fd < 0)
     {
         VERBOSE(VB_IMPORTANT, LOC_ERR +
@@ -446,6 +450,9 @@
         if (tot < sz)
             usleep(60000);
     }
+    if (!readaheadrunning)
+        starvedCount = zerocnt;
+
     return tot;
 }
 
@@ -461,6 +468,9 @@
 {
     int ret = 0;
 
+    if (!readaheadrunning)
+        starvedCount = 0;
+
     ret = rf->Read(data, sz);
     if (ret < 0)
     {
@@ -471,6 +481,8 @@
         ret = 0;
         numfailures++;
      }
+    if (!readaheadrunning)
+        starvedCount = rf->GetStarvedCount();
 
     return ret;
 }
@@ -935,6 +947,8 @@
     bool readone = false;
     int readErr = 0;
     
+    starvedCount = 0;
+
     if (readaheadpaused && stopreads)
     {
         readone = true;
@@ -1021,6 +1035,7 @@
                 availWaitMutex.unlock();
                 return 0;
             }
+            starvedCount++;
         }
 
         wanttoread = 0;
Index: libs/libmythtv/decoderbase.h
===================================================================
--- libs/libmythtv/decoderbase.h	(revision 14091)
+++ libs/libmythtv/decoderbase.h	(working copy)
@@ -123,6 +123,8 @@
     bool GetWaitForChange(void);
     void SetReadAdjust(long long adjust);
 
+    int  GetStarvedCount() const { return starvedCount; }
+
     // DVD public stuff
     void ChangeDVDTrack(bool ffw);
     long long DVDFindPosition(long long desiredFrame);
@@ -213,6 +215,8 @@
     bool getrawframes;
     bool getrawvideo;
 
+    int  starvedCount;
+
     bool errored;
 
     bool waitingForChange;
Index: libs/libmythtv/decoderbase.cpp
===================================================================
--- libs/libmythtv/decoderbase.cpp	(revision 14091)
+++ libs/libmythtv/decoderbase.cpp	(working copy)
@@ -39,6 +39,7 @@
 
       hasKeyFrameAdjustTable(false), lowbuffers(false),
       getrawframes(false), getrawvideo(false),
+      starvedCount(0),
       errored(false), waitingForChange(false), readAdjust(0),
       justAfterChange(false),
       // language preference
Index: libs/libmythtv/avformatdecoder.cpp
===================================================================
--- libs/libmythtv/avformatdecoder.cpp	(revision 14091)
+++ libs/libmythtv/avformatdecoder.cpp	(working copy)
@@ -2835,6 +2835,14 @@
                     delete pkt;
                 return false;
             }
+            starvedCount = avfRingBuffer->GetRingBuffer()->GetStarvedCount();
+#if 1
+            // for debugging
+            if (starvedCount > 0)
+            {
+                VERBOSE(VB_PLAYBACK, LOC_ERR + QString("AVF Starved %1").arg(starvedCount));
+            }
+#endif
 
             if (waitingForChange && pkt->pos >= readAdjust)
                 FileChanged();
Index: libs/libmythtv/nuppeldecoder.cpp
===================================================================
--- libs/libmythtv/nuppeldecoder.cpp	(revision 14091)
+++ libs/libmythtv/nuppeldecoder.cpp	(working copy)
@@ -988,6 +988,7 @@
     int seeklen = 0;
 
     decoded_video_frame = NULL;
+    starvedCount = 0;
 
     while (!gotvideo)
     {
@@ -1005,6 +1006,7 @@
             return false;
         }
 
+        starvedCount += ringBuffer->GetStarvedCount();
 
         if (!ringBuffer->LiveMode() && 
             ((frameheader.frametype == 'Q') || (frameheader.frametype == 'K')))
@@ -1031,6 +1033,7 @@
                 GetNVP()->SetEof();
                 return false;
             }
+            starvedCount += ringBuffer->GetStarvedCount();
             seeklen = 1;
         }
 
@@ -1046,6 +1049,7 @@
                 GetNVP()->SetEof();
                 return false;
             }
+            starvedCount += ringBuffer->GetStarvedCount();
 
             delete [] dummy;
             continue;
@@ -1115,6 +1119,7 @@
                 GetNVP()->SetEof();
                 return false;
             }
+            starvedCount += ringBuffer->GetStarvedCount();
         }
         else
             continue;
Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.cpp	(revision 14150)
+++ libs/libmythtv/NuppelVideoPlayer.cpp	(working copy)
@@ -1265,7 +1265,8 @@
     CheckPrebuffering();
 
     if ((play_speed > 1.01f) && (audio_stretchfactor > 1.01f) && 
-         livetv && IsNearEnd())
+         (livetv || (watchingrecording && nvr_enc && nvr_enc->IsValidRecorder()))
+         && (IsNearEnd() || GetDecoder()->GetStarvedCount()>0))
     {
         VERBOSE(VB_PLAYBACK, LOC + "Near end, Slowing down playback.");
         Play(1.0f, true, true);
