Ticket #10102: eit-multirec.patch

File eit-multirec.patch, 15.8 KB (added by David Matthews <dm@…>, 12 years ago)
  • mythtv/libs/libmythtv/dtvsignalmonitor.cpp

    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 b void DTVSignalMonitor::UpdateMonitorValues(void) 
    155155    matchingCrypt.SetValue((flags & kDTVSigMon_CryptMatch) ? 1 : 0);
    156156}
    157157
    158 void DTVSignalMonitor::UpdateListeningForEIT(void)
    159 {
    160     vector<uint> add_eit, del_eit;
    161 
    162     if (GetStreamData()->HasEITPIDChanges(eit_pids) &&
    163         GetStreamData()->GetEITPIDChanges(eit_pids, add_eit, del_eit))
    164     {
    165         for (uint i = 0; i < del_eit.size(); i++)
    166         {
    167             uint_vec_t::iterator it;
    168             it = find(eit_pids.begin(), eit_pids.end(), del_eit[i]);
    169             if (it != eit_pids.end())
    170                 eit_pids.erase(it);
    171             GetStreamData()->RemoveListeningPID(del_eit[i]);
    172         }
    173 
    174         for (uint i = 0; i < add_eit.size(); i++)
    175         {
    176             eit_pids.push_back(add_eit[i]);
    177             GetStreamData()->AddListeningPID(add_eit[i]);
    178         }
    179     }
    180 }
    181 
    182158void DTVSignalMonitor::SetChannel(int major, int minor)
    183159{
    184160    DBG_SM(QString("SetChannel(%1, %2)").arg(major).arg(minor), "");
  • mythtv/libs/libmythtv/dtvsignalmonitor.h

    diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.h b/mythtv/libs/libmythtv/dtvsignalmonitor.h
    index 6a7c29a..3c69ba1 100644
    a b class DTVSignalMonitor : public SignalMonitor, 
    104104  protected:
    105105    DTVChannel *GetDTVChannel(void);
    106106    void UpdateMonitorValues(void);
    107     void UpdateListeningForEIT(void);
    108107
    109108  protected:
    110109    MPEGStreamData    *stream_data;
  • mythtv/libs/libmythtv/mpeg/atscstreamdata.cpp

    diff --git a/mythtv/libs/libmythtv/mpeg/atscstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/atscstreamdata.cpp
    index 8aab9ed..bedb8f7 100644
    a b bool ATSCStreamData::EITSectionSeen(uint pid, uint atsc_source_id, 
    400400    return (bool) ((*it)[section>>3] & bit_sel[section & 0x7]);
    401401}
    402402
    403 bool ATSCStreamData::HasEITPIDChanges(const uint_vec_t &in_use_pids) const
    404 {
    405     QMutexLocker locker(&_listener_lock);
    406     uint eit_count = (uint) round(_atsc_eit_pids.size() * _eit_rate);
    407     uint ett_count = (uint) round(_atsc_ett_pids.size() * _eit_rate);
    408     return (in_use_pids.size() != (eit_count + ett_count) || _atsc_eit_reset);
    409 }
    410 
    411403bool ATSCStreamData::GetEITPIDChanges(const uint_vec_t &cur_pids,
    412404                                      uint_vec_t &add_pids,
    413405                                      uint_vec_t &del_pids) const
    414406{
    415407    QMutexLocker locker(&_listener_lock);
    416408
    417     _atsc_eit_reset = false;
    418 
    419409    uint eit_count = (uint) round(_atsc_eit_pids.size() * _eit_rate);
    420410    uint ett_count = (uint) round(_atsc_ett_pids.size() * _eit_rate);
     411
     412    if (cur_pids.size() == (eit_count + ett_count) && !_atsc_eit_reset)
     413        return false;
     414
     415    _atsc_eit_reset = false;
     416
    421417    uint i;
    422418
    423419#if 0
    bool ATSCStreamData::GetEITPIDChanges(const uint_vec_t &cur_pids, 
    452448    return add_pids.size() || del_pids.size();
    453449}
    454450
     451void ATSCStreamData::UpdateEITListeners(void)
     452{
     453    vector<uint> add_eit, del_eit;
     454
     455    if (GetEITPIDChanges(_eit_pids, add_eit, del_eit))
     456    {
     457        for (uint i = 0; i < del_eit.size(); i++)
     458        {
     459            uint_vec_t::iterator it;
     460            it = find(_eit_pids.begin(), _eit_pids.end(), del_eit[i]);
     461            if (it != _eit_pids.end())
     462                _eit_pids.erase(it);
     463            RemoveListeningPID(del_eit[i]);
     464        }
     465
     466        for (uint i = 0; i < add_eit.size(); i++)
     467        {
     468            _eit_pids.push_back(add_eit[i]);
     469            AddListeningPID(add_eit[i]);
     470        }
     471    }
     472}
     473
    455474void ATSCStreamData::ProcessMGT(const MasterGuideTable *mgt)
    456475{
    457476    QMutexLocker locker(&_listener_lock);
  • mythtv/libs/libmythtv/mpeg/atscstreamdata.h

    diff --git a/mythtv/libs/libmythtv/mpeg/atscstreamdata.h b/mythtv/libs/libmythtv/mpeg/atscstreamdata.h
    index 4686ee9..9e03be5 100644
    a b class ATSCStreamData : virtual public MPEGStreamData 
    4141
    4242    inline uint GetATSCMajorMinor(uint eit_sourceid) const;
    4343    inline bool HasATSCMajorMinorMap(void) const;
    44     bool HasEITPIDChanges(const uint_vec_t &in_use_pid) const;
     44    void UpdateEITListeners(void);
    4545    bool GetEITPIDChanges(const uint_vec_t &in_use_pid,
    4646                          uint_vec_t &pids_to_add,
    4747                          uint_vec_t &pids_to_del) const;
    class ATSCStreamData : virtual public MPEGStreamData 
    127127    mutable bool              _atsc_eit_reset;
    128128    atsc_eit_pid_map_t        _atsc_eit_pids;
    129129    atsc_ett_pid_map_t        _atsc_ett_pids;
     130    vector<uint>              _eit_pids;
    130131
    131132    QMap<uint,uint>           _sourceid_to_atsc_maj_min;
    132133
  • mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp

    diff --git a/mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp
    index b3ccb90..aa60ec3 100644
    a b void DVBStreamData::ProcessSDT(uint tsid, const ServiceDescriptionTable *sdt) 
    416416        _dvb_main_listeners[i]->HandleSDT(tsid, sdt);
    417417}
    418418
    419 bool DVBStreamData::HasEITPIDChanges(const uint_vec_t &in_use_pids) const
     419void DVBStreamData::UpdateEITListeners(void)
    420420{
    421421    QMutexLocker locker(&_listener_lock);
    422     bool want_eit = (_eit_rate >= 0.5f) && HasAnyEIT();
    423     bool has_eit  = in_use_pids.size();
    424     return want_eit != has_eit;
    425 }
     422    bool want_eit = (_eit_rate >= 0.5f || _dvb_eit_listeners.size()) && HasAnyEIT();
     423    bool has_eit  = _eit_pids.size();
    426424
    427 bool DVBStreamData::GetEITPIDChanges(const uint_vec_t &cur_pids,
    428                                      uint_vec_t &add_pids,
    429                                      uint_vec_t &del_pids) const
    430 {
    431     QMutexLocker locker(&_listener_lock);
     425    if (want_eit == has_eit)
     426        return;
    432427
    433     if ((_eit_rate >= 0.5f) && HasAnyEIT())
     428    if ((_eit_rate >= 0.5f || _dvb_eit_listeners.size()) && HasAnyEIT())
    434429    {
    435         if (find(cur_pids.begin(), cur_pids.end(),
    436                  (uint) DVB_EIT_PID) == cur_pids.end())
     430        if (find(_eit_pids.begin(), _eit_pids.end(),
     431                 (uint) DVB_EIT_PID) == _eit_pids.end())
    437432        {
    438             add_pids.push_back(DVB_EIT_PID);
     433            _eit_pids.push_back(DVB_EIT_PID);
     434            AddListeningPID(DVB_EIT_PID);
    439435        }
    440436
    441437        if (_dvb_eit_dishnet_long &&
    442             find(cur_pids.begin(), cur_pids.end(),
    443                  (uint) DVB_DNLONG_EIT_PID) == cur_pids.end())
     438            find(_eit_pids.begin(), _eit_pids.end(),
     439                 (uint) DVB_DNLONG_EIT_PID) == _eit_pids.end())
    444440        {
    445             add_pids.push_back(DVB_DNLONG_EIT_PID);
     441            _eit_pids.push_back(DVB_DNLONG_EIT_PID);
     442            AddListeningPID(DVB_DNLONG_EIT_PID);
    446443        }
    447444
    448445        if (_dvb_eit_dishnet_long &&
    449             find(cur_pids.begin(), cur_pids.end(),
    450                  (uint) DVB_BVLONG_EIT_PID) == cur_pids.end())
     446            find(_eit_pids.begin(), _eit_pids.end(),
     447                 (uint) DVB_BVLONG_EIT_PID) == _eit_pids.end())
    451448        {
    452             add_pids.push_back(DVB_BVLONG_EIT_PID);
     449            _eit_pids.push_back(DVB_BVLONG_EIT_PID);
     450            AddListeningPID(DVB_BVLONG_EIT_PID);
    453451        }
    454452
    455453        if (_desired_netid == PREMIERE_ONID &&
    456             find(cur_pids.begin(), cur_pids.end(),
    457                  (uint) PREMIERE_EIT_DIREKT_PID) == cur_pids.end())
     454            find(_eit_pids.begin(), _eit_pids.end(),
     455                 (uint) PREMIERE_EIT_DIREKT_PID) == _eit_pids.end())
    458456        {
    459             add_pids.push_back(PREMIERE_EIT_DIREKT_PID);
     457            _eit_pids.push_back(PREMIERE_EIT_DIREKT_PID);
     458            AddListeningPID(PREMIERE_EIT_DIREKT_PID);
    460459        }
    461460
    462461        if (_desired_netid == PREMIERE_ONID &&
    463             find(cur_pids.begin(), cur_pids.end(),
    464                  (uint) PREMIERE_EIT_SPORT_PID) == cur_pids.end())
     462            find(_eit_pids.begin(), _eit_pids.end(),
     463                 (uint) PREMIERE_EIT_SPORT_PID) == _eit_pids.end())
    465464        {
    466             add_pids.push_back(PREMIERE_EIT_SPORT_PID);
     465            _eit_pids.push_back(PREMIERE_EIT_SPORT_PID);
     466            AddListeningPID(PREMIERE_EIT_SPORT_PID);
    467467        }
    468468
    469         if (find(cur_pids.begin(), cur_pids.end(),
    470                  (uint) FREESAT_EIT_PID) == cur_pids.end())
     469        if (find(_eit_pids.begin(), _eit_pids.end(),
     470                 (uint) FREESAT_EIT_PID) == _eit_pids.end())
    471471        {
    472             add_pids.push_back(FREESAT_EIT_PID);
     472            _eit_pids.push_back(FREESAT_EIT_PID);
     473            AddListeningPID(FREESAT_EIT_PID);
    473474        }
    474475
    475476        if (MCA_ONID == _desired_netid && MCA_EIT_TSID == _desired_tsid &&
    476             find(cur_pids.begin(), cur_pids.end(),
    477                  (uint) MCA_EIT_PID) == cur_pids.end())
     477            find(_eit_pids.begin(), _eit_pids.end(),
     478                 (uint) MCA_EIT_PID) == _eit_pids.end())
    478479        {
    479             add_pids.push_back(MCA_EIT_PID);
     480            _eit_pids.push_back(MCA_EIT_PID);
     481            AddListeningPID(MCA_EIT_PID);
    480482        }
    481483
    482484    }
    483485    else
    484486    {
    485         if (find(cur_pids.begin(), cur_pids.end(),
    486                  (uint) DVB_EIT_PID) != cur_pids.end())
    487         {
    488             del_pids.push_back(DVB_EIT_PID);
    489         }
    490 
    491         if (_dvb_eit_dishnet_long &&
    492             find(cur_pids.begin(), cur_pids.end(),
    493                  (uint) DVB_DNLONG_EIT_PID) != cur_pids.end())
     487        for (uint i = 0; i < _eit_pids.size(); i++)
    494488        {
    495             del_pids.push_back(DVB_DNLONG_EIT_PID);
    496         }
    497 
    498         if (_dvb_eit_dishnet_long &&
    499             find(cur_pids.begin(), cur_pids.end(),
    500                  (uint) DVB_BVLONG_EIT_PID) != cur_pids.end())
    501         {
    502             del_pids.push_back(DVB_BVLONG_EIT_PID);
    503         }
    504 
    505         if (_desired_netid == PREMIERE_ONID &&
    506             find(cur_pids.begin(), cur_pids.end(),
    507                  (uint) PREMIERE_EIT_DIREKT_PID) != cur_pids.end())
    508         {
    509             del_pids.push_back(PREMIERE_EIT_DIREKT_PID);
    510         }
    511 
    512         if (_desired_netid == PREMIERE_ONID &&
    513             find(cur_pids.begin(), cur_pids.end(),
    514                  (uint) PREMIERE_EIT_SPORT_PID) != cur_pids.end())
    515         {
    516             del_pids.push_back(PREMIERE_EIT_SPORT_PID);
    517         }
    518 
    519         if (find(cur_pids.begin(), cur_pids.end(),
    520                  (uint) FREESAT_EIT_PID) == cur_pids.end())
    521         {
    522             del_pids.push_back(FREESAT_EIT_PID);
    523         }
    524 
    525         if (MCA_ONID == _desired_netid && MCA_EIT_TSID == _desired_tsid &&
    526             find(cur_pids.begin(), cur_pids.end(),
    527                  (uint) MCA_EIT_PID) != cur_pids.end())
    528         {
    529             del_pids.push_back(MCA_EIT_PID);
     489            RemoveListeningPID(_eit_pids[i]);
    530490        }
     491        _eit_pids.clear();
    531492    }
    532 
    533     return add_pids.size() || del_pids.size();
    534493}
    535494
    536495void DVBStreamData::SetNITSectionSeen(uint section)
  • mythtv/libs/libmythtv/mpeg/dvbstreamdata.h

    diff --git a/mythtv/libs/libmythtv/mpeg/dvbstreamdata.h b/mythtv/libs/libmythtv/mpeg/dvbstreamdata.h
    index 3df7ac9..7aac61d 100644
    a b class DVBStreamData : virtual public MPEGStreamData 
    4444    inline void SetDishNetEIT(bool);
    4545    inline bool HasAnyEIT(void) const;
    4646    inline bool HasEIT(uint serviceid) const;
    47     bool HasEITPIDChanges(const uint_vec_t &in_use_pids) const;
    48     bool GetEITPIDChanges(const uint_vec_t &in_use_pids,
    49                           uint_vec_t &add_pids,
    50                           uint_vec_t &del_pids) const;
     47    void UpdateEITListeners(void);
    5148
    5249    // Table versions
    5350    void SetVersionNIT(int version, uint last_section)
    class DVBStreamData : virtual public MPEGStreamData 
    243240    // Caching
    244241    mutable nit_cache_t       _cached_nit;  // section -> sdt
    245242    mutable sdt_cache_t       _cached_sdts; // tsid+section -> sdt
     243
     244    vector<uint>              _eit_pids;
    246245};
    247246
    248247inline void DVBStreamData::SetDishNetEIT(bool use_dishnet_eit)
  • mythtv/libs/libmythtv/mpeg/mpegstreamdata.h

    diff --git a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h
    index 90f1e8f..fa3d881 100644
    a b class MPEGStreamData : public EITSource 
    101101    // EIT Source
    102102    virtual void SetEITHelper(EITHelper *eit_helper);
    103103    virtual void SetEITRate(float rate);
    104     virtual bool HasEITPIDChanges(const uint_vec_t& /*in_use_pids*/) const
    105         { return false; }
    106     virtual bool GetEITPIDChanges(const uint_vec_t& /*in_use_pids*/,
    107                                   uint_vec_t& /*add_pids*/,
    108                                   uint_vec_t& /*del_pids*/) const
    109         { return false; }
     104    virtual void UpdateEITListeners(void) { }
    110105
    111106    // Table processing
    112107    void SetIgnoreCRC(bool haveCRCbug) { _have_CRC_bug = haveCRCbug; }
  • mythtv/libs/libmythtv/mpeg/scanstreamdata.h

    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 b class ScanStreamData : 
    2020
    2121    void Reset(void);
    2222
    23     bool HasEITPIDChanges(const uint_vec_t& /*in_use_pids*/) const
    24         { return false; }
    25     bool GetEITPIDChanges(const uint_vec_t& /*in_use_pids*/,
    26                           uint_vec_t& /*add_pids*/,
    27                           uint_vec_t& /*del_pids*/) const { return false; }
     23    virtual void UpdateEITListeners(void) { }
    2824
    2925    QString GetSIStandard(QString guess = "mpeg") const;
    3026
  • mythtv/libs/libmythtv/streamhandler.cpp

    diff --git a/mythtv/libs/libmythtv/streamhandler.cpp b/mythtv/libs/libmythtv/streamhandler.cpp
    index 2b0a7b6..6686033 100644
    a b void StreamHandler::Start(void) 
    149149    if (_running)
    150150        return;
    151151
    152     _eit_pids.clear();
    153 
    154152    _error = false;
    155153    SetRunningDesired(true);
    156154    MThread::start();
    bool StreamHandler::RemoveAllPIDFilters(void) 
    275273
    276274void StreamHandler::UpdateListeningForEIT(void)
    277275{
    278     vector<uint> add_eit, del_eit;
    279 
    280276    QMutexLocker read_locker(&_listener_lock);
    281277
    282278    StreamDataList::const_iterator it = _stream_data_list.begin();
    283279    for (; it != _stream_data_list.end(); ++it)
    284280    {
    285281        MPEGStreamData *sd = it.key();
    286         if (sd->HasEITPIDChanges(_eit_pids) &&
    287             sd->GetEITPIDChanges(_eit_pids, add_eit, del_eit))
    288         {
    289             for (uint i = 0; i < del_eit.size(); i++)
    290             {
    291                 uint_vec_t::iterator it;
    292                 it = find(_eit_pids.begin(), _eit_pids.end(), del_eit[i]);
    293                 if (it != _eit_pids.end())
    294                     _eit_pids.erase(it);
    295                 sd->RemoveListeningPID(del_eit[i]);
    296             }
    297 
    298             for (uint i = 0; i < add_eit.size(); i++)
    299             {
    300                 _eit_pids.push_back(add_eit[i]);
    301                 sd->AddListeningPID(add_eit[i]);
    302             }
    303         }
     282        sd->UpdateEITListeners();
    304283    }
    305284}
    306285
  • mythtv/libs/libmythtv/streamhandler.h

    diff --git a/mythtv/libs/libmythtv/streamhandler.h b/mythtv/libs/libmythtv/streamhandler.h
    index 454e55f..59d1518 100644
    a b class StreamHandler : protected MThread, public DeviceReaderCB 
    110110    QWaitCondition    _running_state_changed;
    111111
    112112    mutable QMutex    _pid_lock;
    113     vector<uint>      _eit_pids;
    114113    PIDInfoMap        _pid_info;
    115114    uint              _open_pid_filters;
    116115    MythTimer         _cycle_timer;