Index: libs/libmythtv/analogsignalmonitor.cpp
===================================================================
--- libs/libmythtv/analogsignalmonitor.cpp.orig
+++ libs/libmythtv/analogsignalmonitor.cpp
@@ -4,23 +4,92 @@
 #include <cerrno>
 #include <unistd.h>
 #include <sys/ioctl.h>
+#include <poll.h>
 
 #include "videodev_myth.h"
 #include "mythcontext.h"
 #include "analogsignalmonitor.h"
 #include "v4lchannel.h"
 
-#define LOC QString("AnalogSM: ").arg(channel->GetDevice())
-#define LOC_ERR QString("AnalogSM, Error: ").arg(channel->GetDevice())
+#define LOC QString("AnalogSM: %1 ").arg(channel->GetDevice())
+#define LOC_ERR QString("AnalogSM, Error: %1 ").arg(channel->GetDevice())
 
-AnalogSignalMonitor::AnalogSignalMonitor(
-    int db_cardnum, V4LChannel *_channel, uint64_t _flags) :
+AnalogSignalMonitor::AnalogSignalMonitor(int db_cardnum, V4LChannel *_channel,
+                                         uint64_t _flags) :
     SignalMonitor(db_cardnum, _channel, _flags),
-    usingv4l2(false)
+    m_usingv4l2(false),
+    m_stage(0)
 {
     int videofd = channel->GetFd();
     if (videofd >= 0)
-        usingv4l2 = CardUtil::hasV4L2(videofd);
+    {
+        m_usingv4l2 = CardUtil::hasV4L2(videofd);
+        CardUtil::GetV4LInfo(videofd, m_card, m_driver, m_version);
+        VERBOSE(VB_RECORD, LOC + QString("card '%1' driver '%2' version '%3'")
+                .arg(m_card).arg(m_driver).arg(m_version));
+    }
+}
+
+bool AnalogSignalMonitor::handleHDPVR(int videofd)
+{
+    struct v4l2_encoder_cmd command;
+    struct pollfd polls;
+    int    idx;
+
+    if (m_stage == 0)
+    {
+        VERBOSE(VB_RECORD, LOC + "hd-pvr start encoding");
+        // Tell it to start encoding, then wait for it to actually feed us
+        // some data.
+        memset(&command, 0, sizeof(struct v4l2_encoder_cmd));
+        command.cmd = V4L2_ENC_CMD_START;
+        if (ioctl(videofd, VIDIOC_ENCODER_CMD, &command) == 0)
+            m_stage = 1;
+        else
+            VERBOSE(VB_IMPORTANT, LOC_ERR + "Start encoding failed" + ENO);
+    }
+
+    if (m_stage == 1)
+    {
+        VERBOSE(VB_RECORD, LOC + "hd-pvr wait for data");
+
+        polls.fd      = videofd;
+        polls.events  = POLLIN;
+        polls.revents = 0;
+
+        if (poll(&polls, 1, 1500) > 0)
+            m_stage = 2;
+        else
+        {
+            VERBOSE(VB_RECORD, LOC + "Poll timed-out.  Resetting");
+            memset(&command, 0, sizeof(struct v4l2_encoder_cmd));
+            command.cmd = V4L2_ENC_CMD_STOP;
+            ioctl(videofd, VIDIOC_ENCODER_CMD, &command);
+            m_stage = 0;
+        }
+    }
+
+    if (m_stage == 2)
+    {
+        VERBOSE(VB_RECORD, LOC + "hd-pvr data ready.  Stop encoding");
+
+        command.cmd = V4L2_ENC_CMD_STOP;
+        if (ioctl(videofd, VIDIOC_ENCODER_CMD, &command) == 0)
+            m_stage = 3;
+    }
+
+    if (m_stage == 3)
+    {
+        struct v4l2_format vfmt;
+        memset(&vfmt, 0, sizeof(vfmt));
+        vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+            
+        VERBOSE(VB_RECORD, LOC + "hd-pvr waiting for valid resolution");
+        if ((ioctl(videofd, VIDIOC_G_FMT, &vfmt) == 0) && vfmt.fmt.pix.width)
+            m_stage = 4;
+    }
+
+    return (m_stage == 4);
 }
 
 void AnalogSignalMonitor::UpdateValues(void)
@@ -33,19 +102,24 @@ void AnalogSignalMonitor::UpdateValues(v
         return;
 
     bool isLocked = false;
-    if (usingv4l2)
+    if (m_usingv4l2)
     {
-        struct v4l2_tuner tuner;
-        bzero(&tuner, sizeof(tuner));
-
-        if (ioctl(videofd, VIDIOC_G_TUNER, &tuner, 0) < 0)
-        {
-            VERBOSE(VB_IMPORTANT,
-                    LOC_ERR + "Failed to probe signal (v4l2)" + ENO);
-        }
+        if (m_driver == "hdpvr")
+            isLocked = handleHDPVR(videofd);
         else
         {
-            isLocked = tuner.signal;
+            struct v4l2_tuner tuner;
+            bzero(&tuner, sizeof(tuner));
+
+            if (ioctl(videofd, VIDIOC_G_TUNER, &tuner, 0) < 0)
+            {
+                VERBOSE(VB_IMPORTANT,
+                        LOC_ERR + "Failed to probe signal (v4l2)" + ENO);
+            }
+            else
+            {
+                isLocked = tuner.signal;
+            }
         }
     }
     else 
Index: libs/libmythtv/analogsignalmonitor.h
===================================================================
--- libs/libmythtv/analogsignalmonitor.h.orig
+++ libs/libmythtv/analogsignalmonitor.h
@@ -19,7 +19,13 @@ class AnalogSignalMonitor : public Signa
     virtual void UpdateValues(void);
 
   private:
-    bool usingv4l2;
+    bool handleHDPVR(int videofd);
+
+    bool     m_usingv4l2;
+    QString  m_card;
+    QString  m_driver;
+    uint32_t m_version;
+    int      m_stage;
 };
 
 #endif // _ANALOG_SIGNAL_MONITOR_H_
Index: libs/libmythtv/mpegrecorder.cpp
===================================================================
--- libs/libmythtv/mpegrecorder.cpp.orig
+++ libs/libmythtv/mpegrecorder.cpp
@@ -1041,14 +1041,6 @@ void MpegRecorder::StartRecording(void)
 
     if (driver == "hdpvr")
     {
-        if (curRecording->recgroup == "LiveTV")
-        {
-            // Don't bother checking resolution, always use best bitrate
-            int maxbitrate = std::max(high_mpeg4peakbitrate,
-                                      high_mpeg4avgbitrate);
-            SetBitrate(high_mpeg4avgbitrate, maxbitrate, "LiveTV");
-        }
-
         int progNum = 1;
         MPEGStreamData *sd = new MPEGStreamData(progNum, true);
         sd->SetRecordingType(_recording_type);
@@ -1492,7 +1484,7 @@ bool MpegRecorder::StartEncoding(int fd)
     memset(&command, 0, sizeof(struct v4l2_encoder_cmd));
     command.cmd = V4L2_ENC_CMD_START;
 
-    if (driver == "hdpvr" && curRecording->recgroup != "LiveTV")
+    if (driver == "hdpvr")
         HandleResolutionChanges();
 
     VERBOSE(VB_RECORD, LOC + "StartEncoding");
@@ -1615,64 +1607,6 @@ void MpegRecorder::HandleSingleProgramPM
         DTVRecorder::BufferedWrite(*(reinterpret_cast<TSPacket*>(&buf[i])));
 }
 
-/// After a resolution change, it can take the HD-PVR a few
-/// seconds before it is usable again.
-bool MpegRecorder::WaitFor_HDPVR(void)
-{
-    struct v4l2_encoder_cmd command;
-    struct v4l2_format vfmt;
-    struct pollfd polls;
-    int    idx;
-
-    // Tell it to start encoding, then wait for it to actually feed us
-    // some data.
-    QMutexLocker locker(&start_stop_encoding_lock);
-
-    // Sleep any less than 1.5 seconds, and the HD-PVR will
-    // return the old resolution, when the resolution is changing.
-    usleep(1500 * 1000);
-
-    memset(&command, 0, sizeof(struct v4l2_encoder_cmd));
-    command.cmd = V4L2_ENC_CMD_START;
-
-    for (idx = 0; idx < 20; ++idx)
-    {
-        if (ioctl(readfd, VIDIOC_ENCODER_CMD, &command) == 0)
-            break;
-        usleep(100 * 1000);
-    }
-
-    if (idx == 20)
-        return false;
-
-    polls.fd      = readfd;
-    polls.events  = POLLIN;
-    polls.revents = 0;
-
-    if (poll(&polls, 1, 5000) <= 0)
-        return false;
-
-    // HD-PVR should now be "ready"
-    command.cmd = V4L2_ENC_CMD_STOP;
-
-    if (ioctl(readfd, VIDIOC_ENCODER_CMD, &command) < 0)
-        return false;
-
-    memset(&vfmt, 0, sizeof(vfmt));
-    vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
-    for (idx = 0; idx < 20; ++idx)
-    {
-        if (0 == ioctl(chanfd, VIDIOC_G_FMT, &vfmt))
-            return true;
-        // Typically takes 0.9 seconds after a resolution change
-        usleep(100 * 1000);
-    }
-
-    VERBOSE(VB_RECORD, LOC + "WaitForHDPVR failed");
-    return false;
-}
-
 void MpegRecorder::SetBitrate(int bitrate, int maxbitrate,
                               const QString & reason)
 {
@@ -1710,9 +1644,6 @@ void MpegRecorder::HandleResolutionChang
     memset(&vfmt, 0, sizeof(vfmt));
     vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
             
-    if (driver == "hdpvr")
-        WaitFor_HDPVR();
-
     if (0 == ioctl(chanfd, VIDIOC_G_FMT, &vfmt))
     {
         VERBOSE(VB_RECORD, LOC + QString("Got Resolution %1x%2")
Index: libs/libmythtv/mpegrecorder.h
===================================================================
--- libs/libmythtv/mpegrecorder.h.orig
+++ libs/libmythtv/mpegrecorder.h
@@ -86,7 +86,6 @@ class MpegRecorder : public DTVRecorder,
 
     void ResetForNewFile(void);
 
-    bool WaitFor_HDPVR(void);
     void SetBitrate(int bitrate, int maxbitrate, const QString & reason);
     void HandleResolutionChanges(void);
 
Index: libs/libmythtv/signalmonitor.h
===================================================================
--- libs/libmythtv/signalmonitor.h.orig
+++ libs/libmythtv/signalmonitor.h
@@ -287,6 +287,7 @@ inline bool SignalMonitor::IsRequired(co
     return (CardUtil::IsDVBCardType(cardtype) ||
             (cardtype.toUpper() == "HDTV")      ||
             (cardtype.toUpper() == "HDHOMERUN") ||
+            (cardtype.toUpper() == "HDPVR") ||
             (cardtype.toUpper() == "FIREWIRE")  ||
             (cardtype.toUpper() == "FREEBOX"));
 }
@@ -295,6 +296,7 @@ inline bool SignalMonitor::IsSupported(c
 {
     return (IsRequired(cardtype)        ||
             (cardtype.toUpper() == "V4L") ||
+            (cardtype.toUpper() == "HDPVR") ||
             (cardtype.toUpper() == "MPEG"));
 }
 

