diff -r -u -N -X diff.exclude -x release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/DeviceReadBuffer.cpp release.19703.0116d/mythtv/libs/libmythtv/DeviceReadBuffer.cpp
--- mythtv/libs/libmythtv/DeviceReadBuffer.cpp	2008-03-15 23:22:10.000000000 -0500
+++ mythtv/libs/libmythtv/DeviceReadBuffer.cpp	2009-01-17 01:06:55.000000000 -0600
@@ -196,8 +196,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 release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/DeviceReadBuffer.h release.19703.0116d/mythtv/libs/libmythtv/DeviceReadBuffer.h
--- mythtv/libs/libmythtv/DeviceReadBuffer.h	2008-03-15 23:22:10.000000000 -0500
+++ mythtv/libs/libmythtv/DeviceReadBuffer.h	2009-01-17 01:07:20.000000000 -0600
@@ -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(int timeout);
diff -r -u -N -X diff.exclude -x release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/ThreadedFileWriter.cpp release.19703.0116d/mythtv/libs/libmythtv/ThreadedFileWriter.cpp
--- mythtv/libs/libmythtv/ThreadedFileWriter.cpp	2009-01-16 18:15:23.000000000 -0600
+++ mythtv/libs/libmythtv/ThreadedFileWriter.cpp	2009-01-17 01:09:03.000000000 -0600
@@ -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)
 {
 }
 
@@ -160,6 +161,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;
@@ -192,6 +194,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)
@@ -434,7 +439,10 @@
 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;
 }
 
 /** \fn ThreadedFileWriter::BufFree(void)
diff -r -u -N -X diff.exclude -x release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/ThreadedFileWriter.h release.19703.0116d/mythtv/libs/libmythtv/ThreadedFileWriter.h
--- mythtv/libs/libmythtv/ThreadedFileWriter.h	2008-03-15 23:22:10.000000000 -0500
+++ mythtv/libs/libmythtv/ThreadedFileWriter.h	2009-01-17 01:09:28.000000000 -0600
@@ -58,6 +58,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 release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/dvbrecorder.cpp release.19703.0116d/mythtv/libs/libmythtv/dvbrecorder.cpp
--- mythtv/libs/libmythtv/dvbrecorder.cpp	2009-01-16 18:17:22.000000000 -0600
+++ mythtv/libs/libmythtv/dvbrecorder.cpp	2009-01-17 01:11:51.000000000 -0600
@@ -337,6 +337,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");
@@ -381,6 +388,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;
@@ -524,6 +534,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)
@@ -558,6 +573,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 release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/dvbrecorder.h release.19703.0116d/mythtv/libs/libmythtv/dvbrecorder.h
--- mythtv/libs/libmythtv/dvbrecorder.h	2009-01-16 18:17:22.000000000 -0600
+++ mythtv/libs/libmythtv/dvbrecorder.h	2009-01-17 01:12:14.000000000 -0600
@@ -130,6 +130,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 release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/dvbstreamhandler.cpp release.19703.0116d/mythtv/libs/libmythtv/dvbstreamhandler.cpp
--- mythtv/libs/libmythtv/dvbstreamhandler.cpp	2008-03-15 23:22:10.000000000 -0500
+++ mythtv/libs/libmythtv/dvbstreamhandler.cpp	2009-01-17 01:16:04.000000000 -0600
@@ -97,7 +97,8 @@
     _dvbchannel(NULL),
 
     _pid_lock(true),
-    _listener_lock(true)
+    _listener_lock(true),
+    _max_used(0)
 {
 }
 
@@ -196,6 +197,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);
@@ -203,7 +214,10 @@
     if (IsRunning())
     {
         if (_device_read_buffer)
+        {
             _device_read_buffer->Stop();
+            _max_used = _device_read_buffer->GetMaxUsed();
+        }
         SetRunning(false);
         pthread_join(_reader_thread, NULL);
     }
@@ -243,6 +257,8 @@
         return;
     bzero(buffer, buffer_size);
 
+    VERBOSE(VB_GENERAL, QString(LOC + "HD Ringbuffer size = %1 KB").arg(buffer_size / 1024));
+
     int dvr_fd = open(_dvr_dev_path.ascii(), O_RDONLY | O_NONBLOCK);
     if (dvr_fd < 0)
     {
@@ -348,6 +364,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 release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/dvbstreamhandler.h release.19703.0116d/mythtv/libs/libmythtv/dvbstreamhandler.h
--- mythtv/libs/libmythtv/dvbstreamhandler.h	2008-03-15 23:22:10.000000000 -0500
+++ mythtv/libs/libmythtv/dvbstreamhandler.h	2009-01-17 01:16:51.000000000 -0600
@@ -70,6 +70,8 @@
     // ReaderPausedCB
     virtual void ReaderPaused(int fd) { (void) fd; }
 
+    uint GetMaxUsed();
+
   private:
     DVBStreamHandler(uint);
     ~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<uint,bool> _rec_supports_ts_monitoring;
diff -r -u -N -X diff.exclude -x release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.c release.19703.0116d/mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.c
--- mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.c	2009-01-16 18:31:54.000000000 -0600
+++ mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.c	2009-01-17 01:21:59.000000000 -0600
@@ -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 release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.h release.19703.0116d/mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.h
--- mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.h	2009-01-16 18:31:54.000000000 -0600
+++ mythtv/libs/libmythtv/hdhomerun/hdhomerun_video.h	2009-01-17 01:22:18.000000000 -0600
@@ -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 release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/hdhrrecorder.cpp release.19703.0116d/mythtv/libs/libmythtv/hdhrrecorder.cpp
--- mythtv/libs/libmythtv/hdhrrecorder.cpp	2009-01-17 00:09:11.000000000 -0600
+++ mythtv/libs/libmythtv/hdhrrecorder.cpp	2009-01-17 01:25:12.000000000 -0600
@@ -116,6 +116,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");
 
@@ -128,6 +129,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); 
     }
     else
diff -r -u -N -X diff.exclude -x release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/hdhrrecorder.h release.19703.0116d/mythtv/libs/libmythtv/hdhrrecorder.h
--- mythtv/libs/libmythtv/hdhrrecorder.h	2009-01-17 00:09:11.000000000 -0600
+++ mythtv/libs/libmythtv/hdhrrecorder.h	2009-01-17 01:25:34.000000000 -0600
@@ -92,6 +92,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 release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/hdhrstreamhandler.cpp release.19703.0116d/mythtv/libs/libmythtv/hdhrstreamhandler.cpp
--- mythtv/libs/libmythtv/hdhrstreamhandler.cpp	2009-01-17 00:20:37.000000000 -0600
+++ mythtv/libs/libmythtv/hdhrstreamhandler.cpp	2009-01-17 01:27:18.000000000 -0600
@@ -102,6 +102,7 @@
     _listener_lock(true),
     _hdhr_lock(true)
 {
+    memset(&_last_stats, 0, sizeof(_last_stats));
 }
 
 HDHRStreamHandler::~HDHRStreamHandler()
@@ -286,6 +287,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");
 }
@@ -494,6 +507,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 release.19703.0116c -x release.19703.0116d release.19703.0116c/mythtv/libs/libmythtv/hdhrstreamhandler.h release.19703.0116d/mythtv/libs/libmythtv/hdhrstreamhandler.h
--- mythtv/libs/libmythtv/hdhrstreamhandler.h	2009-01-17 00:09:11.000000000 -0600
+++ mythtv/libs/libmythtv/hdhrstreamhandler.h	2009-01-17 01:28:12.000000000 -0600
@@ -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;
