commit bf695c703696a1ba5f64153afd96a64a074ecc7c
Author: David Matthews <dm@prolingua.co.uk>
Date:   Fri Oct 14 16:50:12 2011 +0100

    Reworking of EIT listening for multirec.
    
    This is a reworking of the code which combines the EIT listeners when making multiple recordings on the same multiplex.
    It fixes problems which showed up when testing the EITpf timing code.

diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.cpp b/mythtv/libs/libmythtv/dtvsignalmonitor.cpp
index 419a73a..79695db 100644
--- a/mythtv/libs/libmythtv/dtvsignalmonitor.cpp
+++ b/mythtv/libs/libmythtv/dtvsignalmonitor.cpp
@@ -155,30 +155,6 @@ void DTVSignalMonitor::UpdateMonitorValues(void)
     matchingCrypt.SetValue((flags & kDTVSigMon_CryptMatch) ? 1 : 0);
 }
 
-void DTVSignalMonitor::UpdateListeningForEIT(void)
-{
-    vector<uint> add_eit, del_eit;
-
-    if (GetStreamData()->HasEITPIDChanges(eit_pids) &&
-        GetStreamData()->GetEITPIDChanges(eit_pids, add_eit, del_eit))
-    {
-        for (uint i = 0; i < del_eit.size(); i++)
-        {
-            uint_vec_t::iterator it;
-            it = find(eit_pids.begin(), eit_pids.end(), del_eit[i]);
-            if (it != eit_pids.end())
-                eit_pids.erase(it);
-            GetStreamData()->RemoveListeningPID(del_eit[i]);
-        }
-
-        for (uint i = 0; i < add_eit.size(); i++)
-        {
-            eit_pids.push_back(add_eit[i]);
-            GetStreamData()->AddListeningPID(add_eit[i]);
-        }
-    }
-}
-
 void DTVSignalMonitor::SetChannel(int major, int minor)
 {
     DBG_SM(QString("SetChannel(%1, %2)").arg(major).arg(minor), "");
diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.h b/mythtv/libs/libmythtv/dtvsignalmonitor.h
index 6a7c29a..3c69ba1 100644
--- a/mythtv/libs/libmythtv/dtvsignalmonitor.h
+++ b/mythtv/libs/libmythtv/dtvsignalmonitor.h
@@ -104,7 +104,6 @@ class DTVSignalMonitor : public SignalMonitor,
   protected:
     DTVChannel *GetDTVChannel(void);
     void UpdateMonitorValues(void);
-    void UpdateListeningForEIT(void);
 
   protected:
     MPEGStreamData    *stream_data;
diff --git a/mythtv/libs/libmythtv/mpeg/atscstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/atscstreamdata.cpp
index 8aab9ed..bedb8f7 100644
--- a/mythtv/libs/libmythtv/mpeg/atscstreamdata.cpp
+++ b/mythtv/libs/libmythtv/mpeg/atscstreamdata.cpp
@@ -400,24 +400,20 @@ bool ATSCStreamData::EITSectionSeen(uint pid, uint atsc_source_id,
     return (bool) ((*it)[section>>3] & bit_sel[section & 0x7]);
 }
 
-bool ATSCStreamData::HasEITPIDChanges(const uint_vec_t &in_use_pids) const
-{
-    QMutexLocker locker(&_listener_lock);
-    uint eit_count = (uint) round(_atsc_eit_pids.size() * _eit_rate);
-    uint ett_count = (uint) round(_atsc_ett_pids.size() * _eit_rate);
-    return (in_use_pids.size() != (eit_count + ett_count) || _atsc_eit_reset);
-}
-
 bool ATSCStreamData::GetEITPIDChanges(const uint_vec_t &cur_pids,
                                       uint_vec_t &add_pids,
                                       uint_vec_t &del_pids) const
 {
     QMutexLocker locker(&_listener_lock);
 
-    _atsc_eit_reset = false;
-
     uint eit_count = (uint) round(_atsc_eit_pids.size() * _eit_rate);
     uint ett_count = (uint) round(_atsc_ett_pids.size() * _eit_rate);
+
+    if (cur_pids.size() == (eit_count + ett_count) && !_atsc_eit_reset)
+        return false;
+
+    _atsc_eit_reset = false;
+
     uint i;
 
 #if 0
@@ -452,6 +448,29 @@ bool ATSCStreamData::GetEITPIDChanges(const uint_vec_t &cur_pids,
     return add_pids.size() || del_pids.size();
 }
 
+void ATSCStreamData::UpdateEITListeners(void)
+{
+    vector<uint> add_eit, del_eit;
+
+    if (GetEITPIDChanges(_eit_pids, add_eit, del_eit))
+    {
+        for (uint i = 0; i < del_eit.size(); i++)
+        {
+            uint_vec_t::iterator it;
+            it = find(_eit_pids.begin(), _eit_pids.end(), del_eit[i]);
+            if (it != _eit_pids.end())
+                _eit_pids.erase(it);
+            RemoveListeningPID(del_eit[i]);
+        }
+
+        for (uint i = 0; i < add_eit.size(); i++)
+        {
+            _eit_pids.push_back(add_eit[i]);
+            AddListeningPID(add_eit[i]);
+        }
+    }
+}
+
 void ATSCStreamData::ProcessMGT(const MasterGuideTable *mgt)
 {
     QMutexLocker locker(&_listener_lock);
diff --git a/mythtv/libs/libmythtv/mpeg/atscstreamdata.h b/mythtv/libs/libmythtv/mpeg/atscstreamdata.h
index 4686ee9..9e03be5 100644
--- a/mythtv/libs/libmythtv/mpeg/atscstreamdata.h
+++ b/mythtv/libs/libmythtv/mpeg/atscstreamdata.h
@@ -41,7 +41,7 @@ class ATSCStreamData : virtual public MPEGStreamData
 
     inline uint GetATSCMajorMinor(uint eit_sourceid) const;
     inline bool HasATSCMajorMinorMap(void) const;
-    bool HasEITPIDChanges(const uint_vec_t &in_use_pid) const;
+    void UpdateEITListeners(void);
     bool GetEITPIDChanges(const uint_vec_t &in_use_pid,
                           uint_vec_t &pids_to_add,
                           uint_vec_t &pids_to_del) const;
@@ -127,6 +127,7 @@ class ATSCStreamData : virtual public MPEGStreamData
     mutable bool              _atsc_eit_reset;
     atsc_eit_pid_map_t        _atsc_eit_pids;
     atsc_ett_pid_map_t        _atsc_ett_pids;
+    vector<uint>              _eit_pids;
 
     QMap<uint,uint>           _sourceid_to_atsc_maj_min;
 
diff --git a/mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp
index b3ccb90..aa60ec3 100644
--- a/mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp
+++ b/mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp
@@ -416,121 +416,80 @@ void DVBStreamData::ProcessSDT(uint tsid, const ServiceDescriptionTable *sdt)
         _dvb_main_listeners[i]->HandleSDT(tsid, sdt);
 }
 
-bool DVBStreamData::HasEITPIDChanges(const uint_vec_t &in_use_pids) const
+void DVBStreamData::UpdateEITListeners(void)
 {
     QMutexLocker locker(&_listener_lock);
-    bool want_eit = (_eit_rate >= 0.5f) && HasAnyEIT();
-    bool has_eit  = in_use_pids.size();
-    return want_eit != has_eit;
-}
+    bool want_eit = (_eit_rate >= 0.5f || _dvb_eit_listeners.size()) && HasAnyEIT();
+    bool has_eit  = _eit_pids.size();
 
-bool DVBStreamData::GetEITPIDChanges(const uint_vec_t &cur_pids,
-                                     uint_vec_t &add_pids,
-                                     uint_vec_t &del_pids) const
-{
-    QMutexLocker locker(&_listener_lock);
+    if (want_eit == has_eit)
+        return;
 
-    if ((_eit_rate >= 0.5f) && HasAnyEIT())
+    if ((_eit_rate >= 0.5f || _dvb_eit_listeners.size()) && HasAnyEIT())
     {
-        if (find(cur_pids.begin(), cur_pids.end(),
-                 (uint) DVB_EIT_PID) == cur_pids.end())
+        if (find(_eit_pids.begin(), _eit_pids.end(),
+                 (uint) DVB_EIT_PID) == _eit_pids.end())
         {
-            add_pids.push_back(DVB_EIT_PID);
+            _eit_pids.push_back(DVB_EIT_PID);
+            AddListeningPID(DVB_EIT_PID);
         }
 
         if (_dvb_eit_dishnet_long &&
-            find(cur_pids.begin(), cur_pids.end(),
-                 (uint) DVB_DNLONG_EIT_PID) == cur_pids.end())
+            find(_eit_pids.begin(), _eit_pids.end(),
+                 (uint) DVB_DNLONG_EIT_PID) == _eit_pids.end())
         {
-            add_pids.push_back(DVB_DNLONG_EIT_PID);
+            _eit_pids.push_back(DVB_DNLONG_EIT_PID);
+            AddListeningPID(DVB_DNLONG_EIT_PID);
         }
 
         if (_dvb_eit_dishnet_long &&
-            find(cur_pids.begin(), cur_pids.end(),
-                 (uint) DVB_BVLONG_EIT_PID) == cur_pids.end())
+            find(_eit_pids.begin(), _eit_pids.end(),
+                 (uint) DVB_BVLONG_EIT_PID) == _eit_pids.end())
         {
-            add_pids.push_back(DVB_BVLONG_EIT_PID);
+            _eit_pids.push_back(DVB_BVLONG_EIT_PID);
+            AddListeningPID(DVB_BVLONG_EIT_PID);
         }
 
         if (_desired_netid == PREMIERE_ONID &&
-            find(cur_pids.begin(), cur_pids.end(),
-                 (uint) PREMIERE_EIT_DIREKT_PID) == cur_pids.end())
+            find(_eit_pids.begin(), _eit_pids.end(),
+                 (uint) PREMIERE_EIT_DIREKT_PID) == _eit_pids.end())
         {
-            add_pids.push_back(PREMIERE_EIT_DIREKT_PID);
+            _eit_pids.push_back(PREMIERE_EIT_DIREKT_PID);
+            AddListeningPID(PREMIERE_EIT_DIREKT_PID);
         }
 
         if (_desired_netid == PREMIERE_ONID &&
-            find(cur_pids.begin(), cur_pids.end(),
-                 (uint) PREMIERE_EIT_SPORT_PID) == cur_pids.end())
+            find(_eit_pids.begin(), _eit_pids.end(),
+                 (uint) PREMIERE_EIT_SPORT_PID) == _eit_pids.end())
         {
-            add_pids.push_back(PREMIERE_EIT_SPORT_PID);
+            _eit_pids.push_back(PREMIERE_EIT_SPORT_PID);
+            AddListeningPID(PREMIERE_EIT_SPORT_PID);
         }
 
-        if (find(cur_pids.begin(), cur_pids.end(),
-                 (uint) FREESAT_EIT_PID) == cur_pids.end())
+        if (find(_eit_pids.begin(), _eit_pids.end(),
+                 (uint) FREESAT_EIT_PID) == _eit_pids.end())
         {
-            add_pids.push_back(FREESAT_EIT_PID);
+            _eit_pids.push_back(FREESAT_EIT_PID);
+            AddListeningPID(FREESAT_EIT_PID);
         }
 
         if (MCA_ONID == _desired_netid && MCA_EIT_TSID == _desired_tsid &&
-            find(cur_pids.begin(), cur_pids.end(),
-                 (uint) MCA_EIT_PID) == cur_pids.end())
+            find(_eit_pids.begin(), _eit_pids.end(),
+                 (uint) MCA_EIT_PID) == _eit_pids.end())
         {
-            add_pids.push_back(MCA_EIT_PID);
+            _eit_pids.push_back(MCA_EIT_PID);
+            AddListeningPID(MCA_EIT_PID);
         }
 
     }
     else
     {
-        if (find(cur_pids.begin(), cur_pids.end(),
-                 (uint) DVB_EIT_PID) != cur_pids.end())
-        {
-            del_pids.push_back(DVB_EIT_PID);
-        }
-
-        if (_dvb_eit_dishnet_long &&
-            find(cur_pids.begin(), cur_pids.end(),
-                 (uint) DVB_DNLONG_EIT_PID) != cur_pids.end())
+        for (uint i = 0; i < _eit_pids.size(); i++)
         {
-            del_pids.push_back(DVB_DNLONG_EIT_PID);
-        }
-
-        if (_dvb_eit_dishnet_long &&
-            find(cur_pids.begin(), cur_pids.end(),
-                 (uint) DVB_BVLONG_EIT_PID) != cur_pids.end())
-        {
-            del_pids.push_back(DVB_BVLONG_EIT_PID);
-        }
-
-        if (_desired_netid == PREMIERE_ONID &&
-            find(cur_pids.begin(), cur_pids.end(),
-                 (uint) PREMIERE_EIT_DIREKT_PID) != cur_pids.end())
-        {
-            del_pids.push_back(PREMIERE_EIT_DIREKT_PID);
-        }
-
-        if (_desired_netid == PREMIERE_ONID &&
-            find(cur_pids.begin(), cur_pids.end(),
-                 (uint) PREMIERE_EIT_SPORT_PID) != cur_pids.end())
-        {
-            del_pids.push_back(PREMIERE_EIT_SPORT_PID);
-        }
-
-        if (find(cur_pids.begin(), cur_pids.end(),
-                 (uint) FREESAT_EIT_PID) == cur_pids.end())
-        {
-            del_pids.push_back(FREESAT_EIT_PID);
-        }
-
-        if (MCA_ONID == _desired_netid && MCA_EIT_TSID == _desired_tsid &&
-            find(cur_pids.begin(), cur_pids.end(),
-                 (uint) MCA_EIT_PID) != cur_pids.end())
-        {
-            del_pids.push_back(MCA_EIT_PID);
+            RemoveListeningPID(_eit_pids[i]);
         }
+        _eit_pids.clear();
     }
-
-    return add_pids.size() || del_pids.size();
 }
 
 void DVBStreamData::SetNITSectionSeen(uint section)
diff --git a/mythtv/libs/libmythtv/mpeg/dvbstreamdata.h b/mythtv/libs/libmythtv/mpeg/dvbstreamdata.h
index 3df7ac9..7aac61d 100644
--- a/mythtv/libs/libmythtv/mpeg/dvbstreamdata.h
+++ b/mythtv/libs/libmythtv/mpeg/dvbstreamdata.h
@@ -44,10 +44,7 @@ class DVBStreamData : virtual public MPEGStreamData
     inline void SetDishNetEIT(bool);
     inline bool HasAnyEIT(void) const;
     inline bool HasEIT(uint serviceid) const;
-    bool HasEITPIDChanges(const uint_vec_t &in_use_pids) const;
-    bool GetEITPIDChanges(const uint_vec_t &in_use_pids,
-                          uint_vec_t &add_pids,
-                          uint_vec_t &del_pids) const;
+    void UpdateEITListeners(void);
 
     // Table versions
     void SetVersionNIT(int version, uint last_section)
@@ -243,6 +240,8 @@ class DVBStreamData : virtual public MPEGStreamData
     // Caching
     mutable nit_cache_t       _cached_nit;  // section -> sdt
     mutable sdt_cache_t       _cached_sdts; // tsid+section -> sdt
+
+    vector<uint>              _eit_pids;
 };
 
 inline void DVBStreamData::SetDishNetEIT(bool use_dishnet_eit)
diff --git a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h
index 90f1e8f..fa3d881 100644
--- a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h
+++ b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h
@@ -101,12 +101,7 @@ class MPEGStreamData : public EITSource
     // EIT Source
     virtual void SetEITHelper(EITHelper *eit_helper);
     virtual void SetEITRate(float rate);
-    virtual bool HasEITPIDChanges(const uint_vec_t& /*in_use_pids*/) const
-        { return false; }
-    virtual bool GetEITPIDChanges(const uint_vec_t& /*in_use_pids*/,
-                                  uint_vec_t& /*add_pids*/,
-                                  uint_vec_t& /*del_pids*/) const
-        { return false; }
+    virtual void UpdateEITListeners(void) { }
 
     // Table processing
     void SetIgnoreCRC(bool haveCRCbug) { _have_CRC_bug = haveCRCbug; }
diff --git a/mythtv/libs/libmythtv/mpeg/scanstreamdata.h b/mythtv/libs/libmythtv/mpeg/scanstreamdata.h
old mode 100644
new mode 100755
index 0b668d6..8e21052
--- a/mythtv/libs/libmythtv/mpeg/scanstreamdata.h
+++ b/mythtv/libs/libmythtv/mpeg/scanstreamdata.h
@@ -20,11 +20,7 @@ class ScanStreamData :
 
     void Reset(void);
 
-    bool HasEITPIDChanges(const uint_vec_t& /*in_use_pids*/) const
-        { return false; }
-    bool GetEITPIDChanges(const uint_vec_t& /*in_use_pids*/,
-                          uint_vec_t& /*add_pids*/,
-                          uint_vec_t& /*del_pids*/) const { return false; }
+    virtual void UpdateEITListeners(void) { }
 
     QString GetSIStandard(QString guess = "mpeg") const;
 
diff --git a/mythtv/libs/libmythtv/streamhandler.cpp b/mythtv/libs/libmythtv/streamhandler.cpp
index 2b0a7b6..6686033 100644
--- a/mythtv/libs/libmythtv/streamhandler.cpp
+++ b/mythtv/libs/libmythtv/streamhandler.cpp
@@ -149,8 +149,6 @@ void StreamHandler::Start(void)
     if (_running)
         return;
 
-    _eit_pids.clear();
-
     _error = false;
     SetRunningDesired(true);
     MThread::start();
@@ -275,32 +273,13 @@ bool StreamHandler::RemoveAllPIDFilters(void)
 
 void StreamHandler::UpdateListeningForEIT(void)
 {
-    vector<uint> add_eit, del_eit;
-
     QMutexLocker read_locker(&_listener_lock);
 
     StreamDataList::const_iterator it = _stream_data_list.begin();
     for (; it != _stream_data_list.end(); ++it)
     {
         MPEGStreamData *sd = it.key();
-        if (sd->HasEITPIDChanges(_eit_pids) &&
-            sd->GetEITPIDChanges(_eit_pids, add_eit, del_eit))
-        {
-            for (uint i = 0; i < del_eit.size(); i++)
-            {
-                uint_vec_t::iterator it;
-                it = find(_eit_pids.begin(), _eit_pids.end(), del_eit[i]);
-                if (it != _eit_pids.end())
-                    _eit_pids.erase(it);
-                sd->RemoveListeningPID(del_eit[i]);
-            }
-
-            for (uint i = 0; i < add_eit.size(); i++)
-            {
-                _eit_pids.push_back(add_eit[i]);
-                sd->AddListeningPID(add_eit[i]);
-            }
-        }
+        sd->UpdateEITListeners();
     }
 }
 
diff --git a/mythtv/libs/libmythtv/streamhandler.h b/mythtv/libs/libmythtv/streamhandler.h
index 454e55f..59d1518 100644
--- a/mythtv/libs/libmythtv/streamhandler.h
+++ b/mythtv/libs/libmythtv/streamhandler.h
@@ -110,7 +110,6 @@ class StreamHandler : protected MThread, public DeviceReaderCB
     QWaitCondition    _running_state_changed;
 
     mutable QMutex    _pid_lock;
-    vector<uint>      _eit_pids;
     PIDInfoMap        _pid_info;
     uint              _open_pid_filters;
     MythTimer         _cycle_timer;
