diff -u -r -p mythtv.102/external/FFmpeg/libavformat/mpegts.c mythtv/external/FFmpeg/libavformat/mpegts.c
--- mythtv.102/external/FFmpeg/libavformat/mpegts.c	2011-01-23 12:29:34.000000000 +0100
+++ mythtv/external/FFmpeg/libavformat/mpegts.c	2011-01-23 20:56:44.110409002 +0100
@@ -2096,8 +2096,14 @@ static int read_packet(AVFormatContext *
 
     for(;;) {
         len = get_buffer(pb, buf, TS_PACKET_SIZE);
-        if (len != TS_PACKET_SIZE)
-            return AVERROR(EIO);
+        if (len != TS_PACKET_SIZE) {
+	    if (pb->error == AVERROR(EAGAIN)) {
+		/* workarround to solve livetv ringbuffer underrun */
+		pb->error = pb->eof_reached = 0;
+		return AVERROR(EAGAIN);
+	    } else
+        	return AVERROR(EIO);
+        }
         /* check paquet sync byte */
         if (buf[0] != 0x47) {
             /* find a new packet start */
diff -u -r -p mythtv.102/libs/libmythtv/ringbuffer.cpp mythtv/libs/libmythtv/ringbuffer.cpp
--- mythtv.102/libs/libmythtv/ringbuffer.cpp	2011-01-23 17:49:04.306409001 +0100
+++ mythtv/libs/libmythtv/ringbuffer.cpp	2011-01-23 21:14:39.694409002 +0100
@@ -1149,10 +1148,14 @@ int RingBuffer::ReadPriv(void *buf, int 
     {
         // this can happen under a few conditions but the most
         // notable is an exit from the read ahead thread or
-        // the end of the file stream has been reached.
-        VERBOSE(VB_FILE, LOC + loc_desc + ": ReadBufAvail() == 0");
+        // the end of the file stream has been reached or
+        // encoder stream underrun when live tv switching to
+        // next program
+        VERBOSE(VB_FILE, LOC + loc_desc + ": ReadBufAvail() == 0" +
+    	    QString(" livetvchain=%1")
+            .arg(livetvchain ? 1 : 0));
         rwlock.unlock();
-        return count;
+        return livetvchain ? -EAGAIN : -EIO;
     }
 
     if (peek)
