Index: libs/libmythtv/mpegrecorder.h
===================================================================
--- libs/libmythtv/mpegrecorder.h	(revision 17572)
+++ libs/libmythtv/mpegrecorder.h	(working copy)
@@ -75,6 +75,7 @@
     bool StartEncoding(int fd);
     bool StopEncoding(int fd);
 
+    void InitHDpvr(void);
     void ResetForNewFile(void);
 
     inline bool CheckCC(uint pid, uint cc);
Index: libs/libmythtv/v4lchannel.cpp
===================================================================
--- libs/libmythtv/v4lchannel.cpp	(revision 17572)
+++ libs/libmythtv/v4lchannel.cpp	(working copy)
@@ -505,6 +505,7 @@
     if ((*it)->externalChanger.isEmpty())
     {
         if ((*it)->name.contains("composite", false) ||
+            (*it)->name.contains("component", false) ||
             (*it)->name.contains("s-video", false))
         {
             VERBOSE(VB_GENERAL, LOC_WARN + "You have not set "
Index: libs/libmythtv/mpegrecorder.cpp
===================================================================
--- libs/libmythtv/mpegrecorder.cpp	(revision 17572)
+++ libs/libmythtv/mpegrecorder.cpp	(working copy)
@@ -861,6 +861,25 @@
         return OpenV4L2DeviceAsInput();
 }
 
+void MpegRecorder::InitHDpvr(void)
+{
+    SetPositionMapType(MARK_GOP_BYFRAME);
+    
+    int progNum = 1;
+    MPEGStreamData *sd = new MPEGStreamData(progNum, true);
+    sd->SetRecordingType(_recording_type);
+    SetStreamData(sd);
+    
+    _stream_data->AddAVListener(this);
+    _stream_data->AddWritingListener(this);
+    
+    // Make sure the first things in the file are a PAT & PMT
+    _wait_for_keyframe_option = false;
+    HandleSingleProgramPAT(_stream_data->PATSingleProgram());
+    HandleSingleProgramPMT(_stream_data->PMTSingleProgram());
+    _wait_for_keyframe_option = true;
+}
+
 void MpegRecorder::StartRecording(void)
 {
     if (!Open())
@@ -875,21 +894,7 @@
 
     if (driver == "hdpvr")
     {
-        SetPositionMapType(MARK_GOP_BYFRAME);
-
-        int progNum = 1;
-        MPEGStreamData *sd = new MPEGStreamData(progNum, true);
-        sd->SetRecordingType(_recording_type);
-        SetStreamData(sd);
-
-        _stream_data->AddAVListener(this);
-        _stream_data->AddWritingListener(this);
-
-        // Make sure the first things in the file are a PAT & PMT
-        _wait_for_keyframe_option = false;
-        HandleSingleProgramPAT(_stream_data->PATSingleProgram());
-        HandleSingleProgramPMT(_stream_data->PMTSingleProgram());
-        _wait_for_keyframe_option = true;
+	InitHDpvr();
     }
     else
     {
@@ -960,18 +965,29 @@
                     continue;
 
                 case 0:
-                    VERBOSE(VB_IMPORTANT, LOC_ERR + "select timeout - "
-                            "driver has stopped responding");
+		  VERBOSE(VB_IMPORTANT, LOC_ERR + "select timeout - "
+			  "driver has stopped responding");
+		  
+		  TeardownAll();
+		  if (!Open()) 
+		      VERBOSE(VB_IMPORTANT, LOC_ERR + "Open failed" + ENO);
+	    
+		  if (driver == "hdpvr")
+		  {
+		      if (!ringBuffer)
+			  return;
 
-                    if (close(readfd) != 0)
-                    {
-                        VERBOSE(VB_IMPORTANT, LOC_ERR + "Close error" + ENO);
-                    }
+		      ringBuffer->WriterSeek(0, SEEK_SET);
 
-                    // Force card to be reopened on next iteration..
-                    readfd = -1;
+		      _start_code = 0xffffffff;
+		      _last_gop_seen = 0;
+		      _frames_written_count = 0;
+		      
+		      InitHDpvr();
+		      remainder = 0;
+		  }
 
-                    continue;
+		  continue;
                 
                 default: break;
             }
