Ticket #5562: patch3_listeners.patch

File patch3_listeners.patch, 4.8 KB (added by David Matthews <dm@…>, 11 years ago)
  • libs/libmythtv/mpeg/streamlisteners.h

     
    3131class DirectedChannelChangeSelectionCodeTable;
    3232
    3333class NetworkInformationTable;
     34class BouquetAssociationTable;
    3435class ServiceDescriptionTable;
    3536class TimeDateTable;
    3637class DVBEventInformationTable;
     
    134135  public:
    135136    virtual void HandleNITo(const NetworkInformationTable*) = 0;
    136137    virtual void HandleSDTo(uint tsid, const ServiceDescriptionTable*) = 0;
     138    virtual void HandleBAT(const BouquetAssociationTable*) = 0;
    137139};
    138140
    139141class DVBEITStreamListener
  • libs/libmythtv/mpeg/dvbstreamdata.h

     
    116116        return *it;
    117117    }
    118118
     119    void SetVersionBAT(uint bid, int version, uint last_section)
     120    {
     121        if (_bat_versions[bid] == version)
     122            return;
     123        _bat_versions[bid] = version;
     124        init_sections(_bat_section_seen[bid], last_section);
     125    }
     126    int VersionBAT(uint bid) const
     127    {
     128        const QMap<uint, int>::const_iterator it = _bat_versions.find(bid);
     129        if (it == _bat_versions.end())
     130            return -1;
     131        return *it;
     132    }
     133
    119134    // Premiere private ContentInformationTable
    120135    void SetVersionCIT(uint contentid, int version)
    121136    {
     
    152167    void SetEITSectionSeen(uint tableid, uint serviceid, uint section);
    153168    bool EITSectionSeen(uint tableid, uint serviceid, uint section) const;
    154169
     170    void SetBATSectionSeen(uint bid, uint section);
     171    bool BATSectionSeen(uint bid, uint section) const;
     172    bool HasAllBATSections(uint bid) const;
     173
    155174    // Premiere private ContentInformationTable
    156175    void SetCITSectionSeen(uint contentid, uint section);
    157176    bool CITSectionSeen(uint contentid, uint section) const;
     
    216235    QMap<uint, int>           _sdto_versions;
    217236    sections_t                _nito_section_seen;
    218237    sections_map_t            _sdto_section_seen;
     238    QMap<uint, int>           _bat_versions;
     239    sections_map_t            _bat_section_seen;
    219240
    220241    // Caching
    221242    nit_cache_t               _cached_nit;  // section -> sdt
  • libs/libmythtv/mpeg/dvbstreamdata.cpp

     
    100100    if (TableID::TDT == table_id)
    101101        return false;
    102102
     103    if (TableID::BAT == table_id)
     104    {
     105        if (VersionBAT(psip.TableIDExtension()) != version)
     106            return false;
     107        return BATSectionSeen(psip.TableIDExtension(), psip.Section());
     108    }
     109
    103110    bool is_eit = false;
    104111    if (DVB_EIT_PID == pid || FREESAT_EIT_PID == pid)
    105112    {
     
    188195    SetVersionNITo(-1,0);
    189196    _sdto_versions.clear();
    190197    _sdto_section_seen.clear();
     198    _bat_versions.clear();
     199    _bat_section_seen.clear();
    191200
    192201    {
    193202        _cache_lock.lock();
     
    330339
    331340            return true;
    332341        }
     342        case TableID::BAT:
     343        {
     344            uint bid = psip.TableIDExtension();
     345            SetVersionBAT(bid, psip.Version(), psip.LastSection());
     346            SetBATSectionSeen(bid, psip.Section());
     347            BouquetAssociationTable bat(psip);
     348
     349            QMutexLocker locker(&_listener_lock);
     350            for (uint i = 0; i < _dvb_other_listeners.size(); i++)
     351                _dvb_other_listeners[i]->HandleBAT(&bat);
     352
     353            return true;
     354        }
    333355    }
    334356
    335357    if ((DVB_EIT_PID == pid || DVB_DNLONG_EIT_PID == pid || FREESAT_EIT_PID == pid ||
     
    606628            return false;
    607629    return true;
    608630}
     631
     632void DVBStreamData::SetBATSectionSeen(uint bid, uint section)
     633{
     634    sections_map_t::iterator it = _bat_section_seen.find(bid);
     635    if (it == _bat_section_seen.end())
     636    {
     637        _bat_section_seen[bid].resize(32, 0);
     638        it = _bat_section_seen.find(bid);
     639    }
     640    (*it)[section>>3] |= bit_sel[section & 0x7];
     641}
     642
     643bool DVBStreamData::BATSectionSeen(uint bid, uint section) const
     644{
     645    sections_map_t::const_iterator it = _bat_section_seen.find(bid);
     646    if (it == _bat_section_seen.end())
     647        return false;
     648    return (bool) ((*it)[section>>3] & bit_sel[section & 0x7]);
     649}
     650
     651bool DVBStreamData::HasAllBATSections(uint bid) const
     652{
     653    sections_map_t::const_iterator it = _bat_section_seen.find(bid);
     654    if (it == _bat_section_seen.end())
     655        return false;
     656    for (uint i = 0; i < 32; i++)
     657        if ((*it)[i] != 0xff)
     658            return false;
     659    return true;
     660}
     661
    609662void DVBStreamData::SetEITSectionSeen(uint tableid, uint serviceid,
    610663                                      uint section)
    611664{