diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythhdhomerun/hdhomerun_video.c myth.20207.0313b/mythtv/libs/libmythhdhomerun/hdhomerun_video.c
--- mythtv/libs/libmythhdhomerun/hdhomerun_video.c	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythhdhomerun/hdhomerun_video.c	2009-03-14 12:04:44.000000000 -0500
@@ -49,6 +49,7 @@
 	volatile uint32_t network_error_count;
 	volatile uint32_t sequence_error_count;
 	volatile uint32_t overflow_error_count;
+	volatile uint32_t buffer_highwater_mark;
 	volatile uint8_t sequence[0x2000];
 };
 
@@ -286,6 +287,22 @@
 			head -= vs->buffer_size;
 		}
 
+		/* update buffer_highwater_mark */
+		/* head - where things will be inserted */
+		/* tail - where things will be removed */
+		size_t tail = vs->tail;
+		uint32_t space_used;
+		if (head > tail) {
+			space_used = head - tail;
+		} else {
+			/* head < tail */
+			space_used = (head + vs->buffer_size) - tail;
+		}
+
+		if (space_used > vs->buffer_highwater_mark) {
+			vs->buffer_highwater_mark = space_used;
+		}
+
 		/* Check for buffer overflow. */
 		if (head == vs->tail) {
 			vs->overflow_error_count++;
@@ -367,6 +384,7 @@
 	vs->network_error_count = 0;
 	vs->sequence_error_count = 0;
 	vs->overflow_error_count = 0;
+	vs->buffer_highwater_mark = 0;
 
 	pthread_mutex_unlock(&vs->lock);
 }
@@ -376,10 +394,10 @@
 	struct hdhomerun_video_stats_t stats;
 	hdhomerun_video_get_stats(vs, &stats);
 
-	hdhomerun_debug_printf(vs->dbg, "video sock: pkt=%ld net=%ld te=%ld miss=%ld drop=%ld\n",
+	hdhomerun_debug_printf(vs->dbg, "video sock: pkt=%ld net=%ld te=%ld miss=%ld drop=%ld hwm=%ld\n",
 		stats.packet_count, stats.network_error_count,
 		stats.transport_error_count, stats.sequence_error_count,
-		stats.overflow_error_count
+		stats.overflow_error_count, stats.buffer_highwater_mark
 	);
 }
 
@@ -394,6 +412,7 @@
 	stats->transport_error_count = vs->transport_error_count;
 	stats->sequence_error_count = vs->sequence_error_count;
 	stats->overflow_error_count = vs->overflow_error_count;
+	stats->buffer_highwater_mark = vs->buffer_highwater_mark;
 
 	pthread_mutex_unlock(&vs->lock);
 }
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythhdhomerun/hdhomerun_video.h myth.20207.0313b/mythtv/libs/libmythhdhomerun/hdhomerun_video.h
--- mythtv/libs/libmythhdhomerun/hdhomerun_video.h	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythhdhomerun/hdhomerun_video.h	2009-03-14 12:04:44.000000000 -0500
@@ -41,6 +41,7 @@
 	uint32_t transport_error_count;
 	uint32_t sequence_error_count;
 	uint32_t overflow_error_count;
+	uint32_t buffer_highwater_mark;
 };
 
 #define TS_PACKET_SIZE 188
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/DeviceReadBuffer.cpp myth.20207.0313b/mythtv/libs/libmythtv/DeviceReadBuffer.cpp
--- mythtv/libs/libmythtv/DeviceReadBuffer.cpp	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/DeviceReadBuffer.cpp	2009-03-14 12:03:17.000000000 -0500
@@ -214,8 +214,8 @@
     used     += len;
     writePtr += len;
     writePtr  = (writePtr == endPtr) ? buffer : writePtr;
-#if REPORT_RING_STATS
     max_used = max(used, max_used);
+#if REPORT_RING_STATS
     avg_used = ((avg_used * avg_cnt) + used) / ++avg_cnt;
 #endif
 }
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/DeviceReadBuffer.h myth.20207.0313b/mythtv/libs/libmythtv/DeviceReadBuffer.h
--- mythtv/libs/libmythtv/DeviceReadBuffer.h	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/DeviceReadBuffer.h	2009-03-14 12:03:39.000000000 -0500
@@ -40,6 +40,8 @@
     void Reset(const QString &streamName, int streamfd);
     void Stop(void);
 
+    size_t GetMaxUsed() const { return max_used; };
+
     void SetRequestPause(bool request);
     bool IsPaused(void) const;
     bool WaitForUnpause(unsigned long timeout);
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/ThreadedFileWriter.cpp myth.20207.0313b/mythtv/libs/libmythtv/ThreadedFileWriter.cpp
--- mythtv/libs/libmythtv/ThreadedFileWriter.cpp	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/ThreadedFileWriter.cpp	2009-03-14 12:16:37.000000000 -0500
@@ -134,7 +134,8 @@
     rpos(0),                             wpos(0),
     written(0),
     // buffer
-    buf(NULL),                           tfw_buf_size(0)
+    buf(NULL),                           tfw_buf_size(0),
+    tfw_highwater_mark(0)
 {
     filename.detach();
 }
@@ -168,6 +169,7 @@
 
         tfw_buf_size = TFW_DEF_BUF_SIZE;
         tfw_min_write_size = TFW_MIN_WRITE_SIZE;
+        tfw_highwater_mark = 0;
         pthread_create(&writer, NULL, boot_writer, this);
         pthread_create(&syncer, NULL, boot_syncer, this);
         return true;
@@ -200,6 +202,9 @@
         delete [] buf;
         buf = NULL;
     }
+
+    VERBOSE(VB_GENERAL, LOC + QString("Buffer size = %1 KB hwm = %2 KB")
+        .arg(tfw_buf_size / 1024).arg(tfw_highwater_mark/1024));
 }
 
 /** \fn ThreadedFileWriter::Write(const void*, uint)
@@ -511,10 +516,13 @@
 /** \fn ThreadedFileWriter::BufUsed(void) const
  *  \brief Number of bytes queued for write by the write thread. With locking.
  */
-uint ThreadedFileWriter::BufUsed(void) const
+uint ThreadedFileWriter::BufUsed(void) 
 {
     QMutexLocker locker(&buflock);
-    return (wpos >= rpos) ? wpos - rpos : tfw_buf_size - rpos + wpos;
+    uint result = (wpos >= rpos) ? wpos - rpos : tfw_buf_size - rpos + wpos;
+    if (result > tfw_highwater_mark)
+        tfw_highwater_mark=result;
+    return result;
 }
 
 /**
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/ThreadedFileWriter.h myth.20207.0313b/mythtv/libs/libmythtv/ThreadedFileWriter.h
--- mythtv/libs/libmythtv/ThreadedFileWriter.h	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/ThreadedFileWriter.h	2009-03-14 12:14:14.000000000 -0500
@@ -21,7 +21,7 @@
     void SetWriteBufferSize(uint newSize = TFW_DEF_BUF_SIZE);
     void SetWriteBufferMinWriteSize(uint newMinSize = TFW_MIN_WRITE_SIZE);
 
-    uint BufUsed(void) const;
+    uint BufUsed(void);
     uint BufFree(void) const;
 
     void Sync(void);
@@ -61,6 +61,7 @@
     // buffer
     char           *buf;
     unsigned long   tfw_buf_size;
+    unsigned long   tfw_highwater_mark;
 
     // threads
     pthread_t       writer;
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/dvbrecorder.cpp myth.20207.0313b/mythtv/libs/libmythtv/dvbrecorder.cpp
--- mythtv/libs/libmythtv/dvbrecorder.cpp	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/dvbrecorder.cpp	2009-03-14 12:04:44.000000000 -0500
@@ -330,6 +330,13 @@
 {
     VERBOSE(VB_RECORD, LOC + "Close() fd("<<_stream_fd<<") -- begin");
 
+    uint hwm = _stream_handler->GetMaxUsed();
+    VERBOSE(VB_GENERAL,QString( LOC + "DVB Stats: pkts=%1 hwm=%2 KB Errors: trnsprt=%3 seq=%4")
+            .arg(_total_packet_count)
+            .arg(hwm/1024)
+            .arg(_transport_error_count)
+            .arg(_continuity_error_count));
+
     DVBStreamHandler::Return(_stream_handler);
 
     VERBOSE(VB_RECORD, LOC + "Close() fd("<<_stream_fd<<") -- end");
@@ -374,6 +381,9 @@
 
     _continuity_error_count = 0;
     _stream_overflow_count = 0;
+    _transport_error_count = 0;
+    _bad_packet_count = 0;
+    _total_packet_count = 0;
 
     _request_recording = true;
     _recording = true;
@@ -519,6 +529,11 @@
                 QString("PID 0x%1 discontinuity detected").arg(pid,0,16));
         _continuity_error_count++;
     }
+    if (tspacket.TransportError())
+    {
+        _transport_error_count++;
+    }
+    _total_packet_count++;
 
     // Sync recording start to first keyframe
     if (_wait_for_keyframe_option && _first_keyframe < 0)
@@ -553,6 +568,12 @@
                 QString("PID 0x%1 discontinuity detected").arg(pid,0,16));
         _continuity_error_count++;
     }
+    if (tspacket.TransportError())
+    {
+        _transport_error_count++;
+    }
+
+    _total_packet_count++;
 
     // Only create fake keyframe[s] if there are no audio/video streams
     if (_input_pmt && _has_no_av)
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/dvbrecorder.h myth.20207.0313b/mythtv/libs/libmythtv/dvbrecorder.h
--- mythtv/libs/libmythtv/dvbrecorder.h	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/dvbrecorder.h	2009-03-14 12:04:44.000000000 -0500
@@ -125,6 +125,8 @@
     mutable uint        _continuity_error_count;
     mutable uint        _stream_overflow_count;
     mutable uint        _bad_packet_count;
+    mutable uint        _transport_error_count;
+    mutable uint        _total_packet_count;
 
     // Constants
     static const int TSPACKETS_BETWEEN_PSIP_SYNC;
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/dvbstreamhandler.cpp myth.20207.0313b/mythtv/libs/libmythtv/dvbstreamhandler.cpp
--- mythtv/libs/libmythtv/dvbstreamhandler.cpp	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/dvbstreamhandler.cpp	2009-03-14 12:07:43.000000000 -0500
@@ -98,7 +98,8 @@
 
     _pid_lock(QMutex::Recursive),
     _open_pid_filters(0),
-    _listener_lock(QMutex::Recursive)
+    _listener_lock(QMutex::Recursive),
+    _max_used(0)
 {
 }
 
@@ -208,6 +209,16 @@
     }
 }
 
+uint DVBStreamHandler::GetMaxUsed(void)
+{
+    QMutexLocker locker(&_start_stop_lock);
+    if (_device_read_buffer)
+    {
+       _max_used = _device_read_buffer->GetMaxUsed();
+    }
+    return _max_used;
+}
+
 void DVBStreamHandler::Stop(void)
 {
     QMutexLocker locker(&_start_stop_lock);
@@ -215,7 +226,10 @@
     if (IsRunning())
     {
         if (_device_read_buffer)
+        {
             _device_read_buffer->Stop();
+            _max_used = _device_read_buffer->GetMaxUsed();
+        }
         SetRunning(false);
         pthread_join(_reader_thread, NULL);
     }
@@ -255,6 +269,8 @@
         return;
     bzero(buffer, buffer_size);
 
+    VERBOSE(VB_GENERAL, QString(LOC + "HD Ringbuffer size = %1 KB").arg(buffer_size / 1024));
+
     QByteArray dvr_dev_path = _dvr_dev_path.toAscii();
     int dvr_fd = open(dvr_dev_path.constData(), O_RDONLY | O_NONBLOCK);
     if (dvr_fd < 0)
@@ -369,6 +385,8 @@
         if (_device_read_buffer->IsRunning())
             _device_read_buffer->Stop();
 
+        _max_used=_device_read_buffer->GetMaxUsed();
+
         delete _device_read_buffer;
         _device_read_buffer = NULL;
     }
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/dvbstreamhandler.h myth.20207.0313b/mythtv/libs/libmythtv/dvbstreamhandler.h
--- mythtv/libs/libmythtv/dvbstreamhandler.h	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/dvbstreamhandler.h	2009-03-14 12:04:44.000000000 -0500
@@ -70,6 +70,8 @@
     // ReaderPausedCB
     virtual void ReaderPaused(int fd) { (void) fd; }
 
+    uint GetMaxUsed();
+
   private:
     DVBStreamHandler(const QString &);
     ~DVBStreamHandler();
@@ -118,6 +120,8 @@
     mutable QMutex          _listener_lock;
     vector<MPEGStreamData*> _stream_data_list;
 
+    uint _max_used;
+
     // for caching TS monitoring supported value.
     static QMutex             _rec_supports_ts_monitoring_lock;
     static QMap<QString,bool> _rec_supports_ts_monitoring;
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/hdhrrecorder.cpp myth.20207.0313b/mythtv/libs/libmythtv/hdhrrecorder.cpp
--- mythtv/libs/libmythtv/hdhrrecorder.cpp	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/hdhrrecorder.cpp	2009-03-14 12:04:44.000000000 -0500
@@ -117,6 +117,7 @@
     memset(_continuity_counter, 0xff, sizeof(_continuity_counter));
 
     _stream_handler = HDHRStreamHandler::Get(_channel->GetDevice());
+    _stream_handler->GetStats(&_start_stats, false);
 
     VERBOSE(VB_RECORD, LOC + "HDHR opened successfully");
 
@@ -129,6 +130,17 @@
 
     if (IsOpen())
     {
+        hdhomerun_video_stats_t end_stats;
+        _stream_handler->GetStats(&end_stats, true);
+
+        VERBOSE(VB_GENERAL,QString( LOC + "HDHR Stats: pkts=%1 hwm=%6 KB Errors: net=%2 trnsprt=%3 seq=%4 ovflow=%5")
+               .arg(end_stats.packet_count          - _start_stats.packet_count)
+               .arg(end_stats.network_error_count   - _start_stats.network_error_count)
+               .arg(end_stats.transport_error_count - _start_stats.transport_error_count)
+               .arg(end_stats.sequence_error_count  - _start_stats.sequence_error_count)
+               .arg(end_stats.overflow_error_count  - _start_stats.overflow_error_count)
+               .arg(end_stats.buffer_highwater_mark / 1024)); /* buffer_highwater_mark is absolute */
+
         HDHRStreamHandler::Return(_stream_handler); 
     }
 
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/hdhrrecorder.h myth.20207.0313b/mythtv/libs/libmythtv/hdhrrecorder.h
--- mythtv/libs/libmythtv/hdhrrecorder.h	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/hdhrrecorder.h	2009-03-14 12:04:44.000000000 -0500
@@ -95,6 +95,8 @@
     ProgramMapTable               *_input_pmt;
     bool                           _has_no_av;
 
+    hdhomerun_video_stats_t       _start_stats;
+
     unsigned char   _stream_id[0x1fff];
     unsigned char   _pid_status[0x1fff];
     unsigned char   _continuity_counter[0x1fff];
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/hdhrstreamhandler.cpp myth.20207.0313b/mythtv/libs/libmythtv/hdhrstreamhandler.cpp
--- mythtv/libs/libmythtv/hdhrstreamhandler.cpp	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/hdhrstreamhandler.cpp	2009-03-14 12:04:44.000000000 -0500
@@ -112,6 +112,7 @@
     _listener_lock(QMutex::Recursive),
     _hdhr_lock(QMutex::Recursive)
 {
+    memset(&_last_stats, 0, sizeof(_last_stats));
 }
 
 HDHRStreamHandler::~HDHRStreamHandler()
@@ -294,6 +295,18 @@
     return (QString::null != TunerSet("target", "0.0.0.0:0"));
 }
 
+void HDHRStreamHandler::GetStats(hdhomerun_video_stats_t* stats, bool use_cache) {
+    QMutexLocker locker(&_hdhr_lock);
+    if (_video_socket) {
+        hdhomerun_video_get_stats(_video_socket, &_last_stats);
+        memcpy(stats, &_last_stats, sizeof(hdhomerun_video_stats_t));
+    } else if (use_cache) {
+        memcpy(stats, &_last_stats, sizeof(hdhomerun_video_stats_t));
+    } else {
+        memset(stats, 0, sizeof(hdhomerun_video_stats_t));
+    }
+}
+
 QString HDHRStreamHandler::GetTunerStatus() {
     return TunerGet("status");
 }
@@ -511,6 +524,7 @@
     hdhomerun_video_sock_t* tmp_video_socket;
     {
         QMutexLocker locker(&_hdhr_lock);
+        hdhomerun_video_get_stats(_video_socket, &_last_stats);
         tmp_video_socket = _video_socket;
         _video_socket=NULL;
     }
diff -r -u -N -X diff.exclude -x myth.20207.0313a -x myth.20207.0313b myth.20207.0313a/mythtv/libs/libmythtv/hdhrstreamhandler.h myth.20207.0313b/mythtv/libs/libmythtv/hdhrstreamhandler.h
--- mythtv/libs/libmythtv/hdhrstreamhandler.h	2009-03-14 12:02:23.000000000 -0500
+++ mythtv/libs/libmythtv/hdhrstreamhandler.h	2009-03-14 12:04:44.000000000 -0500
@@ -50,6 +50,8 @@
                           DTVSignalMonitor *sigmon,
                           HDHRChannel       *dvbchan);
 
+    void GetStats(hdhomerun_video_stats_t* stats, bool use_cache);
+
     // ReaderPausedCB
     virtual void ReaderPaused(int fd) { (void) fd; }
 
@@ -106,6 +108,7 @@
   private:
     hdhomerun_control_sock_t  *_control_socket;
     hdhomerun_video_sock_t    *_video_socket;
+    hdhomerun_video_stats_t    _last_stats;
     uint                       _device_id;
     uint                       _device_ip;
     uint                       _tuner;
